From c9f2932e043af7e3c938bc5f7a455fde3ba3aa49 Mon Sep 17 00:00:00 2001 From: Aere Network Date: Sat, 3 Oct 2026 13:26:03 +0300 Subject: [PATCH] conformance: a conformance suite for the AIP-23 proof kinds (one verdict form over the published verifiers, 35 rules derived from code, 122 vectors, a runner for any implementation, a second verifier in Python); four defects it found in the published verifiers are fixed here: the market judge accepted a timeline with its submission event withheld, and three verifiers threw on malformed input instead of refusing by name --- README.md | 10 +- conformance/README.md | 160 +++ conformance/REGULI.json | 349 ++++++ conformance/conformance.mjs | 104 ++ conformance/deriva-reguli.mjs | 18 + conformance/genereaza-vectori.mjs | 299 +++++ conformance/implementare-aere.mjs | 115 ++ conformance/implementare-integritate.py | 223 ++++ conformance/proba-conformance.mjs | 213 ++++ conformance/reguli.mjs | 140 +++ conformance/surse-proaspete.json | 612 ++++++++++ conformance/vectori/INDEX.json | 1044 +++++++++++++++++ .../dataset-answer/age-30-45.commitment.json | 394 +++++++ .../age-30-45.completeness-first.json | 358 ++++++ .../age-30-45.completeness-last.json | 359 ++++++ .../age-30-45.completeness.json | 353 ++++++ .../dataset-answer/age-30-45.index-size.json | 394 +++++++ .../age-30-45.index-undisclosed.json | 392 +++++++ .../dataset-answer/age-30-45.index.json | 398 +++++++ .../dataset-answer/age-30-45.range.json | 394 +++++++ .../dataset-answer/age-30-45.valid.json | 385 ++++++ .../dataset-answer/two-records.order.json | 140 +++ .../dataset-answer/two-records.valid.json | 120 ++ .../dataset-consistency/v1-v2.commitment.json | 101 ++ .../v1-v2.consistency.json | 102 ++ .../dataset-consistency/v1-v2.valid.json | 91 ++ .../vectori/dataset-record/r5.commitment.json | 93 ++ .../dataset-record/r5.field-no-salt.json | 93 ++ .../vectori/dataset-record/r5.field.json | 95 ++ .../vectori/dataset-record/r5.form.json | 88 ++ .../vectori/dataset-record/r5.inclusion.json | 95 ++ .../vectori/dataset-record/r5.valid.json | 84 ++ .../four-of-sixteen.sample.json | 155 +++ .../dataset-sample/four-of-sixteen.valid.json | 178 +++ .../vectori/envelope/agent-decision.form.json | 50 + .../envelope/agent-decision.integrity.json | 51 + .../envelope/agent-decision.valid.json | 41 + conformance/vectori/envelope/ai.form.json | 59 + .../vectori/envelope/ai.integrity.json | 60 + conformance/vectori/envelope/ai.valid.json | 50 + .../vectori/envelope/authorization.form.json | 51 + .../envelope/authorization.integrity.json | 52 + .../vectori/envelope/authorization.valid.json | 42 + conformance/vectori/envelope/block.form.json | 51 + .../vectori/envelope/block.integrity.json | 52 + conformance/vectori/envelope/block.valid.json | 42 + .../vectori/envelope/compliance.form.json | 50 + .../envelope/compliance.integrity.json | 51 + .../vectori/envelope/compliance.valid.json | 41 + conformance/vectori/envelope/data.form.json | 48 + .../vectori/envelope/data.integrity.json | 49 + conformance/vectori/envelope/data.valid.json | 39 + conformance/vectori/envelope/device.form.json | 50 + .../vectori/envelope/device.integrity.json | 51 + .../vectori/envelope/device.valid.json | 41 + .../vectori/envelope/execution.form.json | 51 + .../vectori/envelope/execution.integrity.json | 52 + .../vectori/envelope/execution.valid.json | 42 + .../envelope/fresh-28001.finality.json | 57 + .../vectori/envelope/fresh-28001.valid.json | 43 + .../vectori/envelope/identity.form.json | 50 + .../vectori/envelope/identity.integrity.json | 51 + .../vectori/envelope/identity.valid.json | 41 + .../vectori/envelope/location.form.json | 49 + .../vectori/envelope/location.integrity.json | 50 + .../vectori/envelope/location.valid.json | 40 + .../envelope/notarized-28001.valid.json | 50 + .../envelope/notarized-claim.partial.json | 47 + .../vectori/envelope/ownership.form.json | 49 + .../vectori/envelope/ownership.integrity.json | 50 + .../vectori/envelope/ownership.valid.json | 40 + .../vectori/envelope/payment.form.json | 51 + .../vectori/envelope/payment.integrity.json | 52 + .../vectori/envelope/payment.valid.json | 42 + .../vectori/envelope/provenance.form.json | 53 + .../envelope/provenance.integrity.json | 54 + .../vectori/envelope/provenance.valid.json | 44 + .../vectori/envelope/runtime.form.json | 50 + .../vectori/envelope/runtime.integrity.json | 51 + .../vectori/envelope/runtime.valid.json | 41 + .../vectori/envelope/settlement.form.json | 54 + .../envelope/settlement.integrity.json | 55 + .../vectori/envelope/settlement.valid.json | 45 + .../envelope/signed-head.signature.json | 56 + .../vectori/envelope/signed-head.valid.json | 46 + conformance/vectori/envelope/time.form.json | 49 + .../vectori/envelope/time.integrity.json | 50 + conformance/vectori/envelope/time.valid.json | 40 + .../market-timeline/s1-paid-28001.valid.json | 156 +++ .../s1-paid-claim.partial.json | 153 +++ .../s1.complete-submission.json | 147 +++ .../vectori/market-timeline/s1.deadline.json | 163 +++ .../market-timeline/s1.proof-late.json | 163 +++ .../s1.proof-other-result.json | 164 +++ .../vectori/market-timeline/s1.window.json | 163 +++ .../market-timeline/s2-slashed.valid.json | 155 +++ .../vectori/market-timeline/s2.arbiter.json | 165 +++ .../s2.deadline-submitted.json | 165 +++ .../vectori/market-timeline/s2.payout.json | 166 +++ .../vectori/market-timeline/s2.posting.json | 166 +++ .../vectori/market-timeline/s2.result.json | 163 +++ .../vectori/market-timeline/s2.window.json | 165 +++ .../s3-paid-after-dispute-replayed.valid.json | 162 +++ .../s3-paid-after-dispute.valid.json | 157 +++ .../s3.arbiter-no-dispute.json | 151 +++ .../vectori/market-timeline/s3.payout.json | 168 +++ .../vectori/market-timeline/s3.replay.json | 171 +++ .../s4-refunded-expired.valid.json | 114 ++ .../market-timeline/s4.complete-claim.json | 108 ++ .../vectori/market-timeline/s4.deadline.json | 124 ++ .../vectori/market-timeline/s4.payout.json | 125 ++ .../s5-refunded-cancelled.valid.json | 100 ++ .../vectori/market-timeline/s5.form.json | 110 ++ .../company-p1-28001.valid.json | 173 +++ .../company-p1-claim.partial.json | 170 +++ .../payment-receipt/company-p1.amount.json | 171 +++ .../payment-receipt/company-p1.binding.json | 159 +++ .../payment-receipt/company-p1.chain.json | 158 +++ .../payment-receipt/company-p1.policy.json | 159 +++ .../company-p1.risk-other-payment.json | 182 +++ .../company-p1.risk-other-rate.json | 183 +++ .../payment-receipt/company-p1.risk.json | 158 +++ .../payment-receipt/company-p1.valid.json | 149 +++ .../payment-risk/company-p1.asset.json | 92 ++ .../payment-risk/company-p1.counterparty.json | 92 ++ .../payment-risk/company-p1.form-amount.json | 92 ++ .../payment-risk/company-p1.form-history.json | 102 ++ .../payment-risk/company-p1.form-time.json | 90 ++ .../vectori/payment-risk/company-p1.form.json | 92 ++ .../payment-risk/company-p1.limit.json | 92 ++ .../payment-risk/company-p1.rate-number.json | 93 ++ .../vectori/payment-risk/company-p1.rate.json | 86 ++ .../payment-risk/company-p1.valid.json | 83 ++ .../payment-risk/company-p1.window.json | 118 ++ conformance/verdict.mjs | 37 + market-settlement/README.md | 7 +- market-settlement/piata.mjs | 62 +- market-settlement/proba-judecata.mjs | 7 +- payments/README.md | 10 +- payments/chitanta.mjs | 37 +- payments/proba-risc.mjs | 5 +- payments/risc.mjs | 36 +- verifiable-data/README.md | 2 +- verifiable-data/baza.mjs | 90 +- verifiable-data/proba-verifiable-data.mjs | 3 + 145 files changed, 17395 insertions(+), 104 deletions(-) create mode 100644 conformance/README.md create mode 100644 conformance/REGULI.json create mode 100644 conformance/conformance.mjs create mode 100644 conformance/deriva-reguli.mjs create mode 100644 conformance/genereaza-vectori.mjs create mode 100644 conformance/implementare-aere.mjs create mode 100644 conformance/implementare-integritate.py create mode 100644 conformance/proba-conformance.mjs create mode 100644 conformance/reguli.mjs create mode 100644 conformance/surse-proaspete.json create mode 100644 conformance/vectori/INDEX.json create mode 100644 conformance/vectori/dataset-answer/age-30-45.commitment.json create mode 100644 conformance/vectori/dataset-answer/age-30-45.completeness-first.json create mode 100644 conformance/vectori/dataset-answer/age-30-45.completeness-last.json create mode 100644 conformance/vectori/dataset-answer/age-30-45.completeness.json create mode 100644 conformance/vectori/dataset-answer/age-30-45.index-size.json create mode 100644 conformance/vectori/dataset-answer/age-30-45.index-undisclosed.json create mode 100644 conformance/vectori/dataset-answer/age-30-45.index.json create mode 100644 conformance/vectori/dataset-answer/age-30-45.range.json create mode 100644 conformance/vectori/dataset-answer/age-30-45.valid.json create mode 100644 conformance/vectori/dataset-answer/two-records.order.json create mode 100644 conformance/vectori/dataset-answer/two-records.valid.json create mode 100644 conformance/vectori/dataset-consistency/v1-v2.commitment.json create mode 100644 conformance/vectori/dataset-consistency/v1-v2.consistency.json create mode 100644 conformance/vectori/dataset-consistency/v1-v2.valid.json create mode 100644 conformance/vectori/dataset-record/r5.commitment.json create mode 100644 conformance/vectori/dataset-record/r5.field-no-salt.json create mode 100644 conformance/vectori/dataset-record/r5.field.json create mode 100644 conformance/vectori/dataset-record/r5.form.json create mode 100644 conformance/vectori/dataset-record/r5.inclusion.json create mode 100644 conformance/vectori/dataset-record/r5.valid.json create mode 100644 conformance/vectori/dataset-sample/four-of-sixteen.sample.json create mode 100644 conformance/vectori/dataset-sample/four-of-sixteen.valid.json create mode 100644 conformance/vectori/envelope/agent-decision.form.json create mode 100644 conformance/vectori/envelope/agent-decision.integrity.json create mode 100644 conformance/vectori/envelope/agent-decision.valid.json create mode 100644 conformance/vectori/envelope/ai.form.json create mode 100644 conformance/vectori/envelope/ai.integrity.json create mode 100644 conformance/vectori/envelope/ai.valid.json create mode 100644 conformance/vectori/envelope/authorization.form.json create mode 100644 conformance/vectori/envelope/authorization.integrity.json create mode 100644 conformance/vectori/envelope/authorization.valid.json create mode 100644 conformance/vectori/envelope/block.form.json create mode 100644 conformance/vectori/envelope/block.integrity.json create mode 100644 conformance/vectori/envelope/block.valid.json create mode 100644 conformance/vectori/envelope/compliance.form.json create mode 100644 conformance/vectori/envelope/compliance.integrity.json create mode 100644 conformance/vectori/envelope/compliance.valid.json create mode 100644 conformance/vectori/envelope/data.form.json create mode 100644 conformance/vectori/envelope/data.integrity.json create mode 100644 conformance/vectori/envelope/data.valid.json create mode 100644 conformance/vectori/envelope/device.form.json create mode 100644 conformance/vectori/envelope/device.integrity.json create mode 100644 conformance/vectori/envelope/device.valid.json create mode 100644 conformance/vectori/envelope/execution.form.json create mode 100644 conformance/vectori/envelope/execution.integrity.json create mode 100644 conformance/vectori/envelope/execution.valid.json create mode 100644 conformance/vectori/envelope/fresh-28001.finality.json create mode 100644 conformance/vectori/envelope/fresh-28001.valid.json create mode 100644 conformance/vectori/envelope/identity.form.json create mode 100644 conformance/vectori/envelope/identity.integrity.json create mode 100644 conformance/vectori/envelope/identity.valid.json create mode 100644 conformance/vectori/envelope/location.form.json create mode 100644 conformance/vectori/envelope/location.integrity.json create mode 100644 conformance/vectori/envelope/location.valid.json create mode 100644 conformance/vectori/envelope/notarized-28001.valid.json create mode 100644 conformance/vectori/envelope/notarized-claim.partial.json create mode 100644 conformance/vectori/envelope/ownership.form.json create mode 100644 conformance/vectori/envelope/ownership.integrity.json create mode 100644 conformance/vectori/envelope/ownership.valid.json create mode 100644 conformance/vectori/envelope/payment.form.json create mode 100644 conformance/vectori/envelope/payment.integrity.json create mode 100644 conformance/vectori/envelope/payment.valid.json create mode 100644 conformance/vectori/envelope/provenance.form.json create mode 100644 conformance/vectori/envelope/provenance.integrity.json create mode 100644 conformance/vectori/envelope/provenance.valid.json create mode 100644 conformance/vectori/envelope/runtime.form.json create mode 100644 conformance/vectori/envelope/runtime.integrity.json create mode 100644 conformance/vectori/envelope/runtime.valid.json create mode 100644 conformance/vectori/envelope/settlement.form.json create mode 100644 conformance/vectori/envelope/settlement.integrity.json create mode 100644 conformance/vectori/envelope/settlement.valid.json create mode 100644 conformance/vectori/envelope/signed-head.signature.json create mode 100644 conformance/vectori/envelope/signed-head.valid.json create mode 100644 conformance/vectori/envelope/time.form.json create mode 100644 conformance/vectori/envelope/time.integrity.json create mode 100644 conformance/vectori/envelope/time.valid.json create mode 100644 conformance/vectori/market-timeline/s1-paid-28001.valid.json create mode 100644 conformance/vectori/market-timeline/s1-paid-claim.partial.json create mode 100644 conformance/vectori/market-timeline/s1.complete-submission.json create mode 100644 conformance/vectori/market-timeline/s1.deadline.json create mode 100644 conformance/vectori/market-timeline/s1.proof-late.json create mode 100644 conformance/vectori/market-timeline/s1.proof-other-result.json create mode 100644 conformance/vectori/market-timeline/s1.window.json create mode 100644 conformance/vectori/market-timeline/s2-slashed.valid.json create mode 100644 conformance/vectori/market-timeline/s2.arbiter.json create mode 100644 conformance/vectori/market-timeline/s2.deadline-submitted.json create mode 100644 conformance/vectori/market-timeline/s2.payout.json create mode 100644 conformance/vectori/market-timeline/s2.posting.json create mode 100644 conformance/vectori/market-timeline/s2.result.json create mode 100644 conformance/vectori/market-timeline/s2.window.json create mode 100644 conformance/vectori/market-timeline/s3-paid-after-dispute-replayed.valid.json create mode 100644 conformance/vectori/market-timeline/s3-paid-after-dispute.valid.json create mode 100644 conformance/vectori/market-timeline/s3.arbiter-no-dispute.json create mode 100644 conformance/vectori/market-timeline/s3.payout.json create mode 100644 conformance/vectori/market-timeline/s3.replay.json create mode 100644 conformance/vectori/market-timeline/s4-refunded-expired.valid.json create mode 100644 conformance/vectori/market-timeline/s4.complete-claim.json create mode 100644 conformance/vectori/market-timeline/s4.deadline.json create mode 100644 conformance/vectori/market-timeline/s4.payout.json create mode 100644 conformance/vectori/market-timeline/s5-refunded-cancelled.valid.json create mode 100644 conformance/vectori/market-timeline/s5.form.json create mode 100644 conformance/vectori/payment-receipt/company-p1-28001.valid.json create mode 100644 conformance/vectori/payment-receipt/company-p1-claim.partial.json create mode 100644 conformance/vectori/payment-receipt/company-p1.amount.json create mode 100644 conformance/vectori/payment-receipt/company-p1.binding.json create mode 100644 conformance/vectori/payment-receipt/company-p1.chain.json create mode 100644 conformance/vectori/payment-receipt/company-p1.policy.json create mode 100644 conformance/vectori/payment-receipt/company-p1.risk-other-payment.json create mode 100644 conformance/vectori/payment-receipt/company-p1.risk-other-rate.json create mode 100644 conformance/vectori/payment-receipt/company-p1.risk.json create mode 100644 conformance/vectori/payment-receipt/company-p1.valid.json create mode 100644 conformance/vectori/payment-risk/company-p1.asset.json create mode 100644 conformance/vectori/payment-risk/company-p1.counterparty.json create mode 100644 conformance/vectori/payment-risk/company-p1.form-amount.json create mode 100644 conformance/vectori/payment-risk/company-p1.form-history.json create mode 100644 conformance/vectori/payment-risk/company-p1.form-time.json create mode 100644 conformance/vectori/payment-risk/company-p1.form.json create mode 100644 conformance/vectori/payment-risk/company-p1.limit.json create mode 100644 conformance/vectori/payment-risk/company-p1.rate-number.json create mode 100644 conformance/vectori/payment-risk/company-p1.rate.json create mode 100644 conformance/vectori/payment-risk/company-p1.valid.json create mode 100644 conformance/vectori/payment-risk/company-p1.window.json create mode 100644 conformance/verdict.mjs diff --git a/README.md b/README.md index 44c044d..ed7363c 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ notarization command of the verification layer, and the agents' x402 wallet (EIP | [`market-settlement/`](market-settlement/) | the dispute and settlement rail of a verifiable infrastructure market, measured end to end on testnet 28001: an order with its reward in escrow and a provider bond, the result committed on chain with its execution envelope notarized under a post-quantum certified anchor, a challenge window in which anyone disputes with a recomputed result and a bond, an arbiter that can only route the escrow (with a permissionless 14-day timeout), deadline reclaims, and an AIP-23 settlement receipt; a pure judge over the job's timeline that checks deadlines, the window, who resolved, the payout, the replay and the proof | | [`verifiable-data/`](verifiable-data/) | a dataset whose every answer is checkable against a short commitment without the data: RFC 9162 commitments per version (append-only, consistency proofs), equality and range queries proven correct AND complete (contiguous run of a sorted index plus its two neighbours), hash-based selective disclosure of fields, availability sampling against the serving endpoint, and the version's AIP-23 envelope notarized and read back under a post-quantum certified anchor; not zero knowledge, and says so | | [`ai-trust/`](ai-trust/) | the trust chain of an AI result: the agent's identity (agents/), the model artifact's attestation, the host's runtime record (verify-layer/), the policy and signed ledger, the Proof of AI envelope and the chain as witness, joined in one bundle whose verifier checks only the links between them | +| [`conformance/`](conformance/) | a conformance suite for the AIP-23 proof kinds: one verdict form over the verifiers published here (four levels: integrity, authenticity, anchoring, finality; each passed, failed or not measured, with the named rule), 122 vectors derived from the producers and from evidence recorded on testnet 28001 (each invalid one is one operation away from a valid one and must be refused for exactly its named rule), and a runner that scores any implementation given as a command, in any language. Not a certification and not an audit | | [`identity/`](identity/) | post-quantum credentials: an issuer signs claims (hybrid Ed25519 + ML-DSA-65, both required), the holder shows only the claims it picks (selective disclosure in the manner of SD-JWT, RFC 9901, in a format of its own), bound to the verifier's audience and nonce; delegation to a phone, an agent or a ten-minute session key that can only narrow; revocation and an issuer status list in the manner of W3C Bitstring Status List; all checked offline from the files; and compliance without surveillance: a verifier's policy (issuers, required claims) judged on a presentation, recorded as an AIP-23 envelope that carries no personal data; and the Travel Rule between VASPs, the IVMS101 data sealed for the receiving VASP with a hybrid X25519 + ML-KEM-768 key encapsulation, signed, bound to the transfer and acknowledged; and the same credentials as standard SD-JWT (IETF RFC 9901): issued with the issuer's Ed25519 key (EdDSA) or its ML-DSA-65 key, presented with a key binding JWT, and verified against the RFC's own example vectors (`identity-cli.mjs verify-sdjwt`, behind Aere Cloud's POST /v1/identity/sd-jwt/verify) | Each component's README says what it is **not** and what is **not measured**. No third party has reviewed any of them. @@ -43,10 +44,11 @@ test, counts as a failure of the control. Results measured on 2026-09-29 (Node.j | identity | 44/44 (`node proba-identity.mjs`, with the AIP-23 verifier for its envelope test; without it that test is reported as skipped and the exit code is 2), compliance 15/15 (`node proba-conformitate.mjs`), Travel Rule 19/19 (`node proba-travel-rule.mjs`), SD-JWT 23/23 (`node proba-sdjwt.mjs`, the RFC 9901 vectors included), measured 2026-09-30 | 49/49 (`node control-negativ-identity.mjs`); compliance 14/14 (`node control-negativ-conformitate.mjs`); Travel Rule 19/19 (`node control-negativ-travel-rule.mjs`); SD-JWT 28/28 (`node control-negativ-sdjwt.mjs`) | | agents | policy 27/27 with the AIP-23 verifier (without it 25 run, 2 are reported as skipped and the exit code is 2), ledger 51/51, approval and revocation 39/39, the chain as witness 26/26 without a network and 7/7 on testnet 28001 on 2026-09-30 (`proba-agent-ancora-testnet.mjs`, needs a funded testnet key and the AIP-23 verifier), command line 23/23 through files and processes only (on Linux and macOS one more test checks the key file mode; not measured here); x402 wallet 25/25, 2-of-2 co-signing 16/16 and payment verifier 14/14 without a network; on the public testnet 28001, 9/9 with the wallet key and 13/13 with the 2-of-2 contract wallet (`x402/proba-x402-testnet.mjs`, `x402/proba-cosign-testnet.mjs`, each needs a funded testnet key); the contract's artifact recompiles byte for byte with solc 0.8.23 (`node x402/recompileaza-contract.mjs --solc `) | 26/26 (`node control-negativ-aprobare.mjs`); the chain as witness 11/11 (`node control-negativ-ancora.mjs`); x402 30/30 (`node x402/control-negativ-wallet.mjs`); the contract's own tests (7) and their negative control (4/4) run in the Aere Network contracts project, not in this repository | | proof-of-ai | 6/6 with the AIP-23 verifier (`AERE_VERIFY_PROOF=... node proba-proof-of-ai.mjs`); without it the probe reports NEMASURAT and exits 2 | one negative control inside the test (an envelope touched after its hash: INVALID) | -| payments | 22/22 without a chain (`node proba-risc.mjs`: the verdicts under a policy, the reproducible verdict hash, a receipt verified, nine forged ones refused by name); 9/9 on testnet 28001 on 2026-10-02 (`AERE_TESTNET_KEY_FILE=... AERE_ETHERS_DIR=... node proba-plata-28001.mjs`: a payment allowed, paid, its receipt notarized and read back with finality PASSED, the public reader VALID; a payment above the limit refused with nothing sent; the fourth in the window refused; a forged receipt and a loosened policy INVALID) | 8/8 (`node proba-risc.mjs --control-negativ`: counterparty, rate, per-payment limit, window, linkage, USD arithmetic, verdict reproduction, chain facts, each planted out on a copy and each forged fixture then accepted) | -| market-settlement | 20/20 on testnet 28001 on 2026-10-02 (`AERE_TESTNET_KEY_FILE=... AERE_ETHERS_DIR=... node proba-piata-28001.mjs`: five scenarios on AereComputeMarketV3 deployed from the committed artifact, every refusal by its named custom error, the provider's notarized envelope read back under a post-quantum certified anchor); the judge on the recorded timelines 16/16 without a chain (`node proba-judecata.mjs`: five honest timelines VALID, ten forged ones INVALID for their named reason, the settlement receipt) | 7/7 (`node proba-judecata.mjs --control-negativ`: deadline, window, arbiter, payout, result bytes, replay, proof, each planted out on a copy and each forged fixture then accepted) | -| verifiable-data | 22/22 with the AIP-23 verifier (`AERE_VERIFY_PROOF=... node proba-verifiable-data.mjs`: honest answers VALID, nine forged ones INVALID for their named reason, availability sampling on a local server; the envelope row is NEMASURAT without the verifier, exit 2); 24/24 with `--viu` on testnet 28001 on 2026-10-02 (a version notarized with a test key and read back under a post-quantum certified anchor; evidence in `dovezi/`) | 5/5 (`node proba-verifiable-data.mjs --control-negativ`: field commitment, index order, completeness, consistency, sampling, each planted out on a copy and each forged fixture then accepted) | +| payments | 23/23 without a chain (`node proba-risc.mjs`: the verdicts under a policy, the reproducible verdict hash, a receipt verified, nine forged ones refused by name, a malformed payment refused by name); 9/9 on testnet 28001 on 2026-10-02 (`AERE_TESTNET_KEY_FILE=... AERE_ETHERS_DIR=... node proba-plata-28001.mjs`: a payment allowed, paid, its receipt notarized and read back with finality PASSED, the public reader VALID; a payment above the limit refused with nothing sent; the fourth in the window refused; a forged receipt and a loosened policy INVALID) | 10/10 (`node proba-risc.mjs --control-negativ`: form, asset, counterparty, rate, per-payment limit, window, linkage, USD arithmetic, verdict reproduction, chain facts, each planted out on a copy and each forged fixture then accepted) | +| market-settlement | 20/20 on testnet 28001 on 2026-10-02 (`AERE_TESTNET_KEY_FILE=... AERE_ETHERS_DIR=... node proba-piata-28001.mjs`: five scenarios on AereComputeMarketV3 deployed from the committed artifact, every refusal by its named custom error, the provider's notarized envelope read back under a post-quantum certified anchor); the judge on the recorded timelines 21/21 without a chain (`node proba-judecata.mjs`: five honest timelines VALID, fifteen forged or malformed ones INVALID for their named reason, the settlement receipt) | 10/10 (`node proba-judecata.mjs --control-negativ`: form, completeness of the timeline, posting, deadline, window, arbiter, payout, result bytes, replay, proof, each planted out on a copy and each forged fixture then accepted) | +| verifiable-data | 23/23 with the AIP-23 verifier (`AERE_VERIFY_PROOF=... node proba-verifiable-data.mjs`: honest answers VALID, ten forged or malformed ones INVALID for their named reason, availability sampling on a local server; the envelope row is NEMASURAT without the verifier, exit 2); the two chain rows of `--viu` measured on testnet 28001 on 2026-10-02 (a version notarized with a test key and read back under a post-quantum certified anchor; evidence in `dovezi/`) | 5/5 (`node proba-verifiable-data.mjs --control-negativ`: field commitment, index order, completeness, consistency, sampling, each planted out on a copy and each forged fixture then accepted) | | ai-trust | 13/13 with the AIP-23 verifier (`AERE_VERIFY_PROOF=... node proba-lant-de-incredere.mjs`: the whole chain on a committed fixture, then ten links broken on purpose, each refused for its named reason); without the verifier it exits 2 | 8/8 (`node proba-lant-de-incredere.mjs --control-negativ`) | +| conformance | 10/10 on 2026-10-03 with the AIP-23 verifier, Python 3 and testnet 28001 read (`AERE_VERIFY_PROOF=... node proba-conformance.mjs --online`: the rules and the vectors are what the code derives, every rule has a vector, every invalid vector is one operation from its base, the published verifiers pass 122/122, an independent Python implementation passes the 55 it claims, 6,847 malformed inputs each get a verdict); without `--online` the five chain vectors are reported unmeasured and the exit code is 2 | 35/35 rules (`node proba-conformance.mjs --control-negativ --online`: each rule planted out of its verifier in a copy; the vectors that expect it, and only they, must fail), then five controls of the instruments | Code comments, most function and variable names (also many exported between the files of a component), test names and control messages are in Romanian, and so are the two command words of the KMS HSM tool (explained in its README). Error codes, error @@ -55,4 +57,4 @@ interface, command line and data (`definePolicy`, `verifyLedger`, `approve`, ... ## Licence -MIT, see [LICENSE](LICENSE). Files: 191 (pq-gateway 6, pq-kms 10, pq-pki 6, crypto-inventory 42, verify-layer 12, proof-kinds 3, control-plane 19, agents 39, identity 15, proof-of-ai 3, ai-trust 6, verifiable-data 7, market-settlement 9, payments 8, readiness 4). +MIT, see [LICENSE](LICENSE). Files: 325 (pq-gateway 6, pq-kms 10, pq-pki 6, crypto-inventory 42, verify-layer 12, proof-kinds 3, control-plane 19, agents 39, identity 15, proof-of-ai 3, ai-trust 6, verifiable-data 7, market-settlement 9, payments 8, conformance 134, readiness 4). diff --git a/conformance/README.md b/conformance/README.md new file mode 100644 index 0000000..3c53231 --- /dev/null +++ b/conformance/README.md @@ -0,0 +1,160 @@ +# Conformance suite for the AIP-23 proof kinds + +Every component beside this one ships its own verifier and its own way of saying no: the AIP-23 reference verifier prints four +levels, the payment modules return `reasons`, the market judge `motive`, the dataset module `ok`. This folder adds the one place that +says, in the same form for all of them, **this artifact passes or does not, at level N, for reason M**, and a set of vectors that any +implementation, in any language, can be run against. + +It adds no verification rule. A verdict here is derived from the verdict of the published verifier of that artifact; the rule ids +are the ones those verifiers name, read from their code. + +## The one verdict form + +```json +{ "v": 1, "kind": "aere-conformance-verdict", "artifact": "payment-receipt", "verdict": "INVALID", + "levels": [ + { "level": "integrity", "state": "FAILED", "rules": ["receipt.chain"], "reason": "the transaction on chain is not this payment ..." }, + { "level": "authenticity", "state": "NOT_MEASURED", "rules": [], "cause": "absent", "reason": "the envelope carries no signature" }, + { "level": "anchoring", "state": "NOT_MEASURED", "rules": [], "cause": "absent", "reason": "no notarization claimed and no --rpc given" }, + { "level": "finality", "state": "NOT_MEASURED", "rules": [], "cause": "absent", "reason": "no notarization claimed and no --rpc given" } ], + "failed": ["receipt.chain"] } +``` + +| level | what it says | +|---|---| +| `integrity` | the artifact is what it says: its hashes bind its content, and the rules it declares (a policy, deadlines, a challenge window, Merkle paths, a payout) hold when recomputed from the evidence supplied | +| `authenticity` | the signature the artifact carries verifies (today: an ML-DSA signature on an AIP-23 envelope) | +| `anchoring` | its `statementHash` is recorded in the notary contract, under a state root that a post-quantum anchor covers | +| `finality` | that anchor's post-quantum certificate verifies. The finality is the one of the chain the artifact was notarized on | + +Each level is `PASSED`, `FAILED` or `NOT_MEASURED`, with the reason; a level nobody judged says why (`cause`). The verdict is +`INVALID` when a level failed; `PARTIAL` when nothing failed but something the artifact **claims** was not measured (a notarization +claim not checked because the run was offline, a signature scheme the verifier cannot check, a timeline that is not terminal); +`VALID` otherwise, and only with integrity passed. A claim that was not checked is never `VALID`. `failed` is the sorted list of the +rule ids that refused; the suite compares it as an exact set. + +A receipt or a market timeline that carries an AIP-23 envelope gets that envelope judged too, by the reference verifier, so one +verdict covers the artifact: the receipt recorded on testnet 28001 comes out with integrity, anchoring and finality `PASSED` in one +verdict (`vectori/payment-receipt/company-p1-28001.valid.json`). + +## What is enrolled + +`REGULI.json` is derived from the code (`node deriva-reguli.mjs --verifica`): 35 rules of 5 verifiers, 8 artifact kinds. + +| artifact kind | judged by | rules | +|---|---|---| +| `envelope` (every AIP-23 kind) | the AIP-23 reference verifier, run as the program it is (`AERE_VERIFY_PROOF=`, published with aere-node) | `envelope.form`, `.integrity`, `.signature`, `.finality` | +| `payment-risk` (a payment presented as allowed under a declared policy) | `payments/risc.mjs` | `risk.form`, `.asset`, `.counterparty`, `.rate`, `.limit`, `.window` | +| `payment-receipt` | `payments/chitanta.mjs` | `receipt.binding`, `.amount`, `.policy`, `.risk`, `.chain` | +| `market-timeline` | `market-settlement/piata.mjs` | `market.form`, `.complete`, `.posting`, `.deadline`, `.window`, `.arbiter`, `.payout`, `.result`, `.replay`, `.proof` | +| `dataset-record`, `-answer`, `-consistency`, `-sample` | `verifiable-data/baza.mjs` | `dataset.form`, `.commitment`, `.field`, `.inclusion`, `.index`, `.range`, `.order`, `.completeness`, `.consistency`, `.sample` | + +A module verifier exports the list of rules it can name (`REGULI`; its helper throws on any other) and marks every check of a rule; +the derivation requires declared == marked == mapped here. A rule added to a verifier and not mapped is a refusal of the derivation; +a mapped rule without a vector is a refusal of the probe. For the reference verifier, a published program this suite does not edit, +the rules are its level names, and each of the six places where its `finality` level can refuse is classified as `anchoring` or +`finality` (a seventh place would be a refusal of the derivation). + +**Not enrolled**, measured in the same file: `ai-trust` (20 refusal sites; its refusals already carry a level and a code, enrolling it +is a vector per code), `agents` ledger (17), `identity` (15), `verify-layer` log and tree (36): their refusals are free text, and a +rule id per refusal comes first. Their own probes and negative controls stay what checks them. + +## The vectors + +`vectori/` holds 122 vectors (117 offline, 5 that read testnet 28001), listed with their digests in `vectori/INDEX.json`: +envelope 54, payment-risk 11, payment-receipt 10, market-timeline 25, dataset 22. None is typed by hand (`node genereaza-vectori.mjs +--verifica` regenerates them and compares byte for byte): + +- the 16 AIP-23 kinds come from their producers on fixed inputs (the same envelopes as the published AIP-23 kind vectors); +- the receipt, the five market timelines and the notarized dataset commitment are the evidence recorded on testnet 28001 on + 2026-10-02 beside those components; +- `surse-proaspete.json` holds what needed a key, randomness or the chain, made once by `--proaspat`: a tree head signed with an + ML-DSA-65 key that was generated and discarded in that call, an envelope with random content that nobody notarized, a dataset of + 16 records with random salts, and the transaction of the recorded receipt read from the chain (two read calls). + +An `INVALID` vector names its `base` and its `mutation`: **one operation** (set, remove or add at one JSON path) applied to the input +of a vector that is not invalid, and it must be refused for exactly the rules in `expected.failed`, not merely refused. Where the rule +sits under a hash, one place is not reachable (changing an amount under the instruction hash trips the binding first): six vectors +are then made at the producer, the commitments above the change recomputed with the published formulas, and every path that moved is +declared (`mutation.changed`). Three vectors expect two rules: rules that guard the same field cannot be separated (a looser policy +shown under a receipt also makes the risk verdict not reproduce). + +## Run it + +``` +AERE_VERIFY_PROOF= +node conformance.mjs --impl "node implementare-aere.mjs" # the published verifiers behind the one verdict form: 117 offline vectors +node conformance.mjs --impl "node implementare-aere.mjs" --online # and the 5 that read testnet 28001 (nothing is sent) +node conformance.mjs --impl "python3 implementare-integritate.py" # an independent implementation: 55 vectors, 67 reported NOT COVERED +node conformance.mjs --impl "" # yours +node implementare-aere.mjs [--online] # one artifact { artifact, input }: its verdict +``` + +An implementation is a command that answers three calls with JSON on stdout: `--capabilities` (`{ artifacts, rules, online, batch }`: +what it claims to judge), ` [--online]` (the verdict above for the file's `{ artifact, input }`), and, if it says +`batch`, `--batch ` (one verdict per line). A vector is scored only if the implementation claims its artifact kind and +every rule the vector exercises; otherwise it is reported `NOT COVERED`, never passed. A scored vector passes when the verdict, the +exact set of failed rules and the state of each of the four levels are the expected ones. No output is `BROKEN`: a crash is not a +refusal. Without `--online` an implementation must not open a connection. + +`implementare-integritate.py` is the second implementation: Python, standard library only, written from the rules and not from the +JavaScript. It claims 6 of the 35 rules (the form and the statement hash of an envelope; the form, the commitment, the salted field +commitments and the RFC 9162 inclusion of a dataset record) and passes all 55 vectors it claims. It cannot check an ML-DSA signature +or read a chain, says so in its capabilities, and the runner reports the rest as not covered. + +## How the suite itself is checked + +Measured on 2026-10-03 (Node.js 24.14.1, Python 3.14.4, testnet 28001 read): + +- `node proba-conformance.mjs --online`: every row green, 10 in this copy (an eleventh, the comparison of the 16 kind envelopes with + the published AIP-23 kind vectors, runs where their generator is, in the development repository: 11/11 there, and here it is + printed as information). The rules and the vectors are what the code derives now; every rule has a vector that + expects it; every kind has a valid vector; every invalid vector is its base with one operation (80) or one declared producer change + (6); the published verifiers pass 122/122; the independent implementation passes all 55 it claims; and 6,847 malformed inputs (every + path of every vector removed, or replaced by null, a string, a number, a list, an object) given to the module verifiers each got a + verdict, none threw. Without `--online` the five chain vectors are reported unmeasured and the exit code is 2. +- `node proba-conformance.mjs --control-negativ --online`: 35 of 35 rules. Each rule is planted out of its verifier, one at a time, in + a copy (every check that carries its marker made true at run time); the suite is run against the planted verifier; the vectors that + expect the rule, **and only they**, must fail, and none may break. Then the instruments: an implementation that calls everything + valid fails every vector that is not plainly valid; the coverage gate goes red when one rule's vector is taken away; a rule added + to a verifier and not mapped is refused by the derivation; a judge that throws again turns the malformed-input row red. +- `node proba-conformance.mjs --pe-loc` is a measurement, not a gate: each of the 60 marked checks of the module verifiers planted + out alone. For 46 of them a vector then fails. The other 14 are checks whose vector trips a second check of the same rule at the + same time, so removing one alone changes nothing (the three checks of `market.replay`, the run and neighbour checks of + `dataset.completeness`), or checks no vector reaches (a dispute timed out before the arbitration timeout: no recorded timeline has + one). The control above shows that each **rule** is load-bearing, not each of its checks. + +On its first day the suite found three defects in the verifiers it enrols, all fixed the same day and each now a vector or a probe +row: a malformed payment made the risk module throw instead of refusing by name; malformed dataset answers made the dataset verifier +throw; and the market judge accepted a timeline from which the submission event had been withheld, which skipped the challenge-window +rule (the judge now requires every event the job state implies: `market.complete`). + +## What it is not, and what is not measured + +- **Not a certification, not an audit, not a mark.** Passing says that an implementation agrees with the published verifiers on these + 122 inputs. It does not say either of them is correct, and no third party has reviewed the verifiers, the vectors or this suite. +- **The vectors and the verifiers have the same authors.** The expected verdicts were written by the people who wrote the verifiers. + The second implementation is independent in code and language, not in authorship, and it covers 6 rules of 35. +- **Finality is the chain's.** The level says that the post-quantum certificate of the covering anchor verified on the chain where the + artifact was notarized. Every notarized vector here is on chain 28001, a testnet; nothing in this suite ran on mainnet. +- **Five of the six finality refusals have no vector.** The reference verifier can refuse at its finality level in six places; the + vectors reach one (a notarization claimed that the chain does not hold). The others need an endpoint that lies or an anchor that + does not verify, and are not exercised here. +- **The chain vectors depend on the testnet's state.** The notary contract is open: anyone can notarize the fresh envelope's hash on + 28001, and `envelope/fresh-28001.*` then change verdict. The runner would show it; `--proaspat` makes a new one. +- **Integrity is over the evidence supplied.** A market timeline and the transaction facts of a receipt are the caller's reading of the + chain; this suite does not certify that reading under an anchor. The market judge now refuses a timeline that lacks an event the + job state implies; it does not prove that the job state shown is the chain's. +- **A notarization time is taken from the claim.** `market.proof` compares the envelope's claimed first-seen time with the challenge + window; the reference verifier certifies the time it reads from the chain, and nothing here compares the two. +- **Authenticity is one scheme.** The reference verifier checks ML-DSA signatures on envelopes; a hybrid signature (as on identity + credentials) is reported unmeasured and the verdict is `PARTIAL`. +- **What a damaged artifact can still pass.** Of the 6,847 malformed inputs, 1,810 were still accepted, at 81 distinct paths: parts a + verifier treats as optional (the transaction facts of a receipt, the envelope of a timeline) and fields no rule reads + (`node proba-conformance.mjs --acceptate` lists them). A policy that cannot be defined makes the risk module throw, by design. The + reference envelope verifier is run as published: given the JSON value `null` as an envelope it exits with an exception instead of + a verdict (1 of 88 malformed envelopes tried on 2026-10-03); the runner scores that `BROKEN`. +- **Not part of AIP-23.** The rule ids, the four levels and the verdict form are this suite's reading of the published verifiers; + AIP-23 defines the envelope. Four verifiers published beside these are not enrolled. +- **The Python implementation** writes numbers the way JavaScript does only for integers and plain decimals, and sorts keys by code + point (JavaScript's order for keys in the Basic Multilingual Plane). diff --git a/conformance/REGULI.json b/conformance/REGULI.json new file mode 100644 index 0000000..c494130 --- /dev/null +++ b/conformance/REGULI.json @@ -0,0 +1,349 @@ +{ + "v": 1, + "kind": "aere-conformance-rules", + "levels": [ + "integrity", + "authenticity", + "anchoring", + "finality" + ], + "verifiers": { + "aip23-envelope": { + "artifacts": [ + "envelope" + ], + "rules": [ + { + "id": "envelope.form", + "source": "form", + "level": "integrity", + "sites": 1, + "says": "the envelope has a statement (object) and a statementHash (0x + 64 hex)" + }, + { + "id": "envelope.integrity", + "source": "integrity", + "level": "integrity", + "sites": 1, + "says": "sha256 of the canonical statement text is the statementHash" + }, + { + "id": "envelope.signature", + "source": "signature", + "level": "authenticity", + "sites": 1, + "says": "the ML-DSA signature the envelope carries verifies over the canonical statement text" + }, + { + "id": "envelope.finality", + "source": "finality", + "level": "anchoring", + "sites": 6, + "says": "the statementHash is recorded in the notary under a state root that a verified post-quantum anchor certificate covers (level by site: see finalitySites)" + } + ], + "finalitySites": [ + { + "site": "most recent anchor did not verify", + "level": "finality", + "reachableWithAnHonestEndpoint": false + }, + { + "site": "the header the endpoint served for block", + "level": "anchoring", + "reachableWithAnHonestEndpoint": false + }, + { + "site": "has no account at", + "level": "anchoring", + "reachableWithAnHonestEndpoint": false + }, + { + "site": "is not the AereNotary contract", + "level": "anchoring", + "reachableWithAnHonestEndpoint": false + }, + { + "site": "the Merkle proof for block", + "level": "anchoring", + "reachableWithAnHonestEndpoint": false + }, + { + "site": "not notarized:", + "level": "anchoring", + "reachableWithAnHonestEndpoint": true + } + ] + }, + "payment-risk": { + "artifacts": [ + "payment-risk" + ], + "rules": [ + { + "id": "risk.form", + "source": "forma", + "level": "integrity", + "sites": 4, + "says": "payer and payee are addresses; chain, asset, a positive integer amount and the time are given" + }, + { + "id": "risk.asset", + "source": "activ", + "level": "integrity", + "sites": 1, + "says": "the asset on that chain is allowed by the declared policy" + }, + { + "id": "risk.counterparty", + "source": "contrapartida", + "level": "integrity", + "sites": 1, + "says": "the payee is not the payer and is not a refused counterparty of the policy" + }, + { + "id": "risk.rate", + "source": "curs", + "level": "integrity", + "sites": 1, + "says": "the USD rate is declared (value, source, time) when the policy requires it" + }, + { + "id": "risk.limit", + "source": "limita", + "level": "integrity", + "sites": 1, + "says": "the amount in USD is within the per-payment limit of the policy" + }, + { + "id": "risk.window", + "source": "fereastra", + "level": "integrity", + "sites": 1, + "says": "the amount and the count stay within the sliding window of the policy" + } + ] + }, + "payment-receipt": { + "artifacts": [ + "payment-receipt" + ], + "rules": [ + { + "id": "receipt.binding", + "source": "legatura", + "level": "integrity", + "sites": 2, + "says": "the settlement envelope commits to this instruction and says the same thing" + }, + { + "id": "receipt.amount", + "source": "suma", + "level": "integrity", + "sites": 1, + "says": "the USD amount is the amount at the declared rate, exactly" + }, + { + "id": "receipt.policy", + "source": "politica", + "level": "integrity", + "sites": 1, + "says": "the policy shown hashes to the policy the risk verdict names" + }, + { + "id": "receipt.risk", + "source": "risc", + "level": "integrity", + "sites": 3, + "says": "the risk verdict reproduces from the inputs and the policy, and it allowed this payment" + }, + { + "id": "receipt.chain", + "source": "lant", + "level": "integrity", + "sites": 1, + "says": "the transaction supplied is this payment: payer, payee, value, block, mined" + } + ] + }, + "market-timeline": { + "artifacts": [ + "market-timeline" + ], + "rules": [ + { + "id": "market.form", + "source": "forma", + "level": "integrity", + "sites": 1, + "says": "the timeline is well formed: events with name, arguments, sender, integer time and block; the job and the constants with their integer fields" + }, + { + "id": "market.complete", + "source": "intreg", + "level": "integrity", + "sites": 1, + "says": "the timeline carries every event the job state implies: posted; claimed when a provider is set; submitted and disputed when their times are set" + }, + { + "id": "market.posting", + "source": "postare", + "level": "integrity", + "sites": 1, + "says": "the JobPosted event matches the job (requester, spec, deadline, reward)" + }, + { + "id": "market.deadline", + "source": "termen", + "level": "integrity", + "sites": 3, + "says": "claim and submission are within the deadline; an expiry refund only after it" + }, + { + "id": "market.window", + "source": "fereastra", + "level": "integrity", + "sites": 2, + "says": "a dispute is raised inside the challenge window; a third party finalizes only after it" + }, + { + "id": "market.arbiter", + "source": "arbitru", + "level": "integrity", + "sites": 3, + "says": "a dispute is resolved by the arbiter, or timed out only after the arbitration timeout" + }, + { + "id": "market.payout", + "source": "plata", + "level": "integrity", + "sites": 4, + "says": "the terminal payout matches the final state (who, how much, which bond)" + }, + { + "id": "market.result", + "source": "rezultat", + "level": "integrity", + "sites": 1, + "says": "the result bytes hash to the commitment on chain" + }, + { + "id": "market.replay", + "source": "replay", + "level": "integrity", + "sites": 3, + "says": "the public task recomputed agrees with who was paid or slashed" + }, + { + "id": "market.proof", + "source": "dovada", + "level": "integrity", + "sites": 2, + "says": "the execution envelope names this job and existed before the window closed" + } + ] + }, + "dataset": { + "artifacts": [ + "dataset-record", + "dataset-answer", + "dataset-consistency", + "dataset-sample" + ], + "rules": [ + { + "id": "dataset.form", + "source": "forma", + "level": "integrity", + "sites": 1, + "says": "a row carries its field commitments and its disclosed fields" + }, + { + "id": "dataset.commitment", + "source": "angajament", + "level": "integrity", + "sites": 4, + "says": "the record, answer or proof names the commitment it is checked against" + }, + { + "id": "dataset.field", + "source": "camp", + "level": "integrity", + "sites": 2, + "says": "a disclosed value opens its salted field commitment" + }, + { + "id": "dataset.inclusion", + "source": "includere", + "level": "integrity", + "sites": 1, + "says": "the record is in the log of that version (RFC 9162 inclusion)" + }, + { + "id": "dataset.index", + "source": "index", + "level": "integrity", + "sites": 2, + "says": "the row is at its stated position of the sorted index" + }, + { + "id": "dataset.range", + "source": "interval", + "level": "integrity", + "sites": 2, + "says": "every row returned is inside the queried range" + }, + { + "id": "dataset.order", + "source": "ordine", + "level": "integrity", + "sites": 1, + "says": "consecutive rows are in index order" + }, + { + "id": "dataset.completeness", + "source": "completitudine", + "level": "integrity", + "sites": 5, + "says": "the rows are the whole contiguous run; the neighbours on both sides are outside the range" + }, + { + "id": "dataset.consistency", + "source": "consistenta", + "level": "integrity", + "sites": 3, + "says": "the older log is a prefix of the newer (RFC 9162 consistency) and the versions are linked" + }, + { + "id": "dataset.sample", + "source": "esantion", + "level": "integrity", + "sites": 1, + "says": "every sampled position is served and verifies" + } + ] + } + }, + "notEnrolled": [ + { + "verifier": "ai-trust", + "refusalSites": 20, + "why": "its refusals already carry a level and a code; enrolling it is a vector per code, not done here" + }, + { + "verifier": "agents (ledger)", + "refusalSites": 17, + "why": "its refusals are free text; a rule id per refusal comes first" + }, + { + "verifier": "identity", + "refusalSites": 15, + "why": "its checks are labelled rows, not rule ids" + }, + { + "verifier": "verify-layer (log and tree)", + "refusalSites": 36, + "why": "its refusals are free text; a rule id per refusal comes first" + } + ] +} diff --git a/conformance/conformance.mjs b/conformance/conformance.mjs new file mode 100644 index 0000000..f8348c5 --- /dev/null +++ b/conformance/conformance.mjs @@ -0,0 +1,104 @@ +#!/usr/bin/env node +// conformance.mjs: runs the conformance vectors against ANY implementation, given as a command in any language. +// +// node conformance.mjs --impl "" [--online] [--only ] [--vectors ] [--json] +// +// The contract of an implementation (three calls, JSON on stdout): +// --capabilities { artifacts: [...], rules: [...], online: bool, batch: bool } what it claims to judge +// [--online] the verdict of verdict.mjs for the file's { artifact, input }: +// { verdict: VALID|INVALID|PARTIAL, failed: [rule ids], levels: [{ level, state }, ...] } +// --batch (only if batch) list = [{ file, online }]; one verdict per line, in order +// Without --online the implementation must not open a connection; vectors that need the testnet endpoint are run only with --online. +// +// A vector is scored only if the implementation claims its artifact and every rule the vector exercises; otherwise it is reported as +// NOT COVERED, never as passed. A scored vector PASSES when the verdict, the exact set of failed rules and the state of each of the +// four levels are the expected ones; it FAILS otherwise; it is BROKEN when the implementation gave no verdict at all (a crash is not +// a refusal). Exit: 0 every scored vector passed (and at least one was scored); 1 a vector failed or broke; 2 nothing was scored, or +// the vector set itself is not whole. +import fs from 'node:fs'; import os from 'node:os'; import path from 'node:path'; import crypto from 'node:crypto'; import { spawnSync } from 'node:child_process'; import { fileURLToPath } from 'node:url'; + +const AICI = path.dirname(fileURLToPath(import.meta.url)); +const sha256 = (b) => '0x' + crypto.createHash('sha256').update(b).digest('hex'); +const desparte = (s) => (s.match(/"[^"]*"|\S+/g) || []).map((x) => x.replace(/^"|"$/g, '')); +const peDisc = (d, pre = '') => fs.readdirSync(d, { withFileTypes: true }).flatMap((e) => (e.isDirectory() ? peDisc(path.join(d, e.name), pre + e.name + '/') : [pre + e.name])); + +/** The vector set, whole: every file of the index present with its digest, and no file the index does not name. */ +export function incarcaVectorii(dir = path.join(AICI, 'vectori')) { + const ip = path.join(dir, 'INDEX.json'); if (!fs.existsSync(ip)) return { eroare: 'no INDEX.json in ' + dir }; + const index = JSON.parse(fs.readFileSync(ip, 'utf8')); const vectori = []; + for (const e of index.vectors) { + const f = path.join(dir, e.id + '.json'); if (!fs.existsSync(f)) return { eroare: 'the index names ' + e.id + ', which is not on disk' }; + // the digest is over the text with LF line ends: a checkout that wrote CRLF (git on Windows) holds the same vector + const b = fs.readFileSync(f, 'utf8').replace(/\r\n/g, '\n'); if (sha256(Buffer.from(b, 'utf8')) !== e.sha256) return { eroare: 'vector ' + e.id + ' does not hash to its index entry' }; + vectori.push({ ...JSON.parse(b), file: f }); + } + const straine = peDisc(dir).filter((f) => f !== 'INDEX.json' && !index.vectors.some((e) => e.id + '.json' === f)); + if (straine.length) return { eroare: 'files the index does not name: ' + straine.join(', ') }; + if (index.count !== vectori.length) return { eroare: 'the index counts ' + index.count + ' vectors and lists ' + vectori.length }; + return { index, vectori }; +} +/** Compares a verdict with the expectation of a vector; returns the list of differences (empty: the vector passed). */ +export function compara(v, r) { + const d = []; const e = v.expected; + if (r.verdict !== e.verdict) d.push(`verdict ${r.verdict}, expected ${e.verdict}`); + const f = Array.isArray(r.failed) ? [...r.failed].sort() : null; + if (!f || f.join() !== e.failed.join()) d.push(`failed rules [${f ? f.join(', ') : 'none given'}], expected [${e.failed.join(', ')}]`); + for (const [l, s] of Object.entries(e.levels)) { const x = (r.levels || []).find((y) => y.level === l); if (!x || x.state !== s) d.push(`${l} ${x ? x.state : 'missing'}, expected ${s}`); } + return d; +} +/** + * Runs the suite. @returns {{ caps, rezultate: [{ id, stare: 'PASS'|'FAIL'|'BROKEN'|'NOT_COVERED'|'SKIPPED_ONLINE', detaliu }], eroare? }} + * `env` is added to the environment of the implementation (the planting control points it at planted copies through it). + */ +export function ruleazaSuita({ impl, online = false, dir, doar = null, env = {}, vectori: dati = null }) { + const cmd = desparte(impl); if (!cmd.length) return { eroare: 'no implementation command' }; + if (cmd[0] === 'node') cmd[0] = process.execPath; + const mediu = { ...process.env, ...env }; + const exec = (args, timeout) => spawnSync(cmd[0], [...cmd.slice(1), ...args], { encoding: 'utf8', env: mediu, timeout, maxBuffer: 64 << 20, stdio: ['ignore', 'pipe', 'pipe'] }); + const c = exec(['--capabilities'], 60000); let caps; try { caps = JSON.parse(c.stdout); } catch { return { eroare: 'the implementation gave no capabilities (exit ' + c.status + '): ' + String(c.stderr || c.error || '').trim().split('\n').slice(-1)[0].slice(0, 200) }; } + if (!Array.isArray(caps.artifacts) || !Array.isArray(caps.rules)) return { eroare: 'capabilities need artifacts and rules' }; + let vectori = dati; if (!vectori) { const s = incarcaVectorii(dir); if (s.eroare) return { eroare: s.eroare }; vectori = s.vectori; } + if (doar) vectori = vectori.filter((v) => v.id.startsWith(doar)); + const rezultate = []; const deRulat = []; + for (const v of vectori) { + const lipsa = !caps.artifacts.includes(v.artifact) ? ['artifact ' + v.artifact] : v.exercises.filter((r) => !caps.rules.includes(r)); + if (v.requires.length && !caps.online) lipsa.push('online'); + if (lipsa.length) rezultate.push({ id: v.id, stare: 'NOT_COVERED', detaliu: 'the implementation does not claim: ' + lipsa.join(', ') }); + else if (v.requires.length && !online) rezultate.push({ id: v.id, stare: 'SKIPPED_ONLINE', detaliu: 'needs ' + v.requires.join(', ') + ' (run with --online)' }); + else deRulat.push(v); + } + const raspunsuri = new Map(); + if (caps.batch && deRulat.length) { + const lf = path.join(fs.mkdtempSync(path.join(os.tmpdir(), 'aere-conf-run-')), 'list.json'); fs.writeFileSync(lf, JSON.stringify(deRulat.map((v) => ({ file: v.file, online: v.requires.length > 0 })))); + const r = exec(['--batch', lf], 1800000); fs.rmSync(path.dirname(lf), { recursive: true, force: true }); + const linii = String(r.stdout || '').split('\n').filter((l) => l.trim()); + deRulat.forEach((v, k) => { try { raspunsuri.set(v.id, JSON.parse(linii[k])); } catch { raspunsuri.set(v.id, { error: 'no verdict line (exit ' + r.status + '): ' + String(r.stderr || r.error || '').trim().split('\n').slice(-1)[0].slice(0, 160) }); } }); + } else for (const v of deRulat) { + const r = exec([v.file, ...(v.requires.length ? ['--online'] : [])], 600000); + try { raspunsuri.set(v.id, JSON.parse(r.stdout)); } catch { raspunsuri.set(v.id, { error: 'no verdict (exit ' + r.status + '): ' + String(r.stderr || r.error || '').trim().split('\n').slice(-1)[0].slice(0, 160) }); } + } + for (const v of deRulat) { + const r = raspunsuri.get(v.id); + if (!r || r.error || !r.verdict) { rezultate.push({ id: v.id, stare: 'BROKEN', detaliu: (r && r.error) || 'no verdict' }); continue; } + const d = compara(v, r); rezultate.push({ id: v.id, stare: d.length ? 'FAIL' : 'PASS', detaliu: d.join('; '), primit: { verdict: r.verdict, failed: r.failed } }); + } + const ordine = new Map(vectori.map((v, k) => [v.id, k])); rezultate.sort((x, y) => ordine.get(x.id) - ordine.get(y.id)); + return { caps, rezultate }; +} + +if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { + const a = process.argv.slice(2); const opt = (n) => { const i = a.indexOf(n); return i >= 0 ? a[i + 1] : null; }; + const impl = opt('--impl'); if (!impl) { console.error('usage: node conformance.mjs --impl "" [--online] [--only ] [--vectors ] [--json]'); process.exit(2); } + const s = ruleazaSuita({ impl, online: a.includes('--online'), dir: opt('--vectors') || undefined, doar: opt('--only') }); + if (s.eroare) { console.log('NOT MEASURED: ' + s.eroare); process.exit(2); } + const n = (st) => s.rezultate.filter((r) => r.stare === st).length; + if (a.includes('--json')) console.log(JSON.stringify({ implementation: s.caps.name || impl, results: s.rezultate }, null, 1)); + else { + console.log('implementation: ' + (s.caps.name || impl) + ' claims ' + s.caps.artifacts.length + ' artifact kind(s), ' + s.caps.rules.length + ' rule(s)' + (s.caps.online ? ', online' : '')); + for (const r of s.rezultate) if (r.stare === 'FAIL' || r.stare === 'BROKEN') console.log(` [${r.stare.padEnd(6)}] ${r.id}: ${r.detaliu}`); + const nc = s.rezultate.filter((r) => r.stare === 'NOT_COVERED'); const peMotiv = {}; for (const r of nc) peMotiv[r.detaliu] = (peMotiv[r.detaliu] || 0) + 1; + for (const [m, k] of Object.entries(peMotiv)) console.log(` [NOT COVERED] ${k} vector(s): ${m}`); + console.log(`\nconformance: ${n('PASS')} passed, ${n('FAIL')} failed, ${n('BROKEN')} broken, ${n('NOT_COVERED')} not covered, ${n('SKIPPED_ONLINE')} skipped (online) of ${s.rezultate.length} vectors`); + } + process.exitCode = n('FAIL') || n('BROKEN') ? 1 : n('PASS') ? 0 : 2; +} diff --git a/conformance/deriva-reguli.mjs b/conformance/deriva-reguli.mjs new file mode 100644 index 0000000..893b67a --- /dev/null +++ b/conformance/deriva-reguli.mjs @@ -0,0 +1,18 @@ +#!/usr/bin/env node +// deriva-reguli.mjs: writes REGULI.json, the table of the rules the enrolled verifiers name, DERIVED from their code (reguli.mjs). +// node deriva-reguli.mjs derives and writes REGULI.json; refuses (1) if a rule is unmapped, unmarked or gone +// node deriva-reguli.mjs --verifica derives and compares with REGULI.json: LA ZI (0), DIFERIT (1), NEMASURAT (2: a source not here) +import fs from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; +import { deriva } from './reguli.mjs'; + +const F = path.join(path.dirname(fileURLToPath(import.meta.url)), 'REGULI.json'); +const { tabel, probleme, nemasurat } = await deriva(); +for (const p of probleme) console.log('REFUSED: ' + p); +for (const n of nemasurat) console.log('NOT MEASURED: ' + n); +if (probleme.length) process.exitCode = 1; +else if (nemasurat.length) process.exitCode = 2; +else { + const text = JSON.stringify(tabel, null, 1) + '\n'; const n = Object.values(tabel.verifiers).reduce((s, v) => s + v.rules.length, 0); + if (process.argv.includes('--verifica')) { const egal = fs.existsSync(F) && fs.readFileSync(F, 'utf8').replace(/\r\n/g, '\n') === text; console.log(egal ? `LA ZI (${n} rules of ${Object.keys(tabel.verifiers).length} verifiers)` : 'DIFERIT: REGULI.json is not what the code derives now'); process.exitCode = egal ? 0 : 1; } + else { fs.writeFileSync(F, text); console.log(`written REGULI.json: ${n} rules of ${Object.keys(tabel.verifiers).length} verifiers; not enrolled: ` + tabel.notEnrolled.map((x) => x.verifier + ' (' + x.refusalSites + ' refusal sites)').join(', ')); } +} diff --git a/conformance/genereaza-vectori.mjs b/conformance/genereaza-vectori.mjs new file mode 100644 index 0000000..cf20638 --- /dev/null +++ b/conformance/genereaza-vectori.mjs @@ -0,0 +1,299 @@ +#!/usr/bin/env node +// genereaza-vectori.mjs: the conformance vectors, DERIVED from the producers and from evidence already recorded, never typed by hand. +// +// node genereaza-vectori.mjs rewrites vectori/ from: the producers run on fixed inputs (the AIP-23 kinds), the evidence +// recorded on testnet 28001 beside the products (a receipt, five market timelines, a notarized +// dataset commitment), and surse-proaspete.json (what needs a key, randomness or the chain) +// node genereaza-vectori.mjs --verifica regenerates in memory and compares with vectori/ byte for byte: LA ZI (0) or DIFERIT (1) +// node genereaza-vectori.mjs --proaspat rebuilds surse-proaspete.json: an ML-DSA-65 key made and discarded here signs a tree head, +// a random envelope nobody notarized, a small dataset (random salts), and the transaction of +// the recorded receipt READ from testnet 28001 (two eth_ calls; nothing is sent) +// +// A vector is { artifact, input, expected: { verdict, failed, levels } }. An INVALID vector names its `base` (a vector that is not +// INVALID) and its `mutation`: ONE operation (set, remove, add at one JSON path) applied to the base input, so that it differs from the +// base in exactly one place and must be refused for exactly the rules in `expected.failed`. Where the rule sits under a hash (an amount +// under the instruction hash, an order under an index root) one place is not reachable: the mutation is then made at the PRODUCER +// (`mutation.producer`), the commitments above it recomputed, and `mutation.changed` lists every path that moved. +// `exercises` are the rules an implementation must be able to judge to be scored on the vector; `requires: ['rpc-28001']` marks the +// vectors that need the testnet endpoint (run only with --online). +import fs from 'node:fs'; import os from 'node:os'; import path from 'node:path'; import crypto from 'node:crypto'; import { fileURLToPath } from 'node:url'; +import { buildProof, KINDS } from '../proof-kinds/proof-kinds.mjs'; +import { buildProofOfAi } from '../proof-of-ai/proof-of-ai.mjs'; +import { definePolicy, checkAction, decisionEnvelope } from '../agents/agent-policy.mjs'; +import { capDeArbore } from '../verify-layer/jurnal-arbore.mjs'; +import { hashIntrare } from '../verify-layer/sidecar.mjs'; +import { merkleTree } from '../verify-layer/arbore-merkle.mjs'; +import * as RISC from '../payments/risc.mjs'; +import * as BAZA from '../verifiable-data/baza.mjs'; +import { hartaPublica, LEVELS } from './reguli.mjs'; + +const AICI = path.dirname(fileURLToPath(import.meta.url)); +const DIR = path.join(AICI, 'vectori'); const PROASPETE = path.join(AICI, 'surse-proaspete.json'); +const DOV = { chitanta: new URL('../payments/dovezi/chitanta-28001-2026-10-02T1716Z.json', import.meta.url), piata: new URL('../market-settlement/dovezi/piata-28001-2026-10-02T1652Z.json', import.meta.url), + date: new URL('../verifiable-data/dovezi/notarizare-28001-2026-10-02T0820Z.json', import.meta.url) }; +const citeste = (u) => JSON.parse(fs.readFileSync(fileURLToPath(u), 'utf8')); +const clona = (x) => JSON.parse(JSON.stringify(x)); +const sha256 = (b) => '0x' + crypto.createHash('sha256').update(b).digest('hex'); +const HARTA = hartaPublica(); +const RPC_28001 = process.env.AERE_CONFORMANCE_RPC_28001 || 'https://testnet-rpc.aere.network'; + +// ---------- one operation at one path ---------- +export function aplica(input, op) { + const c = clona(input); let o = c; const p = op.path; + for (const k of p.slice(0, -1)) { if (o == null || !(k in Object(o))) throw new Error('mutation path not in the base: ' + p.join('.')); o = o[k]; } + const k = p[p.length - 1]; + if (op.op === 'set') { if (!(k in Object(o))) throw new Error('set: nothing at ' + p.join('.')); o[k] = clona(op.value); } + else if (op.op === 'add') { if (k in Object(o)) throw new Error('add: something already at ' + p.join('.')); o[k] = clona(op.value); } + else if (op.op === 'remove') { if (!(k in Object(o))) throw new Error('remove: nothing at ' + p.join('.')); if (Array.isArray(o)) o.splice(k, 1); else delete o[k]; } + else throw new Error('unknown op ' + op.op); + return c; +} +const nivele = (failed, extra = {}) => { + const n = Object.fromEntries(LEVELS.map((l) => [l, 'NOT_MEASURED'])); n.integrity = 'PASSED'; Object.assign(n, extra); + for (const r of failed) { if (!HARTA[r]) throw new Error('a vector expects an unknown rule: ' + r); n[HARTA[r].level] = 'FAILED'; } + return n; +}; + +const V = []; // the vectors, in order +function valid(id, artifact, title, source, input, { exercises, requires = [], verdict = 'VALID', levels = {}, base = null, mutation = null }) { + V.push({ v: 1, kind: 'aere-conformance-vector', id, artifact, title, source, requires, exercises: [...exercises].sort(), base, mutation, input, expected: { verdict, failed: [], levels: nivele([], levels) } }); + return input; +} +function invalid(id, title, bazaId, op, failed, { levels = {}, exercises = null, requires = null, producer = null } = {}) { + const b = V.find((x) => x.id === bazaId); if (!b) throw new Error('no base ' + bazaId); if (b.expected.verdict === 'INVALID') throw new Error('the base of ' + id + ' is itself INVALID'); + const input = producer ? producer.input : aplica(b.input, op); + const mutation = producer ? { producer: producer.note, changed: producer.changed } : op; + V.push({ v: 1, kind: 'aere-conformance-vector', id, artifact: b.artifact, title, source: 'derived from ' + bazaId, requires: requires || b.requires, exercises: (exercises || b.exercises).slice().sort(), base: bazaId, mutation, input, + expected: { verdict: 'INVALID', failed: [...failed].sort(), levels: nivele(failed, { ...b.expected.levels, ...levels }) } }); +} + +// ---------- the fresh sources: a key, randomness, the chain ---------- +async function proaspat() { + const AT = new Date().toISOString(); + // (1) a signed tree head: three envelopes in a hash-chained log, the head signed with an ML-DSA-65 key that exists only in this call + const INT = intrariKinds(); let prev = '0x' + '00'.repeat(32); + const jurnal = ['data', 'execution', 'time'].map((k, seq) => { const proof = buildProof(k, INT[k]); const hash = hashIntrare(seq, prev, proof); const e = { seq, prev, proof, hash }; prev = hash; return e; }); + const { privateKey } = crypto.generateKeyPairSync('ml-dsa-65'); + const signedHead = capDeArbore(jurnal, { host: 'conformance', createdAt: AT, signKeyPem: privateKey.export({ type: 'pkcs8', format: 'pem' }) }); + // (2) an envelope nobody notarized: random content + const fresh = buildProof('data', { name: 'conformance-fresh', content: crypto.randomBytes(32).toString('hex'), createdAt: AT }); + // (3) the transaction of the recorded receipt, read from the chain + const ins = citeste(DOV.chitanta).instruction; + const rpc = async (method, params) => { const r = await fetch(RPC_28001, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }), signal: AbortSignal.timeout(20000) }); if (!r.ok) throw new Error(method + ': HTTP ' + r.status); const j = await r.json(); if (j.error || !j.result) throw new Error(method + ': ' + JSON.stringify(j.error || 'no result')); return j.result; }; + const t = await rpc('eth_getTransactionByHash', [ins.txHash]); const rc = await rpc('eth_getTransactionReceipt', [ins.txHash]); + const receiptTx = { chainId: 28001, readAt: AT, tx: { from: t.from, to: t.to, value: t.value, blockHash: t.blockHash }, txReceipt: { status: rc.status, blockHash: rc.blockHash } }; + // (4) a small dataset: 12 records committed as version 1, 4 more as version 2 + const T = fs.mkdtempSync(path.join(os.tmpdir(), 'aere-conf-set-')); let dataset; + try { + const TARI = ['RO', 'DE', 'FR', 'ES']; const rec = (n, de = 0) => Array.from({ length: n }, (_, j) => { const k = de + j; return { id: 'r' + k, country: TARI[k % 4], age: 20 + ((k * 7) % 40), email: 'u' + k + '@example.test', note: 'undisclosed-' + k }; }); + const db = BAZA.creeaza(path.join(T, 'set'), { name: 'conformance', indexes: ['country', 'age'] }); + BAZA.adauga(db, rec(12)); BAZA.angajeaza(db, { createdAt: '2026-10-03T00:00:00.000Z' }); BAZA.adauga(db, rec(4, 12)); BAZA.angajeaza(db, { createdAt: '2026-10-03T00:01:00.000Z' }); + const c1 = BAZA.versiune(db, 1), c2 = BAZA.versiune(db, 2); + const cerute = []; const seed = 'conformance-sample'; const k = 4; + await BAZA.esantioneaza({ url: 'vector://served', commitment: c2, k, seed, ia: async (u) => { cerute.push(Number(u.split('/').pop())); return null; } }); + dataset = { older: c1, newer: c2, record: BAZA.dovadaInregistrare(db, 2, 5, { fields: ['country', 'age'] }), answer: BAZA.interogheaza(db, 2, { field: 'age', from: 30, to: 45, fields: ['country'] }), + consistency: BAZA.dovadaConsistenta(db, 1, 2), sample: { k, seed, served: Object.fromEntries(cerute.map((i) => [String(i), BAZA.dovadaInregistrare(db, 2, i, { fields: ['country'] })])) } }; + } finally { fs.rmSync(T, { recursive: true, force: true }); } + fs.writeFileSync(PROASPETE, JSON.stringify({ v: 1, kind: 'aere-conformance-fresh-sources', at: AT, signedHead, fresh, receiptTx, dataset }, null, 1) + '\n'); + console.log('written ' + path.basename(PROASPETE) + ' (a signed head, a fresh envelope, the receipt transaction read from 28001, a dataset of ' + dataset.newer.size + ' records)'); +} + +// ---------- fixed inputs of the AIP-23 kinds (the inputs of the published AIP-23 kind vectors) ---------- +function intrariKinds() { + const AT = '2026-09-26T00:00:00Z'; const H = (s) => sha256(Buffer.from(s, 'utf8')); + return { data: { name: 'report.csv', content: 'a,b,c', createdAt: AT }, execution: { program: 'aere-node', input: 'in', output: 'out', exitCode: 0, createdAt: AT }, + identity: { subjectId: 'agent-1', publicKey: 'PK', method: 'ml-dsa-65', createdAt: AT }, compliance: { subject: 'org-x', policy: 'pq-ready', result: 'pass', evidence: 'EV', createdAt: AT }, + runtime: { host: 'h1', artifactContent: 'BIN', attested: H('BIN'), matches: true, createdAt: AT }, location: { subject: 'srv-eu', region: 'eu-central', evidence: 'EV', createdAt: AT }, + device: { deviceId: 'dev-9', attestation: 'ATT', publicKey: 'PK', posture: 'secure-boot', createdAt: AT }, payment: { from: '0xa', to: '0xb', amount: '100', asset: 'AERE', tx: 'TX', createdAt: AT }, + ownership: { owner: '0xowner', assetId: 'nft-7', asset: 'ASSET', createdAt: AT }, time: { subject: 'SUBJ', source: 'aere-anchor', at: AT, createdAt: AT }, + block: { blockHash: '0x' + 'ab'.repeat(32), stateRoot: '0x' + 'cd'.repeat(32), anchorHeight: 20255488, certificateDigest: '0x' + 'ef'.repeat(32), createdAt: AT }, + authorization: { grantor: 'org-x', grantee: 'agent-7', scope: 'payments:send<=100', policy: 'POLICY', expiresAt: '2026-12-31T00:00:00Z', createdAt: AT }, + settlement: { chainId: 2800, txHash: '0x' + '12'.repeat(32), blockHash: '0x' + '34'.repeat(32), from: '0xa', to: '0xb', amount: '100', asset: 'AERE', instruction: 'INSTR', createdAt: AT }, + provenance: { subject: 'ARTIFACT', parents: ['SRC-1', 'SRC-2'], process: 'BUILD', actor: 'build-bot', createdAt: AT } }; +} +/** Every AIP-23 kind, from its producer, on the fixed inputs. */ +export function plicuriKinds() { + const AT = '2026-09-26T00:00:00Z'; const INT = intrariKinds(); const out = []; + for (const k of KINDS) { if (!INT[k]) throw new Error('proof kind ' + k + ' has no fixed input here: a new kind needs its vectors'); out.push([k, buildProof(k, INT[k])]); } + out.push(['ai', buildProofOfAi({ model: { name: 'example-model', version: '1.0' }, prompt: 'summarize', output: 'summary', tools: ['search'], agentId: 'agent-7', createdAt: AT })]); + const { policy, policyHash } = definePolicy({ agentId: 'agent-7', spend: { amount: '100', windowSeconds: 3600, asset: 'AERE' }, tools: ['search'], recipients: null }); + const action = { kind: 'payment', to: '0xb', amount: '50', at: 1 }; + out.push(['agent-decision', decisionEnvelope({ policyHash, action, decision: checkAction(policy, action, []), createdAt: AT })]); + return out; +} + +// ---------- the vectors ---------- +function construieste() { + if (!fs.existsSync(PROASPETE)) throw new Error('surse-proaspete.json is missing: run with --proaspat once (it reads testnet 28001)'); + const P = JSON.parse(fs.readFileSync(PROASPETE, 'utf8')); + const E = ['envelope.form', 'envelope.integrity']; + + // (A) AIP-23 envelopes: every kind VALID; its statementHash cut short (form); one statement field changed (integrity) + for (const [k, env] of plicuriKinds()) { + valid(`envelope/${k}.valid`, 'envelope', `the ${k} envelope from its producer`, 'producer on fixed inputs', { envelope: env }, { exercises: E }); + invalid(`envelope/${k}.form`, `${k}: the statementHash is 63 hex digits`, `envelope/${k}.valid`, { op: 'set', path: ['envelope', 'statementHash'], value: env.statementHash.slice(0, -1) }, ['envelope.form']); + const camp = Object.keys(env.statement).find((c) => c !== 'kind' && typeof env.statement[c] === 'string'); if (!camp) throw new Error('kind ' + k + ' has no string field to change'); + invalid(`envelope/${k}.integrity`, `${k}: statement.${camp} changed after hashing`, `envelope/${k}.valid`, { op: 'set', path: ['envelope', 'statement', camp], value: env.statement[camp] + '0' }, ['envelope.integrity']); + } + // a signed envelope: the tree head of an audit log, ML-DSA-65 + const b64 = P.signedHead.signature.signature; + valid('envelope/signed-head.valid', 'envelope', 'a tree head signed with ML-DSA-65', 'producer (verify-layer tree head), key made and discarded at generation', { envelope: P.signedHead }, { exercises: [...E, 'envelope.signature'], levels: { authenticity: 'PASSED' } }); + invalid('envelope/signed-head.signature', 'the signature has one character changed', 'envelope/signed-head.valid', { op: 'set', path: ['envelope', 'signature', 'signature'], value: (b64[0] === 'A' ? 'B' : 'A') + b64.slice(1) }, ['envelope.signature']); + // notarization: a recorded envelope on 28001 (online), the same judged offline (the claim is not checked), a fresh one with a false claim + const D = citeste(DOV.date); const F = [...E, 'envelope.finality']; const R = ['rpc-28001']; + valid('envelope/notarized-28001.valid', 'envelope', 'a dataset commitment notarized on testnet 28001, read back under a verified post-quantum anchor', 'recorded (verifiable-data, 2026-10-02)', { envelope: D.envelope, chain: 28001 }, { exercises: F, requires: R, levels: { anchoring: 'PASSED', finality: 'PASSED' } }); + valid('envelope/notarized-claim.partial', 'envelope', 'the same envelope judged offline: the notarization it claims is not checked, so it is not VALID', 'recorded (verifiable-data, 2026-10-02)', { envelope: D.envelope, chain: 28001 }, { exercises: E, verdict: 'PARTIAL' }); + valid('envelope/fresh-28001.valid', 'envelope', 'an envelope nobody notarized, claiming nothing', 'producer, random content', { envelope: P.fresh, chain: 28001 }, { exercises: F, requires: R }); + invalid('envelope/fresh-28001.finality', 'the same envelope claims a notarization the chain does not hold', 'envelope/fresh-28001.valid', { op: 'add', path: ['envelope', 'notarization'], value: { chainId: 28001 } }, ['envelope.finality']); + + // (B) a payment under a declared policy: the recorded payment P1, then one input changed per rule + const C = citeste(DOV.chitanta); const RK = Object.keys(HARTA).filter((r) => r.startsWith('risk.')); + valid('payment-risk/company-p1.valid', 'payment-risk', 'the recorded payment to a company, allowed by its policy', 'recorded (payments, 2026-10-02)', { policy: C.policy, inputs: C.inputs }, { exercises: RK }); + const ref = C.policy.refusedCounterparties[0].address; const acum = C.inputs.now; + const risc = (nume, titlu, op, r) => invalid('payment-risk/company-p1.' + nume, titlu, 'payment-risk/company-p1.valid', op, [r]); + risc('form', 'the payer is not an address', { op: 'set', path: ['inputs', 'payer'], value: '0x1234' }, 'risk.form'); + risc('form-amount', 'the amount is zero', { op: 'set', path: ['inputs', 'amount'], value: '0' }, 'risk.form'); + risc('form-time', 'no time given', { op: 'remove', path: ['inputs', 'now'] }, 'risk.form'); + risc('form-history', 'a history entry the engine cannot count (it is refused, not left out of the window)', { op: 'set', path: ['inputs', 'history'], value: [{ at: 'yesterday', amountUsd: '0.100000' }] }, 'risk.form'); + risc('asset', 'an asset the policy does not allow', { op: 'set', path: ['inputs', 'asset'], value: 'other-token' }, 'risk.asset'); + risc('counterparty', 'the payee is a refused counterparty of the policy', { op: 'set', path: ['inputs', 'payee'], value: ref }, 'risk.counterparty'); + risc('rate', 'no USD rate declared, and the policy requires one', { op: 'remove', path: ['inputs', 'rate'] }, 'risk.rate'); + risc('rate-number', 'the USD rate given as a JSON number instead of a decimal string (refused, not rounded)', { op: 'set', path: ['inputs', 'rate', 'usdPerUnit'], value: 0.5 }, 'risk.rate'); + risc('limit', 'an amount above the per-payment limit', { op: 'set', path: ['inputs', 'amount'], value: '2400000000000000000' }, 'risk.limit'); + risc('window', 'three payments already in the window (the fourth is one too many)', { op: 'set', path: ['inputs', 'history'], value: [1, 2, 3].map((s) => ({ at: acum - 10 * s, amountUsd: '0.100000' })) }, 'risk.window'); + + // (C) the receipt of that payment: as the issuer built it; with its notarization claim (offline: PARTIAL; online: VALID) + const CK = [...Object.keys(HARTA).filter((r) => r.startsWith('receipt.')), ...E]; const claim = C.envelope.notarization; const env0 = clona(C.envelope); delete env0.notarization; + const rb = 'payment-receipt/company-p1.valid'; const tx = P.receiptTx; + valid(rb, 'payment-receipt', 'the recorded receipt as its issuer built it, with the policy, the inputs judged and the transaction read from the chain', 'recorded (payments, 2026-10-02); transaction read from 28001 at ' + tx.readAt, { receipt: { instruction: C.instruction, envelope: env0 }, policy: C.policy, inputs: C.inputs, tx: tx.tx, txReceipt: tx.txReceipt, chain: 28001 }, { exercises: CK }); + const chit = (nume, titlu, op, r, o) => invalid('payment-receipt/company-p1.' + nume, titlu, rb, op, r, o); + chit('binding', 'the purpose on the instruction changed after the envelope committed to it', { op: 'set', path: ['receipt', 'instruction', 'purpose'], value: C.instruction.purpose + ' (edited)' }, ['receipt.binding']); + chit('policy', 'a looser policy shown in place of the one under the hash (so the verdict does not reproduce either)', { op: 'set', path: ['policy', 'perPaymentMaxUsd'], value: '1000.000000' }, ['receipt.policy', 'receipt.risk']); + chit('risk', 'other inputs shown than the ones the issuer judged', { op: 'set', path: ['inputs', 'now'], value: C.inputs.now + 1 }, ['receipt.risk']); + chit('chain', 'the transaction on chain pays someone else', { op: 'set', path: ['tx', 'to'], value: C.policy.refusedCounterparties[0].address }, ['receipt.chain']); + { // the amount in USD sits under the instruction hash: the issuer writes another amount and commits to it + const r = { instruction: clona(C.instruction), envelope: clona(env0) }; r.instruction.amountUsd = '0.300000'; + r.envelope.statement.instructionHash = sha256(Buffer.from(RISC.canonical(r.instruction), 'utf8')); r.envelope.statementHash = sha256(Buffer.from(JSON.stringify(r.envelope.statement), 'utf8')); + const b = V.find((x) => x.id === rb); + chit('amount', 'the issuer wrote a USD amount that is not the amount at the declared rate, and committed to it', null, ['receipt.amount'], { producer: { note: 'instruction.amountUsd changed by the issuer; instructionHash and statementHash recomputed with the published formulas', input: { ...clona(b.input), receipt: r }, + changed: [['receipt', 'instruction', 'amountUsd'], ['receipt', 'envelope', 'statement', 'instructionHash'], ['receipt', 'envelope', 'statementHash']] } }); + } + { // the risk verdict sits under the instruction hash: the issuer attaches a verdict made for ANOTHER payment and commits to it + const b = V.find((x) => x.id === rb); const reangajeaza = (r) => { r.envelope.statement.instructionHash = sha256(Buffer.from(RISC.canonical(r.instruction), 'utf8')); r.envelope.statementHash = sha256(Buffer.from(JSON.stringify(r.envelope.statement), 'utf8')); return r; }; + const cuVerdict = (inputs) => { const v = RISC.judeca(C.policy, inputs); if (v.decision !== 'ALLOW') throw new Error('the reused verdict must be an ALLOW'); const r = { instruction: clona(C.instruction), envelope: clona(env0) }; + r.instruction.risk = { ...r.instruction.risk, policyHash: v.policyHash, inputsHash: v.inputsHash, verdictHash: v.verdictHash, decision: v.decision, unmeasured: v.unmeasured }; return { ...clona(b.input), receipt: reangajeaza(r), inputs }; }; + const H = [['receipt', 'instruction', 'risk', 'inputsHash'], ['receipt', 'instruction', 'risk', 'verdictHash'], ['receipt', 'envelope', 'statement', 'instructionHash'], ['receipt', 'envelope', 'statementHash']]; + chit('risk-other-payment', 'the issuer attached an ALLOW verdict that was made for a payment to someone else', null, ['receipt.risk'], { producer: { note: 'the risk verdict was computed for another payee; its hashes are on the instruction; instructionHash and statementHash recomputed', input: cuVerdict({ ...clona(C.inputs), payee: '0x' + '11'.repeat(20) }), changed: [['inputs', 'payee'], ...H] } }); + chit('risk-other-rate', 'the issuer attached an ALLOW verdict that was made at another USD rate than the one on the receipt', null, ['receipt.risk'], { producer: { note: 'the risk verdict was computed at another rate; its hashes are on the instruction; instructionHash and statementHash recomputed', input: cuVerdict({ ...clona(C.inputs), rate: { ...C.inputs.rate, usdPerUnit: '0.25' } }), changed: [['inputs', 'rate', 'usdPerUnit'], ...H] } }); } + const cuClaim = { op: 'add', path: ['receipt', 'envelope', 'notarization'], value: claim }; + { const b = V.find((x) => x.id === rb); const inp = aplica(b.input, cuClaim); + valid('payment-receipt/company-p1-claim.partial', 'payment-receipt', 'the notarized receipt judged offline: its notarization claim is not checked', 'recorded (payments, 2026-10-02)', inp, { exercises: CK, verdict: 'PARTIAL', base: rb, mutation: cuClaim }); + valid('payment-receipt/company-p1-28001.valid', 'payment-receipt', 'the notarized receipt judged with the chain: integrity, anchoring and finality in one verdict', 'recorded (payments, 2026-10-02)', inp, { exercises: [...CK, 'envelope.finality'], requires: R, levels: { anchoring: 'PASSED', finality: 'PASSED' }, base: rb, mutation: cuClaim }); } + + // (D) market timelines recorded on 28001. The public task (`spec`) stays in the input only where the replay rule is exercised: + // each replay recomputes the task and costs seconds. + const M = citeste(DOV.piata).scenarii; const MK = Object.keys(HARTA).filter((r) => r.startsWith('market.')); + const tl = (s, cuSpec) => { const d = clona(M[s].date); if (!cuSpec) delete d.spec; if (d.envelope === null) delete d.envelope; return d; }; + const mv = (id, s, titlu, o = {}) => valid('market-timeline/' + id, 'market-timeline', titlu, 'recorded (market-settlement, 2026-10-02), scenario ' + s, tl(s, o.spec), { exercises: o.exercises || MK, verdict: o.verdict, requires: o.requires, levels: o.levels }); + mv('s2-slashed.valid', 'S2', 'a dispute the challenger won: the provider slashed'); + mv('s3-paid-after-dispute.valid', 'S3', 'a dispute the provider won'); + mv('s3-paid-after-dispute-replayed.valid', 'S3', 'the same timeline with the public task: the judge recomputes it and agrees with the arbiter', { spec: true }); + mv('s4-refunded-expired.valid', 'S4', 'claimed and never delivered: the escrow reclaimed after the deadline'); + mv('s5-refunded-cancelled.valid', 'S5', 'posted and cancelled: the escrow returned'); + mv('s1-paid-claim.partial', 'S1', 'accepted and paid; its execution envelope claims a notarization that an offline run does not check', { exercises: [...MK, ...E], verdict: 'PARTIAL' }); + mv('s1-paid-28001.valid', 'S1', 'the same timeline judged with the chain: the execution envelope is under a verified post-quantum anchor', { exercises: [...MK, ...F], requires: R, levels: { anchoring: 'PASSED', finality: 'PASSED' } }); + const ev = (d, n) => d.events.findIndex((e) => e.name === n); const S = (s) => V.find((x) => x.id === 'market-timeline/' + s).input; + const piata = (nume, titlu, baza, op, r) => invalid('market-timeline/' + nume, titlu, 'market-timeline/' + baza, op, r); + { const d = S('s2-slashed.valid'); const j = d.job; + piata('s2.posting', 'the JobPosted event names another requester than the job', 's2-slashed.valid', { op: 'set', path: ['events', ev(d, 'JobPosted'), 'args', 'requester'], value: j.provider }, ['market.posting']); + piata('s2.window', 'the dispute was raised after the challenge window closed', 's2-slashed.valid', { op: 'set', path: ['events', ev(d, 'JobDisputed'), 'timestamp'], value: j.submittedAt + j.challengeWindow + 5 }, ['market.window']); + piata('s2.deadline-submitted', 'the result was submitted after the deadline', 's2-slashed.valid', { op: 'set', path: ['events', ev(d, 'ResultSubmitted'), 'timestamp'], value: j.deadline + 1 }, ['market.deadline']); + piata('s2.arbiter', 'the dispute was resolved by an address that is not the arbiter', 's2-slashed.valid', { op: 'set', path: ['events', ev(d, 'DisputeResolved'), 'from'], value: j.requester }, ['market.arbiter']); + piata('s2.payout', 'the slashed bond is paid to someone who is not the challenger', 's2-slashed.valid', { op: 'set', path: ['events', ev(d, 'JobSlashed'), 'args', 'challenger'], value: j.provider }, ['market.payout']); + piata('s2.result', 'the result bytes shown do not hash to the commitment on chain', 's2-slashed.valid', { op: 'set', path: ['result'], value: d.result.slice(0, -2) + (d.result.endsWith('00') ? '01' : '00') }, ['market.result']); } + { const d = S('s3-paid-after-dispute.valid'); + piata('s3.payout', 'the payout names someone who is not the provider', 's3-paid-after-dispute.valid', { op: 'set', path: ['events', ev(d, 'JobPaid'), 'args', 'provider'], value: d.job.requester }, ['market.payout']); + piata('s3.arbiter-no-dispute', 'the dispute withheld from the timeline: a resolution with no dispute, and an event the job state implies is missing', 's3-paid-after-dispute.valid', { op: 'remove', path: ['events', ev(d, 'JobDisputed')] }, ['market.arbiter', 'market.complete']); + piata('s3.replay', 'another task shown than the one the job committed to: the recomputation contradicts the arbiter', 's3-paid-after-dispute-replayed.valid', { op: 'set', path: ['spec', 'seed'], value: '0x' + 'ab'.repeat(32) }, ['market.replay']); } + { const d = S('s4-refunded-expired.valid'); + piata('s4.deadline', 'the escrow was reclaimed as expired before the deadline', 's4-refunded-expired.valid', { op: 'set', path: ['events', ev(d, 'JobRefunded'), 'timestamp'], value: d.job.deadline - 1 }, ['market.deadline']); + piata('s4.complete-claim', 'the claim withheld from the timeline (the job state names a provider)', 's4-refunded-expired.valid', { op: 'remove', path: ['events', ev(d, 'JobClaimed')] }, ['market.complete']); + piata('s4.payout', 'the refund names someone who is not the requester', 's4-refunded-expired.valid', { op: 'set', path: ['events', ev(d, 'JobRefunded'), 'args', 'requester'], value: d.job.provider }, ['market.payout']); } + { const d = S('s5-refunded-cancelled.valid'); + piata('s5.form', 'an event whose time is not a whole number of seconds', 's5-refunded-cancelled.valid', { op: 'set', path: ['events', ev(d, 'JobPosted'), 'timestamp'], value: d.events[ev(d, 'JobPosted')].timestamp + 0.5 }, ['market.form']); } + { const d = S('s1-paid-claim.partial'); const j = d.job; + piata('s1.window', 'a third party finalized inside the challenge window', 's1-paid-claim.partial', { op: 'set', path: ['events', ev(d, 'JobPaid'), 'timestamp'], value: j.submittedAt + 1 }, ['market.window']); + piata('s1.complete-submission', 'the submission withheld from the timeline (the job state has a submission time)', 's1-paid-claim.partial', { op: 'remove', path: ['events', ev(d, 'ResultSubmitted')] }, ['market.complete']); + piata('s1.deadline', 'the job was claimed after its deadline', 's1-paid-claim.partial', { op: 'set', path: ['events', ev(d, 'JobClaimed'), 'timestamp'], value: j.deadline + 1 }, ['market.deadline']); + piata('s1.proof-late', 'the execution envelope was notarized only after the challenge window closed', 's1-paid-claim.partial', { op: 'set', path: ['envelope', 'notarization', 'firstSeen'], value: j.submittedAt + j.challengeWindow + 1 }, ['market.proof']); + piata('s1.proof-other-result', 'the execution envelope names another result (and so no longer hashes to its statementHash)', 's1-paid-claim.partial', { op: 'set', path: ['envelope', 'statement', 'outputHash'], value: '0x' + 'cc'.repeat(32) }, ['envelope.integrity', 'market.proof']); } + + // (E) a dataset: a record, a range answer, a consistency proof, an availability sample + const DS = P.dataset; const REC = ['dataset.form', 'dataset.commitment', 'dataset.field', 'dataset.inclusion']; const src = 'producer (verifiable-data), random salts, generated ' + P.at; + valid('dataset-record/r5.valid', 'dataset-record', 'one record against the commitment of version 2, two fields disclosed', src, { record: DS.record, commitment: DS.newer }, { exercises: REC }); + const inr = (nume, titlu, op, r) => invalid('dataset-record/r5.' + nume, titlu, 'dataset-record/r5.valid', op, [r]); + const altHex = (h) => h.slice(0, -1) + (h.endsWith('0') ? '1' : '0'); + inr('form', 'the field commitments are not an object', { op: 'set', path: ['record', 'c'], value: 'x' }, 'dataset.form'); + inr('commitment', 'the record names another commitment', { op: 'set', path: ['record', 'commitmentHash'], value: altHex(DS.record.commitmentHash) }, 'dataset.commitment'); + inr('field', 'a disclosed value changed after commitment', { op: 'set', path: ['record', 'disclosed', 'age', 'value'], value: DS.record.disclosed.age.value + 1 }, 'dataset.field'); + inr('field-no-salt', 'a disclosed field shown without its salt', { op: 'remove', path: ['record', 'disclosed', 'age', 'salt'] }, 'dataset.field'); + inr('inclusion', 'one hash of the log proof changed', { op: 'set', path: ['record', 'logProof', 'path', 0], value: altHex(DS.record.logProof.path[0]) }, 'dataset.inclusion'); + const ANS = [...REC, 'dataset.index', 'dataset.range', 'dataset.order', 'dataset.completeness']; + if (DS.answer.rows.length < 4) throw new Error('the fresh dataset answer has under four rows; regenerate with --proaspat'); + valid('dataset-answer/age-30-45.valid', 'dataset-answer', 'a range query on an indexed field: every row, and the two neighbours that prove nothing is missing', src, { answer: DS.answer, commitment: DS.newer }, { exercises: ANS }); + const rasp = (nume, titlu, op, r) => invalid('dataset-answer/age-30-45.' + nume, titlu, 'dataset-answer/age-30-45.valid', op, [r]); + rasp('commitment', 'an answer that names another version than the commitment it is checked against', { op: 'set', path: ['answer', 'version'], value: DS.answer.version - 1 }, 'dataset.commitment'); + rasp('index-size', 'the answer states another index size than the commitment', { op: 'set', path: ['answer', 'indexSize'], value: DS.answer.indexSize + 1 }, 'dataset.commitment'); + rasp('index-undisclosed', 'a row that does not disclose the queried field', { op: 'remove', path: ['answer', 'rows', 1, 'disclosed', 'age'] }, 'dataset.index'); + rasp('index', 'one hash of a row\'s index proof changed', { op: 'set', path: ['answer', 'rows', 1, 'indexProof', 'path', 0], value: altHex(DS.answer.rows[1].indexProof.path[0]) }, 'dataset.index'); + rasp('range', 'the answer claims a narrower range than the rows it returns', { op: 'set', path: ['answer', 'to'], value: DS.answer.rows[0].disclosed.age.value }, 'dataset.range'); + rasp('completeness', 'a row dropped from the middle of the run', { op: 'remove', path: ['answer', 'rows', 1] }, 'dataset.completeness'); + { // the two forgeries only the SERVER of an answer can make: a matching row withheld and shown as the neighbour that closes the run + const b = V.find((x) => x.id === 'dataset-answer/age-30-45.valid'); const vecin = (r) => ({ pos: r.pos, value: r.disclosed.age.value, i: r.i, recordLeaf: BAZA.frunzaInregistrare(r.id, r.c), indexProof: r.indexProof }); + const dupa = clona(b.input); const ultima = dupa.answer.rows.pop(); dupa.answer.after = vecin(ultima); + invalid('dataset-answer/age-30-45.completeness-last', 'the last matching row withheld and shown as the neighbour after the run (its value is still in range)', 'dataset-answer/age-30-45.valid', null, ['dataset.completeness'], { producer: { note: 'the server dropped the last row and presented it as the neighbour after', input: dupa, changed: [['answer', 'rows', dupa.answer.rows.length], ['answer', 'after']] } }); + const inainte = clona(b.input); const prima = inainte.answer.rows.shift(); inainte.answer.before = vecin(prima); + invalid('dataset-answer/age-30-45.completeness-first', 'the first matching row withheld and shown as the neighbour before the run', 'dataset-answer/age-30-45.valid', null, ['dataset.completeness'], { producer: { note: 'the server dropped the first row and presented it as the neighbour before', input: inainte, changed: [['answer', 'rows'], ['answer', 'before']] } }); } + { // order sits under the index root: two publishers of the same two records, one builds the index sorted, the other not + const recs = [{ id: 'x', k: 'b', salt: '00'.repeat(16) }, { id: 'y', k: 'a', salt: '11'.repeat(16) }].map((r) => { const c = { k: BAZA.angajamentCamp('k', r.k, r.salt) }; return { ...r, c, leaf: BAZA.frunzaInregistrare(r.id, c) }; }); + const log = merkleTree(recs.map((r) => r.leaf)); const dov = (p) => ({ index: p.index, treeSize: p.treeSize, path: p.path }); + const publica = (ordine, nume) => { const idx = merkleTree(ordine.map((i) => BAZA.frunzaIndex('k', recs[i].k, i, recs[i].leaf))); + const c = { v: 1, format: BAZA.FORMAT, name: nume, version: 1, size: 2, logRoot: log.root(), createdAt: '2026-10-03T00:00:00.000Z', indexes: { k: { root: idx.root(), size: 2 } }, previous: null }; + const rand = (pos) => { const i = ordine[pos]; return { pos, i, id: recs[i].id, c: recs[i].c, disclosed: { k: { value: recs[i].k, salt: recs[i].salt } }, logProof: dov(log.inclusionProof(i, 2)), indexProof: dov(idx.inclusionProof(pos, 2)) }; }; + return { answer: { v: 1, kind: BAZA.KIND_RASPUNS, name: nume, version: 1, commitmentHash: BAZA.hashAngajament(c), field: 'k', from: 'a', to: 'b', indexSize: 2, rows: [rand(0), rand(1)], before: null, after: null }, commitment: c }; }; + valid('dataset-answer/two-records.valid', 'dataset-answer', 'two records, the index built in sorted order', 'producer formulas (verifiable-data), fixed salts', publica([1, 0], 'two-records'), { exercises: ANS }); + invalid('dataset-answer/two-records.order', 'the same two records from a publisher whose index is not sorted: every proof holds, the order does not', 'dataset-answer/two-records.valid', null, ['dataset.order'], + { producer: { note: 'the publisher built the index in record order instead of sorted order; the index root, the commitment hash and the rows follow from that', input: publica([0, 1], 'two-records'), changed: [['commitment', 'indexes', 'k', 'root'], ['answer', 'commitmentHash'], ['answer', 'rows']] } }); } + valid('dataset-consistency/v1-v2.valid', 'dataset-consistency', 'version 1 is a prefix of version 2', src, { proof: DS.consistency, older: DS.older, newer: DS.newer }, { exercises: ['dataset.commitment', 'dataset.consistency'] }); + invalid('dataset-consistency/v1-v2.commitment', 'the proof names another newer commitment', 'dataset-consistency/v1-v2.valid', { op: 'set', path: ['proof', 'to', 'commitmentHash'], value: altHex(DS.consistency.to.commitmentHash) }, ['dataset.commitment']); + invalid('dataset-consistency/v1-v2.consistency', 'one hash of the consistency path changed', 'dataset-consistency/v1-v2.valid', { op: 'set', path: ['proof', 'proof', 'path', 0], value: altHex(DS.consistency.proof.path[0]) }, ['dataset.consistency']); + valid('dataset-sample/four-of-sixteen.valid', 'dataset-sample', 'four positions drawn from a seed, each served and verified', src, { commitment: DS.newer, k: DS.sample.k, seed: DS.sample.seed, served: DS.sample.served }, { exercises: [...REC, 'dataset.sample'] }); + invalid('dataset-sample/four-of-sixteen.sample', 'the publisher does not serve one of the sampled records', 'dataset-sample/four-of-sixteen.valid', { op: 'remove', path: ['served', Object.keys(DS.sample.served)[0]] }, ['dataset.sample']); + return V; +} + +const text = (v) => JSON.stringify(v, null, 1) + '\n'; +function fisiere(vectori) { + const out = new Map(); const reguli = {}; + for (const v of vectori) { if (out.has(v.id + '.json')) throw new Error('two vectors with the id ' + v.id); out.set(v.id + '.json', text(v)); for (const r of v.expected.failed) (reguli[r] || (reguli[r] = [])).push(v.id); } + const artifacte = {}; for (const v of vectori) artifacte[v.artifact] = (artifacte[v.artifact] || 0) + 1; + const index = { v: 1, kind: 'aere-conformance-vector-index', count: vectori.length, artifacts: artifacte, offline: vectori.filter((v) => !v.requires.length).length, online: vectori.filter((v) => v.requires.length).length, + rules: Object.fromEntries(Object.keys(reguli).sort().map((r) => [r, reguli[r]])), vectors: vectori.map((v) => ({ id: v.id, artifact: v.artifact, verdict: v.expected.verdict, requires: v.requires, sha256: sha256(Buffer.from(out.get(v.id + '.json'), 'utf8')) })) }; + out.set('INDEX.json', text(index)); return out; +} +const peDisc = (d, pre = '') => (fs.existsSync(d) ? fs.readdirSync(d, { withFileTypes: true }).flatMap((e) => (e.isDirectory() ? peDisc(path.join(d, e.name), pre + e.name + '/') : [pre + e.name])) : []); + +if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { + const a = process.argv.slice(2); + if (a.includes('--proaspat')) await proaspat(); + const out = fisiere(construieste()); + if (a.includes('--verifica')) { + let dif = 0; for (const [f, t] of out) { const p = path.join(DIR, f); if (!fs.existsSync(p) || fs.readFileSync(p, 'utf8').replace(/\r\n/g, '\n') !== t) { dif++; console.log('DIFERIT: ' + f); } } + const straine = peDisc(DIR).filter((f) => !out.has(f)); if (straine.length) { dif += straine.length; console.log('STRAINE: ' + straine.join(', ')); } + console.log(dif ? `DIFERIT (${dif})` : `LA ZI (${out.size - 1} vectors + INDEX.json)`); process.exitCode = dif ? 1 : 0; + } else { + for (const f of peDisc(DIR)) if (!out.has(f)) fs.rmSync(path.join(DIR, f)); + for (const [f, t] of out) { const p = path.join(DIR, f); fs.mkdirSync(path.dirname(p), { recursive: true }); fs.writeFileSync(p, t); } + const idx = JSON.parse(out.get('INDEX.json')); console.log(`written ${idx.count} vectors (${idx.offline} offline, ${idx.online} need testnet 28001): ` + Object.entries(idx.artifacts).map(([k, n]) => k + ' ' + n).join(', ')); + } +} diff --git a/conformance/implementare-aere.mjs b/conformance/implementare-aere.mjs new file mode 100644 index 0000000..6bda288 --- /dev/null +++ b/conformance/implementare-aere.mjs @@ -0,0 +1,115 @@ +#!/usr/bin/env node +// implementare-aere.mjs: the published verifiers behind the one verdict form (verdict.mjs). This file holds NO verification rule of +// its own: an AIP-23 envelope is judged by the reference verifier (verify-proof.mjs, run as the program it is), a payment by the +// risk module, a receipt by the receipt verifier, a market timeline by the market judge, a dataset record, answer, consistency proof +// or sample by the dataset module. What it adds is the translation: the rule ids those verifiers name -> the public rule ids and +// the level of each (reguli.mjs), and the composition (a receipt or a timeline that carries an AIP-23 envelope gets that envelope +// judged too, so one verdict covers the artifact). +// +// node implementare-aere.mjs --capabilities what this implementation judges (artifacts, rules, online) +// node implementare-aere.mjs [--online] one artifact: { artifact, input } (a vector file is one); verdict on stdout +// node implementare-aere.mjs --batch [{ file, online }]; one verdict per line, in order +// +// Offline (no --online) nothing here opens a connection: an envelope that claims a notarization is judged without the claim and the +// verdict says so (PARTIAL: claim-not-checked). With --online the envelope goes to the reference verifier with the chain's endpoint. +// Exit: 0 VALID, 1 INVALID, 2 PARTIAL, 3 the artifact could not be judged at all (not a verdict). +import fs from 'node:fs'; import os from 'node:os'; import path from 'node:path'; import { spawn } from 'node:child_process'; +import { VERIFICATOARE, FINALITY_SITES, VERIFY_PROOF, incarca } from './reguli.mjs'; +import { acumulator, pica, trece, nemasurat, verdictUnic } from './verdict.mjs'; + +const RPC = { 2800: process.env.AERE_CONFORMANCE_RPC_2800 || 'https://rpc.aere.network', 28001: process.env.AERE_CONFORMANCE_RPC_28001 || 'https://testnet-rpc.aere.network' }; +const LANT = (n) => (n === 28001 ? 'chain 28001, a testnet' : 'chain ' + n); +const ARTIFACTE = Object.values(VERIFICATOARE).flatMap((v) => v.artifacts); +const toateRegulile = Object.values(VERIFICATOARE).flatMap((v) => Object.values(v.reguli).map((r) => r[0])); + +function ruleaza(cmd, args, timeout) { + return new Promise((gata) => { + const c = spawn(cmd, args, { stdio: ['ignore', 'pipe', 'pipe'] }); let out = '', err = ''; const t = setTimeout(() => c.kill(), timeout); + c.stdout.on('data', (d) => { out += d; }); c.stderr.on('data', (d) => { err += d; }); + c.on('error', (e) => { clearTimeout(t); gata({ code: null, out, err: String(e.message) }); }); c.on('close', (code) => { clearTimeout(t); gata({ code, out, err }); }); + }); +} +/** The envelope, judged by the reference verifier; its levels land in the accumulator under the public rule ids. */ +async function plic(acc, env, { online, chain }) { + if (!fs.existsSync(VERIFY_PROOF)) throw new Error('the AIP-23 reference verifier is not at ' + VERIFY_PROOF + ' (AERE_VERIFY_PROOF=)'); + const claim = env && typeof env === 'object' ? env.notarization : null; let judecat = env; + if (!online && claim) { judecat = { ...env }; delete judecat.notarization; } + const f = path.join(fs.mkdtempSync(path.join(os.tmpdir(), 'aere-conf-')), 'envelope.json'); fs.writeFileSync(f, JSON.stringify(judecat === undefined ? null : judecat)); + const lant = Number(chain || (claim && claim.chainId) || 28001); + const args = [VERIFY_PROOF, f, '--json']; if (online) { if (!RPC[lant]) throw new Error('no endpoint known for chain ' + lant); args.push('--chain', String(lant), '--rpc', RPC[lant]); } + let r; try { r = await ruleaza(process.execPath, args, online ? 240000 : 60000); } finally { fs.rmSync(path.dirname(f), { recursive: true, force: true }); } + let j; try { j = JSON.parse(r.out); } catch { throw new Error('the reference verifier gave no verdict (exit ' + r.code + '): ' + (r.err || r.out).trim().split('\n').slice(-1)[0].slice(0, 160)); } + const nivel = (n) => (j.levels || []).find((x) => x.level === n); const R = VERIFICATOARE['aip23-envelope'].reguli; + for (const n of ['form', 'integrity']) { const x = nivel(n); if (!x) continue; if (x.state === 'FAILED') pica(acc, 'integrity', R[n][0], x.detail); else trece(acc, 'integrity', 'envelope ' + n); } + const s = nivel('signature'); + if (!s) nemasurat(acc, 'authenticity', 'not-reached', 'the envelope failed before its signature was looked at'); + else if (s.state === 'PASSED') trece(acc, 'authenticity', s.detail); + else if (s.state === 'FAILED') pica(acc, 'authenticity', R.signature[0], s.detail); + else nemasurat(acc, 'authenticity', s.state === 'ABSENT' ? 'absent' : 'unmeasurable', s.detail); + const fin = nivel('finality'); const ambele = (cause, reason) => { nemasurat(acc, 'anchoring', cause, reason); nemasurat(acc, 'finality', cause, reason); }; + if (!online && claim) ambele('claim-not-checked', 'the envelope claims a notarization on chain ' + (claim.chainId || '?') + '; this run was offline, the claim was not checked'); + else if (!fin) ambele('not-reached', 'the envelope failed before its notarization was looked at'); + else if (fin.state === 'PASSED') { trece(acc, 'anchoring', fin.detail); trece(acc, 'finality', 'the post-quantum certificate of the covering anchor verified (' + LANT(lant) + '; the finality is that chain\'s)'); } + else if (fin.state === 'FAILED') { + const loc = FINALITY_SITES.filter((x) => x.re.test(fin.detail)); + if (loc.length !== 1) throw new Error('the reference verifier refused finality at a site this suite does not classify: ' + fin.detail.slice(0, 120)); + pica(acc, loc[0].level, R.finality[0], fin.detail); + if (loc[0].level === 'anchoring') nemasurat(acc, 'finality', 'not-applicable', 'nothing is anchored, so no certificate covers it'); + else nemasurat(acc, 'anchoring', 'not-reached', 'the anchor certificate did not verify, the notary state under it was not read'); + } else ambele(fin.state === 'ABSENT' ? 'absent' : fin.state === 'PENDING' ? 'pending' : 'unmeasurable', fin.detail); +} +const faraPlic = (acc) => { for (const l of ['authenticity', 'anchoring', 'finality']) nemasurat(acc, l, 'not-judged', 'this artifact carries no AIP-23 envelope; its commitment is signed or anchored through one, judged as the artifact `envelope`'); }; +/** The rules a module named, as public ids at their levels; `text` is the module's own reasons. */ +function reguli(acc, verifier, surse, motive, titlu) { + const R = VERIFICATOARE[verifier].reguli; const text = (motive || []).filter(Boolean).join('; '); + for (const s of surse) { if (!R[s]) throw new Error(`${verifier} named a rule this suite does not map: ${s}`); pica(acc, R[s][1], R[s][0], text); } + if (!surse.length) trece(acc, 'integrity', titlu); +} + +async function judeca(artifact, input, online) { + const acc = acumulator(); + if (artifact === 'envelope') await plic(acc, input.envelope, { online, chain: input.chain }); + else if (artifact === 'payment-risk') { + const M = await incarca('risc'); const v = M.judeca(input.policy, input.inputs); + if ((v.decision === 'ALLOW') !== (v.rules.length === 0)) throw new Error('the risk module refused without naming a rule'); + reguli(acc, 'payment-risk', v.rules, v.reasons, 'the declared policy allows this payment'); faraPlic(acc); + } else if (artifact === 'payment-receipt') { + const M = await incarca('chitanta'); const r = M.verificaChitanta(input.receipt, { policy: input.policy, inputs: input.inputs, tx: input.tx, receipt: input.txReceipt }); + if ((r.verdict === 'VALID') !== (r.reguli.length === 0)) throw new Error('the receipt verifier refused without naming a rule'); + reguli(acc, 'payment-receipt', r.reguli, r.motive, 'no rule of the receipt verifier refused' + (r.chainChecked ? ' (transaction facts supplied)' : ' (no transaction facts supplied)')); + await plic(acc, input.receipt && input.receipt.envelope, { online, chain: input.chain }); + } else if (artifact === 'market-timeline') { + const M = await incarca('piata'); const r = M.judeca(input); + if (r.verdict === 'INCOMPLETE') nemasurat(acc, 'integrity', 'incomplete', 'the timeline is not terminal (' + (r.status || 'no job or no events') + ')'); + else { if ((r.verdict === 'VALID') !== (r.reguli.length === 0)) throw new Error('the market judge refused without naming a rule'); reguli(acc, 'market-timeline', r.reguli, r.motive, 'no rule of the market judge refused (status ' + r.status + ')'); } + if (input.envelope) await plic(acc, input.envelope, { online, chain: input.chainId }); else faraPlic(acc); + } else if (artifact.startsWith('dataset-')) { + const M = await incarca('baza'); let r; + if (artifact === 'dataset-record') r = M.verificaInregistrare(input.record, input.commitment); + else if (artifact === 'dataset-answer') { r = M.verificaRaspuns(input.answer, input.commitment); r.ok = r.verdict === 'VALID'; } + else if (artifact === 'dataset-consistency') r = M.verificaConsistentaVersiuni(input.proof, input.older, input.newer); + else if (artifact === 'dataset-sample') r = await M.esantioneaza({ url: 'vector://served', commitment: input.commitment, k: input.k, seed: input.seed, ia: async (u) => (input.served || {})[u.split('/').pop()] || null }); + else throw new Error('unknown artifact ' + artifact); + if (r.ok !== (r.reguli.length === 0)) throw new Error('the dataset module refused without naming a rule'); + reguli(acc, 'dataset', r.reguli, r.motive, 'no rule of the dataset module refused'); faraPlic(acc); + } else throw new Error('unknown artifact ' + artifact); + return verdictUnic(artifact, acc); +} +async function unul(file, online) { + let j; try { j = JSON.parse(fs.readFileSync(file, 'utf8')); } catch (e) { return { error: 'the file cannot be read: ' + e.message }; } + if (!j || !ARTIFACTE.includes(j.artifact) || !j.input) return { error: 'not { artifact, input } with a known artifact (' + ARTIFACTE.join(', ') + ')' }; + try { return await judeca(j.artifact, j.input, online); } catch (e) { return { error: String(e.message).split('\n')[0].slice(0, 300) }; } +} + +const a = process.argv.slice(2); +if (a.includes('--capabilities')) console.log(JSON.stringify({ v: 1, kind: 'aere-conformance-capabilities', name: 'aere reference verifiers (JavaScript)', artifacts: ARTIFACTE, rules: toateRegulile.sort(), online: true, batch: true })); +else if (a.includes('--batch')) { + const lista = JSON.parse(fs.readFileSync(a[a.indexOf('--batch') + 1], 'utf8')); const rez = new Array(lista.length); let urm = 0; + const lucrator = async () => { while (urm < lista.length) { const k = urm++; rez[k] = await unul(lista[k].file, !!lista[k].online); } }; + await Promise.all(Array.from({ length: Math.min(6, lista.length) }, lucrator)); + for (const r of rez) console.log(JSON.stringify(r)); +} else { + const file = a.find((x) => !x.startsWith('--')); + if (!file) { console.error('usage: node implementare-aere.mjs --capabilities | [--online] | --batch '); process.exitCode = 3; } + else { const r = await unul(file, a.includes('--online')); console.log(JSON.stringify(r, null, 1)); process.exitCode = r.error ? 3 : r.verdict === 'VALID' ? 0 : r.verdict === 'INVALID' ? 1 : 2; } +} diff --git a/conformance/implementare-integritate.py b/conformance/implementare-integritate.py new file mode 100644 index 0000000..4313c87 --- /dev/null +++ b/conformance/implementare-integritate.py @@ -0,0 +1,223 @@ +#!/usr/bin/env python3 +"""implementare-integritate.py: an INDEPENDENT implementation, written from the rules and not from the JavaScript code, in another +language, with nothing but the Python standard library. It exists to show that the conformance vectors are not tied to one +implementation: the same runner scores it, and it passes every vector whose rules it claims. + +It claims little, on purpose, and says so through --capabilities: + envelope envelope.form, envelope.integrity (it cannot check an ML-DSA signature or read a chain: vectors that exercise + those rules are reported by the runner as NOT COVERED, never as passed) + dataset-record dataset.form, dataset.commitment, dataset.field, dataset.inclusion (RFC 9162 inclusion, salted field commitments) + + python3 implementare-integritate.py --capabilities + python3 implementare-integritate.py + python3 implementare-integritate.py --batch + +Limits of this implementation: numbers are written the way JavaScript writes them only for integers and for the common decimal +floats (no exponent forms); object keys are sorted by code point, which equals JavaScript's order for keys in the Basic +Multilingual Plane. It never opens a connection: --online is not claimed. +""" +import hashlib +import json +import re +import sys + +LEVELS = ['integrity', 'authenticity', 'anchoring', 'finality'] +H64 = re.compile(r'^0x[0-9a-fA-F]{64}$') +H64_LOW = re.compile(r'^0x[0-9a-f]{64}$') +KIND_RECORD = 'aere-verifiable-record' + + +def sha256_hex(b): + return '0x' + hashlib.sha256(b).hexdigest() + + +def js_number(x): + if isinstance(x, bool): + raise ValueError('not a number') + if isinstance(x, int): + return str(x) + if x != x or x in (float('inf'), float('-inf')): + raise ValueError('a number must be finite') + if x == int(x) and abs(x) < 1e21: + return str(int(x)) + r = repr(x) + if 'e' in r or 'E' in r: + raise ValueError('exponent form: not reproduced by this implementation') + return r + + +def js_stringify(x): + """JSON.stringify(x) for parsed JSON: insertion order of keys, no whitespace.""" + if x is None: + return 'null' + if x is True: + return 'true' + if x is False: + return 'false' + if isinstance(x, str): + return json.dumps(x, ensure_ascii=False) + if isinstance(x, (int, float)): + return js_number(x) + if isinstance(x, list): + return '[' + ','.join(js_stringify(v) for v in x) + ']' + if isinstance(x, dict): + return '{' + ','.join(json.dumps(k, ensure_ascii=False) + ':' + js_stringify(v) for k, v in x.items()) + '}' + raise ValueError('unsupported value') + + +def canonical(x): + """Canonical JSON of the dataset format: keys sorted at every depth, no whitespace.""" + if isinstance(x, list): + return '[' + ','.join(canonical(v) for v in x) + ']' + if isinstance(x, dict): + return '{' + ','.join(json.dumps(k, ensure_ascii=False) + ':' + canonical(x[k]) for k in sorted(x.keys())) + '}' + return js_stringify(x) + + +def verdict(artifact, failed_by_level, reasons, passed, partial=None): + """The one verdict form: four levels, each PASSED, FAILED or NOT_MEASURED with its reason.""" + levels = [] + for l in LEVELS: + if failed_by_level.get(l): + levels.append({'level': l, 'state': 'FAILED', 'rules': sorted(set(failed_by_level[l])), 'reason': '; '.join(reasons)}) + elif partial and l in partial: + levels.append({'level': l, 'state': 'NOT_MEASURED', 'rules': [], 'cause': partial[l][0], 'reason': partial[l][1]}) + elif l in passed: + levels.append({'level': l, 'state': 'PASSED', 'rules': [], 'reason': passed[l]}) + else: + levels.append({'level': l, 'state': 'NOT_MEASURED', 'rules': [], 'cause': 'not-judged', 'reason': 'this implementation does not judge this level'}) + failed = sorted({r for x in levels for r in x['rules']}) + is_partial = any(x['state'] == 'NOT_MEASURED' and x.get('cause') in ('claim-not-checked', 'unmeasurable') for x in levels) + v = 'INVALID' if failed else ('PARTIAL' if is_partial or levels[0]['state'] != 'PASSED' else 'VALID') + return {'v': 1, 'kind': 'aere-conformance-verdict', 'artifact': artifact, 'verdict': v, 'levels': levels, 'failed': failed} + + +def judge_envelope(inp): + env = inp.get('envelope') + ok_form = isinstance(env, dict) and isinstance(env.get('statement'), dict) and isinstance(env.get('statementHash'), str) and bool(H64.match(env['statementHash'])) + if not ok_form: + return verdict('envelope', {'integrity': ['envelope.form']}, ['the envelope lacks a statement (object) and a statementHash (0x + 64 hex)'], {}) + h = sha256_hex(js_stringify(env['statement']).encode('utf-8')) + if h != env['statementHash'].lower(): + return verdict('envelope', {'integrity': ['envelope.integrity']}, ['sha256 of the statement text is ' + h[:18] + '.., not the statementHash'], {}) + partial = {} + if env.get('signature'): + partial['authenticity'] = ('unmeasurable', 'the envelope carries a signature this implementation cannot check') + if env.get('notarization'): + why = ('claim-not-checked', 'the envelope claims a notarization; this implementation never reads a chain') + partial['anchoring'] = why + partial['finality'] = why + return verdict('envelope', {}, [], {'integrity': 'form and statement hash hold'}, partial) + + +def node_hash(a, b): + return hashlib.sha256(b'\x01' + a + b).digest() + + +def unhex(s): + if not isinstance(s, str) or not H64_LOW.match(s): + raise ValueError('not a 32-byte hash') + return bytes.fromhex(s[2:]) + + +def is_int(x): + return type(x) is int + + +def verify_inclusion(leaf, index, tree_size, path, root): + """RFC 9162, 2.1.3.2.""" + try: + if not (is_int(index) and is_int(tree_size) and 0 <= index < tree_size and isinstance(path, list)): + return False + fn, sn, r = index, tree_size - 1, unhex(leaf) + for p in path: + pb = unhex(p) + if sn == 0: + return False + if (fn & 1) or fn == sn: + r = node_hash(pb, r) + if not (fn & 1): + while not (fn & 1) and fn != 0: + fn >>= 1 + sn >>= 1 + else: + r = node_hash(r, pb) + fn >>= 1 + sn >>= 1 + return sn == 0 and '0x' + r.hex() == str(root) + except ValueError: + return False + + +def judge_record(inp): + rec, com = inp.get('record'), inp.get('commitment') + failed, reasons = [], [] + if not isinstance(rec, dict) or rec.get('kind') != KIND_RECORD or not isinstance(com, dict): + return verdict('dataset-record', {'integrity': ['dataset.form']}, ['not a ' + KIND_RECORD], {}) + if not (rec.get('commitmentHash') == sha256_hex(canonical(com).encode('utf-8')) and rec.get('version') == com.get('version')): + failed.append('dataset.commitment') + reasons.append('the record names another commitment') + + def row(): + c, disclosed = rec.get('c'), rec.get('disclosed') + if not (isinstance(c, (dict, list)) and isinstance(disclosed, (dict, list))): + failed.append('dataset.form') + reasons.append('malformed row') + return + for k, d in (disclosed.items() if isinstance(disclosed, dict) else enumerate(disclosed)): + if not (isinstance(d, dict) and isinstance(d.get('salt'), str)): + failed.append('dataset.field') + reasons.append('disclosed field ' + str(k) + ' without a salt') + return + want = sha256_hex((d['salt'] + '|' + str(k) + '|' + canonical(d.get('value'))).encode('utf-8')) + if not (isinstance(c, dict) and c.get(k) == want): + failed.append('dataset.field') + reasons.append('the disclosed value of "' + str(k) + '" does not match its commitment') + return + leaf = sha256_hex(b'\x00' + canonical({'id': rec.get('id'), 'c': c}).encode('utf-8')) + lp = rec.get('logProof') + if not (isinstance(lp, dict) and verify_inclusion(leaf, lp.get('index'), com.get('size'), lp.get('path'), com.get('logRoot')) and lp.get('index') == rec.get('i')): + failed.append('dataset.inclusion') + reasons.append('the record is not in the log of version ' + str(com.get('version'))) + + row() + passed = {} if failed else {'integrity': 'the record opens its commitments and is in the log'} + return verdict('dataset-record', {'integrity': failed} if failed else {}, reasons, passed) + + +JUDGES = {'envelope': judge_envelope, 'dataset-record': judge_record} +CAPABILITIES = {'v': 1, 'kind': 'aere-conformance-capabilities', 'name': 'independent integrity checker (Python, standard library)', 'artifacts': sorted(JUDGES), + 'rules': ['dataset.commitment', 'dataset.field', 'dataset.form', 'dataset.inclusion', 'envelope.form', 'envelope.integrity'], 'online': False, 'batch': True} + + +def one(path): + try: + with open(path, encoding='utf-8') as f: + j = json.load(f) + if not isinstance(j, dict) or j.get('artifact') not in JUDGES or not isinstance(j.get('input'), dict): + return {'error': 'not { artifact, input } with an artifact this implementation judges'} + return JUDGES[j['artifact']](j['input']) + except Exception as e: # a crash is reported as such: the runner scores it BROKEN, never as a refusal + return {'error': str(e)[:300]} + + +def main(a): + if '--capabilities' in a: + print(json.dumps(CAPABILITIES)) + return 0 + if '--batch' in a: + with open(a[a.index('--batch') + 1], encoding='utf-8') as f: + for e in json.load(f): + print(json.dumps(one(e['file']))) + return 0 + files = [x for x in a if not x.startswith('--')] + if not files: + print('usage: implementare-integritate.py --capabilities | | --batch ', file=sys.stderr) + return 3 + r = one(files[0]) + print(json.dumps(r, indent=1)) + return 3 if 'error' in r else {'VALID': 0, 'INVALID': 1}.get(r['verdict'], 2) + + +if __name__ == '__main__': + sys.exit(main(sys.argv[1:])) diff --git a/conformance/proba-conformance.mjs b/conformance/proba-conformance.mjs new file mode 100644 index 0000000..7028734 --- /dev/null +++ b/conformance/proba-conformance.mjs @@ -0,0 +1,213 @@ +#!/usr/bin/env node +// proba-conformance.mjs: the probe of the conformance suite itself. Three states per row: VERDE (as required), ROSU (not), STRICAT / +// NEMASURAT (the row could not be measured: counted, never passed); INFO rows are measurements printed beside the gates, not counted. Exit 0 all green, 1 a red or broken row, 2 only unmeasured rows. +// +// node proba-conformance.mjs [--online] [--acceptate] the suite is derived, whole, single-place, two implementations pass it, +// and malformed artifacts are refused by name (--acceptate lists what a +// verifier still accepts when damaged: the optional and the unread) +// node proba-conformance.mjs --control-negativ [--online] every rule planted out of its verifier, one at a time: the vectors that +// name the rule, and only they, must fail; plus the controls of the +// runner, of the coverage gate and of the rule derivation +// node proba-conformance.mjs --pe-loc a MEASUREMENT, not a gate: each check site planted out alone; how many +// of the sites the vectors reach +// +// The independent implementation needs Python 3 (AERE_CONFORMANCE_PYTHON=, default python3 then python); the envelope +// vectors need the AIP-23 reference verifier (AERE_VERIFY_PROOF=, with `npm install` done beside it); --online +// reads testnet 28001 (nothing is sent). +import fs from 'node:fs'; import os from 'node:os'; import path from 'node:path'; import { spawn, spawnSync } from 'node:child_process'; import { fileURLToPath, pathToFileURL } from 'node:url'; +import { deriva, hartaPublica, VERIFICATOARE, MODULE, VERIFY_PROOF, FINALITY_SITES, incarca } from './reguli.mjs'; +import { incarcaVectorii, ruleazaSuita } from './conformance.mjs'; +import { aplica, plicuriKinds } from './genereaza-vectori.mjs'; + +const AICI = path.dirname(fileURLToPath(import.meta.url)); +const a = process.argv.slice(2); const online = a.includes('--online'); const control = a.includes('--control-negativ'); const peLoc = a.includes('--pe-loc'); +const REF = `node "${path.join(AICI, 'implementare-aere.mjs')}"`; +let verzi = 0, rosii = 0, nemas = 0; +const rand = (stare, text) => { console.log(` [${stare.padEnd(9)}] ${text}`); if (stare === 'VERDE') verzi++; else if (stare === 'ROSU') rosii++; else if (stare !== 'INFO') nemas++; }; +const cer = (cond, text, detaliu = '') => rand(cond ? 'VERDE' : 'ROSU', text + (detaliu ? ': ' + detaliu : '')); +const canon = (x) => (x === null || typeof x !== 'object' ? JSON.stringify(x) : Array.isArray(x) ? '[' + x.map(canon).join(',') + ']' : '{' + Object.keys(x).sort().map((k) => JSON.stringify(k) + ':' + canon(x[k])).join(',') + '}'); +/** the JSON paths at which two values differ (a subtree added, removed or of another type is one path) */ +function difera(x, y, p = []) { + if (canon(x) === canon(y)) return []; + const ob = (v) => v !== null && typeof v === 'object'; + if (!ob(x) || !ob(y) || Array.isArray(x) !== Array.isArray(y)) return [p]; + return [...new Set([...Object.keys(x), ...Object.keys(y)])].flatMap((k) => (k in x && k in y ? difera(x[k], y[k], [...p, Array.isArray(x) ? Number(k) : k]) : [[...p, Array.isArray(x) ? Number(k) : k]])); +} +const prefix = (pre, p) => pre.length <= p.length && pre.every((k, i) => String(k) === String(p[i])); + +if (!fs.existsSync(VERIFY_PROOF)) { console.log('NEMASURAT: the AIP-23 reference verifier is not at ' + VERIFY_PROOF + ' (AERE_VERIFY_PROOF=)'); process.exit(2); } +const S = incarcaVectorii(); if (S.eroare) { console.log('ROSU: the vector set is not whole: ' + S.eroare); process.exit(1); } +const vectori = S.vectori; const HARTA = hartaPublica(); const TOATE = Object.keys(HARTA); +const cuRegula = (r, lista = vectori) => lista.filter((v) => v.expected.failed.includes(r)).map((v) => v.id); +/** coverage: every rule has a vector that expects it; returns the rules without one */ +const neacoperite = (reguli, lista = vectori) => reguli.filter((r) => !cuRegula(r, lista).length); +const python = () => { for (const c of [process.env.AERE_CONFORMANCE_PYTHON, 'python3', 'python'].filter(Boolean)) { const r = spawnSync(c, ['--version'], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] }); if (r.status === 0 && /Python 3/.test(r.stdout + r.stderr)) return c; } return null; }; +const numar = (s, st) => s.rezultate.filter((r) => r.stare === st); + +// ---------- planting ---------- +const PLANT = "|| String(1) === '1' /*PLANTAT*/"; +/** exact-once plantings of the reference verifier (a published program without markers): rule -> [text, planted text] */ +const PLANT_VP = { + form: [".test(env.statementHash);", ".test(env.statementHash) || String(1) === '1';"], + integrity: ["const ok = h === env.statementHash.toLowerCase();", "const ok = h === env.statementHash.toLowerCase() || String(1) === '1';"], + signature: ["const ok = crypto.verify(null, Buffer.from(text, 'utf8'), pub, sig);", "const ok = crypto.verify(null, Buffer.from(text, 'utf8'), pub, sig) || String(1) === '1';"], + finality: ["env.notarization ? 'FAILED' : 'ABSENT'", "(env.notarization && String(1) === '2') ? 'FAILED' : 'ABSENT'"], +}; +/** Writes the planted copy of a rule's verifier beside the original; returns { copie, env } or { stricat }. `loc` plants one site only. */ +function planteaza(verifier, sursa, loc = null) { + const d = VERIFICATOARE[verifier]; + if (d.sursa === 'verify-proof') { + const src = fs.readFileSync(VERIFY_PROOF, 'utf8'); const [de, cu] = PLANT_VP[sursa] || []; const n = de ? src.split(de).length - 1 : 0; + if (n !== 1) return { stricat: `the planting anchor of ${sursa} appears ${n} times in the reference verifier` }; + const copie = path.join(path.dirname(VERIFY_PROOF), `.plantat-conf-${process.pid}-${sursa}.mjs`); fs.writeFileSync(copie, src.replace(de, () => cu)); + return { copie, env: { AERE_VERIFY_PROOF: copie } }; + } + const p = fileURLToPath(MODULE[d.sursa].url); const src = fs.readFileSync(p, 'utf8'); const bucati = src.split(`/*PAZA:${sursa}*/`); const n = bucati.length - 1; + if (n < 1) return { stricat: `no /*PAZA:${sursa}*/ marker in ${path.basename(p)}` }; + if (loc !== null && loc >= n) return { stricat: 'site ' + loc + ' of ' + n }; + const text = loc === null ? bucati.join(PLANT) : bucati.map((b, i) => (i === bucati.length - 1 ? b : b + (i === loc ? PLANT : `/*PAZA:${sursa}*/`))).join(''); + const copie = path.join(path.dirname(p), `_plantat-conf-${process.pid}-${sursa}${loc === null ? '' : '-' + loc}.mjs`); fs.writeFileSync(copie, text); + return { copie, env: { [MODULE[d.sursa].env]: copie } }; +} +/** the suite, run as a separate program (several plantings run side by side) */ +function suitaAsync(env, { online: on = false, doar = null } = {}) { + return new Promise((gata) => { + const args = [path.join(AICI, 'conformance.mjs'), '--impl', REF, '--json']; if (on) args.push('--online'); if (doar) args.push('--only', doar); + const c = spawn(process.execPath, args, { env: { ...process.env, ...env }, stdio: ['ignore', 'pipe', 'pipe'] }); let out = '', err = ''; + c.stdout.on('data', (d) => { out += d; }); c.stderr.on('data', (d) => { err += d; }); + c.on('close', () => { try { gata({ rezultate: JSON.parse(out).results }); } catch { gata({ eroare: (out + err).trim().split('\n').slice(-1)[0].slice(0, 200) }); } }); + }); +} +async function inParalel(sarcini, n = 4) { const rez = new Array(sarcini.length); let k = 0; await Promise.all(Array.from({ length: Math.min(n, sarcini.length) }, async () => { while (k < sarcini.length) { const i = k++; rez[i] = await sarcini[i](); } })); return rez; } +const ramase = () => [...Object.values(MODULE).map((m) => path.dirname(fileURLToPath(m.url))), path.dirname(VERIFY_PROOF)].flatMap((d) => fs.readdirSync(d).filter((f) => /^[._]plantat-conf-/.test(f)).map((f) => path.join(d, f))); + +/** + * Every path of every offline vector that is not INVALID, removed or replaced by null, a string, a number, a list, an object, and given + * to the module verifiers directly. Left out, and said: the policy (a policy that cannot be defined is refused by definePolicy by + * throwing, by design: nothing is judged under it) and the public task of a market job (each replay costs seconds). + * @returns {{ cazuri: number, aruncate: string[], acceptate: string[] }} acceptate = the paths (without array positions) whose damage was accepted + */ +async function malformate() { + const R = await incarca('risc'), C = await incarca('chitanta'), P = await incarca('piata'), B = await incarca('baza'); const clona = (x) => JSON.parse(JSON.stringify(x)); + const J = { 'payment-risk': (i) => R.judeca(i.policy, i.inputs).decision === 'ALLOW', 'payment-receipt': (i) => C.verificaChitanta(i.receipt, { policy: i.policy, inputs: i.inputs, tx: i.tx, receipt: i.txReceipt }).verdict === 'VALID', 'market-timeline': (i) => P.judeca(i).verdict === 'VALID', + 'dataset-record': (i) => B.verificaInregistrare(i.record, i.commitment).ok, 'dataset-answer': (i) => B.verificaRaspuns(i.answer, i.commitment).verdict === 'VALID', 'dataset-consistency': (i) => B.verificaConsistentaVersiuni(i.proof, i.older, i.newer).ok }; + const cai = (x, p = []) => (x !== null && typeof x === 'object' ? [p, ...Object.keys(x).flatMap((k) => cai(x[k], [...p, Array.isArray(x) ? Number(k) : k]))] : [p]).filter((q) => q.length); + const VAL = [null, 'x', 7, [], {}]; let cazuri = 0; const aruncate = [], acceptate = []; + for (const v of vectori) { + if (!J[v.artifact] || v.expected.verdict === 'INVALID' || v.requires.length) continue; + const inp = clona(v.input); if (v.artifact === 'market-timeline') delete inp.spec; + for (const p of cai(inp)) { if (p[0] === 'policy') continue; + for (const op of ['remove', 0, 1, 2, 3, 4]) { const c = clona(inp); let o = c; for (const k of p.slice(0, -1)) o = o[k]; const k = p[p.length - 1]; + if (op === 'remove') { if (Array.isArray(o)) o.splice(k, 1); else delete o[k]; } else { if (JSON.stringify(o[k]) === JSON.stringify(VAL[op])) continue; o[k] = clona(VAL[op]); } + cazuri++; try { if (J[v.artifact](c)) acceptate.push(v.artifact + ':' + p.filter((x) => typeof x !== 'number').join('.')); } catch (e) { aruncate.push(v.id + ' ' + p.join('.') + ' <- ' + (op === 'remove' ? 'removed' : JSON.stringify(VAL[op])) + ': ' + String(e.message).slice(0, 60)); } } } + } + return { cazuri, aruncate, acceptate }; +} + +if (!control && !peLoc) { + console.log('A. the rules and the vectors are derived, and nothing is typed in their place'); + const D = await deriva(); + cer(!D.probleme.length && !D.nemasurat.length, `the rules derive from the code of ${Object.keys(D.tabel.verifiers).length} verifiers: declared == marked == mapped (${TOATE.length} rules)`, [...D.probleme, ...D.nemasurat].join(' | ')); + const rj = path.join(AICI, 'REGULI.json'); cer(fs.existsSync(rj) && fs.readFileSync(rj, 'utf8').replace(/\r\n/g, '\n') === JSON.stringify(D.tabel, null, 1) + '\n', 'REGULI.json is what the code derives now'); + const g = spawnSync(process.execPath, [path.join(AICI, 'genereaza-vectori.mjs'), '--verifica'], { encoding: 'utf8' }); + cer(g.status === 0, 'the vectors on disk are what the generator derives now, byte for byte', g.status === 0 ? g.stdout.trim().split('\n').slice(-1)[0] : (g.stdout + g.stderr).trim().split('\n').slice(-3).join(' | ')); + const dev = path.join(AICI, '..', 'aere-proof-protocol', 'genereaza-vectori-kinds.mjs'); + if (fs.existsSync(dev)) { const G = await import(pathToFileURL(dev).href); const lor = new Map(G.totiVectorii().map((x) => [x.nume, canon(x.plic)])); const ale = plicuriKinds(); + cer(ale.length === lor.size && ale.every(([k, p]) => lor.get(k) === canon(p)), `the ${ale.length} kind envelopes are the published AIP-23 kind vectors (same producers, same fixed inputs)`); } + else rand('INFO', 'the comparison with the published AIP-23 kind vectors is made in the development repository (their generator is not part of this copy)'); + + console.log('B. coverage and single place'); + const fara = neacoperite(TOATE); cer(!fara.length, `every rule a verifier names has a vector that expects it (${TOATE.length} of ${TOATE.length})`, fara.length ? 'without a vector: ' + fara.join(', ') : ''); + const artifacte = Object.values(VERIFICATOARE).flatMap((v) => v.artifacts); const faraValid = artifacte.filter((x) => !vectori.some((v) => v.artifact === x && v.expected.verdict === 'VALID')); + cer(!faraValid.length, `every artifact kind has a VALID vector (${artifacte.length} kinds)`, faraValid.join(', ')); + const kinds = plicuriKinds().map(([k]) => k); const kLipsa = kinds.filter((k) => !['valid', 'form', 'integrity'].every((s) => vectori.some((v) => v.id === `envelope/${k}.${s}`))); + cer(!kLipsa.length, `every AIP-23 proof kind (${kinds.length}) has its VALID vector and one INVALID vector per offline envelope rule`, kLipsa.join(', ')); + let unLoc = 0, prod = 0, alte = 0; const rele = []; + for (const v of vectori) { + if (!v.base) { if (v.expected.verdict === 'INVALID') rele.push(v.id + ': INVALID without a base'); continue; } + const b = vectori.find((x) => x.id === v.base); if (!b) { rele.push(v.id + ': base missing'); continue; } + if (b.expected.verdict === 'INVALID') rele.push(v.id + ': its base is INVALID'); + if (v.mutation && v.mutation.op) { let m; try { m = aplica(b.input, v.mutation); } catch (e) { rele.push(v.id + ': ' + e.message); continue; } if (canon(m) !== canon(v.input)) rele.push(v.id + ': the input is not the base with the one operation applied'); else if (v.expected.verdict === 'INVALID') unLoc++; else alte++; } + else if (v.mutation && v.mutation.producer) { const dif = difera(b.input, v.input); const afara = dif.filter((p) => !v.mutation.changed.some((c) => prefix(c, p))); const neatinse = v.mutation.changed.filter((c) => !dif.some((p) => prefix(c, p))); + if (!dif.length || afara.length || neatinse.length) rele.push(v.id + ': differs outside what it declares (' + afara.map((p) => p.join('.')).join(', ') + ') or declares paths that did not move (' + neatinse.map((p) => p.join('.')).join(', ') + ')'); else prod++; } + else rele.push(v.id + ': a base without a mutation'); + } + const inv = vectori.filter((v) => v.expected.verdict === 'INVALID').length; + cer(!rele.length && unLoc + prod === inv, `every INVALID vector (${inv}) is its base with ONE operation applied (${unLoc}), or one change at the producer with the paths that moved declared (${prod}); ${alte} more vectors that are not INVALID are also one operation from their base`, rele.slice(0, 4).join(' | ')); + const multe = vectori.filter((v) => v.expected.failed.length > 1); const fin = cuRegula('envelope.finality'); + rand('INFO', `measured, not a gate: ${multe.length} vector(s) expect more than one rule (rules that guard the same field: ${multe.map((v) => v.id.split('/')[1]).join(', ')}); of the ${FINALITY_SITES.length} refusal sites of the reference verifier's finality level the vectors reach ${fin.length ? FINALITY_SITES.filter((x) => x.reachable).length : 0} (the others need an endpoint that lies)`); + + console.log('C. two implementations, one runner'); + const r1 = ruleazaSuita({ impl: REF, online }); + if (r1.eroare) rand('STRICAT', 'the reference verifiers: ' + r1.eroare); + else { const p = numar(r1, 'PASS').length, deRulat = vectori.filter((v) => online || !v.requires.length).length; + cer(p === deRulat && !numar(r1, 'FAIL').length && !numar(r1, 'BROKEN').length && !numar(r1, 'NOT_COVERED').length, `the published verifiers behind the one verdict form pass ${p} of ${deRulat} vectors${online ? ' (testnet 28001 read)' : ' (offline)'}`, [...numar(r1, 'FAIL'), ...numar(r1, 'BROKEN')].slice(0, 3).map((x) => x.id + ' ' + x.detaliu).join(' | ')); + if (!online) rand('NEMASURAT', `${numar(r1, 'SKIPPED_ONLINE').length} vectors need testnet 28001 and were not run (--online)`); } + const py = python(); + if (!py) rand('NEMASURAT', 'the independent implementation needs Python 3 (AERE_CONFORMANCE_PYTHON=)'); + else { const r2 = ruleazaSuita({ impl: `${py} "${path.join(AICI, 'implementare-integritate.py')}"`, online: false }); + if (r2.eroare) rand('STRICAT', 'the independent implementation: ' + r2.eroare); + else { const p = numar(r2, 'PASS').length, nc = numar(r2, 'NOT_COVERED').length; const revendica = vectori.filter((v) => r2.caps.artifacts.includes(v.artifact) && v.exercises.every((x) => r2.caps.rules.includes(x)) && !v.requires.length).length; + cer(p === revendica && p > 0 && !numar(r2, 'FAIL').length && !numar(r2, 'BROKEN').length && p + nc === vectori.length, `an independent implementation in another language (${r2.caps.name}) passes all ${p} vectors it claims; the other ${nc} are reported NOT COVERED, never passed`, [...numar(r2, 'FAIL'), ...numar(r2, 'BROKEN')].slice(0, 3).map((x) => x.id + ' ' + x.detaliu).join(' | ')); } } + + console.log('D. a malformed artifact is refused by name, never thrown at the reader'); + { const m = await malformate(); + cer(m.cazuri > 1000 && !m.aruncate.length, `${m.cazuri} malformed inputs (every path removed or replaced) given to the module verifiers: each got a verdict, none threw`, m.aruncate.slice(0, 3).join(' | ') + (m.aruncate.length > 3 ? ' ... ' + m.aruncate.length + ' in all' : '')); + const cai = [...new Set(m.acceptate)].sort(); const peFel = {}; for (const c of cai) { const k = c.split(':')[0]; peFel[k] = (peFel[k] || 0) + 1; } + rand('INFO', `measured, not a gate: ${m.acceptate.length} of them were still accepted, at ${cai.length} distinct paths (${Object.entries(peFel).map(([k, n]) => k + ' ' + n).join(', ')}): parts a verifier treats as optional (the transaction facts of a receipt, the envelope of a timeline) and fields no rule reads; --acceptate lists them`); + if (a.includes('--acceptate')) for (const c of cai) console.log(' ' + c); } +} else if (control) { + console.log('CONTROL: every rule planted out of its verifier, one at a time; the vectors that expect the rule, and only they, must fail'); + const cazuri = []; for (const [v, d] of Object.entries(VERIFICATOARE)) for (const [src, [id]] of Object.entries(d.reguli)) cazuri.push({ v, src, id, online: id === 'envelope.finality' }); + const deRulat = cazuri.filter((c) => !c.online || online); let bune = 0; + try { + const rez = await inParalel(deRulat.map((c) => async () => { const p = planteaza(c.v, c.src); if (p.stricat) return { stricat: p.stricat }; try { return await suitaAsync(p.env, { online: c.online }); } finally { fs.rmSync(p.copie, { force: true }); } })); + deRulat.forEach((c, k) => { + const r = rez[k]; const asteptate = cuRegula(c.id, vectori.filter((v) => c.online || !v.requires.length)).sort(); + if (r.stricat || r.eroare) return rand('STRICAT', `${c.id}: ${r.stricat || r.eroare}`); + const cazute = r.rezultate.filter((x) => x.stare === 'FAIL').map((x) => x.id).sort(); const stricate = r.rezultate.filter((x) => x.stare === 'BROKEN').map((x) => x.id); + const ok = asteptate.length > 0 && cazute.join() === asteptate.join() && !stricate.length; if (ok) bune++; + rand(ok ? 'VERDE' : stricate.length ? 'STRICAT' : 'ROSU', `${c.id} planted out: ${cazute.length} vector(s) fail` + (ok ? `, exactly the ${asteptate.length} that expect it` : `; expected exactly [${asteptate.join(', ')}], failed [${cazute.join(', ')}]` + (stricate.length ? `, broken [${stricate.join(', ')}]` : ''))); + }); + } finally { for (const f of ramase()) fs.rmSync(f, { force: true }); } + for (const c of cazuri.filter((x) => x.online && !online)) rand('NEMASURAT', `${c.id}: its vectors need testnet 28001 (--online)`); + console.log('CONTROL of the instruments'); + { // the runner can fail: an implementation that calls everything VALID + const stub = path.join(fs.mkdtempSync(path.join(os.tmpdir(), 'aere-conf-stub-')), 'stub.mjs'); + fs.writeFileSync(stub, `import fs from 'node:fs'; const a = process.argv.slice(2); const V = JSON.stringify({ verdict: 'VALID', failed: [], levels: [{ level: 'integrity', state: 'PASSED' }, { level: 'authenticity', state: 'NOT_MEASURED' }, { level: 'anchoring', state: 'NOT_MEASURED' }, { level: 'finality', state: 'NOT_MEASURED' }] });\nif (a.includes('--capabilities')) console.log(JSON.stringify({ artifacts: ${JSON.stringify(Object.values(VERIFICATOARE).flatMap((v) => v.artifacts))}, rules: ${JSON.stringify(TOATE)}, online: false, batch: true }));\nelse for (const x of JSON.parse(fs.readFileSync(a[a.indexOf('--batch') + 1], 'utf8'))) console.log(V);\n`); + const r = ruleazaSuita({ impl: `node "${stub}"` }); fs.rmSync(path.dirname(stub), { recursive: true, force: true }); + const off = vectori.filter((v) => !v.requires.length); const trebuie = off.filter((v) => !(v.expected.verdict === 'VALID' && Object.entries(v.expected.levels).every(([l, s]) => s === (l === 'integrity' ? 'PASSED' : 'NOT_MEASURED')))).map((v) => v.id).sort(); + const cazute = r.eroare ? [] : numar(r, 'FAIL').map((x) => x.id).sort(); + cer(!r.eroare && cazute.join() === trebuie.join() && trebuie.length > 0, `the runner fails an implementation that calls everything VALID on ${trebuie.length} of ${off.length} offline vectors (every one that is not plainly VALID)`, r.eroare || ''); } + { const lista = vectori.filter((v) => !v.expected.failed.includes('dataset.order')); const f = neacoperite(TOATE, lista); + cer(f.join() === 'dataset.order', 'the coverage gate goes red when the vector of one rule is taken away (dataset.order)', f.join(', ')); } + { // a rule added to a verifier and not mapped in the suite is refused by the derivation + const p = fileURLToPath(MODULE.baza.url); const copie = path.join(path.dirname(p), `_plantat-conf-${process.pid}-regula-noua.mjs`); const src = fs.readFileSync(p, 'utf8'); const anc = "'consistenta', 'esantion'];"; + try { if (src.split(anc).length !== 2) rand('STRICAT', 'the anchor of the new-rule planting is not in the dataset module'); + else { fs.writeFileSync(copie, src.replace(anc, "'consistenta', 'esantion', 'noua'];") + '\n/*PAZA:noua*/\n'); const D = await deriva({ cai: { baza: copie } }); + cer(D.probleme.length === 1 && /names rule noua and the suite does not map it/.test(D.probleme[0]), 'a rule added to a verifier and not mapped in the suite is refused by the derivation (a new rule without a vector cannot pass unseen)', D.probleme.join(' | ')); } + } finally { fs.rmSync(copie, { force: true }); } } + { // the malformed-input row can go red: the market judge without its form check and without its catch throws again, and the row counts it + const p = fileURLToPath(MODULE.piata.url); const copie = path.join(path.dirname(p), `_plantat-conf-${process.pid}-arunca.mjs`); const src = fs.readFileSync(p, 'utf8'); const anc = "catch (e) { return { verdict: 'INVALID', motive: ['malformed timeline: '"; + try { if (src.split(anc).length !== 2) rand('STRICAT', 'the anchor of the throwing planting is not in the market judge'); + else { fs.writeFileSync(copie, src.replace(anc, "catch (e) { throw e; return { verdict: 'INVALID', motive: ['malformed timeline: '").split('/*PAZA:forma*/').join(PLANT)); process.env[MODULE.piata.env] = copie; const m = await malformate(); delete process.env[MODULE.piata.env]; + cer(m.aruncate.length > 0 && m.aruncate.every((x) => x.startsWith('market-timeline/')), `the malformed-input row goes red when a judge throws again (the market judge without its form check and its catch: ${m.aruncate.length} of ${m.cazuri} inputs thrown)`); } + } finally { delete process.env[MODULE.piata.env]; fs.rmSync(copie, { force: true }); } } + const r = ramase(); cer(!r.length, 'no planted copy is left behind', r.join(', ')); + console.log(`CONTROL: ${bune} of ${cazuri.length} rules proven load-bearing through their vectors`); +} else { + console.log('MEASUREMENT (not a gate): each check site planted out alone, the vectors of its artifact kinds run'); + const locuri = []; for (const [v, d] of Object.entries(VERIFICATOARE)) { if (d.sursa === 'verify-proof') continue; const src = fs.readFileSync(fileURLToPath(MODULE[d.sursa].url), 'utf8'); + for (const [s, [id]] of Object.entries(d.reguli)) { const n = src.split(`/*PAZA:${s}*/`).length - 1; for (let k = 0; k < n; k++) locuri.push({ v, src: s, id, k, n, doar: d.artifacts[0].split('-')[0] }); } } + let atinse = 0; + try { + const rez = await inParalel(locuri.map((c) => async () => { const p = planteaza(c.v, c.src, c.k); if (p.stricat) return { stricat: p.stricat }; try { return await suitaAsync(p.env, { doar: c.doar }); } finally { fs.rmSync(p.copie, { force: true }); } })); + const peRegula = {}; + locuri.forEach((c, k) => { const r = rez[k]; const cazute = r.rezultate ? r.rezultate.filter((x) => x.stare === 'FAIL').length : 0; if (cazute) atinse++; (peRegula[c.id] || (peRegula[c.id] = [])).push(r.stricat || r.eroare ? '?' : cazute ? 'reached' : 'NOT reached'); }); + for (const [id, l] of Object.entries(peRegula)) console.log(` ${id}: ${l.filter((x) => x === 'reached').length} of ${l.length} site(s) reached` + (l.includes('NOT reached') ? ' (sites ' + l.map((x, i) => (x === 'NOT reached' ? i + 1 : null)).filter(Boolean).join(', ') + ' have no vector)' : '')); + } finally { for (const f of ramase()) fs.rmSync(f, { force: true }); } + console.log(`SITES: the vectors reach ${atinse} of ${locuri.length} check sites of the module verifiers (the reference verifier's own sites are counted in REGULI.json)`); + process.exit(0); +} +console.log(`\nconformance suite${control ? ' (control)' : ''}: ${verzi} VERDE, ${rosii} ROSU, ${nemas} NEMASURAT/STRICAT`); +process.exitCode = rosii ? 1 : nemas ? 2 : 0; diff --git a/conformance/reguli.mjs b/conformance/reguli.mjs new file mode 100644 index 0000000..1e20ab4 --- /dev/null +++ b/conformance/reguli.mjs @@ -0,0 +1,140 @@ +// reguli.mjs: which verifiers the conformance suite enrols, the rules each of them NAMES (derived from its code, never typed here as +// a list of its own), the public id and the level of each rule. +// +// A verifier that lives in this repository as a module exports `REGULI` (the rules it can name; its helper throws on any other) and +// carries a /*PAZA:*/ marker on every check of a rule. The derivation imports the module, reads its source, and requires: +// declared == marked == mapped below. A rule added to a verifier and not mapped here, or mapped here and gone from the verifier, is a +// refusal of the derivation, not a silent drift. The AIP-23 reference verifier (verify-proof.mjs) is a published program, not edited +// for this suite: its rules are its level names, read from its `level('', ... 'FAILED'` sites, and every FAILED site of its +// `finality` level must be classified below (anchoring or finality) or the derivation refuses. +import fs from 'node:fs'; import path from 'node:path'; import { fileURLToPath, pathToFileURL } from 'node:url'; + +const AICI = path.dirname(fileURLToPath(import.meta.url)); +export const LEVELS = ['integrity', 'authenticity', 'anchoring', 'finality']; +/** The AIP-23 reference verifier: AERE_VERIFY_PROOF= (published with aere-node), or the development repository. */ +export const VERIFY_PROOF = process.env.AERE_VERIFY_PROOF || path.resolve(AICI, '..', '..', 'verificator-falcon', 'verify-proof.mjs'); + +/** The modules judged in-process. `env` names the variable through which the planting control substitutes a planted copy. */ +export const MODULE = { + risc: { url: new URL('../payments/risc.mjs', import.meta.url), env: 'AERE_CONF_MODUL_RISC' }, + chitanta: { url: new URL('../payments/chitanta.mjs', import.meta.url), env: 'AERE_CONF_MODUL_CHITANTA' }, + piata: { url: new URL('../market-settlement/piata.mjs', import.meta.url), env: 'AERE_CONF_MODUL_PIATA' }, + baza: { url: new URL('../verifiable-data/baza.mjs', import.meta.url), env: 'AERE_CONF_MODUL_BAZA' }, +}; +export const caleModul = (k) => process.env[MODULE[k].env] || fileURLToPath(MODULE[k].url); +export const incarca = (k) => import(pathToFileURL(caleModul(k)).href); + +const I = 'integrity'; +/** verifier -> { artifacts it judges, where its rules come from, source rule -> [public id, level, what the rule says] } */ +export const VERIFICATOARE = { + 'aip23-envelope': { artifacts: ['envelope'], sursa: 'verify-proof', reguli: { + form: ['envelope.form', I, 'the envelope has a statement (object) and a statementHash (0x + 64 hex)'], + integrity: ['envelope.integrity', I, 'sha256 of the canonical statement text is the statementHash'], + signature: ['envelope.signature', 'authenticity', 'the ML-DSA signature the envelope carries verifies over the canonical statement text'], + finality: ['envelope.finality', 'anchoring', 'the statementHash is recorded in the notary under a state root that a verified post-quantum anchor certificate covers (level by site: see finalitySites)'] } }, + 'payment-risk': { artifacts: ['payment-risk'], sursa: 'risc', reguli: { + forma: ['risk.form', I, 'payer and payee are addresses; chain, asset, a positive integer amount and the time are given'], + activ: ['risk.asset', I, 'the asset on that chain is allowed by the declared policy'], + contrapartida: ['risk.counterparty', I, 'the payee is not the payer and is not a refused counterparty of the policy'], + curs: ['risk.rate', I, 'the USD rate is declared (value, source, time) when the policy requires it'], + limita: ['risk.limit', I, 'the amount in USD is within the per-payment limit of the policy'], + fereastra: ['risk.window', I, 'the amount and the count stay within the sliding window of the policy'] } }, + 'payment-receipt': { artifacts: ['payment-receipt'], sursa: 'chitanta', reguli: { + legatura: ['receipt.binding', I, 'the settlement envelope commits to this instruction and says the same thing'], + suma: ['receipt.amount', I, 'the USD amount is the amount at the declared rate, exactly'], + politica: ['receipt.policy', I, 'the policy shown hashes to the policy the risk verdict names'], + risc: ['receipt.risk', I, 'the risk verdict reproduces from the inputs and the policy, and it allowed this payment'], + lant: ['receipt.chain', I, 'the transaction supplied is this payment: payer, payee, value, block, mined'] } }, + 'market-timeline': { artifacts: ['market-timeline'], sursa: 'piata', reguli: { + forma: ['market.form', I, 'the timeline is well formed: events with name, arguments, sender, integer time and block; the job and the constants with their integer fields'], + intreg: ['market.complete', I, 'the timeline carries every event the job state implies: posted; claimed when a provider is set; submitted and disputed when their times are set'], + postare: ['market.posting', I, 'the JobPosted event matches the job (requester, spec, deadline, reward)'], + termen: ['market.deadline', I, 'claim and submission are within the deadline; an expiry refund only after it'], + fereastra: ['market.window', I, 'a dispute is raised inside the challenge window; a third party finalizes only after it'], + arbitru: ['market.arbiter', I, 'a dispute is resolved by the arbiter, or timed out only after the arbitration timeout'], + plata: ['market.payout', I, 'the terminal payout matches the final state (who, how much, which bond)'], + rezultat: ['market.result', I, 'the result bytes hash to the commitment on chain'], + replay: ['market.replay', I, 'the public task recomputed agrees with who was paid or slashed'], + dovada: ['market.proof', I, 'the execution envelope names this job and existed before the window closed'] } }, + dataset: { artifacts: ['dataset-record', 'dataset-answer', 'dataset-consistency', 'dataset-sample'], sursa: 'baza', reguli: { + forma: ['dataset.form', I, 'a row carries its field commitments and its disclosed fields'], + angajament: ['dataset.commitment', I, 'the record, answer or proof names the commitment it is checked against'], + camp: ['dataset.field', I, 'a disclosed value opens its salted field commitment'], + includere: ['dataset.inclusion', I, 'the record is in the log of that version (RFC 9162 inclusion)'], + index: ['dataset.index', I, 'the row is at its stated position of the sorted index'], + interval: ['dataset.range', I, 'every row returned is inside the queried range'], + ordine: ['dataset.order', I, 'consecutive rows are in index order'], + completitudine: ['dataset.completeness', I, 'the rows are the whole contiguous run; the neighbours on both sides are outside the range'], + consistenta: ['dataset.consistency', I, 'the older log is a prefix of the newer (RFC 9162 consistency) and the versions are linked'], + esantion: ['dataset.sample', I, 'every sampled position is served and verifies'] } }, +}; +/** + * The FAILED sites of verify-proof's `finality` level, classified. `fragment` must appear on exactly one such source line; `re` + * matches the detail the verifier prints there; `level` is where the suite reports it. Only the last one is reachable by an honest + * endpoint (a claim that is not on chain); the others need an endpoint that lies or a chain whose anchor does not verify. + */ +export const FINALITY_SITES = [ + { fragment: 'most recent anchor did not verify', re: /^the chain's most recent anchor did not verify/, level: 'finality' }, + { fragment: 'the header the endpoint served for block', re: /^the header the endpoint served for block/, level: 'anchoring' }, + { fragment: 'has no account at', re: /has no account at/, level: 'anchoring' }, + { fragment: 'is not the AereNotary contract', re: /is not the AereNotary contract/, level: 'anchoring' }, + { fragment: 'the Merkle proof for block', re: /^the Merkle proof for block/, level: 'anchoring' }, + { fragment: 'not notarized:', re: /^not notarized:/, level: 'anchoring', reachable: true }, +]; +/** Verifiers published beside these that the suite does NOT enrol yet, with the pattern that counts their refusal sites. */ +export const NEINROLATE = [ + { name: 'ai-trust', files: [new URL('../ai-trust/lant-de-incredere.mjs', import.meta.url)], re: /\bfail\('[a-z-]+', '[a-z-]+'/g, why: 'its refusals already carry a level and a code; enrolling it is a vector per code, not done here' }, + { name: 'agents (ledger)', files: [new URL('../agents/agent-ledger.mjs', import.meta.url)], re: /ok: false, error:/g, why: 'its refusals are free text; a rule id per refusal comes first' }, + { name: 'identity', files: [new URL('../identity/identity.mjs', import.meta.url)], re: /\bok\('/g, why: 'its checks are labelled rows, not rule ids' }, + { name: 'verify-layer (log and tree)', files: [new URL('../verify-layer/sidecar.mjs', import.meta.url), new URL('../verify-layer/jurnal-arbore.mjs', import.meta.url)], re: /ok: false/g, why: 'its refusals are free text; a rule id per refusal comes first' }, +]; + +/** public rule id -> { verifier, source, level, says } for every mapped rule */ +export function hartaPublica() { + const h = {}; + for (const [v, d] of Object.entries(VERIFICATOARE)) for (const [src, [id, level, says]] of Object.entries(d.reguli)) h[id] = { verifier: v, source: src, level, says }; + return h; +} +/** source rule ids of a verifier -> public ids */ +export const public_ = (verifier, surse) => [...new Set(surse.map((s) => { const r = VERIFICATOARE[verifier].reguli[s]; if (!r) throw new Error(`${verifier}: the verifier named a rule this suite does not map: ${s}`); return r[0]; }))].sort(); + +/** + * Derives the rule table from the code. Returns { tabel, probleme, nemasurat }: `probleme` are refusals (a rule declared and not + * marked, marked and not declared, declared and not mapped, mapped and not declared, an unclassified finality site); `nemasurat` + * names a verifier whose source could not be read here. `cai` substitutes the file of a module (the probe's control derives from a + * planted copy to show that a rule added to a verifier and not mapped here is refused). + */ +export async function deriva({ cai = {} } = {}) { + const probleme = [], nemasurat = []; const tabel = { v: 1, kind: 'aere-conformance-rules', levels: LEVELS, verifiers: {}, notEnrolled: [] }; + for (const [v, d] of Object.entries(VERIFICATOARE)) { + const rules = []; let declared = [], sites = {}, extra = {}; + if (d.sursa === 'verify-proof') { + if (!fs.existsSync(VERIFY_PROOF)) { nemasurat.push(`${v}: the reference verifier is not at ${VERIFY_PROOF} (AERE_VERIFY_PROOF=)`); continue; } + const linii = fs.readFileSync(VERIFY_PROOF, 'utf8').split('\n').filter((l) => /level\('[a-z]+',[^;]*'FAILED'/.test(l) && !/^\s*\/\//.test(l)); + for (const l of linii) for (const m of l.matchAll(/level\('([a-z]+)',[^;]*?'FAILED'/g)) sites[m[1]] = (sites[m[1]] || 0) + 1; + declared = Object.keys(sites); + const fin = linii.filter((l) => /level\('finality'/.test(l)); + for (const s of FINALITY_SITES) { const n = fin.filter((l) => l.includes(s.fragment)).length; if (n !== 1) probleme.push(`${v}: the finality site "${s.fragment}" appears on ${n} FAILED lines of the verifier (expected 1)`); } + if (fin.length !== FINALITY_SITES.length) probleme.push(`${v}: the verifier has ${fin.length} FAILED sites at its finality level, the suite classifies ${FINALITY_SITES.length}`); + extra = { finalitySites: FINALITY_SITES.map((s) => ({ site: s.fragment, level: s.level, reachableWithAnHonestEndpoint: !!s.reachable })) }; + } else { + const p = cai[d.sursa] || fileURLToPath(MODULE[d.sursa].url); const src = fs.readFileSync(p, 'utf8'); const M = await import(pathToFileURL(p).href); + if (!Array.isArray(M.REGULI)) { probleme.push(`${v}: the module does not export REGULI`); continue; } + declared = [...M.REGULI]; + for (const m of src.matchAll(/\/\*PAZA:([a-z]+)\*\//g)) sites[m[1]] = (sites[m[1]] || 0) + 1; + for (const r of declared) if (!sites[r]) probleme.push(`${v}: rule ${r} is declared and no check carries its marker`); + for (const r of Object.keys(sites)) if (!declared.includes(r)) probleme.push(`${v}: a check is marked ${r}, a rule the module does not declare`); + } + for (const r of declared) if (!d.reguli[r]) probleme.push(`${v}: the verifier names rule ${r} and the suite does not map it (a new rule needs a public id, a level and a vector)`); + for (const r of Object.keys(d.reguli)) if (!declared.includes(r)) probleme.push(`${v}: the suite maps rule ${r}, which the verifier no longer names`); + for (const [src, [id, level, says]] of Object.entries(d.reguli)) rules.push({ id, source: src, level, sites: sites[src] || 0, says }); + tabel.verifiers[v] = { artifacts: d.artifacts, rules, ...extra }; + } + for (const n of NEINROLATE) { + let sitesN = 0, citit = true; + for (const u of n.files) { const p = fileURLToPath(u); if (!fs.existsSync(p)) { citit = false; continue; } sitesN += (fs.readFileSync(p, 'utf8').match(n.re) || []).length; } + tabel.notEnrolled.push({ verifier: n.name, refusalSites: citit ? sitesN : null, why: n.why }); + if (citit && sitesN === 0) probleme.push(`not enrolled ${n.name}: the pattern that counts its refusal sites finds none (the pattern is stale)`); + } + return { tabel, probleme, nemasurat }; +} diff --git a/conformance/surse-proaspete.json b/conformance/surse-proaspete.json new file mode 100644 index 0000000..1c57096 --- /dev/null +++ b/conformance/surse-proaspete.json @@ -0,0 +1,612 @@ +{ + "v": 1, + "kind": "aere-conformance-fresh-sources", + "at": "2026-10-03T09:33:28.671Z", + "signedHead": { + "v": 1, + "kind": "aere-audit-tree-head-attestation", + "statement": { + "v": 1, + "kind": "aere-audit-tree-head", + "host": "conformance", + "treeSize": 3, + "rootHash": "0xfeabb16d0b795805345b053ff7b77d732ca566303b0dace87992b667674b1bd3", + "createdAt": "2026-10-03T09:33:28.671Z" + }, + "statementHash": "0xe661da6bb6f98b38d5b891debb4b72111b90852f133bed0f6dc22cb3f9ae6c41", + "signature": { + "scheme": "ml-dsa-65", + "publicKey": "MIIHsjALBglghkgBZQMEAxIDggehAM8ubg5GBFII4zSqVti0Uo374zVox8feLYz2qzTakYezQV5p3TncRk9q9Nkuq4ehGtllSP01d6/2cjf28JH4cx2dY73jD+98KNA6kZmUDZQrjjMvoWbxBhrUaMAQi6isdtA4Mm/CZPbQ+a9SDq7X5SSWrol1P1sBCPRI92fcRYUKGF+KJUKz3JVUPkf3t9Bp1psMaUQN2pFIj2AAfCiDHNdMxCwxuyorWjYrqn8BHL2CXcdM9jInFmLsQXOQZeaoldA11CK8rG6d7EHil5jT5zyCtrYwvy7FQJtZ547LSQ1R46WH/qjgOplmgHy9kQTvrVlgRUXnMHv2HpB2lQUgXp7ajFF9gK/5A+vMUgvpDXqLkQ1yffveFZimdGHzdoX29IsT4mHqQ3CNFgB1jr1DuSFUF2+F5KjTILJyL4S/fXIFwkvv+opqQ0BsAOep7QiX6oRtkGkM7OIoq9/8LGJ1lHckhOnRuSqwMpuRiK3vnHKUtkqJgZuRN/K8qY4Z1PLKpYjRrlO5SeBIfcPJfeSRswmhcp4UyG/1kyNiyUN+4kYt+0EQCocZLlslqow0wnWa5ZY0Bvbd8q8eZQmDXk7fg6W0op7tk+EMtnVgRx/AQ0B7hDtMhzzGSpJRg4feHwc5a4D1w19oH8o+HAfClJD9iIvsSInhkRAeSHvwvf6SjvqxEEzC2/oqd0sIDGVBDo5GJfBzf8ELwNdqWlSEG895w9mjOiun7IopEvq32WbLJmZ14IH7kog3p7gJs/ydGLaMPRniLIGyM/JDM9fhSLsod3uVDImk0tBnALGQa7Zmmjv3rCmUrY38G6aWlJUVdLI/cyKMlFbX7bzaFzu0u0MO1e2MXwsCS4QRIF0ZBz5EoIXDs59jUVW0jBIeev2rEQf5YmfcDjxPxr/bFHC7Qex7uPZgxbZGkEgjYOYXCi2gIt2ocNG/zImdhgcbOSqV2R9tTfDzKV4X/QPFZYV/y3naSBsqzi3C8lhHKbxV4bUI06R6ILE1nwn47kUJOciKS8YQajs81rhBMeF+IqJ3NZ72bvkIA8O1Fuu2d9jNL0nea2hU96viCLRLHKlJwBZTD55XGTqw6S2g7yqKbPkWGTwYUeN29kGEEwsPdelrKO7SuimWZEfkt+FrHcMTDx01q+BQIRef5i5+zT+/HRvVJ5WhNttjJn5SI5qfz83zaeE6//AQe+sZgyIyC76S2qxwWQVjm6QjZSw/tRdilnjQNSdXsy76tanOBWCIxUOc9aUqQ0lZIc69LbYwjy5yeopA4R84Pe8HJaxk6XnYKWyFDki8g3PTiYWu6I9pw8YZYkMM9FDBCpN1719Z2bHl+tKITiCMvcyExKM6cAgEcMPIHZsS656Q0JqdF0nggBLhm/dsCybYO0RSu22l8F6qrGiZv/CNb42KbOBzDxKrTdwFZiQXuFA7UoctjRkz/+gNPN0/CUYvgD0OqTDOXWlO03LfhENX9axJzD/AJIi4eKzeEMNUECZ+Sn8rJlE0PW0DBI2A2pNlgSPX7d4MdTn/TQlOqdmPDbwTsX+QU3UpmZ55IMI5POEukGAmtoXfhKHe/uJ/OkueGREFYY+qXMc+E6GM9ngDs6StqTtNU7H3U1C5VS24TJnFePH5qU+YR2ySyOCuT4mbijwFAXfbb68SOzh3vJVmpRk52XUsdzuqyhJq83pX+BgpOSah5pREvutHaZYSyf18Fcvl3n6y3OB3yqf33HOeCnQFPpnj8Vt40eYH0M7Hh9nk9J8tBhJm0+TUngAMfm1XZ9xIl3bXUlH+sZntNXh59pm/qohGO0f+nRdLPg8QtMxACt+ezXYw9pH+ipJE/cHbrcFWCi/KzQVBYJToLzCiIxnwjAOORYqW+dX9thGDNETuETPETBkci7CGz0ueWQVKcun751hz34GO6Gl1e1V7UikSjZSaZb0NPdNYAeQ2mSZSMvLo6e06Gmyy3wqeKnTq8q4YoTVsZO+qbhvhubKhh6suSyVR7p49iBud64qbwq1vf4Pp69qlS1Wabxp87G4dP9JPg9CdlZ/JT/y/7rqjmWkawaHf+asYQnN7hCc+zguHG0wNGfIwYo69TbEZ6ZWHwCWaqtlPfxkqvnF7l5mDuvU7Wid1K4te69oNuo9yyeHGquEV1WQDhvMTcyyKeIOz/izvDXb/5x5tVak7PNkohEf0Y+XZ1ElQsfOSemfHWriPRZ3z5nRA/hdvwLjwLllQU/Sf7IBQXOkZB9kaYqKmmXtA/B5s/PwqpMOs0vKO5LGJd0rtETvQ5/0ZgjdLZK0tZ9ct6LJpcgqjoQHlks1EOFeelSfPTSFv0xUHztscDhnBHvsgLBKVbjOG5cSV2pJMhqEJicrzLgJSLnZ+EiN1R6JkNIxsC/2wQKgPT6cFKvKJ60LPVKz/urMPpqkcVQ6hatUivEhNAnBw4syfuJNVe9WVHVWk5uxCKJK1ssVlNsEE9xMM53rfStG0f0BQ6et5mEAbBFkp+U3shvcMhOpzYLfDMD0AvlIG4G84MdM/eUIhU6ucA/Z7g2OSJ6aLSI84Iy8YQ6Ih6ikw/PHsqsOwTE6CC61me8E8qpEcmZNGCwS04gzLU5/MI0y6KFzW4lO6", + "signature": "pm+Mh1v7TzZFyfloc+mLyaoZq3nJ4xuXNoaQzJBj0btuLyM9kLWWJlSXn00nIJYrfFBPAzFUnisSrKeM4ypAVsFAc9Y6jdvWCX2BV+JHiOt0jOo0nddWbpuvmAOYT8LIawJOL0MzWOuKfzqrD+kwsJYHnABTMRnZq21xz0Mi6+28FfL4+vXcQWjZqZ7k+R9xFCHamByD5f7aJltZZ2487A5KFLwpMloE9FExEOas2edGJ6LmiD0StSFHnvL8eVI/KxNoGHHEIJaPUte7sFNWDFr2IRoFI/hFW8rkFj+pdb3J11l/4AdJSINuKGXMWqa/NfvoEuN+K+smOuhqpzyEXg0EEmtg6dTJWRdMbN+TusrnLV0xFL+JT2cteA9FqvtMbajjcW9Cf+fQsHMr8N2kdnEz7R8dasJb+4ff0GniHL/7QzoS3DCqZWuc9I5VYrpCLLp5x6f9+ecdFcE3Vozk1zzTmWnhTQZZNABU4SgK6wBdD3/0UPEP49bZq9iWZNcyBKLC8RmNP0Hwos+4g5sOkejytLbQ3H+MQ00xEAIwgMKq4oZJaG71ZIpuXsrGQcU9U8vPLRxXxAZCHTzg+L24OWkegaCHcvPFvxpapp9+gf+iEalXlSKj1UsYj2XBGL0BwSBfoViqTGosWGcPoGTY/hfaDxnlxvDsmNGo7S3tLZ20FlXXPlFloYM7M0bBxf1UCrqCiaqTzv4xv1q9gRPK6joEkfwSQzTtP2NMrxj5cunpij2wY2VnLsHE/5fJ+F27Rifys+28D0GprKZb5mck5Y+n8CR0mb6eLmmRoP2pzyumlUPF0cvoMEEWzL3ehoc4OGKlLX9HW9+4KUAQ/1vKMSbnakAyqLXWR+0yU3koXFemQhJmP06CVdJtHw+iQ9Tce6zH6XaaKv6XXhv89Es/fIh+3uR6YPyqxVZG4P5CcgghLsttjvuGB8eqQR7d5GzJXjjP9YMp9vSrBgl1Eyvqf4cCV7FciJhVzX9BwaMiSX4MWvyoo0CxX+ZB3YaQbP5dz7IB4ZYjCRmZIYFMiY2aAGZN2GTzwRB9gVzxwGyyCHBJixGWKpC/kF1Mkn0GBWjSvYtqhGjN9y+ioIXQHGNPJb2wbQcieB/qsXa3h97KHZUMfUYeh8iiQWvza130HJCiH8D2VoDbXCDHY+EGQTk/rGYruyRQqaZXwd/dtnYYmsaIW9lB7BboF35WwoIFp40U6hquqianLTlo88Dx4qujG1LMPZUXNAdPt9hjXZyR0NbrtXsqBtHY/FG4mpR6psuZBW3LsEFIy3RNt55lFH5xRdn2it/5oVIYjZt+IKSbLE2Ytr8ffeo0DHqE2Lo2WvTBsov+AV8xZhRxGMFufBtt7IIH6t+tqMct/ksOu6AW3q36dl7HLdlD3MaMy64koIHVBfrxusTJ0qRprlPWYNWFAg28thIgA0m1qNIE/6zjRkLZvrFoKpRN4conyzfy6OOlFyLBp0E4Gli6oO0wWhW/xGwl3gi/CCFvm3KaFJRQcgoOvqAu8w0x6PAfu4BhzI2OeOUDGysmQ+jOypUw/mGQsMGTwd9VOtjdLN9vdhK+BXqn8XwPB5JKzdxhJrMwDErcyiJKPLI3vGDVHdG32OSj5tvlnjp+g5gMXJLnUoS9zgPUh+7qeLXHluLdSlFClXEa+Mg/sWpEY6clFQJ7gXA1R8aUuH5vZIhLUe1wwIYo0UwxmZaD9gz3nTbhq1iFk4TMUbLhfvaxGWHJzsx89IfmVohv2GUUIogzi/5ke+b/KJOdGZDLubBesSoWPigmoEy10r/Aj3jNty9E5DIHlsMQKL1af1T6QXrpWuRkDo48adUEFW0mcBQ9nLxKR0Ov8/CZ9FWxL+BZj8cNBgqjVa7E6FjsWYnb1gN0dtdTUzXR3r5S84KCzYVumC/Oy8x/bSsO/S2N9NABRfkzM0CY+aT+N+LNdmuMARdCG1EnIdW4U6CBy3Y79BqPmzZOmn1zFn4y2iqX3/iWqzS5J5A/W7uCX7aaAcfhKum4gjRtyQ5cToWETkUIVkbxg7AD0sEoH6HogdQwvLbBwTtaqXBTCTG63M9vskbzETp0HguOmcyvlAt23VM7Qcd8QIy9hqlQxhGgv0vVenitGkvVVvn/eL0E1cRg5UzMMJWOSPNXqH6AOg+K0he7w1YbMDdc+o6JKPkz0JesAJswDx5QF1tFvzBM8gfevDX0OkJe1zzSPR8D+OQOzlYWNlO1bHze1rKGHqJwghxj9PIaApWWAcPu2dDsjEkXJI2PNG08fxipBc1fdrA00LeXduC6pym8w6hhntnnuNqN5mFEgqWkICIlEyWc7F9wTkxU69iu1Mz9Lc6d33I5MnGMl989HOnAj8yaBifPldA6lpJz/YQCQTmLgh4Td36M2QtGJFSmAYG93fguy4YdJPV94E1qthtqOleDDpjMMq45k8UMAGAh4PaJF6uAM9niDSLJ6GFYoMzd7lGrWIoyyuwagtmL09lRRgn0Da/1dBQTW2kpbF7dJCPlyBELkyydET+SmAqwQvgJ7Q1gcUfQMpqGXJU2VJCRYh0qwmg2o33LBvkzSMmHwNF/bwmdjOL6ZohsPC4LdgqI/rtW0DTGSiZJIlKGjIE8lJCq2Pl5ZC5al0KX78vEGiCvD9c8Wb31JIehAMbIXzGc2VxM62gOeOeDmocyX+ByWI9RN7YijCWfk53iaQUTcWv6WofxE/FTdl0hyn0SxW/PyoAzQxaqNNBqVdjj6Bvz+IueTSmCUBBP8V+5V8GRo/NU5aly1mWlAITCCky/oiSeJy4YJlTbBLDCa94XQJYoBaZknEwnJpS239YRULM78kifGPwcpEzKcndUCyaKAlcKHLg9BhnATkNVxxybuRsHkHYefo/ddx2Mzpi886yFvGklHkN9+ZVojeuHBlYmco12GIkTYli0FFhb1oL5Zo/L6okUQ42kexy69ZwYbsxkbhtk4cH42EffOYs1nxI9rmpJ7HLyaoTmq7lZzYkcGMtmTOCLhS9DjHTryinA7DXs8Is1aDIHgFh2+xm1q+kVUV4MnjEanz8890ithVfnBAZNB6vF0SSaPMFaAV+Gk7cbFtI0JfNl9z9Kg6U8+Xj44vSKSriXV8At2J1bGD9jZ8gFyqYKsyKRWaJWktZMe7zLRv3R86B/Au0wFoozn4EJ7GV78dzPV/GL2NHpjOXsvztDwLPloU0s2Eq+lK8WXRNpR3rZJhglm/DSnaIYXi7i8ekvW89GHfxXHJn/BLxzRNgmDY8PUmNS9hJr2/O/YxeY2J5B4tbjWr5sltRJQlfMXJmDrPbGHmTbpZ8ms47IQh8C0enODotO02zCfcRSiImvy0kBiva8H3ttABPl32dMvX3WR8iEq7zvNF3rdVZb+ve8Sfjb63AsBN2curD2kTDqOCr8+RWRmjYc044xB9EinElZ3xz6OaA73ARwUWjsecoIOFu5mmJzP4rDs3uxKGy3op5Udeo0F/OOR8HREyUkuxDbEwQtSahWhXpK0z3D4d7ISDHbmpYZkNZpgzpBNkk5PsgUVs1E2h/P25DpvQn4IBiDLNn8J3tCyCOmRujlMT1GMJDlVFEq866IXVhCdldXtCvoKvZVLcKy8pH7p6sakboAt32N52Fw4XEmGDKJHnjkIN7Mtb2rqxOsAnCBqO1iNw0qyCwaHm1mw0BoktMDnB9y/y3xSe1avsLAJHKKMXwbeX6xlb/0DOVtOrURV5WA8OfSUmA+gkYd7VCKZo7dT3KzgKGiFoPUaKXIBMNkb7IXIgCNy/k1+A6IY8aR50nr/O9rWmCEG4/t9WXzRZ+0RyISGQkGYch7Pqgw/abatJ0oEIEZsKEPDuCu46rX5m31gg/SEx+E/gYm6o25wGdT97z7eNcb3skHbtLQOrasBbxxWf5QHoQnHzY8uTJeQ0G+5YqxmLFf5lT84mG7xe0CDCFUzAci+ZFx9CGoEbD8S9F8mqDjpUO4MEM4JyrPu049E3ln0gR7Z6MLVPd1Fti9zXhkUYo0VsWwwmsfFqWxbk8366oF1GYC8aqtipwhjSP785cPxIfFTaM6U2Iiv9ok+msPOtd0i6GpghV3wRXVMNAVHjRiqY9cLgD1J0mCZscd8wWdQOvzEGfU9hE/KbxAAWDF7+saN2SbjJ2cXdR8RkwSHQ1YQb1jSOx3lT8Bivrx4eA5wdGUOhSIxOtaEiWJE6KWkmaA//wAvI4NGMrFF6wVB8mCFlPHvTewCY92qqvMpWrvfgMkT5aWmXFqXnSPCxk30ntoApcWKSyqklKJ7y9TLDWVymgFIJyfdsIjARsgonIeXV9s+aYOJCfb5D+qu1dE8cA6YL8bNmR1pztJTpaazScwo/YIJ3+BgpfBID1ncnN6oq/jGS1CRWB+AAAAAAAAAAAAAAAAAAAAAAAABQsPFh8l" + } + }, + "fresh": { + "v": 1, + "kind": "aere-proof-of-data-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-data", + "sha256": "0xb77944195dabe43e90c675cc0cdf281a63bc642859b32f9779cd359d79d5d699", + "name": "conformance-fresh", + "createdAt": "2026-10-03T09:33:28.671Z" + }, + "statementHash": "0x542f165753e134e1969f43a50c88cf726db62358e5e1a5341c22570c1181377e" + }, + "receiptTx": { + "chainId": 28001, + "readAt": "2026-10-03T09:33:28.671Z", + "tx": { + "from": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "to": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "value": "0x58d15e176280000", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102" + }, + "txReceipt": { + "status": "0x1", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102" + } + }, + "dataset": { + "older": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 1, + "size": 12, + "logRoot": "0x513d3a071b8b56ce6d9d3d90ce4df590a9442330e8d52e249293a018935d3d64", + "createdAt": "2026-10-03T00:00:00.000Z", + "indexes": { + "age": { + "root": "0x8230b920edb9caf2223720db4b6550eab36ea116664a6b33726704711e0e3b44", + "size": 12 + }, + "country": { + "root": "0x4eec0d2495e0fe6ce17aad46e3d38058cba5f4ff88f0a565299b37cda61efba7", + "size": 12 + } + }, + "previous": null + }, + "newer": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 2, + "size": 16, + "logRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "createdAt": "2026-10-03T00:01:00.000Z", + "indexes": { + "age": { + "root": "0xfc641a2eadd7d876f9b4fe284dac094fb83543cf43a2c2f80e88f6d9e98114a7", + "size": 16 + }, + "country": { + "root": "0x5be9a95a39966382ab8d83179ae93380d723d49eff2f3b76a290a72a8ee60149", + "size": 16 + } + }, + "previous": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + }, + "record": { + "v": 1, + "kind": "aere-verifiable-record", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "i": 5, + "id": "r5", + "c": { + "age": "0x6dd1cb642a41c2d474dc7764232b79718e57c56a22c4db6aafbd5c9d76fb711f", + "country": "0xcb77a35d9ad17c99e38939e1462c261ad4143ec0acf3dd1257bfd5004027cc8f", + "email": "0x3d6ddf25d6991f89b1d02087e062407a2379c28c8284a3709e66d242de58dd59", + "note": "0xbfcf4fba3f6f3aad1fe3b28ab76cf7bb923006b80063dbbf29372cbd7c8a0e9e" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b0760847d3e4e33261605d29a686c37f" + }, + "age": { + "value": 55, + "salt": "5056c3b0bcfd665aefce9b421efb7826" + } + }, + "logProof": { + "index": 5, + "treeSize": 16, + "path": [ + "0x423f202599ef3d02b5f3ff547235afd8e222ed7c26c61a01e4c15de7e2f4948b", + "0xe31e82f61895c75f5648f82d79fcbb86486581e1b39baa636dc71eada3ba3452", + "0xb69d58d00d2681aae7d29aa7836c94b0f65e2d4847379b4ba09caec5762875ea", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + } + }, + "answer": { + "v": 1, + "kind": "aere-verifiable-query-answer", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "field": "age", + "from": 30, + "to": 45, + "indexSize": 16, + "rows": [ + { + "pos": 5, + "i": 13, + "id": "r13", + "c": { + "age": "0x20131967249ae0130154c3dbbcbe8ab041200b4499ed270f2c9dd2c2ac3337f1", + "country": "0xffa95ca2afb61e95d628c3044b6e80746cccc11642ad35dafc6445cd905facdf", + "email": "0x2e6bca63ef9fad9e3ef55ae60405914a01577abd1caf0403109608f3f95a3700", + "note": "0x668a33b811cf8989b6ce36f7681928dd43371ea394d67df6136fb1580977121b" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b5ffd792267cac392d9d814c7809b198" + }, + "age": { + "value": 31, + "salt": "314d5643f6f54376235b422614dd1562" + } + }, + "logProof": { + "index": 13, + "treeSize": 16, + "path": [ + "0xd3cbc725743f95177070e430cd03ec9f6af06bc64e84c0c84ad19e5d5562a983", + "0x85c6057fcfb4dd1d0fdfc0e4a925284def148b2ee0513c6858a29070aca4d50d", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 5, + "treeSize": 16, + "path": [ + "0xc4723e9eb2ff7168890f1a366b02d3ed1452ac476e98996cd0c91634af7423ed", + "0x15febe1a672c219d5d2f9fa007af3b5a9c3e7e47a61fe89875ae1cf60ebfb2df", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 6, + "i": 2, + "id": "r2", + "c": { + "age": "0xec15dd9b6e14956f9e3e9ea696f943972ab7601093c1c488ec18d40eb1431d42", + "country": "0x8d9e791776f47b5aeb079763edfdd40d26fc94742c8410a4f8d45e6ff1e901e6", + "email": "0xb9bfbcffff236803e9faabb11490ee1749c02a5566ae6e22380ae7dafc16322e", + "note": "0x86d1f7ae6700f8a22cb3c6a97b27d85d226beae6c4ca4c6eccd3e18b2fd85644" + }, + "disclosed": { + "country": { + "value": "FR", + "salt": "6a20a411bddb217e3ba890baad65b87e" + }, + "age": { + "value": 34, + "salt": "a83f62663d8735a83a784f603de20b88" + } + }, + "logProof": { + "index": 2, + "treeSize": 16, + "path": [ + "0x559b8f51f7b31a6feed18feeb876141c8a19af7f49169aee7a9833b59b65eaa2", + "0x6528250e72e30d47b6b47dcefaa225bcb9fc1af0d20ee827c331486083baac56", + "0xef30cdbdc0b6467d74313d8b22b2054e32a17b3a484121ccc24cb16d8ad6fec0", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + }, + "indexProof": { + "index": 6, + "treeSize": 16, + "path": [ + "0xdc9c9be2d7bc348acbd1cc004108f4af0386cec42492ae4fc3d62a9840d5f7bd", + "0x140d04bd298186a3efce73de4e3ea60f7f0300d21f2970efffc9f918ab004475", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 7, + "i": 8, + "id": "r8", + "c": { + "age": "0xc6b4096f4947760268564e73c3afb7edf8c31f1fe8a5371c85eeb606ac22ea25", + "country": "0x9b959d0dad5df75cf7f29a408750b730b9fc41403f4fc50168cc14ce2ca437ee", + "email": "0x598b4823a385d1f34c855b8bb873241bc66ddbd0a8f6b09d92cba14534454484", + "note": "0x4bd0762227e6c5d7f6ceac6185a23fe5075a33576dcd1e4e51aa9a4b0e0a1158" + }, + "disclosed": { + "country": { + "value": "RO", + "salt": "0a263d3e4223cc52f078c225a273e316" + }, + "age": { + "value": 36, + "salt": "bcb34a3f54db5f21299add6f1c654670" + } + }, + "logProof": { + "index": 8, + "treeSize": 16, + "path": [ + "0x7eb65d9a7f7ffa3039e627af43216d59accf7d3ca8a2951c2b0418c0199a1c9f", + "0x5290791446b6001dc5b5819d38d10ce762a0337736bbf8e90a111e8fe3c77efe", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 7, + "treeSize": 16, + "path": [ + "0x201009717c9f1fc80cd77e2a975390858ff4a4b76511bb7a31d36ea58bedeceb", + "0x140d04bd298186a3efce73de4e3ea60f7f0300d21f2970efffc9f918ab004475", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 8, + "i": 14, + "id": "r14", + "c": { + "age": "0x2a86b9afad1aff1234aa90bdf96095d07ef5d479992a9081c21adc965a3c20c3", + "country": "0xebd5ee1cac77bb2b170c930d964032218f9f9c69284c89b213dbefb2d54b8eee", + "email": "0xb9319475dca37efe658a39f9f7c10d13dd21a32276ec911dc57a2677a4e4bb50", + "note": "0x3fdbec96439422e50f7faabf111c8c8c2690460aad638b745a6875678fd38f34" + }, + "disclosed": { + "country": { + "value": "FR", + "salt": "15d426374424c484ffc8ae1bb736d960" + }, + "age": { + "value": 38, + "salt": "d750eb0354fb432536e3c26e5c682210" + } + }, + "logProof": { + "index": 14, + "treeSize": 16, + "path": [ + "0x12c9a4faf655bb09dbbb6a5fb3a24e44330e5d83222439ab2d2c2224c3791d84", + "0x1dd8a5c51c6218cb8ca3a57ee7683a06b1e94aaedc7252a6b296e4091c975377", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 8, + "treeSize": 16, + "path": [ + "0x9e4143c4b05ba68e176ae53bc5f122c1a490c3e1efeaa6bd9501110c5fb4d059", + "0xb3e51e807cccee32941e4d7009700ae40055645eb9e8bc6974ebe8ebf887a145", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 9, + "i": 3, + "id": "r3", + "c": { + "age": "0x13ec2a42a36e8b12ebdbd35af1d96962683a06b802e9e1f9e2e020487c691f7f", + "country": "0x1d18032f2e5acd907bffb4db2103b3d1d337388078ed9238a913c0cabecb928f", + "email": "0xe36f28b120650ba4c2597063b456d4d00847532129bd26dc8c150291265eef23", + "note": "0x086341fc0392c796d5f84f78f183deef347fa327e3d48707c460fc4d9c1f9910" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "0ee225e77747d7afafb81d1bffdf68c0" + }, + "age": { + "value": 41, + "salt": "9104931c19467233d902d1c967a15086" + } + }, + "logProof": { + "index": 3, + "treeSize": 16, + "path": [ + "0x5083ccb306cbefaa21d75b69a47668b0cd3943865500881281d96e05429face8", + "0x6528250e72e30d47b6b47dcefaa225bcb9fc1af0d20ee827c331486083baac56", + "0xef30cdbdc0b6467d74313d8b22b2054e32a17b3a484121ccc24cb16d8ad6fec0", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + }, + "indexProof": { + "index": 9, + "treeSize": 16, + "path": [ + "0xd0d85473c9adae91cb97fce47e564181ae990b38260de5efb1351e02ff9c3524", + "0xb3e51e807cccee32941e4d7009700ae40055645eb9e8bc6974ebe8ebf887a145", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 10, + "i": 9, + "id": "r9", + "c": { + "age": "0x1e440a3ce1d15a73c509b5b4da506157e42ac6cd8e96d486df66d049bfe8b8e6", + "country": "0xd5f75ca5ae34d41c6c6fe30f01061bec1260fd8fa9a134da20c616bd61b33428", + "email": "0x762b765d7cda44c06281ea75fea30bfc377adffe33d9df4ba065566f503ced67", + "note": "0x42b57a86fde59862104e06c5f9d7324e5edf2506e5c3874e0ae85e375ec46cdb" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b0371c1e4117eab6e65f46c8e7dd9b5c" + }, + "age": { + "value": 43, + "salt": "994a5723c379b33784b813642d91bca5" + } + }, + "logProof": { + "index": 9, + "treeSize": 16, + "path": [ + "0x65c032449d009130a92eb4bfc7a17fe17e0256c141a980d56ef6f7acc5ea65c1", + "0x5290791446b6001dc5b5819d38d10ce762a0337736bbf8e90a111e8fe3c77efe", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 10, + "treeSize": 16, + "path": [ + "0xccb00a519667f5206d54663c1449cfe26d2a69a21b58934e639d7fa5274a610b", + "0x59b6ac5d90106bce7337c4bbb3a25828e76f9fa97e001caee65d2540dad98ef0", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 11, + "i": 15, + "id": "r15", + "c": { + "age": "0x3e1980c7f773e302e4f9bf175e8edec38a53da7f2e46a5e371a77d57842c02fb", + "country": "0x1919bce313ba6d86fc4bf751e1f67b0a39b699615086212681149ff62c0885cf", + "email": "0x8c8c71ef8dd79da410a4cfc25639ea6119cbdd02c031eaa3ee9d661c65ba9aea", + "note": "0x2b31e8289c6fa63c019472defa0f58b1aad47fb3ff63a99484ddf9b95d3a3bd5" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "2e559c28fa7a80ed4f38fa8b45f2c82e" + }, + "age": { + "value": 45, + "salt": "ddef75f62d6301533303c7876d013294" + } + }, + "logProof": { + "index": 15, + "treeSize": 16, + "path": [ + "0x7bfd292a9ed546f18580c5251b801dc2756d80ab29a3c64eb0b81433a313307f", + "0x1dd8a5c51c6218cb8ca3a57ee7683a06b1e94aaedc7252a6b296e4091c975377", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 11, + "treeSize": 16, + "path": [ + "0x7144d8a6be6e7645cd0c8b69f028fc16b10e4f17fa86296a23c261922d75753e", + "0x59b6ac5d90106bce7337c4bbb3a25828e76f9fa97e001caee65d2540dad98ef0", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + } + ], + "before": { + "pos": 4, + "value": 29, + "i": 7, + "recordLeaf": "0xabbddf51854536b5605dc7c0630fd2fa170d2dcd9b1c5312aec6fea74c038c0d", + "indexProof": { + "index": 4, + "treeSize": 16, + "path": [ + "0x30a0dd012169393d0dea8791c0f24d70cc8d4c70d088f420825ec0dbf9230f67", + "0x15febe1a672c219d5d2f9fa007af3b5a9c3e7e47a61fe89875ae1cf60ebfb2df", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + "after": { + "pos": 12, + "value": 48, + "i": 4, + "recordLeaf": "0x423f202599ef3d02b5f3ff547235afd8e222ed7c26c61a01e4c15de7e2f4948b", + "indexProof": { + "index": 12, + "treeSize": 16, + "path": [ + "0x6e97bf24fed1277d34cc86719a8f63aab95067adfa7c5a6e70bde9daf8870f47", + "0x775811db8d2472f42cad2aeebbc3826f5f959e1f174501ca8ab4380ad815702a", + "0xec4bd620657cb68e435f6d2a71199370056c925b6184624a743fe49d818e9370", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + } + }, + "consistency": { + "v": 1, + "kind": "aere-verifiable-consistency", + "name": "conformance", + "from": { + "version": 1, + "commitmentHash": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + }, + "to": { + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d" + }, + "proof": { + "firstSize": 12, + "secondSize": 16, + "firstRoot": "0x513d3a071b8b56ce6d9d3d90ce4df590a9442330e8d52e249293a018935d3d64", + "secondRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "path": [ + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + } + }, + "sample": { + "k": 4, + "seed": "conformance-sample", + "served": { + "3": { + "v": 1, + "kind": "aere-verifiable-record", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "i": 3, + "id": "r3", + "c": { + "age": "0x13ec2a42a36e8b12ebdbd35af1d96962683a06b802e9e1f9e2e020487c691f7f", + "country": "0x1d18032f2e5acd907bffb4db2103b3d1d337388078ed9238a913c0cabecb928f", + "email": "0xe36f28b120650ba4c2597063b456d4d00847532129bd26dc8c150291265eef23", + "note": "0x086341fc0392c796d5f84f78f183deef347fa327e3d48707c460fc4d9c1f9910" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "0ee225e77747d7afafb81d1bffdf68c0" + } + }, + "logProof": { + "index": 3, + "treeSize": 16, + "path": [ + "0x5083ccb306cbefaa21d75b69a47668b0cd3943865500881281d96e05429face8", + "0x6528250e72e30d47b6b47dcefaa225bcb9fc1af0d20ee827c331486083baac56", + "0xef30cdbdc0b6467d74313d8b22b2054e32a17b3a484121ccc24cb16d8ad6fec0", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + } + }, + "7": { + "v": 1, + "kind": "aere-verifiable-record", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "i": 7, + "id": "r7", + "c": { + "age": "0xa1a74e2ac07bab6c41c2556b844aae64857449195ceac53645c629516238b344", + "country": "0xcc9aab9315438cb08ca38170956cb46c872df70d01652b24c09f8863300e6196", + "email": "0xa90cedaf1e40181e97badd77834f7ad7941cc0d185884b625f260b6843f21aae", + "note": "0xcdc993d68c62518d20dddb06072d1f2d576c80a87f33cafdbdfb64d73e78ef51" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "985bd39a58f95e5356f853a164382b93" + } + }, + "logProof": { + "index": 7, + "treeSize": 16, + "path": [ + "0x1834d4378c03e4b8303175bcb26d1d8004e2228abcb445a35a1add3901ed7af0", + "0xba1730442baeb4246d80e34e1200df5dfecce1c52067e73850f131a1193eefc1", + "0xb69d58d00d2681aae7d29aa7836c94b0f65e2d4847379b4ba09caec5762875ea", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + } + }, + "12": { + "v": 1, + "kind": "aere-verifiable-record", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "i": 12, + "id": "r12", + "c": { + "age": "0x090dd84053907e69b2d2a99757f1a0e248d270d57fa8f442d20f9ecefef019c8", + "country": "0xa383f5cce4bec2b3d87ba7689f05af77bb0060b247c69ccd2cf64231592cd33a", + "email": "0x72559f17dfc692e8f3a8ceaa63727e94860120fe26e40bd5e81bccc7d0a836e4", + "note": "0x89a3d01a0711b2bc1697ec4cb82ca0dc4bcd5bc17bb7b10f22623f579833df54" + }, + "disclosed": { + "country": { + "value": "RO", + "salt": "2acf87c71b169c498b2cbd745469589a" + } + }, + "logProof": { + "index": 12, + "treeSize": 16, + "path": [ + "0xc383e9a1e188c33996ec8ed77bb82230a72a4f52facef6bb31482535a09c30e0", + "0x85c6057fcfb4dd1d0fdfc0e4a925284def148b2ee0513c6858a29070aca4d50d", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + } + }, + "14": { + "v": 1, + "kind": "aere-verifiable-record", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "i": 14, + "id": "r14", + "c": { + "age": "0x2a86b9afad1aff1234aa90bdf96095d07ef5d479992a9081c21adc965a3c20c3", + "country": "0xebd5ee1cac77bb2b170c930d964032218f9f9c69284c89b213dbefb2d54b8eee", + "email": "0xb9319475dca37efe658a39f9f7c10d13dd21a32276ec911dc57a2677a4e4bb50", + "note": "0x3fdbec96439422e50f7faabf111c8c8c2690460aad638b745a6875678fd38f34" + }, + "disclosed": { + "country": { + "value": "FR", + "salt": "15d426374424c484ffc8ae1bb736d960" + } + }, + "logProof": { + "index": 14, + "treeSize": 16, + "path": [ + "0x12c9a4faf655bb09dbbb6a5fb3a24e44330e5d83222439ab2d2c2224c3791d84", + "0x1dd8a5c51c6218cb8ca3a57ee7683a06b1e94aaedc7252a6b296e4091c975377", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + } + } + } + } + } +} diff --git a/conformance/vectori/INDEX.json b/conformance/vectori/INDEX.json new file mode 100644 index 0000000..6935ab2 --- /dev/null +++ b/conformance/vectori/INDEX.json @@ -0,0 +1,1044 @@ +{ + "v": 1, + "kind": "aere-conformance-vector-index", + "count": 122, + "artifacts": { + "envelope": 54, + "payment-risk": 11, + "payment-receipt": 10, + "market-timeline": 25, + "dataset-record": 6, + "dataset-answer": 11, + "dataset-consistency": 3, + "dataset-sample": 2 + }, + "offline": 117, + "online": 5, + "rules": { + "dataset.commitment": [ + "dataset-record/r5.commitment", + "dataset-answer/age-30-45.commitment", + "dataset-answer/age-30-45.index-size", + "dataset-consistency/v1-v2.commitment" + ], + "dataset.completeness": [ + "dataset-answer/age-30-45.completeness", + "dataset-answer/age-30-45.completeness-last", + "dataset-answer/age-30-45.completeness-first" + ], + "dataset.consistency": [ + "dataset-consistency/v1-v2.consistency" + ], + "dataset.field": [ + "dataset-record/r5.field", + "dataset-record/r5.field-no-salt" + ], + "dataset.form": [ + "dataset-record/r5.form" + ], + "dataset.inclusion": [ + "dataset-record/r5.inclusion" + ], + "dataset.index": [ + "dataset-answer/age-30-45.index-undisclosed", + "dataset-answer/age-30-45.index" + ], + "dataset.order": [ + "dataset-answer/two-records.order" + ], + "dataset.range": [ + "dataset-answer/age-30-45.range" + ], + "dataset.sample": [ + "dataset-sample/four-of-sixteen.sample" + ], + "envelope.finality": [ + "envelope/fresh-28001.finality" + ], + "envelope.form": [ + "envelope/data.form", + "envelope/execution.form", + "envelope/identity.form", + "envelope/compliance.form", + "envelope/runtime.form", + "envelope/location.form", + "envelope/device.form", + "envelope/payment.form", + "envelope/ownership.form", + "envelope/time.form", + "envelope/block.form", + "envelope/authorization.form", + "envelope/settlement.form", + "envelope/provenance.form", + "envelope/ai.form", + "envelope/agent-decision.form" + ], + "envelope.integrity": [ + "envelope/data.integrity", + "envelope/execution.integrity", + "envelope/identity.integrity", + "envelope/compliance.integrity", + "envelope/runtime.integrity", + "envelope/location.integrity", + "envelope/device.integrity", + "envelope/payment.integrity", + "envelope/ownership.integrity", + "envelope/time.integrity", + "envelope/block.integrity", + "envelope/authorization.integrity", + "envelope/settlement.integrity", + "envelope/provenance.integrity", + "envelope/ai.integrity", + "envelope/agent-decision.integrity", + "market-timeline/s1.proof-other-result" + ], + "envelope.signature": [ + "envelope/signed-head.signature" + ], + "market.arbiter": [ + "market-timeline/s2.arbiter", + "market-timeline/s3.arbiter-no-dispute" + ], + "market.complete": [ + "market-timeline/s3.arbiter-no-dispute", + "market-timeline/s4.complete-claim", + "market-timeline/s1.complete-submission" + ], + "market.deadline": [ + "market-timeline/s2.deadline-submitted", + "market-timeline/s4.deadline", + "market-timeline/s1.deadline" + ], + "market.form": [ + "market-timeline/s5.form" + ], + "market.payout": [ + "market-timeline/s2.payout", + "market-timeline/s3.payout", + "market-timeline/s4.payout" + ], + "market.posting": [ + "market-timeline/s2.posting" + ], + "market.proof": [ + "market-timeline/s1.proof-late", + "market-timeline/s1.proof-other-result" + ], + "market.replay": [ + "market-timeline/s3.replay" + ], + "market.result": [ + "market-timeline/s2.result" + ], + "market.window": [ + "market-timeline/s2.window", + "market-timeline/s1.window" + ], + "receipt.amount": [ + "payment-receipt/company-p1.amount" + ], + "receipt.binding": [ + "payment-receipt/company-p1.binding" + ], + "receipt.chain": [ + "payment-receipt/company-p1.chain" + ], + "receipt.policy": [ + "payment-receipt/company-p1.policy" + ], + "receipt.risk": [ + "payment-receipt/company-p1.policy", + "payment-receipt/company-p1.risk", + "payment-receipt/company-p1.risk-other-payment", + "payment-receipt/company-p1.risk-other-rate" + ], + "risk.asset": [ + "payment-risk/company-p1.asset" + ], + "risk.counterparty": [ + "payment-risk/company-p1.counterparty" + ], + "risk.form": [ + "payment-risk/company-p1.form", + "payment-risk/company-p1.form-amount", + "payment-risk/company-p1.form-time", + "payment-risk/company-p1.form-history" + ], + "risk.limit": [ + "payment-risk/company-p1.limit" + ], + "risk.rate": [ + "payment-risk/company-p1.rate", + "payment-risk/company-p1.rate-number" + ], + "risk.window": [ + "payment-risk/company-p1.window" + ] + }, + "vectors": [ + { + "id": "envelope/data.valid", + "artifact": "envelope", + "verdict": "VALID", + "requires": [], + "sha256": "0x7f1b33900be4fe79cf7b17fbb7a0a29e841b33d91e108ac70234c1c6953d339a" + }, + { + "id": "envelope/data.form", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0x7545400ec21cb1b97037700621f509f04d46dfc02ec08f8479ceace5cf8b21b1" + }, + { + "id": "envelope/data.integrity", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0x8b90678bf03cd5375f7c9f01c146361982652fc14265120813cbc61866cee261" + }, + { + "id": "envelope/execution.valid", + "artifact": "envelope", + "verdict": "VALID", + "requires": [], + "sha256": "0x515475eae544bd0c0465dbae4c24ecc0a441aad44f635eccff6f2c910aa65905" + }, + { + "id": "envelope/execution.form", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0xb1c40c3b38084c540bc70000fde3066e318f48f434ef6b84126afbd4789fd0a3" + }, + { + "id": "envelope/execution.integrity", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0x8097c39dfa488fb235789fa6914f9950a92bee3d6afd54438c00c340a718dd23" + }, + { + "id": "envelope/identity.valid", + "artifact": "envelope", + "verdict": "VALID", + "requires": [], + "sha256": "0x1762307de5ffbb32112991923139d0fb483fcf8b931284f9a1ad722b48b5ff4d" + }, + { + "id": "envelope/identity.form", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0x8cfb265b04fc0f594b5674325c195501cb8d638bb9b871f8758740f2eb6a0ba5" + }, + { + "id": "envelope/identity.integrity", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0x5dc9b78d1c18f41864705022064da9bd7d65ac101aff55c0e6a9fa62f9f1d550" + }, + { + "id": "envelope/compliance.valid", + "artifact": "envelope", + "verdict": "VALID", + "requires": [], + "sha256": "0xba3d9c117f4026bdea0fe5ff47c1027eaf9ac18922ce0ae2a1a28077794829da" + }, + { + "id": "envelope/compliance.form", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0x62f7a4a0aae55b49436057fef69e14fc7e8dc01e452ecb4b739c99894a07eb9e" + }, + { + "id": "envelope/compliance.integrity", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0x76d7bdff2a662106e2272203d2b9f918fcd8358e9ed180419d6173ab4fd07e3e" + }, + { + "id": "envelope/runtime.valid", + "artifact": "envelope", + "verdict": "VALID", + "requires": [], + "sha256": "0x2e2bca419082af752b7a9660b5fadc5de25f6d999ae75d69aa3c938a87505a66" + }, + { + "id": "envelope/runtime.form", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0xc697c7687c1988eee5ade7d264df232aeafc4400c826de0b39ac374f399ceba0" + }, + { + "id": "envelope/runtime.integrity", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0xae8a24d292fb99f47ecc38c7d4cf6914c967dfdaefb8e0248aa8839a4f5fae57" + }, + { + "id": "envelope/location.valid", + "artifact": "envelope", + "verdict": "VALID", + "requires": [], + "sha256": "0x045b28f14fa0ea492ec5e39f0817c54d24139a0f89c4717d0e976de37724e280" + }, + { + "id": "envelope/location.form", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0x1210e24deff93a5594ede8f92b75d424fd68d615f25c1f594bde4da4be790f1a" + }, + { + "id": "envelope/location.integrity", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0xc1321de813ec1e44da1fceb4c3826231dc25b39417236a1948abb21578ea4d7c" + }, + { + "id": "envelope/device.valid", + "artifact": "envelope", + "verdict": "VALID", + "requires": [], + "sha256": "0xa018bdcec72a25e71028bddddba86ed8841b5881038747e0c29c9b9f51bd7b68" + }, + { + "id": "envelope/device.form", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0x5c00dfdff6fca05e8cb3e7f57ff928a5324b86a6d2013a31b950635337a9eb89" + }, + { + "id": "envelope/device.integrity", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0x04c6ea28fe557d4cc72de80b773a735c94f361faae345373d57a76e38071ce78" + }, + { + "id": "envelope/payment.valid", + "artifact": "envelope", + "verdict": "VALID", + "requires": [], + "sha256": "0xd5225e273bfac5ccbac1f0510eaa98f2be89a9bf01e3c892511dab044f6affce" + }, + { + "id": "envelope/payment.form", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0xb64cd13c951cb16e60a6e0484a227cc6e31f83e4284182989bb73fda859e7778" + }, + { + "id": "envelope/payment.integrity", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0x221e8a5b77c1fe4d5ffb17354df5ad3c2a6e456eb5b4f0b911b143e1bb32d327" + }, + { + "id": "envelope/ownership.valid", + "artifact": "envelope", + "verdict": "VALID", + "requires": [], + "sha256": "0x508e0fcbbaa30ee2df46a28b608b656df663c1c9e4ea320c31d3d9e1f860c66e" + }, + { + "id": "envelope/ownership.form", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0xe1b32b71b889e970eca12fe7d53405ee4ecc705ba2c0129c67a9fd908856c439" + }, + { + "id": "envelope/ownership.integrity", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0x60f34b7e7b6732431fed3cca804db97157f40eb6959e6289960b93b9bfa58b0d" + }, + { + "id": "envelope/time.valid", + "artifact": "envelope", + "verdict": "VALID", + "requires": [], + "sha256": "0xad5b809734428e60a9ce9250c33a1c1b0825743baf96bd4e2dadac1978c34a36" + }, + { + "id": "envelope/time.form", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0x295d33eac95634b7a950c008c2e80dd434bb0949d0631c58a6aa6fc01ddc1229" + }, + { + "id": "envelope/time.integrity", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0x9e6d1dbf1341e2b274f981bd21f6ac663b19f70e888aee7cefcbbcfa0022e5f0" + }, + { + "id": "envelope/block.valid", + "artifact": "envelope", + "verdict": "VALID", + "requires": [], + "sha256": "0x7646634630ca18fedad721154bf9ad81f004318e21aab64e4af9ce21d9313eca" + }, + { + "id": "envelope/block.form", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0x89739a29dfa64898a519af6c0d9b0c6bf117a153dcf9f8a5589a75a0de6c78ec" + }, + { + "id": "envelope/block.integrity", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0x5f4b2641fee2e74ee5c4686330c9bbf82973446c4c0190fea125114ee9e3d325" + }, + { + "id": "envelope/authorization.valid", + "artifact": "envelope", + "verdict": "VALID", + "requires": [], + "sha256": "0x7bb71df656cc1c4d6dd1d1468c2af7ec07547d73cfddaac6603fbaae6a19f714" + }, + { + "id": "envelope/authorization.form", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0xce3623d2a15b4a9aa1a59cf4749a6d69cbcd95f50521739f46bcdc511ac519e1" + }, + { + "id": "envelope/authorization.integrity", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0x727f78309267411c9500a8e074abea52fea0b5b42dedfd9099f3e7a70ac4ea77" + }, + { + "id": "envelope/settlement.valid", + "artifact": "envelope", + "verdict": "VALID", + "requires": [], + "sha256": "0xe2d96a85013d3a298a9f1933dd6802dc1ee4aa8f31bcca197e4986df8f16d0ad" + }, + { + "id": "envelope/settlement.form", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0xebdfb8c3b446f11011f35e2876f32938cd28b78535b123311994c1cc796fee42" + }, + { + "id": "envelope/settlement.integrity", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0x043a2c631eabe18c7feb86b5f0cb26f1c0d31890d74ff47eb6f9128a17ca83f6" + }, + { + "id": "envelope/provenance.valid", + "artifact": "envelope", + "verdict": "VALID", + "requires": [], + "sha256": "0xf5af287cd62aeb2bcf0537fbafa0a1183b7223fedb81c4afc84ce21daa07be77" + }, + { + "id": "envelope/provenance.form", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0xec862a5cb0ae540c7880324f2ebdaf2e8c5dd30683e24d961aeaee7a9e15e076" + }, + { + "id": "envelope/provenance.integrity", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0x126385bf75da4c67060bcf60827be429240efc0f7178ab47100c3d9cb7297a78" + }, + { + "id": "envelope/ai.valid", + "artifact": "envelope", + "verdict": "VALID", + "requires": [], + "sha256": "0xa341675698021b32fe439f7378779fd6f5e80e1ae81a0a6e4a3df6b48821439d" + }, + { + "id": "envelope/ai.form", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0x4ddf3c181b80b41d7e515c07a40b06a705970101ee2de40ea45c673f58655490" + }, + { + "id": "envelope/ai.integrity", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0x923aa12b1072560c3850bf3596f36a6f3b5280e1ab5d012e48c2b4d9f64882b7" + }, + { + "id": "envelope/agent-decision.valid", + "artifact": "envelope", + "verdict": "VALID", + "requires": [], + "sha256": "0x315f9c9e8756f6767c049a1e746dfa30a3011ae16142cfc8809db008bf8232e4" + }, + { + "id": "envelope/agent-decision.form", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0xa28ca423eabbe55bd7b9ad0ddf2371dec737de6504f0b2d333c3d55146e0f699" + }, + { + "id": "envelope/agent-decision.integrity", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0x9fcc3e1e6f7f942c0b6909ad195011270e5b21306a0ea72afcee7ddb39eecab7" + }, + { + "id": "envelope/signed-head.valid", + "artifact": "envelope", + "verdict": "VALID", + "requires": [], + "sha256": "0xc6236f69ac7a516598278a9bd12d15a7a7bd7e9537986b8756db3b0a05358de2" + }, + { + "id": "envelope/signed-head.signature", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [], + "sha256": "0x9925a22bb9dd7e06f8677699a49dfc82a85d5dd75472ca9d8a829920c83914c1" + }, + { + "id": "envelope/notarized-28001.valid", + "artifact": "envelope", + "verdict": "VALID", + "requires": [ + "rpc-28001" + ], + "sha256": "0xb687ed871560f0e2be0216409ac55f700b8456857bd6f1115584fe83444de87f" + }, + { + "id": "envelope/notarized-claim.partial", + "artifact": "envelope", + "verdict": "PARTIAL", + "requires": [], + "sha256": "0xaab1e5841ec840441dcebb32c9cbf6c4f07679a956ac3bea48d475380c78f5f6" + }, + { + "id": "envelope/fresh-28001.valid", + "artifact": "envelope", + "verdict": "VALID", + "requires": [ + "rpc-28001" + ], + "sha256": "0x55bbfe59822ab260b334a8c596ac43c5474504ea10ac59a78ea772d0dca89d67" + }, + { + "id": "envelope/fresh-28001.finality", + "artifact": "envelope", + "verdict": "INVALID", + "requires": [ + "rpc-28001" + ], + "sha256": "0x8da89f5245c042b7c3ceefd22f436e0be4124579cb2b92e8259520cabb4ad7ef" + }, + { + "id": "payment-risk/company-p1.valid", + "artifact": "payment-risk", + "verdict": "VALID", + "requires": [], + "sha256": "0x4864cd4b8be5d5621e60b85ed9d3274a0216117b64a801b87e7521714faceeb3" + }, + { + "id": "payment-risk/company-p1.form", + "artifact": "payment-risk", + "verdict": "INVALID", + "requires": [], + "sha256": "0x0c453c56e023239a02b77acde75f87307477d108c4bec2e5d32603919910896c" + }, + { + "id": "payment-risk/company-p1.form-amount", + "artifact": "payment-risk", + "verdict": "INVALID", + "requires": [], + "sha256": "0xc8ff412f28703eba1af2eed29ca04611e48fb6fc36be17293756b51182b2fdc7" + }, + { + "id": "payment-risk/company-p1.form-time", + "artifact": "payment-risk", + "verdict": "INVALID", + "requires": [], + "sha256": "0xd4a14bb351f4f98e4f1a7d2e131a9a8ad0601f9575c8971f2ae2c664014d64f9" + }, + { + "id": "payment-risk/company-p1.form-history", + "artifact": "payment-risk", + "verdict": "INVALID", + "requires": [], + "sha256": "0x3e05062a007c3419ba75e6282724f138bc2a074789a19e8727ce707792724a70" + }, + { + "id": "payment-risk/company-p1.asset", + "artifact": "payment-risk", + "verdict": "INVALID", + "requires": [], + "sha256": "0x6033f1a232eb7784ab6a25320d9cf04c0d78406e01d1cf822312e1c0b9bcfc43" + }, + { + "id": "payment-risk/company-p1.counterparty", + "artifact": "payment-risk", + "verdict": "INVALID", + "requires": [], + "sha256": "0xe6e1df1ee4649df9bee551156d946ce90445be81d4b999ee2eebe8d4eb9bb960" + }, + { + "id": "payment-risk/company-p1.rate", + "artifact": "payment-risk", + "verdict": "INVALID", + "requires": [], + "sha256": "0x6bf6e302c0b6e7bbcad9bdd92613c5aad961cddcd321cc217fd2f72a7311941c" + }, + { + "id": "payment-risk/company-p1.rate-number", + "artifact": "payment-risk", + "verdict": "INVALID", + "requires": [], + "sha256": "0xc13e5136e770bca7adb25dde94a9dda7fe971ef86fd95487c9647db629b71d28" + }, + { + "id": "payment-risk/company-p1.limit", + "artifact": "payment-risk", + "verdict": "INVALID", + "requires": [], + "sha256": "0x76f42ea0a4cf5d2986346bee3abf18fb68859d5d725506cc6f831d25d2716417" + }, + { + "id": "payment-risk/company-p1.window", + "artifact": "payment-risk", + "verdict": "INVALID", + "requires": [], + "sha256": "0x24d0fd90f612d4dbfc1031970cc811e06e66ac95c011591f0b9a9edf507df494" + }, + { + "id": "payment-receipt/company-p1.valid", + "artifact": "payment-receipt", + "verdict": "VALID", + "requires": [], + "sha256": "0xf14a9cefbf32566273b1f377725e193ce68f02423bc3434069f9565c12172117" + }, + { + "id": "payment-receipt/company-p1.binding", + "artifact": "payment-receipt", + "verdict": "INVALID", + "requires": [], + "sha256": "0xf317f47a304bf8475c8d2dc6a9af85806e73b540829d25323d980f76c69864db" + }, + { + "id": "payment-receipt/company-p1.policy", + "artifact": "payment-receipt", + "verdict": "INVALID", + "requires": [], + "sha256": "0xf7ca3a80cb2bef53129b4ad10100c7c2609e5c98d6cf9468acfaad30ab93ea3c" + }, + { + "id": "payment-receipt/company-p1.risk", + "artifact": "payment-receipt", + "verdict": "INVALID", + "requires": [], + "sha256": "0x963f97c9ec123e0cb7eb981bc52d98674fa814009328fbc05c167e3c37b7492b" + }, + { + "id": "payment-receipt/company-p1.chain", + "artifact": "payment-receipt", + "verdict": "INVALID", + "requires": [], + "sha256": "0x12f17bbb5d9e900622a1bd7e7f425c8534f649ad2184d139202739ec7854d856" + }, + { + "id": "payment-receipt/company-p1.amount", + "artifact": "payment-receipt", + "verdict": "INVALID", + "requires": [], + "sha256": "0x0aee67afea9ce328a96b5536e71419e3842e81188a208d555bfc65ee54011e69" + }, + { + "id": "payment-receipt/company-p1.risk-other-payment", + "artifact": "payment-receipt", + "verdict": "INVALID", + "requires": [], + "sha256": "0xa89b9b5daaf655be38d0a8605de84da0d08817fdb67b047ccd1976eb5c094679" + }, + { + "id": "payment-receipt/company-p1.risk-other-rate", + "artifact": "payment-receipt", + "verdict": "INVALID", + "requires": [], + "sha256": "0x2717febc39798ddb4e698d64e91406dd8065d2ffbf03958035677ac60f3f7e0c" + }, + { + "id": "payment-receipt/company-p1-claim.partial", + "artifact": "payment-receipt", + "verdict": "PARTIAL", + "requires": [], + "sha256": "0x58466eaf58820fca43b9a4d4d863e3bbc4477d16c089b4a4cd8f3b44c8755279" + }, + { + "id": "payment-receipt/company-p1-28001.valid", + "artifact": "payment-receipt", + "verdict": "VALID", + "requires": [ + "rpc-28001" + ], + "sha256": "0x861bf7228e8c3d9ba02c68a7d23f594a14249b823f84732e3c6ee4ce2dc004c1" + }, + { + "id": "market-timeline/s2-slashed.valid", + "artifact": "market-timeline", + "verdict": "VALID", + "requires": [], + "sha256": "0xbb63fa00b531b0ad95080325effcabedc308b185dcd7bde95d819bc9b0c29b4a" + }, + { + "id": "market-timeline/s3-paid-after-dispute.valid", + "artifact": "market-timeline", + "verdict": "VALID", + "requires": [], + "sha256": "0x56e0388280641edea11c1e8e8b17bdba2ac4314fd1a5404775bc6c7c5ab27d00" + }, + { + "id": "market-timeline/s3-paid-after-dispute-replayed.valid", + "artifact": "market-timeline", + "verdict": "VALID", + "requires": [], + "sha256": "0xb760c3590a46de07c6550fdcdd96593bc6648adbd1baf2aaaeead81556cb8b2b" + }, + { + "id": "market-timeline/s4-refunded-expired.valid", + "artifact": "market-timeline", + "verdict": "VALID", + "requires": [], + "sha256": "0xfa2d7a33ebd395356252fac17fbde8e6c25a689df4cb805092fbfcf1dcea6dbd" + }, + { + "id": "market-timeline/s5-refunded-cancelled.valid", + "artifact": "market-timeline", + "verdict": "VALID", + "requires": [], + "sha256": "0xc0ecb1d4950998416627fc5ffa97ec6df0d581c6fdb65c9b70a72717e7dfa070" + }, + { + "id": "market-timeline/s1-paid-claim.partial", + "artifact": "market-timeline", + "verdict": "PARTIAL", + "requires": [], + "sha256": "0x37be857140b8c359fdc71c6f963dc2be8ddfba66af06068cd0a12216fe1a17fa" + }, + { + "id": "market-timeline/s1-paid-28001.valid", + "artifact": "market-timeline", + "verdict": "VALID", + "requires": [ + "rpc-28001" + ], + "sha256": "0x5e1393d10e547566f3e086353e520ca0effbf36f5030815ecf9015efb17f16f8" + }, + { + "id": "market-timeline/s2.posting", + "artifact": "market-timeline", + "verdict": "INVALID", + "requires": [], + "sha256": "0xabbc8fe4e4c0bb4a7942030274dd52f709cd6a0c01af8c5ba5f66ba67beec803" + }, + { + "id": "market-timeline/s2.window", + "artifact": "market-timeline", + "verdict": "INVALID", + "requires": [], + "sha256": "0xd4fd82d26d46ba821f4ec358e68455a37dbfb46edeecb6ca4d01816809318797" + }, + { + "id": "market-timeline/s2.deadline-submitted", + "artifact": "market-timeline", + "verdict": "INVALID", + "requires": [], + "sha256": "0x3ab1c1750da5af6598715c720d3a02c53c04b99d487c8371d39b17792626e28e" + }, + { + "id": "market-timeline/s2.arbiter", + "artifact": "market-timeline", + "verdict": "INVALID", + "requires": [], + "sha256": "0x7d2d621087b5c43197384c33ba3253de053b7b8e7fbb7c4c24aad34c331f24ee" + }, + { + "id": "market-timeline/s2.payout", + "artifact": "market-timeline", + "verdict": "INVALID", + "requires": [], + "sha256": "0xcf77d3a14bdfeedd47b13802e45fa036c53e1f38f6096c0b7ec130bd624ff252" + }, + { + "id": "market-timeline/s2.result", + "artifact": "market-timeline", + "verdict": "INVALID", + "requires": [], + "sha256": "0x6f88a0431ac01314273f6a5ddf65513c421b737e1579f163ec463f5ff5782774" + }, + { + "id": "market-timeline/s3.payout", + "artifact": "market-timeline", + "verdict": "INVALID", + "requires": [], + "sha256": "0xd2d5145d5fb947c105232e78b1543e4692d97f7e11ee82d87ad0efffe9c4971c" + }, + { + "id": "market-timeline/s3.arbiter-no-dispute", + "artifact": "market-timeline", + "verdict": "INVALID", + "requires": [], + "sha256": "0xdfe8e62c763c4336a4f2be3fd885504dbef7fe951be968d24b29dfc9dad5d4fe" + }, + { + "id": "market-timeline/s3.replay", + "artifact": "market-timeline", + "verdict": "INVALID", + "requires": [], + "sha256": "0x9925c08b4b8375e3e14ae3fbdae851f627e1bd122443634c5ec821a631c31e52" + }, + { + "id": "market-timeline/s4.deadline", + "artifact": "market-timeline", + "verdict": "INVALID", + "requires": [], + "sha256": "0xd2ed4588b78561c83b016be97552dee1b2c33ac0620225b168c36d875feed1e7" + }, + { + "id": "market-timeline/s4.complete-claim", + "artifact": "market-timeline", + "verdict": "INVALID", + "requires": [], + "sha256": "0x3899c8b06cea426541c31501cf1f4833001f77a6c372dca4b14f4fc248b96950" + }, + { + "id": "market-timeline/s4.payout", + "artifact": "market-timeline", + "verdict": "INVALID", + "requires": [], + "sha256": "0x1c7da740cd2a59576738af13875a3505ad1ddbd4ea563cb5f4547be071547360" + }, + { + "id": "market-timeline/s5.form", + "artifact": "market-timeline", + "verdict": "INVALID", + "requires": [], + "sha256": "0xe05983782942efb1da51d93f4faa5091bd0988b832478584eda5dd60197e4ca9" + }, + { + "id": "market-timeline/s1.window", + "artifact": "market-timeline", + "verdict": "INVALID", + "requires": [], + "sha256": "0xcc102d4eab91e6a3d8b56c2e9d4f7f26ac936243357bcea530e9d9d08622d0dd" + }, + { + "id": "market-timeline/s1.complete-submission", + "artifact": "market-timeline", + "verdict": "INVALID", + "requires": [], + "sha256": "0x0a2f5679e0f078db87b5311d57a4a9b3c5b1d2b2b00194a8ae408941d900c386" + }, + { + "id": "market-timeline/s1.deadline", + "artifact": "market-timeline", + "verdict": "INVALID", + "requires": [], + "sha256": "0xee536fc4fdeaa377106e6cc08f8dac21440e54bebab8ff2d534a44ffd03c6730" + }, + { + "id": "market-timeline/s1.proof-late", + "artifact": "market-timeline", + "verdict": "INVALID", + "requires": [], + "sha256": "0x8a4d385c1d8795cd1c5706a19890f4a58d0eff35b94adac57d2db0ffbf9db57c" + }, + { + "id": "market-timeline/s1.proof-other-result", + "artifact": "market-timeline", + "verdict": "INVALID", + "requires": [], + "sha256": "0xa86b2c4f0d85a0668dc20846ea1fb054c224dca05eb8bd75e481d0b0d524d817" + }, + { + "id": "dataset-record/r5.valid", + "artifact": "dataset-record", + "verdict": "VALID", + "requires": [], + "sha256": "0x5f8410bdd1664d01ab3d844b66bd328311a920df93bac86001e392a06b0b99b2" + }, + { + "id": "dataset-record/r5.form", + "artifact": "dataset-record", + "verdict": "INVALID", + "requires": [], + "sha256": "0x9526fe1a9bee0936d864105b2fe4ec7f66cf0eb92c04d9299a0a052418dc1738" + }, + { + "id": "dataset-record/r5.commitment", + "artifact": "dataset-record", + "verdict": "INVALID", + "requires": [], + "sha256": "0x77628741fc339d7fc3818ef07532f11bd2bf74860e1c4165ace13bdf8612c932" + }, + { + "id": "dataset-record/r5.field", + "artifact": "dataset-record", + "verdict": "INVALID", + "requires": [], + "sha256": "0xfe6251a482079328802d730f8a0121e974dafe1efbe4e2834bfe339df454716f" + }, + { + "id": "dataset-record/r5.field-no-salt", + "artifact": "dataset-record", + "verdict": "INVALID", + "requires": [], + "sha256": "0x59e2f939ea184642b314c366353d23592b9199dfb40d7885a36c8e921be519aa" + }, + { + "id": "dataset-record/r5.inclusion", + "artifact": "dataset-record", + "verdict": "INVALID", + "requires": [], + "sha256": "0x8b4412782d877b1196641a4730e177bfcde4d3bb52c4c15c4cc41ba1a18579bb" + }, + { + "id": "dataset-answer/age-30-45.valid", + "artifact": "dataset-answer", + "verdict": "VALID", + "requires": [], + "sha256": "0xd947a30a0a8b7ccbb4a3b5750d106b58f8fbd5b04dd8f752a796948cac81604c" + }, + { + "id": "dataset-answer/age-30-45.commitment", + "artifact": "dataset-answer", + "verdict": "INVALID", + "requires": [], + "sha256": "0x8cdfe5db986b6dcf5833d0b2111ed0f1c92fe759f071156fe31056827c7dd328" + }, + { + "id": "dataset-answer/age-30-45.index-size", + "artifact": "dataset-answer", + "verdict": "INVALID", + "requires": [], + "sha256": "0x7f006a009524163c7ae853da33e154841092f5144d4b6021d853c3550a9e6c09" + }, + { + "id": "dataset-answer/age-30-45.index-undisclosed", + "artifact": "dataset-answer", + "verdict": "INVALID", + "requires": [], + "sha256": "0x4b3255b66961d7baf32e8d1dd5bdf078ab75f6c8b5a6307b3e1d77d4a6bcf1d9" + }, + { + "id": "dataset-answer/age-30-45.index", + "artifact": "dataset-answer", + "verdict": "INVALID", + "requires": [], + "sha256": "0x726a9f14ff95163aac6f90438e2cc5eb7f0a53fc9d87dfb48cfb07d7c45ea69a" + }, + { + "id": "dataset-answer/age-30-45.range", + "artifact": "dataset-answer", + "verdict": "INVALID", + "requires": [], + "sha256": "0x0cf6a025dfca0c4ef983d486612e34139411844967b9f234c43a7c9c084ce525" + }, + { + "id": "dataset-answer/age-30-45.completeness", + "artifact": "dataset-answer", + "verdict": "INVALID", + "requires": [], + "sha256": "0xd2352bc7fd05f6912cfba7778c255b0d383ac46e817a159f1e400f1092bd09ee" + }, + { + "id": "dataset-answer/age-30-45.completeness-last", + "artifact": "dataset-answer", + "verdict": "INVALID", + "requires": [], + "sha256": "0xbcd96face094d290dc0bd956863db184390e660eac5735a6ce02d73774c4d62d" + }, + { + "id": "dataset-answer/age-30-45.completeness-first", + "artifact": "dataset-answer", + "verdict": "INVALID", + "requires": [], + "sha256": "0xd657708cfdc0936512c10bcc00a58c0334eb7dc22561598479265d0f3ad34d9d" + }, + { + "id": "dataset-answer/two-records.valid", + "artifact": "dataset-answer", + "verdict": "VALID", + "requires": [], + "sha256": "0xd27458627f67f347296d093488ca1e64e3e83ce8a18c6248fdae72e39e0e3e5d" + }, + { + "id": "dataset-answer/two-records.order", + "artifact": "dataset-answer", + "verdict": "INVALID", + "requires": [], + "sha256": "0x7c8f7c64b3060e188350cd4593135cdeed671f0d9d9858ead25c00bfa4ad83e1" + }, + { + "id": "dataset-consistency/v1-v2.valid", + "artifact": "dataset-consistency", + "verdict": "VALID", + "requires": [], + "sha256": "0xca24ce88bf73f467e81121c1e464ad2f66a5716b7299d8f6a7b3ebb4f237ce76" + }, + { + "id": "dataset-consistency/v1-v2.commitment", + "artifact": "dataset-consistency", + "verdict": "INVALID", + "requires": [], + "sha256": "0x90dcdc292263673a549ab3d66a8b30a38d66c67f537ef3d94f3115bf0a0c97d8" + }, + { + "id": "dataset-consistency/v1-v2.consistency", + "artifact": "dataset-consistency", + "verdict": "INVALID", + "requires": [], + "sha256": "0x34be7241c1223a42f0edc7b28b49e2e11537f4bb9d687fc479580b6872ba64b2" + }, + { + "id": "dataset-sample/four-of-sixteen.valid", + "artifact": "dataset-sample", + "verdict": "VALID", + "requires": [], + "sha256": "0xe8a7d86a3c6b85ec7bcbe3278511a4a251f920bf88f6f7ac2420c9edc3209d57" + }, + { + "id": "dataset-sample/four-of-sixteen.sample", + "artifact": "dataset-sample", + "verdict": "INVALID", + "requires": [], + "sha256": "0x340a45387f79f21861a86cdde510733b7274363379b595b952479659ac535b1d" + } + ] +} diff --git a/conformance/vectori/dataset-answer/age-30-45.commitment.json b/conformance/vectori/dataset-answer/age-30-45.commitment.json new file mode 100644 index 0000000..62b295a --- /dev/null +++ b/conformance/vectori/dataset-answer/age-30-45.commitment.json @@ -0,0 +1,394 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "dataset-answer/age-30-45.commitment", + "artifact": "dataset-answer", + "title": "an answer that names another version than the commitment it is checked against", + "source": "derived from dataset-answer/age-30-45.valid", + "requires": [], + "exercises": [ + "dataset.commitment", + "dataset.completeness", + "dataset.field", + "dataset.form", + "dataset.inclusion", + "dataset.index", + "dataset.order", + "dataset.range" + ], + "base": "dataset-answer/age-30-45.valid", + "mutation": { + "op": "set", + "path": [ + "answer", + "version" + ], + "value": 1 + }, + "input": { + "answer": { + "v": 1, + "kind": "aere-verifiable-query-answer", + "name": "conformance", + "version": 1, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "field": "age", + "from": 30, + "to": 45, + "indexSize": 16, + "rows": [ + { + "pos": 5, + "i": 13, + "id": "r13", + "c": { + "age": "0x20131967249ae0130154c3dbbcbe8ab041200b4499ed270f2c9dd2c2ac3337f1", + "country": "0xffa95ca2afb61e95d628c3044b6e80746cccc11642ad35dafc6445cd905facdf", + "email": "0x2e6bca63ef9fad9e3ef55ae60405914a01577abd1caf0403109608f3f95a3700", + "note": "0x668a33b811cf8989b6ce36f7681928dd43371ea394d67df6136fb1580977121b" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b5ffd792267cac392d9d814c7809b198" + }, + "age": { + "value": 31, + "salt": "314d5643f6f54376235b422614dd1562" + } + }, + "logProof": { + "index": 13, + "treeSize": 16, + "path": [ + "0xd3cbc725743f95177070e430cd03ec9f6af06bc64e84c0c84ad19e5d5562a983", + "0x85c6057fcfb4dd1d0fdfc0e4a925284def148b2ee0513c6858a29070aca4d50d", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 5, + "treeSize": 16, + "path": [ + "0xc4723e9eb2ff7168890f1a366b02d3ed1452ac476e98996cd0c91634af7423ed", + "0x15febe1a672c219d5d2f9fa007af3b5a9c3e7e47a61fe89875ae1cf60ebfb2df", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 6, + "i": 2, + "id": "r2", + "c": { + "age": "0xec15dd9b6e14956f9e3e9ea696f943972ab7601093c1c488ec18d40eb1431d42", + "country": "0x8d9e791776f47b5aeb079763edfdd40d26fc94742c8410a4f8d45e6ff1e901e6", + "email": "0xb9bfbcffff236803e9faabb11490ee1749c02a5566ae6e22380ae7dafc16322e", + "note": "0x86d1f7ae6700f8a22cb3c6a97b27d85d226beae6c4ca4c6eccd3e18b2fd85644" + }, + "disclosed": { + "country": { + "value": "FR", + "salt": "6a20a411bddb217e3ba890baad65b87e" + }, + "age": { + "value": 34, + "salt": "a83f62663d8735a83a784f603de20b88" + } + }, + "logProof": { + "index": 2, + "treeSize": 16, + "path": [ + "0x559b8f51f7b31a6feed18feeb876141c8a19af7f49169aee7a9833b59b65eaa2", + "0x6528250e72e30d47b6b47dcefaa225bcb9fc1af0d20ee827c331486083baac56", + "0xef30cdbdc0b6467d74313d8b22b2054e32a17b3a484121ccc24cb16d8ad6fec0", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + }, + "indexProof": { + "index": 6, + "treeSize": 16, + "path": [ + "0xdc9c9be2d7bc348acbd1cc004108f4af0386cec42492ae4fc3d62a9840d5f7bd", + "0x140d04bd298186a3efce73de4e3ea60f7f0300d21f2970efffc9f918ab004475", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 7, + "i": 8, + "id": "r8", + "c": { + "age": "0xc6b4096f4947760268564e73c3afb7edf8c31f1fe8a5371c85eeb606ac22ea25", + "country": "0x9b959d0dad5df75cf7f29a408750b730b9fc41403f4fc50168cc14ce2ca437ee", + "email": "0x598b4823a385d1f34c855b8bb873241bc66ddbd0a8f6b09d92cba14534454484", + "note": "0x4bd0762227e6c5d7f6ceac6185a23fe5075a33576dcd1e4e51aa9a4b0e0a1158" + }, + "disclosed": { + "country": { + "value": "RO", + "salt": "0a263d3e4223cc52f078c225a273e316" + }, + "age": { + "value": 36, + "salt": "bcb34a3f54db5f21299add6f1c654670" + } + }, + "logProof": { + "index": 8, + "treeSize": 16, + "path": [ + "0x7eb65d9a7f7ffa3039e627af43216d59accf7d3ca8a2951c2b0418c0199a1c9f", + "0x5290791446b6001dc5b5819d38d10ce762a0337736bbf8e90a111e8fe3c77efe", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 7, + "treeSize": 16, + "path": [ + "0x201009717c9f1fc80cd77e2a975390858ff4a4b76511bb7a31d36ea58bedeceb", + "0x140d04bd298186a3efce73de4e3ea60f7f0300d21f2970efffc9f918ab004475", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 8, + "i": 14, + "id": "r14", + "c": { + "age": "0x2a86b9afad1aff1234aa90bdf96095d07ef5d479992a9081c21adc965a3c20c3", + "country": "0xebd5ee1cac77bb2b170c930d964032218f9f9c69284c89b213dbefb2d54b8eee", + "email": "0xb9319475dca37efe658a39f9f7c10d13dd21a32276ec911dc57a2677a4e4bb50", + "note": "0x3fdbec96439422e50f7faabf111c8c8c2690460aad638b745a6875678fd38f34" + }, + "disclosed": { + "country": { + "value": "FR", + "salt": "15d426374424c484ffc8ae1bb736d960" + }, + "age": { + "value": 38, + "salt": "d750eb0354fb432536e3c26e5c682210" + } + }, + "logProof": { + "index": 14, + "treeSize": 16, + "path": [ + "0x12c9a4faf655bb09dbbb6a5fb3a24e44330e5d83222439ab2d2c2224c3791d84", + "0x1dd8a5c51c6218cb8ca3a57ee7683a06b1e94aaedc7252a6b296e4091c975377", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 8, + "treeSize": 16, + "path": [ + "0x9e4143c4b05ba68e176ae53bc5f122c1a490c3e1efeaa6bd9501110c5fb4d059", + "0xb3e51e807cccee32941e4d7009700ae40055645eb9e8bc6974ebe8ebf887a145", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 9, + "i": 3, + "id": "r3", + "c": { + "age": "0x13ec2a42a36e8b12ebdbd35af1d96962683a06b802e9e1f9e2e020487c691f7f", + "country": "0x1d18032f2e5acd907bffb4db2103b3d1d337388078ed9238a913c0cabecb928f", + "email": "0xe36f28b120650ba4c2597063b456d4d00847532129bd26dc8c150291265eef23", + "note": "0x086341fc0392c796d5f84f78f183deef347fa327e3d48707c460fc4d9c1f9910" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "0ee225e77747d7afafb81d1bffdf68c0" + }, + "age": { + "value": 41, + "salt": "9104931c19467233d902d1c967a15086" + } + }, + "logProof": { + "index": 3, + "treeSize": 16, + "path": [ + "0x5083ccb306cbefaa21d75b69a47668b0cd3943865500881281d96e05429face8", + "0x6528250e72e30d47b6b47dcefaa225bcb9fc1af0d20ee827c331486083baac56", + "0xef30cdbdc0b6467d74313d8b22b2054e32a17b3a484121ccc24cb16d8ad6fec0", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + }, + "indexProof": { + "index": 9, + "treeSize": 16, + "path": [ + "0xd0d85473c9adae91cb97fce47e564181ae990b38260de5efb1351e02ff9c3524", + "0xb3e51e807cccee32941e4d7009700ae40055645eb9e8bc6974ebe8ebf887a145", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 10, + "i": 9, + "id": "r9", + "c": { + "age": "0x1e440a3ce1d15a73c509b5b4da506157e42ac6cd8e96d486df66d049bfe8b8e6", + "country": "0xd5f75ca5ae34d41c6c6fe30f01061bec1260fd8fa9a134da20c616bd61b33428", + "email": "0x762b765d7cda44c06281ea75fea30bfc377adffe33d9df4ba065566f503ced67", + "note": "0x42b57a86fde59862104e06c5f9d7324e5edf2506e5c3874e0ae85e375ec46cdb" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b0371c1e4117eab6e65f46c8e7dd9b5c" + }, + "age": { + "value": 43, + "salt": "994a5723c379b33784b813642d91bca5" + } + }, + "logProof": { + "index": 9, + "treeSize": 16, + "path": [ + "0x65c032449d009130a92eb4bfc7a17fe17e0256c141a980d56ef6f7acc5ea65c1", + "0x5290791446b6001dc5b5819d38d10ce762a0337736bbf8e90a111e8fe3c77efe", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 10, + "treeSize": 16, + "path": [ + "0xccb00a519667f5206d54663c1449cfe26d2a69a21b58934e639d7fa5274a610b", + "0x59b6ac5d90106bce7337c4bbb3a25828e76f9fa97e001caee65d2540dad98ef0", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 11, + "i": 15, + "id": "r15", + "c": { + "age": "0x3e1980c7f773e302e4f9bf175e8edec38a53da7f2e46a5e371a77d57842c02fb", + "country": "0x1919bce313ba6d86fc4bf751e1f67b0a39b699615086212681149ff62c0885cf", + "email": "0x8c8c71ef8dd79da410a4cfc25639ea6119cbdd02c031eaa3ee9d661c65ba9aea", + "note": "0x2b31e8289c6fa63c019472defa0f58b1aad47fb3ff63a99484ddf9b95d3a3bd5" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "2e559c28fa7a80ed4f38fa8b45f2c82e" + }, + "age": { + "value": 45, + "salt": "ddef75f62d6301533303c7876d013294" + } + }, + "logProof": { + "index": 15, + "treeSize": 16, + "path": [ + "0x7bfd292a9ed546f18580c5251b801dc2756d80ab29a3c64eb0b81433a313307f", + "0x1dd8a5c51c6218cb8ca3a57ee7683a06b1e94aaedc7252a6b296e4091c975377", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 11, + "treeSize": 16, + "path": [ + "0x7144d8a6be6e7645cd0c8b69f028fc16b10e4f17fa86296a23c261922d75753e", + "0x59b6ac5d90106bce7337c4bbb3a25828e76f9fa97e001caee65d2540dad98ef0", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + } + ], + "before": { + "pos": 4, + "value": 29, + "i": 7, + "recordLeaf": "0xabbddf51854536b5605dc7c0630fd2fa170d2dcd9b1c5312aec6fea74c038c0d", + "indexProof": { + "index": 4, + "treeSize": 16, + "path": [ + "0x30a0dd012169393d0dea8791c0f24d70cc8d4c70d088f420825ec0dbf9230f67", + "0x15febe1a672c219d5d2f9fa007af3b5a9c3e7e47a61fe89875ae1cf60ebfb2df", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + "after": { + "pos": 12, + "value": 48, + "i": 4, + "recordLeaf": "0x423f202599ef3d02b5f3ff547235afd8e222ed7c26c61a01e4c15de7e2f4948b", + "indexProof": { + "index": 12, + "treeSize": 16, + "path": [ + "0x6e97bf24fed1277d34cc86719a8f63aab95067adfa7c5a6e70bde9daf8870f47", + "0x775811db8d2472f42cad2aeebbc3826f5f959e1f174501ca8ab4380ad815702a", + "0xec4bd620657cb68e435f6d2a71199370056c925b6184624a743fe49d818e9370", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + } + }, + "commitment": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 2, + "size": 16, + "logRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "createdAt": "2026-10-03T00:01:00.000Z", + "indexes": { + "age": { + "root": "0xfc641a2eadd7d876f9b4fe284dac094fb83543cf43a2c2f80e88f6d9e98114a7", + "size": 16 + }, + "country": { + "root": "0x5be9a95a39966382ab8d83179ae93380d723d49eff2f3b76a290a72a8ee60149", + "size": 16 + } + }, + "previous": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "dataset.commitment" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/dataset-answer/age-30-45.completeness-first.json b/conformance/vectori/dataset-answer/age-30-45.completeness-first.json new file mode 100644 index 0000000..b7ac299 --- /dev/null +++ b/conformance/vectori/dataset-answer/age-30-45.completeness-first.json @@ -0,0 +1,358 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "dataset-answer/age-30-45.completeness-first", + "artifact": "dataset-answer", + "title": "the first matching row withheld and shown as the neighbour before the run", + "source": "derived from dataset-answer/age-30-45.valid", + "requires": [], + "exercises": [ + "dataset.commitment", + "dataset.completeness", + "dataset.field", + "dataset.form", + "dataset.inclusion", + "dataset.index", + "dataset.order", + "dataset.range" + ], + "base": "dataset-answer/age-30-45.valid", + "mutation": { + "producer": "the server dropped the first row and presented it as the neighbour before", + "changed": [ + [ + "answer", + "rows" + ], + [ + "answer", + "before" + ] + ] + }, + "input": { + "answer": { + "v": 1, + "kind": "aere-verifiable-query-answer", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "field": "age", + "from": 30, + "to": 45, + "indexSize": 16, + "rows": [ + { + "pos": 6, + "i": 2, + "id": "r2", + "c": { + "age": "0xec15dd9b6e14956f9e3e9ea696f943972ab7601093c1c488ec18d40eb1431d42", + "country": "0x8d9e791776f47b5aeb079763edfdd40d26fc94742c8410a4f8d45e6ff1e901e6", + "email": "0xb9bfbcffff236803e9faabb11490ee1749c02a5566ae6e22380ae7dafc16322e", + "note": "0x86d1f7ae6700f8a22cb3c6a97b27d85d226beae6c4ca4c6eccd3e18b2fd85644" + }, + "disclosed": { + "country": { + "value": "FR", + "salt": "6a20a411bddb217e3ba890baad65b87e" + }, + "age": { + "value": 34, + "salt": "a83f62663d8735a83a784f603de20b88" + } + }, + "logProof": { + "index": 2, + "treeSize": 16, + "path": [ + "0x559b8f51f7b31a6feed18feeb876141c8a19af7f49169aee7a9833b59b65eaa2", + "0x6528250e72e30d47b6b47dcefaa225bcb9fc1af0d20ee827c331486083baac56", + "0xef30cdbdc0b6467d74313d8b22b2054e32a17b3a484121ccc24cb16d8ad6fec0", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + }, + "indexProof": { + "index": 6, + "treeSize": 16, + "path": [ + "0xdc9c9be2d7bc348acbd1cc004108f4af0386cec42492ae4fc3d62a9840d5f7bd", + "0x140d04bd298186a3efce73de4e3ea60f7f0300d21f2970efffc9f918ab004475", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 7, + "i": 8, + "id": "r8", + "c": { + "age": "0xc6b4096f4947760268564e73c3afb7edf8c31f1fe8a5371c85eeb606ac22ea25", + "country": "0x9b959d0dad5df75cf7f29a408750b730b9fc41403f4fc50168cc14ce2ca437ee", + "email": "0x598b4823a385d1f34c855b8bb873241bc66ddbd0a8f6b09d92cba14534454484", + "note": "0x4bd0762227e6c5d7f6ceac6185a23fe5075a33576dcd1e4e51aa9a4b0e0a1158" + }, + "disclosed": { + "country": { + "value": "RO", + "salt": "0a263d3e4223cc52f078c225a273e316" + }, + "age": { + "value": 36, + "salt": "bcb34a3f54db5f21299add6f1c654670" + } + }, + "logProof": { + "index": 8, + "treeSize": 16, + "path": [ + "0x7eb65d9a7f7ffa3039e627af43216d59accf7d3ca8a2951c2b0418c0199a1c9f", + "0x5290791446b6001dc5b5819d38d10ce762a0337736bbf8e90a111e8fe3c77efe", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 7, + "treeSize": 16, + "path": [ + "0x201009717c9f1fc80cd77e2a975390858ff4a4b76511bb7a31d36ea58bedeceb", + "0x140d04bd298186a3efce73de4e3ea60f7f0300d21f2970efffc9f918ab004475", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 8, + "i": 14, + "id": "r14", + "c": { + "age": "0x2a86b9afad1aff1234aa90bdf96095d07ef5d479992a9081c21adc965a3c20c3", + "country": "0xebd5ee1cac77bb2b170c930d964032218f9f9c69284c89b213dbefb2d54b8eee", + "email": "0xb9319475dca37efe658a39f9f7c10d13dd21a32276ec911dc57a2677a4e4bb50", + "note": "0x3fdbec96439422e50f7faabf111c8c8c2690460aad638b745a6875678fd38f34" + }, + "disclosed": { + "country": { + "value": "FR", + "salt": "15d426374424c484ffc8ae1bb736d960" + }, + "age": { + "value": 38, + "salt": "d750eb0354fb432536e3c26e5c682210" + } + }, + "logProof": { + "index": 14, + "treeSize": 16, + "path": [ + "0x12c9a4faf655bb09dbbb6a5fb3a24e44330e5d83222439ab2d2c2224c3791d84", + "0x1dd8a5c51c6218cb8ca3a57ee7683a06b1e94aaedc7252a6b296e4091c975377", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 8, + "treeSize": 16, + "path": [ + "0x9e4143c4b05ba68e176ae53bc5f122c1a490c3e1efeaa6bd9501110c5fb4d059", + "0xb3e51e807cccee32941e4d7009700ae40055645eb9e8bc6974ebe8ebf887a145", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 9, + "i": 3, + "id": "r3", + "c": { + "age": "0x13ec2a42a36e8b12ebdbd35af1d96962683a06b802e9e1f9e2e020487c691f7f", + "country": "0x1d18032f2e5acd907bffb4db2103b3d1d337388078ed9238a913c0cabecb928f", + "email": "0xe36f28b120650ba4c2597063b456d4d00847532129bd26dc8c150291265eef23", + "note": "0x086341fc0392c796d5f84f78f183deef347fa327e3d48707c460fc4d9c1f9910" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "0ee225e77747d7afafb81d1bffdf68c0" + }, + "age": { + "value": 41, + "salt": "9104931c19467233d902d1c967a15086" + } + }, + "logProof": { + "index": 3, + "treeSize": 16, + "path": [ + "0x5083ccb306cbefaa21d75b69a47668b0cd3943865500881281d96e05429face8", + "0x6528250e72e30d47b6b47dcefaa225bcb9fc1af0d20ee827c331486083baac56", + "0xef30cdbdc0b6467d74313d8b22b2054e32a17b3a484121ccc24cb16d8ad6fec0", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + }, + "indexProof": { + "index": 9, + "treeSize": 16, + "path": [ + "0xd0d85473c9adae91cb97fce47e564181ae990b38260de5efb1351e02ff9c3524", + "0xb3e51e807cccee32941e4d7009700ae40055645eb9e8bc6974ebe8ebf887a145", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 10, + "i": 9, + "id": "r9", + "c": { + "age": "0x1e440a3ce1d15a73c509b5b4da506157e42ac6cd8e96d486df66d049bfe8b8e6", + "country": "0xd5f75ca5ae34d41c6c6fe30f01061bec1260fd8fa9a134da20c616bd61b33428", + "email": "0x762b765d7cda44c06281ea75fea30bfc377adffe33d9df4ba065566f503ced67", + "note": "0x42b57a86fde59862104e06c5f9d7324e5edf2506e5c3874e0ae85e375ec46cdb" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b0371c1e4117eab6e65f46c8e7dd9b5c" + }, + "age": { + "value": 43, + "salt": "994a5723c379b33784b813642d91bca5" + } + }, + "logProof": { + "index": 9, + "treeSize": 16, + "path": [ + "0x65c032449d009130a92eb4bfc7a17fe17e0256c141a980d56ef6f7acc5ea65c1", + "0x5290791446b6001dc5b5819d38d10ce762a0337736bbf8e90a111e8fe3c77efe", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 10, + "treeSize": 16, + "path": [ + "0xccb00a519667f5206d54663c1449cfe26d2a69a21b58934e639d7fa5274a610b", + "0x59b6ac5d90106bce7337c4bbb3a25828e76f9fa97e001caee65d2540dad98ef0", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 11, + "i": 15, + "id": "r15", + "c": { + "age": "0x3e1980c7f773e302e4f9bf175e8edec38a53da7f2e46a5e371a77d57842c02fb", + "country": "0x1919bce313ba6d86fc4bf751e1f67b0a39b699615086212681149ff62c0885cf", + "email": "0x8c8c71ef8dd79da410a4cfc25639ea6119cbdd02c031eaa3ee9d661c65ba9aea", + "note": "0x2b31e8289c6fa63c019472defa0f58b1aad47fb3ff63a99484ddf9b95d3a3bd5" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "2e559c28fa7a80ed4f38fa8b45f2c82e" + }, + "age": { + "value": 45, + "salt": "ddef75f62d6301533303c7876d013294" + } + }, + "logProof": { + "index": 15, + "treeSize": 16, + "path": [ + "0x7bfd292a9ed546f18580c5251b801dc2756d80ab29a3c64eb0b81433a313307f", + "0x1dd8a5c51c6218cb8ca3a57ee7683a06b1e94aaedc7252a6b296e4091c975377", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 11, + "treeSize": 16, + "path": [ + "0x7144d8a6be6e7645cd0c8b69f028fc16b10e4f17fa86296a23c261922d75753e", + "0x59b6ac5d90106bce7337c4bbb3a25828e76f9fa97e001caee65d2540dad98ef0", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + } + ], + "before": { + "pos": 5, + "value": 31, + "i": 13, + "recordLeaf": "0xc383e9a1e188c33996ec8ed77bb82230a72a4f52facef6bb31482535a09c30e0", + "indexProof": { + "index": 5, + "treeSize": 16, + "path": [ + "0xc4723e9eb2ff7168890f1a366b02d3ed1452ac476e98996cd0c91634af7423ed", + "0x15febe1a672c219d5d2f9fa007af3b5a9c3e7e47a61fe89875ae1cf60ebfb2df", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + "after": { + "pos": 12, + "value": 48, + "i": 4, + "recordLeaf": "0x423f202599ef3d02b5f3ff547235afd8e222ed7c26c61a01e4c15de7e2f4948b", + "indexProof": { + "index": 12, + "treeSize": 16, + "path": [ + "0x6e97bf24fed1277d34cc86719a8f63aab95067adfa7c5a6e70bde9daf8870f47", + "0x775811db8d2472f42cad2aeebbc3826f5f959e1f174501ca8ab4380ad815702a", + "0xec4bd620657cb68e435f6d2a71199370056c925b6184624a743fe49d818e9370", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + } + }, + "commitment": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 2, + "size": 16, + "logRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "createdAt": "2026-10-03T00:01:00.000Z", + "indexes": { + "age": { + "root": "0xfc641a2eadd7d876f9b4fe284dac094fb83543cf43a2c2f80e88f6d9e98114a7", + "size": 16 + }, + "country": { + "root": "0x5be9a95a39966382ab8d83179ae93380d723d49eff2f3b76a290a72a8ee60149", + "size": 16 + } + }, + "previous": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "dataset.completeness" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/dataset-answer/age-30-45.completeness-last.json b/conformance/vectori/dataset-answer/age-30-45.completeness-last.json new file mode 100644 index 0000000..e38550b --- /dev/null +++ b/conformance/vectori/dataset-answer/age-30-45.completeness-last.json @@ -0,0 +1,359 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "dataset-answer/age-30-45.completeness-last", + "artifact": "dataset-answer", + "title": "the last matching row withheld and shown as the neighbour after the run (its value is still in range)", + "source": "derived from dataset-answer/age-30-45.valid", + "requires": [], + "exercises": [ + "dataset.commitment", + "dataset.completeness", + "dataset.field", + "dataset.form", + "dataset.inclusion", + "dataset.index", + "dataset.order", + "dataset.range" + ], + "base": "dataset-answer/age-30-45.valid", + "mutation": { + "producer": "the server dropped the last row and presented it as the neighbour after", + "changed": [ + [ + "answer", + "rows", + 6 + ], + [ + "answer", + "after" + ] + ] + }, + "input": { + "answer": { + "v": 1, + "kind": "aere-verifiable-query-answer", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "field": "age", + "from": 30, + "to": 45, + "indexSize": 16, + "rows": [ + { + "pos": 5, + "i": 13, + "id": "r13", + "c": { + "age": "0x20131967249ae0130154c3dbbcbe8ab041200b4499ed270f2c9dd2c2ac3337f1", + "country": "0xffa95ca2afb61e95d628c3044b6e80746cccc11642ad35dafc6445cd905facdf", + "email": "0x2e6bca63ef9fad9e3ef55ae60405914a01577abd1caf0403109608f3f95a3700", + "note": "0x668a33b811cf8989b6ce36f7681928dd43371ea394d67df6136fb1580977121b" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b5ffd792267cac392d9d814c7809b198" + }, + "age": { + "value": 31, + "salt": "314d5643f6f54376235b422614dd1562" + } + }, + "logProof": { + "index": 13, + "treeSize": 16, + "path": [ + "0xd3cbc725743f95177070e430cd03ec9f6af06bc64e84c0c84ad19e5d5562a983", + "0x85c6057fcfb4dd1d0fdfc0e4a925284def148b2ee0513c6858a29070aca4d50d", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 5, + "treeSize": 16, + "path": [ + "0xc4723e9eb2ff7168890f1a366b02d3ed1452ac476e98996cd0c91634af7423ed", + "0x15febe1a672c219d5d2f9fa007af3b5a9c3e7e47a61fe89875ae1cf60ebfb2df", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 6, + "i": 2, + "id": "r2", + "c": { + "age": "0xec15dd9b6e14956f9e3e9ea696f943972ab7601093c1c488ec18d40eb1431d42", + "country": "0x8d9e791776f47b5aeb079763edfdd40d26fc94742c8410a4f8d45e6ff1e901e6", + "email": "0xb9bfbcffff236803e9faabb11490ee1749c02a5566ae6e22380ae7dafc16322e", + "note": "0x86d1f7ae6700f8a22cb3c6a97b27d85d226beae6c4ca4c6eccd3e18b2fd85644" + }, + "disclosed": { + "country": { + "value": "FR", + "salt": "6a20a411bddb217e3ba890baad65b87e" + }, + "age": { + "value": 34, + "salt": "a83f62663d8735a83a784f603de20b88" + } + }, + "logProof": { + "index": 2, + "treeSize": 16, + "path": [ + "0x559b8f51f7b31a6feed18feeb876141c8a19af7f49169aee7a9833b59b65eaa2", + "0x6528250e72e30d47b6b47dcefaa225bcb9fc1af0d20ee827c331486083baac56", + "0xef30cdbdc0b6467d74313d8b22b2054e32a17b3a484121ccc24cb16d8ad6fec0", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + }, + "indexProof": { + "index": 6, + "treeSize": 16, + "path": [ + "0xdc9c9be2d7bc348acbd1cc004108f4af0386cec42492ae4fc3d62a9840d5f7bd", + "0x140d04bd298186a3efce73de4e3ea60f7f0300d21f2970efffc9f918ab004475", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 7, + "i": 8, + "id": "r8", + "c": { + "age": "0xc6b4096f4947760268564e73c3afb7edf8c31f1fe8a5371c85eeb606ac22ea25", + "country": "0x9b959d0dad5df75cf7f29a408750b730b9fc41403f4fc50168cc14ce2ca437ee", + "email": "0x598b4823a385d1f34c855b8bb873241bc66ddbd0a8f6b09d92cba14534454484", + "note": "0x4bd0762227e6c5d7f6ceac6185a23fe5075a33576dcd1e4e51aa9a4b0e0a1158" + }, + "disclosed": { + "country": { + "value": "RO", + "salt": "0a263d3e4223cc52f078c225a273e316" + }, + "age": { + "value": 36, + "salt": "bcb34a3f54db5f21299add6f1c654670" + } + }, + "logProof": { + "index": 8, + "treeSize": 16, + "path": [ + "0x7eb65d9a7f7ffa3039e627af43216d59accf7d3ca8a2951c2b0418c0199a1c9f", + "0x5290791446b6001dc5b5819d38d10ce762a0337736bbf8e90a111e8fe3c77efe", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 7, + "treeSize": 16, + "path": [ + "0x201009717c9f1fc80cd77e2a975390858ff4a4b76511bb7a31d36ea58bedeceb", + "0x140d04bd298186a3efce73de4e3ea60f7f0300d21f2970efffc9f918ab004475", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 8, + "i": 14, + "id": "r14", + "c": { + "age": "0x2a86b9afad1aff1234aa90bdf96095d07ef5d479992a9081c21adc965a3c20c3", + "country": "0xebd5ee1cac77bb2b170c930d964032218f9f9c69284c89b213dbefb2d54b8eee", + "email": "0xb9319475dca37efe658a39f9f7c10d13dd21a32276ec911dc57a2677a4e4bb50", + "note": "0x3fdbec96439422e50f7faabf111c8c8c2690460aad638b745a6875678fd38f34" + }, + "disclosed": { + "country": { + "value": "FR", + "salt": "15d426374424c484ffc8ae1bb736d960" + }, + "age": { + "value": 38, + "salt": "d750eb0354fb432536e3c26e5c682210" + } + }, + "logProof": { + "index": 14, + "treeSize": 16, + "path": [ + "0x12c9a4faf655bb09dbbb6a5fb3a24e44330e5d83222439ab2d2c2224c3791d84", + "0x1dd8a5c51c6218cb8ca3a57ee7683a06b1e94aaedc7252a6b296e4091c975377", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 8, + "treeSize": 16, + "path": [ + "0x9e4143c4b05ba68e176ae53bc5f122c1a490c3e1efeaa6bd9501110c5fb4d059", + "0xb3e51e807cccee32941e4d7009700ae40055645eb9e8bc6974ebe8ebf887a145", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 9, + "i": 3, + "id": "r3", + "c": { + "age": "0x13ec2a42a36e8b12ebdbd35af1d96962683a06b802e9e1f9e2e020487c691f7f", + "country": "0x1d18032f2e5acd907bffb4db2103b3d1d337388078ed9238a913c0cabecb928f", + "email": "0xe36f28b120650ba4c2597063b456d4d00847532129bd26dc8c150291265eef23", + "note": "0x086341fc0392c796d5f84f78f183deef347fa327e3d48707c460fc4d9c1f9910" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "0ee225e77747d7afafb81d1bffdf68c0" + }, + "age": { + "value": 41, + "salt": "9104931c19467233d902d1c967a15086" + } + }, + "logProof": { + "index": 3, + "treeSize": 16, + "path": [ + "0x5083ccb306cbefaa21d75b69a47668b0cd3943865500881281d96e05429face8", + "0x6528250e72e30d47b6b47dcefaa225bcb9fc1af0d20ee827c331486083baac56", + "0xef30cdbdc0b6467d74313d8b22b2054e32a17b3a484121ccc24cb16d8ad6fec0", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + }, + "indexProof": { + "index": 9, + "treeSize": 16, + "path": [ + "0xd0d85473c9adae91cb97fce47e564181ae990b38260de5efb1351e02ff9c3524", + "0xb3e51e807cccee32941e4d7009700ae40055645eb9e8bc6974ebe8ebf887a145", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 10, + "i": 9, + "id": "r9", + "c": { + "age": "0x1e440a3ce1d15a73c509b5b4da506157e42ac6cd8e96d486df66d049bfe8b8e6", + "country": "0xd5f75ca5ae34d41c6c6fe30f01061bec1260fd8fa9a134da20c616bd61b33428", + "email": "0x762b765d7cda44c06281ea75fea30bfc377adffe33d9df4ba065566f503ced67", + "note": "0x42b57a86fde59862104e06c5f9d7324e5edf2506e5c3874e0ae85e375ec46cdb" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b0371c1e4117eab6e65f46c8e7dd9b5c" + }, + "age": { + "value": 43, + "salt": "994a5723c379b33784b813642d91bca5" + } + }, + "logProof": { + "index": 9, + "treeSize": 16, + "path": [ + "0x65c032449d009130a92eb4bfc7a17fe17e0256c141a980d56ef6f7acc5ea65c1", + "0x5290791446b6001dc5b5819d38d10ce762a0337736bbf8e90a111e8fe3c77efe", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 10, + "treeSize": 16, + "path": [ + "0xccb00a519667f5206d54663c1449cfe26d2a69a21b58934e639d7fa5274a610b", + "0x59b6ac5d90106bce7337c4bbb3a25828e76f9fa97e001caee65d2540dad98ef0", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + } + ], + "before": { + "pos": 4, + "value": 29, + "i": 7, + "recordLeaf": "0xabbddf51854536b5605dc7c0630fd2fa170d2dcd9b1c5312aec6fea74c038c0d", + "indexProof": { + "index": 4, + "treeSize": 16, + "path": [ + "0x30a0dd012169393d0dea8791c0f24d70cc8d4c70d088f420825ec0dbf9230f67", + "0x15febe1a672c219d5d2f9fa007af3b5a9c3e7e47a61fe89875ae1cf60ebfb2df", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + "after": { + "pos": 11, + "value": 45, + "i": 15, + "recordLeaf": "0x12c9a4faf655bb09dbbb6a5fb3a24e44330e5d83222439ab2d2c2224c3791d84", + "indexProof": { + "index": 11, + "treeSize": 16, + "path": [ + "0x7144d8a6be6e7645cd0c8b69f028fc16b10e4f17fa86296a23c261922d75753e", + "0x59b6ac5d90106bce7337c4bbb3a25828e76f9fa97e001caee65d2540dad98ef0", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + } + }, + "commitment": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 2, + "size": 16, + "logRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "createdAt": "2026-10-03T00:01:00.000Z", + "indexes": { + "age": { + "root": "0xfc641a2eadd7d876f9b4fe284dac094fb83543cf43a2c2f80e88f6d9e98114a7", + "size": 16 + }, + "country": { + "root": "0x5be9a95a39966382ab8d83179ae93380d723d49eff2f3b76a290a72a8ee60149", + "size": 16 + } + }, + "previous": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "dataset.completeness" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/dataset-answer/age-30-45.completeness.json b/conformance/vectori/dataset-answer/age-30-45.completeness.json new file mode 100644 index 0000000..d62b620 --- /dev/null +++ b/conformance/vectori/dataset-answer/age-30-45.completeness.json @@ -0,0 +1,353 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "dataset-answer/age-30-45.completeness", + "artifact": "dataset-answer", + "title": "a row dropped from the middle of the run", + "source": "derived from dataset-answer/age-30-45.valid", + "requires": [], + "exercises": [ + "dataset.commitment", + "dataset.completeness", + "dataset.field", + "dataset.form", + "dataset.inclusion", + "dataset.index", + "dataset.order", + "dataset.range" + ], + "base": "dataset-answer/age-30-45.valid", + "mutation": { + "op": "remove", + "path": [ + "answer", + "rows", + 1 + ] + }, + "input": { + "answer": { + "v": 1, + "kind": "aere-verifiable-query-answer", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "field": "age", + "from": 30, + "to": 45, + "indexSize": 16, + "rows": [ + { + "pos": 5, + "i": 13, + "id": "r13", + "c": { + "age": "0x20131967249ae0130154c3dbbcbe8ab041200b4499ed270f2c9dd2c2ac3337f1", + "country": "0xffa95ca2afb61e95d628c3044b6e80746cccc11642ad35dafc6445cd905facdf", + "email": "0x2e6bca63ef9fad9e3ef55ae60405914a01577abd1caf0403109608f3f95a3700", + "note": "0x668a33b811cf8989b6ce36f7681928dd43371ea394d67df6136fb1580977121b" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b5ffd792267cac392d9d814c7809b198" + }, + "age": { + "value": 31, + "salt": "314d5643f6f54376235b422614dd1562" + } + }, + "logProof": { + "index": 13, + "treeSize": 16, + "path": [ + "0xd3cbc725743f95177070e430cd03ec9f6af06bc64e84c0c84ad19e5d5562a983", + "0x85c6057fcfb4dd1d0fdfc0e4a925284def148b2ee0513c6858a29070aca4d50d", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 5, + "treeSize": 16, + "path": [ + "0xc4723e9eb2ff7168890f1a366b02d3ed1452ac476e98996cd0c91634af7423ed", + "0x15febe1a672c219d5d2f9fa007af3b5a9c3e7e47a61fe89875ae1cf60ebfb2df", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 7, + "i": 8, + "id": "r8", + "c": { + "age": "0xc6b4096f4947760268564e73c3afb7edf8c31f1fe8a5371c85eeb606ac22ea25", + "country": "0x9b959d0dad5df75cf7f29a408750b730b9fc41403f4fc50168cc14ce2ca437ee", + "email": "0x598b4823a385d1f34c855b8bb873241bc66ddbd0a8f6b09d92cba14534454484", + "note": "0x4bd0762227e6c5d7f6ceac6185a23fe5075a33576dcd1e4e51aa9a4b0e0a1158" + }, + "disclosed": { + "country": { + "value": "RO", + "salt": "0a263d3e4223cc52f078c225a273e316" + }, + "age": { + "value": 36, + "salt": "bcb34a3f54db5f21299add6f1c654670" + } + }, + "logProof": { + "index": 8, + "treeSize": 16, + "path": [ + "0x7eb65d9a7f7ffa3039e627af43216d59accf7d3ca8a2951c2b0418c0199a1c9f", + "0x5290791446b6001dc5b5819d38d10ce762a0337736bbf8e90a111e8fe3c77efe", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 7, + "treeSize": 16, + "path": [ + "0x201009717c9f1fc80cd77e2a975390858ff4a4b76511bb7a31d36ea58bedeceb", + "0x140d04bd298186a3efce73de4e3ea60f7f0300d21f2970efffc9f918ab004475", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 8, + "i": 14, + "id": "r14", + "c": { + "age": "0x2a86b9afad1aff1234aa90bdf96095d07ef5d479992a9081c21adc965a3c20c3", + "country": "0xebd5ee1cac77bb2b170c930d964032218f9f9c69284c89b213dbefb2d54b8eee", + "email": "0xb9319475dca37efe658a39f9f7c10d13dd21a32276ec911dc57a2677a4e4bb50", + "note": "0x3fdbec96439422e50f7faabf111c8c8c2690460aad638b745a6875678fd38f34" + }, + "disclosed": { + "country": { + "value": "FR", + "salt": "15d426374424c484ffc8ae1bb736d960" + }, + "age": { + "value": 38, + "salt": "d750eb0354fb432536e3c26e5c682210" + } + }, + "logProof": { + "index": 14, + "treeSize": 16, + "path": [ + "0x12c9a4faf655bb09dbbb6a5fb3a24e44330e5d83222439ab2d2c2224c3791d84", + "0x1dd8a5c51c6218cb8ca3a57ee7683a06b1e94aaedc7252a6b296e4091c975377", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 8, + "treeSize": 16, + "path": [ + "0x9e4143c4b05ba68e176ae53bc5f122c1a490c3e1efeaa6bd9501110c5fb4d059", + "0xb3e51e807cccee32941e4d7009700ae40055645eb9e8bc6974ebe8ebf887a145", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 9, + "i": 3, + "id": "r3", + "c": { + "age": "0x13ec2a42a36e8b12ebdbd35af1d96962683a06b802e9e1f9e2e020487c691f7f", + "country": "0x1d18032f2e5acd907bffb4db2103b3d1d337388078ed9238a913c0cabecb928f", + "email": "0xe36f28b120650ba4c2597063b456d4d00847532129bd26dc8c150291265eef23", + "note": "0x086341fc0392c796d5f84f78f183deef347fa327e3d48707c460fc4d9c1f9910" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "0ee225e77747d7afafb81d1bffdf68c0" + }, + "age": { + "value": 41, + "salt": "9104931c19467233d902d1c967a15086" + } + }, + "logProof": { + "index": 3, + "treeSize": 16, + "path": [ + "0x5083ccb306cbefaa21d75b69a47668b0cd3943865500881281d96e05429face8", + "0x6528250e72e30d47b6b47dcefaa225bcb9fc1af0d20ee827c331486083baac56", + "0xef30cdbdc0b6467d74313d8b22b2054e32a17b3a484121ccc24cb16d8ad6fec0", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + }, + "indexProof": { + "index": 9, + "treeSize": 16, + "path": [ + "0xd0d85473c9adae91cb97fce47e564181ae990b38260de5efb1351e02ff9c3524", + "0xb3e51e807cccee32941e4d7009700ae40055645eb9e8bc6974ebe8ebf887a145", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 10, + "i": 9, + "id": "r9", + "c": { + "age": "0x1e440a3ce1d15a73c509b5b4da506157e42ac6cd8e96d486df66d049bfe8b8e6", + "country": "0xd5f75ca5ae34d41c6c6fe30f01061bec1260fd8fa9a134da20c616bd61b33428", + "email": "0x762b765d7cda44c06281ea75fea30bfc377adffe33d9df4ba065566f503ced67", + "note": "0x42b57a86fde59862104e06c5f9d7324e5edf2506e5c3874e0ae85e375ec46cdb" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b0371c1e4117eab6e65f46c8e7dd9b5c" + }, + "age": { + "value": 43, + "salt": "994a5723c379b33784b813642d91bca5" + } + }, + "logProof": { + "index": 9, + "treeSize": 16, + "path": [ + "0x65c032449d009130a92eb4bfc7a17fe17e0256c141a980d56ef6f7acc5ea65c1", + "0x5290791446b6001dc5b5819d38d10ce762a0337736bbf8e90a111e8fe3c77efe", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 10, + "treeSize": 16, + "path": [ + "0xccb00a519667f5206d54663c1449cfe26d2a69a21b58934e639d7fa5274a610b", + "0x59b6ac5d90106bce7337c4bbb3a25828e76f9fa97e001caee65d2540dad98ef0", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 11, + "i": 15, + "id": "r15", + "c": { + "age": "0x3e1980c7f773e302e4f9bf175e8edec38a53da7f2e46a5e371a77d57842c02fb", + "country": "0x1919bce313ba6d86fc4bf751e1f67b0a39b699615086212681149ff62c0885cf", + "email": "0x8c8c71ef8dd79da410a4cfc25639ea6119cbdd02c031eaa3ee9d661c65ba9aea", + "note": "0x2b31e8289c6fa63c019472defa0f58b1aad47fb3ff63a99484ddf9b95d3a3bd5" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "2e559c28fa7a80ed4f38fa8b45f2c82e" + }, + "age": { + "value": 45, + "salt": "ddef75f62d6301533303c7876d013294" + } + }, + "logProof": { + "index": 15, + "treeSize": 16, + "path": [ + "0x7bfd292a9ed546f18580c5251b801dc2756d80ab29a3c64eb0b81433a313307f", + "0x1dd8a5c51c6218cb8ca3a57ee7683a06b1e94aaedc7252a6b296e4091c975377", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 11, + "treeSize": 16, + "path": [ + "0x7144d8a6be6e7645cd0c8b69f028fc16b10e4f17fa86296a23c261922d75753e", + "0x59b6ac5d90106bce7337c4bbb3a25828e76f9fa97e001caee65d2540dad98ef0", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + } + ], + "before": { + "pos": 4, + "value": 29, + "i": 7, + "recordLeaf": "0xabbddf51854536b5605dc7c0630fd2fa170d2dcd9b1c5312aec6fea74c038c0d", + "indexProof": { + "index": 4, + "treeSize": 16, + "path": [ + "0x30a0dd012169393d0dea8791c0f24d70cc8d4c70d088f420825ec0dbf9230f67", + "0x15febe1a672c219d5d2f9fa007af3b5a9c3e7e47a61fe89875ae1cf60ebfb2df", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + "after": { + "pos": 12, + "value": 48, + "i": 4, + "recordLeaf": "0x423f202599ef3d02b5f3ff547235afd8e222ed7c26c61a01e4c15de7e2f4948b", + "indexProof": { + "index": 12, + "treeSize": 16, + "path": [ + "0x6e97bf24fed1277d34cc86719a8f63aab95067adfa7c5a6e70bde9daf8870f47", + "0x775811db8d2472f42cad2aeebbc3826f5f959e1f174501ca8ab4380ad815702a", + "0xec4bd620657cb68e435f6d2a71199370056c925b6184624a743fe49d818e9370", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + } + }, + "commitment": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 2, + "size": 16, + "logRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "createdAt": "2026-10-03T00:01:00.000Z", + "indexes": { + "age": { + "root": "0xfc641a2eadd7d876f9b4fe284dac094fb83543cf43a2c2f80e88f6d9e98114a7", + "size": 16 + }, + "country": { + "root": "0x5be9a95a39966382ab8d83179ae93380d723d49eff2f3b76a290a72a8ee60149", + "size": 16 + } + }, + "previous": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "dataset.completeness" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/dataset-answer/age-30-45.index-size.json b/conformance/vectori/dataset-answer/age-30-45.index-size.json new file mode 100644 index 0000000..6b7b3eb --- /dev/null +++ b/conformance/vectori/dataset-answer/age-30-45.index-size.json @@ -0,0 +1,394 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "dataset-answer/age-30-45.index-size", + "artifact": "dataset-answer", + "title": "the answer states another index size than the commitment", + "source": "derived from dataset-answer/age-30-45.valid", + "requires": [], + "exercises": [ + "dataset.commitment", + "dataset.completeness", + "dataset.field", + "dataset.form", + "dataset.inclusion", + "dataset.index", + "dataset.order", + "dataset.range" + ], + "base": "dataset-answer/age-30-45.valid", + "mutation": { + "op": "set", + "path": [ + "answer", + "indexSize" + ], + "value": 17 + }, + "input": { + "answer": { + "v": 1, + "kind": "aere-verifiable-query-answer", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "field": "age", + "from": 30, + "to": 45, + "indexSize": 17, + "rows": [ + { + "pos": 5, + "i": 13, + "id": "r13", + "c": { + "age": "0x20131967249ae0130154c3dbbcbe8ab041200b4499ed270f2c9dd2c2ac3337f1", + "country": "0xffa95ca2afb61e95d628c3044b6e80746cccc11642ad35dafc6445cd905facdf", + "email": "0x2e6bca63ef9fad9e3ef55ae60405914a01577abd1caf0403109608f3f95a3700", + "note": "0x668a33b811cf8989b6ce36f7681928dd43371ea394d67df6136fb1580977121b" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b5ffd792267cac392d9d814c7809b198" + }, + "age": { + "value": 31, + "salt": "314d5643f6f54376235b422614dd1562" + } + }, + "logProof": { + "index": 13, + "treeSize": 16, + "path": [ + "0xd3cbc725743f95177070e430cd03ec9f6af06bc64e84c0c84ad19e5d5562a983", + "0x85c6057fcfb4dd1d0fdfc0e4a925284def148b2ee0513c6858a29070aca4d50d", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 5, + "treeSize": 16, + "path": [ + "0xc4723e9eb2ff7168890f1a366b02d3ed1452ac476e98996cd0c91634af7423ed", + "0x15febe1a672c219d5d2f9fa007af3b5a9c3e7e47a61fe89875ae1cf60ebfb2df", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 6, + "i": 2, + "id": "r2", + "c": { + "age": "0xec15dd9b6e14956f9e3e9ea696f943972ab7601093c1c488ec18d40eb1431d42", + "country": "0x8d9e791776f47b5aeb079763edfdd40d26fc94742c8410a4f8d45e6ff1e901e6", + "email": "0xb9bfbcffff236803e9faabb11490ee1749c02a5566ae6e22380ae7dafc16322e", + "note": "0x86d1f7ae6700f8a22cb3c6a97b27d85d226beae6c4ca4c6eccd3e18b2fd85644" + }, + "disclosed": { + "country": { + "value": "FR", + "salt": "6a20a411bddb217e3ba890baad65b87e" + }, + "age": { + "value": 34, + "salt": "a83f62663d8735a83a784f603de20b88" + } + }, + "logProof": { + "index": 2, + "treeSize": 16, + "path": [ + "0x559b8f51f7b31a6feed18feeb876141c8a19af7f49169aee7a9833b59b65eaa2", + "0x6528250e72e30d47b6b47dcefaa225bcb9fc1af0d20ee827c331486083baac56", + "0xef30cdbdc0b6467d74313d8b22b2054e32a17b3a484121ccc24cb16d8ad6fec0", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + }, + "indexProof": { + "index": 6, + "treeSize": 16, + "path": [ + "0xdc9c9be2d7bc348acbd1cc004108f4af0386cec42492ae4fc3d62a9840d5f7bd", + "0x140d04bd298186a3efce73de4e3ea60f7f0300d21f2970efffc9f918ab004475", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 7, + "i": 8, + "id": "r8", + "c": { + "age": "0xc6b4096f4947760268564e73c3afb7edf8c31f1fe8a5371c85eeb606ac22ea25", + "country": "0x9b959d0dad5df75cf7f29a408750b730b9fc41403f4fc50168cc14ce2ca437ee", + "email": "0x598b4823a385d1f34c855b8bb873241bc66ddbd0a8f6b09d92cba14534454484", + "note": "0x4bd0762227e6c5d7f6ceac6185a23fe5075a33576dcd1e4e51aa9a4b0e0a1158" + }, + "disclosed": { + "country": { + "value": "RO", + "salt": "0a263d3e4223cc52f078c225a273e316" + }, + "age": { + "value": 36, + "salt": "bcb34a3f54db5f21299add6f1c654670" + } + }, + "logProof": { + "index": 8, + "treeSize": 16, + "path": [ + "0x7eb65d9a7f7ffa3039e627af43216d59accf7d3ca8a2951c2b0418c0199a1c9f", + "0x5290791446b6001dc5b5819d38d10ce762a0337736bbf8e90a111e8fe3c77efe", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 7, + "treeSize": 16, + "path": [ + "0x201009717c9f1fc80cd77e2a975390858ff4a4b76511bb7a31d36ea58bedeceb", + "0x140d04bd298186a3efce73de4e3ea60f7f0300d21f2970efffc9f918ab004475", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 8, + "i": 14, + "id": "r14", + "c": { + "age": "0x2a86b9afad1aff1234aa90bdf96095d07ef5d479992a9081c21adc965a3c20c3", + "country": "0xebd5ee1cac77bb2b170c930d964032218f9f9c69284c89b213dbefb2d54b8eee", + "email": "0xb9319475dca37efe658a39f9f7c10d13dd21a32276ec911dc57a2677a4e4bb50", + "note": "0x3fdbec96439422e50f7faabf111c8c8c2690460aad638b745a6875678fd38f34" + }, + "disclosed": { + "country": { + "value": "FR", + "salt": "15d426374424c484ffc8ae1bb736d960" + }, + "age": { + "value": 38, + "salt": "d750eb0354fb432536e3c26e5c682210" + } + }, + "logProof": { + "index": 14, + "treeSize": 16, + "path": [ + "0x12c9a4faf655bb09dbbb6a5fb3a24e44330e5d83222439ab2d2c2224c3791d84", + "0x1dd8a5c51c6218cb8ca3a57ee7683a06b1e94aaedc7252a6b296e4091c975377", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 8, + "treeSize": 16, + "path": [ + "0x9e4143c4b05ba68e176ae53bc5f122c1a490c3e1efeaa6bd9501110c5fb4d059", + "0xb3e51e807cccee32941e4d7009700ae40055645eb9e8bc6974ebe8ebf887a145", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 9, + "i": 3, + "id": "r3", + "c": { + "age": "0x13ec2a42a36e8b12ebdbd35af1d96962683a06b802e9e1f9e2e020487c691f7f", + "country": "0x1d18032f2e5acd907bffb4db2103b3d1d337388078ed9238a913c0cabecb928f", + "email": "0xe36f28b120650ba4c2597063b456d4d00847532129bd26dc8c150291265eef23", + "note": "0x086341fc0392c796d5f84f78f183deef347fa327e3d48707c460fc4d9c1f9910" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "0ee225e77747d7afafb81d1bffdf68c0" + }, + "age": { + "value": 41, + "salt": "9104931c19467233d902d1c967a15086" + } + }, + "logProof": { + "index": 3, + "treeSize": 16, + "path": [ + "0x5083ccb306cbefaa21d75b69a47668b0cd3943865500881281d96e05429face8", + "0x6528250e72e30d47b6b47dcefaa225bcb9fc1af0d20ee827c331486083baac56", + "0xef30cdbdc0b6467d74313d8b22b2054e32a17b3a484121ccc24cb16d8ad6fec0", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + }, + "indexProof": { + "index": 9, + "treeSize": 16, + "path": [ + "0xd0d85473c9adae91cb97fce47e564181ae990b38260de5efb1351e02ff9c3524", + "0xb3e51e807cccee32941e4d7009700ae40055645eb9e8bc6974ebe8ebf887a145", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 10, + "i": 9, + "id": "r9", + "c": { + "age": "0x1e440a3ce1d15a73c509b5b4da506157e42ac6cd8e96d486df66d049bfe8b8e6", + "country": "0xd5f75ca5ae34d41c6c6fe30f01061bec1260fd8fa9a134da20c616bd61b33428", + "email": "0x762b765d7cda44c06281ea75fea30bfc377adffe33d9df4ba065566f503ced67", + "note": "0x42b57a86fde59862104e06c5f9d7324e5edf2506e5c3874e0ae85e375ec46cdb" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b0371c1e4117eab6e65f46c8e7dd9b5c" + }, + "age": { + "value": 43, + "salt": "994a5723c379b33784b813642d91bca5" + } + }, + "logProof": { + "index": 9, + "treeSize": 16, + "path": [ + "0x65c032449d009130a92eb4bfc7a17fe17e0256c141a980d56ef6f7acc5ea65c1", + "0x5290791446b6001dc5b5819d38d10ce762a0337736bbf8e90a111e8fe3c77efe", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 10, + "treeSize": 16, + "path": [ + "0xccb00a519667f5206d54663c1449cfe26d2a69a21b58934e639d7fa5274a610b", + "0x59b6ac5d90106bce7337c4bbb3a25828e76f9fa97e001caee65d2540dad98ef0", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 11, + "i": 15, + "id": "r15", + "c": { + "age": "0x3e1980c7f773e302e4f9bf175e8edec38a53da7f2e46a5e371a77d57842c02fb", + "country": "0x1919bce313ba6d86fc4bf751e1f67b0a39b699615086212681149ff62c0885cf", + "email": "0x8c8c71ef8dd79da410a4cfc25639ea6119cbdd02c031eaa3ee9d661c65ba9aea", + "note": "0x2b31e8289c6fa63c019472defa0f58b1aad47fb3ff63a99484ddf9b95d3a3bd5" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "2e559c28fa7a80ed4f38fa8b45f2c82e" + }, + "age": { + "value": 45, + "salt": "ddef75f62d6301533303c7876d013294" + } + }, + "logProof": { + "index": 15, + "treeSize": 16, + "path": [ + "0x7bfd292a9ed546f18580c5251b801dc2756d80ab29a3c64eb0b81433a313307f", + "0x1dd8a5c51c6218cb8ca3a57ee7683a06b1e94aaedc7252a6b296e4091c975377", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 11, + "treeSize": 16, + "path": [ + "0x7144d8a6be6e7645cd0c8b69f028fc16b10e4f17fa86296a23c261922d75753e", + "0x59b6ac5d90106bce7337c4bbb3a25828e76f9fa97e001caee65d2540dad98ef0", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + } + ], + "before": { + "pos": 4, + "value": 29, + "i": 7, + "recordLeaf": "0xabbddf51854536b5605dc7c0630fd2fa170d2dcd9b1c5312aec6fea74c038c0d", + "indexProof": { + "index": 4, + "treeSize": 16, + "path": [ + "0x30a0dd012169393d0dea8791c0f24d70cc8d4c70d088f420825ec0dbf9230f67", + "0x15febe1a672c219d5d2f9fa007af3b5a9c3e7e47a61fe89875ae1cf60ebfb2df", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + "after": { + "pos": 12, + "value": 48, + "i": 4, + "recordLeaf": "0x423f202599ef3d02b5f3ff547235afd8e222ed7c26c61a01e4c15de7e2f4948b", + "indexProof": { + "index": 12, + "treeSize": 16, + "path": [ + "0x6e97bf24fed1277d34cc86719a8f63aab95067adfa7c5a6e70bde9daf8870f47", + "0x775811db8d2472f42cad2aeebbc3826f5f959e1f174501ca8ab4380ad815702a", + "0xec4bd620657cb68e435f6d2a71199370056c925b6184624a743fe49d818e9370", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + } + }, + "commitment": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 2, + "size": 16, + "logRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "createdAt": "2026-10-03T00:01:00.000Z", + "indexes": { + "age": { + "root": "0xfc641a2eadd7d876f9b4fe284dac094fb83543cf43a2c2f80e88f6d9e98114a7", + "size": 16 + }, + "country": { + "root": "0x5be9a95a39966382ab8d83179ae93380d723d49eff2f3b76a290a72a8ee60149", + "size": 16 + } + }, + "previous": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "dataset.commitment" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/dataset-answer/age-30-45.index-undisclosed.json b/conformance/vectori/dataset-answer/age-30-45.index-undisclosed.json new file mode 100644 index 0000000..d2a4fb7 --- /dev/null +++ b/conformance/vectori/dataset-answer/age-30-45.index-undisclosed.json @@ -0,0 +1,392 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "dataset-answer/age-30-45.index-undisclosed", + "artifact": "dataset-answer", + "title": "a row that does not disclose the queried field", + "source": "derived from dataset-answer/age-30-45.valid", + "requires": [], + "exercises": [ + "dataset.commitment", + "dataset.completeness", + "dataset.field", + "dataset.form", + "dataset.inclusion", + "dataset.index", + "dataset.order", + "dataset.range" + ], + "base": "dataset-answer/age-30-45.valid", + "mutation": { + "op": "remove", + "path": [ + "answer", + "rows", + 1, + "disclosed", + "age" + ] + }, + "input": { + "answer": { + "v": 1, + "kind": "aere-verifiable-query-answer", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "field": "age", + "from": 30, + "to": 45, + "indexSize": 16, + "rows": [ + { + "pos": 5, + "i": 13, + "id": "r13", + "c": { + "age": "0x20131967249ae0130154c3dbbcbe8ab041200b4499ed270f2c9dd2c2ac3337f1", + "country": "0xffa95ca2afb61e95d628c3044b6e80746cccc11642ad35dafc6445cd905facdf", + "email": "0x2e6bca63ef9fad9e3ef55ae60405914a01577abd1caf0403109608f3f95a3700", + "note": "0x668a33b811cf8989b6ce36f7681928dd43371ea394d67df6136fb1580977121b" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b5ffd792267cac392d9d814c7809b198" + }, + "age": { + "value": 31, + "salt": "314d5643f6f54376235b422614dd1562" + } + }, + "logProof": { + "index": 13, + "treeSize": 16, + "path": [ + "0xd3cbc725743f95177070e430cd03ec9f6af06bc64e84c0c84ad19e5d5562a983", + "0x85c6057fcfb4dd1d0fdfc0e4a925284def148b2ee0513c6858a29070aca4d50d", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 5, + "treeSize": 16, + "path": [ + "0xc4723e9eb2ff7168890f1a366b02d3ed1452ac476e98996cd0c91634af7423ed", + "0x15febe1a672c219d5d2f9fa007af3b5a9c3e7e47a61fe89875ae1cf60ebfb2df", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 6, + "i": 2, + "id": "r2", + "c": { + "age": "0xec15dd9b6e14956f9e3e9ea696f943972ab7601093c1c488ec18d40eb1431d42", + "country": "0x8d9e791776f47b5aeb079763edfdd40d26fc94742c8410a4f8d45e6ff1e901e6", + "email": "0xb9bfbcffff236803e9faabb11490ee1749c02a5566ae6e22380ae7dafc16322e", + "note": "0x86d1f7ae6700f8a22cb3c6a97b27d85d226beae6c4ca4c6eccd3e18b2fd85644" + }, + "disclosed": { + "country": { + "value": "FR", + "salt": "6a20a411bddb217e3ba890baad65b87e" + } + }, + "logProof": { + "index": 2, + "treeSize": 16, + "path": [ + "0x559b8f51f7b31a6feed18feeb876141c8a19af7f49169aee7a9833b59b65eaa2", + "0x6528250e72e30d47b6b47dcefaa225bcb9fc1af0d20ee827c331486083baac56", + "0xef30cdbdc0b6467d74313d8b22b2054e32a17b3a484121ccc24cb16d8ad6fec0", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + }, + "indexProof": { + "index": 6, + "treeSize": 16, + "path": [ + "0xdc9c9be2d7bc348acbd1cc004108f4af0386cec42492ae4fc3d62a9840d5f7bd", + "0x140d04bd298186a3efce73de4e3ea60f7f0300d21f2970efffc9f918ab004475", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 7, + "i": 8, + "id": "r8", + "c": { + "age": "0xc6b4096f4947760268564e73c3afb7edf8c31f1fe8a5371c85eeb606ac22ea25", + "country": "0x9b959d0dad5df75cf7f29a408750b730b9fc41403f4fc50168cc14ce2ca437ee", + "email": "0x598b4823a385d1f34c855b8bb873241bc66ddbd0a8f6b09d92cba14534454484", + "note": "0x4bd0762227e6c5d7f6ceac6185a23fe5075a33576dcd1e4e51aa9a4b0e0a1158" + }, + "disclosed": { + "country": { + "value": "RO", + "salt": "0a263d3e4223cc52f078c225a273e316" + }, + "age": { + "value": 36, + "salt": "bcb34a3f54db5f21299add6f1c654670" + } + }, + "logProof": { + "index": 8, + "treeSize": 16, + "path": [ + "0x7eb65d9a7f7ffa3039e627af43216d59accf7d3ca8a2951c2b0418c0199a1c9f", + "0x5290791446b6001dc5b5819d38d10ce762a0337736bbf8e90a111e8fe3c77efe", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 7, + "treeSize": 16, + "path": [ + "0x201009717c9f1fc80cd77e2a975390858ff4a4b76511bb7a31d36ea58bedeceb", + "0x140d04bd298186a3efce73de4e3ea60f7f0300d21f2970efffc9f918ab004475", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 8, + "i": 14, + "id": "r14", + "c": { + "age": "0x2a86b9afad1aff1234aa90bdf96095d07ef5d479992a9081c21adc965a3c20c3", + "country": "0xebd5ee1cac77bb2b170c930d964032218f9f9c69284c89b213dbefb2d54b8eee", + "email": "0xb9319475dca37efe658a39f9f7c10d13dd21a32276ec911dc57a2677a4e4bb50", + "note": "0x3fdbec96439422e50f7faabf111c8c8c2690460aad638b745a6875678fd38f34" + }, + "disclosed": { + "country": { + "value": "FR", + "salt": "15d426374424c484ffc8ae1bb736d960" + }, + "age": { + "value": 38, + "salt": "d750eb0354fb432536e3c26e5c682210" + } + }, + "logProof": { + "index": 14, + "treeSize": 16, + "path": [ + "0x12c9a4faf655bb09dbbb6a5fb3a24e44330e5d83222439ab2d2c2224c3791d84", + "0x1dd8a5c51c6218cb8ca3a57ee7683a06b1e94aaedc7252a6b296e4091c975377", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 8, + "treeSize": 16, + "path": [ + "0x9e4143c4b05ba68e176ae53bc5f122c1a490c3e1efeaa6bd9501110c5fb4d059", + "0xb3e51e807cccee32941e4d7009700ae40055645eb9e8bc6974ebe8ebf887a145", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 9, + "i": 3, + "id": "r3", + "c": { + "age": "0x13ec2a42a36e8b12ebdbd35af1d96962683a06b802e9e1f9e2e020487c691f7f", + "country": "0x1d18032f2e5acd907bffb4db2103b3d1d337388078ed9238a913c0cabecb928f", + "email": "0xe36f28b120650ba4c2597063b456d4d00847532129bd26dc8c150291265eef23", + "note": "0x086341fc0392c796d5f84f78f183deef347fa327e3d48707c460fc4d9c1f9910" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "0ee225e77747d7afafb81d1bffdf68c0" + }, + "age": { + "value": 41, + "salt": "9104931c19467233d902d1c967a15086" + } + }, + "logProof": { + "index": 3, + "treeSize": 16, + "path": [ + "0x5083ccb306cbefaa21d75b69a47668b0cd3943865500881281d96e05429face8", + "0x6528250e72e30d47b6b47dcefaa225bcb9fc1af0d20ee827c331486083baac56", + "0xef30cdbdc0b6467d74313d8b22b2054e32a17b3a484121ccc24cb16d8ad6fec0", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + }, + "indexProof": { + "index": 9, + "treeSize": 16, + "path": [ + "0xd0d85473c9adae91cb97fce47e564181ae990b38260de5efb1351e02ff9c3524", + "0xb3e51e807cccee32941e4d7009700ae40055645eb9e8bc6974ebe8ebf887a145", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 10, + "i": 9, + "id": "r9", + "c": { + "age": "0x1e440a3ce1d15a73c509b5b4da506157e42ac6cd8e96d486df66d049bfe8b8e6", + "country": "0xd5f75ca5ae34d41c6c6fe30f01061bec1260fd8fa9a134da20c616bd61b33428", + "email": "0x762b765d7cda44c06281ea75fea30bfc377adffe33d9df4ba065566f503ced67", + "note": "0x42b57a86fde59862104e06c5f9d7324e5edf2506e5c3874e0ae85e375ec46cdb" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b0371c1e4117eab6e65f46c8e7dd9b5c" + }, + "age": { + "value": 43, + "salt": "994a5723c379b33784b813642d91bca5" + } + }, + "logProof": { + "index": 9, + "treeSize": 16, + "path": [ + "0x65c032449d009130a92eb4bfc7a17fe17e0256c141a980d56ef6f7acc5ea65c1", + "0x5290791446b6001dc5b5819d38d10ce762a0337736bbf8e90a111e8fe3c77efe", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 10, + "treeSize": 16, + "path": [ + "0xccb00a519667f5206d54663c1449cfe26d2a69a21b58934e639d7fa5274a610b", + "0x59b6ac5d90106bce7337c4bbb3a25828e76f9fa97e001caee65d2540dad98ef0", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 11, + "i": 15, + "id": "r15", + "c": { + "age": "0x3e1980c7f773e302e4f9bf175e8edec38a53da7f2e46a5e371a77d57842c02fb", + "country": "0x1919bce313ba6d86fc4bf751e1f67b0a39b699615086212681149ff62c0885cf", + "email": "0x8c8c71ef8dd79da410a4cfc25639ea6119cbdd02c031eaa3ee9d661c65ba9aea", + "note": "0x2b31e8289c6fa63c019472defa0f58b1aad47fb3ff63a99484ddf9b95d3a3bd5" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "2e559c28fa7a80ed4f38fa8b45f2c82e" + }, + "age": { + "value": 45, + "salt": "ddef75f62d6301533303c7876d013294" + } + }, + "logProof": { + "index": 15, + "treeSize": 16, + "path": [ + "0x7bfd292a9ed546f18580c5251b801dc2756d80ab29a3c64eb0b81433a313307f", + "0x1dd8a5c51c6218cb8ca3a57ee7683a06b1e94aaedc7252a6b296e4091c975377", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 11, + "treeSize": 16, + "path": [ + "0x7144d8a6be6e7645cd0c8b69f028fc16b10e4f17fa86296a23c261922d75753e", + "0x59b6ac5d90106bce7337c4bbb3a25828e76f9fa97e001caee65d2540dad98ef0", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + } + ], + "before": { + "pos": 4, + "value": 29, + "i": 7, + "recordLeaf": "0xabbddf51854536b5605dc7c0630fd2fa170d2dcd9b1c5312aec6fea74c038c0d", + "indexProof": { + "index": 4, + "treeSize": 16, + "path": [ + "0x30a0dd012169393d0dea8791c0f24d70cc8d4c70d088f420825ec0dbf9230f67", + "0x15febe1a672c219d5d2f9fa007af3b5a9c3e7e47a61fe89875ae1cf60ebfb2df", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + "after": { + "pos": 12, + "value": 48, + "i": 4, + "recordLeaf": "0x423f202599ef3d02b5f3ff547235afd8e222ed7c26c61a01e4c15de7e2f4948b", + "indexProof": { + "index": 12, + "treeSize": 16, + "path": [ + "0x6e97bf24fed1277d34cc86719a8f63aab95067adfa7c5a6e70bde9daf8870f47", + "0x775811db8d2472f42cad2aeebbc3826f5f959e1f174501ca8ab4380ad815702a", + "0xec4bd620657cb68e435f6d2a71199370056c925b6184624a743fe49d818e9370", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + } + }, + "commitment": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 2, + "size": 16, + "logRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "createdAt": "2026-10-03T00:01:00.000Z", + "indexes": { + "age": { + "root": "0xfc641a2eadd7d876f9b4fe284dac094fb83543cf43a2c2f80e88f6d9e98114a7", + "size": 16 + }, + "country": { + "root": "0x5be9a95a39966382ab8d83179ae93380d723d49eff2f3b76a290a72a8ee60149", + "size": 16 + } + }, + "previous": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "dataset.index" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/dataset-answer/age-30-45.index.json b/conformance/vectori/dataset-answer/age-30-45.index.json new file mode 100644 index 0000000..e197299 --- /dev/null +++ b/conformance/vectori/dataset-answer/age-30-45.index.json @@ -0,0 +1,398 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "dataset-answer/age-30-45.index", + "artifact": "dataset-answer", + "title": "one hash of a row's index proof changed", + "source": "derived from dataset-answer/age-30-45.valid", + "requires": [], + "exercises": [ + "dataset.commitment", + "dataset.completeness", + "dataset.field", + "dataset.form", + "dataset.inclusion", + "dataset.index", + "dataset.order", + "dataset.range" + ], + "base": "dataset-answer/age-30-45.valid", + "mutation": { + "op": "set", + "path": [ + "answer", + "rows", + 1, + "indexProof", + "path", + 0 + ], + "value": "0xdc9c9be2d7bc348acbd1cc004108f4af0386cec42492ae4fc3d62a9840d5f7b0" + }, + "input": { + "answer": { + "v": 1, + "kind": "aere-verifiable-query-answer", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "field": "age", + "from": 30, + "to": 45, + "indexSize": 16, + "rows": [ + { + "pos": 5, + "i": 13, + "id": "r13", + "c": { + "age": "0x20131967249ae0130154c3dbbcbe8ab041200b4499ed270f2c9dd2c2ac3337f1", + "country": "0xffa95ca2afb61e95d628c3044b6e80746cccc11642ad35dafc6445cd905facdf", + "email": "0x2e6bca63ef9fad9e3ef55ae60405914a01577abd1caf0403109608f3f95a3700", + "note": "0x668a33b811cf8989b6ce36f7681928dd43371ea394d67df6136fb1580977121b" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b5ffd792267cac392d9d814c7809b198" + }, + "age": { + "value": 31, + "salt": "314d5643f6f54376235b422614dd1562" + } + }, + "logProof": { + "index": 13, + "treeSize": 16, + "path": [ + "0xd3cbc725743f95177070e430cd03ec9f6af06bc64e84c0c84ad19e5d5562a983", + "0x85c6057fcfb4dd1d0fdfc0e4a925284def148b2ee0513c6858a29070aca4d50d", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 5, + "treeSize": 16, + "path": [ + "0xc4723e9eb2ff7168890f1a366b02d3ed1452ac476e98996cd0c91634af7423ed", + "0x15febe1a672c219d5d2f9fa007af3b5a9c3e7e47a61fe89875ae1cf60ebfb2df", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 6, + "i": 2, + "id": "r2", + "c": { + "age": "0xec15dd9b6e14956f9e3e9ea696f943972ab7601093c1c488ec18d40eb1431d42", + "country": "0x8d9e791776f47b5aeb079763edfdd40d26fc94742c8410a4f8d45e6ff1e901e6", + "email": "0xb9bfbcffff236803e9faabb11490ee1749c02a5566ae6e22380ae7dafc16322e", + "note": "0x86d1f7ae6700f8a22cb3c6a97b27d85d226beae6c4ca4c6eccd3e18b2fd85644" + }, + "disclosed": { + "country": { + "value": "FR", + "salt": "6a20a411bddb217e3ba890baad65b87e" + }, + "age": { + "value": 34, + "salt": "a83f62663d8735a83a784f603de20b88" + } + }, + "logProof": { + "index": 2, + "treeSize": 16, + "path": [ + "0x559b8f51f7b31a6feed18feeb876141c8a19af7f49169aee7a9833b59b65eaa2", + "0x6528250e72e30d47b6b47dcefaa225bcb9fc1af0d20ee827c331486083baac56", + "0xef30cdbdc0b6467d74313d8b22b2054e32a17b3a484121ccc24cb16d8ad6fec0", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + }, + "indexProof": { + "index": 6, + "treeSize": 16, + "path": [ + "0xdc9c9be2d7bc348acbd1cc004108f4af0386cec42492ae4fc3d62a9840d5f7b0", + "0x140d04bd298186a3efce73de4e3ea60f7f0300d21f2970efffc9f918ab004475", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 7, + "i": 8, + "id": "r8", + "c": { + "age": "0xc6b4096f4947760268564e73c3afb7edf8c31f1fe8a5371c85eeb606ac22ea25", + "country": "0x9b959d0dad5df75cf7f29a408750b730b9fc41403f4fc50168cc14ce2ca437ee", + "email": "0x598b4823a385d1f34c855b8bb873241bc66ddbd0a8f6b09d92cba14534454484", + "note": "0x4bd0762227e6c5d7f6ceac6185a23fe5075a33576dcd1e4e51aa9a4b0e0a1158" + }, + "disclosed": { + "country": { + "value": "RO", + "salt": "0a263d3e4223cc52f078c225a273e316" + }, + "age": { + "value": 36, + "salt": "bcb34a3f54db5f21299add6f1c654670" + } + }, + "logProof": { + "index": 8, + "treeSize": 16, + "path": [ + "0x7eb65d9a7f7ffa3039e627af43216d59accf7d3ca8a2951c2b0418c0199a1c9f", + "0x5290791446b6001dc5b5819d38d10ce762a0337736bbf8e90a111e8fe3c77efe", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 7, + "treeSize": 16, + "path": [ + "0x201009717c9f1fc80cd77e2a975390858ff4a4b76511bb7a31d36ea58bedeceb", + "0x140d04bd298186a3efce73de4e3ea60f7f0300d21f2970efffc9f918ab004475", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 8, + "i": 14, + "id": "r14", + "c": { + "age": "0x2a86b9afad1aff1234aa90bdf96095d07ef5d479992a9081c21adc965a3c20c3", + "country": "0xebd5ee1cac77bb2b170c930d964032218f9f9c69284c89b213dbefb2d54b8eee", + "email": "0xb9319475dca37efe658a39f9f7c10d13dd21a32276ec911dc57a2677a4e4bb50", + "note": "0x3fdbec96439422e50f7faabf111c8c8c2690460aad638b745a6875678fd38f34" + }, + "disclosed": { + "country": { + "value": "FR", + "salt": "15d426374424c484ffc8ae1bb736d960" + }, + "age": { + "value": 38, + "salt": "d750eb0354fb432536e3c26e5c682210" + } + }, + "logProof": { + "index": 14, + "treeSize": 16, + "path": [ + "0x12c9a4faf655bb09dbbb6a5fb3a24e44330e5d83222439ab2d2c2224c3791d84", + "0x1dd8a5c51c6218cb8ca3a57ee7683a06b1e94aaedc7252a6b296e4091c975377", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 8, + "treeSize": 16, + "path": [ + "0x9e4143c4b05ba68e176ae53bc5f122c1a490c3e1efeaa6bd9501110c5fb4d059", + "0xb3e51e807cccee32941e4d7009700ae40055645eb9e8bc6974ebe8ebf887a145", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 9, + "i": 3, + "id": "r3", + "c": { + "age": "0x13ec2a42a36e8b12ebdbd35af1d96962683a06b802e9e1f9e2e020487c691f7f", + "country": "0x1d18032f2e5acd907bffb4db2103b3d1d337388078ed9238a913c0cabecb928f", + "email": "0xe36f28b120650ba4c2597063b456d4d00847532129bd26dc8c150291265eef23", + "note": "0x086341fc0392c796d5f84f78f183deef347fa327e3d48707c460fc4d9c1f9910" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "0ee225e77747d7afafb81d1bffdf68c0" + }, + "age": { + "value": 41, + "salt": "9104931c19467233d902d1c967a15086" + } + }, + "logProof": { + "index": 3, + "treeSize": 16, + "path": [ + "0x5083ccb306cbefaa21d75b69a47668b0cd3943865500881281d96e05429face8", + "0x6528250e72e30d47b6b47dcefaa225bcb9fc1af0d20ee827c331486083baac56", + "0xef30cdbdc0b6467d74313d8b22b2054e32a17b3a484121ccc24cb16d8ad6fec0", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + }, + "indexProof": { + "index": 9, + "treeSize": 16, + "path": [ + "0xd0d85473c9adae91cb97fce47e564181ae990b38260de5efb1351e02ff9c3524", + "0xb3e51e807cccee32941e4d7009700ae40055645eb9e8bc6974ebe8ebf887a145", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 10, + "i": 9, + "id": "r9", + "c": { + "age": "0x1e440a3ce1d15a73c509b5b4da506157e42ac6cd8e96d486df66d049bfe8b8e6", + "country": "0xd5f75ca5ae34d41c6c6fe30f01061bec1260fd8fa9a134da20c616bd61b33428", + "email": "0x762b765d7cda44c06281ea75fea30bfc377adffe33d9df4ba065566f503ced67", + "note": "0x42b57a86fde59862104e06c5f9d7324e5edf2506e5c3874e0ae85e375ec46cdb" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b0371c1e4117eab6e65f46c8e7dd9b5c" + }, + "age": { + "value": 43, + "salt": "994a5723c379b33784b813642d91bca5" + } + }, + "logProof": { + "index": 9, + "treeSize": 16, + "path": [ + "0x65c032449d009130a92eb4bfc7a17fe17e0256c141a980d56ef6f7acc5ea65c1", + "0x5290791446b6001dc5b5819d38d10ce762a0337736bbf8e90a111e8fe3c77efe", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 10, + "treeSize": 16, + "path": [ + "0xccb00a519667f5206d54663c1449cfe26d2a69a21b58934e639d7fa5274a610b", + "0x59b6ac5d90106bce7337c4bbb3a25828e76f9fa97e001caee65d2540dad98ef0", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 11, + "i": 15, + "id": "r15", + "c": { + "age": "0x3e1980c7f773e302e4f9bf175e8edec38a53da7f2e46a5e371a77d57842c02fb", + "country": "0x1919bce313ba6d86fc4bf751e1f67b0a39b699615086212681149ff62c0885cf", + "email": "0x8c8c71ef8dd79da410a4cfc25639ea6119cbdd02c031eaa3ee9d661c65ba9aea", + "note": "0x2b31e8289c6fa63c019472defa0f58b1aad47fb3ff63a99484ddf9b95d3a3bd5" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "2e559c28fa7a80ed4f38fa8b45f2c82e" + }, + "age": { + "value": 45, + "salt": "ddef75f62d6301533303c7876d013294" + } + }, + "logProof": { + "index": 15, + "treeSize": 16, + "path": [ + "0x7bfd292a9ed546f18580c5251b801dc2756d80ab29a3c64eb0b81433a313307f", + "0x1dd8a5c51c6218cb8ca3a57ee7683a06b1e94aaedc7252a6b296e4091c975377", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 11, + "treeSize": 16, + "path": [ + "0x7144d8a6be6e7645cd0c8b69f028fc16b10e4f17fa86296a23c261922d75753e", + "0x59b6ac5d90106bce7337c4bbb3a25828e76f9fa97e001caee65d2540dad98ef0", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + } + ], + "before": { + "pos": 4, + "value": 29, + "i": 7, + "recordLeaf": "0xabbddf51854536b5605dc7c0630fd2fa170d2dcd9b1c5312aec6fea74c038c0d", + "indexProof": { + "index": 4, + "treeSize": 16, + "path": [ + "0x30a0dd012169393d0dea8791c0f24d70cc8d4c70d088f420825ec0dbf9230f67", + "0x15febe1a672c219d5d2f9fa007af3b5a9c3e7e47a61fe89875ae1cf60ebfb2df", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + "after": { + "pos": 12, + "value": 48, + "i": 4, + "recordLeaf": "0x423f202599ef3d02b5f3ff547235afd8e222ed7c26c61a01e4c15de7e2f4948b", + "indexProof": { + "index": 12, + "treeSize": 16, + "path": [ + "0x6e97bf24fed1277d34cc86719a8f63aab95067adfa7c5a6e70bde9daf8870f47", + "0x775811db8d2472f42cad2aeebbc3826f5f959e1f174501ca8ab4380ad815702a", + "0xec4bd620657cb68e435f6d2a71199370056c925b6184624a743fe49d818e9370", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + } + }, + "commitment": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 2, + "size": 16, + "logRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "createdAt": "2026-10-03T00:01:00.000Z", + "indexes": { + "age": { + "root": "0xfc641a2eadd7d876f9b4fe284dac094fb83543cf43a2c2f80e88f6d9e98114a7", + "size": 16 + }, + "country": { + "root": "0x5be9a95a39966382ab8d83179ae93380d723d49eff2f3b76a290a72a8ee60149", + "size": 16 + } + }, + "previous": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "dataset.index" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/dataset-answer/age-30-45.range.json b/conformance/vectori/dataset-answer/age-30-45.range.json new file mode 100644 index 0000000..2d70f34 --- /dev/null +++ b/conformance/vectori/dataset-answer/age-30-45.range.json @@ -0,0 +1,394 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "dataset-answer/age-30-45.range", + "artifact": "dataset-answer", + "title": "the answer claims a narrower range than the rows it returns", + "source": "derived from dataset-answer/age-30-45.valid", + "requires": [], + "exercises": [ + "dataset.commitment", + "dataset.completeness", + "dataset.field", + "dataset.form", + "dataset.inclusion", + "dataset.index", + "dataset.order", + "dataset.range" + ], + "base": "dataset-answer/age-30-45.valid", + "mutation": { + "op": "set", + "path": [ + "answer", + "to" + ], + "value": 31 + }, + "input": { + "answer": { + "v": 1, + "kind": "aere-verifiable-query-answer", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "field": "age", + "from": 30, + "to": 31, + "indexSize": 16, + "rows": [ + { + "pos": 5, + "i": 13, + "id": "r13", + "c": { + "age": "0x20131967249ae0130154c3dbbcbe8ab041200b4499ed270f2c9dd2c2ac3337f1", + "country": "0xffa95ca2afb61e95d628c3044b6e80746cccc11642ad35dafc6445cd905facdf", + "email": "0x2e6bca63ef9fad9e3ef55ae60405914a01577abd1caf0403109608f3f95a3700", + "note": "0x668a33b811cf8989b6ce36f7681928dd43371ea394d67df6136fb1580977121b" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b5ffd792267cac392d9d814c7809b198" + }, + "age": { + "value": 31, + "salt": "314d5643f6f54376235b422614dd1562" + } + }, + "logProof": { + "index": 13, + "treeSize": 16, + "path": [ + "0xd3cbc725743f95177070e430cd03ec9f6af06bc64e84c0c84ad19e5d5562a983", + "0x85c6057fcfb4dd1d0fdfc0e4a925284def148b2ee0513c6858a29070aca4d50d", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 5, + "treeSize": 16, + "path": [ + "0xc4723e9eb2ff7168890f1a366b02d3ed1452ac476e98996cd0c91634af7423ed", + "0x15febe1a672c219d5d2f9fa007af3b5a9c3e7e47a61fe89875ae1cf60ebfb2df", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 6, + "i": 2, + "id": "r2", + "c": { + "age": "0xec15dd9b6e14956f9e3e9ea696f943972ab7601093c1c488ec18d40eb1431d42", + "country": "0x8d9e791776f47b5aeb079763edfdd40d26fc94742c8410a4f8d45e6ff1e901e6", + "email": "0xb9bfbcffff236803e9faabb11490ee1749c02a5566ae6e22380ae7dafc16322e", + "note": "0x86d1f7ae6700f8a22cb3c6a97b27d85d226beae6c4ca4c6eccd3e18b2fd85644" + }, + "disclosed": { + "country": { + "value": "FR", + "salt": "6a20a411bddb217e3ba890baad65b87e" + }, + "age": { + "value": 34, + "salt": "a83f62663d8735a83a784f603de20b88" + } + }, + "logProof": { + "index": 2, + "treeSize": 16, + "path": [ + "0x559b8f51f7b31a6feed18feeb876141c8a19af7f49169aee7a9833b59b65eaa2", + "0x6528250e72e30d47b6b47dcefaa225bcb9fc1af0d20ee827c331486083baac56", + "0xef30cdbdc0b6467d74313d8b22b2054e32a17b3a484121ccc24cb16d8ad6fec0", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + }, + "indexProof": { + "index": 6, + "treeSize": 16, + "path": [ + "0xdc9c9be2d7bc348acbd1cc004108f4af0386cec42492ae4fc3d62a9840d5f7bd", + "0x140d04bd298186a3efce73de4e3ea60f7f0300d21f2970efffc9f918ab004475", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 7, + "i": 8, + "id": "r8", + "c": { + "age": "0xc6b4096f4947760268564e73c3afb7edf8c31f1fe8a5371c85eeb606ac22ea25", + "country": "0x9b959d0dad5df75cf7f29a408750b730b9fc41403f4fc50168cc14ce2ca437ee", + "email": "0x598b4823a385d1f34c855b8bb873241bc66ddbd0a8f6b09d92cba14534454484", + "note": "0x4bd0762227e6c5d7f6ceac6185a23fe5075a33576dcd1e4e51aa9a4b0e0a1158" + }, + "disclosed": { + "country": { + "value": "RO", + "salt": "0a263d3e4223cc52f078c225a273e316" + }, + "age": { + "value": 36, + "salt": "bcb34a3f54db5f21299add6f1c654670" + } + }, + "logProof": { + "index": 8, + "treeSize": 16, + "path": [ + "0x7eb65d9a7f7ffa3039e627af43216d59accf7d3ca8a2951c2b0418c0199a1c9f", + "0x5290791446b6001dc5b5819d38d10ce762a0337736bbf8e90a111e8fe3c77efe", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 7, + "treeSize": 16, + "path": [ + "0x201009717c9f1fc80cd77e2a975390858ff4a4b76511bb7a31d36ea58bedeceb", + "0x140d04bd298186a3efce73de4e3ea60f7f0300d21f2970efffc9f918ab004475", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 8, + "i": 14, + "id": "r14", + "c": { + "age": "0x2a86b9afad1aff1234aa90bdf96095d07ef5d479992a9081c21adc965a3c20c3", + "country": "0xebd5ee1cac77bb2b170c930d964032218f9f9c69284c89b213dbefb2d54b8eee", + "email": "0xb9319475dca37efe658a39f9f7c10d13dd21a32276ec911dc57a2677a4e4bb50", + "note": "0x3fdbec96439422e50f7faabf111c8c8c2690460aad638b745a6875678fd38f34" + }, + "disclosed": { + "country": { + "value": "FR", + "salt": "15d426374424c484ffc8ae1bb736d960" + }, + "age": { + "value": 38, + "salt": "d750eb0354fb432536e3c26e5c682210" + } + }, + "logProof": { + "index": 14, + "treeSize": 16, + "path": [ + "0x12c9a4faf655bb09dbbb6a5fb3a24e44330e5d83222439ab2d2c2224c3791d84", + "0x1dd8a5c51c6218cb8ca3a57ee7683a06b1e94aaedc7252a6b296e4091c975377", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 8, + "treeSize": 16, + "path": [ + "0x9e4143c4b05ba68e176ae53bc5f122c1a490c3e1efeaa6bd9501110c5fb4d059", + "0xb3e51e807cccee32941e4d7009700ae40055645eb9e8bc6974ebe8ebf887a145", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 9, + "i": 3, + "id": "r3", + "c": { + "age": "0x13ec2a42a36e8b12ebdbd35af1d96962683a06b802e9e1f9e2e020487c691f7f", + "country": "0x1d18032f2e5acd907bffb4db2103b3d1d337388078ed9238a913c0cabecb928f", + "email": "0xe36f28b120650ba4c2597063b456d4d00847532129bd26dc8c150291265eef23", + "note": "0x086341fc0392c796d5f84f78f183deef347fa327e3d48707c460fc4d9c1f9910" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "0ee225e77747d7afafb81d1bffdf68c0" + }, + "age": { + "value": 41, + "salt": "9104931c19467233d902d1c967a15086" + } + }, + "logProof": { + "index": 3, + "treeSize": 16, + "path": [ + "0x5083ccb306cbefaa21d75b69a47668b0cd3943865500881281d96e05429face8", + "0x6528250e72e30d47b6b47dcefaa225bcb9fc1af0d20ee827c331486083baac56", + "0xef30cdbdc0b6467d74313d8b22b2054e32a17b3a484121ccc24cb16d8ad6fec0", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + }, + "indexProof": { + "index": 9, + "treeSize": 16, + "path": [ + "0xd0d85473c9adae91cb97fce47e564181ae990b38260de5efb1351e02ff9c3524", + "0xb3e51e807cccee32941e4d7009700ae40055645eb9e8bc6974ebe8ebf887a145", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 10, + "i": 9, + "id": "r9", + "c": { + "age": "0x1e440a3ce1d15a73c509b5b4da506157e42ac6cd8e96d486df66d049bfe8b8e6", + "country": "0xd5f75ca5ae34d41c6c6fe30f01061bec1260fd8fa9a134da20c616bd61b33428", + "email": "0x762b765d7cda44c06281ea75fea30bfc377adffe33d9df4ba065566f503ced67", + "note": "0x42b57a86fde59862104e06c5f9d7324e5edf2506e5c3874e0ae85e375ec46cdb" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b0371c1e4117eab6e65f46c8e7dd9b5c" + }, + "age": { + "value": 43, + "salt": "994a5723c379b33784b813642d91bca5" + } + }, + "logProof": { + "index": 9, + "treeSize": 16, + "path": [ + "0x65c032449d009130a92eb4bfc7a17fe17e0256c141a980d56ef6f7acc5ea65c1", + "0x5290791446b6001dc5b5819d38d10ce762a0337736bbf8e90a111e8fe3c77efe", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 10, + "treeSize": 16, + "path": [ + "0xccb00a519667f5206d54663c1449cfe26d2a69a21b58934e639d7fa5274a610b", + "0x59b6ac5d90106bce7337c4bbb3a25828e76f9fa97e001caee65d2540dad98ef0", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 11, + "i": 15, + "id": "r15", + "c": { + "age": "0x3e1980c7f773e302e4f9bf175e8edec38a53da7f2e46a5e371a77d57842c02fb", + "country": "0x1919bce313ba6d86fc4bf751e1f67b0a39b699615086212681149ff62c0885cf", + "email": "0x8c8c71ef8dd79da410a4cfc25639ea6119cbdd02c031eaa3ee9d661c65ba9aea", + "note": "0x2b31e8289c6fa63c019472defa0f58b1aad47fb3ff63a99484ddf9b95d3a3bd5" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "2e559c28fa7a80ed4f38fa8b45f2c82e" + }, + "age": { + "value": 45, + "salt": "ddef75f62d6301533303c7876d013294" + } + }, + "logProof": { + "index": 15, + "treeSize": 16, + "path": [ + "0x7bfd292a9ed546f18580c5251b801dc2756d80ab29a3c64eb0b81433a313307f", + "0x1dd8a5c51c6218cb8ca3a57ee7683a06b1e94aaedc7252a6b296e4091c975377", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 11, + "treeSize": 16, + "path": [ + "0x7144d8a6be6e7645cd0c8b69f028fc16b10e4f17fa86296a23c261922d75753e", + "0x59b6ac5d90106bce7337c4bbb3a25828e76f9fa97e001caee65d2540dad98ef0", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + } + ], + "before": { + "pos": 4, + "value": 29, + "i": 7, + "recordLeaf": "0xabbddf51854536b5605dc7c0630fd2fa170d2dcd9b1c5312aec6fea74c038c0d", + "indexProof": { + "index": 4, + "treeSize": 16, + "path": [ + "0x30a0dd012169393d0dea8791c0f24d70cc8d4c70d088f420825ec0dbf9230f67", + "0x15febe1a672c219d5d2f9fa007af3b5a9c3e7e47a61fe89875ae1cf60ebfb2df", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + "after": { + "pos": 12, + "value": 48, + "i": 4, + "recordLeaf": "0x423f202599ef3d02b5f3ff547235afd8e222ed7c26c61a01e4c15de7e2f4948b", + "indexProof": { + "index": 12, + "treeSize": 16, + "path": [ + "0x6e97bf24fed1277d34cc86719a8f63aab95067adfa7c5a6e70bde9daf8870f47", + "0x775811db8d2472f42cad2aeebbc3826f5f959e1f174501ca8ab4380ad815702a", + "0xec4bd620657cb68e435f6d2a71199370056c925b6184624a743fe49d818e9370", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + } + }, + "commitment": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 2, + "size": 16, + "logRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "createdAt": "2026-10-03T00:01:00.000Z", + "indexes": { + "age": { + "root": "0xfc641a2eadd7d876f9b4fe284dac094fb83543cf43a2c2f80e88f6d9e98114a7", + "size": 16 + }, + "country": { + "root": "0x5be9a95a39966382ab8d83179ae93380d723d49eff2f3b76a290a72a8ee60149", + "size": 16 + } + }, + "previous": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "dataset.range" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/dataset-answer/age-30-45.valid.json b/conformance/vectori/dataset-answer/age-30-45.valid.json new file mode 100644 index 0000000..5c878c5 --- /dev/null +++ b/conformance/vectori/dataset-answer/age-30-45.valid.json @@ -0,0 +1,385 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "dataset-answer/age-30-45.valid", + "artifact": "dataset-answer", + "title": "a range query on an indexed field: every row, and the two neighbours that prove nothing is missing", + "source": "producer (verifiable-data), random salts, generated 2026-10-03T09:33:28.671Z", + "requires": [], + "exercises": [ + "dataset.commitment", + "dataset.completeness", + "dataset.field", + "dataset.form", + "dataset.inclusion", + "dataset.index", + "dataset.order", + "dataset.range" + ], + "base": null, + "mutation": null, + "input": { + "answer": { + "v": 1, + "kind": "aere-verifiable-query-answer", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "field": "age", + "from": 30, + "to": 45, + "indexSize": 16, + "rows": [ + { + "pos": 5, + "i": 13, + "id": "r13", + "c": { + "age": "0x20131967249ae0130154c3dbbcbe8ab041200b4499ed270f2c9dd2c2ac3337f1", + "country": "0xffa95ca2afb61e95d628c3044b6e80746cccc11642ad35dafc6445cd905facdf", + "email": "0x2e6bca63ef9fad9e3ef55ae60405914a01577abd1caf0403109608f3f95a3700", + "note": "0x668a33b811cf8989b6ce36f7681928dd43371ea394d67df6136fb1580977121b" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b5ffd792267cac392d9d814c7809b198" + }, + "age": { + "value": 31, + "salt": "314d5643f6f54376235b422614dd1562" + } + }, + "logProof": { + "index": 13, + "treeSize": 16, + "path": [ + "0xd3cbc725743f95177070e430cd03ec9f6af06bc64e84c0c84ad19e5d5562a983", + "0x85c6057fcfb4dd1d0fdfc0e4a925284def148b2ee0513c6858a29070aca4d50d", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 5, + "treeSize": 16, + "path": [ + "0xc4723e9eb2ff7168890f1a366b02d3ed1452ac476e98996cd0c91634af7423ed", + "0x15febe1a672c219d5d2f9fa007af3b5a9c3e7e47a61fe89875ae1cf60ebfb2df", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 6, + "i": 2, + "id": "r2", + "c": { + "age": "0xec15dd9b6e14956f9e3e9ea696f943972ab7601093c1c488ec18d40eb1431d42", + "country": "0x8d9e791776f47b5aeb079763edfdd40d26fc94742c8410a4f8d45e6ff1e901e6", + "email": "0xb9bfbcffff236803e9faabb11490ee1749c02a5566ae6e22380ae7dafc16322e", + "note": "0x86d1f7ae6700f8a22cb3c6a97b27d85d226beae6c4ca4c6eccd3e18b2fd85644" + }, + "disclosed": { + "country": { + "value": "FR", + "salt": "6a20a411bddb217e3ba890baad65b87e" + }, + "age": { + "value": 34, + "salt": "a83f62663d8735a83a784f603de20b88" + } + }, + "logProof": { + "index": 2, + "treeSize": 16, + "path": [ + "0x559b8f51f7b31a6feed18feeb876141c8a19af7f49169aee7a9833b59b65eaa2", + "0x6528250e72e30d47b6b47dcefaa225bcb9fc1af0d20ee827c331486083baac56", + "0xef30cdbdc0b6467d74313d8b22b2054e32a17b3a484121ccc24cb16d8ad6fec0", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + }, + "indexProof": { + "index": 6, + "treeSize": 16, + "path": [ + "0xdc9c9be2d7bc348acbd1cc004108f4af0386cec42492ae4fc3d62a9840d5f7bd", + "0x140d04bd298186a3efce73de4e3ea60f7f0300d21f2970efffc9f918ab004475", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 7, + "i": 8, + "id": "r8", + "c": { + "age": "0xc6b4096f4947760268564e73c3afb7edf8c31f1fe8a5371c85eeb606ac22ea25", + "country": "0x9b959d0dad5df75cf7f29a408750b730b9fc41403f4fc50168cc14ce2ca437ee", + "email": "0x598b4823a385d1f34c855b8bb873241bc66ddbd0a8f6b09d92cba14534454484", + "note": "0x4bd0762227e6c5d7f6ceac6185a23fe5075a33576dcd1e4e51aa9a4b0e0a1158" + }, + "disclosed": { + "country": { + "value": "RO", + "salt": "0a263d3e4223cc52f078c225a273e316" + }, + "age": { + "value": 36, + "salt": "bcb34a3f54db5f21299add6f1c654670" + } + }, + "logProof": { + "index": 8, + "treeSize": 16, + "path": [ + "0x7eb65d9a7f7ffa3039e627af43216d59accf7d3ca8a2951c2b0418c0199a1c9f", + "0x5290791446b6001dc5b5819d38d10ce762a0337736bbf8e90a111e8fe3c77efe", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 7, + "treeSize": 16, + "path": [ + "0x201009717c9f1fc80cd77e2a975390858ff4a4b76511bb7a31d36ea58bedeceb", + "0x140d04bd298186a3efce73de4e3ea60f7f0300d21f2970efffc9f918ab004475", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + { + "pos": 8, + "i": 14, + "id": "r14", + "c": { + "age": "0x2a86b9afad1aff1234aa90bdf96095d07ef5d479992a9081c21adc965a3c20c3", + "country": "0xebd5ee1cac77bb2b170c930d964032218f9f9c69284c89b213dbefb2d54b8eee", + "email": "0xb9319475dca37efe658a39f9f7c10d13dd21a32276ec911dc57a2677a4e4bb50", + "note": "0x3fdbec96439422e50f7faabf111c8c8c2690460aad638b745a6875678fd38f34" + }, + "disclosed": { + "country": { + "value": "FR", + "salt": "15d426374424c484ffc8ae1bb736d960" + }, + "age": { + "value": 38, + "salt": "d750eb0354fb432536e3c26e5c682210" + } + }, + "logProof": { + "index": 14, + "treeSize": 16, + "path": [ + "0x12c9a4faf655bb09dbbb6a5fb3a24e44330e5d83222439ab2d2c2224c3791d84", + "0x1dd8a5c51c6218cb8ca3a57ee7683a06b1e94aaedc7252a6b296e4091c975377", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 8, + "treeSize": 16, + "path": [ + "0x9e4143c4b05ba68e176ae53bc5f122c1a490c3e1efeaa6bd9501110c5fb4d059", + "0xb3e51e807cccee32941e4d7009700ae40055645eb9e8bc6974ebe8ebf887a145", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 9, + "i": 3, + "id": "r3", + "c": { + "age": "0x13ec2a42a36e8b12ebdbd35af1d96962683a06b802e9e1f9e2e020487c691f7f", + "country": "0x1d18032f2e5acd907bffb4db2103b3d1d337388078ed9238a913c0cabecb928f", + "email": "0xe36f28b120650ba4c2597063b456d4d00847532129bd26dc8c150291265eef23", + "note": "0x086341fc0392c796d5f84f78f183deef347fa327e3d48707c460fc4d9c1f9910" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "0ee225e77747d7afafb81d1bffdf68c0" + }, + "age": { + "value": 41, + "salt": "9104931c19467233d902d1c967a15086" + } + }, + "logProof": { + "index": 3, + "treeSize": 16, + "path": [ + "0x5083ccb306cbefaa21d75b69a47668b0cd3943865500881281d96e05429face8", + "0x6528250e72e30d47b6b47dcefaa225bcb9fc1af0d20ee827c331486083baac56", + "0xef30cdbdc0b6467d74313d8b22b2054e32a17b3a484121ccc24cb16d8ad6fec0", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + }, + "indexProof": { + "index": 9, + "treeSize": 16, + "path": [ + "0xd0d85473c9adae91cb97fce47e564181ae990b38260de5efb1351e02ff9c3524", + "0xb3e51e807cccee32941e4d7009700ae40055645eb9e8bc6974ebe8ebf887a145", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 10, + "i": 9, + "id": "r9", + "c": { + "age": "0x1e440a3ce1d15a73c509b5b4da506157e42ac6cd8e96d486df66d049bfe8b8e6", + "country": "0xd5f75ca5ae34d41c6c6fe30f01061bec1260fd8fa9a134da20c616bd61b33428", + "email": "0x762b765d7cda44c06281ea75fea30bfc377adffe33d9df4ba065566f503ced67", + "note": "0x42b57a86fde59862104e06c5f9d7324e5edf2506e5c3874e0ae85e375ec46cdb" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b0371c1e4117eab6e65f46c8e7dd9b5c" + }, + "age": { + "value": 43, + "salt": "994a5723c379b33784b813642d91bca5" + } + }, + "logProof": { + "index": 9, + "treeSize": 16, + "path": [ + "0x65c032449d009130a92eb4bfc7a17fe17e0256c141a980d56ef6f7acc5ea65c1", + "0x5290791446b6001dc5b5819d38d10ce762a0337736bbf8e90a111e8fe3c77efe", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 10, + "treeSize": 16, + "path": [ + "0xccb00a519667f5206d54663c1449cfe26d2a69a21b58934e639d7fa5274a610b", + "0x59b6ac5d90106bce7337c4bbb3a25828e76f9fa97e001caee65d2540dad98ef0", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + }, + { + "pos": 11, + "i": 15, + "id": "r15", + "c": { + "age": "0x3e1980c7f773e302e4f9bf175e8edec38a53da7f2e46a5e371a77d57842c02fb", + "country": "0x1919bce313ba6d86fc4bf751e1f67b0a39b699615086212681149ff62c0885cf", + "email": "0x8c8c71ef8dd79da410a4cfc25639ea6119cbdd02c031eaa3ee9d661c65ba9aea", + "note": "0x2b31e8289c6fa63c019472defa0f58b1aad47fb3ff63a99484ddf9b95d3a3bd5" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "2e559c28fa7a80ed4f38fa8b45f2c82e" + }, + "age": { + "value": 45, + "salt": "ddef75f62d6301533303c7876d013294" + } + }, + "logProof": { + "index": 15, + "treeSize": 16, + "path": [ + "0x7bfd292a9ed546f18580c5251b801dc2756d80ab29a3c64eb0b81433a313307f", + "0x1dd8a5c51c6218cb8ca3a57ee7683a06b1e94aaedc7252a6b296e4091c975377", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + }, + "indexProof": { + "index": 11, + "treeSize": 16, + "path": [ + "0x7144d8a6be6e7645cd0c8b69f028fc16b10e4f17fa86296a23c261922d75753e", + "0x59b6ac5d90106bce7337c4bbb3a25828e76f9fa97e001caee65d2540dad98ef0", + "0x4b015cc323eaff67b141affbb3de0fc5e8052bf47a2f731b5605d19c23aa805a", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + } + ], + "before": { + "pos": 4, + "value": 29, + "i": 7, + "recordLeaf": "0xabbddf51854536b5605dc7c0630fd2fa170d2dcd9b1c5312aec6fea74c038c0d", + "indexProof": { + "index": 4, + "treeSize": 16, + "path": [ + "0x30a0dd012169393d0dea8791c0f24d70cc8d4c70d088f420825ec0dbf9230f67", + "0x15febe1a672c219d5d2f9fa007af3b5a9c3e7e47a61fe89875ae1cf60ebfb2df", + "0xd62959693d950747d9c684becc5e4191521dd97b7496b0bb37326b54e6c58cb3", + "0xe07eef41b2e662b0af3e77b3c448378ecea5c476a9fa2f1da5e36d3a2bd1a010" + ] + } + }, + "after": { + "pos": 12, + "value": 48, + "i": 4, + "recordLeaf": "0x423f202599ef3d02b5f3ff547235afd8e222ed7c26c61a01e4c15de7e2f4948b", + "indexProof": { + "index": 12, + "treeSize": 16, + "path": [ + "0x6e97bf24fed1277d34cc86719a8f63aab95067adfa7c5a6e70bde9daf8870f47", + "0x775811db8d2472f42cad2aeebbc3826f5f959e1f174501ca8ab4380ad815702a", + "0xec4bd620657cb68e435f6d2a71199370056c925b6184624a743fe49d818e9370", + "0xca336a5bb1e6bf6a6302052ee7c87de5c9704132553a11e37b7e8f143c53439a" + ] + } + } + }, + "commitment": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 2, + "size": 16, + "logRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "createdAt": "2026-10-03T00:01:00.000Z", + "indexes": { + "age": { + "root": "0xfc641a2eadd7d876f9b4fe284dac094fb83543cf43a2c2f80e88f6d9e98114a7", + "size": 16 + }, + "country": { + "root": "0x5be9a95a39966382ab8d83179ae93380d723d49eff2f3b76a290a72a8ee60149", + "size": 16 + } + }, + "previous": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/dataset-answer/two-records.order.json b/conformance/vectori/dataset-answer/two-records.order.json new file mode 100644 index 0000000..c079d27 --- /dev/null +++ b/conformance/vectori/dataset-answer/two-records.order.json @@ -0,0 +1,140 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "dataset-answer/two-records.order", + "artifact": "dataset-answer", + "title": "the same two records from a publisher whose index is not sorted: every proof holds, the order does not", + "source": "derived from dataset-answer/two-records.valid", + "requires": [], + "exercises": [ + "dataset.commitment", + "dataset.completeness", + "dataset.field", + "dataset.form", + "dataset.inclusion", + "dataset.index", + "dataset.order", + "dataset.range" + ], + "base": "dataset-answer/two-records.valid", + "mutation": { + "producer": "the publisher built the index in record order instead of sorted order; the index root, the commitment hash and the rows follow from that", + "changed": [ + [ + "commitment", + "indexes", + "k", + "root" + ], + [ + "answer", + "commitmentHash" + ], + [ + "answer", + "rows" + ] + ] + }, + "input": { + "answer": { + "v": 1, + "kind": "aere-verifiable-query-answer", + "name": "two-records", + "version": 1, + "commitmentHash": "0xbf2c033142e1cd6b1640d50893104e4b83f8874e9c258c1c03d51559a08eb01e", + "field": "k", + "from": "a", + "to": "b", + "indexSize": 2, + "rows": [ + { + "pos": 0, + "i": 0, + "id": "x", + "c": { + "k": "0x76033da6d09086feaabc4eb02ccdb0998b8b3ffebe6dc06d7bb294e59332739a" + }, + "disclosed": { + "k": { + "value": "b", + "salt": "00000000000000000000000000000000" + } + }, + "logProof": { + "index": 0, + "treeSize": 2, + "path": [ + "0xe56792b2e606926733363d24ea96408682b9ec24ee756ce3e4230fbd7876102d" + ] + }, + "indexProof": { + "index": 0, + "treeSize": 2, + "path": [ + "0xe6e81e861c206d6d78dd70ec5c986e810ba1fced13c1b1be014ee3203164c735" + ] + } + }, + { + "pos": 1, + "i": 1, + "id": "y", + "c": { + "k": "0xd1d31bb11fa2bd2db5cf1e6e6724ba3e8bacdc4dc39a6f0b56456c3d9c4f0209" + }, + "disclosed": { + "k": { + "value": "a", + "salt": "11111111111111111111111111111111" + } + }, + "logProof": { + "index": 1, + "treeSize": 2, + "path": [ + "0x3797340e506f3531b126aed66af5eca599669bd2d88d12b4746015d81bc8d0dc" + ] + }, + "indexProof": { + "index": 1, + "treeSize": 2, + "path": [ + "0x0fed8760ae373fc2218213aaad78b44ecf7bf7cc513234d280f66748b4c312fd" + ] + } + } + ], + "before": null, + "after": null + }, + "commitment": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "two-records", + "version": 1, + "size": 2, + "logRoot": "0xe1f12ed2764771c41437aef83b8e85eed42d1c3f73bf318d349eb84fc3e5c0d3", + "createdAt": "2026-10-03T00:00:00.000Z", + "indexes": { + "k": { + "root": "0x61e627e4e147a0e085e099acd40e2117cdbdc05649a4a9b121d317ab223e641c", + "size": 2 + } + }, + "previous": null + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "dataset.order" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/dataset-answer/two-records.valid.json b/conformance/vectori/dataset-answer/two-records.valid.json new file mode 100644 index 0000000..50bbc81 --- /dev/null +++ b/conformance/vectori/dataset-answer/two-records.valid.json @@ -0,0 +1,120 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "dataset-answer/two-records.valid", + "artifact": "dataset-answer", + "title": "two records, the index built in sorted order", + "source": "producer formulas (verifiable-data), fixed salts", + "requires": [], + "exercises": [ + "dataset.commitment", + "dataset.completeness", + "dataset.field", + "dataset.form", + "dataset.inclusion", + "dataset.index", + "dataset.order", + "dataset.range" + ], + "base": null, + "mutation": null, + "input": { + "answer": { + "v": 1, + "kind": "aere-verifiable-query-answer", + "name": "two-records", + "version": 1, + "commitmentHash": "0xc56abe54fe4b8cd1ec14d987fcb539407cc7aaf2dafb1b00c225c3b24e5e094e", + "field": "k", + "from": "a", + "to": "b", + "indexSize": 2, + "rows": [ + { + "pos": 0, + "i": 1, + "id": "y", + "c": { + "k": "0xd1d31bb11fa2bd2db5cf1e6e6724ba3e8bacdc4dc39a6f0b56456c3d9c4f0209" + }, + "disclosed": { + "k": { + "value": "a", + "salt": "11111111111111111111111111111111" + } + }, + "logProof": { + "index": 1, + "treeSize": 2, + "path": [ + "0x3797340e506f3531b126aed66af5eca599669bd2d88d12b4746015d81bc8d0dc" + ] + }, + "indexProof": { + "index": 0, + "treeSize": 2, + "path": [ + "0x0fed8760ae373fc2218213aaad78b44ecf7bf7cc513234d280f66748b4c312fd" + ] + } + }, + { + "pos": 1, + "i": 0, + "id": "x", + "c": { + "k": "0x76033da6d09086feaabc4eb02ccdb0998b8b3ffebe6dc06d7bb294e59332739a" + }, + "disclosed": { + "k": { + "value": "b", + "salt": "00000000000000000000000000000000" + } + }, + "logProof": { + "index": 0, + "treeSize": 2, + "path": [ + "0xe56792b2e606926733363d24ea96408682b9ec24ee756ce3e4230fbd7876102d" + ] + }, + "indexProof": { + "index": 1, + "treeSize": 2, + "path": [ + "0xe6e81e861c206d6d78dd70ec5c986e810ba1fced13c1b1be014ee3203164c735" + ] + } + } + ], + "before": null, + "after": null + }, + "commitment": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "two-records", + "version": 1, + "size": 2, + "logRoot": "0xe1f12ed2764771c41437aef83b8e85eed42d1c3f73bf318d349eb84fc3e5c0d3", + "createdAt": "2026-10-03T00:00:00.000Z", + "indexes": { + "k": { + "root": "0xc4a9e145aa17c45492bb7a22c12a2d8a9c51c9bb1d971b0b4fc713ad4d66e77b", + "size": 2 + } + }, + "previous": null + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/dataset-consistency/v1-v2.commitment.json b/conformance/vectori/dataset-consistency/v1-v2.commitment.json new file mode 100644 index 0000000..8fbf042 --- /dev/null +++ b/conformance/vectori/dataset-consistency/v1-v2.commitment.json @@ -0,0 +1,101 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "dataset-consistency/v1-v2.commitment", + "artifact": "dataset-consistency", + "title": "the proof names another newer commitment", + "source": "derived from dataset-consistency/v1-v2.valid", + "requires": [], + "exercises": [ + "dataset.commitment", + "dataset.consistency" + ], + "base": "dataset-consistency/v1-v2.valid", + "mutation": { + "op": "set", + "path": [ + "proof", + "to", + "commitmentHash" + ], + "value": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a34860" + }, + "input": { + "proof": { + "v": 1, + "kind": "aere-verifiable-consistency", + "name": "conformance", + "from": { + "version": 1, + "commitmentHash": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + }, + "to": { + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a34860" + }, + "proof": { + "firstSize": 12, + "secondSize": 16, + "firstRoot": "0x513d3a071b8b56ce6d9d3d90ce4df590a9442330e8d52e249293a018935d3d64", + "secondRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "path": [ + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + } + }, + "older": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 1, + "size": 12, + "logRoot": "0x513d3a071b8b56ce6d9d3d90ce4df590a9442330e8d52e249293a018935d3d64", + "createdAt": "2026-10-03T00:00:00.000Z", + "indexes": { + "age": { + "root": "0x8230b920edb9caf2223720db4b6550eab36ea116664a6b33726704711e0e3b44", + "size": 12 + }, + "country": { + "root": "0x4eec0d2495e0fe6ce17aad46e3d38058cba5f4ff88f0a565299b37cda61efba7", + "size": 12 + } + }, + "previous": null + }, + "newer": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 2, + "size": 16, + "logRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "createdAt": "2026-10-03T00:01:00.000Z", + "indexes": { + "age": { + "root": "0xfc641a2eadd7d876f9b4fe284dac094fb83543cf43a2c2f80e88f6d9e98114a7", + "size": 16 + }, + "country": { + "root": "0x5be9a95a39966382ab8d83179ae93380d723d49eff2f3b76a290a72a8ee60149", + "size": 16 + } + }, + "previous": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "dataset.commitment" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/dataset-consistency/v1-v2.consistency.json b/conformance/vectori/dataset-consistency/v1-v2.consistency.json new file mode 100644 index 0000000..7f74d9f --- /dev/null +++ b/conformance/vectori/dataset-consistency/v1-v2.consistency.json @@ -0,0 +1,102 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "dataset-consistency/v1-v2.consistency", + "artifact": "dataset-consistency", + "title": "one hash of the consistency path changed", + "source": "derived from dataset-consistency/v1-v2.valid", + "requires": [], + "exercises": [ + "dataset.commitment", + "dataset.consistency" + ], + "base": "dataset-consistency/v1-v2.valid", + "mutation": { + "op": "set", + "path": [ + "proof", + "proof", + "path", + 0 + ], + "value": "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a33110" + }, + "input": { + "proof": { + "v": 1, + "kind": "aere-verifiable-consistency", + "name": "conformance", + "from": { + "version": 1, + "commitmentHash": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + }, + "to": { + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d" + }, + "proof": { + "firstSize": 12, + "secondSize": 16, + "firstRoot": "0x513d3a071b8b56ce6d9d3d90ce4df590a9442330e8d52e249293a018935d3d64", + "secondRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "path": [ + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a33110", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + } + }, + "older": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 1, + "size": 12, + "logRoot": "0x513d3a071b8b56ce6d9d3d90ce4df590a9442330e8d52e249293a018935d3d64", + "createdAt": "2026-10-03T00:00:00.000Z", + "indexes": { + "age": { + "root": "0x8230b920edb9caf2223720db4b6550eab36ea116664a6b33726704711e0e3b44", + "size": 12 + }, + "country": { + "root": "0x4eec0d2495e0fe6ce17aad46e3d38058cba5f4ff88f0a565299b37cda61efba7", + "size": 12 + } + }, + "previous": null + }, + "newer": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 2, + "size": 16, + "logRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "createdAt": "2026-10-03T00:01:00.000Z", + "indexes": { + "age": { + "root": "0xfc641a2eadd7d876f9b4fe284dac094fb83543cf43a2c2f80e88f6d9e98114a7", + "size": 16 + }, + "country": { + "root": "0x5be9a95a39966382ab8d83179ae93380d723d49eff2f3b76a290a72a8ee60149", + "size": 16 + } + }, + "previous": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "dataset.consistency" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/dataset-consistency/v1-v2.valid.json b/conformance/vectori/dataset-consistency/v1-v2.valid.json new file mode 100644 index 0000000..c969587 --- /dev/null +++ b/conformance/vectori/dataset-consistency/v1-v2.valid.json @@ -0,0 +1,91 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "dataset-consistency/v1-v2.valid", + "artifact": "dataset-consistency", + "title": "version 1 is a prefix of version 2", + "source": "producer (verifiable-data), random salts, generated 2026-10-03T09:33:28.671Z", + "requires": [], + "exercises": [ + "dataset.commitment", + "dataset.consistency" + ], + "base": null, + "mutation": null, + "input": { + "proof": { + "v": 1, + "kind": "aere-verifiable-consistency", + "name": "conformance", + "from": { + "version": 1, + "commitmentHash": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + }, + "to": { + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d" + }, + "proof": { + "firstSize": 12, + "secondSize": 16, + "firstRoot": "0x513d3a071b8b56ce6d9d3d90ce4df590a9442330e8d52e249293a018935d3d64", + "secondRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "path": [ + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0xa06921f7770369ac27071f0fd2db808b66a643605278b92c06cabefffa234084", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + } + }, + "older": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 1, + "size": 12, + "logRoot": "0x513d3a071b8b56ce6d9d3d90ce4df590a9442330e8d52e249293a018935d3d64", + "createdAt": "2026-10-03T00:00:00.000Z", + "indexes": { + "age": { + "root": "0x8230b920edb9caf2223720db4b6550eab36ea116664a6b33726704711e0e3b44", + "size": 12 + }, + "country": { + "root": "0x4eec0d2495e0fe6ce17aad46e3d38058cba5f4ff88f0a565299b37cda61efba7", + "size": 12 + } + }, + "previous": null + }, + "newer": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 2, + "size": 16, + "logRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "createdAt": "2026-10-03T00:01:00.000Z", + "indexes": { + "age": { + "root": "0xfc641a2eadd7d876f9b4fe284dac094fb83543cf43a2c2f80e88f6d9e98114a7", + "size": 16 + }, + "country": { + "root": "0x5be9a95a39966382ab8d83179ae93380d723d49eff2f3b76a290a72a8ee60149", + "size": 16 + } + }, + "previous": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/dataset-record/r5.commitment.json b/conformance/vectori/dataset-record/r5.commitment.json new file mode 100644 index 0000000..dcca009 --- /dev/null +++ b/conformance/vectori/dataset-record/r5.commitment.json @@ -0,0 +1,93 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "dataset-record/r5.commitment", + "artifact": "dataset-record", + "title": "the record names another commitment", + "source": "derived from dataset-record/r5.valid", + "requires": [], + "exercises": [ + "dataset.commitment", + "dataset.field", + "dataset.form", + "dataset.inclusion" + ], + "base": "dataset-record/r5.valid", + "mutation": { + "op": "set", + "path": [ + "record", + "commitmentHash" + ], + "value": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a34860" + }, + "input": { + "record": { + "v": 1, + "kind": "aere-verifiable-record", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a34860", + "i": 5, + "id": "r5", + "c": { + "age": "0x6dd1cb642a41c2d474dc7764232b79718e57c56a22c4db6aafbd5c9d76fb711f", + "country": "0xcb77a35d9ad17c99e38939e1462c261ad4143ec0acf3dd1257bfd5004027cc8f", + "email": "0x3d6ddf25d6991f89b1d02087e062407a2379c28c8284a3709e66d242de58dd59", + "note": "0xbfcf4fba3f6f3aad1fe3b28ab76cf7bb923006b80063dbbf29372cbd7c8a0e9e" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b0760847d3e4e33261605d29a686c37f" + }, + "age": { + "value": 55, + "salt": "5056c3b0bcfd665aefce9b421efb7826" + } + }, + "logProof": { + "index": 5, + "treeSize": 16, + "path": [ + "0x423f202599ef3d02b5f3ff547235afd8e222ed7c26c61a01e4c15de7e2f4948b", + "0xe31e82f61895c75f5648f82d79fcbb86486581e1b39baa636dc71eada3ba3452", + "0xb69d58d00d2681aae7d29aa7836c94b0f65e2d4847379b4ba09caec5762875ea", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + } + }, + "commitment": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 2, + "size": 16, + "logRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "createdAt": "2026-10-03T00:01:00.000Z", + "indexes": { + "age": { + "root": "0xfc641a2eadd7d876f9b4fe284dac094fb83543cf43a2c2f80e88f6d9e98114a7", + "size": 16 + }, + "country": { + "root": "0x5be9a95a39966382ab8d83179ae93380d723d49eff2f3b76a290a72a8ee60149", + "size": 16 + } + }, + "previous": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "dataset.commitment" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/dataset-record/r5.field-no-salt.json b/conformance/vectori/dataset-record/r5.field-no-salt.json new file mode 100644 index 0000000..1049bbc --- /dev/null +++ b/conformance/vectori/dataset-record/r5.field-no-salt.json @@ -0,0 +1,93 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "dataset-record/r5.field-no-salt", + "artifact": "dataset-record", + "title": "a disclosed field shown without its salt", + "source": "derived from dataset-record/r5.valid", + "requires": [], + "exercises": [ + "dataset.commitment", + "dataset.field", + "dataset.form", + "dataset.inclusion" + ], + "base": "dataset-record/r5.valid", + "mutation": { + "op": "remove", + "path": [ + "record", + "disclosed", + "age", + "salt" + ] + }, + "input": { + "record": { + "v": 1, + "kind": "aere-verifiable-record", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "i": 5, + "id": "r5", + "c": { + "age": "0x6dd1cb642a41c2d474dc7764232b79718e57c56a22c4db6aafbd5c9d76fb711f", + "country": "0xcb77a35d9ad17c99e38939e1462c261ad4143ec0acf3dd1257bfd5004027cc8f", + "email": "0x3d6ddf25d6991f89b1d02087e062407a2379c28c8284a3709e66d242de58dd59", + "note": "0xbfcf4fba3f6f3aad1fe3b28ab76cf7bb923006b80063dbbf29372cbd7c8a0e9e" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b0760847d3e4e33261605d29a686c37f" + }, + "age": { + "value": 55 + } + }, + "logProof": { + "index": 5, + "treeSize": 16, + "path": [ + "0x423f202599ef3d02b5f3ff547235afd8e222ed7c26c61a01e4c15de7e2f4948b", + "0xe31e82f61895c75f5648f82d79fcbb86486581e1b39baa636dc71eada3ba3452", + "0xb69d58d00d2681aae7d29aa7836c94b0f65e2d4847379b4ba09caec5762875ea", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + } + }, + "commitment": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 2, + "size": 16, + "logRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "createdAt": "2026-10-03T00:01:00.000Z", + "indexes": { + "age": { + "root": "0xfc641a2eadd7d876f9b4fe284dac094fb83543cf43a2c2f80e88f6d9e98114a7", + "size": 16 + }, + "country": { + "root": "0x5be9a95a39966382ab8d83179ae93380d723d49eff2f3b76a290a72a8ee60149", + "size": 16 + } + }, + "previous": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "dataset.field" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/dataset-record/r5.field.json b/conformance/vectori/dataset-record/r5.field.json new file mode 100644 index 0000000..abb5961 --- /dev/null +++ b/conformance/vectori/dataset-record/r5.field.json @@ -0,0 +1,95 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "dataset-record/r5.field", + "artifact": "dataset-record", + "title": "a disclosed value changed after commitment", + "source": "derived from dataset-record/r5.valid", + "requires": [], + "exercises": [ + "dataset.commitment", + "dataset.field", + "dataset.form", + "dataset.inclusion" + ], + "base": "dataset-record/r5.valid", + "mutation": { + "op": "set", + "path": [ + "record", + "disclosed", + "age", + "value" + ], + "value": 56 + }, + "input": { + "record": { + "v": 1, + "kind": "aere-verifiable-record", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "i": 5, + "id": "r5", + "c": { + "age": "0x6dd1cb642a41c2d474dc7764232b79718e57c56a22c4db6aafbd5c9d76fb711f", + "country": "0xcb77a35d9ad17c99e38939e1462c261ad4143ec0acf3dd1257bfd5004027cc8f", + "email": "0x3d6ddf25d6991f89b1d02087e062407a2379c28c8284a3709e66d242de58dd59", + "note": "0xbfcf4fba3f6f3aad1fe3b28ab76cf7bb923006b80063dbbf29372cbd7c8a0e9e" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b0760847d3e4e33261605d29a686c37f" + }, + "age": { + "value": 56, + "salt": "5056c3b0bcfd665aefce9b421efb7826" + } + }, + "logProof": { + "index": 5, + "treeSize": 16, + "path": [ + "0x423f202599ef3d02b5f3ff547235afd8e222ed7c26c61a01e4c15de7e2f4948b", + "0xe31e82f61895c75f5648f82d79fcbb86486581e1b39baa636dc71eada3ba3452", + "0xb69d58d00d2681aae7d29aa7836c94b0f65e2d4847379b4ba09caec5762875ea", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + } + }, + "commitment": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 2, + "size": 16, + "logRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "createdAt": "2026-10-03T00:01:00.000Z", + "indexes": { + "age": { + "root": "0xfc641a2eadd7d876f9b4fe284dac094fb83543cf43a2c2f80e88f6d9e98114a7", + "size": 16 + }, + "country": { + "root": "0x5be9a95a39966382ab8d83179ae93380d723d49eff2f3b76a290a72a8ee60149", + "size": 16 + } + }, + "previous": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "dataset.field" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/dataset-record/r5.form.json b/conformance/vectori/dataset-record/r5.form.json new file mode 100644 index 0000000..d19b2f1 --- /dev/null +++ b/conformance/vectori/dataset-record/r5.form.json @@ -0,0 +1,88 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "dataset-record/r5.form", + "artifact": "dataset-record", + "title": "the field commitments are not an object", + "source": "derived from dataset-record/r5.valid", + "requires": [], + "exercises": [ + "dataset.commitment", + "dataset.field", + "dataset.form", + "dataset.inclusion" + ], + "base": "dataset-record/r5.valid", + "mutation": { + "op": "set", + "path": [ + "record", + "c" + ], + "value": "x" + }, + "input": { + "record": { + "v": 1, + "kind": "aere-verifiable-record", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "i": 5, + "id": "r5", + "c": "x", + "disclosed": { + "country": { + "value": "DE", + "salt": "b0760847d3e4e33261605d29a686c37f" + }, + "age": { + "value": 55, + "salt": "5056c3b0bcfd665aefce9b421efb7826" + } + }, + "logProof": { + "index": 5, + "treeSize": 16, + "path": [ + "0x423f202599ef3d02b5f3ff547235afd8e222ed7c26c61a01e4c15de7e2f4948b", + "0xe31e82f61895c75f5648f82d79fcbb86486581e1b39baa636dc71eada3ba3452", + "0xb69d58d00d2681aae7d29aa7836c94b0f65e2d4847379b4ba09caec5762875ea", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + } + }, + "commitment": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 2, + "size": 16, + "logRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "createdAt": "2026-10-03T00:01:00.000Z", + "indexes": { + "age": { + "root": "0xfc641a2eadd7d876f9b4fe284dac094fb83543cf43a2c2f80e88f6d9e98114a7", + "size": 16 + }, + "country": { + "root": "0x5be9a95a39966382ab8d83179ae93380d723d49eff2f3b76a290a72a8ee60149", + "size": 16 + } + }, + "previous": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "dataset.form" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/dataset-record/r5.inclusion.json b/conformance/vectori/dataset-record/r5.inclusion.json new file mode 100644 index 0000000..aee2531 --- /dev/null +++ b/conformance/vectori/dataset-record/r5.inclusion.json @@ -0,0 +1,95 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "dataset-record/r5.inclusion", + "artifact": "dataset-record", + "title": "one hash of the log proof changed", + "source": "derived from dataset-record/r5.valid", + "requires": [], + "exercises": [ + "dataset.commitment", + "dataset.field", + "dataset.form", + "dataset.inclusion" + ], + "base": "dataset-record/r5.valid", + "mutation": { + "op": "set", + "path": [ + "record", + "logProof", + "path", + 0 + ], + "value": "0x423f202599ef3d02b5f3ff547235afd8e222ed7c26c61a01e4c15de7e2f49480" + }, + "input": { + "record": { + "v": 1, + "kind": "aere-verifiable-record", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "i": 5, + "id": "r5", + "c": { + "age": "0x6dd1cb642a41c2d474dc7764232b79718e57c56a22c4db6aafbd5c9d76fb711f", + "country": "0xcb77a35d9ad17c99e38939e1462c261ad4143ec0acf3dd1257bfd5004027cc8f", + "email": "0x3d6ddf25d6991f89b1d02087e062407a2379c28c8284a3709e66d242de58dd59", + "note": "0xbfcf4fba3f6f3aad1fe3b28ab76cf7bb923006b80063dbbf29372cbd7c8a0e9e" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b0760847d3e4e33261605d29a686c37f" + }, + "age": { + "value": 55, + "salt": "5056c3b0bcfd665aefce9b421efb7826" + } + }, + "logProof": { + "index": 5, + "treeSize": 16, + "path": [ + "0x423f202599ef3d02b5f3ff547235afd8e222ed7c26c61a01e4c15de7e2f49480", + "0xe31e82f61895c75f5648f82d79fcbb86486581e1b39baa636dc71eada3ba3452", + "0xb69d58d00d2681aae7d29aa7836c94b0f65e2d4847379b4ba09caec5762875ea", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + } + }, + "commitment": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 2, + "size": 16, + "logRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "createdAt": "2026-10-03T00:01:00.000Z", + "indexes": { + "age": { + "root": "0xfc641a2eadd7d876f9b4fe284dac094fb83543cf43a2c2f80e88f6d9e98114a7", + "size": 16 + }, + "country": { + "root": "0x5be9a95a39966382ab8d83179ae93380d723d49eff2f3b76a290a72a8ee60149", + "size": 16 + } + }, + "previous": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "dataset.inclusion" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/dataset-record/r5.valid.json b/conformance/vectori/dataset-record/r5.valid.json new file mode 100644 index 0000000..aa7c1f4 --- /dev/null +++ b/conformance/vectori/dataset-record/r5.valid.json @@ -0,0 +1,84 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "dataset-record/r5.valid", + "artifact": "dataset-record", + "title": "one record against the commitment of version 2, two fields disclosed", + "source": "producer (verifiable-data), random salts, generated 2026-10-03T09:33:28.671Z", + "requires": [], + "exercises": [ + "dataset.commitment", + "dataset.field", + "dataset.form", + "dataset.inclusion" + ], + "base": null, + "mutation": null, + "input": { + "record": { + "v": 1, + "kind": "aere-verifiable-record", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "i": 5, + "id": "r5", + "c": { + "age": "0x6dd1cb642a41c2d474dc7764232b79718e57c56a22c4db6aafbd5c9d76fb711f", + "country": "0xcb77a35d9ad17c99e38939e1462c261ad4143ec0acf3dd1257bfd5004027cc8f", + "email": "0x3d6ddf25d6991f89b1d02087e062407a2379c28c8284a3709e66d242de58dd59", + "note": "0xbfcf4fba3f6f3aad1fe3b28ab76cf7bb923006b80063dbbf29372cbd7c8a0e9e" + }, + "disclosed": { + "country": { + "value": "DE", + "salt": "b0760847d3e4e33261605d29a686c37f" + }, + "age": { + "value": 55, + "salt": "5056c3b0bcfd665aefce9b421efb7826" + } + }, + "logProof": { + "index": 5, + "treeSize": 16, + "path": [ + "0x423f202599ef3d02b5f3ff547235afd8e222ed7c26c61a01e4c15de7e2f4948b", + "0xe31e82f61895c75f5648f82d79fcbb86486581e1b39baa636dc71eada3ba3452", + "0xb69d58d00d2681aae7d29aa7836c94b0f65e2d4847379b4ba09caec5762875ea", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + } + }, + "commitment": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 2, + "size": 16, + "logRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "createdAt": "2026-10-03T00:01:00.000Z", + "indexes": { + "age": { + "root": "0xfc641a2eadd7d876f9b4fe284dac094fb83543cf43a2c2f80e88f6d9e98114a7", + "size": 16 + }, + "country": { + "root": "0x5be9a95a39966382ab8d83179ae93380d723d49eff2f3b76a290a72a8ee60149", + "size": 16 + } + }, + "previous": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/dataset-sample/four-of-sixteen.sample.json b/conformance/vectori/dataset-sample/four-of-sixteen.sample.json new file mode 100644 index 0000000..5b8db72 --- /dev/null +++ b/conformance/vectori/dataset-sample/four-of-sixteen.sample.json @@ -0,0 +1,155 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "dataset-sample/four-of-sixteen.sample", + "artifact": "dataset-sample", + "title": "the publisher does not serve one of the sampled records", + "source": "derived from dataset-sample/four-of-sixteen.valid", + "requires": [], + "exercises": [ + "dataset.commitment", + "dataset.field", + "dataset.form", + "dataset.inclusion", + "dataset.sample" + ], + "base": "dataset-sample/four-of-sixteen.valid", + "mutation": { + "op": "remove", + "path": [ + "served", + "3" + ] + }, + "input": { + "commitment": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 2, + "size": 16, + "logRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "createdAt": "2026-10-03T00:01:00.000Z", + "indexes": { + "age": { + "root": "0xfc641a2eadd7d876f9b4fe284dac094fb83543cf43a2c2f80e88f6d9e98114a7", + "size": 16 + }, + "country": { + "root": "0x5be9a95a39966382ab8d83179ae93380d723d49eff2f3b76a290a72a8ee60149", + "size": 16 + } + }, + "previous": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + }, + "k": 4, + "seed": "conformance-sample", + "served": { + "7": { + "v": 1, + "kind": "aere-verifiable-record", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "i": 7, + "id": "r7", + "c": { + "age": "0xa1a74e2ac07bab6c41c2556b844aae64857449195ceac53645c629516238b344", + "country": "0xcc9aab9315438cb08ca38170956cb46c872df70d01652b24c09f8863300e6196", + "email": "0xa90cedaf1e40181e97badd77834f7ad7941cc0d185884b625f260b6843f21aae", + "note": "0xcdc993d68c62518d20dddb06072d1f2d576c80a87f33cafdbdfb64d73e78ef51" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "985bd39a58f95e5356f853a164382b93" + } + }, + "logProof": { + "index": 7, + "treeSize": 16, + "path": [ + "0x1834d4378c03e4b8303175bcb26d1d8004e2228abcb445a35a1add3901ed7af0", + "0xba1730442baeb4246d80e34e1200df5dfecce1c52067e73850f131a1193eefc1", + "0xb69d58d00d2681aae7d29aa7836c94b0f65e2d4847379b4ba09caec5762875ea", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + } + }, + "12": { + "v": 1, + "kind": "aere-verifiable-record", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "i": 12, + "id": "r12", + "c": { + "age": "0x090dd84053907e69b2d2a99757f1a0e248d270d57fa8f442d20f9ecefef019c8", + "country": "0xa383f5cce4bec2b3d87ba7689f05af77bb0060b247c69ccd2cf64231592cd33a", + "email": "0x72559f17dfc692e8f3a8ceaa63727e94860120fe26e40bd5e81bccc7d0a836e4", + "note": "0x89a3d01a0711b2bc1697ec4cb82ca0dc4bcd5bc17bb7b10f22623f579833df54" + }, + "disclosed": { + "country": { + "value": "RO", + "salt": "2acf87c71b169c498b2cbd745469589a" + } + }, + "logProof": { + "index": 12, + "treeSize": 16, + "path": [ + "0xc383e9a1e188c33996ec8ed77bb82230a72a4f52facef6bb31482535a09c30e0", + "0x85c6057fcfb4dd1d0fdfc0e4a925284def148b2ee0513c6858a29070aca4d50d", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + } + }, + "14": { + "v": 1, + "kind": "aere-verifiable-record", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "i": 14, + "id": "r14", + "c": { + "age": "0x2a86b9afad1aff1234aa90bdf96095d07ef5d479992a9081c21adc965a3c20c3", + "country": "0xebd5ee1cac77bb2b170c930d964032218f9f9c69284c89b213dbefb2d54b8eee", + "email": "0xb9319475dca37efe658a39f9f7c10d13dd21a32276ec911dc57a2677a4e4bb50", + "note": "0x3fdbec96439422e50f7faabf111c8c8c2690460aad638b745a6875678fd38f34" + }, + "disclosed": { + "country": { + "value": "FR", + "salt": "15d426374424c484ffc8ae1bb736d960" + } + }, + "logProof": { + "index": 14, + "treeSize": 16, + "path": [ + "0x12c9a4faf655bb09dbbb6a5fb3a24e44330e5d83222439ab2d2c2224c3791d84", + "0x1dd8a5c51c6218cb8ca3a57ee7683a06b1e94aaedc7252a6b296e4091c975377", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + } + } + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "dataset.sample" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/dataset-sample/four-of-sixteen.valid.json b/conformance/vectori/dataset-sample/four-of-sixteen.valid.json new file mode 100644 index 0000000..92353d0 --- /dev/null +++ b/conformance/vectori/dataset-sample/four-of-sixteen.valid.json @@ -0,0 +1,178 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "dataset-sample/four-of-sixteen.valid", + "artifact": "dataset-sample", + "title": "four positions drawn from a seed, each served and verified", + "source": "producer (verifiable-data), random salts, generated 2026-10-03T09:33:28.671Z", + "requires": [], + "exercises": [ + "dataset.commitment", + "dataset.field", + "dataset.form", + "dataset.inclusion", + "dataset.sample" + ], + "base": null, + "mutation": null, + "input": { + "commitment": { + "v": 1, + "format": "aere-verifiable-dataset-1", + "name": "conformance", + "version": 2, + "size": 16, + "logRoot": "0x7b5bc02c63e970752f38d69995e4771ef596b56a640fc9addef32d570970be68", + "createdAt": "2026-10-03T00:01:00.000Z", + "indexes": { + "age": { + "root": "0xfc641a2eadd7d876f9b4fe284dac094fb83543cf43a2c2f80e88f6d9e98114a7", + "size": 16 + }, + "country": { + "root": "0x5be9a95a39966382ab8d83179ae93380d723d49eff2f3b76a290a72a8ee60149", + "size": 16 + } + }, + "previous": "0xcea41f8f24fd00aa268619aac5c49b184e5971648db52fb514efdf5f0686d9aa" + }, + "k": 4, + "seed": "conformance-sample", + "served": { + "3": { + "v": 1, + "kind": "aere-verifiable-record", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "i": 3, + "id": "r3", + "c": { + "age": "0x13ec2a42a36e8b12ebdbd35af1d96962683a06b802e9e1f9e2e020487c691f7f", + "country": "0x1d18032f2e5acd907bffb4db2103b3d1d337388078ed9238a913c0cabecb928f", + "email": "0xe36f28b120650ba4c2597063b456d4d00847532129bd26dc8c150291265eef23", + "note": "0x086341fc0392c796d5f84f78f183deef347fa327e3d48707c460fc4d9c1f9910" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "0ee225e77747d7afafb81d1bffdf68c0" + } + }, + "logProof": { + "index": 3, + "treeSize": 16, + "path": [ + "0x5083ccb306cbefaa21d75b69a47668b0cd3943865500881281d96e05429face8", + "0x6528250e72e30d47b6b47dcefaa225bcb9fc1af0d20ee827c331486083baac56", + "0xef30cdbdc0b6467d74313d8b22b2054e32a17b3a484121ccc24cb16d8ad6fec0", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + } + }, + "7": { + "v": 1, + "kind": "aere-verifiable-record", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "i": 7, + "id": "r7", + "c": { + "age": "0xa1a74e2ac07bab6c41c2556b844aae64857449195ceac53645c629516238b344", + "country": "0xcc9aab9315438cb08ca38170956cb46c872df70d01652b24c09f8863300e6196", + "email": "0xa90cedaf1e40181e97badd77834f7ad7941cc0d185884b625f260b6843f21aae", + "note": "0xcdc993d68c62518d20dddb06072d1f2d576c80a87f33cafdbdfb64d73e78ef51" + }, + "disclosed": { + "country": { + "value": "ES", + "salt": "985bd39a58f95e5356f853a164382b93" + } + }, + "logProof": { + "index": 7, + "treeSize": 16, + "path": [ + "0x1834d4378c03e4b8303175bcb26d1d8004e2228abcb445a35a1add3901ed7af0", + "0xba1730442baeb4246d80e34e1200df5dfecce1c52067e73850f131a1193eefc1", + "0xb69d58d00d2681aae7d29aa7836c94b0f65e2d4847379b4ba09caec5762875ea", + "0xe1ff507974903713d6ac9451d920007303edcffa4a82190f3976ba1c0b06d932" + ] + } + }, + "12": { + "v": 1, + "kind": "aere-verifiable-record", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "i": 12, + "id": "r12", + "c": { + "age": "0x090dd84053907e69b2d2a99757f1a0e248d270d57fa8f442d20f9ecefef019c8", + "country": "0xa383f5cce4bec2b3d87ba7689f05af77bb0060b247c69ccd2cf64231592cd33a", + "email": "0x72559f17dfc692e8f3a8ceaa63727e94860120fe26e40bd5e81bccc7d0a836e4", + "note": "0x89a3d01a0711b2bc1697ec4cb82ca0dc4bcd5bc17bb7b10f22623f579833df54" + }, + "disclosed": { + "country": { + "value": "RO", + "salt": "2acf87c71b169c498b2cbd745469589a" + } + }, + "logProof": { + "index": 12, + "treeSize": 16, + "path": [ + "0xc383e9a1e188c33996ec8ed77bb82230a72a4f52facef6bb31482535a09c30e0", + "0x85c6057fcfb4dd1d0fdfc0e4a925284def148b2ee0513c6858a29070aca4d50d", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + } + }, + "14": { + "v": 1, + "kind": "aere-verifiable-record", + "name": "conformance", + "version": 2, + "commitmentHash": "0x4cd24b27c6c17493766099e86e188abfa3ac25d5e28a86e48792d20962a3486d", + "i": 14, + "id": "r14", + "c": { + "age": "0x2a86b9afad1aff1234aa90bdf96095d07ef5d479992a9081c21adc965a3c20c3", + "country": "0xebd5ee1cac77bb2b170c930d964032218f9f9c69284c89b213dbefb2d54b8eee", + "email": "0xb9319475dca37efe658a39f9f7c10d13dd21a32276ec911dc57a2677a4e4bb50", + "note": "0x3fdbec96439422e50f7faabf111c8c8c2690460aad638b745a6875678fd38f34" + }, + "disclosed": { + "country": { + "value": "FR", + "salt": "15d426374424c484ffc8ae1bb736d960" + } + }, + "logProof": { + "index": 14, + "treeSize": 16, + "path": [ + "0x12c9a4faf655bb09dbbb6a5fb3a24e44330e5d83222439ab2d2c2224c3791d84", + "0x1dd8a5c51c6218cb8ca3a57ee7683a06b1e94aaedc7252a6b296e4091c975377", + "0xaa5a00c12fedc13a01a588cd3a41470e0fcaf2a5ee7b1dc27ffa5b4ff7a3311b", + "0x130f443c7aa19dcb7d32586835a4260e4f181c1a36a43083e0e15d6aa4a41ecc" + ] + } + } + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/agent-decision.form.json b/conformance/vectori/envelope/agent-decision.form.json new file mode 100644 index 0000000..71d348e --- /dev/null +++ b/conformance/vectori/envelope/agent-decision.form.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/agent-decision.form", + "artifact": "envelope", + "title": "agent-decision: the statementHash is 63 hex digits", + "source": "derived from envelope/agent-decision.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/agent-decision.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statementHash" + ], + "value": "0x80e2d43344c4b23aea1700f9230d5162a7a8768036e5ed4cd5303856fcd5632" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-agent-decision-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-agent-decision", + "policyHash": "0xc7d983a9886a0899bd6f3f09fde526514b0075f8f6abe77a1886405d86048c27", + "actionHash": "0x4ed27941710465e1431097592d2426f029306343d7e1172aa581b56b2fcf7cd4", + "allowed": true, + "reason": "under the limit", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x80e2d43344c4b23aea1700f9230d5162a7a8768036e5ed4cd5303856fcd5632" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.form" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/agent-decision.integrity.json b/conformance/vectori/envelope/agent-decision.integrity.json new file mode 100644 index 0000000..0062e00 --- /dev/null +++ b/conformance/vectori/envelope/agent-decision.integrity.json @@ -0,0 +1,51 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/agent-decision.integrity", + "artifact": "envelope", + "title": "agent-decision: statement.policyHash changed after hashing", + "source": "derived from envelope/agent-decision.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/agent-decision.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statement", + "policyHash" + ], + "value": "0xc7d983a9886a0899bd6f3f09fde526514b0075f8f6abe77a1886405d86048c270" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-agent-decision-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-agent-decision", + "policyHash": "0xc7d983a9886a0899bd6f3f09fde526514b0075f8f6abe77a1886405d86048c270", + "actionHash": "0x4ed27941710465e1431097592d2426f029306343d7e1172aa581b56b2fcf7cd4", + "allowed": true, + "reason": "under the limit", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x80e2d43344c4b23aea1700f9230d5162a7a8768036e5ed4cd5303856fcd5632a" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.integrity" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/agent-decision.valid.json b/conformance/vectori/envelope/agent-decision.valid.json new file mode 100644 index 0000000..44296e1 --- /dev/null +++ b/conformance/vectori/envelope/agent-decision.valid.json @@ -0,0 +1,41 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/agent-decision.valid", + "artifact": "envelope", + "title": "the agent-decision envelope from its producer", + "source": "producer on fixed inputs", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": null, + "mutation": null, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-agent-decision-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-agent-decision", + "policyHash": "0xc7d983a9886a0899bd6f3f09fde526514b0075f8f6abe77a1886405d86048c27", + "actionHash": "0x4ed27941710465e1431097592d2426f029306343d7e1172aa581b56b2fcf7cd4", + "allowed": true, + "reason": "under the limit", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x80e2d43344c4b23aea1700f9230d5162a7a8768036e5ed4cd5303856fcd5632a" + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/ai.form.json b/conformance/vectori/envelope/ai.form.json new file mode 100644 index 0000000..0b9a5b9 --- /dev/null +++ b/conformance/vectori/envelope/ai.form.json @@ -0,0 +1,59 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/ai.form", + "artifact": "envelope", + "title": "ai: the statementHash is 63 hex digits", + "source": "derived from envelope/ai.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/ai.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statementHash" + ], + "value": "0x496ba1813fe9923be9817a66dc413482103c0eee5166d55e3b8df3fc3a1c60c" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-ai-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-ai", + "model": { + "name": "example-model", + "version": "1.0", + "weightsSha256": null + }, + "promptHash": "0xbae9264d6d972b80f4fe23b4a22b599a1585c7faa7473232694978240159f3fe", + "inputHash": null, + "outputHash": "0x761b7ad8ad439b2855fcbb611331c646ef0870b0631247bba3f3025cb6df5a53", + "tools": [ + "search" + ], + "agentId": "agent-7", + "requesterHash": null, + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x496ba1813fe9923be9817a66dc413482103c0eee5166d55e3b8df3fc3a1c60c" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.form" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/ai.integrity.json b/conformance/vectori/envelope/ai.integrity.json new file mode 100644 index 0000000..51e1fb6 --- /dev/null +++ b/conformance/vectori/envelope/ai.integrity.json @@ -0,0 +1,60 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/ai.integrity", + "artifact": "envelope", + "title": "ai: statement.promptHash changed after hashing", + "source": "derived from envelope/ai.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/ai.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statement", + "promptHash" + ], + "value": "0xbae9264d6d972b80f4fe23b4a22b599a1585c7faa7473232694978240159f3fe0" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-ai-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-ai", + "model": { + "name": "example-model", + "version": "1.0", + "weightsSha256": null + }, + "promptHash": "0xbae9264d6d972b80f4fe23b4a22b599a1585c7faa7473232694978240159f3fe0", + "inputHash": null, + "outputHash": "0x761b7ad8ad439b2855fcbb611331c646ef0870b0631247bba3f3025cb6df5a53", + "tools": [ + "search" + ], + "agentId": "agent-7", + "requesterHash": null, + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x496ba1813fe9923be9817a66dc413482103c0eee5166d55e3b8df3fc3a1c60cd" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.integrity" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/ai.valid.json b/conformance/vectori/envelope/ai.valid.json new file mode 100644 index 0000000..9ad07dc --- /dev/null +++ b/conformance/vectori/envelope/ai.valid.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/ai.valid", + "artifact": "envelope", + "title": "the ai envelope from its producer", + "source": "producer on fixed inputs", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": null, + "mutation": null, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-ai-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-ai", + "model": { + "name": "example-model", + "version": "1.0", + "weightsSha256": null + }, + "promptHash": "0xbae9264d6d972b80f4fe23b4a22b599a1585c7faa7473232694978240159f3fe", + "inputHash": null, + "outputHash": "0x761b7ad8ad439b2855fcbb611331c646ef0870b0631247bba3f3025cb6df5a53", + "tools": [ + "search" + ], + "agentId": "agent-7", + "requesterHash": null, + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x496ba1813fe9923be9817a66dc413482103c0eee5166d55e3b8df3fc3a1c60cd" + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/authorization.form.json b/conformance/vectori/envelope/authorization.form.json new file mode 100644 index 0000000..81c20db --- /dev/null +++ b/conformance/vectori/envelope/authorization.form.json @@ -0,0 +1,51 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/authorization.form", + "artifact": "envelope", + "title": "authorization: the statementHash is 63 hex digits", + "source": "derived from envelope/authorization.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/authorization.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statementHash" + ], + "value": "0xad70cb9db980eb04d739c7687fec8d3a3675c35105b3d3837c2012c81cd9d52" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-authorization-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-authorization", + "policyHash": "0xf062025b73d9324b189fcec2b5c88338aa6fa9fb7877700681b2049b57e6aedd", + "grantor": "org-x", + "grantee": "agent-7", + "scope": "payments:send<=100", + "expiresAt": "2026-12-31T00:00:00Z", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0xad70cb9db980eb04d739c7687fec8d3a3675c35105b3d3837c2012c81cd9d52" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.form" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/authorization.integrity.json b/conformance/vectori/envelope/authorization.integrity.json new file mode 100644 index 0000000..9bcca69 --- /dev/null +++ b/conformance/vectori/envelope/authorization.integrity.json @@ -0,0 +1,52 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/authorization.integrity", + "artifact": "envelope", + "title": "authorization: statement.policyHash changed after hashing", + "source": "derived from envelope/authorization.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/authorization.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statement", + "policyHash" + ], + "value": "0xf062025b73d9324b189fcec2b5c88338aa6fa9fb7877700681b2049b57e6aedd0" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-authorization-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-authorization", + "policyHash": "0xf062025b73d9324b189fcec2b5c88338aa6fa9fb7877700681b2049b57e6aedd0", + "grantor": "org-x", + "grantee": "agent-7", + "scope": "payments:send<=100", + "expiresAt": "2026-12-31T00:00:00Z", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0xad70cb9db980eb04d739c7687fec8d3a3675c35105b3d3837c2012c81cd9d521" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.integrity" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/authorization.valid.json b/conformance/vectori/envelope/authorization.valid.json new file mode 100644 index 0000000..065df3c --- /dev/null +++ b/conformance/vectori/envelope/authorization.valid.json @@ -0,0 +1,42 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/authorization.valid", + "artifact": "envelope", + "title": "the authorization envelope from its producer", + "source": "producer on fixed inputs", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": null, + "mutation": null, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-authorization-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-authorization", + "policyHash": "0xf062025b73d9324b189fcec2b5c88338aa6fa9fb7877700681b2049b57e6aedd", + "grantor": "org-x", + "grantee": "agent-7", + "scope": "payments:send<=100", + "expiresAt": "2026-12-31T00:00:00Z", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0xad70cb9db980eb04d739c7687fec8d3a3675c35105b3d3837c2012c81cd9d521" + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/block.form.json b/conformance/vectori/envelope/block.form.json new file mode 100644 index 0000000..aa742af --- /dev/null +++ b/conformance/vectori/envelope/block.form.json @@ -0,0 +1,51 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/block.form", + "artifact": "envelope", + "title": "block: the statementHash is 63 hex digits", + "source": "derived from envelope/block.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/block.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statementHash" + ], + "value": "0xa18b21e49b38ab96633111d562f95738042a0ea63906164b022c075a3c5971a" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-block-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-block", + "stateTransitionProof": null, + "blockHash": "0xabababababababababababababababababababababababababababababababab", + "stateRoot": "0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd", + "anchorHeight": 20255488, + "certificateDigest": "0xefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0xa18b21e49b38ab96633111d562f95738042a0ea63906164b022c075a3c5971a" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.form" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/block.integrity.json b/conformance/vectori/envelope/block.integrity.json new file mode 100644 index 0000000..e9fcc04 --- /dev/null +++ b/conformance/vectori/envelope/block.integrity.json @@ -0,0 +1,52 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/block.integrity", + "artifact": "envelope", + "title": "block: statement.blockHash changed after hashing", + "source": "derived from envelope/block.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/block.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statement", + "blockHash" + ], + "value": "0xabababababababababababababababababababababababababababababababab0" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-block-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-block", + "stateTransitionProof": null, + "blockHash": "0xabababababababababababababababababababababababababababababababab0", + "stateRoot": "0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd", + "anchorHeight": 20255488, + "certificateDigest": "0xefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0xa18b21e49b38ab96633111d562f95738042a0ea63906164b022c075a3c5971ad" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.integrity" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/block.valid.json b/conformance/vectori/envelope/block.valid.json new file mode 100644 index 0000000..9cc0250 --- /dev/null +++ b/conformance/vectori/envelope/block.valid.json @@ -0,0 +1,42 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/block.valid", + "artifact": "envelope", + "title": "the block envelope from its producer", + "source": "producer on fixed inputs", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": null, + "mutation": null, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-block-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-block", + "stateTransitionProof": null, + "blockHash": "0xabababababababababababababababababababababababababababababababab", + "stateRoot": "0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd", + "anchorHeight": 20255488, + "certificateDigest": "0xefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefefef", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0xa18b21e49b38ab96633111d562f95738042a0ea63906164b022c075a3c5971ad" + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/compliance.form.json b/conformance/vectori/envelope/compliance.form.json new file mode 100644 index 0000000..f2c7b4f --- /dev/null +++ b/conformance/vectori/envelope/compliance.form.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/compliance.form", + "artifact": "envelope", + "title": "compliance: the statementHash is 63 hex digits", + "source": "derived from envelope/compliance.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/compliance.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statementHash" + ], + "value": "0xbac39cebdd87825b034b4b25d5e44478b62d9623db62e5110e88e523187c6e3" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-compliance-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-compliance", + "evidenceHash": "0x20e95ada67c778758b26bd6425863f9a53bb666a98e3fe060eec15866e87cc12", + "subject": "org-x", + "policy": "pq-ready", + "result": "pass", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0xbac39cebdd87825b034b4b25d5e44478b62d9623db62e5110e88e523187c6e3" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.form" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/compliance.integrity.json b/conformance/vectori/envelope/compliance.integrity.json new file mode 100644 index 0000000..b8e23a8 --- /dev/null +++ b/conformance/vectori/envelope/compliance.integrity.json @@ -0,0 +1,51 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/compliance.integrity", + "artifact": "envelope", + "title": "compliance: statement.evidenceHash changed after hashing", + "source": "derived from envelope/compliance.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/compliance.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statement", + "evidenceHash" + ], + "value": "0x20e95ada67c778758b26bd6425863f9a53bb666a98e3fe060eec15866e87cc120" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-compliance-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-compliance", + "evidenceHash": "0x20e95ada67c778758b26bd6425863f9a53bb666a98e3fe060eec15866e87cc120", + "subject": "org-x", + "policy": "pq-ready", + "result": "pass", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0xbac39cebdd87825b034b4b25d5e44478b62d9623db62e5110e88e523187c6e32" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.integrity" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/compliance.valid.json b/conformance/vectori/envelope/compliance.valid.json new file mode 100644 index 0000000..9139bdb --- /dev/null +++ b/conformance/vectori/envelope/compliance.valid.json @@ -0,0 +1,41 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/compliance.valid", + "artifact": "envelope", + "title": "the compliance envelope from its producer", + "source": "producer on fixed inputs", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": null, + "mutation": null, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-compliance-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-compliance", + "evidenceHash": "0x20e95ada67c778758b26bd6425863f9a53bb666a98e3fe060eec15866e87cc12", + "subject": "org-x", + "policy": "pq-ready", + "result": "pass", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0xbac39cebdd87825b034b4b25d5e44478b62d9623db62e5110e88e523187c6e32" + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/data.form.json b/conformance/vectori/envelope/data.form.json new file mode 100644 index 0000000..4bb7f0e --- /dev/null +++ b/conformance/vectori/envelope/data.form.json @@ -0,0 +1,48 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/data.form", + "artifact": "envelope", + "title": "data: the statementHash is 63 hex digits", + "source": "derived from envelope/data.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/data.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statementHash" + ], + "value": "0x2acbef682084c42c3f8a7bc9fa4370257ff83994ffa92c36e44c556b44d5c8b" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-data-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-data", + "sha256": "0x205830ca5b23bbe39ab510cfddc1dff2d9842e38b5fa7b7c48cd4ca7e44f92a1", + "name": "report.csv", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x2acbef682084c42c3f8a7bc9fa4370257ff83994ffa92c36e44c556b44d5c8b" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.form" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/data.integrity.json b/conformance/vectori/envelope/data.integrity.json new file mode 100644 index 0000000..e0c7447 --- /dev/null +++ b/conformance/vectori/envelope/data.integrity.json @@ -0,0 +1,49 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/data.integrity", + "artifact": "envelope", + "title": "data: statement.sha256 changed after hashing", + "source": "derived from envelope/data.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/data.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statement", + "sha256" + ], + "value": "0x205830ca5b23bbe39ab510cfddc1dff2d9842e38b5fa7b7c48cd4ca7e44f92a10" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-data-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-data", + "sha256": "0x205830ca5b23bbe39ab510cfddc1dff2d9842e38b5fa7b7c48cd4ca7e44f92a10", + "name": "report.csv", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x2acbef682084c42c3f8a7bc9fa4370257ff83994ffa92c36e44c556b44d5c8b2" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.integrity" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/data.valid.json b/conformance/vectori/envelope/data.valid.json new file mode 100644 index 0000000..6d0be08 --- /dev/null +++ b/conformance/vectori/envelope/data.valid.json @@ -0,0 +1,39 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/data.valid", + "artifact": "envelope", + "title": "the data envelope from its producer", + "source": "producer on fixed inputs", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": null, + "mutation": null, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-data-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-data", + "sha256": "0x205830ca5b23bbe39ab510cfddc1dff2d9842e38b5fa7b7c48cd4ca7e44f92a1", + "name": "report.csv", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x2acbef682084c42c3f8a7bc9fa4370257ff83994ffa92c36e44c556b44d5c8b2" + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/device.form.json b/conformance/vectori/envelope/device.form.json new file mode 100644 index 0000000..af128eb --- /dev/null +++ b/conformance/vectori/envelope/device.form.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/device.form", + "artifact": "envelope", + "title": "device: the statementHash is 63 hex digits", + "source": "derived from envelope/device.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/device.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statementHash" + ], + "value": "0x440956f2ba441931fd5dcfbf808c3a646187bd01c144052d52a3b127dc71659" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-device-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-device", + "attestationHash": "0xaa70e763e0eceecb3f1033c9cc44e05681d741afc05d0479269fe859d523021d", + "publicKeyHash": "0xfcab7fcc2b4cffd9bb45003bfc2e468a04ef6f77ca8200a7341f027631584d25", + "deviceId": "dev-9", + "posture": "secure-boot", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x440956f2ba441931fd5dcfbf808c3a646187bd01c144052d52a3b127dc71659" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.form" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/device.integrity.json b/conformance/vectori/envelope/device.integrity.json new file mode 100644 index 0000000..b9e61fb --- /dev/null +++ b/conformance/vectori/envelope/device.integrity.json @@ -0,0 +1,51 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/device.integrity", + "artifact": "envelope", + "title": "device: statement.attestationHash changed after hashing", + "source": "derived from envelope/device.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/device.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statement", + "attestationHash" + ], + "value": "0xaa70e763e0eceecb3f1033c9cc44e05681d741afc05d0479269fe859d523021d0" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-device-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-device", + "attestationHash": "0xaa70e763e0eceecb3f1033c9cc44e05681d741afc05d0479269fe859d523021d0", + "publicKeyHash": "0xfcab7fcc2b4cffd9bb45003bfc2e468a04ef6f77ca8200a7341f027631584d25", + "deviceId": "dev-9", + "posture": "secure-boot", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x440956f2ba441931fd5dcfbf808c3a646187bd01c144052d52a3b127dc71659c" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.integrity" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/device.valid.json b/conformance/vectori/envelope/device.valid.json new file mode 100644 index 0000000..08dbea8 --- /dev/null +++ b/conformance/vectori/envelope/device.valid.json @@ -0,0 +1,41 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/device.valid", + "artifact": "envelope", + "title": "the device envelope from its producer", + "source": "producer on fixed inputs", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": null, + "mutation": null, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-device-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-device", + "attestationHash": "0xaa70e763e0eceecb3f1033c9cc44e05681d741afc05d0479269fe859d523021d", + "publicKeyHash": "0xfcab7fcc2b4cffd9bb45003bfc2e468a04ef6f77ca8200a7341f027631584d25", + "deviceId": "dev-9", + "posture": "secure-boot", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x440956f2ba441931fd5dcfbf808c3a646187bd01c144052d52a3b127dc71659c" + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/execution.form.json b/conformance/vectori/envelope/execution.form.json new file mode 100644 index 0000000..4f5f275 --- /dev/null +++ b/conformance/vectori/envelope/execution.form.json @@ -0,0 +1,51 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/execution.form", + "artifact": "envelope", + "title": "execution: the statementHash is 63 hex digits", + "source": "derived from envelope/execution.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/execution.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statementHash" + ], + "value": "0x06a106c24b5fd8cfc7ed0cee3dc6401c720c394566ad3d7ca899f9640414fc8" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-execution-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-execution", + "inputHash": "0x582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf", + "outputHash": "0x762069bc07a6e1b5df123a5ae7bd91c10daa04694fbaa17fba0cd6a8dcce8f22", + "programSha256": null, + "program": "aere-node", + "exitCode": 0, + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x06a106c24b5fd8cfc7ed0cee3dc6401c720c394566ad3d7ca899f9640414fc8" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.form" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/execution.integrity.json b/conformance/vectori/envelope/execution.integrity.json new file mode 100644 index 0000000..5761dec --- /dev/null +++ b/conformance/vectori/envelope/execution.integrity.json @@ -0,0 +1,52 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/execution.integrity", + "artifact": "envelope", + "title": "execution: statement.inputHash changed after hashing", + "source": "derived from envelope/execution.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/execution.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statement", + "inputHash" + ], + "value": "0x582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf0" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-execution-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-execution", + "inputHash": "0x582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf0", + "outputHash": "0x762069bc07a6e1b5df123a5ae7bd91c10daa04694fbaa17fba0cd6a8dcce8f22", + "programSha256": null, + "program": "aere-node", + "exitCode": 0, + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x06a106c24b5fd8cfc7ed0cee3dc6401c720c394566ad3d7ca899f9640414fc8e" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.integrity" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/execution.valid.json b/conformance/vectori/envelope/execution.valid.json new file mode 100644 index 0000000..c8f858e --- /dev/null +++ b/conformance/vectori/envelope/execution.valid.json @@ -0,0 +1,42 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/execution.valid", + "artifact": "envelope", + "title": "the execution envelope from its producer", + "source": "producer on fixed inputs", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": null, + "mutation": null, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-execution-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-execution", + "inputHash": "0x582967534d0f909d196b97f9e6921342777aea87b46fa52df165389db1fb8ccf", + "outputHash": "0x762069bc07a6e1b5df123a5ae7bd91c10daa04694fbaa17fba0cd6a8dcce8f22", + "programSha256": null, + "program": "aere-node", + "exitCode": 0, + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x06a106c24b5fd8cfc7ed0cee3dc6401c720c394566ad3d7ca899f9640414fc8e" + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/fresh-28001.finality.json b/conformance/vectori/envelope/fresh-28001.finality.json new file mode 100644 index 0000000..9a8ee1e --- /dev/null +++ b/conformance/vectori/envelope/fresh-28001.finality.json @@ -0,0 +1,57 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/fresh-28001.finality", + "artifact": "envelope", + "title": "the same envelope claims a notarization the chain does not hold", + "source": "derived from envelope/fresh-28001.valid", + "requires": [ + "rpc-28001" + ], + "exercises": [ + "envelope.finality", + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/fresh-28001.valid", + "mutation": { + "op": "add", + "path": [ + "envelope", + "notarization" + ], + "value": { + "chainId": 28001 + } + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-data-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-data", + "sha256": "0xb77944195dabe43e90c675cc0cdf281a63bc642859b32f9779cd359d79d5d699", + "name": "conformance-fresh", + "createdAt": "2026-10-03T09:33:28.671Z" + }, + "statementHash": "0x542f165753e134e1969f43a50c88cf726db62358e5e1a5341c22570c1181377e", + "notarization": { + "chainId": 28001 + } + }, + "chain": 28001 + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.finality" + ], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "FAILED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/fresh-28001.valid.json b/conformance/vectori/envelope/fresh-28001.valid.json new file mode 100644 index 0000000..d5eb2e3 --- /dev/null +++ b/conformance/vectori/envelope/fresh-28001.valid.json @@ -0,0 +1,43 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/fresh-28001.valid", + "artifact": "envelope", + "title": "an envelope nobody notarized, claiming nothing", + "source": "producer, random content", + "requires": [ + "rpc-28001" + ], + "exercises": [ + "envelope.finality", + "envelope.form", + "envelope.integrity" + ], + "base": null, + "mutation": null, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-data-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-data", + "sha256": "0xb77944195dabe43e90c675cc0cdf281a63bc642859b32f9779cd359d79d5d699", + "name": "conformance-fresh", + "createdAt": "2026-10-03T09:33:28.671Z" + }, + "statementHash": "0x542f165753e134e1969f43a50c88cf726db62358e5e1a5341c22570c1181377e" + }, + "chain": 28001 + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/identity.form.json b/conformance/vectori/envelope/identity.form.json new file mode 100644 index 0000000..e73bf42 --- /dev/null +++ b/conformance/vectori/envelope/identity.form.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/identity.form", + "artifact": "envelope", + "title": "identity: the statementHash is 63 hex digits", + "source": "derived from envelope/identity.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/identity.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statementHash" + ], + "value": "0x9c609bdaa3f6e7c0b926c2071a18026a6073e92c4344ea537f3ffabcd3a921b" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-identity-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-identity", + "publicKeyHash": "0xfcab7fcc2b4cffd9bb45003bfc2e468a04ef6f77ca8200a7341f027631584d25", + "subjectHash": null, + "method": "ml-dsa-65", + "subjectId": "agent-1", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x9c609bdaa3f6e7c0b926c2071a18026a6073e92c4344ea537f3ffabcd3a921b" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.form" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/identity.integrity.json b/conformance/vectori/envelope/identity.integrity.json new file mode 100644 index 0000000..4c430fe --- /dev/null +++ b/conformance/vectori/envelope/identity.integrity.json @@ -0,0 +1,51 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/identity.integrity", + "artifact": "envelope", + "title": "identity: statement.publicKeyHash changed after hashing", + "source": "derived from envelope/identity.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/identity.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statement", + "publicKeyHash" + ], + "value": "0xfcab7fcc2b4cffd9bb45003bfc2e468a04ef6f77ca8200a7341f027631584d250" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-identity-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-identity", + "publicKeyHash": "0xfcab7fcc2b4cffd9bb45003bfc2e468a04ef6f77ca8200a7341f027631584d250", + "subjectHash": null, + "method": "ml-dsa-65", + "subjectId": "agent-1", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x9c609bdaa3f6e7c0b926c2071a18026a6073e92c4344ea537f3ffabcd3a921b9" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.integrity" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/identity.valid.json b/conformance/vectori/envelope/identity.valid.json new file mode 100644 index 0000000..85d3896 --- /dev/null +++ b/conformance/vectori/envelope/identity.valid.json @@ -0,0 +1,41 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/identity.valid", + "artifact": "envelope", + "title": "the identity envelope from its producer", + "source": "producer on fixed inputs", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": null, + "mutation": null, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-identity-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-identity", + "publicKeyHash": "0xfcab7fcc2b4cffd9bb45003bfc2e468a04ef6f77ca8200a7341f027631584d25", + "subjectHash": null, + "method": "ml-dsa-65", + "subjectId": "agent-1", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x9c609bdaa3f6e7c0b926c2071a18026a6073e92c4344ea537f3ffabcd3a921b9" + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/location.form.json b/conformance/vectori/envelope/location.form.json new file mode 100644 index 0000000..b540e68 --- /dev/null +++ b/conformance/vectori/envelope/location.form.json @@ -0,0 +1,49 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/location.form", + "artifact": "envelope", + "title": "location: the statementHash is 63 hex digits", + "source": "derived from envelope/location.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/location.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statementHash" + ], + "value": "0x88d2213cf649be8237cc64cff901e2ad8051473d4aab76ca02a7206dee83ad6" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-location-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-location", + "evidenceHash": "0x20e95ada67c778758b26bd6425863f9a53bb666a98e3fe060eec15866e87cc12", + "subject": "srv-eu", + "region": "eu-central", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x88d2213cf649be8237cc64cff901e2ad8051473d4aab76ca02a7206dee83ad6" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.form" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/location.integrity.json b/conformance/vectori/envelope/location.integrity.json new file mode 100644 index 0000000..606fd39 --- /dev/null +++ b/conformance/vectori/envelope/location.integrity.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/location.integrity", + "artifact": "envelope", + "title": "location: statement.evidenceHash changed after hashing", + "source": "derived from envelope/location.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/location.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statement", + "evidenceHash" + ], + "value": "0x20e95ada67c778758b26bd6425863f9a53bb666a98e3fe060eec15866e87cc120" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-location-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-location", + "evidenceHash": "0x20e95ada67c778758b26bd6425863f9a53bb666a98e3fe060eec15866e87cc120", + "subject": "srv-eu", + "region": "eu-central", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x88d2213cf649be8237cc64cff901e2ad8051473d4aab76ca02a7206dee83ad6c" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.integrity" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/location.valid.json b/conformance/vectori/envelope/location.valid.json new file mode 100644 index 0000000..2636ec2 --- /dev/null +++ b/conformance/vectori/envelope/location.valid.json @@ -0,0 +1,40 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/location.valid", + "artifact": "envelope", + "title": "the location envelope from its producer", + "source": "producer on fixed inputs", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": null, + "mutation": null, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-location-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-location", + "evidenceHash": "0x20e95ada67c778758b26bd6425863f9a53bb666a98e3fe060eec15866e87cc12", + "subject": "srv-eu", + "region": "eu-central", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x88d2213cf649be8237cc64cff901e2ad8051473d4aab76ca02a7206dee83ad6c" + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/notarized-28001.valid.json b/conformance/vectori/envelope/notarized-28001.valid.json new file mode 100644 index 0000000..2d148ac --- /dev/null +++ b/conformance/vectori/envelope/notarized-28001.valid.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/notarized-28001.valid", + "artifact": "envelope", + "title": "a dataset commitment notarized on testnet 28001, read back under a verified post-quantum anchor", + "source": "recorded (verifiable-data, 2026-10-02)", + "requires": [ + "rpc-28001" + ], + "exercises": [ + "envelope.finality", + "envelope.form", + "envelope.integrity" + ], + "base": null, + "mutation": null, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-data-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-data", + "sha256": "0xea7441856ff78c64bc549b763816a76fbe40b049c024843427d42761981741cb", + "name": "proba@2", + "createdAt": "2026-10-02T08:01:00.000Z" + }, + "statementHash": "0xeb177d94c7bfa1de42c35a7096b454bda04c9456dad0ca6e5922f78b92192260", + "notarization": { + "chainId": 28001, + "notary": "0x70099E62735500AA2F85B60C518551a57B202d54", + "firstSeen": 1790929167, + "txHash": "0x39938e8ef28f62f60ad3d5f6a205d248e499fe1eda0e1e1851b1c43cc8f08c62", + "block": 4400052 + } + }, + "chain": 28001 + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "PASSED", + "finality": "PASSED" + } + } +} diff --git a/conformance/vectori/envelope/notarized-claim.partial.json b/conformance/vectori/envelope/notarized-claim.partial.json new file mode 100644 index 0000000..0097d40 --- /dev/null +++ b/conformance/vectori/envelope/notarized-claim.partial.json @@ -0,0 +1,47 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/notarized-claim.partial", + "artifact": "envelope", + "title": "the same envelope judged offline: the notarization it claims is not checked, so it is not VALID", + "source": "recorded (verifiable-data, 2026-10-02)", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": null, + "mutation": null, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-data-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-data", + "sha256": "0xea7441856ff78c64bc549b763816a76fbe40b049c024843427d42761981741cb", + "name": "proba@2", + "createdAt": "2026-10-02T08:01:00.000Z" + }, + "statementHash": "0xeb177d94c7bfa1de42c35a7096b454bda04c9456dad0ca6e5922f78b92192260", + "notarization": { + "chainId": 28001, + "notary": "0x70099E62735500AA2F85B60C518551a57B202d54", + "firstSeen": 1790929167, + "txHash": "0x39938e8ef28f62f60ad3d5f6a205d248e499fe1eda0e1e1851b1c43cc8f08c62", + "block": 4400052 + } + }, + "chain": 28001 + }, + "expected": { + "verdict": "PARTIAL", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/ownership.form.json b/conformance/vectori/envelope/ownership.form.json new file mode 100644 index 0000000..129b57d --- /dev/null +++ b/conformance/vectori/envelope/ownership.form.json @@ -0,0 +1,49 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/ownership.form", + "artifact": "envelope", + "title": "ownership: the statementHash is 63 hex digits", + "source": "derived from envelope/ownership.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/ownership.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statementHash" + ], + "value": "0xd41b5b8eb450e3af02fd575a695258f66469c6e36e628cad9aebd724a38248b" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-ownership-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-ownership", + "assetHash": "0x68eef920516b0af8f874dccb72bcffc6f25cdfad43fcb78417fc1feb6efcd698", + "owner": "0xowner", + "assetId": "nft-7", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0xd41b5b8eb450e3af02fd575a695258f66469c6e36e628cad9aebd724a38248b" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.form" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/ownership.integrity.json b/conformance/vectori/envelope/ownership.integrity.json new file mode 100644 index 0000000..e3b3b75 --- /dev/null +++ b/conformance/vectori/envelope/ownership.integrity.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/ownership.integrity", + "artifact": "envelope", + "title": "ownership: statement.assetHash changed after hashing", + "source": "derived from envelope/ownership.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/ownership.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statement", + "assetHash" + ], + "value": "0x68eef920516b0af8f874dccb72bcffc6f25cdfad43fcb78417fc1feb6efcd6980" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-ownership-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-ownership", + "assetHash": "0x68eef920516b0af8f874dccb72bcffc6f25cdfad43fcb78417fc1feb6efcd6980", + "owner": "0xowner", + "assetId": "nft-7", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0xd41b5b8eb450e3af02fd575a695258f66469c6e36e628cad9aebd724a38248bd" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.integrity" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/ownership.valid.json b/conformance/vectori/envelope/ownership.valid.json new file mode 100644 index 0000000..0e640c1 --- /dev/null +++ b/conformance/vectori/envelope/ownership.valid.json @@ -0,0 +1,40 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/ownership.valid", + "artifact": "envelope", + "title": "the ownership envelope from its producer", + "source": "producer on fixed inputs", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": null, + "mutation": null, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-ownership-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-ownership", + "assetHash": "0x68eef920516b0af8f874dccb72bcffc6f25cdfad43fcb78417fc1feb6efcd698", + "owner": "0xowner", + "assetId": "nft-7", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0xd41b5b8eb450e3af02fd575a695258f66469c6e36e628cad9aebd724a38248bd" + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/payment.form.json b/conformance/vectori/envelope/payment.form.json new file mode 100644 index 0000000..f8f210c --- /dev/null +++ b/conformance/vectori/envelope/payment.form.json @@ -0,0 +1,51 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/payment.form", + "artifact": "envelope", + "title": "payment: the statementHash is 63 hex digits", + "source": "derived from envelope/payment.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/payment.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statementHash" + ], + "value": "0x0e937d67740e2314dfa003848dc46600bf6086d3449097f5eb222665c75a4e3" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-payment-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-payment", + "txHash": "0x536939ed0e78c5b5d2ee7e26767bbad66290547f9fa1fc6602a1aa95cc61b959", + "from": "0xa", + "to": "0xb", + "amount": "100", + "asset": "AERE", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x0e937d67740e2314dfa003848dc46600bf6086d3449097f5eb222665c75a4e3" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.form" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/payment.integrity.json b/conformance/vectori/envelope/payment.integrity.json new file mode 100644 index 0000000..856652a --- /dev/null +++ b/conformance/vectori/envelope/payment.integrity.json @@ -0,0 +1,52 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/payment.integrity", + "artifact": "envelope", + "title": "payment: statement.txHash changed after hashing", + "source": "derived from envelope/payment.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/payment.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statement", + "txHash" + ], + "value": "0x536939ed0e78c5b5d2ee7e26767bbad66290547f9fa1fc6602a1aa95cc61b9590" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-payment-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-payment", + "txHash": "0x536939ed0e78c5b5d2ee7e26767bbad66290547f9fa1fc6602a1aa95cc61b9590", + "from": "0xa", + "to": "0xb", + "amount": "100", + "asset": "AERE", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x0e937d67740e2314dfa003848dc46600bf6086d3449097f5eb222665c75a4e32" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.integrity" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/payment.valid.json b/conformance/vectori/envelope/payment.valid.json new file mode 100644 index 0000000..f749b0f --- /dev/null +++ b/conformance/vectori/envelope/payment.valid.json @@ -0,0 +1,42 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/payment.valid", + "artifact": "envelope", + "title": "the payment envelope from its producer", + "source": "producer on fixed inputs", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": null, + "mutation": null, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-payment-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-payment", + "txHash": "0x536939ed0e78c5b5d2ee7e26767bbad66290547f9fa1fc6602a1aa95cc61b959", + "from": "0xa", + "to": "0xb", + "amount": "100", + "asset": "AERE", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x0e937d67740e2314dfa003848dc46600bf6086d3449097f5eb222665c75a4e32" + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/provenance.form.json b/conformance/vectori/envelope/provenance.form.json new file mode 100644 index 0000000..17d312e --- /dev/null +++ b/conformance/vectori/envelope/provenance.form.json @@ -0,0 +1,53 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/provenance.form", + "artifact": "envelope", + "title": "provenance: the statementHash is 63 hex digits", + "source": "derived from envelope/provenance.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/provenance.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statementHash" + ], + "value": "0x87b2a679d9e8af836c911f87ca8050c9c826c30b011da63ed87cf82146c048c" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-provenance-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-provenance", + "subjectHash": "0x7fbd7ef36fdd97293aa5b3bcd597146101d3ea9a12b271ed0c88bdca25b63d12", + "processHash": "0x3053677e4333a96b20ed76c662bca07fb2e1ce059479170139209356787da09c", + "parents": [ + "0x7624c3381360e030f4172f54c925584354cf3595e793f59311c7ac33a582984f", + "0xce1d96bce7b6086cd30375a4523daab06e55630c8405d304eaa5a96d0c6d0545" + ], + "actor": "build-bot", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x87b2a679d9e8af836c911f87ca8050c9c826c30b011da63ed87cf82146c048c" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.form" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/provenance.integrity.json b/conformance/vectori/envelope/provenance.integrity.json new file mode 100644 index 0000000..8c888db --- /dev/null +++ b/conformance/vectori/envelope/provenance.integrity.json @@ -0,0 +1,54 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/provenance.integrity", + "artifact": "envelope", + "title": "provenance: statement.subjectHash changed after hashing", + "source": "derived from envelope/provenance.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/provenance.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statement", + "subjectHash" + ], + "value": "0x7fbd7ef36fdd97293aa5b3bcd597146101d3ea9a12b271ed0c88bdca25b63d120" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-provenance-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-provenance", + "subjectHash": "0x7fbd7ef36fdd97293aa5b3bcd597146101d3ea9a12b271ed0c88bdca25b63d120", + "processHash": "0x3053677e4333a96b20ed76c662bca07fb2e1ce059479170139209356787da09c", + "parents": [ + "0x7624c3381360e030f4172f54c925584354cf3595e793f59311c7ac33a582984f", + "0xce1d96bce7b6086cd30375a4523daab06e55630c8405d304eaa5a96d0c6d0545" + ], + "actor": "build-bot", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x87b2a679d9e8af836c911f87ca8050c9c826c30b011da63ed87cf82146c048c3" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.integrity" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/provenance.valid.json b/conformance/vectori/envelope/provenance.valid.json new file mode 100644 index 0000000..2511393 --- /dev/null +++ b/conformance/vectori/envelope/provenance.valid.json @@ -0,0 +1,44 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/provenance.valid", + "artifact": "envelope", + "title": "the provenance envelope from its producer", + "source": "producer on fixed inputs", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": null, + "mutation": null, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-provenance-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-provenance", + "subjectHash": "0x7fbd7ef36fdd97293aa5b3bcd597146101d3ea9a12b271ed0c88bdca25b63d12", + "processHash": "0x3053677e4333a96b20ed76c662bca07fb2e1ce059479170139209356787da09c", + "parents": [ + "0x7624c3381360e030f4172f54c925584354cf3595e793f59311c7ac33a582984f", + "0xce1d96bce7b6086cd30375a4523daab06e55630c8405d304eaa5a96d0c6d0545" + ], + "actor": "build-bot", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x87b2a679d9e8af836c911f87ca8050c9c826c30b011da63ed87cf82146c048c3" + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/runtime.form.json b/conformance/vectori/envelope/runtime.form.json new file mode 100644 index 0000000..23d061f --- /dev/null +++ b/conformance/vectori/envelope/runtime.form.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/runtime.form", + "artifact": "envelope", + "title": "runtime: the statementHash is 63 hex digits", + "source": "derived from envelope/runtime.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/runtime.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statementHash" + ], + "value": "0xdcbb527e5475efc0d5ecf518cd19d4ceb3546324d3f59310ffa9f787bbf96c6" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-runtime-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-runtime", + "artifactSha256": "0xc73f954a0dcd410afe8d2117ec8a4bef49cf677c60045a5f21acfa2a756ff7d5", + "attestedSha256": "0xc73f954a0dcd410afe8d2117ec8a4bef49cf677c60045a5f21acfa2a756ff7d5", + "host": "h1", + "matches": true, + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0xdcbb527e5475efc0d5ecf518cd19d4ceb3546324d3f59310ffa9f787bbf96c6" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.form" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/runtime.integrity.json b/conformance/vectori/envelope/runtime.integrity.json new file mode 100644 index 0000000..e986b16 --- /dev/null +++ b/conformance/vectori/envelope/runtime.integrity.json @@ -0,0 +1,51 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/runtime.integrity", + "artifact": "envelope", + "title": "runtime: statement.artifactSha256 changed after hashing", + "source": "derived from envelope/runtime.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/runtime.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statement", + "artifactSha256" + ], + "value": "0xc73f954a0dcd410afe8d2117ec8a4bef49cf677c60045a5f21acfa2a756ff7d50" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-runtime-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-runtime", + "artifactSha256": "0xc73f954a0dcd410afe8d2117ec8a4bef49cf677c60045a5f21acfa2a756ff7d50", + "attestedSha256": "0xc73f954a0dcd410afe8d2117ec8a4bef49cf677c60045a5f21acfa2a756ff7d5", + "host": "h1", + "matches": true, + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0xdcbb527e5475efc0d5ecf518cd19d4ceb3546324d3f59310ffa9f787bbf96c63" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.integrity" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/runtime.valid.json b/conformance/vectori/envelope/runtime.valid.json new file mode 100644 index 0000000..4a3ee77 --- /dev/null +++ b/conformance/vectori/envelope/runtime.valid.json @@ -0,0 +1,41 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/runtime.valid", + "artifact": "envelope", + "title": "the runtime envelope from its producer", + "source": "producer on fixed inputs", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": null, + "mutation": null, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-runtime-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-runtime", + "artifactSha256": "0xc73f954a0dcd410afe8d2117ec8a4bef49cf677c60045a5f21acfa2a756ff7d5", + "attestedSha256": "0xc73f954a0dcd410afe8d2117ec8a4bef49cf677c60045a5f21acfa2a756ff7d5", + "host": "h1", + "matches": true, + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0xdcbb527e5475efc0d5ecf518cd19d4ceb3546324d3f59310ffa9f787bbf96c63" + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/settlement.form.json b/conformance/vectori/envelope/settlement.form.json new file mode 100644 index 0000000..9b22f05 --- /dev/null +++ b/conformance/vectori/envelope/settlement.form.json @@ -0,0 +1,54 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/settlement.form", + "artifact": "envelope", + "title": "settlement: the statementHash is 63 hex digits", + "source": "derived from envelope/settlement.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/settlement.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statementHash" + ], + "value": "0x19d9b1141c923ed4faf8304daffd5639e813c3b70248ffefc5b8a5e6373d26c" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-settlement-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-settlement", + "instructionHash": "0xd5ee7e3afb8ac427fe87d3f7acd285363550bff09ff9f617ecc303488b21be61", + "txHash": "0x1212121212121212121212121212121212121212121212121212121212121212", + "blockHash": "0x3434343434343434343434343434343434343434343434343434343434343434", + "chainId": 2800, + "from": "0xa", + "to": "0xb", + "amount": "100", + "asset": "AERE", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x19d9b1141c923ed4faf8304daffd5639e813c3b70248ffefc5b8a5e6373d26c" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.form" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/settlement.integrity.json b/conformance/vectori/envelope/settlement.integrity.json new file mode 100644 index 0000000..1875e39 --- /dev/null +++ b/conformance/vectori/envelope/settlement.integrity.json @@ -0,0 +1,55 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/settlement.integrity", + "artifact": "envelope", + "title": "settlement: statement.instructionHash changed after hashing", + "source": "derived from envelope/settlement.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/settlement.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statement", + "instructionHash" + ], + "value": "0xd5ee7e3afb8ac427fe87d3f7acd285363550bff09ff9f617ecc303488b21be610" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-settlement-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-settlement", + "instructionHash": "0xd5ee7e3afb8ac427fe87d3f7acd285363550bff09ff9f617ecc303488b21be610", + "txHash": "0x1212121212121212121212121212121212121212121212121212121212121212", + "blockHash": "0x3434343434343434343434343434343434343434343434343434343434343434", + "chainId": 2800, + "from": "0xa", + "to": "0xb", + "amount": "100", + "asset": "AERE", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x19d9b1141c923ed4faf8304daffd5639e813c3b70248ffefc5b8a5e6373d26cf" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.integrity" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/settlement.valid.json b/conformance/vectori/envelope/settlement.valid.json new file mode 100644 index 0000000..118e6b3 --- /dev/null +++ b/conformance/vectori/envelope/settlement.valid.json @@ -0,0 +1,45 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/settlement.valid", + "artifact": "envelope", + "title": "the settlement envelope from its producer", + "source": "producer on fixed inputs", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": null, + "mutation": null, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-settlement-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-settlement", + "instructionHash": "0xd5ee7e3afb8ac427fe87d3f7acd285363550bff09ff9f617ecc303488b21be61", + "txHash": "0x1212121212121212121212121212121212121212121212121212121212121212", + "blockHash": "0x3434343434343434343434343434343434343434343434343434343434343434", + "chainId": 2800, + "from": "0xa", + "to": "0xb", + "amount": "100", + "asset": "AERE", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0x19d9b1141c923ed4faf8304daffd5639e813c3b70248ffefc5b8a5e6373d26cf" + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/signed-head.signature.json b/conformance/vectori/envelope/signed-head.signature.json new file mode 100644 index 0000000..d2938b5 --- /dev/null +++ b/conformance/vectori/envelope/signed-head.signature.json @@ -0,0 +1,56 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/signed-head.signature", + "artifact": "envelope", + "title": "the signature has one character changed", + "source": "derived from envelope/signed-head.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity", + "envelope.signature" + ], + "base": "envelope/signed-head.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "signature", + "signature" + ], + "value": "Am+Mh1v7TzZFyfloc+mLyaoZq3nJ4xuXNoaQzJBj0btuLyM9kLWWJlSXn00nIJYrfFBPAzFUnisSrKeM4ypAVsFAc9Y6jdvWCX2BV+JHiOt0jOo0nddWbpuvmAOYT8LIawJOL0MzWOuKfzqrD+kwsJYHnABTMRnZq21xz0Mi6+28FfL4+vXcQWjZqZ7k+R9xFCHamByD5f7aJltZZ2487A5KFLwpMloE9FExEOas2edGJ6LmiD0StSFHnvL8eVI/KxNoGHHEIJaPUte7sFNWDFr2IRoFI/hFW8rkFj+pdb3J11l/4AdJSINuKGXMWqa/NfvoEuN+K+smOuhqpzyEXg0EEmtg6dTJWRdMbN+TusrnLV0xFL+JT2cteA9FqvtMbajjcW9Cf+fQsHMr8N2kdnEz7R8dasJb+4ff0GniHL/7QzoS3DCqZWuc9I5VYrpCLLp5x6f9+ecdFcE3Vozk1zzTmWnhTQZZNABU4SgK6wBdD3/0UPEP49bZq9iWZNcyBKLC8RmNP0Hwos+4g5sOkejytLbQ3H+MQ00xEAIwgMKq4oZJaG71ZIpuXsrGQcU9U8vPLRxXxAZCHTzg+L24OWkegaCHcvPFvxpapp9+gf+iEalXlSKj1UsYj2XBGL0BwSBfoViqTGosWGcPoGTY/hfaDxnlxvDsmNGo7S3tLZ20FlXXPlFloYM7M0bBxf1UCrqCiaqTzv4xv1q9gRPK6joEkfwSQzTtP2NMrxj5cunpij2wY2VnLsHE/5fJ+F27Rifys+28D0GprKZb5mck5Y+n8CR0mb6eLmmRoP2pzyumlUPF0cvoMEEWzL3ehoc4OGKlLX9HW9+4KUAQ/1vKMSbnakAyqLXWR+0yU3koXFemQhJmP06CVdJtHw+iQ9Tce6zH6XaaKv6XXhv89Es/fIh+3uR6YPyqxVZG4P5CcgghLsttjvuGB8eqQR7d5GzJXjjP9YMp9vSrBgl1Eyvqf4cCV7FciJhVzX9BwaMiSX4MWvyoo0CxX+ZB3YaQbP5dz7IB4ZYjCRmZIYFMiY2aAGZN2GTzwRB9gVzxwGyyCHBJixGWKpC/kF1Mkn0GBWjSvYtqhGjN9y+ioIXQHGNPJb2wbQcieB/qsXa3h97KHZUMfUYeh8iiQWvza130HJCiH8D2VoDbXCDHY+EGQTk/rGYruyRQqaZXwd/dtnYYmsaIW9lB7BboF35WwoIFp40U6hquqianLTlo88Dx4qujG1LMPZUXNAdPt9hjXZyR0NbrtXsqBtHY/FG4mpR6psuZBW3LsEFIy3RNt55lFH5xRdn2it/5oVIYjZt+IKSbLE2Ytr8ffeo0DHqE2Lo2WvTBsov+AV8xZhRxGMFufBtt7IIH6t+tqMct/ksOu6AW3q36dl7HLdlD3MaMy64koIHVBfrxusTJ0qRprlPWYNWFAg28thIgA0m1qNIE/6zjRkLZvrFoKpRN4conyzfy6OOlFyLBp0E4Gli6oO0wWhW/xGwl3gi/CCFvm3KaFJRQcgoOvqAu8w0x6PAfu4BhzI2OeOUDGysmQ+jOypUw/mGQsMGTwd9VOtjdLN9vdhK+BXqn8XwPB5JKzdxhJrMwDErcyiJKPLI3vGDVHdG32OSj5tvlnjp+g5gMXJLnUoS9zgPUh+7qeLXHluLdSlFClXEa+Mg/sWpEY6clFQJ7gXA1R8aUuH5vZIhLUe1wwIYo0UwxmZaD9gz3nTbhq1iFk4TMUbLhfvaxGWHJzsx89IfmVohv2GUUIogzi/5ke+b/KJOdGZDLubBesSoWPigmoEy10r/Aj3jNty9E5DIHlsMQKL1af1T6QXrpWuRkDo48adUEFW0mcBQ9nLxKR0Ov8/CZ9FWxL+BZj8cNBgqjVa7E6FjsWYnb1gN0dtdTUzXR3r5S84KCzYVumC/Oy8x/bSsO/S2N9NABRfkzM0CY+aT+N+LNdmuMARdCG1EnIdW4U6CBy3Y79BqPmzZOmn1zFn4y2iqX3/iWqzS5J5A/W7uCX7aaAcfhKum4gjRtyQ5cToWETkUIVkbxg7AD0sEoH6HogdQwvLbBwTtaqXBTCTG63M9vskbzETp0HguOmcyvlAt23VM7Qcd8QIy9hqlQxhGgv0vVenitGkvVVvn/eL0E1cRg5UzMMJWOSPNXqH6AOg+K0he7w1YbMDdc+o6JKPkz0JesAJswDx5QF1tFvzBM8gfevDX0OkJe1zzSPR8D+OQOzlYWNlO1bHze1rKGHqJwghxj9PIaApWWAcPu2dDsjEkXJI2PNG08fxipBc1fdrA00LeXduC6pym8w6hhntnnuNqN5mFEgqWkICIlEyWc7F9wTkxU69iu1Mz9Lc6d33I5MnGMl989HOnAj8yaBifPldA6lpJz/YQCQTmLgh4Td36M2QtGJFSmAYG93fguy4YdJPV94E1qthtqOleDDpjMMq45k8UMAGAh4PaJF6uAM9niDSLJ6GFYoMzd7lGrWIoyyuwagtmL09lRRgn0Da/1dBQTW2kpbF7dJCPlyBELkyydET+SmAqwQvgJ7Q1gcUfQMpqGXJU2VJCRYh0qwmg2o33LBvkzSMmHwNF/bwmdjOL6ZohsPC4LdgqI/rtW0DTGSiZJIlKGjIE8lJCq2Pl5ZC5al0KX78vEGiCvD9c8Wb31JIehAMbIXzGc2VxM62gOeOeDmocyX+ByWI9RN7YijCWfk53iaQUTcWv6WofxE/FTdl0hyn0SxW/PyoAzQxaqNNBqVdjj6Bvz+IueTSmCUBBP8V+5V8GRo/NU5aly1mWlAITCCky/oiSeJy4YJlTbBLDCa94XQJYoBaZknEwnJpS239YRULM78kifGPwcpEzKcndUCyaKAlcKHLg9BhnATkNVxxybuRsHkHYefo/ddx2Mzpi886yFvGklHkN9+ZVojeuHBlYmco12GIkTYli0FFhb1oL5Zo/L6okUQ42kexy69ZwYbsxkbhtk4cH42EffOYs1nxI9rmpJ7HLyaoTmq7lZzYkcGMtmTOCLhS9DjHTryinA7DXs8Is1aDIHgFh2+xm1q+kVUV4MnjEanz8890ithVfnBAZNB6vF0SSaPMFaAV+Gk7cbFtI0JfNl9z9Kg6U8+Xj44vSKSriXV8At2J1bGD9jZ8gFyqYKsyKRWaJWktZMe7zLRv3R86B/Au0wFoozn4EJ7GV78dzPV/GL2NHpjOXsvztDwLPloU0s2Eq+lK8WXRNpR3rZJhglm/DSnaIYXi7i8ekvW89GHfxXHJn/BLxzRNgmDY8PUmNS9hJr2/O/YxeY2J5B4tbjWr5sltRJQlfMXJmDrPbGHmTbpZ8ms47IQh8C0enODotO02zCfcRSiImvy0kBiva8H3ttABPl32dMvX3WR8iEq7zvNF3rdVZb+ve8Sfjb63AsBN2curD2kTDqOCr8+RWRmjYc044xB9EinElZ3xz6OaA73ARwUWjsecoIOFu5mmJzP4rDs3uxKGy3op5Udeo0F/OOR8HREyUkuxDbEwQtSahWhXpK0z3D4d7ISDHbmpYZkNZpgzpBNkk5PsgUVs1E2h/P25DpvQn4IBiDLNn8J3tCyCOmRujlMT1GMJDlVFEq866IXVhCdldXtCvoKvZVLcKy8pH7p6sakboAt32N52Fw4XEmGDKJHnjkIN7Mtb2rqxOsAnCBqO1iNw0qyCwaHm1mw0BoktMDnB9y/y3xSe1avsLAJHKKMXwbeX6xlb/0DOVtOrURV5WA8OfSUmA+gkYd7VCKZo7dT3KzgKGiFoPUaKXIBMNkb7IXIgCNy/k1+A6IY8aR50nr/O9rWmCEG4/t9WXzRZ+0RyISGQkGYch7Pqgw/abatJ0oEIEZsKEPDuCu46rX5m31gg/SEx+E/gYm6o25wGdT97z7eNcb3skHbtLQOrasBbxxWf5QHoQnHzY8uTJeQ0G+5YqxmLFf5lT84mG7xe0CDCFUzAci+ZFx9CGoEbD8S9F8mqDjpUO4MEM4JyrPu049E3ln0gR7Z6MLVPd1Fti9zXhkUYo0VsWwwmsfFqWxbk8366oF1GYC8aqtipwhjSP785cPxIfFTaM6U2Iiv9ok+msPOtd0i6GpghV3wRXVMNAVHjRiqY9cLgD1J0mCZscd8wWdQOvzEGfU9hE/KbxAAWDF7+saN2SbjJ2cXdR8RkwSHQ1YQb1jSOx3lT8Bivrx4eA5wdGUOhSIxOtaEiWJE6KWkmaA//wAvI4NGMrFF6wVB8mCFlPHvTewCY92qqvMpWrvfgMkT5aWmXFqXnSPCxk30ntoApcWKSyqklKJ7y9TLDWVymgFIJyfdsIjARsgonIeXV9s+aYOJCfb5D+qu1dE8cA6YL8bNmR1pztJTpaazScwo/YIJ3+BgpfBID1ncnN6oq/jGS1CRWB+AAAAAAAAAAAAAAAAAAAAAAAABQsPFh8l" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-audit-tree-head-attestation", + "statement": { + "v": 1, + "kind": "aere-audit-tree-head", + "host": "conformance", + "treeSize": 3, + "rootHash": "0xfeabb16d0b795805345b053ff7b77d732ca566303b0dace87992b667674b1bd3", + "createdAt": "2026-10-03T09:33:28.671Z" + }, + "statementHash": "0xe661da6bb6f98b38d5b891debb4b72111b90852f133bed0f6dc22cb3f9ae6c41", + "signature": { + "scheme": "ml-dsa-65", + "publicKey": "MIIHsjALBglghkgBZQMEAxIDggehAM8ubg5GBFII4zSqVti0Uo374zVox8feLYz2qzTakYezQV5p3TncRk9q9Nkuq4ehGtllSP01d6/2cjf28JH4cx2dY73jD+98KNA6kZmUDZQrjjMvoWbxBhrUaMAQi6isdtA4Mm/CZPbQ+a9SDq7X5SSWrol1P1sBCPRI92fcRYUKGF+KJUKz3JVUPkf3t9Bp1psMaUQN2pFIj2AAfCiDHNdMxCwxuyorWjYrqn8BHL2CXcdM9jInFmLsQXOQZeaoldA11CK8rG6d7EHil5jT5zyCtrYwvy7FQJtZ547LSQ1R46WH/qjgOplmgHy9kQTvrVlgRUXnMHv2HpB2lQUgXp7ajFF9gK/5A+vMUgvpDXqLkQ1yffveFZimdGHzdoX29IsT4mHqQ3CNFgB1jr1DuSFUF2+F5KjTILJyL4S/fXIFwkvv+opqQ0BsAOep7QiX6oRtkGkM7OIoq9/8LGJ1lHckhOnRuSqwMpuRiK3vnHKUtkqJgZuRN/K8qY4Z1PLKpYjRrlO5SeBIfcPJfeSRswmhcp4UyG/1kyNiyUN+4kYt+0EQCocZLlslqow0wnWa5ZY0Bvbd8q8eZQmDXk7fg6W0op7tk+EMtnVgRx/AQ0B7hDtMhzzGSpJRg4feHwc5a4D1w19oH8o+HAfClJD9iIvsSInhkRAeSHvwvf6SjvqxEEzC2/oqd0sIDGVBDo5GJfBzf8ELwNdqWlSEG895w9mjOiun7IopEvq32WbLJmZ14IH7kog3p7gJs/ydGLaMPRniLIGyM/JDM9fhSLsod3uVDImk0tBnALGQa7Zmmjv3rCmUrY38G6aWlJUVdLI/cyKMlFbX7bzaFzu0u0MO1e2MXwsCS4QRIF0ZBz5EoIXDs59jUVW0jBIeev2rEQf5YmfcDjxPxr/bFHC7Qex7uPZgxbZGkEgjYOYXCi2gIt2ocNG/zImdhgcbOSqV2R9tTfDzKV4X/QPFZYV/y3naSBsqzi3C8lhHKbxV4bUI06R6ILE1nwn47kUJOciKS8YQajs81rhBMeF+IqJ3NZ72bvkIA8O1Fuu2d9jNL0nea2hU96viCLRLHKlJwBZTD55XGTqw6S2g7yqKbPkWGTwYUeN29kGEEwsPdelrKO7SuimWZEfkt+FrHcMTDx01q+BQIRef5i5+zT+/HRvVJ5WhNttjJn5SI5qfz83zaeE6//AQe+sZgyIyC76S2qxwWQVjm6QjZSw/tRdilnjQNSdXsy76tanOBWCIxUOc9aUqQ0lZIc69LbYwjy5yeopA4R84Pe8HJaxk6XnYKWyFDki8g3PTiYWu6I9pw8YZYkMM9FDBCpN1719Z2bHl+tKITiCMvcyExKM6cAgEcMPIHZsS656Q0JqdF0nggBLhm/dsCybYO0RSu22l8F6qrGiZv/CNb42KbOBzDxKrTdwFZiQXuFA7UoctjRkz/+gNPN0/CUYvgD0OqTDOXWlO03LfhENX9axJzD/AJIi4eKzeEMNUECZ+Sn8rJlE0PW0DBI2A2pNlgSPX7d4MdTn/TQlOqdmPDbwTsX+QU3UpmZ55IMI5POEukGAmtoXfhKHe/uJ/OkueGREFYY+qXMc+E6GM9ngDs6StqTtNU7H3U1C5VS24TJnFePH5qU+YR2ySyOCuT4mbijwFAXfbb68SOzh3vJVmpRk52XUsdzuqyhJq83pX+BgpOSah5pREvutHaZYSyf18Fcvl3n6y3OB3yqf33HOeCnQFPpnj8Vt40eYH0M7Hh9nk9J8tBhJm0+TUngAMfm1XZ9xIl3bXUlH+sZntNXh59pm/qohGO0f+nRdLPg8QtMxACt+ezXYw9pH+ipJE/cHbrcFWCi/KzQVBYJToLzCiIxnwjAOORYqW+dX9thGDNETuETPETBkci7CGz0ueWQVKcun751hz34GO6Gl1e1V7UikSjZSaZb0NPdNYAeQ2mSZSMvLo6e06Gmyy3wqeKnTq8q4YoTVsZO+qbhvhubKhh6suSyVR7p49iBud64qbwq1vf4Pp69qlS1Wabxp87G4dP9JPg9CdlZ/JT/y/7rqjmWkawaHf+asYQnN7hCc+zguHG0wNGfIwYo69TbEZ6ZWHwCWaqtlPfxkqvnF7l5mDuvU7Wid1K4te69oNuo9yyeHGquEV1WQDhvMTcyyKeIOz/izvDXb/5x5tVak7PNkohEf0Y+XZ1ElQsfOSemfHWriPRZ3z5nRA/hdvwLjwLllQU/Sf7IBQXOkZB9kaYqKmmXtA/B5s/PwqpMOs0vKO5LGJd0rtETvQ5/0ZgjdLZK0tZ9ct6LJpcgqjoQHlks1EOFeelSfPTSFv0xUHztscDhnBHvsgLBKVbjOG5cSV2pJMhqEJicrzLgJSLnZ+EiN1R6JkNIxsC/2wQKgPT6cFKvKJ60LPVKz/urMPpqkcVQ6hatUivEhNAnBw4syfuJNVe9WVHVWk5uxCKJK1ssVlNsEE9xMM53rfStG0f0BQ6et5mEAbBFkp+U3shvcMhOpzYLfDMD0AvlIG4G84MdM/eUIhU6ucA/Z7g2OSJ6aLSI84Iy8YQ6Ih6ikw/PHsqsOwTE6CC61me8E8qpEcmZNGCwS04gzLU5/MI0y6KFzW4lO6", + "signature": "Am+Mh1v7TzZFyfloc+mLyaoZq3nJ4xuXNoaQzJBj0btuLyM9kLWWJlSXn00nIJYrfFBPAzFUnisSrKeM4ypAVsFAc9Y6jdvWCX2BV+JHiOt0jOo0nddWbpuvmAOYT8LIawJOL0MzWOuKfzqrD+kwsJYHnABTMRnZq21xz0Mi6+28FfL4+vXcQWjZqZ7k+R9xFCHamByD5f7aJltZZ2487A5KFLwpMloE9FExEOas2edGJ6LmiD0StSFHnvL8eVI/KxNoGHHEIJaPUte7sFNWDFr2IRoFI/hFW8rkFj+pdb3J11l/4AdJSINuKGXMWqa/NfvoEuN+K+smOuhqpzyEXg0EEmtg6dTJWRdMbN+TusrnLV0xFL+JT2cteA9FqvtMbajjcW9Cf+fQsHMr8N2kdnEz7R8dasJb+4ff0GniHL/7QzoS3DCqZWuc9I5VYrpCLLp5x6f9+ecdFcE3Vozk1zzTmWnhTQZZNABU4SgK6wBdD3/0UPEP49bZq9iWZNcyBKLC8RmNP0Hwos+4g5sOkejytLbQ3H+MQ00xEAIwgMKq4oZJaG71ZIpuXsrGQcU9U8vPLRxXxAZCHTzg+L24OWkegaCHcvPFvxpapp9+gf+iEalXlSKj1UsYj2XBGL0BwSBfoViqTGosWGcPoGTY/hfaDxnlxvDsmNGo7S3tLZ20FlXXPlFloYM7M0bBxf1UCrqCiaqTzv4xv1q9gRPK6joEkfwSQzTtP2NMrxj5cunpij2wY2VnLsHE/5fJ+F27Rifys+28D0GprKZb5mck5Y+n8CR0mb6eLmmRoP2pzyumlUPF0cvoMEEWzL3ehoc4OGKlLX9HW9+4KUAQ/1vKMSbnakAyqLXWR+0yU3koXFemQhJmP06CVdJtHw+iQ9Tce6zH6XaaKv6XXhv89Es/fIh+3uR6YPyqxVZG4P5CcgghLsttjvuGB8eqQR7d5GzJXjjP9YMp9vSrBgl1Eyvqf4cCV7FciJhVzX9BwaMiSX4MWvyoo0CxX+ZB3YaQbP5dz7IB4ZYjCRmZIYFMiY2aAGZN2GTzwRB9gVzxwGyyCHBJixGWKpC/kF1Mkn0GBWjSvYtqhGjN9y+ioIXQHGNPJb2wbQcieB/qsXa3h97KHZUMfUYeh8iiQWvza130HJCiH8D2VoDbXCDHY+EGQTk/rGYruyRQqaZXwd/dtnYYmsaIW9lB7BboF35WwoIFp40U6hquqianLTlo88Dx4qujG1LMPZUXNAdPt9hjXZyR0NbrtXsqBtHY/FG4mpR6psuZBW3LsEFIy3RNt55lFH5xRdn2it/5oVIYjZt+IKSbLE2Ytr8ffeo0DHqE2Lo2WvTBsov+AV8xZhRxGMFufBtt7IIH6t+tqMct/ksOu6AW3q36dl7HLdlD3MaMy64koIHVBfrxusTJ0qRprlPWYNWFAg28thIgA0m1qNIE/6zjRkLZvrFoKpRN4conyzfy6OOlFyLBp0E4Gli6oO0wWhW/xGwl3gi/CCFvm3KaFJRQcgoOvqAu8w0x6PAfu4BhzI2OeOUDGysmQ+jOypUw/mGQsMGTwd9VOtjdLN9vdhK+BXqn8XwPB5JKzdxhJrMwDErcyiJKPLI3vGDVHdG32OSj5tvlnjp+g5gMXJLnUoS9zgPUh+7qeLXHluLdSlFClXEa+Mg/sWpEY6clFQJ7gXA1R8aUuH5vZIhLUe1wwIYo0UwxmZaD9gz3nTbhq1iFk4TMUbLhfvaxGWHJzsx89IfmVohv2GUUIogzi/5ke+b/KJOdGZDLubBesSoWPigmoEy10r/Aj3jNty9E5DIHlsMQKL1af1T6QXrpWuRkDo48adUEFW0mcBQ9nLxKR0Ov8/CZ9FWxL+BZj8cNBgqjVa7E6FjsWYnb1gN0dtdTUzXR3r5S84KCzYVumC/Oy8x/bSsO/S2N9NABRfkzM0CY+aT+N+LNdmuMARdCG1EnIdW4U6CBy3Y79BqPmzZOmn1zFn4y2iqX3/iWqzS5J5A/W7uCX7aaAcfhKum4gjRtyQ5cToWETkUIVkbxg7AD0sEoH6HogdQwvLbBwTtaqXBTCTG63M9vskbzETp0HguOmcyvlAt23VM7Qcd8QIy9hqlQxhGgv0vVenitGkvVVvn/eL0E1cRg5UzMMJWOSPNXqH6AOg+K0he7w1YbMDdc+o6JKPkz0JesAJswDx5QF1tFvzBM8gfevDX0OkJe1zzSPR8D+OQOzlYWNlO1bHze1rKGHqJwghxj9PIaApWWAcPu2dDsjEkXJI2PNG08fxipBc1fdrA00LeXduC6pym8w6hhntnnuNqN5mFEgqWkICIlEyWc7F9wTkxU69iu1Mz9Lc6d33I5MnGMl989HOnAj8yaBifPldA6lpJz/YQCQTmLgh4Td36M2QtGJFSmAYG93fguy4YdJPV94E1qthtqOleDDpjMMq45k8UMAGAh4PaJF6uAM9niDSLJ6GFYoMzd7lGrWIoyyuwagtmL09lRRgn0Da/1dBQTW2kpbF7dJCPlyBELkyydET+SmAqwQvgJ7Q1gcUfQMpqGXJU2VJCRYh0qwmg2o33LBvkzSMmHwNF/bwmdjOL6ZohsPC4LdgqI/rtW0DTGSiZJIlKGjIE8lJCq2Pl5ZC5al0KX78vEGiCvD9c8Wb31JIehAMbIXzGc2VxM62gOeOeDmocyX+ByWI9RN7YijCWfk53iaQUTcWv6WofxE/FTdl0hyn0SxW/PyoAzQxaqNNBqVdjj6Bvz+IueTSmCUBBP8V+5V8GRo/NU5aly1mWlAITCCky/oiSeJy4YJlTbBLDCa94XQJYoBaZknEwnJpS239YRULM78kifGPwcpEzKcndUCyaKAlcKHLg9BhnATkNVxxybuRsHkHYefo/ddx2Mzpi886yFvGklHkN9+ZVojeuHBlYmco12GIkTYli0FFhb1oL5Zo/L6okUQ42kexy69ZwYbsxkbhtk4cH42EffOYs1nxI9rmpJ7HLyaoTmq7lZzYkcGMtmTOCLhS9DjHTryinA7DXs8Is1aDIHgFh2+xm1q+kVUV4MnjEanz8890ithVfnBAZNB6vF0SSaPMFaAV+Gk7cbFtI0JfNl9z9Kg6U8+Xj44vSKSriXV8At2J1bGD9jZ8gFyqYKsyKRWaJWktZMe7zLRv3R86B/Au0wFoozn4EJ7GV78dzPV/GL2NHpjOXsvztDwLPloU0s2Eq+lK8WXRNpR3rZJhglm/DSnaIYXi7i8ekvW89GHfxXHJn/BLxzRNgmDY8PUmNS9hJr2/O/YxeY2J5B4tbjWr5sltRJQlfMXJmDrPbGHmTbpZ8ms47IQh8C0enODotO02zCfcRSiImvy0kBiva8H3ttABPl32dMvX3WR8iEq7zvNF3rdVZb+ve8Sfjb63AsBN2curD2kTDqOCr8+RWRmjYc044xB9EinElZ3xz6OaA73ARwUWjsecoIOFu5mmJzP4rDs3uxKGy3op5Udeo0F/OOR8HREyUkuxDbEwQtSahWhXpK0z3D4d7ISDHbmpYZkNZpgzpBNkk5PsgUVs1E2h/P25DpvQn4IBiDLNn8J3tCyCOmRujlMT1GMJDlVFEq866IXVhCdldXtCvoKvZVLcKy8pH7p6sakboAt32N52Fw4XEmGDKJHnjkIN7Mtb2rqxOsAnCBqO1iNw0qyCwaHm1mw0BoktMDnB9y/y3xSe1avsLAJHKKMXwbeX6xlb/0DOVtOrURV5WA8OfSUmA+gkYd7VCKZo7dT3KzgKGiFoPUaKXIBMNkb7IXIgCNy/k1+A6IY8aR50nr/O9rWmCEG4/t9WXzRZ+0RyISGQkGYch7Pqgw/abatJ0oEIEZsKEPDuCu46rX5m31gg/SEx+E/gYm6o25wGdT97z7eNcb3skHbtLQOrasBbxxWf5QHoQnHzY8uTJeQ0G+5YqxmLFf5lT84mG7xe0CDCFUzAci+ZFx9CGoEbD8S9F8mqDjpUO4MEM4JyrPu049E3ln0gR7Z6MLVPd1Fti9zXhkUYo0VsWwwmsfFqWxbk8366oF1GYC8aqtipwhjSP785cPxIfFTaM6U2Iiv9ok+msPOtd0i6GpghV3wRXVMNAVHjRiqY9cLgD1J0mCZscd8wWdQOvzEGfU9hE/KbxAAWDF7+saN2SbjJ2cXdR8RkwSHQ1YQb1jSOx3lT8Bivrx4eA5wdGUOhSIxOtaEiWJE6KWkmaA//wAvI4NGMrFF6wVB8mCFlPHvTewCY92qqvMpWrvfgMkT5aWmXFqXnSPCxk30ntoApcWKSyqklKJ7y9TLDWVymgFIJyfdsIjARsgonIeXV9s+aYOJCfb5D+qu1dE8cA6YL8bNmR1pztJTpaazScwo/YIJ3+BgpfBID1ncnN6oq/jGS1CRWB+AAAAAAAAAAAAAAAAAAAAAAAABQsPFh8l" + } + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.signature" + ], + "levels": { + "integrity": "PASSED", + "authenticity": "FAILED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/signed-head.valid.json b/conformance/vectori/envelope/signed-head.valid.json new file mode 100644 index 0000000..04e94f7 --- /dev/null +++ b/conformance/vectori/envelope/signed-head.valid.json @@ -0,0 +1,46 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/signed-head.valid", + "artifact": "envelope", + "title": "a tree head signed with ML-DSA-65", + "source": "producer (verify-layer tree head), key made and discarded at generation", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity", + "envelope.signature" + ], + "base": null, + "mutation": null, + "input": { + "envelope": { + "v": 1, + "kind": "aere-audit-tree-head-attestation", + "statement": { + "v": 1, + "kind": "aere-audit-tree-head", + "host": "conformance", + "treeSize": 3, + "rootHash": "0xfeabb16d0b795805345b053ff7b77d732ca566303b0dace87992b667674b1bd3", + "createdAt": "2026-10-03T09:33:28.671Z" + }, + "statementHash": "0xe661da6bb6f98b38d5b891debb4b72111b90852f133bed0f6dc22cb3f9ae6c41", + "signature": { + "scheme": "ml-dsa-65", + "publicKey": "MIIHsjALBglghkgBZQMEAxIDggehAM8ubg5GBFII4zSqVti0Uo374zVox8feLYz2qzTakYezQV5p3TncRk9q9Nkuq4ehGtllSP01d6/2cjf28JH4cx2dY73jD+98KNA6kZmUDZQrjjMvoWbxBhrUaMAQi6isdtA4Mm/CZPbQ+a9SDq7X5SSWrol1P1sBCPRI92fcRYUKGF+KJUKz3JVUPkf3t9Bp1psMaUQN2pFIj2AAfCiDHNdMxCwxuyorWjYrqn8BHL2CXcdM9jInFmLsQXOQZeaoldA11CK8rG6d7EHil5jT5zyCtrYwvy7FQJtZ547LSQ1R46WH/qjgOplmgHy9kQTvrVlgRUXnMHv2HpB2lQUgXp7ajFF9gK/5A+vMUgvpDXqLkQ1yffveFZimdGHzdoX29IsT4mHqQ3CNFgB1jr1DuSFUF2+F5KjTILJyL4S/fXIFwkvv+opqQ0BsAOep7QiX6oRtkGkM7OIoq9/8LGJ1lHckhOnRuSqwMpuRiK3vnHKUtkqJgZuRN/K8qY4Z1PLKpYjRrlO5SeBIfcPJfeSRswmhcp4UyG/1kyNiyUN+4kYt+0EQCocZLlslqow0wnWa5ZY0Bvbd8q8eZQmDXk7fg6W0op7tk+EMtnVgRx/AQ0B7hDtMhzzGSpJRg4feHwc5a4D1w19oH8o+HAfClJD9iIvsSInhkRAeSHvwvf6SjvqxEEzC2/oqd0sIDGVBDo5GJfBzf8ELwNdqWlSEG895w9mjOiun7IopEvq32WbLJmZ14IH7kog3p7gJs/ydGLaMPRniLIGyM/JDM9fhSLsod3uVDImk0tBnALGQa7Zmmjv3rCmUrY38G6aWlJUVdLI/cyKMlFbX7bzaFzu0u0MO1e2MXwsCS4QRIF0ZBz5EoIXDs59jUVW0jBIeev2rEQf5YmfcDjxPxr/bFHC7Qex7uPZgxbZGkEgjYOYXCi2gIt2ocNG/zImdhgcbOSqV2R9tTfDzKV4X/QPFZYV/y3naSBsqzi3C8lhHKbxV4bUI06R6ILE1nwn47kUJOciKS8YQajs81rhBMeF+IqJ3NZ72bvkIA8O1Fuu2d9jNL0nea2hU96viCLRLHKlJwBZTD55XGTqw6S2g7yqKbPkWGTwYUeN29kGEEwsPdelrKO7SuimWZEfkt+FrHcMTDx01q+BQIRef5i5+zT+/HRvVJ5WhNttjJn5SI5qfz83zaeE6//AQe+sZgyIyC76S2qxwWQVjm6QjZSw/tRdilnjQNSdXsy76tanOBWCIxUOc9aUqQ0lZIc69LbYwjy5yeopA4R84Pe8HJaxk6XnYKWyFDki8g3PTiYWu6I9pw8YZYkMM9FDBCpN1719Z2bHl+tKITiCMvcyExKM6cAgEcMPIHZsS656Q0JqdF0nggBLhm/dsCybYO0RSu22l8F6qrGiZv/CNb42KbOBzDxKrTdwFZiQXuFA7UoctjRkz/+gNPN0/CUYvgD0OqTDOXWlO03LfhENX9axJzD/AJIi4eKzeEMNUECZ+Sn8rJlE0PW0DBI2A2pNlgSPX7d4MdTn/TQlOqdmPDbwTsX+QU3UpmZ55IMI5POEukGAmtoXfhKHe/uJ/OkueGREFYY+qXMc+E6GM9ngDs6StqTtNU7H3U1C5VS24TJnFePH5qU+YR2ySyOCuT4mbijwFAXfbb68SOzh3vJVmpRk52XUsdzuqyhJq83pX+BgpOSah5pREvutHaZYSyf18Fcvl3n6y3OB3yqf33HOeCnQFPpnj8Vt40eYH0M7Hh9nk9J8tBhJm0+TUngAMfm1XZ9xIl3bXUlH+sZntNXh59pm/qohGO0f+nRdLPg8QtMxACt+ezXYw9pH+ipJE/cHbrcFWCi/KzQVBYJToLzCiIxnwjAOORYqW+dX9thGDNETuETPETBkci7CGz0ueWQVKcun751hz34GO6Gl1e1V7UikSjZSaZb0NPdNYAeQ2mSZSMvLo6e06Gmyy3wqeKnTq8q4YoTVsZO+qbhvhubKhh6suSyVR7p49iBud64qbwq1vf4Pp69qlS1Wabxp87G4dP9JPg9CdlZ/JT/y/7rqjmWkawaHf+asYQnN7hCc+zguHG0wNGfIwYo69TbEZ6ZWHwCWaqtlPfxkqvnF7l5mDuvU7Wid1K4te69oNuo9yyeHGquEV1WQDhvMTcyyKeIOz/izvDXb/5x5tVak7PNkohEf0Y+XZ1ElQsfOSemfHWriPRZ3z5nRA/hdvwLjwLllQU/Sf7IBQXOkZB9kaYqKmmXtA/B5s/PwqpMOs0vKO5LGJd0rtETvQ5/0ZgjdLZK0tZ9ct6LJpcgqjoQHlks1EOFeelSfPTSFv0xUHztscDhnBHvsgLBKVbjOG5cSV2pJMhqEJicrzLgJSLnZ+EiN1R6JkNIxsC/2wQKgPT6cFKvKJ60LPVKz/urMPpqkcVQ6hatUivEhNAnBw4syfuJNVe9WVHVWk5uxCKJK1ssVlNsEE9xMM53rfStG0f0BQ6et5mEAbBFkp+U3shvcMhOpzYLfDMD0AvlIG4G84MdM/eUIhU6ucA/Z7g2OSJ6aLSI84Iy8YQ6Ih6ikw/PHsqsOwTE6CC61me8E8qpEcmZNGCwS04gzLU5/MI0y6KFzW4lO6", + "signature": "pm+Mh1v7TzZFyfloc+mLyaoZq3nJ4xuXNoaQzJBj0btuLyM9kLWWJlSXn00nIJYrfFBPAzFUnisSrKeM4ypAVsFAc9Y6jdvWCX2BV+JHiOt0jOo0nddWbpuvmAOYT8LIawJOL0MzWOuKfzqrD+kwsJYHnABTMRnZq21xz0Mi6+28FfL4+vXcQWjZqZ7k+R9xFCHamByD5f7aJltZZ2487A5KFLwpMloE9FExEOas2edGJ6LmiD0StSFHnvL8eVI/KxNoGHHEIJaPUte7sFNWDFr2IRoFI/hFW8rkFj+pdb3J11l/4AdJSINuKGXMWqa/NfvoEuN+K+smOuhqpzyEXg0EEmtg6dTJWRdMbN+TusrnLV0xFL+JT2cteA9FqvtMbajjcW9Cf+fQsHMr8N2kdnEz7R8dasJb+4ff0GniHL/7QzoS3DCqZWuc9I5VYrpCLLp5x6f9+ecdFcE3Vozk1zzTmWnhTQZZNABU4SgK6wBdD3/0UPEP49bZq9iWZNcyBKLC8RmNP0Hwos+4g5sOkejytLbQ3H+MQ00xEAIwgMKq4oZJaG71ZIpuXsrGQcU9U8vPLRxXxAZCHTzg+L24OWkegaCHcvPFvxpapp9+gf+iEalXlSKj1UsYj2XBGL0BwSBfoViqTGosWGcPoGTY/hfaDxnlxvDsmNGo7S3tLZ20FlXXPlFloYM7M0bBxf1UCrqCiaqTzv4xv1q9gRPK6joEkfwSQzTtP2NMrxj5cunpij2wY2VnLsHE/5fJ+F27Rifys+28D0GprKZb5mck5Y+n8CR0mb6eLmmRoP2pzyumlUPF0cvoMEEWzL3ehoc4OGKlLX9HW9+4KUAQ/1vKMSbnakAyqLXWR+0yU3koXFemQhJmP06CVdJtHw+iQ9Tce6zH6XaaKv6XXhv89Es/fIh+3uR6YPyqxVZG4P5CcgghLsttjvuGB8eqQR7d5GzJXjjP9YMp9vSrBgl1Eyvqf4cCV7FciJhVzX9BwaMiSX4MWvyoo0CxX+ZB3YaQbP5dz7IB4ZYjCRmZIYFMiY2aAGZN2GTzwRB9gVzxwGyyCHBJixGWKpC/kF1Mkn0GBWjSvYtqhGjN9y+ioIXQHGNPJb2wbQcieB/qsXa3h97KHZUMfUYeh8iiQWvza130HJCiH8D2VoDbXCDHY+EGQTk/rGYruyRQqaZXwd/dtnYYmsaIW9lB7BboF35WwoIFp40U6hquqianLTlo88Dx4qujG1LMPZUXNAdPt9hjXZyR0NbrtXsqBtHY/FG4mpR6psuZBW3LsEFIy3RNt55lFH5xRdn2it/5oVIYjZt+IKSbLE2Ytr8ffeo0DHqE2Lo2WvTBsov+AV8xZhRxGMFufBtt7IIH6t+tqMct/ksOu6AW3q36dl7HLdlD3MaMy64koIHVBfrxusTJ0qRprlPWYNWFAg28thIgA0m1qNIE/6zjRkLZvrFoKpRN4conyzfy6OOlFyLBp0E4Gli6oO0wWhW/xGwl3gi/CCFvm3KaFJRQcgoOvqAu8w0x6PAfu4BhzI2OeOUDGysmQ+jOypUw/mGQsMGTwd9VOtjdLN9vdhK+BXqn8XwPB5JKzdxhJrMwDErcyiJKPLI3vGDVHdG32OSj5tvlnjp+g5gMXJLnUoS9zgPUh+7qeLXHluLdSlFClXEa+Mg/sWpEY6clFQJ7gXA1R8aUuH5vZIhLUe1wwIYo0UwxmZaD9gz3nTbhq1iFk4TMUbLhfvaxGWHJzsx89IfmVohv2GUUIogzi/5ke+b/KJOdGZDLubBesSoWPigmoEy10r/Aj3jNty9E5DIHlsMQKL1af1T6QXrpWuRkDo48adUEFW0mcBQ9nLxKR0Ov8/CZ9FWxL+BZj8cNBgqjVa7E6FjsWYnb1gN0dtdTUzXR3r5S84KCzYVumC/Oy8x/bSsO/S2N9NABRfkzM0CY+aT+N+LNdmuMARdCG1EnIdW4U6CBy3Y79BqPmzZOmn1zFn4y2iqX3/iWqzS5J5A/W7uCX7aaAcfhKum4gjRtyQ5cToWETkUIVkbxg7AD0sEoH6HogdQwvLbBwTtaqXBTCTG63M9vskbzETp0HguOmcyvlAt23VM7Qcd8QIy9hqlQxhGgv0vVenitGkvVVvn/eL0E1cRg5UzMMJWOSPNXqH6AOg+K0he7w1YbMDdc+o6JKPkz0JesAJswDx5QF1tFvzBM8gfevDX0OkJe1zzSPR8D+OQOzlYWNlO1bHze1rKGHqJwghxj9PIaApWWAcPu2dDsjEkXJI2PNG08fxipBc1fdrA00LeXduC6pym8w6hhntnnuNqN5mFEgqWkICIlEyWc7F9wTkxU69iu1Mz9Lc6d33I5MnGMl989HOnAj8yaBifPldA6lpJz/YQCQTmLgh4Td36M2QtGJFSmAYG93fguy4YdJPV94E1qthtqOleDDpjMMq45k8UMAGAh4PaJF6uAM9niDSLJ6GFYoMzd7lGrWIoyyuwagtmL09lRRgn0Da/1dBQTW2kpbF7dJCPlyBELkyydET+SmAqwQvgJ7Q1gcUfQMpqGXJU2VJCRYh0qwmg2o33LBvkzSMmHwNF/bwmdjOL6ZohsPC4LdgqI/rtW0DTGSiZJIlKGjIE8lJCq2Pl5ZC5al0KX78vEGiCvD9c8Wb31JIehAMbIXzGc2VxM62gOeOeDmocyX+ByWI9RN7YijCWfk53iaQUTcWv6WofxE/FTdl0hyn0SxW/PyoAzQxaqNNBqVdjj6Bvz+IueTSmCUBBP8V+5V8GRo/NU5aly1mWlAITCCky/oiSeJy4YJlTbBLDCa94XQJYoBaZknEwnJpS239YRULM78kifGPwcpEzKcndUCyaKAlcKHLg9BhnATkNVxxybuRsHkHYefo/ddx2Mzpi886yFvGklHkN9+ZVojeuHBlYmco12GIkTYli0FFhb1oL5Zo/L6okUQ42kexy69ZwYbsxkbhtk4cH42EffOYs1nxI9rmpJ7HLyaoTmq7lZzYkcGMtmTOCLhS9DjHTryinA7DXs8Is1aDIHgFh2+xm1q+kVUV4MnjEanz8890ithVfnBAZNB6vF0SSaPMFaAV+Gk7cbFtI0JfNl9z9Kg6U8+Xj44vSKSriXV8At2J1bGD9jZ8gFyqYKsyKRWaJWktZMe7zLRv3R86B/Au0wFoozn4EJ7GV78dzPV/GL2NHpjOXsvztDwLPloU0s2Eq+lK8WXRNpR3rZJhglm/DSnaIYXi7i8ekvW89GHfxXHJn/BLxzRNgmDY8PUmNS9hJr2/O/YxeY2J5B4tbjWr5sltRJQlfMXJmDrPbGHmTbpZ8ms47IQh8C0enODotO02zCfcRSiImvy0kBiva8H3ttABPl32dMvX3WR8iEq7zvNF3rdVZb+ve8Sfjb63AsBN2curD2kTDqOCr8+RWRmjYc044xB9EinElZ3xz6OaA73ARwUWjsecoIOFu5mmJzP4rDs3uxKGy3op5Udeo0F/OOR8HREyUkuxDbEwQtSahWhXpK0z3D4d7ISDHbmpYZkNZpgzpBNkk5PsgUVs1E2h/P25DpvQn4IBiDLNn8J3tCyCOmRujlMT1GMJDlVFEq866IXVhCdldXtCvoKvZVLcKy8pH7p6sakboAt32N52Fw4XEmGDKJHnjkIN7Mtb2rqxOsAnCBqO1iNw0qyCwaHm1mw0BoktMDnB9y/y3xSe1avsLAJHKKMXwbeX6xlb/0DOVtOrURV5WA8OfSUmA+gkYd7VCKZo7dT3KzgKGiFoPUaKXIBMNkb7IXIgCNy/k1+A6IY8aR50nr/O9rWmCEG4/t9WXzRZ+0RyISGQkGYch7Pqgw/abatJ0oEIEZsKEPDuCu46rX5m31gg/SEx+E/gYm6o25wGdT97z7eNcb3skHbtLQOrasBbxxWf5QHoQnHzY8uTJeQ0G+5YqxmLFf5lT84mG7xe0CDCFUzAci+ZFx9CGoEbD8S9F8mqDjpUO4MEM4JyrPu049E3ln0gR7Z6MLVPd1Fti9zXhkUYo0VsWwwmsfFqWxbk8366oF1GYC8aqtipwhjSP785cPxIfFTaM6U2Iiv9ok+msPOtd0i6GpghV3wRXVMNAVHjRiqY9cLgD1J0mCZscd8wWdQOvzEGfU9hE/KbxAAWDF7+saN2SbjJ2cXdR8RkwSHQ1YQb1jSOx3lT8Bivrx4eA5wdGUOhSIxOtaEiWJE6KWkmaA//wAvI4NGMrFF6wVB8mCFlPHvTewCY92qqvMpWrvfgMkT5aWmXFqXnSPCxk30ntoApcWKSyqklKJ7y9TLDWVymgFIJyfdsIjARsgonIeXV9s+aYOJCfb5D+qu1dE8cA6YL8bNmR1pztJTpaazScwo/YIJ3+BgpfBID1ncnN6oq/jGS1CRWB+AAAAAAAAAAAAAAAAAAAAAAAABQsPFh8l" + } + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "PASSED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/time.form.json b/conformance/vectori/envelope/time.form.json new file mode 100644 index 0000000..800f5d1 --- /dev/null +++ b/conformance/vectori/envelope/time.form.json @@ -0,0 +1,49 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/time.form", + "artifact": "envelope", + "title": "time: the statementHash is 63 hex digits", + "source": "derived from envelope/time.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/time.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statementHash" + ], + "value": "0xbd803c1eae1875ac755df34e94e9cb20e30c12fe3c02b0c7c4cfe677040ecd3" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-time-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-time", + "subjectHash": "0xe12e3d24bc08d052711daa489e746297af597599f2726d945c1d6309427b9394", + "source": "aere-anchor", + "at": "2026-09-26T00:00:00Z", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0xbd803c1eae1875ac755df34e94e9cb20e30c12fe3c02b0c7c4cfe677040ecd3" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.form" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/time.integrity.json b/conformance/vectori/envelope/time.integrity.json new file mode 100644 index 0000000..bbdc12a --- /dev/null +++ b/conformance/vectori/envelope/time.integrity.json @@ -0,0 +1,50 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/time.integrity", + "artifact": "envelope", + "title": "time: statement.subjectHash changed after hashing", + "source": "derived from envelope/time.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": "envelope/time.valid", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statement", + "subjectHash" + ], + "value": "0xe12e3d24bc08d052711daa489e746297af597599f2726d945c1d6309427b93940" + }, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-time-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-time", + "subjectHash": "0xe12e3d24bc08d052711daa489e746297af597599f2726d945c1d6309427b93940", + "source": "aere-anchor", + "at": "2026-09-26T00:00:00Z", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0xbd803c1eae1875ac755df34e94e9cb20e30c12fe3c02b0c7c4cfe677040ecd31" + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.integrity" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/envelope/time.valid.json b/conformance/vectori/envelope/time.valid.json new file mode 100644 index 0000000..99b8590 --- /dev/null +++ b/conformance/vectori/envelope/time.valid.json @@ -0,0 +1,40 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "envelope/time.valid", + "artifact": "envelope", + "title": "the time envelope from its producer", + "source": "producer on fixed inputs", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity" + ], + "base": null, + "mutation": null, + "input": { + "envelope": { + "v": 1, + "kind": "aere-proof-of-time-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-time", + "subjectHash": "0xe12e3d24bc08d052711daa489e746297af597599f2726d945c1d6309427b9394", + "source": "aere-anchor", + "at": "2026-09-26T00:00:00Z", + "createdAt": "2026-09-26T00:00:00Z" + }, + "statementHash": "0xbd803c1eae1875ac755df34e94e9cb20e30c12fe3c02b0c7c4cfe677040ecd31" + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s1-paid-28001.valid.json b/conformance/vectori/market-timeline/s1-paid-28001.valid.json new file mode 100644 index 0000000..8df3b47 --- /dev/null +++ b/conformance/vectori/market-timeline/s1-paid-28001.valid.json @@ -0,0 +1,156 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s1-paid-28001.valid", + "artifact": "market-timeline", + "title": "the same timeline judged with the chain: the execution envelope is under a verified post-quantum anchor", + "source": "recorded (market-settlement, 2026-10-02), scenario S1", + "requires": [ + "rpc-28001" + ], + "exercises": [ + "envelope.finality", + "envelope.form", + "envelope.integrity", + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": null, + "mutation": null, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "5", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0xf2a0d3e03521234fd6be921e346817e6f77e20db038ff5325318a2a5a47cfd25", + "resultHash": "0xeba5b6ff363f15d358926ab16bc4c7c8c979ec2d217868134810488304dde0be", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 5, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790960218, + "challengeWindow": 90, + "submittedAt": 1790959639, + "disputedAt": 0 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "5", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0xf2a0d3e03521234fd6be921e346817e6f77e20db038ff5325318a2a5a47cfd25", + "deadline": "1790960218", + "pqcSettlement": false + }, + "blockNumber": 4446103, + "blockHash": "0xfc22d0155293bef0b5349507a2a45495de7d3baa37b1f9e5e482585d93ecdc3e", + "timestamp": 1790959620, + "txHash": "0x5178c7b523d9ad5516f5e649f50bc98c44aacd6c4564403ac6b7528a9e63791e", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobClaimed", + "args": { + "id": "5", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "providerBond": "4000000000000000" + }, + "blockNumber": 4446113, + "blockHash": "0xd59b44a60e225a952c0ef940a62f6ebe7325dc4d75627161c329aa6f48bc9ce4", + "timestamp": 1790959626, + "txHash": "0xf46a947200113d014c3e8b0282267feb2882f0d8895ae4b13a72f1db20fa7ee3", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "ResultSubmitted", + "args": { + "id": "5", + "resultHash": "0xeba5b6ff363f15d358926ab16bc4c7c8c979ec2d217868134810488304dde0be", + "result": "0x7b22646967657374223a22307864346139306165303264396364623232353863373239633532636166613662613263623164306539323532326135313739313733383362366535386131323535222c226974657273223a32303030302c2273656564223a22307862666366386461653665366631303562346537656164383938613466646230333139373435646562336433383034326533383135643735383035653130363064222c227461736b223a226b656363616b2d636861696e227d" + }, + "blockNumber": 4446136, + "blockHash": "0x7cedaf1f5da474b94c41fd0925f181459ff642fa449843886d94226daaf2650f", + "timestamp": 1790959639, + "txHash": "0xea128ff1992e39f6690ebfbfbd9896ff27bcea0db4b0070c32062d2de599d446", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "JobPaid", + "args": { + "id": "5", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "bondReturned": "4000000000000000" + }, + "blockNumber": 4446295, + "blockHash": "0x736c818d1833f0c88ccda5ec5101d392fd842af32a6b152018a085c7a75a7c5c", + "timestamp": 1790959733, + "txHash": "0x5e4bfedda879e4e016b7f4434f75da4a8af63ccc4cce285d714b9e56e453e65f", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 0 + } + ], + "result": "0x7b22646967657374223a22307864346139306165303264396364623232353863373239633532636166613662613263623164306539323532326135313739313733383362366535386131323535222c226974657273223a32303030302c2273656564223a22307862666366386461653665366631303562346537656164383938613466646230333139373435646562336433383034326533383135643735383035653130363064222c227461736b223a226b656363616b2d636861696e227d", + "envelope": { + "v": 1, + "kind": "aere-proof-of-execution-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-execution", + "inputHash": "0xf2a0d3e03521234fd6be921e346817e6f77e20db038ff5325318a2a5a47cfd25", + "outputHash": "0xeba5b6ff363f15d358926ab16bc4c7c8c979ec2d217868134810488304dde0be", + "programSha256": "0x1824b9e133c368fab195cb2f33e35bee78abdb4de7b03f0c377ac5af951eb9e0", + "program": "keccak-chain", + "exitCode": 0, + "createdAt": "2026-10-02T16:47:11.789Z" + }, + "statementHash": "0xfffa43d50b6222a17f915d528f0f636b16882f736f357b8418d30dfec2f88200", + "notarization": { + "chainId": 28001, + "notary": "0x70099E62735500AA2F85B60C518551a57B202d54", + "firstSeen": 1790959633, + "txHash": "0x86f094ae0ba1030b97060792344eda1b6018367dbf14088c6c2de1e5a4e2fc6e", + "block": 4446125 + } + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "PASSED", + "finality": "PASSED" + } + } +} diff --git a/conformance/vectori/market-timeline/s1-paid-claim.partial.json b/conformance/vectori/market-timeline/s1-paid-claim.partial.json new file mode 100644 index 0000000..ff0cf14 --- /dev/null +++ b/conformance/vectori/market-timeline/s1-paid-claim.partial.json @@ -0,0 +1,153 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s1-paid-claim.partial", + "artifact": "market-timeline", + "title": "accepted and paid; its execution envelope claims a notarization that an offline run does not check", + "source": "recorded (market-settlement, 2026-10-02), scenario S1", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity", + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": null, + "mutation": null, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "5", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0xf2a0d3e03521234fd6be921e346817e6f77e20db038ff5325318a2a5a47cfd25", + "resultHash": "0xeba5b6ff363f15d358926ab16bc4c7c8c979ec2d217868134810488304dde0be", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 5, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790960218, + "challengeWindow": 90, + "submittedAt": 1790959639, + "disputedAt": 0 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "5", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0xf2a0d3e03521234fd6be921e346817e6f77e20db038ff5325318a2a5a47cfd25", + "deadline": "1790960218", + "pqcSettlement": false + }, + "blockNumber": 4446103, + "blockHash": "0xfc22d0155293bef0b5349507a2a45495de7d3baa37b1f9e5e482585d93ecdc3e", + "timestamp": 1790959620, + "txHash": "0x5178c7b523d9ad5516f5e649f50bc98c44aacd6c4564403ac6b7528a9e63791e", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobClaimed", + "args": { + "id": "5", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "providerBond": "4000000000000000" + }, + "blockNumber": 4446113, + "blockHash": "0xd59b44a60e225a952c0ef940a62f6ebe7325dc4d75627161c329aa6f48bc9ce4", + "timestamp": 1790959626, + "txHash": "0xf46a947200113d014c3e8b0282267feb2882f0d8895ae4b13a72f1db20fa7ee3", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "ResultSubmitted", + "args": { + "id": "5", + "resultHash": "0xeba5b6ff363f15d358926ab16bc4c7c8c979ec2d217868134810488304dde0be", + "result": "0x7b22646967657374223a22307864346139306165303264396364623232353863373239633532636166613662613263623164306539323532326135313739313733383362366535386131323535222c226974657273223a32303030302c2273656564223a22307862666366386461653665366631303562346537656164383938613466646230333139373435646562336433383034326533383135643735383035653130363064222c227461736b223a226b656363616b2d636861696e227d" + }, + "blockNumber": 4446136, + "blockHash": "0x7cedaf1f5da474b94c41fd0925f181459ff642fa449843886d94226daaf2650f", + "timestamp": 1790959639, + "txHash": "0xea128ff1992e39f6690ebfbfbd9896ff27bcea0db4b0070c32062d2de599d446", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "JobPaid", + "args": { + "id": "5", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "bondReturned": "4000000000000000" + }, + "blockNumber": 4446295, + "blockHash": "0x736c818d1833f0c88ccda5ec5101d392fd842af32a6b152018a085c7a75a7c5c", + "timestamp": 1790959733, + "txHash": "0x5e4bfedda879e4e016b7f4434f75da4a8af63ccc4cce285d714b9e56e453e65f", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 0 + } + ], + "result": "0x7b22646967657374223a22307864346139306165303264396364623232353863373239633532636166613662613263623164306539323532326135313739313733383362366535386131323535222c226974657273223a32303030302c2273656564223a22307862666366386461653665366631303562346537656164383938613466646230333139373435646562336433383034326533383135643735383035653130363064222c227461736b223a226b656363616b2d636861696e227d", + "envelope": { + "v": 1, + "kind": "aere-proof-of-execution-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-execution", + "inputHash": "0xf2a0d3e03521234fd6be921e346817e6f77e20db038ff5325318a2a5a47cfd25", + "outputHash": "0xeba5b6ff363f15d358926ab16bc4c7c8c979ec2d217868134810488304dde0be", + "programSha256": "0x1824b9e133c368fab195cb2f33e35bee78abdb4de7b03f0c377ac5af951eb9e0", + "program": "keccak-chain", + "exitCode": 0, + "createdAt": "2026-10-02T16:47:11.789Z" + }, + "statementHash": "0xfffa43d50b6222a17f915d528f0f636b16882f736f357b8418d30dfec2f88200", + "notarization": { + "chainId": 28001, + "notary": "0x70099E62735500AA2F85B60C518551a57B202d54", + "firstSeen": 1790959633, + "txHash": "0x86f094ae0ba1030b97060792344eda1b6018367dbf14088c6c2de1e5a4e2fc6e", + "block": 4446125 + } + } + }, + "expected": { + "verdict": "PARTIAL", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s1.complete-submission.json b/conformance/vectori/market-timeline/s1.complete-submission.json new file mode 100644 index 0000000..447310e --- /dev/null +++ b/conformance/vectori/market-timeline/s1.complete-submission.json @@ -0,0 +1,147 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s1.complete-submission", + "artifact": "market-timeline", + "title": "the submission withheld from the timeline (the job state has a submission time)", + "source": "derived from market-timeline/s1-paid-claim.partial", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity", + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": "market-timeline/s1-paid-claim.partial", + "mutation": { + "op": "remove", + "path": [ + "events", + 2 + ] + }, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "5", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0xf2a0d3e03521234fd6be921e346817e6f77e20db038ff5325318a2a5a47cfd25", + "resultHash": "0xeba5b6ff363f15d358926ab16bc4c7c8c979ec2d217868134810488304dde0be", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 5, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790960218, + "challengeWindow": 90, + "submittedAt": 1790959639, + "disputedAt": 0 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "5", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0xf2a0d3e03521234fd6be921e346817e6f77e20db038ff5325318a2a5a47cfd25", + "deadline": "1790960218", + "pqcSettlement": false + }, + "blockNumber": 4446103, + "blockHash": "0xfc22d0155293bef0b5349507a2a45495de7d3baa37b1f9e5e482585d93ecdc3e", + "timestamp": 1790959620, + "txHash": "0x5178c7b523d9ad5516f5e649f50bc98c44aacd6c4564403ac6b7528a9e63791e", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobClaimed", + "args": { + "id": "5", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "providerBond": "4000000000000000" + }, + "blockNumber": 4446113, + "blockHash": "0xd59b44a60e225a952c0ef940a62f6ebe7325dc4d75627161c329aa6f48bc9ce4", + "timestamp": 1790959626, + "txHash": "0xf46a947200113d014c3e8b0282267feb2882f0d8895ae4b13a72f1db20fa7ee3", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "JobPaid", + "args": { + "id": "5", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "bondReturned": "4000000000000000" + }, + "blockNumber": 4446295, + "blockHash": "0x736c818d1833f0c88ccda5ec5101d392fd842af32a6b152018a085c7a75a7c5c", + "timestamp": 1790959733, + "txHash": "0x5e4bfedda879e4e016b7f4434f75da4a8af63ccc4cce285d714b9e56e453e65f", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 0 + } + ], + "result": "0x7b22646967657374223a22307864346139306165303264396364623232353863373239633532636166613662613263623164306539323532326135313739313733383362366535386131323535222c226974657273223a32303030302c2273656564223a22307862666366386461653665366631303562346537656164383938613466646230333139373435646562336433383034326533383135643735383035653130363064222c227461736b223a226b656363616b2d636861696e227d", + "envelope": { + "v": 1, + "kind": "aere-proof-of-execution-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-execution", + "inputHash": "0xf2a0d3e03521234fd6be921e346817e6f77e20db038ff5325318a2a5a47cfd25", + "outputHash": "0xeba5b6ff363f15d358926ab16bc4c7c8c979ec2d217868134810488304dde0be", + "programSha256": "0x1824b9e133c368fab195cb2f33e35bee78abdb4de7b03f0c377ac5af951eb9e0", + "program": "keccak-chain", + "exitCode": 0, + "createdAt": "2026-10-02T16:47:11.789Z" + }, + "statementHash": "0xfffa43d50b6222a17f915d528f0f636b16882f736f357b8418d30dfec2f88200", + "notarization": { + "chainId": 28001, + "notary": "0x70099E62735500AA2F85B60C518551a57B202d54", + "firstSeen": 1790959633, + "txHash": "0x86f094ae0ba1030b97060792344eda1b6018367dbf14088c6c2de1e5a4e2fc6e", + "block": 4446125 + } + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "market.complete" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s1.deadline.json b/conformance/vectori/market-timeline/s1.deadline.json new file mode 100644 index 0000000..6c5b806 --- /dev/null +++ b/conformance/vectori/market-timeline/s1.deadline.json @@ -0,0 +1,163 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s1.deadline", + "artifact": "market-timeline", + "title": "the job was claimed after its deadline", + "source": "derived from market-timeline/s1-paid-claim.partial", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity", + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": "market-timeline/s1-paid-claim.partial", + "mutation": { + "op": "set", + "path": [ + "events", + 1, + "timestamp" + ], + "value": 1790960219 + }, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "5", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0xf2a0d3e03521234fd6be921e346817e6f77e20db038ff5325318a2a5a47cfd25", + "resultHash": "0xeba5b6ff363f15d358926ab16bc4c7c8c979ec2d217868134810488304dde0be", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 5, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790960218, + "challengeWindow": 90, + "submittedAt": 1790959639, + "disputedAt": 0 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "5", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0xf2a0d3e03521234fd6be921e346817e6f77e20db038ff5325318a2a5a47cfd25", + "deadline": "1790960218", + "pqcSettlement": false + }, + "blockNumber": 4446103, + "blockHash": "0xfc22d0155293bef0b5349507a2a45495de7d3baa37b1f9e5e482585d93ecdc3e", + "timestamp": 1790959620, + "txHash": "0x5178c7b523d9ad5516f5e649f50bc98c44aacd6c4564403ac6b7528a9e63791e", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobClaimed", + "args": { + "id": "5", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "providerBond": "4000000000000000" + }, + "blockNumber": 4446113, + "blockHash": "0xd59b44a60e225a952c0ef940a62f6ebe7325dc4d75627161c329aa6f48bc9ce4", + "timestamp": 1790960219, + "txHash": "0xf46a947200113d014c3e8b0282267feb2882f0d8895ae4b13a72f1db20fa7ee3", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "ResultSubmitted", + "args": { + "id": "5", + "resultHash": "0xeba5b6ff363f15d358926ab16bc4c7c8c979ec2d217868134810488304dde0be", + "result": "0x7b22646967657374223a22307864346139306165303264396364623232353863373239633532636166613662613263623164306539323532326135313739313733383362366535386131323535222c226974657273223a32303030302c2273656564223a22307862666366386461653665366631303562346537656164383938613466646230333139373435646562336433383034326533383135643735383035653130363064222c227461736b223a226b656363616b2d636861696e227d" + }, + "blockNumber": 4446136, + "blockHash": "0x7cedaf1f5da474b94c41fd0925f181459ff642fa449843886d94226daaf2650f", + "timestamp": 1790959639, + "txHash": "0xea128ff1992e39f6690ebfbfbd9896ff27bcea0db4b0070c32062d2de599d446", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "JobPaid", + "args": { + "id": "5", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "bondReturned": "4000000000000000" + }, + "blockNumber": 4446295, + "blockHash": "0x736c818d1833f0c88ccda5ec5101d392fd842af32a6b152018a085c7a75a7c5c", + "timestamp": 1790959733, + "txHash": "0x5e4bfedda879e4e016b7f4434f75da4a8af63ccc4cce285d714b9e56e453e65f", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 0 + } + ], + "result": "0x7b22646967657374223a22307864346139306165303264396364623232353863373239633532636166613662613263623164306539323532326135313739313733383362366535386131323535222c226974657273223a32303030302c2273656564223a22307862666366386461653665366631303562346537656164383938613466646230333139373435646562336433383034326533383135643735383035653130363064222c227461736b223a226b656363616b2d636861696e227d", + "envelope": { + "v": 1, + "kind": "aere-proof-of-execution-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-execution", + "inputHash": "0xf2a0d3e03521234fd6be921e346817e6f77e20db038ff5325318a2a5a47cfd25", + "outputHash": "0xeba5b6ff363f15d358926ab16bc4c7c8c979ec2d217868134810488304dde0be", + "programSha256": "0x1824b9e133c368fab195cb2f33e35bee78abdb4de7b03f0c377ac5af951eb9e0", + "program": "keccak-chain", + "exitCode": 0, + "createdAt": "2026-10-02T16:47:11.789Z" + }, + "statementHash": "0xfffa43d50b6222a17f915d528f0f636b16882f736f357b8418d30dfec2f88200", + "notarization": { + "chainId": 28001, + "notary": "0x70099E62735500AA2F85B60C518551a57B202d54", + "firstSeen": 1790959633, + "txHash": "0x86f094ae0ba1030b97060792344eda1b6018367dbf14088c6c2de1e5a4e2fc6e", + "block": 4446125 + } + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "market.deadline" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s1.proof-late.json b/conformance/vectori/market-timeline/s1.proof-late.json new file mode 100644 index 0000000..eb05530 --- /dev/null +++ b/conformance/vectori/market-timeline/s1.proof-late.json @@ -0,0 +1,163 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s1.proof-late", + "artifact": "market-timeline", + "title": "the execution envelope was notarized only after the challenge window closed", + "source": "derived from market-timeline/s1-paid-claim.partial", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity", + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": "market-timeline/s1-paid-claim.partial", + "mutation": { + "op": "set", + "path": [ + "envelope", + "notarization", + "firstSeen" + ], + "value": 1790959730 + }, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "5", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0xf2a0d3e03521234fd6be921e346817e6f77e20db038ff5325318a2a5a47cfd25", + "resultHash": "0xeba5b6ff363f15d358926ab16bc4c7c8c979ec2d217868134810488304dde0be", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 5, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790960218, + "challengeWindow": 90, + "submittedAt": 1790959639, + "disputedAt": 0 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "5", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0xf2a0d3e03521234fd6be921e346817e6f77e20db038ff5325318a2a5a47cfd25", + "deadline": "1790960218", + "pqcSettlement": false + }, + "blockNumber": 4446103, + "blockHash": "0xfc22d0155293bef0b5349507a2a45495de7d3baa37b1f9e5e482585d93ecdc3e", + "timestamp": 1790959620, + "txHash": "0x5178c7b523d9ad5516f5e649f50bc98c44aacd6c4564403ac6b7528a9e63791e", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobClaimed", + "args": { + "id": "5", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "providerBond": "4000000000000000" + }, + "blockNumber": 4446113, + "blockHash": "0xd59b44a60e225a952c0ef940a62f6ebe7325dc4d75627161c329aa6f48bc9ce4", + "timestamp": 1790959626, + "txHash": "0xf46a947200113d014c3e8b0282267feb2882f0d8895ae4b13a72f1db20fa7ee3", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "ResultSubmitted", + "args": { + "id": "5", + "resultHash": "0xeba5b6ff363f15d358926ab16bc4c7c8c979ec2d217868134810488304dde0be", + "result": "0x7b22646967657374223a22307864346139306165303264396364623232353863373239633532636166613662613263623164306539323532326135313739313733383362366535386131323535222c226974657273223a32303030302c2273656564223a22307862666366386461653665366631303562346537656164383938613466646230333139373435646562336433383034326533383135643735383035653130363064222c227461736b223a226b656363616b2d636861696e227d" + }, + "blockNumber": 4446136, + "blockHash": "0x7cedaf1f5da474b94c41fd0925f181459ff642fa449843886d94226daaf2650f", + "timestamp": 1790959639, + "txHash": "0xea128ff1992e39f6690ebfbfbd9896ff27bcea0db4b0070c32062d2de599d446", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "JobPaid", + "args": { + "id": "5", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "bondReturned": "4000000000000000" + }, + "blockNumber": 4446295, + "blockHash": "0x736c818d1833f0c88ccda5ec5101d392fd842af32a6b152018a085c7a75a7c5c", + "timestamp": 1790959733, + "txHash": "0x5e4bfedda879e4e016b7f4434f75da4a8af63ccc4cce285d714b9e56e453e65f", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 0 + } + ], + "result": "0x7b22646967657374223a22307864346139306165303264396364623232353863373239633532636166613662613263623164306539323532326135313739313733383362366535386131323535222c226974657273223a32303030302c2273656564223a22307862666366386461653665366631303562346537656164383938613466646230333139373435646562336433383034326533383135643735383035653130363064222c227461736b223a226b656363616b2d636861696e227d", + "envelope": { + "v": 1, + "kind": "aere-proof-of-execution-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-execution", + "inputHash": "0xf2a0d3e03521234fd6be921e346817e6f77e20db038ff5325318a2a5a47cfd25", + "outputHash": "0xeba5b6ff363f15d358926ab16bc4c7c8c979ec2d217868134810488304dde0be", + "programSha256": "0x1824b9e133c368fab195cb2f33e35bee78abdb4de7b03f0c377ac5af951eb9e0", + "program": "keccak-chain", + "exitCode": 0, + "createdAt": "2026-10-02T16:47:11.789Z" + }, + "statementHash": "0xfffa43d50b6222a17f915d528f0f636b16882f736f357b8418d30dfec2f88200", + "notarization": { + "chainId": 28001, + "notary": "0x70099E62735500AA2F85B60C518551a57B202d54", + "firstSeen": 1790959730, + "txHash": "0x86f094ae0ba1030b97060792344eda1b6018367dbf14088c6c2de1e5a4e2fc6e", + "block": 4446125 + } + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "market.proof" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s1.proof-other-result.json b/conformance/vectori/market-timeline/s1.proof-other-result.json new file mode 100644 index 0000000..0387d40 --- /dev/null +++ b/conformance/vectori/market-timeline/s1.proof-other-result.json @@ -0,0 +1,164 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s1.proof-other-result", + "artifact": "market-timeline", + "title": "the execution envelope names another result (and so no longer hashes to its statementHash)", + "source": "derived from market-timeline/s1-paid-claim.partial", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity", + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": "market-timeline/s1-paid-claim.partial", + "mutation": { + "op": "set", + "path": [ + "envelope", + "statement", + "outputHash" + ], + "value": "0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "5", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0xf2a0d3e03521234fd6be921e346817e6f77e20db038ff5325318a2a5a47cfd25", + "resultHash": "0xeba5b6ff363f15d358926ab16bc4c7c8c979ec2d217868134810488304dde0be", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 5, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790960218, + "challengeWindow": 90, + "submittedAt": 1790959639, + "disputedAt": 0 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "5", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0xf2a0d3e03521234fd6be921e346817e6f77e20db038ff5325318a2a5a47cfd25", + "deadline": "1790960218", + "pqcSettlement": false + }, + "blockNumber": 4446103, + "blockHash": "0xfc22d0155293bef0b5349507a2a45495de7d3baa37b1f9e5e482585d93ecdc3e", + "timestamp": 1790959620, + "txHash": "0x5178c7b523d9ad5516f5e649f50bc98c44aacd6c4564403ac6b7528a9e63791e", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobClaimed", + "args": { + "id": "5", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "providerBond": "4000000000000000" + }, + "blockNumber": 4446113, + "blockHash": "0xd59b44a60e225a952c0ef940a62f6ebe7325dc4d75627161c329aa6f48bc9ce4", + "timestamp": 1790959626, + "txHash": "0xf46a947200113d014c3e8b0282267feb2882f0d8895ae4b13a72f1db20fa7ee3", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "ResultSubmitted", + "args": { + "id": "5", + "resultHash": "0xeba5b6ff363f15d358926ab16bc4c7c8c979ec2d217868134810488304dde0be", + "result": "0x7b22646967657374223a22307864346139306165303264396364623232353863373239633532636166613662613263623164306539323532326135313739313733383362366535386131323535222c226974657273223a32303030302c2273656564223a22307862666366386461653665366631303562346537656164383938613466646230333139373435646562336433383034326533383135643735383035653130363064222c227461736b223a226b656363616b2d636861696e227d" + }, + "blockNumber": 4446136, + "blockHash": "0x7cedaf1f5da474b94c41fd0925f181459ff642fa449843886d94226daaf2650f", + "timestamp": 1790959639, + "txHash": "0xea128ff1992e39f6690ebfbfbd9896ff27bcea0db4b0070c32062d2de599d446", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "JobPaid", + "args": { + "id": "5", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "bondReturned": "4000000000000000" + }, + "blockNumber": 4446295, + "blockHash": "0x736c818d1833f0c88ccda5ec5101d392fd842af32a6b152018a085c7a75a7c5c", + "timestamp": 1790959733, + "txHash": "0x5e4bfedda879e4e016b7f4434f75da4a8af63ccc4cce285d714b9e56e453e65f", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 0 + } + ], + "result": "0x7b22646967657374223a22307864346139306165303264396364623232353863373239633532636166613662613263623164306539323532326135313739313733383362366535386131323535222c226974657273223a32303030302c2273656564223a22307862666366386461653665366631303562346537656164383938613466646230333139373435646562336433383034326533383135643735383035653130363064222c227461736b223a226b656363616b2d636861696e227d", + "envelope": { + "v": 1, + "kind": "aere-proof-of-execution-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-execution", + "inputHash": "0xf2a0d3e03521234fd6be921e346817e6f77e20db038ff5325318a2a5a47cfd25", + "outputHash": "0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "programSha256": "0x1824b9e133c368fab195cb2f33e35bee78abdb4de7b03f0c377ac5af951eb9e0", + "program": "keccak-chain", + "exitCode": 0, + "createdAt": "2026-10-02T16:47:11.789Z" + }, + "statementHash": "0xfffa43d50b6222a17f915d528f0f636b16882f736f357b8418d30dfec2f88200", + "notarization": { + "chainId": 28001, + "notary": "0x70099E62735500AA2F85B60C518551a57B202d54", + "firstSeen": 1790959633, + "txHash": "0x86f094ae0ba1030b97060792344eda1b6018367dbf14088c6c2de1e5a4e2fc6e", + "block": 4446125 + } + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "envelope.integrity", + "market.proof" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s1.window.json b/conformance/vectori/market-timeline/s1.window.json new file mode 100644 index 0000000..51cb69b --- /dev/null +++ b/conformance/vectori/market-timeline/s1.window.json @@ -0,0 +1,163 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s1.window", + "artifact": "market-timeline", + "title": "a third party finalized inside the challenge window", + "source": "derived from market-timeline/s1-paid-claim.partial", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity", + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": "market-timeline/s1-paid-claim.partial", + "mutation": { + "op": "set", + "path": [ + "events", + 3, + "timestamp" + ], + "value": 1790959640 + }, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "5", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0xf2a0d3e03521234fd6be921e346817e6f77e20db038ff5325318a2a5a47cfd25", + "resultHash": "0xeba5b6ff363f15d358926ab16bc4c7c8c979ec2d217868134810488304dde0be", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 5, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790960218, + "challengeWindow": 90, + "submittedAt": 1790959639, + "disputedAt": 0 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "5", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0xf2a0d3e03521234fd6be921e346817e6f77e20db038ff5325318a2a5a47cfd25", + "deadline": "1790960218", + "pqcSettlement": false + }, + "blockNumber": 4446103, + "blockHash": "0xfc22d0155293bef0b5349507a2a45495de7d3baa37b1f9e5e482585d93ecdc3e", + "timestamp": 1790959620, + "txHash": "0x5178c7b523d9ad5516f5e649f50bc98c44aacd6c4564403ac6b7528a9e63791e", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobClaimed", + "args": { + "id": "5", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "providerBond": "4000000000000000" + }, + "blockNumber": 4446113, + "blockHash": "0xd59b44a60e225a952c0ef940a62f6ebe7325dc4d75627161c329aa6f48bc9ce4", + "timestamp": 1790959626, + "txHash": "0xf46a947200113d014c3e8b0282267feb2882f0d8895ae4b13a72f1db20fa7ee3", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "ResultSubmitted", + "args": { + "id": "5", + "resultHash": "0xeba5b6ff363f15d358926ab16bc4c7c8c979ec2d217868134810488304dde0be", + "result": "0x7b22646967657374223a22307864346139306165303264396364623232353863373239633532636166613662613263623164306539323532326135313739313733383362366535386131323535222c226974657273223a32303030302c2273656564223a22307862666366386461653665366631303562346537656164383938613466646230333139373435646562336433383034326533383135643735383035653130363064222c227461736b223a226b656363616b2d636861696e227d" + }, + "blockNumber": 4446136, + "blockHash": "0x7cedaf1f5da474b94c41fd0925f181459ff642fa449843886d94226daaf2650f", + "timestamp": 1790959639, + "txHash": "0xea128ff1992e39f6690ebfbfbd9896ff27bcea0db4b0070c32062d2de599d446", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "JobPaid", + "args": { + "id": "5", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "bondReturned": "4000000000000000" + }, + "blockNumber": 4446295, + "blockHash": "0x736c818d1833f0c88ccda5ec5101d392fd842af32a6b152018a085c7a75a7c5c", + "timestamp": 1790959640, + "txHash": "0x5e4bfedda879e4e016b7f4434f75da4a8af63ccc4cce285d714b9e56e453e65f", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 0 + } + ], + "result": "0x7b22646967657374223a22307864346139306165303264396364623232353863373239633532636166613662613263623164306539323532326135313739313733383362366535386131323535222c226974657273223a32303030302c2273656564223a22307862666366386461653665366631303562346537656164383938613466646230333139373435646562336433383034326533383135643735383035653130363064222c227461736b223a226b656363616b2d636861696e227d", + "envelope": { + "v": 1, + "kind": "aere-proof-of-execution-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-execution", + "inputHash": "0xf2a0d3e03521234fd6be921e346817e6f77e20db038ff5325318a2a5a47cfd25", + "outputHash": "0xeba5b6ff363f15d358926ab16bc4c7c8c979ec2d217868134810488304dde0be", + "programSha256": "0x1824b9e133c368fab195cb2f33e35bee78abdb4de7b03f0c377ac5af951eb9e0", + "program": "keccak-chain", + "exitCode": 0, + "createdAt": "2026-10-02T16:47:11.789Z" + }, + "statementHash": "0xfffa43d50b6222a17f915d528f0f636b16882f736f357b8418d30dfec2f88200", + "notarization": { + "chainId": 28001, + "notary": "0x70099E62735500AA2F85B60C518551a57B202d54", + "firstSeen": 1790959633, + "txHash": "0x86f094ae0ba1030b97060792344eda1b6018367dbf14088c6c2de1e5a4e2fc6e", + "block": 4446125 + } + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "market.window" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s2-slashed.valid.json b/conformance/vectori/market-timeline/s2-slashed.valid.json new file mode 100644 index 0000000..30ad4ee --- /dev/null +++ b/conformance/vectori/market-timeline/s2-slashed.valid.json @@ -0,0 +1,155 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s2-slashed.valid", + "artifact": "market-timeline", + "title": "a dispute the challenger won: the provider slashed", + "source": "recorded (market-settlement, 2026-10-02), scenario S2", + "requires": [], + "exercises": [ + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": null, + "mutation": null, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "6", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0x307e7d75c2de86416fd1df625fd5c00a12a4ff6257bea57871de8c7d47cf5a89", + "resultHash": "0x2dea74737284c05166223abbb28b3eaf367e8964a5a12bffa0ab4bd1e2b300ae", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 7, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790960353, + "challengeWindow": 90, + "submittedAt": 1790959767, + "disputedAt": 1790959773 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "6", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0x307e7d75c2de86416fd1df625fd5c00a12a4ff6257bea57871de8c7d47cf5a89", + "deadline": "1790960353", + "pqcSettlement": false + }, + "blockNumber": 4446332, + "blockHash": "0x373ef4cd4095e1db711ba4748c2a5bd2d78a26dd7892a98c14929aeb0b62cf1f", + "timestamp": 1790959755, + "txHash": "0xdf242547d54507d84bb9ac8d91ce24b65529d17940bd95504f5267ee74bdd92a", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobClaimed", + "args": { + "id": "6", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "providerBond": "4000000000000000" + }, + "blockNumber": 4446342, + "blockHash": "0xa81e65065cd3c472cc571c64035031c66e975906a92e5b88acba4a6e08c9d7a1", + "timestamp": 1790959761, + "txHash": "0xfcfc913a260d29b519276a484199d372ed39aac81005166e5231025bf948d35b", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "ResultSubmitted", + "args": { + "id": "6", + "resultHash": "0x2dea74737284c05166223abbb28b3eaf367e8964a5a12bffa0ab4bd1e2b300ae", + "result": "0x7b22646967657374223a22307865656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565222c226974657273223a32303030302c2273656564223a22307835646532353538363237666363653664393533623161373033353866313637633962333634666339343461343566653037343161626330633062386434326365222c227461736b223a226b656363616b2d636861696e227d" + }, + "blockNumber": 4446353, + "blockHash": "0xd4d23bd3f6d3883330ff25de0a81696c0e9ba473c5457b918c5aa82e55601777", + "timestamp": 1790959767, + "txHash": "0x5f921a8d67de79bfcfd4d77085fa220d5ecc4191631a7e4dc050e003e612c6c6", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "JobDisputed", + "args": { + "id": "6", + "challenger": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "bond": "4000000000000000", + "recomputedResultHash": "0xb37eb93d1b69a562f94bb2de482a0a4dd3e04493d3020cb29eeef8df82c713c3" + }, + "blockNumber": 4446364, + "blockHash": "0xf6a3e7e6f51312f624cbed5251b0c5abe05f9bd2b1d255ec8fe65114d408311c", + "timestamp": 1790959773, + "txHash": "0x72c54a067ebf1341a588db66f61223a28d7f6977bc60ab8eff5e59e008ddf8de", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobSlashed", + "args": { + "id": "6", + "challenger": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "slashedProviderBond": "4000000000000000" + }, + "blockNumber": 4446375, + "blockHash": "0xf5aa67bf1e48b8fc8a8ff44b794b0f9cd501f45d10b7979b7b5fdc37e9d70a9a", + "timestamp": 1790959780, + "txHash": "0x7b1916485981fef836d5f43c3d8c4528678931f78d4b3110859198c630e5e69f", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 0 + }, + { + "name": "DisputeResolved", + "args": { + "id": "6", + "providerWon": false + }, + "blockNumber": 4446375, + "blockHash": "0xf5aa67bf1e48b8fc8a8ff44b794b0f9cd501f45d10b7979b7b5fdc37e9d70a9a", + "timestamp": 1790959780, + "txHash": "0x7b1916485981fef836d5f43c3d8c4528678931f78d4b3110859198c630e5e69f", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 1 + } + ], + "result": "0x7b22646967657374223a22307865656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565222c226974657273223a32303030302c2273656564223a22307835646532353538363237666363653664393533623161373033353866313637633962333634666339343461343566653037343161626330633062386434326365222c227461736b223a226b656363616b2d636861696e227d" + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s2.arbiter.json b/conformance/vectori/market-timeline/s2.arbiter.json new file mode 100644 index 0000000..648a0cd --- /dev/null +++ b/conformance/vectori/market-timeline/s2.arbiter.json @@ -0,0 +1,165 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s2.arbiter", + "artifact": "market-timeline", + "title": "the dispute was resolved by an address that is not the arbiter", + "source": "derived from market-timeline/s2-slashed.valid", + "requires": [], + "exercises": [ + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": "market-timeline/s2-slashed.valid", + "mutation": { + "op": "set", + "path": [ + "events", + 5, + "from" + ], + "value": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF" + }, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "6", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0x307e7d75c2de86416fd1df625fd5c00a12a4ff6257bea57871de8c7d47cf5a89", + "resultHash": "0x2dea74737284c05166223abbb28b3eaf367e8964a5a12bffa0ab4bd1e2b300ae", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 7, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790960353, + "challengeWindow": 90, + "submittedAt": 1790959767, + "disputedAt": 1790959773 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "6", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0x307e7d75c2de86416fd1df625fd5c00a12a4ff6257bea57871de8c7d47cf5a89", + "deadline": "1790960353", + "pqcSettlement": false + }, + "blockNumber": 4446332, + "blockHash": "0x373ef4cd4095e1db711ba4748c2a5bd2d78a26dd7892a98c14929aeb0b62cf1f", + "timestamp": 1790959755, + "txHash": "0xdf242547d54507d84bb9ac8d91ce24b65529d17940bd95504f5267ee74bdd92a", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobClaimed", + "args": { + "id": "6", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "providerBond": "4000000000000000" + }, + "blockNumber": 4446342, + "blockHash": "0xa81e65065cd3c472cc571c64035031c66e975906a92e5b88acba4a6e08c9d7a1", + "timestamp": 1790959761, + "txHash": "0xfcfc913a260d29b519276a484199d372ed39aac81005166e5231025bf948d35b", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "ResultSubmitted", + "args": { + "id": "6", + "resultHash": "0x2dea74737284c05166223abbb28b3eaf367e8964a5a12bffa0ab4bd1e2b300ae", + "result": "0x7b22646967657374223a22307865656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565222c226974657273223a32303030302c2273656564223a22307835646532353538363237666363653664393533623161373033353866313637633962333634666339343461343566653037343161626330633062386434326365222c227461736b223a226b656363616b2d636861696e227d" + }, + "blockNumber": 4446353, + "blockHash": "0xd4d23bd3f6d3883330ff25de0a81696c0e9ba473c5457b918c5aa82e55601777", + "timestamp": 1790959767, + "txHash": "0x5f921a8d67de79bfcfd4d77085fa220d5ecc4191631a7e4dc050e003e612c6c6", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "JobDisputed", + "args": { + "id": "6", + "challenger": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "bond": "4000000000000000", + "recomputedResultHash": "0xb37eb93d1b69a562f94bb2de482a0a4dd3e04493d3020cb29eeef8df82c713c3" + }, + "blockNumber": 4446364, + "blockHash": "0xf6a3e7e6f51312f624cbed5251b0c5abe05f9bd2b1d255ec8fe65114d408311c", + "timestamp": 1790959773, + "txHash": "0x72c54a067ebf1341a588db66f61223a28d7f6977bc60ab8eff5e59e008ddf8de", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobSlashed", + "args": { + "id": "6", + "challenger": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "slashedProviderBond": "4000000000000000" + }, + "blockNumber": 4446375, + "blockHash": "0xf5aa67bf1e48b8fc8a8ff44b794b0f9cd501f45d10b7979b7b5fdc37e9d70a9a", + "timestamp": 1790959780, + "txHash": "0x7b1916485981fef836d5f43c3d8c4528678931f78d4b3110859198c630e5e69f", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 0 + }, + { + "name": "DisputeResolved", + "args": { + "id": "6", + "providerWon": false + }, + "blockNumber": 4446375, + "blockHash": "0xf5aa67bf1e48b8fc8a8ff44b794b0f9cd501f45d10b7979b7b5fdc37e9d70a9a", + "timestamp": 1790959780, + "txHash": "0x7b1916485981fef836d5f43c3d8c4528678931f78d4b3110859198c630e5e69f", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 1 + } + ], + "result": "0x7b22646967657374223a22307865656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565222c226974657273223a32303030302c2273656564223a22307835646532353538363237666363653664393533623161373033353866313637633962333634666339343461343566653037343161626330633062386434326365222c227461736b223a226b656363616b2d636861696e227d" + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "market.arbiter" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s2.deadline-submitted.json b/conformance/vectori/market-timeline/s2.deadline-submitted.json new file mode 100644 index 0000000..e692d18 --- /dev/null +++ b/conformance/vectori/market-timeline/s2.deadline-submitted.json @@ -0,0 +1,165 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s2.deadline-submitted", + "artifact": "market-timeline", + "title": "the result was submitted after the deadline", + "source": "derived from market-timeline/s2-slashed.valid", + "requires": [], + "exercises": [ + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": "market-timeline/s2-slashed.valid", + "mutation": { + "op": "set", + "path": [ + "events", + 2, + "timestamp" + ], + "value": 1790960354 + }, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "6", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0x307e7d75c2de86416fd1df625fd5c00a12a4ff6257bea57871de8c7d47cf5a89", + "resultHash": "0x2dea74737284c05166223abbb28b3eaf367e8964a5a12bffa0ab4bd1e2b300ae", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 7, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790960353, + "challengeWindow": 90, + "submittedAt": 1790959767, + "disputedAt": 1790959773 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "6", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0x307e7d75c2de86416fd1df625fd5c00a12a4ff6257bea57871de8c7d47cf5a89", + "deadline": "1790960353", + "pqcSettlement": false + }, + "blockNumber": 4446332, + "blockHash": "0x373ef4cd4095e1db711ba4748c2a5bd2d78a26dd7892a98c14929aeb0b62cf1f", + "timestamp": 1790959755, + "txHash": "0xdf242547d54507d84bb9ac8d91ce24b65529d17940bd95504f5267ee74bdd92a", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobClaimed", + "args": { + "id": "6", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "providerBond": "4000000000000000" + }, + "blockNumber": 4446342, + "blockHash": "0xa81e65065cd3c472cc571c64035031c66e975906a92e5b88acba4a6e08c9d7a1", + "timestamp": 1790959761, + "txHash": "0xfcfc913a260d29b519276a484199d372ed39aac81005166e5231025bf948d35b", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "ResultSubmitted", + "args": { + "id": "6", + "resultHash": "0x2dea74737284c05166223abbb28b3eaf367e8964a5a12bffa0ab4bd1e2b300ae", + "result": "0x7b22646967657374223a22307865656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565222c226974657273223a32303030302c2273656564223a22307835646532353538363237666363653664393533623161373033353866313637633962333634666339343461343566653037343161626330633062386434326365222c227461736b223a226b656363616b2d636861696e227d" + }, + "blockNumber": 4446353, + "blockHash": "0xd4d23bd3f6d3883330ff25de0a81696c0e9ba473c5457b918c5aa82e55601777", + "timestamp": 1790960354, + "txHash": "0x5f921a8d67de79bfcfd4d77085fa220d5ecc4191631a7e4dc050e003e612c6c6", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "JobDisputed", + "args": { + "id": "6", + "challenger": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "bond": "4000000000000000", + "recomputedResultHash": "0xb37eb93d1b69a562f94bb2de482a0a4dd3e04493d3020cb29eeef8df82c713c3" + }, + "blockNumber": 4446364, + "blockHash": "0xf6a3e7e6f51312f624cbed5251b0c5abe05f9bd2b1d255ec8fe65114d408311c", + "timestamp": 1790959773, + "txHash": "0x72c54a067ebf1341a588db66f61223a28d7f6977bc60ab8eff5e59e008ddf8de", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobSlashed", + "args": { + "id": "6", + "challenger": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "slashedProviderBond": "4000000000000000" + }, + "blockNumber": 4446375, + "blockHash": "0xf5aa67bf1e48b8fc8a8ff44b794b0f9cd501f45d10b7979b7b5fdc37e9d70a9a", + "timestamp": 1790959780, + "txHash": "0x7b1916485981fef836d5f43c3d8c4528678931f78d4b3110859198c630e5e69f", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 0 + }, + { + "name": "DisputeResolved", + "args": { + "id": "6", + "providerWon": false + }, + "blockNumber": 4446375, + "blockHash": "0xf5aa67bf1e48b8fc8a8ff44b794b0f9cd501f45d10b7979b7b5fdc37e9d70a9a", + "timestamp": 1790959780, + "txHash": "0x7b1916485981fef836d5f43c3d8c4528678931f78d4b3110859198c630e5e69f", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 1 + } + ], + "result": "0x7b22646967657374223a22307865656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565222c226974657273223a32303030302c2273656564223a22307835646532353538363237666363653664393533623161373033353866313637633962333634666339343461343566653037343161626330633062386434326365222c227461736b223a226b656363616b2d636861696e227d" + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "market.deadline" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s2.payout.json b/conformance/vectori/market-timeline/s2.payout.json new file mode 100644 index 0000000..b87f4d0 --- /dev/null +++ b/conformance/vectori/market-timeline/s2.payout.json @@ -0,0 +1,166 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s2.payout", + "artifact": "market-timeline", + "title": "the slashed bond is paid to someone who is not the challenger", + "source": "derived from market-timeline/s2-slashed.valid", + "requires": [], + "exercises": [ + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": "market-timeline/s2-slashed.valid", + "mutation": { + "op": "set", + "path": [ + "events", + 4, + "args", + "challenger" + ], + "value": "0xeC2261CECBB06768F6db095822b429AF5c861E2e" + }, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "6", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0x307e7d75c2de86416fd1df625fd5c00a12a4ff6257bea57871de8c7d47cf5a89", + "resultHash": "0x2dea74737284c05166223abbb28b3eaf367e8964a5a12bffa0ab4bd1e2b300ae", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 7, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790960353, + "challengeWindow": 90, + "submittedAt": 1790959767, + "disputedAt": 1790959773 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "6", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0x307e7d75c2de86416fd1df625fd5c00a12a4ff6257bea57871de8c7d47cf5a89", + "deadline": "1790960353", + "pqcSettlement": false + }, + "blockNumber": 4446332, + "blockHash": "0x373ef4cd4095e1db711ba4748c2a5bd2d78a26dd7892a98c14929aeb0b62cf1f", + "timestamp": 1790959755, + "txHash": "0xdf242547d54507d84bb9ac8d91ce24b65529d17940bd95504f5267ee74bdd92a", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobClaimed", + "args": { + "id": "6", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "providerBond": "4000000000000000" + }, + "blockNumber": 4446342, + "blockHash": "0xa81e65065cd3c472cc571c64035031c66e975906a92e5b88acba4a6e08c9d7a1", + "timestamp": 1790959761, + "txHash": "0xfcfc913a260d29b519276a484199d372ed39aac81005166e5231025bf948d35b", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "ResultSubmitted", + "args": { + "id": "6", + "resultHash": "0x2dea74737284c05166223abbb28b3eaf367e8964a5a12bffa0ab4bd1e2b300ae", + "result": "0x7b22646967657374223a22307865656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565222c226974657273223a32303030302c2273656564223a22307835646532353538363237666363653664393533623161373033353866313637633962333634666339343461343566653037343161626330633062386434326365222c227461736b223a226b656363616b2d636861696e227d" + }, + "blockNumber": 4446353, + "blockHash": "0xd4d23bd3f6d3883330ff25de0a81696c0e9ba473c5457b918c5aa82e55601777", + "timestamp": 1790959767, + "txHash": "0x5f921a8d67de79bfcfd4d77085fa220d5ecc4191631a7e4dc050e003e612c6c6", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "JobDisputed", + "args": { + "id": "6", + "challenger": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "bond": "4000000000000000", + "recomputedResultHash": "0xb37eb93d1b69a562f94bb2de482a0a4dd3e04493d3020cb29eeef8df82c713c3" + }, + "blockNumber": 4446364, + "blockHash": "0xf6a3e7e6f51312f624cbed5251b0c5abe05f9bd2b1d255ec8fe65114d408311c", + "timestamp": 1790959773, + "txHash": "0x72c54a067ebf1341a588db66f61223a28d7f6977bc60ab8eff5e59e008ddf8de", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobSlashed", + "args": { + "id": "6", + "challenger": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "slashedProviderBond": "4000000000000000" + }, + "blockNumber": 4446375, + "blockHash": "0xf5aa67bf1e48b8fc8a8ff44b794b0f9cd501f45d10b7979b7b5fdc37e9d70a9a", + "timestamp": 1790959780, + "txHash": "0x7b1916485981fef836d5f43c3d8c4528678931f78d4b3110859198c630e5e69f", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 0 + }, + { + "name": "DisputeResolved", + "args": { + "id": "6", + "providerWon": false + }, + "blockNumber": 4446375, + "blockHash": "0xf5aa67bf1e48b8fc8a8ff44b794b0f9cd501f45d10b7979b7b5fdc37e9d70a9a", + "timestamp": 1790959780, + "txHash": "0x7b1916485981fef836d5f43c3d8c4528678931f78d4b3110859198c630e5e69f", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 1 + } + ], + "result": "0x7b22646967657374223a22307865656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565222c226974657273223a32303030302c2273656564223a22307835646532353538363237666363653664393533623161373033353866313637633962333634666339343461343566653037343161626330633062386434326365222c227461736b223a226b656363616b2d636861696e227d" + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "market.payout" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s2.posting.json b/conformance/vectori/market-timeline/s2.posting.json new file mode 100644 index 0000000..6059ccc --- /dev/null +++ b/conformance/vectori/market-timeline/s2.posting.json @@ -0,0 +1,166 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s2.posting", + "artifact": "market-timeline", + "title": "the JobPosted event names another requester than the job", + "source": "derived from market-timeline/s2-slashed.valid", + "requires": [], + "exercises": [ + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": "market-timeline/s2-slashed.valid", + "mutation": { + "op": "set", + "path": [ + "events", + 0, + "args", + "requester" + ], + "value": "0xeC2261CECBB06768F6db095822b429AF5c861E2e" + }, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "6", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0x307e7d75c2de86416fd1df625fd5c00a12a4ff6257bea57871de8c7d47cf5a89", + "resultHash": "0x2dea74737284c05166223abbb28b3eaf367e8964a5a12bffa0ab4bd1e2b300ae", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 7, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790960353, + "challengeWindow": 90, + "submittedAt": 1790959767, + "disputedAt": 1790959773 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "6", + "requester": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0x307e7d75c2de86416fd1df625fd5c00a12a4ff6257bea57871de8c7d47cf5a89", + "deadline": "1790960353", + "pqcSettlement": false + }, + "blockNumber": 4446332, + "blockHash": "0x373ef4cd4095e1db711ba4748c2a5bd2d78a26dd7892a98c14929aeb0b62cf1f", + "timestamp": 1790959755, + "txHash": "0xdf242547d54507d84bb9ac8d91ce24b65529d17940bd95504f5267ee74bdd92a", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobClaimed", + "args": { + "id": "6", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "providerBond": "4000000000000000" + }, + "blockNumber": 4446342, + "blockHash": "0xa81e65065cd3c472cc571c64035031c66e975906a92e5b88acba4a6e08c9d7a1", + "timestamp": 1790959761, + "txHash": "0xfcfc913a260d29b519276a484199d372ed39aac81005166e5231025bf948d35b", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "ResultSubmitted", + "args": { + "id": "6", + "resultHash": "0x2dea74737284c05166223abbb28b3eaf367e8964a5a12bffa0ab4bd1e2b300ae", + "result": "0x7b22646967657374223a22307865656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565222c226974657273223a32303030302c2273656564223a22307835646532353538363237666363653664393533623161373033353866313637633962333634666339343461343566653037343161626330633062386434326365222c227461736b223a226b656363616b2d636861696e227d" + }, + "blockNumber": 4446353, + "blockHash": "0xd4d23bd3f6d3883330ff25de0a81696c0e9ba473c5457b918c5aa82e55601777", + "timestamp": 1790959767, + "txHash": "0x5f921a8d67de79bfcfd4d77085fa220d5ecc4191631a7e4dc050e003e612c6c6", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "JobDisputed", + "args": { + "id": "6", + "challenger": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "bond": "4000000000000000", + "recomputedResultHash": "0xb37eb93d1b69a562f94bb2de482a0a4dd3e04493d3020cb29eeef8df82c713c3" + }, + "blockNumber": 4446364, + "blockHash": "0xf6a3e7e6f51312f624cbed5251b0c5abe05f9bd2b1d255ec8fe65114d408311c", + "timestamp": 1790959773, + "txHash": "0x72c54a067ebf1341a588db66f61223a28d7f6977bc60ab8eff5e59e008ddf8de", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobSlashed", + "args": { + "id": "6", + "challenger": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "slashedProviderBond": "4000000000000000" + }, + "blockNumber": 4446375, + "blockHash": "0xf5aa67bf1e48b8fc8a8ff44b794b0f9cd501f45d10b7979b7b5fdc37e9d70a9a", + "timestamp": 1790959780, + "txHash": "0x7b1916485981fef836d5f43c3d8c4528678931f78d4b3110859198c630e5e69f", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 0 + }, + { + "name": "DisputeResolved", + "args": { + "id": "6", + "providerWon": false + }, + "blockNumber": 4446375, + "blockHash": "0xf5aa67bf1e48b8fc8a8ff44b794b0f9cd501f45d10b7979b7b5fdc37e9d70a9a", + "timestamp": 1790959780, + "txHash": "0x7b1916485981fef836d5f43c3d8c4528678931f78d4b3110859198c630e5e69f", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 1 + } + ], + "result": "0x7b22646967657374223a22307865656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565222c226974657273223a32303030302c2273656564223a22307835646532353538363237666363653664393533623161373033353866313637633962333634666339343461343566653037343161626330633062386434326365222c227461736b223a226b656363616b2d636861696e227d" + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "market.posting" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s2.result.json b/conformance/vectori/market-timeline/s2.result.json new file mode 100644 index 0000000..3dcf9d4 --- /dev/null +++ b/conformance/vectori/market-timeline/s2.result.json @@ -0,0 +1,163 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s2.result", + "artifact": "market-timeline", + "title": "the result bytes shown do not hash to the commitment on chain", + "source": "derived from market-timeline/s2-slashed.valid", + "requires": [], + "exercises": [ + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": "market-timeline/s2-slashed.valid", + "mutation": { + "op": "set", + "path": [ + "result" + ], + "value": "0x7b22646967657374223a22307865656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565222c226974657273223a32303030302c2273656564223a22307835646532353538363237666363653664393533623161373033353866313637633962333634666339343461343566653037343161626330633062386434326365222c227461736b223a226b656363616b2d636861696e2200" + }, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "6", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0x307e7d75c2de86416fd1df625fd5c00a12a4ff6257bea57871de8c7d47cf5a89", + "resultHash": "0x2dea74737284c05166223abbb28b3eaf367e8964a5a12bffa0ab4bd1e2b300ae", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 7, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790960353, + "challengeWindow": 90, + "submittedAt": 1790959767, + "disputedAt": 1790959773 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "6", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0x307e7d75c2de86416fd1df625fd5c00a12a4ff6257bea57871de8c7d47cf5a89", + "deadline": "1790960353", + "pqcSettlement": false + }, + "blockNumber": 4446332, + "blockHash": "0x373ef4cd4095e1db711ba4748c2a5bd2d78a26dd7892a98c14929aeb0b62cf1f", + "timestamp": 1790959755, + "txHash": "0xdf242547d54507d84bb9ac8d91ce24b65529d17940bd95504f5267ee74bdd92a", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobClaimed", + "args": { + "id": "6", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "providerBond": "4000000000000000" + }, + "blockNumber": 4446342, + "blockHash": "0xa81e65065cd3c472cc571c64035031c66e975906a92e5b88acba4a6e08c9d7a1", + "timestamp": 1790959761, + "txHash": "0xfcfc913a260d29b519276a484199d372ed39aac81005166e5231025bf948d35b", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "ResultSubmitted", + "args": { + "id": "6", + "resultHash": "0x2dea74737284c05166223abbb28b3eaf367e8964a5a12bffa0ab4bd1e2b300ae", + "result": "0x7b22646967657374223a22307865656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565222c226974657273223a32303030302c2273656564223a22307835646532353538363237666363653664393533623161373033353866313637633962333634666339343461343566653037343161626330633062386434326365222c227461736b223a226b656363616b2d636861696e227d" + }, + "blockNumber": 4446353, + "blockHash": "0xd4d23bd3f6d3883330ff25de0a81696c0e9ba473c5457b918c5aa82e55601777", + "timestamp": 1790959767, + "txHash": "0x5f921a8d67de79bfcfd4d77085fa220d5ecc4191631a7e4dc050e003e612c6c6", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "JobDisputed", + "args": { + "id": "6", + "challenger": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "bond": "4000000000000000", + "recomputedResultHash": "0xb37eb93d1b69a562f94bb2de482a0a4dd3e04493d3020cb29eeef8df82c713c3" + }, + "blockNumber": 4446364, + "blockHash": "0xf6a3e7e6f51312f624cbed5251b0c5abe05f9bd2b1d255ec8fe65114d408311c", + "timestamp": 1790959773, + "txHash": "0x72c54a067ebf1341a588db66f61223a28d7f6977bc60ab8eff5e59e008ddf8de", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobSlashed", + "args": { + "id": "6", + "challenger": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "slashedProviderBond": "4000000000000000" + }, + "blockNumber": 4446375, + "blockHash": "0xf5aa67bf1e48b8fc8a8ff44b794b0f9cd501f45d10b7979b7b5fdc37e9d70a9a", + "timestamp": 1790959780, + "txHash": "0x7b1916485981fef836d5f43c3d8c4528678931f78d4b3110859198c630e5e69f", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 0 + }, + { + "name": "DisputeResolved", + "args": { + "id": "6", + "providerWon": false + }, + "blockNumber": 4446375, + "blockHash": "0xf5aa67bf1e48b8fc8a8ff44b794b0f9cd501f45d10b7979b7b5fdc37e9d70a9a", + "timestamp": 1790959780, + "txHash": "0x7b1916485981fef836d5f43c3d8c4528678931f78d4b3110859198c630e5e69f", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 1 + } + ], + "result": "0x7b22646967657374223a22307865656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565222c226974657273223a32303030302c2273656564223a22307835646532353538363237666363653664393533623161373033353866313637633962333634666339343461343566653037343161626330633062386434326365222c227461736b223a226b656363616b2d636861696e2200" + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "market.result" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s2.window.json b/conformance/vectori/market-timeline/s2.window.json new file mode 100644 index 0000000..ace9f89 --- /dev/null +++ b/conformance/vectori/market-timeline/s2.window.json @@ -0,0 +1,165 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s2.window", + "artifact": "market-timeline", + "title": "the dispute was raised after the challenge window closed", + "source": "derived from market-timeline/s2-slashed.valid", + "requires": [], + "exercises": [ + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": "market-timeline/s2-slashed.valid", + "mutation": { + "op": "set", + "path": [ + "events", + 3, + "timestamp" + ], + "value": 1790959862 + }, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "6", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0x307e7d75c2de86416fd1df625fd5c00a12a4ff6257bea57871de8c7d47cf5a89", + "resultHash": "0x2dea74737284c05166223abbb28b3eaf367e8964a5a12bffa0ab4bd1e2b300ae", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 7, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790960353, + "challengeWindow": 90, + "submittedAt": 1790959767, + "disputedAt": 1790959773 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "6", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0x307e7d75c2de86416fd1df625fd5c00a12a4ff6257bea57871de8c7d47cf5a89", + "deadline": "1790960353", + "pqcSettlement": false + }, + "blockNumber": 4446332, + "blockHash": "0x373ef4cd4095e1db711ba4748c2a5bd2d78a26dd7892a98c14929aeb0b62cf1f", + "timestamp": 1790959755, + "txHash": "0xdf242547d54507d84bb9ac8d91ce24b65529d17940bd95504f5267ee74bdd92a", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobClaimed", + "args": { + "id": "6", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "providerBond": "4000000000000000" + }, + "blockNumber": 4446342, + "blockHash": "0xa81e65065cd3c472cc571c64035031c66e975906a92e5b88acba4a6e08c9d7a1", + "timestamp": 1790959761, + "txHash": "0xfcfc913a260d29b519276a484199d372ed39aac81005166e5231025bf948d35b", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "ResultSubmitted", + "args": { + "id": "6", + "resultHash": "0x2dea74737284c05166223abbb28b3eaf367e8964a5a12bffa0ab4bd1e2b300ae", + "result": "0x7b22646967657374223a22307865656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565222c226974657273223a32303030302c2273656564223a22307835646532353538363237666363653664393533623161373033353866313637633962333634666339343461343566653037343161626330633062386434326365222c227461736b223a226b656363616b2d636861696e227d" + }, + "blockNumber": 4446353, + "blockHash": "0xd4d23bd3f6d3883330ff25de0a81696c0e9ba473c5457b918c5aa82e55601777", + "timestamp": 1790959767, + "txHash": "0x5f921a8d67de79bfcfd4d77085fa220d5ecc4191631a7e4dc050e003e612c6c6", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "JobDisputed", + "args": { + "id": "6", + "challenger": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "bond": "4000000000000000", + "recomputedResultHash": "0xb37eb93d1b69a562f94bb2de482a0a4dd3e04493d3020cb29eeef8df82c713c3" + }, + "blockNumber": 4446364, + "blockHash": "0xf6a3e7e6f51312f624cbed5251b0c5abe05f9bd2b1d255ec8fe65114d408311c", + "timestamp": 1790959862, + "txHash": "0x72c54a067ebf1341a588db66f61223a28d7f6977bc60ab8eff5e59e008ddf8de", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobSlashed", + "args": { + "id": "6", + "challenger": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "slashedProviderBond": "4000000000000000" + }, + "blockNumber": 4446375, + "blockHash": "0xf5aa67bf1e48b8fc8a8ff44b794b0f9cd501f45d10b7979b7b5fdc37e9d70a9a", + "timestamp": 1790959780, + "txHash": "0x7b1916485981fef836d5f43c3d8c4528678931f78d4b3110859198c630e5e69f", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 0 + }, + { + "name": "DisputeResolved", + "args": { + "id": "6", + "providerWon": false + }, + "blockNumber": 4446375, + "blockHash": "0xf5aa67bf1e48b8fc8a8ff44b794b0f9cd501f45d10b7979b7b5fdc37e9d70a9a", + "timestamp": 1790959780, + "txHash": "0x7b1916485981fef836d5f43c3d8c4528678931f78d4b3110859198c630e5e69f", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 1 + } + ], + "result": "0x7b22646967657374223a22307865656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565222c226974657273223a32303030302c2273656564223a22307835646532353538363237666363653664393533623161373033353866313637633962333634666339343461343566653037343161626330633062386434326365222c227461736b223a226b656363616b2d636861696e227d" + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "market.window" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s3-paid-after-dispute-replayed.valid.json b/conformance/vectori/market-timeline/s3-paid-after-dispute-replayed.valid.json new file mode 100644 index 0000000..2ad1da1 --- /dev/null +++ b/conformance/vectori/market-timeline/s3-paid-after-dispute-replayed.valid.json @@ -0,0 +1,162 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s3-paid-after-dispute-replayed.valid", + "artifact": "market-timeline", + "title": "the same timeline with the public task: the judge recomputes it and agrees with the arbiter", + "source": "recorded (market-settlement, 2026-10-02), scenario S3", + "requires": [], + "exercises": [ + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": null, + "mutation": null, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "7", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0x33d4d459ac50fbf9089cfbbdf51416f7f9d8fd8794f03f4788bef4b679be0e06", + "resultHash": "0x20595189a5aae95406d466972f780d5b04408146e30afdcc66449836a67b240a", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 5, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790960390, + "challengeWindow": 90, + "submittedAt": 1790959804, + "disputedAt": 1790959809 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "7", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0x33d4d459ac50fbf9089cfbbdf51416f7f9d8fd8794f03f4788bef4b679be0e06", + "deadline": "1790960390", + "pqcSettlement": false + }, + "blockNumber": 4446395, + "blockHash": "0xdaec8217b35341244eb65c7a06bc6d817c44888c0e2c673d2278091e7c308a83", + "timestamp": 1790959791, + "txHash": "0x8c0ab87432b8e3e4b8a53f9ef3fd9d217e214f106ff637368ab75f0ed68c300d", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobClaimed", + "args": { + "id": "7", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "providerBond": "4000000000000000" + }, + "blockNumber": 4446404, + "blockHash": "0x31141aeb86c3bc3f7f3e0b493aa69a2a4d2e1952c09181f2ed3bc8e32b062c97", + "timestamp": 1790959797, + "txHash": "0x78e05e10e9b9aca97b0e26ce9e868dd017b57fcce4248bf65701b06ed44d1d1a", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "ResultSubmitted", + "args": { + "id": "7", + "resultHash": "0x20595189a5aae95406d466972f780d5b04408146e30afdcc66449836a67b240a", + "result": "0x7b22646967657374223a22307838613832333664613464396231373164613863643538643832373738376535656539323739316533643262353665313537383163313938336363326464396531222c226974657273223a32303030302c2273656564223a22307835336332636462336533653661373430633966643838303063636139643530656338343638316237366635353437633235333630393064623736323462303964222c227461736b223a226b656363616b2d636861696e227d" + }, + "blockNumber": 4446415, + "blockHash": "0x27d0fdbd6383be65aa8549cae7f87436255111ccb57597f92f0eb78a8c568d20", + "timestamp": 1790959804, + "txHash": "0xf4b8f42fa5cad3827bbe234348b687dfec24d0b3e55f5ae162d66891239353e8", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "JobDisputed", + "args": { + "id": "7", + "challenger": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "bond": "4000000000000000", + "recomputedResultHash": "0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" + }, + "blockNumber": 4446425, + "blockHash": "0x42ff0ad6b3187d212824c078f5cbb09cae1f67e5d762b1500053d34188da73e4", + "timestamp": 1790959809, + "txHash": "0x8595234a75d21301720a71505d4aff1046b8a73171da9bf24d245b5512911cd2", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobPaid", + "args": { + "id": "7", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "bondReturned": "4000000000000000" + }, + "blockNumber": 4446436, + "blockHash": "0x0e01a68f00de85f42a89054e785755699653ca065746982b153565be3051c2fd", + "timestamp": 1790959815, + "txHash": "0x7eb96d3a9703668a275d233daeb829435e6eb08fdb30f9179f0ed806b2926e8e", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 0 + }, + { + "name": "DisputeResolved", + "args": { + "id": "7", + "providerWon": true + }, + "blockNumber": 4446436, + "blockHash": "0x0e01a68f00de85f42a89054e785755699653ca065746982b153565be3051c2fd", + "timestamp": 1790959815, + "txHash": "0x7eb96d3a9703668a275d233daeb829435e6eb08fdb30f9179f0ed806b2926e8e", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 1 + } + ], + "result": "0x7b22646967657374223a22307838613832333664613464396231373164613863643538643832373738376535656539323739316533643262353665313537383163313938336363326464396531222c226974657273223a32303030302c2273656564223a22307835336332636462336533653661373430633966643838303063636139643530656338343638316237366635353437633235333630393064623736323462303964222c227461736b223a226b656363616b2d636861696e227d", + "spec": { + "task": "keccak-chain", + "seed": "0x53c2cdb3e3e6a740c9fd8800cca9d50ec84681b76f5547c2536090db7624b09d", + "iters": 20000 + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s3-paid-after-dispute.valid.json b/conformance/vectori/market-timeline/s3-paid-after-dispute.valid.json new file mode 100644 index 0000000..10cd305 --- /dev/null +++ b/conformance/vectori/market-timeline/s3-paid-after-dispute.valid.json @@ -0,0 +1,157 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s3-paid-after-dispute.valid", + "artifact": "market-timeline", + "title": "a dispute the provider won", + "source": "recorded (market-settlement, 2026-10-02), scenario S3", + "requires": [], + "exercises": [ + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": null, + "mutation": null, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "7", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0x33d4d459ac50fbf9089cfbbdf51416f7f9d8fd8794f03f4788bef4b679be0e06", + "resultHash": "0x20595189a5aae95406d466972f780d5b04408146e30afdcc66449836a67b240a", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 5, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790960390, + "challengeWindow": 90, + "submittedAt": 1790959804, + "disputedAt": 1790959809 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "7", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0x33d4d459ac50fbf9089cfbbdf51416f7f9d8fd8794f03f4788bef4b679be0e06", + "deadline": "1790960390", + "pqcSettlement": false + }, + "blockNumber": 4446395, + "blockHash": "0xdaec8217b35341244eb65c7a06bc6d817c44888c0e2c673d2278091e7c308a83", + "timestamp": 1790959791, + "txHash": "0x8c0ab87432b8e3e4b8a53f9ef3fd9d217e214f106ff637368ab75f0ed68c300d", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobClaimed", + "args": { + "id": "7", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "providerBond": "4000000000000000" + }, + "blockNumber": 4446404, + "blockHash": "0x31141aeb86c3bc3f7f3e0b493aa69a2a4d2e1952c09181f2ed3bc8e32b062c97", + "timestamp": 1790959797, + "txHash": "0x78e05e10e9b9aca97b0e26ce9e868dd017b57fcce4248bf65701b06ed44d1d1a", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "ResultSubmitted", + "args": { + "id": "7", + "resultHash": "0x20595189a5aae95406d466972f780d5b04408146e30afdcc66449836a67b240a", + "result": "0x7b22646967657374223a22307838613832333664613464396231373164613863643538643832373738376535656539323739316533643262353665313537383163313938336363326464396531222c226974657273223a32303030302c2273656564223a22307835336332636462336533653661373430633966643838303063636139643530656338343638316237366635353437633235333630393064623736323462303964222c227461736b223a226b656363616b2d636861696e227d" + }, + "blockNumber": 4446415, + "blockHash": "0x27d0fdbd6383be65aa8549cae7f87436255111ccb57597f92f0eb78a8c568d20", + "timestamp": 1790959804, + "txHash": "0xf4b8f42fa5cad3827bbe234348b687dfec24d0b3e55f5ae162d66891239353e8", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "JobDisputed", + "args": { + "id": "7", + "challenger": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "bond": "4000000000000000", + "recomputedResultHash": "0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" + }, + "blockNumber": 4446425, + "blockHash": "0x42ff0ad6b3187d212824c078f5cbb09cae1f67e5d762b1500053d34188da73e4", + "timestamp": 1790959809, + "txHash": "0x8595234a75d21301720a71505d4aff1046b8a73171da9bf24d245b5512911cd2", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobPaid", + "args": { + "id": "7", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "bondReturned": "4000000000000000" + }, + "blockNumber": 4446436, + "blockHash": "0x0e01a68f00de85f42a89054e785755699653ca065746982b153565be3051c2fd", + "timestamp": 1790959815, + "txHash": "0x7eb96d3a9703668a275d233daeb829435e6eb08fdb30f9179f0ed806b2926e8e", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 0 + }, + { + "name": "DisputeResolved", + "args": { + "id": "7", + "providerWon": true + }, + "blockNumber": 4446436, + "blockHash": "0x0e01a68f00de85f42a89054e785755699653ca065746982b153565be3051c2fd", + "timestamp": 1790959815, + "txHash": "0x7eb96d3a9703668a275d233daeb829435e6eb08fdb30f9179f0ed806b2926e8e", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 1 + } + ], + "result": "0x7b22646967657374223a22307838613832333664613464396231373164613863643538643832373738376535656539323739316533643262353665313537383163313938336363326464396531222c226974657273223a32303030302c2273656564223a22307835336332636462336533653661373430633966643838303063636139643530656338343638316237366635353437633235333630393064623736323462303964222c227461736b223a226b656363616b2d636861696e227d" + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s3.arbiter-no-dispute.json b/conformance/vectori/market-timeline/s3.arbiter-no-dispute.json new file mode 100644 index 0000000..39327d0 --- /dev/null +++ b/conformance/vectori/market-timeline/s3.arbiter-no-dispute.json @@ -0,0 +1,151 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s3.arbiter-no-dispute", + "artifact": "market-timeline", + "title": "the dispute withheld from the timeline: a resolution with no dispute, and an event the job state implies is missing", + "source": "derived from market-timeline/s3-paid-after-dispute.valid", + "requires": [], + "exercises": [ + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": "market-timeline/s3-paid-after-dispute.valid", + "mutation": { + "op": "remove", + "path": [ + "events", + 3 + ] + }, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "7", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0x33d4d459ac50fbf9089cfbbdf51416f7f9d8fd8794f03f4788bef4b679be0e06", + "resultHash": "0x20595189a5aae95406d466972f780d5b04408146e30afdcc66449836a67b240a", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 5, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790960390, + "challengeWindow": 90, + "submittedAt": 1790959804, + "disputedAt": 1790959809 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "7", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0x33d4d459ac50fbf9089cfbbdf51416f7f9d8fd8794f03f4788bef4b679be0e06", + "deadline": "1790960390", + "pqcSettlement": false + }, + "blockNumber": 4446395, + "blockHash": "0xdaec8217b35341244eb65c7a06bc6d817c44888c0e2c673d2278091e7c308a83", + "timestamp": 1790959791, + "txHash": "0x8c0ab87432b8e3e4b8a53f9ef3fd9d217e214f106ff637368ab75f0ed68c300d", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobClaimed", + "args": { + "id": "7", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "providerBond": "4000000000000000" + }, + "blockNumber": 4446404, + "blockHash": "0x31141aeb86c3bc3f7f3e0b493aa69a2a4d2e1952c09181f2ed3bc8e32b062c97", + "timestamp": 1790959797, + "txHash": "0x78e05e10e9b9aca97b0e26ce9e868dd017b57fcce4248bf65701b06ed44d1d1a", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "ResultSubmitted", + "args": { + "id": "7", + "resultHash": "0x20595189a5aae95406d466972f780d5b04408146e30afdcc66449836a67b240a", + "result": "0x7b22646967657374223a22307838613832333664613464396231373164613863643538643832373738376535656539323739316533643262353665313537383163313938336363326464396531222c226974657273223a32303030302c2273656564223a22307835336332636462336533653661373430633966643838303063636139643530656338343638316237366635353437633235333630393064623736323462303964222c227461736b223a226b656363616b2d636861696e227d" + }, + "blockNumber": 4446415, + "blockHash": "0x27d0fdbd6383be65aa8549cae7f87436255111ccb57597f92f0eb78a8c568d20", + "timestamp": 1790959804, + "txHash": "0xf4b8f42fa5cad3827bbe234348b687dfec24d0b3e55f5ae162d66891239353e8", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "JobPaid", + "args": { + "id": "7", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "bondReturned": "4000000000000000" + }, + "blockNumber": 4446436, + "blockHash": "0x0e01a68f00de85f42a89054e785755699653ca065746982b153565be3051c2fd", + "timestamp": 1790959815, + "txHash": "0x7eb96d3a9703668a275d233daeb829435e6eb08fdb30f9179f0ed806b2926e8e", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 0 + }, + { + "name": "DisputeResolved", + "args": { + "id": "7", + "providerWon": true + }, + "blockNumber": 4446436, + "blockHash": "0x0e01a68f00de85f42a89054e785755699653ca065746982b153565be3051c2fd", + "timestamp": 1790959815, + "txHash": "0x7eb96d3a9703668a275d233daeb829435e6eb08fdb30f9179f0ed806b2926e8e", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 1 + } + ], + "result": "0x7b22646967657374223a22307838613832333664613464396231373164613863643538643832373738376535656539323739316533643262353665313537383163313938336363326464396531222c226974657273223a32303030302c2273656564223a22307835336332636462336533653661373430633966643838303063636139643530656338343638316237366635353437633235333630393064623736323462303964222c227461736b223a226b656363616b2d636861696e227d" + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "market.arbiter", + "market.complete" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s3.payout.json b/conformance/vectori/market-timeline/s3.payout.json new file mode 100644 index 0000000..ff2daf8 --- /dev/null +++ b/conformance/vectori/market-timeline/s3.payout.json @@ -0,0 +1,168 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s3.payout", + "artifact": "market-timeline", + "title": "the payout names someone who is not the provider", + "source": "derived from market-timeline/s3-paid-after-dispute.valid", + "requires": [], + "exercises": [ + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": "market-timeline/s3-paid-after-dispute.valid", + "mutation": { + "op": "set", + "path": [ + "events", + 4, + "args", + "provider" + ], + "value": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF" + }, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "7", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0x33d4d459ac50fbf9089cfbbdf51416f7f9d8fd8794f03f4788bef4b679be0e06", + "resultHash": "0x20595189a5aae95406d466972f780d5b04408146e30afdcc66449836a67b240a", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 5, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790960390, + "challengeWindow": 90, + "submittedAt": 1790959804, + "disputedAt": 1790959809 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "7", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0x33d4d459ac50fbf9089cfbbdf51416f7f9d8fd8794f03f4788bef4b679be0e06", + "deadline": "1790960390", + "pqcSettlement": false + }, + "blockNumber": 4446395, + "blockHash": "0xdaec8217b35341244eb65c7a06bc6d817c44888c0e2c673d2278091e7c308a83", + "timestamp": 1790959791, + "txHash": "0x8c0ab87432b8e3e4b8a53f9ef3fd9d217e214f106ff637368ab75f0ed68c300d", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobClaimed", + "args": { + "id": "7", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "providerBond": "4000000000000000" + }, + "blockNumber": 4446404, + "blockHash": "0x31141aeb86c3bc3f7f3e0b493aa69a2a4d2e1952c09181f2ed3bc8e32b062c97", + "timestamp": 1790959797, + "txHash": "0x78e05e10e9b9aca97b0e26ce9e868dd017b57fcce4248bf65701b06ed44d1d1a", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "ResultSubmitted", + "args": { + "id": "7", + "resultHash": "0x20595189a5aae95406d466972f780d5b04408146e30afdcc66449836a67b240a", + "result": "0x7b22646967657374223a22307838613832333664613464396231373164613863643538643832373738376535656539323739316533643262353665313537383163313938336363326464396531222c226974657273223a32303030302c2273656564223a22307835336332636462336533653661373430633966643838303063636139643530656338343638316237366635353437633235333630393064623736323462303964222c227461736b223a226b656363616b2d636861696e227d" + }, + "blockNumber": 4446415, + "blockHash": "0x27d0fdbd6383be65aa8549cae7f87436255111ccb57597f92f0eb78a8c568d20", + "timestamp": 1790959804, + "txHash": "0xf4b8f42fa5cad3827bbe234348b687dfec24d0b3e55f5ae162d66891239353e8", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "JobDisputed", + "args": { + "id": "7", + "challenger": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "bond": "4000000000000000", + "recomputedResultHash": "0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" + }, + "blockNumber": 4446425, + "blockHash": "0x42ff0ad6b3187d212824c078f5cbb09cae1f67e5d762b1500053d34188da73e4", + "timestamp": 1790959809, + "txHash": "0x8595234a75d21301720a71505d4aff1046b8a73171da9bf24d245b5512911cd2", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobPaid", + "args": { + "id": "7", + "provider": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "bondReturned": "4000000000000000" + }, + "blockNumber": 4446436, + "blockHash": "0x0e01a68f00de85f42a89054e785755699653ca065746982b153565be3051c2fd", + "timestamp": 1790959815, + "txHash": "0x7eb96d3a9703668a275d233daeb829435e6eb08fdb30f9179f0ed806b2926e8e", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 0 + }, + { + "name": "DisputeResolved", + "args": { + "id": "7", + "providerWon": true + }, + "blockNumber": 4446436, + "blockHash": "0x0e01a68f00de85f42a89054e785755699653ca065746982b153565be3051c2fd", + "timestamp": 1790959815, + "txHash": "0x7eb96d3a9703668a275d233daeb829435e6eb08fdb30f9179f0ed806b2926e8e", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 1 + } + ], + "result": "0x7b22646967657374223a22307838613832333664613464396231373164613863643538643832373738376535656539323739316533643262353665313537383163313938336363326464396531222c226974657273223a32303030302c2273656564223a22307835336332636462336533653661373430633966643838303063636139643530656338343638316237366635353437633235333630393064623736323462303964222c227461736b223a226b656363616b2d636861696e227d" + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "market.payout" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s3.replay.json b/conformance/vectori/market-timeline/s3.replay.json new file mode 100644 index 0000000..d7ae063 --- /dev/null +++ b/conformance/vectori/market-timeline/s3.replay.json @@ -0,0 +1,171 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s3.replay", + "artifact": "market-timeline", + "title": "another task shown than the one the job committed to: the recomputation contradicts the arbiter", + "source": "derived from market-timeline/s3-paid-after-dispute-replayed.valid", + "requires": [], + "exercises": [ + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": "market-timeline/s3-paid-after-dispute-replayed.valid", + "mutation": { + "op": "set", + "path": [ + "spec", + "seed" + ], + "value": "0xabababababababababababababababababababababababababababababababab" + }, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "7", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0x33d4d459ac50fbf9089cfbbdf51416f7f9d8fd8794f03f4788bef4b679be0e06", + "resultHash": "0x20595189a5aae95406d466972f780d5b04408146e30afdcc66449836a67b240a", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 5, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790960390, + "challengeWindow": 90, + "submittedAt": 1790959804, + "disputedAt": 1790959809 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "7", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0x33d4d459ac50fbf9089cfbbdf51416f7f9d8fd8794f03f4788bef4b679be0e06", + "deadline": "1790960390", + "pqcSettlement": false + }, + "blockNumber": 4446395, + "blockHash": "0xdaec8217b35341244eb65c7a06bc6d817c44888c0e2c673d2278091e7c308a83", + "timestamp": 1790959791, + "txHash": "0x8c0ab87432b8e3e4b8a53f9ef3fd9d217e214f106ff637368ab75f0ed68c300d", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobClaimed", + "args": { + "id": "7", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "providerBond": "4000000000000000" + }, + "blockNumber": 4446404, + "blockHash": "0x31141aeb86c3bc3f7f3e0b493aa69a2a4d2e1952c09181f2ed3bc8e32b062c97", + "timestamp": 1790959797, + "txHash": "0x78e05e10e9b9aca97b0e26ce9e868dd017b57fcce4248bf65701b06ed44d1d1a", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "ResultSubmitted", + "args": { + "id": "7", + "resultHash": "0x20595189a5aae95406d466972f780d5b04408146e30afdcc66449836a67b240a", + "result": "0x7b22646967657374223a22307838613832333664613464396231373164613863643538643832373738376535656539323739316533643262353665313537383163313938336363326464396531222c226974657273223a32303030302c2273656564223a22307835336332636462336533653661373430633966643838303063636139643530656338343638316237366635353437633235333630393064623736323462303964222c227461736b223a226b656363616b2d636861696e227d" + }, + "blockNumber": 4446415, + "blockHash": "0x27d0fdbd6383be65aa8549cae7f87436255111ccb57597f92f0eb78a8c568d20", + "timestamp": 1790959804, + "txHash": "0xf4b8f42fa5cad3827bbe234348b687dfec24d0b3e55f5ae162d66891239353e8", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "JobDisputed", + "args": { + "id": "7", + "challenger": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "bond": "4000000000000000", + "recomputedResultHash": "0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" + }, + "blockNumber": 4446425, + "blockHash": "0x42ff0ad6b3187d212824c078f5cbb09cae1f67e5d762b1500053d34188da73e4", + "timestamp": 1790959809, + "txHash": "0x8595234a75d21301720a71505d4aff1046b8a73171da9bf24d245b5512911cd2", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobPaid", + "args": { + "id": "7", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "bondReturned": "4000000000000000" + }, + "blockNumber": 4446436, + "blockHash": "0x0e01a68f00de85f42a89054e785755699653ca065746982b153565be3051c2fd", + "timestamp": 1790959815, + "txHash": "0x7eb96d3a9703668a275d233daeb829435e6eb08fdb30f9179f0ed806b2926e8e", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 0 + }, + { + "name": "DisputeResolved", + "args": { + "id": "7", + "providerWon": true + }, + "blockNumber": 4446436, + "blockHash": "0x0e01a68f00de85f42a89054e785755699653ca065746982b153565be3051c2fd", + "timestamp": 1790959815, + "txHash": "0x7eb96d3a9703668a275d233daeb829435e6eb08fdb30f9179f0ed806b2926e8e", + "from": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "logIndex": 1 + } + ], + "result": "0x7b22646967657374223a22307838613832333664613464396231373164613863643538643832373738376535656539323739316533643262353665313537383163313938336363326464396531222c226974657273223a32303030302c2273656564223a22307835336332636462336533653661373430633966643838303063636139643530656338343638316237366635353437633235333630393064623736323462303964222c227461736b223a226b656363616b2d636861696e227d", + "spec": { + "task": "keccak-chain", + "seed": "0xabababababababababababababababababababababababababababababababab", + "iters": 20000 + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "market.replay" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s4-refunded-expired.valid.json b/conformance/vectori/market-timeline/s4-refunded-expired.valid.json new file mode 100644 index 0000000..a56f11d --- /dev/null +++ b/conformance/vectori/market-timeline/s4-refunded-expired.valid.json @@ -0,0 +1,114 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s4-refunded-expired.valid", + "artifact": "market-timeline", + "title": "claimed and never delivered: the escrow reclaimed after the deadline", + "source": "recorded (market-settlement, 2026-10-02), scenario S4", + "requires": [], + "exercises": [ + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": null, + "mutation": null, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "8", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0xe39172c8a9a6c56862bc48d25c2b20f56c585d165d8140b9cd18da9784f1f5cd", + "resultHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 6, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790959871, + "challengeWindow": 90, + "submittedAt": 0, + "disputedAt": 0 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "8", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0xe39172c8a9a6c56862bc48d25c2b20f56c585d165d8140b9cd18da9784f1f5cd", + "deadline": "1790959871", + "pqcSettlement": false + }, + "blockNumber": 4446456, + "blockHash": "0x4f912d1702c83e1c6fdd864b75471c8f30a69f37d8decdbf121415285c94492f", + "timestamp": 1790959827, + "txHash": "0x2129c617c59cf4fce4f0bb03cfd4d1d97ff2ea256be637f553dd63093dc2cee9", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobClaimed", + "args": { + "id": "8", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "providerBond": "4000000000000000" + }, + "blockNumber": 4446459, + "blockHash": "0x5e3fb425890cf5d8e65b0992db0b872cb06b62df2d3dbe404b1e73b805891df6", + "timestamp": 1790959829, + "txHash": "0x351e7248fc153fd6f46f1d5fd2480ec6428b1ce351b35232b9099d5e1cd6aec3", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "JobRefunded", + "args": { + "id": "8", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000" + }, + "blockNumber": 4446540, + "blockHash": "0x269e3df7ecdcc85db01e702814eb766d235233eee90c0182179ddf7307c32cab", + "timestamp": 1790959877, + "txHash": "0xf041b9338843a0727acca19c794d940ec7d13df17dd17d88cc1c48da740c0a03", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + } + ], + "result": null + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s4.complete-claim.json b/conformance/vectori/market-timeline/s4.complete-claim.json new file mode 100644 index 0000000..0d5be77 --- /dev/null +++ b/conformance/vectori/market-timeline/s4.complete-claim.json @@ -0,0 +1,108 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s4.complete-claim", + "artifact": "market-timeline", + "title": "the claim withheld from the timeline (the job state names a provider)", + "source": "derived from market-timeline/s4-refunded-expired.valid", + "requires": [], + "exercises": [ + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": "market-timeline/s4-refunded-expired.valid", + "mutation": { + "op": "remove", + "path": [ + "events", + 1 + ] + }, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "8", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0xe39172c8a9a6c56862bc48d25c2b20f56c585d165d8140b9cd18da9784f1f5cd", + "resultHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 6, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790959871, + "challengeWindow": 90, + "submittedAt": 0, + "disputedAt": 0 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "8", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0xe39172c8a9a6c56862bc48d25c2b20f56c585d165d8140b9cd18da9784f1f5cd", + "deadline": "1790959871", + "pqcSettlement": false + }, + "blockNumber": 4446456, + "blockHash": "0x4f912d1702c83e1c6fdd864b75471c8f30a69f37d8decdbf121415285c94492f", + "timestamp": 1790959827, + "txHash": "0x2129c617c59cf4fce4f0bb03cfd4d1d97ff2ea256be637f553dd63093dc2cee9", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobRefunded", + "args": { + "id": "8", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000" + }, + "blockNumber": 4446540, + "blockHash": "0x269e3df7ecdcc85db01e702814eb766d235233eee90c0182179ddf7307c32cab", + "timestamp": 1790959877, + "txHash": "0xf041b9338843a0727acca19c794d940ec7d13df17dd17d88cc1c48da740c0a03", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + } + ], + "result": null + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "market.complete" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s4.deadline.json b/conformance/vectori/market-timeline/s4.deadline.json new file mode 100644 index 0000000..34f47a1 --- /dev/null +++ b/conformance/vectori/market-timeline/s4.deadline.json @@ -0,0 +1,124 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s4.deadline", + "artifact": "market-timeline", + "title": "the escrow was reclaimed as expired before the deadline", + "source": "derived from market-timeline/s4-refunded-expired.valid", + "requires": [], + "exercises": [ + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": "market-timeline/s4-refunded-expired.valid", + "mutation": { + "op": "set", + "path": [ + "events", + 2, + "timestamp" + ], + "value": 1790959870 + }, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "8", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0xe39172c8a9a6c56862bc48d25c2b20f56c585d165d8140b9cd18da9784f1f5cd", + "resultHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 6, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790959871, + "challengeWindow": 90, + "submittedAt": 0, + "disputedAt": 0 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "8", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0xe39172c8a9a6c56862bc48d25c2b20f56c585d165d8140b9cd18da9784f1f5cd", + "deadline": "1790959871", + "pqcSettlement": false + }, + "blockNumber": 4446456, + "blockHash": "0x4f912d1702c83e1c6fdd864b75471c8f30a69f37d8decdbf121415285c94492f", + "timestamp": 1790959827, + "txHash": "0x2129c617c59cf4fce4f0bb03cfd4d1d97ff2ea256be637f553dd63093dc2cee9", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobClaimed", + "args": { + "id": "8", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "providerBond": "4000000000000000" + }, + "blockNumber": 4446459, + "blockHash": "0x5e3fb425890cf5d8e65b0992db0b872cb06b62df2d3dbe404b1e73b805891df6", + "timestamp": 1790959829, + "txHash": "0x351e7248fc153fd6f46f1d5fd2480ec6428b1ce351b35232b9099d5e1cd6aec3", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "JobRefunded", + "args": { + "id": "8", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000" + }, + "blockNumber": 4446540, + "blockHash": "0x269e3df7ecdcc85db01e702814eb766d235233eee90c0182179ddf7307c32cab", + "timestamp": 1790959870, + "txHash": "0xf041b9338843a0727acca19c794d940ec7d13df17dd17d88cc1c48da740c0a03", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + } + ], + "result": null + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "market.deadline" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s4.payout.json b/conformance/vectori/market-timeline/s4.payout.json new file mode 100644 index 0000000..61d4410 --- /dev/null +++ b/conformance/vectori/market-timeline/s4.payout.json @@ -0,0 +1,125 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s4.payout", + "artifact": "market-timeline", + "title": "the refund names someone who is not the requester", + "source": "derived from market-timeline/s4-refunded-expired.valid", + "requires": [], + "exercises": [ + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": "market-timeline/s4-refunded-expired.valid", + "mutation": { + "op": "set", + "path": [ + "events", + 2, + "args", + "requester" + ], + "value": "0xeC2261CECBB06768F6db095822b429AF5c861E2e" + }, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "8", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0xe39172c8a9a6c56862bc48d25c2b20f56c585d165d8140b9cd18da9784f1f5cd", + "resultHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 6, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790959871, + "challengeWindow": 90, + "submittedAt": 0, + "disputedAt": 0 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "8", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0xe39172c8a9a6c56862bc48d25c2b20f56c585d165d8140b9cd18da9784f1f5cd", + "deadline": "1790959871", + "pqcSettlement": false + }, + "blockNumber": 4446456, + "blockHash": "0x4f912d1702c83e1c6fdd864b75471c8f30a69f37d8decdbf121415285c94492f", + "timestamp": 1790959827, + "txHash": "0x2129c617c59cf4fce4f0bb03cfd4d1d97ff2ea256be637f553dd63093dc2cee9", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobClaimed", + "args": { + "id": "8", + "provider": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "providerBond": "4000000000000000" + }, + "blockNumber": 4446459, + "blockHash": "0x5e3fb425890cf5d8e65b0992db0b872cb06b62df2d3dbe404b1e73b805891df6", + "timestamp": 1790959829, + "txHash": "0x351e7248fc153fd6f46f1d5fd2480ec6428b1ce351b35232b9099d5e1cd6aec3", + "from": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "logIndex": 0 + }, + { + "name": "JobRefunded", + "args": { + "id": "8", + "requester": "0xeC2261CECBB06768F6db095822b429AF5c861E2e", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000" + }, + "blockNumber": 4446540, + "blockHash": "0x269e3df7ecdcc85db01e702814eb766d235233eee90c0182179ddf7307c32cab", + "timestamp": 1790959877, + "txHash": "0xf041b9338843a0727acca19c794d940ec7d13df17dd17d88cc1c48da740c0a03", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + } + ], + "result": null + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "market.payout" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s5-refunded-cancelled.valid.json b/conformance/vectori/market-timeline/s5-refunded-cancelled.valid.json new file mode 100644 index 0000000..8d14a1f --- /dev/null +++ b/conformance/vectori/market-timeline/s5-refunded-cancelled.valid.json @@ -0,0 +1,100 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s5-refunded-cancelled.valid", + "artifact": "market-timeline", + "title": "posted and cancelled: the escrow returned", + "source": "recorded (market-settlement, 2026-10-02), scenario S5", + "requires": [], + "exercises": [ + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": null, + "mutation": null, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "9", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0x0000000000000000000000000000000000000000", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0xac9d0a395f1ae6e8ca7adebdd44e4454000c349e80feba2c16dc3e0749c9a9b7", + "resultHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 6, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790959916, + "challengeWindow": 90, + "submittedAt": 0, + "disputedAt": 0 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "9", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0xac9d0a395f1ae6e8ca7adebdd44e4454000c349e80feba2c16dc3e0749c9a9b7", + "deadline": "1790959916", + "pqcSettlement": false + }, + "blockNumber": 4446558, + "blockHash": "0xb3512a658a8969ec6e6516d19c9bd9d2c99134cc3d654ba5afac6da85ffe363f", + "timestamp": 1790959888, + "txHash": "0x5aba1b174fd5948b8ff555f0b4d4584607145914eec3ed1bdde00072d31ee1af", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobRefunded", + "args": { + "id": "9", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000" + }, + "blockNumber": 4446614, + "blockHash": "0x6cb797489059f864e1e57a687cde487c0f8765945688cd673879c36e8be7e0e3", + "timestamp": 1790959920, + "txHash": "0xe13b6cdbb7bb49c2d74235eb3c014f793a9d62df079235a19adbe9c66020de21", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + } + ], + "result": null + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/market-timeline/s5.form.json b/conformance/vectori/market-timeline/s5.form.json new file mode 100644 index 0000000..c517b6c --- /dev/null +++ b/conformance/vectori/market-timeline/s5.form.json @@ -0,0 +1,110 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "market-timeline/s5.form", + "artifact": "market-timeline", + "title": "an event whose time is not a whole number of seconds", + "source": "derived from market-timeline/s5-refunded-cancelled.valid", + "requires": [], + "exercises": [ + "market.arbiter", + "market.complete", + "market.deadline", + "market.form", + "market.payout", + "market.posting", + "market.proof", + "market.replay", + "market.result", + "market.window" + ], + "base": "market-timeline/s5-refunded-cancelled.valid", + "mutation": { + "op": "set", + "path": [ + "events", + 0, + "timestamp" + ], + "value": 1790959888.5 + }, + "input": { + "chainId": 28001, + "market": "0x4145d6f639436d840957F2D4B9f2e73f34F56B5D", + "jobId": "9", + "constants": { + "arbiter": "0x5521aC7371Afdbf6BE986B46Da4116fb256d9e58", + "governance": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "arbitrationTimeout": 1209600, + "zkVerifier": "0x70099E62735500AA2F85B60C518551a57B202d54", + "pinnedProofSelector": "0x4388a21c" + }, + "job": { + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "provider": "0x0000000000000000000000000000000000000000", + "token": "0x0000000000000000000000000000000000000000", + "reward": "0", + "providerBond": "0", + "specHash": "0xac9d0a395f1ae6e8ca7adebdd44e4454000c349e80feba2c16dc3e0749c9a9b7", + "resultHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "zkProgramVKey": "0x0000000000000000000000000000000000000000000000000000000000000000", + "mode": 0, + "status": 6, + "pqcSettlement": false, + "offchainResult": false, + "deadline": 1790959916, + "challengeWindow": 90, + "submittedAt": 0, + "disputedAt": 0 + }, + "events": [ + { + "name": "JobPosted", + "args": { + "id": "9", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000", + "mode": "0", + "specHash": "0xac9d0a395f1ae6e8ca7adebdd44e4454000c349e80feba2c16dc3e0749c9a9b7", + "deadline": "1790959916", + "pqcSettlement": false + }, + "blockNumber": 4446558, + "blockHash": "0xb3512a658a8969ec6e6516d19c9bd9d2c99134cc3d654ba5afac6da85ffe363f", + "timestamp": 1790959888.5, + "txHash": "0x5aba1b174fd5948b8ff555f0b4d4584607145914eec3ed1bdde00072d31ee1af", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + }, + { + "name": "JobRefunded", + "args": { + "id": "9", + "requester": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "token": "0x0000000000000000000000000000000000000000", + "reward": "10000000000000000" + }, + "blockNumber": 4446614, + "blockHash": "0x6cb797489059f864e1e57a687cde487c0f8765945688cd673879c36e8be7e0e3", + "timestamp": 1790959920, + "txHash": "0xe13b6cdbb7bb49c2d74235eb3c014f793a9d62df079235a19adbe9c66020de21", + "from": "0x86D6C68408DDb2CC0d1cf4dFd6e07d3830600fAF", + "logIndex": 0 + } + ], + "result": null + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "market.form" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/payment-receipt/company-p1-28001.valid.json b/conformance/vectori/payment-receipt/company-p1-28001.valid.json new file mode 100644 index 0000000..c12b0ea --- /dev/null +++ b/conformance/vectori/payment-receipt/company-p1-28001.valid.json @@ -0,0 +1,173 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "payment-receipt/company-p1-28001.valid", + "artifact": "payment-receipt", + "title": "the notarized receipt judged with the chain: integrity, anchoring and finality in one verdict", + "source": "recorded (payments, 2026-10-02)", + "requires": [ + "rpc-28001" + ], + "exercises": [ + "envelope.finality", + "envelope.form", + "envelope.integrity", + "receipt.amount", + "receipt.binding", + "receipt.chain", + "receipt.policy", + "receipt.risk" + ], + "base": "payment-receipt/company-p1.valid", + "mutation": { + "op": "add", + "path": [ + "receipt", + "envelope", + "notarization" + ], + "value": { + "chainId": 28001, + "notary": "0x70099E62735500AA2F85B60C518551a57B202d54", + "firstSeen": 1790961411, + "txHash": "0x0c3ec57754dc3ab47221cb18c29be70099e3ca993fecd0c9de3b65ee0e1bba3b", + "block": 4449144 + } + }, + "input": { + "receipt": { + "instruction": { + "v": 1, + "kind": "aere-payment-receipt-instruction", + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "decimals": 18, + "amount": "400000000000000000", + "amountUsd": "0.200000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "txHash": "0xfd50a39264c2498e675edeaa45622b93244bb72b0f384380bc20840e3bb19cb6", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102", + "risk": { + "policyId": "payee-company-28001-2026-10-02", + "policyHash": "0x49c2478b8a5a5bc30dbfc8d2a10e1365126f1b10bc94beb67d678cd02d5bf390", + "inputsHash": "0xfc4cf1b16150c6a614c2184cd88673aa2b13b7fd6b56ec0bff1ec835b83afe13", + "verdictHash": "0xf3ed4242b45057c3569846e9168bab453702206578250810732351ce7f196f66", + "decision": "ALLOW", + "unmeasured": [ + "sanctions screening: no source consulted", + "identity or verification tier of the payer: none", + "device, session or location of the payer: none", + "chargeback or fraud history: none", + "the payer's payments outside this issuer's own receipts: none" + ] + }, + "purpose": "test purchase P1", + "issuedAt": "2026-10-02T17:16:49.250Z" + }, + "envelope": { + "v": 1, + "kind": "aere-proof-of-settlement-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-settlement", + "instructionHash": "0xd98c5c84b4994e7310f777a504df09925c6917363794d89cffd92beed2b12b78", + "txHash": "0xfd50a39264c2498e675edeaa45622b93244bb72b0f384380bc20840e3bb19cb6", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102", + "chainId": 28001, + "from": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "to": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "amount": "400000000000000000", + "asset": "native", + "createdAt": "2026-10-02T17:16:49.250Z" + }, + "statementHash": "0x1a76b3cfeab71bf185344b8c64571117c8194300bd969f48469f4a451bf51fa0", + "notarization": { + "chainId": 28001, + "notary": "0x70099E62735500AA2F85B60C518551a57B202d54", + "firstSeen": 1790961411, + "txHash": "0x0c3ec57754dc3ab47221cb18c29be70099e3ca993fecd0c9de3b65ee0e1bba3b", + "block": 4449144 + } + } + }, + "policy": { + "v": 1, + "kind": "aere-payment-risk-policy", + "id": "payee-company-28001-2026-10-02", + "currency": "USD", + "perPaymentMaxUsd": "1.000000", + "window": { + "seconds": 86400, + "maxUsd": "2.500000", + "maxCount": 3 + }, + "allowedAssets": [ + { + "chainId": 28001, + "asset": "native", + "decimals": 18 + } + ], + "refusedCounterparties": [ + { + "address": "0x0000000000000000000000000000000000000000", + "reason": "the zero address: funds sent there are unrecoverable", + "source": "measured on every EVM chain" + }, + { + "address": "0x4145d6f639436d840957f2d4b9f2e73f34f56b5d", + "reason": "a contract that only pays out through its own job flow (AereComputeMarketV3 on 28001): a plain transfer to it is lost", + "source": "tools/aere-market-settlement/desfasurare-28001.json" + }, + { + "address": "0x70099e62735500aa2f85b60c518551a57b202d54", + "reason": "a contract with no path to withdraw what is sent to it (AereNotary on 28001)", + "source": "contracts/deployments/notary-28001.json" + } + ], + "requireRate": true + }, + "inputs": { + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "amount": "400000000000000000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "identity": null, + "history": [], + "now": 1790961406 + }, + "tx": { + "from": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "to": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "value": "0x58d15e176280000", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102" + }, + "txReceipt": { + "status": "0x1", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102" + }, + "chain": 28001 + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "PASSED", + "finality": "PASSED" + } + } +} diff --git a/conformance/vectori/payment-receipt/company-p1-claim.partial.json b/conformance/vectori/payment-receipt/company-p1-claim.partial.json new file mode 100644 index 0000000..32cc6e1 --- /dev/null +++ b/conformance/vectori/payment-receipt/company-p1-claim.partial.json @@ -0,0 +1,170 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "payment-receipt/company-p1-claim.partial", + "artifact": "payment-receipt", + "title": "the notarized receipt judged offline: its notarization claim is not checked", + "source": "recorded (payments, 2026-10-02)", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity", + "receipt.amount", + "receipt.binding", + "receipt.chain", + "receipt.policy", + "receipt.risk" + ], + "base": "payment-receipt/company-p1.valid", + "mutation": { + "op": "add", + "path": [ + "receipt", + "envelope", + "notarization" + ], + "value": { + "chainId": 28001, + "notary": "0x70099E62735500AA2F85B60C518551a57B202d54", + "firstSeen": 1790961411, + "txHash": "0x0c3ec57754dc3ab47221cb18c29be70099e3ca993fecd0c9de3b65ee0e1bba3b", + "block": 4449144 + } + }, + "input": { + "receipt": { + "instruction": { + "v": 1, + "kind": "aere-payment-receipt-instruction", + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "decimals": 18, + "amount": "400000000000000000", + "amountUsd": "0.200000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "txHash": "0xfd50a39264c2498e675edeaa45622b93244bb72b0f384380bc20840e3bb19cb6", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102", + "risk": { + "policyId": "payee-company-28001-2026-10-02", + "policyHash": "0x49c2478b8a5a5bc30dbfc8d2a10e1365126f1b10bc94beb67d678cd02d5bf390", + "inputsHash": "0xfc4cf1b16150c6a614c2184cd88673aa2b13b7fd6b56ec0bff1ec835b83afe13", + "verdictHash": "0xf3ed4242b45057c3569846e9168bab453702206578250810732351ce7f196f66", + "decision": "ALLOW", + "unmeasured": [ + "sanctions screening: no source consulted", + "identity or verification tier of the payer: none", + "device, session or location of the payer: none", + "chargeback or fraud history: none", + "the payer's payments outside this issuer's own receipts: none" + ] + }, + "purpose": "test purchase P1", + "issuedAt": "2026-10-02T17:16:49.250Z" + }, + "envelope": { + "v": 1, + "kind": "aere-proof-of-settlement-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-settlement", + "instructionHash": "0xd98c5c84b4994e7310f777a504df09925c6917363794d89cffd92beed2b12b78", + "txHash": "0xfd50a39264c2498e675edeaa45622b93244bb72b0f384380bc20840e3bb19cb6", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102", + "chainId": 28001, + "from": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "to": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "amount": "400000000000000000", + "asset": "native", + "createdAt": "2026-10-02T17:16:49.250Z" + }, + "statementHash": "0x1a76b3cfeab71bf185344b8c64571117c8194300bd969f48469f4a451bf51fa0", + "notarization": { + "chainId": 28001, + "notary": "0x70099E62735500AA2F85B60C518551a57B202d54", + "firstSeen": 1790961411, + "txHash": "0x0c3ec57754dc3ab47221cb18c29be70099e3ca993fecd0c9de3b65ee0e1bba3b", + "block": 4449144 + } + } + }, + "policy": { + "v": 1, + "kind": "aere-payment-risk-policy", + "id": "payee-company-28001-2026-10-02", + "currency": "USD", + "perPaymentMaxUsd": "1.000000", + "window": { + "seconds": 86400, + "maxUsd": "2.500000", + "maxCount": 3 + }, + "allowedAssets": [ + { + "chainId": 28001, + "asset": "native", + "decimals": 18 + } + ], + "refusedCounterparties": [ + { + "address": "0x0000000000000000000000000000000000000000", + "reason": "the zero address: funds sent there are unrecoverable", + "source": "measured on every EVM chain" + }, + { + "address": "0x4145d6f639436d840957f2d4b9f2e73f34f56b5d", + "reason": "a contract that only pays out through its own job flow (AereComputeMarketV3 on 28001): a plain transfer to it is lost", + "source": "tools/aere-market-settlement/desfasurare-28001.json" + }, + { + "address": "0x70099e62735500aa2f85b60c518551a57b202d54", + "reason": "a contract with no path to withdraw what is sent to it (AereNotary on 28001)", + "source": "contracts/deployments/notary-28001.json" + } + ], + "requireRate": true + }, + "inputs": { + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "amount": "400000000000000000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "identity": null, + "history": [], + "now": 1790961406 + }, + "tx": { + "from": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "to": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "value": "0x58d15e176280000", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102" + }, + "txReceipt": { + "status": "0x1", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102" + }, + "chain": 28001 + }, + "expected": { + "verdict": "PARTIAL", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/payment-receipt/company-p1.amount.json b/conformance/vectori/payment-receipt/company-p1.amount.json new file mode 100644 index 0000000..618110e --- /dev/null +++ b/conformance/vectori/payment-receipt/company-p1.amount.json @@ -0,0 +1,171 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "payment-receipt/company-p1.amount", + "artifact": "payment-receipt", + "title": "the issuer wrote a USD amount that is not the amount at the declared rate, and committed to it", + "source": "derived from payment-receipt/company-p1.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity", + "receipt.amount", + "receipt.binding", + "receipt.chain", + "receipt.policy", + "receipt.risk" + ], + "base": "payment-receipt/company-p1.valid", + "mutation": { + "producer": "instruction.amountUsd changed by the issuer; instructionHash and statementHash recomputed with the published formulas", + "changed": [ + [ + "receipt", + "instruction", + "amountUsd" + ], + [ + "receipt", + "envelope", + "statement", + "instructionHash" + ], + [ + "receipt", + "envelope", + "statementHash" + ] + ] + }, + "input": { + "receipt": { + "instruction": { + "v": 1, + "kind": "aere-payment-receipt-instruction", + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "decimals": 18, + "amount": "400000000000000000", + "amountUsd": "0.300000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "txHash": "0xfd50a39264c2498e675edeaa45622b93244bb72b0f384380bc20840e3bb19cb6", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102", + "risk": { + "policyId": "payee-company-28001-2026-10-02", + "policyHash": "0x49c2478b8a5a5bc30dbfc8d2a10e1365126f1b10bc94beb67d678cd02d5bf390", + "inputsHash": "0xfc4cf1b16150c6a614c2184cd88673aa2b13b7fd6b56ec0bff1ec835b83afe13", + "verdictHash": "0xf3ed4242b45057c3569846e9168bab453702206578250810732351ce7f196f66", + "decision": "ALLOW", + "unmeasured": [ + "sanctions screening: no source consulted", + "identity or verification tier of the payer: none", + "device, session or location of the payer: none", + "chargeback or fraud history: none", + "the payer's payments outside this issuer's own receipts: none" + ] + }, + "purpose": "test purchase P1", + "issuedAt": "2026-10-02T17:16:49.250Z" + }, + "envelope": { + "v": 1, + "kind": "aere-proof-of-settlement-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-settlement", + "instructionHash": "0xc4db90629b3b687ba33e84c9023071813e092ba31721c7a46525105a79bd7cf7", + "txHash": "0xfd50a39264c2498e675edeaa45622b93244bb72b0f384380bc20840e3bb19cb6", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102", + "chainId": 28001, + "from": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "to": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "amount": "400000000000000000", + "asset": "native", + "createdAt": "2026-10-02T17:16:49.250Z" + }, + "statementHash": "0x72453042118342af8e9220b6072dc25c48c4e518213aa7b29b9f823dbdf9c0c8" + } + }, + "policy": { + "v": 1, + "kind": "aere-payment-risk-policy", + "id": "payee-company-28001-2026-10-02", + "currency": "USD", + "perPaymentMaxUsd": "1.000000", + "window": { + "seconds": 86400, + "maxUsd": "2.500000", + "maxCount": 3 + }, + "allowedAssets": [ + { + "chainId": 28001, + "asset": "native", + "decimals": 18 + } + ], + "refusedCounterparties": [ + { + "address": "0x0000000000000000000000000000000000000000", + "reason": "the zero address: funds sent there are unrecoverable", + "source": "measured on every EVM chain" + }, + { + "address": "0x4145d6f639436d840957f2d4b9f2e73f34f56b5d", + "reason": "a contract that only pays out through its own job flow (AereComputeMarketV3 on 28001): a plain transfer to it is lost", + "source": "tools/aere-market-settlement/desfasurare-28001.json" + }, + { + "address": "0x70099e62735500aa2f85b60c518551a57b202d54", + "reason": "a contract with no path to withdraw what is sent to it (AereNotary on 28001)", + "source": "contracts/deployments/notary-28001.json" + } + ], + "requireRate": true + }, + "inputs": { + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "amount": "400000000000000000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "identity": null, + "history": [], + "now": 1790961406 + }, + "tx": { + "from": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "to": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "value": "0x58d15e176280000", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102" + }, + "txReceipt": { + "status": "0x1", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102" + }, + "chain": 28001 + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "receipt.amount" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/payment-receipt/company-p1.binding.json b/conformance/vectori/payment-receipt/company-p1.binding.json new file mode 100644 index 0000000..58e4dae --- /dev/null +++ b/conformance/vectori/payment-receipt/company-p1.binding.json @@ -0,0 +1,159 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "payment-receipt/company-p1.binding", + "artifact": "payment-receipt", + "title": "the purpose on the instruction changed after the envelope committed to it", + "source": "derived from payment-receipt/company-p1.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity", + "receipt.amount", + "receipt.binding", + "receipt.chain", + "receipt.policy", + "receipt.risk" + ], + "base": "payment-receipt/company-p1.valid", + "mutation": { + "op": "set", + "path": [ + "receipt", + "instruction", + "purpose" + ], + "value": "test purchase P1 (edited)" + }, + "input": { + "receipt": { + "instruction": { + "v": 1, + "kind": "aere-payment-receipt-instruction", + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "decimals": 18, + "amount": "400000000000000000", + "amountUsd": "0.200000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "txHash": "0xfd50a39264c2498e675edeaa45622b93244bb72b0f384380bc20840e3bb19cb6", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102", + "risk": { + "policyId": "payee-company-28001-2026-10-02", + "policyHash": "0x49c2478b8a5a5bc30dbfc8d2a10e1365126f1b10bc94beb67d678cd02d5bf390", + "inputsHash": "0xfc4cf1b16150c6a614c2184cd88673aa2b13b7fd6b56ec0bff1ec835b83afe13", + "verdictHash": "0xf3ed4242b45057c3569846e9168bab453702206578250810732351ce7f196f66", + "decision": "ALLOW", + "unmeasured": [ + "sanctions screening: no source consulted", + "identity or verification tier of the payer: none", + "device, session or location of the payer: none", + "chargeback or fraud history: none", + "the payer's payments outside this issuer's own receipts: none" + ] + }, + "purpose": "test purchase P1 (edited)", + "issuedAt": "2026-10-02T17:16:49.250Z" + }, + "envelope": { + "v": 1, + "kind": "aere-proof-of-settlement-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-settlement", + "instructionHash": "0xd98c5c84b4994e7310f777a504df09925c6917363794d89cffd92beed2b12b78", + "txHash": "0xfd50a39264c2498e675edeaa45622b93244bb72b0f384380bc20840e3bb19cb6", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102", + "chainId": 28001, + "from": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "to": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "amount": "400000000000000000", + "asset": "native", + "createdAt": "2026-10-02T17:16:49.250Z" + }, + "statementHash": "0x1a76b3cfeab71bf185344b8c64571117c8194300bd969f48469f4a451bf51fa0" + } + }, + "policy": { + "v": 1, + "kind": "aere-payment-risk-policy", + "id": "payee-company-28001-2026-10-02", + "currency": "USD", + "perPaymentMaxUsd": "1.000000", + "window": { + "seconds": 86400, + "maxUsd": "2.500000", + "maxCount": 3 + }, + "allowedAssets": [ + { + "chainId": 28001, + "asset": "native", + "decimals": 18 + } + ], + "refusedCounterparties": [ + { + "address": "0x0000000000000000000000000000000000000000", + "reason": "the zero address: funds sent there are unrecoverable", + "source": "measured on every EVM chain" + }, + { + "address": "0x4145d6f639436d840957f2d4b9f2e73f34f56b5d", + "reason": "a contract that only pays out through its own job flow (AereComputeMarketV3 on 28001): a plain transfer to it is lost", + "source": "tools/aere-market-settlement/desfasurare-28001.json" + }, + { + "address": "0x70099e62735500aa2f85b60c518551a57b202d54", + "reason": "a contract with no path to withdraw what is sent to it (AereNotary on 28001)", + "source": "contracts/deployments/notary-28001.json" + } + ], + "requireRate": true + }, + "inputs": { + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "amount": "400000000000000000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "identity": null, + "history": [], + "now": 1790961406 + }, + "tx": { + "from": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "to": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "value": "0x58d15e176280000", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102" + }, + "txReceipt": { + "status": "0x1", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102" + }, + "chain": 28001 + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "receipt.binding" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/payment-receipt/company-p1.chain.json b/conformance/vectori/payment-receipt/company-p1.chain.json new file mode 100644 index 0000000..7c996cc --- /dev/null +++ b/conformance/vectori/payment-receipt/company-p1.chain.json @@ -0,0 +1,158 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "payment-receipt/company-p1.chain", + "artifact": "payment-receipt", + "title": "the transaction on chain pays someone else", + "source": "derived from payment-receipt/company-p1.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity", + "receipt.amount", + "receipt.binding", + "receipt.chain", + "receipt.policy", + "receipt.risk" + ], + "base": "payment-receipt/company-p1.valid", + "mutation": { + "op": "set", + "path": [ + "tx", + "to" + ], + "value": "0x0000000000000000000000000000000000000000" + }, + "input": { + "receipt": { + "instruction": { + "v": 1, + "kind": "aere-payment-receipt-instruction", + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "decimals": 18, + "amount": "400000000000000000", + "amountUsd": "0.200000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "txHash": "0xfd50a39264c2498e675edeaa45622b93244bb72b0f384380bc20840e3bb19cb6", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102", + "risk": { + "policyId": "payee-company-28001-2026-10-02", + "policyHash": "0x49c2478b8a5a5bc30dbfc8d2a10e1365126f1b10bc94beb67d678cd02d5bf390", + "inputsHash": "0xfc4cf1b16150c6a614c2184cd88673aa2b13b7fd6b56ec0bff1ec835b83afe13", + "verdictHash": "0xf3ed4242b45057c3569846e9168bab453702206578250810732351ce7f196f66", + "decision": "ALLOW", + "unmeasured": [ + "sanctions screening: no source consulted", + "identity or verification tier of the payer: none", + "device, session or location of the payer: none", + "chargeback or fraud history: none", + "the payer's payments outside this issuer's own receipts: none" + ] + }, + "purpose": "test purchase P1", + "issuedAt": "2026-10-02T17:16:49.250Z" + }, + "envelope": { + "v": 1, + "kind": "aere-proof-of-settlement-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-settlement", + "instructionHash": "0xd98c5c84b4994e7310f777a504df09925c6917363794d89cffd92beed2b12b78", + "txHash": "0xfd50a39264c2498e675edeaa45622b93244bb72b0f384380bc20840e3bb19cb6", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102", + "chainId": 28001, + "from": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "to": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "amount": "400000000000000000", + "asset": "native", + "createdAt": "2026-10-02T17:16:49.250Z" + }, + "statementHash": "0x1a76b3cfeab71bf185344b8c64571117c8194300bd969f48469f4a451bf51fa0" + } + }, + "policy": { + "v": 1, + "kind": "aere-payment-risk-policy", + "id": "payee-company-28001-2026-10-02", + "currency": "USD", + "perPaymentMaxUsd": "1.000000", + "window": { + "seconds": 86400, + "maxUsd": "2.500000", + "maxCount": 3 + }, + "allowedAssets": [ + { + "chainId": 28001, + "asset": "native", + "decimals": 18 + } + ], + "refusedCounterparties": [ + { + "address": "0x0000000000000000000000000000000000000000", + "reason": "the zero address: funds sent there are unrecoverable", + "source": "measured on every EVM chain" + }, + { + "address": "0x4145d6f639436d840957f2d4b9f2e73f34f56b5d", + "reason": "a contract that only pays out through its own job flow (AereComputeMarketV3 on 28001): a plain transfer to it is lost", + "source": "tools/aere-market-settlement/desfasurare-28001.json" + }, + { + "address": "0x70099e62735500aa2f85b60c518551a57b202d54", + "reason": "a contract with no path to withdraw what is sent to it (AereNotary on 28001)", + "source": "contracts/deployments/notary-28001.json" + } + ], + "requireRate": true + }, + "inputs": { + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "amount": "400000000000000000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "identity": null, + "history": [], + "now": 1790961406 + }, + "tx": { + "from": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "to": "0x0000000000000000000000000000000000000000", + "value": "0x58d15e176280000", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102" + }, + "txReceipt": { + "status": "0x1", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102" + }, + "chain": 28001 + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "receipt.chain" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/payment-receipt/company-p1.policy.json b/conformance/vectori/payment-receipt/company-p1.policy.json new file mode 100644 index 0000000..accd37b --- /dev/null +++ b/conformance/vectori/payment-receipt/company-p1.policy.json @@ -0,0 +1,159 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "payment-receipt/company-p1.policy", + "artifact": "payment-receipt", + "title": "a looser policy shown in place of the one under the hash (so the verdict does not reproduce either)", + "source": "derived from payment-receipt/company-p1.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity", + "receipt.amount", + "receipt.binding", + "receipt.chain", + "receipt.policy", + "receipt.risk" + ], + "base": "payment-receipt/company-p1.valid", + "mutation": { + "op": "set", + "path": [ + "policy", + "perPaymentMaxUsd" + ], + "value": "1000.000000" + }, + "input": { + "receipt": { + "instruction": { + "v": 1, + "kind": "aere-payment-receipt-instruction", + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "decimals": 18, + "amount": "400000000000000000", + "amountUsd": "0.200000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "txHash": "0xfd50a39264c2498e675edeaa45622b93244bb72b0f384380bc20840e3bb19cb6", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102", + "risk": { + "policyId": "payee-company-28001-2026-10-02", + "policyHash": "0x49c2478b8a5a5bc30dbfc8d2a10e1365126f1b10bc94beb67d678cd02d5bf390", + "inputsHash": "0xfc4cf1b16150c6a614c2184cd88673aa2b13b7fd6b56ec0bff1ec835b83afe13", + "verdictHash": "0xf3ed4242b45057c3569846e9168bab453702206578250810732351ce7f196f66", + "decision": "ALLOW", + "unmeasured": [ + "sanctions screening: no source consulted", + "identity or verification tier of the payer: none", + "device, session or location of the payer: none", + "chargeback or fraud history: none", + "the payer's payments outside this issuer's own receipts: none" + ] + }, + "purpose": "test purchase P1", + "issuedAt": "2026-10-02T17:16:49.250Z" + }, + "envelope": { + "v": 1, + "kind": "aere-proof-of-settlement-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-settlement", + "instructionHash": "0xd98c5c84b4994e7310f777a504df09925c6917363794d89cffd92beed2b12b78", + "txHash": "0xfd50a39264c2498e675edeaa45622b93244bb72b0f384380bc20840e3bb19cb6", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102", + "chainId": 28001, + "from": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "to": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "amount": "400000000000000000", + "asset": "native", + "createdAt": "2026-10-02T17:16:49.250Z" + }, + "statementHash": "0x1a76b3cfeab71bf185344b8c64571117c8194300bd969f48469f4a451bf51fa0" + } + }, + "policy": { + "v": 1, + "kind": "aere-payment-risk-policy", + "id": "payee-company-28001-2026-10-02", + "currency": "USD", + "perPaymentMaxUsd": "1000.000000", + "window": { + "seconds": 86400, + "maxUsd": "2.500000", + "maxCount": 3 + }, + "allowedAssets": [ + { + "chainId": 28001, + "asset": "native", + "decimals": 18 + } + ], + "refusedCounterparties": [ + { + "address": "0x0000000000000000000000000000000000000000", + "reason": "the zero address: funds sent there are unrecoverable", + "source": "measured on every EVM chain" + }, + { + "address": "0x4145d6f639436d840957f2d4b9f2e73f34f56b5d", + "reason": "a contract that only pays out through its own job flow (AereComputeMarketV3 on 28001): a plain transfer to it is lost", + "source": "tools/aere-market-settlement/desfasurare-28001.json" + }, + { + "address": "0x70099e62735500aa2f85b60c518551a57b202d54", + "reason": "a contract with no path to withdraw what is sent to it (AereNotary on 28001)", + "source": "contracts/deployments/notary-28001.json" + } + ], + "requireRate": true + }, + "inputs": { + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "amount": "400000000000000000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "identity": null, + "history": [], + "now": 1790961406 + }, + "tx": { + "from": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "to": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "value": "0x58d15e176280000", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102" + }, + "txReceipt": { + "status": "0x1", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102" + }, + "chain": 28001 + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "receipt.policy", + "receipt.risk" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/payment-receipt/company-p1.risk-other-payment.json b/conformance/vectori/payment-receipt/company-p1.risk-other-payment.json new file mode 100644 index 0000000..acaff55 --- /dev/null +++ b/conformance/vectori/payment-receipt/company-p1.risk-other-payment.json @@ -0,0 +1,182 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "payment-receipt/company-p1.risk-other-payment", + "artifact": "payment-receipt", + "title": "the issuer attached an ALLOW verdict that was made for a payment to someone else", + "source": "derived from payment-receipt/company-p1.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity", + "receipt.amount", + "receipt.binding", + "receipt.chain", + "receipt.policy", + "receipt.risk" + ], + "base": "payment-receipt/company-p1.valid", + "mutation": { + "producer": "the risk verdict was computed for another payee; its hashes are on the instruction; instructionHash and statementHash recomputed", + "changed": [ + [ + "inputs", + "payee" + ], + [ + "receipt", + "instruction", + "risk", + "inputsHash" + ], + [ + "receipt", + "instruction", + "risk", + "verdictHash" + ], + [ + "receipt", + "envelope", + "statement", + "instructionHash" + ], + [ + "receipt", + "envelope", + "statementHash" + ] + ] + }, + "input": { + "receipt": { + "instruction": { + "v": 1, + "kind": "aere-payment-receipt-instruction", + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "decimals": 18, + "amount": "400000000000000000", + "amountUsd": "0.200000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "txHash": "0xfd50a39264c2498e675edeaa45622b93244bb72b0f384380bc20840e3bb19cb6", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102", + "risk": { + "policyId": "payee-company-28001-2026-10-02", + "policyHash": "0x49c2478b8a5a5bc30dbfc8d2a10e1365126f1b10bc94beb67d678cd02d5bf390", + "inputsHash": "0x699e6b5a508e93339006b465c7235badaa972915f38de4724e2ffbe5272bf667", + "verdictHash": "0xfa6e292b1d912a6c1f514c85e3748384d6aaa1974970842e2b31c7b07a62815a", + "decision": "ALLOW", + "unmeasured": [ + "sanctions screening: no source consulted", + "identity or verification tier of the payer: none", + "device, session or location of the payer: none", + "chargeback or fraud history: none", + "the payer's payments outside this issuer's own receipts: none" + ] + }, + "purpose": "test purchase P1", + "issuedAt": "2026-10-02T17:16:49.250Z" + }, + "envelope": { + "v": 1, + "kind": "aere-proof-of-settlement-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-settlement", + "instructionHash": "0x8eebaedc3b6da74173fa7b87f28990030a674e77f3099f22cacd3cfe12398183", + "txHash": "0xfd50a39264c2498e675edeaa45622b93244bb72b0f384380bc20840e3bb19cb6", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102", + "chainId": 28001, + "from": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "to": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "amount": "400000000000000000", + "asset": "native", + "createdAt": "2026-10-02T17:16:49.250Z" + }, + "statementHash": "0x881c2e5a9782102d3ad02b03225c215d81ca27842601f4cfb37fe6ea151e76c6" + } + }, + "policy": { + "v": 1, + "kind": "aere-payment-risk-policy", + "id": "payee-company-28001-2026-10-02", + "currency": "USD", + "perPaymentMaxUsd": "1.000000", + "window": { + "seconds": 86400, + "maxUsd": "2.500000", + "maxCount": 3 + }, + "allowedAssets": [ + { + "chainId": 28001, + "asset": "native", + "decimals": 18 + } + ], + "refusedCounterparties": [ + { + "address": "0x0000000000000000000000000000000000000000", + "reason": "the zero address: funds sent there are unrecoverable", + "source": "measured on every EVM chain" + }, + { + "address": "0x4145d6f639436d840957f2d4b9f2e73f34f56b5d", + "reason": "a contract that only pays out through its own job flow (AereComputeMarketV3 on 28001): a plain transfer to it is lost", + "source": "tools/aere-market-settlement/desfasurare-28001.json" + }, + { + "address": "0x70099e62735500aa2f85b60c518551a57b202d54", + "reason": "a contract with no path to withdraw what is sent to it (AereNotary on 28001)", + "source": "contracts/deployments/notary-28001.json" + } + ], + "requireRate": true + }, + "inputs": { + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x1111111111111111111111111111111111111111", + "asset": "native", + "amount": "400000000000000000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "identity": null, + "history": [], + "now": 1790961406 + }, + "tx": { + "from": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "to": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "value": "0x58d15e176280000", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102" + }, + "txReceipt": { + "status": "0x1", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102" + }, + "chain": 28001 + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "receipt.risk" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/payment-receipt/company-p1.risk-other-rate.json b/conformance/vectori/payment-receipt/company-p1.risk-other-rate.json new file mode 100644 index 0000000..c31e6aa --- /dev/null +++ b/conformance/vectori/payment-receipt/company-p1.risk-other-rate.json @@ -0,0 +1,183 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "payment-receipt/company-p1.risk-other-rate", + "artifact": "payment-receipt", + "title": "the issuer attached an ALLOW verdict that was made at another USD rate than the one on the receipt", + "source": "derived from payment-receipt/company-p1.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity", + "receipt.amount", + "receipt.binding", + "receipt.chain", + "receipt.policy", + "receipt.risk" + ], + "base": "payment-receipt/company-p1.valid", + "mutation": { + "producer": "the risk verdict was computed at another rate; its hashes are on the instruction; instructionHash and statementHash recomputed", + "changed": [ + [ + "inputs", + "rate", + "usdPerUnit" + ], + [ + "receipt", + "instruction", + "risk", + "inputsHash" + ], + [ + "receipt", + "instruction", + "risk", + "verdictHash" + ], + [ + "receipt", + "envelope", + "statement", + "instructionHash" + ], + [ + "receipt", + "envelope", + "statementHash" + ] + ] + }, + "input": { + "receipt": { + "instruction": { + "v": 1, + "kind": "aere-payment-receipt-instruction", + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "decimals": 18, + "amount": "400000000000000000", + "amountUsd": "0.200000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "txHash": "0xfd50a39264c2498e675edeaa45622b93244bb72b0f384380bc20840e3bb19cb6", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102", + "risk": { + "policyId": "payee-company-28001-2026-10-02", + "policyHash": "0x49c2478b8a5a5bc30dbfc8d2a10e1365126f1b10bc94beb67d678cd02d5bf390", + "inputsHash": "0x484e74ec7541083d4fff498399cd199656589e05d2d3e507c300ceb5c90c7053", + "verdictHash": "0xd0fc66bf42d28a21b532e369f978cf547a11f91a072b325649599d880b4b5137", + "decision": "ALLOW", + "unmeasured": [ + "sanctions screening: no source consulted", + "identity or verification tier of the payer: none", + "device, session or location of the payer: none", + "chargeback or fraud history: none", + "the payer's payments outside this issuer's own receipts: none" + ] + }, + "purpose": "test purchase P1", + "issuedAt": "2026-10-02T17:16:49.250Z" + }, + "envelope": { + "v": 1, + "kind": "aere-proof-of-settlement-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-settlement", + "instructionHash": "0xe60c122503ea5a4d84a79a4e3ce9d55e1784da7fa7ff357d02a11782002191e6", + "txHash": "0xfd50a39264c2498e675edeaa45622b93244bb72b0f384380bc20840e3bb19cb6", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102", + "chainId": 28001, + "from": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "to": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "amount": "400000000000000000", + "asset": "native", + "createdAt": "2026-10-02T17:16:49.250Z" + }, + "statementHash": "0xe26d3dfcfc2d32ca0a03ea4a0534b0e736b306fe54d0bc2ed63c8b3ef167db17" + } + }, + "policy": { + "v": 1, + "kind": "aere-payment-risk-policy", + "id": "payee-company-28001-2026-10-02", + "currency": "USD", + "perPaymentMaxUsd": "1.000000", + "window": { + "seconds": 86400, + "maxUsd": "2.500000", + "maxCount": 3 + }, + "allowedAssets": [ + { + "chainId": 28001, + "asset": "native", + "decimals": 18 + } + ], + "refusedCounterparties": [ + { + "address": "0x0000000000000000000000000000000000000000", + "reason": "the zero address: funds sent there are unrecoverable", + "source": "measured on every EVM chain" + }, + { + "address": "0x4145d6f639436d840957f2d4b9f2e73f34f56b5d", + "reason": "a contract that only pays out through its own job flow (AereComputeMarketV3 on 28001): a plain transfer to it is lost", + "source": "tools/aere-market-settlement/desfasurare-28001.json" + }, + { + "address": "0x70099e62735500aa2f85b60c518551a57b202d54", + "reason": "a contract with no path to withdraw what is sent to it (AereNotary on 28001)", + "source": "contracts/deployments/notary-28001.json" + } + ], + "requireRate": true + }, + "inputs": { + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "amount": "400000000000000000", + "rate": { + "usdPerUnit": "0.25", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "identity": null, + "history": [], + "now": 1790961406 + }, + "tx": { + "from": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "to": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "value": "0x58d15e176280000", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102" + }, + "txReceipt": { + "status": "0x1", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102" + }, + "chain": 28001 + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "receipt.risk" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/payment-receipt/company-p1.risk.json b/conformance/vectori/payment-receipt/company-p1.risk.json new file mode 100644 index 0000000..225b27e --- /dev/null +++ b/conformance/vectori/payment-receipt/company-p1.risk.json @@ -0,0 +1,158 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "payment-receipt/company-p1.risk", + "artifact": "payment-receipt", + "title": "other inputs shown than the ones the issuer judged", + "source": "derived from payment-receipt/company-p1.valid", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity", + "receipt.amount", + "receipt.binding", + "receipt.chain", + "receipt.policy", + "receipt.risk" + ], + "base": "payment-receipt/company-p1.valid", + "mutation": { + "op": "set", + "path": [ + "inputs", + "now" + ], + "value": 1790961407 + }, + "input": { + "receipt": { + "instruction": { + "v": 1, + "kind": "aere-payment-receipt-instruction", + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "decimals": 18, + "amount": "400000000000000000", + "amountUsd": "0.200000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "txHash": "0xfd50a39264c2498e675edeaa45622b93244bb72b0f384380bc20840e3bb19cb6", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102", + "risk": { + "policyId": "payee-company-28001-2026-10-02", + "policyHash": "0x49c2478b8a5a5bc30dbfc8d2a10e1365126f1b10bc94beb67d678cd02d5bf390", + "inputsHash": "0xfc4cf1b16150c6a614c2184cd88673aa2b13b7fd6b56ec0bff1ec835b83afe13", + "verdictHash": "0xf3ed4242b45057c3569846e9168bab453702206578250810732351ce7f196f66", + "decision": "ALLOW", + "unmeasured": [ + "sanctions screening: no source consulted", + "identity or verification tier of the payer: none", + "device, session or location of the payer: none", + "chargeback or fraud history: none", + "the payer's payments outside this issuer's own receipts: none" + ] + }, + "purpose": "test purchase P1", + "issuedAt": "2026-10-02T17:16:49.250Z" + }, + "envelope": { + "v": 1, + "kind": "aere-proof-of-settlement-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-settlement", + "instructionHash": "0xd98c5c84b4994e7310f777a504df09925c6917363794d89cffd92beed2b12b78", + "txHash": "0xfd50a39264c2498e675edeaa45622b93244bb72b0f384380bc20840e3bb19cb6", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102", + "chainId": 28001, + "from": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "to": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "amount": "400000000000000000", + "asset": "native", + "createdAt": "2026-10-02T17:16:49.250Z" + }, + "statementHash": "0x1a76b3cfeab71bf185344b8c64571117c8194300bd969f48469f4a451bf51fa0" + } + }, + "policy": { + "v": 1, + "kind": "aere-payment-risk-policy", + "id": "payee-company-28001-2026-10-02", + "currency": "USD", + "perPaymentMaxUsd": "1.000000", + "window": { + "seconds": 86400, + "maxUsd": "2.500000", + "maxCount": 3 + }, + "allowedAssets": [ + { + "chainId": 28001, + "asset": "native", + "decimals": 18 + } + ], + "refusedCounterparties": [ + { + "address": "0x0000000000000000000000000000000000000000", + "reason": "the zero address: funds sent there are unrecoverable", + "source": "measured on every EVM chain" + }, + { + "address": "0x4145d6f639436d840957f2d4b9f2e73f34f56b5d", + "reason": "a contract that only pays out through its own job flow (AereComputeMarketV3 on 28001): a plain transfer to it is lost", + "source": "tools/aere-market-settlement/desfasurare-28001.json" + }, + { + "address": "0x70099e62735500aa2f85b60c518551a57b202d54", + "reason": "a contract with no path to withdraw what is sent to it (AereNotary on 28001)", + "source": "contracts/deployments/notary-28001.json" + } + ], + "requireRate": true + }, + "inputs": { + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "amount": "400000000000000000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "identity": null, + "history": [], + "now": 1790961407 + }, + "tx": { + "from": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "to": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "value": "0x58d15e176280000", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102" + }, + "txReceipt": { + "status": "0x1", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102" + }, + "chain": 28001 + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "receipt.risk" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/payment-receipt/company-p1.valid.json b/conformance/vectori/payment-receipt/company-p1.valid.json new file mode 100644 index 0000000..050ba43 --- /dev/null +++ b/conformance/vectori/payment-receipt/company-p1.valid.json @@ -0,0 +1,149 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "payment-receipt/company-p1.valid", + "artifact": "payment-receipt", + "title": "the recorded receipt as its issuer built it, with the policy, the inputs judged and the transaction read from the chain", + "source": "recorded (payments, 2026-10-02); transaction read from 28001 at 2026-10-03T09:33:28.671Z", + "requires": [], + "exercises": [ + "envelope.form", + "envelope.integrity", + "receipt.amount", + "receipt.binding", + "receipt.chain", + "receipt.policy", + "receipt.risk" + ], + "base": null, + "mutation": null, + "input": { + "receipt": { + "instruction": { + "v": 1, + "kind": "aere-payment-receipt-instruction", + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "decimals": 18, + "amount": "400000000000000000", + "amountUsd": "0.200000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "txHash": "0xfd50a39264c2498e675edeaa45622b93244bb72b0f384380bc20840e3bb19cb6", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102", + "risk": { + "policyId": "payee-company-28001-2026-10-02", + "policyHash": "0x49c2478b8a5a5bc30dbfc8d2a10e1365126f1b10bc94beb67d678cd02d5bf390", + "inputsHash": "0xfc4cf1b16150c6a614c2184cd88673aa2b13b7fd6b56ec0bff1ec835b83afe13", + "verdictHash": "0xf3ed4242b45057c3569846e9168bab453702206578250810732351ce7f196f66", + "decision": "ALLOW", + "unmeasured": [ + "sanctions screening: no source consulted", + "identity or verification tier of the payer: none", + "device, session or location of the payer: none", + "chargeback or fraud history: none", + "the payer's payments outside this issuer's own receipts: none" + ] + }, + "purpose": "test purchase P1", + "issuedAt": "2026-10-02T17:16:49.250Z" + }, + "envelope": { + "v": 1, + "kind": "aere-proof-of-settlement-attestation", + "statement": { + "v": 1, + "kind": "aere-proof-of-settlement", + "instructionHash": "0xd98c5c84b4994e7310f777a504df09925c6917363794d89cffd92beed2b12b78", + "txHash": "0xfd50a39264c2498e675edeaa45622b93244bb72b0f384380bc20840e3bb19cb6", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102", + "chainId": 28001, + "from": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "to": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "amount": "400000000000000000", + "asset": "native", + "createdAt": "2026-10-02T17:16:49.250Z" + }, + "statementHash": "0x1a76b3cfeab71bf185344b8c64571117c8194300bd969f48469f4a451bf51fa0" + } + }, + "policy": { + "v": 1, + "kind": "aere-payment-risk-policy", + "id": "payee-company-28001-2026-10-02", + "currency": "USD", + "perPaymentMaxUsd": "1.000000", + "window": { + "seconds": 86400, + "maxUsd": "2.500000", + "maxCount": 3 + }, + "allowedAssets": [ + { + "chainId": 28001, + "asset": "native", + "decimals": 18 + } + ], + "refusedCounterparties": [ + { + "address": "0x0000000000000000000000000000000000000000", + "reason": "the zero address: funds sent there are unrecoverable", + "source": "measured on every EVM chain" + }, + { + "address": "0x4145d6f639436d840957f2d4b9f2e73f34f56b5d", + "reason": "a contract that only pays out through its own job flow (AereComputeMarketV3 on 28001): a plain transfer to it is lost", + "source": "tools/aere-market-settlement/desfasurare-28001.json" + }, + { + "address": "0x70099e62735500aa2f85b60c518551a57b202d54", + "reason": "a contract with no path to withdraw what is sent to it (AereNotary on 28001)", + "source": "contracts/deployments/notary-28001.json" + } + ], + "requireRate": true + }, + "inputs": { + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "amount": "400000000000000000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "identity": null, + "history": [], + "now": 1790961406 + }, + "tx": { + "from": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "to": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "value": "0x58d15e176280000", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102" + }, + "txReceipt": { + "status": "0x1", + "blockHash": "0x3c2fc5e4071a6ddcc4b5f843d142dbaeaa7019edf9ceee45fe51a0365dd0c102" + }, + "chain": 28001 + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/payment-risk/company-p1.asset.json b/conformance/vectori/payment-risk/company-p1.asset.json new file mode 100644 index 0000000..2b40242 --- /dev/null +++ b/conformance/vectori/payment-risk/company-p1.asset.json @@ -0,0 +1,92 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "payment-risk/company-p1.asset", + "artifact": "payment-risk", + "title": "an asset the policy does not allow", + "source": "derived from payment-risk/company-p1.valid", + "requires": [], + "exercises": [ + "risk.asset", + "risk.counterparty", + "risk.form", + "risk.limit", + "risk.rate", + "risk.window" + ], + "base": "payment-risk/company-p1.valid", + "mutation": { + "op": "set", + "path": [ + "inputs", + "asset" + ], + "value": "other-token" + }, + "input": { + "policy": { + "v": 1, + "kind": "aere-payment-risk-policy", + "id": "payee-company-28001-2026-10-02", + "currency": "USD", + "perPaymentMaxUsd": "1.000000", + "window": { + "seconds": 86400, + "maxUsd": "2.500000", + "maxCount": 3 + }, + "allowedAssets": [ + { + "chainId": 28001, + "asset": "native", + "decimals": 18 + } + ], + "refusedCounterparties": [ + { + "address": "0x0000000000000000000000000000000000000000", + "reason": "the zero address: funds sent there are unrecoverable", + "source": "measured on every EVM chain" + }, + { + "address": "0x4145d6f639436d840957f2d4b9f2e73f34f56b5d", + "reason": "a contract that only pays out through its own job flow (AereComputeMarketV3 on 28001): a plain transfer to it is lost", + "source": "tools/aere-market-settlement/desfasurare-28001.json" + }, + { + "address": "0x70099e62735500aa2f85b60c518551a57b202d54", + "reason": "a contract with no path to withdraw what is sent to it (AereNotary on 28001)", + "source": "contracts/deployments/notary-28001.json" + } + ], + "requireRate": true + }, + "inputs": { + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "other-token", + "amount": "400000000000000000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "identity": null, + "history": [], + "now": 1790961406 + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "risk.asset" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/payment-risk/company-p1.counterparty.json b/conformance/vectori/payment-risk/company-p1.counterparty.json new file mode 100644 index 0000000..5a535b6 --- /dev/null +++ b/conformance/vectori/payment-risk/company-p1.counterparty.json @@ -0,0 +1,92 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "payment-risk/company-p1.counterparty", + "artifact": "payment-risk", + "title": "the payee is a refused counterparty of the policy", + "source": "derived from payment-risk/company-p1.valid", + "requires": [], + "exercises": [ + "risk.asset", + "risk.counterparty", + "risk.form", + "risk.limit", + "risk.rate", + "risk.window" + ], + "base": "payment-risk/company-p1.valid", + "mutation": { + "op": "set", + "path": [ + "inputs", + "payee" + ], + "value": "0x0000000000000000000000000000000000000000" + }, + "input": { + "policy": { + "v": 1, + "kind": "aere-payment-risk-policy", + "id": "payee-company-28001-2026-10-02", + "currency": "USD", + "perPaymentMaxUsd": "1.000000", + "window": { + "seconds": 86400, + "maxUsd": "2.500000", + "maxCount": 3 + }, + "allowedAssets": [ + { + "chainId": 28001, + "asset": "native", + "decimals": 18 + } + ], + "refusedCounterparties": [ + { + "address": "0x0000000000000000000000000000000000000000", + "reason": "the zero address: funds sent there are unrecoverable", + "source": "measured on every EVM chain" + }, + { + "address": "0x4145d6f639436d840957f2d4b9f2e73f34f56b5d", + "reason": "a contract that only pays out through its own job flow (AereComputeMarketV3 on 28001): a plain transfer to it is lost", + "source": "tools/aere-market-settlement/desfasurare-28001.json" + }, + { + "address": "0x70099e62735500aa2f85b60c518551a57b202d54", + "reason": "a contract with no path to withdraw what is sent to it (AereNotary on 28001)", + "source": "contracts/deployments/notary-28001.json" + } + ], + "requireRate": true + }, + "inputs": { + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x0000000000000000000000000000000000000000", + "asset": "native", + "amount": "400000000000000000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "identity": null, + "history": [], + "now": 1790961406 + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "risk.counterparty" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/payment-risk/company-p1.form-amount.json b/conformance/vectori/payment-risk/company-p1.form-amount.json new file mode 100644 index 0000000..d26d09b --- /dev/null +++ b/conformance/vectori/payment-risk/company-p1.form-amount.json @@ -0,0 +1,92 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "payment-risk/company-p1.form-amount", + "artifact": "payment-risk", + "title": "the amount is zero", + "source": "derived from payment-risk/company-p1.valid", + "requires": [], + "exercises": [ + "risk.asset", + "risk.counterparty", + "risk.form", + "risk.limit", + "risk.rate", + "risk.window" + ], + "base": "payment-risk/company-p1.valid", + "mutation": { + "op": "set", + "path": [ + "inputs", + "amount" + ], + "value": "0" + }, + "input": { + "policy": { + "v": 1, + "kind": "aere-payment-risk-policy", + "id": "payee-company-28001-2026-10-02", + "currency": "USD", + "perPaymentMaxUsd": "1.000000", + "window": { + "seconds": 86400, + "maxUsd": "2.500000", + "maxCount": 3 + }, + "allowedAssets": [ + { + "chainId": 28001, + "asset": "native", + "decimals": 18 + } + ], + "refusedCounterparties": [ + { + "address": "0x0000000000000000000000000000000000000000", + "reason": "the zero address: funds sent there are unrecoverable", + "source": "measured on every EVM chain" + }, + { + "address": "0x4145d6f639436d840957f2d4b9f2e73f34f56b5d", + "reason": "a contract that only pays out through its own job flow (AereComputeMarketV3 on 28001): a plain transfer to it is lost", + "source": "tools/aere-market-settlement/desfasurare-28001.json" + }, + { + "address": "0x70099e62735500aa2f85b60c518551a57b202d54", + "reason": "a contract with no path to withdraw what is sent to it (AereNotary on 28001)", + "source": "contracts/deployments/notary-28001.json" + } + ], + "requireRate": true + }, + "inputs": { + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "amount": "0", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "identity": null, + "history": [], + "now": 1790961406 + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "risk.form" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/payment-risk/company-p1.form-history.json b/conformance/vectori/payment-risk/company-p1.form-history.json new file mode 100644 index 0000000..9c46f81 --- /dev/null +++ b/conformance/vectori/payment-risk/company-p1.form-history.json @@ -0,0 +1,102 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "payment-risk/company-p1.form-history", + "artifact": "payment-risk", + "title": "a history entry the engine cannot count (it is refused, not left out of the window)", + "source": "derived from payment-risk/company-p1.valid", + "requires": [], + "exercises": [ + "risk.asset", + "risk.counterparty", + "risk.form", + "risk.limit", + "risk.rate", + "risk.window" + ], + "base": "payment-risk/company-p1.valid", + "mutation": { + "op": "set", + "path": [ + "inputs", + "history" + ], + "value": [ + { + "at": "yesterday", + "amountUsd": "0.100000" + } + ] + }, + "input": { + "policy": { + "v": 1, + "kind": "aere-payment-risk-policy", + "id": "payee-company-28001-2026-10-02", + "currency": "USD", + "perPaymentMaxUsd": "1.000000", + "window": { + "seconds": 86400, + "maxUsd": "2.500000", + "maxCount": 3 + }, + "allowedAssets": [ + { + "chainId": 28001, + "asset": "native", + "decimals": 18 + } + ], + "refusedCounterparties": [ + { + "address": "0x0000000000000000000000000000000000000000", + "reason": "the zero address: funds sent there are unrecoverable", + "source": "measured on every EVM chain" + }, + { + "address": "0x4145d6f639436d840957f2d4b9f2e73f34f56b5d", + "reason": "a contract that only pays out through its own job flow (AereComputeMarketV3 on 28001): a plain transfer to it is lost", + "source": "tools/aere-market-settlement/desfasurare-28001.json" + }, + { + "address": "0x70099e62735500aa2f85b60c518551a57b202d54", + "reason": "a contract with no path to withdraw what is sent to it (AereNotary on 28001)", + "source": "contracts/deployments/notary-28001.json" + } + ], + "requireRate": true + }, + "inputs": { + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "amount": "400000000000000000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "identity": null, + "history": [ + { + "at": "yesterday", + "amountUsd": "0.100000" + } + ], + "now": 1790961406 + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "risk.form" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/payment-risk/company-p1.form-time.json b/conformance/vectori/payment-risk/company-p1.form-time.json new file mode 100644 index 0000000..53deb3c --- /dev/null +++ b/conformance/vectori/payment-risk/company-p1.form-time.json @@ -0,0 +1,90 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "payment-risk/company-p1.form-time", + "artifact": "payment-risk", + "title": "no time given", + "source": "derived from payment-risk/company-p1.valid", + "requires": [], + "exercises": [ + "risk.asset", + "risk.counterparty", + "risk.form", + "risk.limit", + "risk.rate", + "risk.window" + ], + "base": "payment-risk/company-p1.valid", + "mutation": { + "op": "remove", + "path": [ + "inputs", + "now" + ] + }, + "input": { + "policy": { + "v": 1, + "kind": "aere-payment-risk-policy", + "id": "payee-company-28001-2026-10-02", + "currency": "USD", + "perPaymentMaxUsd": "1.000000", + "window": { + "seconds": 86400, + "maxUsd": "2.500000", + "maxCount": 3 + }, + "allowedAssets": [ + { + "chainId": 28001, + "asset": "native", + "decimals": 18 + } + ], + "refusedCounterparties": [ + { + "address": "0x0000000000000000000000000000000000000000", + "reason": "the zero address: funds sent there are unrecoverable", + "source": "measured on every EVM chain" + }, + { + "address": "0x4145d6f639436d840957f2d4b9f2e73f34f56b5d", + "reason": "a contract that only pays out through its own job flow (AereComputeMarketV3 on 28001): a plain transfer to it is lost", + "source": "tools/aere-market-settlement/desfasurare-28001.json" + }, + { + "address": "0x70099e62735500aa2f85b60c518551a57b202d54", + "reason": "a contract with no path to withdraw what is sent to it (AereNotary on 28001)", + "source": "contracts/deployments/notary-28001.json" + } + ], + "requireRate": true + }, + "inputs": { + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "amount": "400000000000000000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "identity": null, + "history": [] + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "risk.form" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/payment-risk/company-p1.form.json b/conformance/vectori/payment-risk/company-p1.form.json new file mode 100644 index 0000000..0724e82 --- /dev/null +++ b/conformance/vectori/payment-risk/company-p1.form.json @@ -0,0 +1,92 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "payment-risk/company-p1.form", + "artifact": "payment-risk", + "title": "the payer is not an address", + "source": "derived from payment-risk/company-p1.valid", + "requires": [], + "exercises": [ + "risk.asset", + "risk.counterparty", + "risk.form", + "risk.limit", + "risk.rate", + "risk.window" + ], + "base": "payment-risk/company-p1.valid", + "mutation": { + "op": "set", + "path": [ + "inputs", + "payer" + ], + "value": "0x1234" + }, + "input": { + "policy": { + "v": 1, + "kind": "aere-payment-risk-policy", + "id": "payee-company-28001-2026-10-02", + "currency": "USD", + "perPaymentMaxUsd": "1.000000", + "window": { + "seconds": 86400, + "maxUsd": "2.500000", + "maxCount": 3 + }, + "allowedAssets": [ + { + "chainId": 28001, + "asset": "native", + "decimals": 18 + } + ], + "refusedCounterparties": [ + { + "address": "0x0000000000000000000000000000000000000000", + "reason": "the zero address: funds sent there are unrecoverable", + "source": "measured on every EVM chain" + }, + { + "address": "0x4145d6f639436d840957f2d4b9f2e73f34f56b5d", + "reason": "a contract that only pays out through its own job flow (AereComputeMarketV3 on 28001): a plain transfer to it is lost", + "source": "tools/aere-market-settlement/desfasurare-28001.json" + }, + { + "address": "0x70099e62735500aa2f85b60c518551a57b202d54", + "reason": "a contract with no path to withdraw what is sent to it (AereNotary on 28001)", + "source": "contracts/deployments/notary-28001.json" + } + ], + "requireRate": true + }, + "inputs": { + "chainId": 28001, + "payer": "0x1234", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "amount": "400000000000000000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "identity": null, + "history": [], + "now": 1790961406 + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "risk.form" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/payment-risk/company-p1.limit.json b/conformance/vectori/payment-risk/company-p1.limit.json new file mode 100644 index 0000000..d62aa45 --- /dev/null +++ b/conformance/vectori/payment-risk/company-p1.limit.json @@ -0,0 +1,92 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "payment-risk/company-p1.limit", + "artifact": "payment-risk", + "title": "an amount above the per-payment limit", + "source": "derived from payment-risk/company-p1.valid", + "requires": [], + "exercises": [ + "risk.asset", + "risk.counterparty", + "risk.form", + "risk.limit", + "risk.rate", + "risk.window" + ], + "base": "payment-risk/company-p1.valid", + "mutation": { + "op": "set", + "path": [ + "inputs", + "amount" + ], + "value": "2400000000000000000" + }, + "input": { + "policy": { + "v": 1, + "kind": "aere-payment-risk-policy", + "id": "payee-company-28001-2026-10-02", + "currency": "USD", + "perPaymentMaxUsd": "1.000000", + "window": { + "seconds": 86400, + "maxUsd": "2.500000", + "maxCount": 3 + }, + "allowedAssets": [ + { + "chainId": 28001, + "asset": "native", + "decimals": 18 + } + ], + "refusedCounterparties": [ + { + "address": "0x0000000000000000000000000000000000000000", + "reason": "the zero address: funds sent there are unrecoverable", + "source": "measured on every EVM chain" + }, + { + "address": "0x4145d6f639436d840957f2d4b9f2e73f34f56b5d", + "reason": "a contract that only pays out through its own job flow (AereComputeMarketV3 on 28001): a plain transfer to it is lost", + "source": "tools/aere-market-settlement/desfasurare-28001.json" + }, + { + "address": "0x70099e62735500aa2f85b60c518551a57b202d54", + "reason": "a contract with no path to withdraw what is sent to it (AereNotary on 28001)", + "source": "contracts/deployments/notary-28001.json" + } + ], + "requireRate": true + }, + "inputs": { + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "amount": "2400000000000000000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "identity": null, + "history": [], + "now": 1790961406 + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "risk.limit" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/payment-risk/company-p1.rate-number.json b/conformance/vectori/payment-risk/company-p1.rate-number.json new file mode 100644 index 0000000..0cbe061 --- /dev/null +++ b/conformance/vectori/payment-risk/company-p1.rate-number.json @@ -0,0 +1,93 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "payment-risk/company-p1.rate-number", + "artifact": "payment-risk", + "title": "the USD rate given as a JSON number instead of a decimal string (refused, not rounded)", + "source": "derived from payment-risk/company-p1.valid", + "requires": [], + "exercises": [ + "risk.asset", + "risk.counterparty", + "risk.form", + "risk.limit", + "risk.rate", + "risk.window" + ], + "base": "payment-risk/company-p1.valid", + "mutation": { + "op": "set", + "path": [ + "inputs", + "rate", + "usdPerUnit" + ], + "value": 0.5 + }, + "input": { + "policy": { + "v": 1, + "kind": "aere-payment-risk-policy", + "id": "payee-company-28001-2026-10-02", + "currency": "USD", + "perPaymentMaxUsd": "1.000000", + "window": { + "seconds": 86400, + "maxUsd": "2.500000", + "maxCount": 3 + }, + "allowedAssets": [ + { + "chainId": 28001, + "asset": "native", + "decimals": 18 + } + ], + "refusedCounterparties": [ + { + "address": "0x0000000000000000000000000000000000000000", + "reason": "the zero address: funds sent there are unrecoverable", + "source": "measured on every EVM chain" + }, + { + "address": "0x4145d6f639436d840957f2d4b9f2e73f34f56b5d", + "reason": "a contract that only pays out through its own job flow (AereComputeMarketV3 on 28001): a plain transfer to it is lost", + "source": "tools/aere-market-settlement/desfasurare-28001.json" + }, + { + "address": "0x70099e62735500aa2f85b60c518551a57b202d54", + "reason": "a contract with no path to withdraw what is sent to it (AereNotary on 28001)", + "source": "contracts/deployments/notary-28001.json" + } + ], + "requireRate": true + }, + "inputs": { + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "amount": "400000000000000000", + "rate": { + "usdPerUnit": 0.5, + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "identity": null, + "history": [], + "now": 1790961406 + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "risk.rate" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/payment-risk/company-p1.rate.json b/conformance/vectori/payment-risk/company-p1.rate.json new file mode 100644 index 0000000..2f618a0 --- /dev/null +++ b/conformance/vectori/payment-risk/company-p1.rate.json @@ -0,0 +1,86 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "payment-risk/company-p1.rate", + "artifact": "payment-risk", + "title": "no USD rate declared, and the policy requires one", + "source": "derived from payment-risk/company-p1.valid", + "requires": [], + "exercises": [ + "risk.asset", + "risk.counterparty", + "risk.form", + "risk.limit", + "risk.rate", + "risk.window" + ], + "base": "payment-risk/company-p1.valid", + "mutation": { + "op": "remove", + "path": [ + "inputs", + "rate" + ] + }, + "input": { + "policy": { + "v": 1, + "kind": "aere-payment-risk-policy", + "id": "payee-company-28001-2026-10-02", + "currency": "USD", + "perPaymentMaxUsd": "1.000000", + "window": { + "seconds": 86400, + "maxUsd": "2.500000", + "maxCount": 3 + }, + "allowedAssets": [ + { + "chainId": 28001, + "asset": "native", + "decimals": 18 + } + ], + "refusedCounterparties": [ + { + "address": "0x0000000000000000000000000000000000000000", + "reason": "the zero address: funds sent there are unrecoverable", + "source": "measured on every EVM chain" + }, + { + "address": "0x4145d6f639436d840957f2d4b9f2e73f34f56b5d", + "reason": "a contract that only pays out through its own job flow (AereComputeMarketV3 on 28001): a plain transfer to it is lost", + "source": "tools/aere-market-settlement/desfasurare-28001.json" + }, + { + "address": "0x70099e62735500aa2f85b60c518551a57b202d54", + "reason": "a contract with no path to withdraw what is sent to it (AereNotary on 28001)", + "source": "contracts/deployments/notary-28001.json" + } + ], + "requireRate": true + }, + "inputs": { + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "amount": "400000000000000000", + "identity": null, + "history": [], + "now": 1790961406 + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "risk.rate" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/payment-risk/company-p1.valid.json b/conformance/vectori/payment-risk/company-p1.valid.json new file mode 100644 index 0000000..fe65577 --- /dev/null +++ b/conformance/vectori/payment-risk/company-p1.valid.json @@ -0,0 +1,83 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "payment-risk/company-p1.valid", + "artifact": "payment-risk", + "title": "the recorded payment to a company, allowed by its policy", + "source": "recorded (payments, 2026-10-02)", + "requires": [], + "exercises": [ + "risk.asset", + "risk.counterparty", + "risk.form", + "risk.limit", + "risk.rate", + "risk.window" + ], + "base": null, + "mutation": null, + "input": { + "policy": { + "v": 1, + "kind": "aere-payment-risk-policy", + "id": "payee-company-28001-2026-10-02", + "currency": "USD", + "perPaymentMaxUsd": "1.000000", + "window": { + "seconds": 86400, + "maxUsd": "2.500000", + "maxCount": 3 + }, + "allowedAssets": [ + { + "chainId": 28001, + "asset": "native", + "decimals": 18 + } + ], + "refusedCounterparties": [ + { + "address": "0x0000000000000000000000000000000000000000", + "reason": "the zero address: funds sent there are unrecoverable", + "source": "measured on every EVM chain" + }, + { + "address": "0x4145d6f639436d840957f2d4b9f2e73f34f56b5d", + "reason": "a contract that only pays out through its own job flow (AereComputeMarketV3 on 28001): a plain transfer to it is lost", + "source": "tools/aere-market-settlement/desfasurare-28001.json" + }, + { + "address": "0x70099e62735500aa2f85b60c518551a57b202d54", + "reason": "a contract with no path to withdraw what is sent to it (AereNotary on 28001)", + "source": "contracts/deployments/notary-28001.json" + } + ], + "requireRate": true + }, + "inputs": { + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "amount": "400000000000000000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "identity": null, + "history": [], + "now": 1790961406 + } + }, + "expected": { + "verdict": "VALID", + "failed": [], + "levels": { + "integrity": "PASSED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/vectori/payment-risk/company-p1.window.json b/conformance/vectori/payment-risk/company-p1.window.json new file mode 100644 index 0000000..5575fef --- /dev/null +++ b/conformance/vectori/payment-risk/company-p1.window.json @@ -0,0 +1,118 @@ +{ + "v": 1, + "kind": "aere-conformance-vector", + "id": "payment-risk/company-p1.window", + "artifact": "payment-risk", + "title": "three payments already in the window (the fourth is one too many)", + "source": "derived from payment-risk/company-p1.valid", + "requires": [], + "exercises": [ + "risk.asset", + "risk.counterparty", + "risk.form", + "risk.limit", + "risk.rate", + "risk.window" + ], + "base": "payment-risk/company-p1.valid", + "mutation": { + "op": "set", + "path": [ + "inputs", + "history" + ], + "value": [ + { + "at": 1790961396, + "amountUsd": "0.100000" + }, + { + "at": 1790961386, + "amountUsd": "0.100000" + }, + { + "at": 1790961376, + "amountUsd": "0.100000" + } + ] + }, + "input": { + "policy": { + "v": 1, + "kind": "aere-payment-risk-policy", + "id": "payee-company-28001-2026-10-02", + "currency": "USD", + "perPaymentMaxUsd": "1.000000", + "window": { + "seconds": 86400, + "maxUsd": "2.500000", + "maxCount": 3 + }, + "allowedAssets": [ + { + "chainId": 28001, + "asset": "native", + "decimals": 18 + } + ], + "refusedCounterparties": [ + { + "address": "0x0000000000000000000000000000000000000000", + "reason": "the zero address: funds sent there are unrecoverable", + "source": "measured on every EVM chain" + }, + { + "address": "0x4145d6f639436d840957f2d4b9f2e73f34f56b5d", + "reason": "a contract that only pays out through its own job flow (AereComputeMarketV3 on 28001): a plain transfer to it is lost", + "source": "tools/aere-market-settlement/desfasurare-28001.json" + }, + { + "address": "0x70099e62735500aa2f85b60c518551a57b202d54", + "reason": "a contract with no path to withdraw what is sent to it (AereNotary on 28001)", + "source": "contracts/deployments/notary-28001.json" + } + ], + "requireRate": true + }, + "inputs": { + "chainId": 28001, + "payer": "0x86d6c68408ddb2cc0d1cf4dfd6e07d3830600faf", + "payee": "0x5c5dc3eb504affbb15d0237fd0bff509840ebf64", + "asset": "native", + "amount": "400000000000000000", + "rate": { + "usdPerUnit": "0.5", + "source": "declared by the payee for this test (28001 has no market price; tAERE is a test asset)", + "at": "2026-10-02T17:16:44.549Z" + }, + "identity": null, + "history": [ + { + "at": 1790961396, + "amountUsd": "0.100000" + }, + { + "at": 1790961386, + "amountUsd": "0.100000" + }, + { + "at": 1790961376, + "amountUsd": "0.100000" + } + ], + "now": 1790961406 + } + }, + "expected": { + "verdict": "INVALID", + "failed": [ + "risk.window" + ], + "levels": { + "integrity": "FAILED", + "authenticity": "NOT_MEASURED", + "anchoring": "NOT_MEASURED", + "finality": "NOT_MEASURED" + } + } +} diff --git a/conformance/verdict.mjs b/conformance/verdict.mjs new file mode 100644 index 0000000..47f7882 --- /dev/null +++ b/conformance/verdict.mjs @@ -0,0 +1,37 @@ +// verdict.mjs: the ONE verdict form of the suite. Whatever the artifact (an AIP-23 envelope, a payment receipt, a market timeline, +// a dataset answer), the verdict says, for each of four levels, PASSED, FAILED or NOT_MEASURED, with the named reason: +// +// integrity the artifact is what it says: its hashes bind its content, and the rules it declares (a policy, deadlines, a +// window, Merkle paths, a payout) hold when recomputed from the evidence supplied +// authenticity the signature the artifact carries verifies +// anchoring its statementHash is recorded in the notary contract, under a state root that a post-quantum anchor covers +// finality that anchor's post-quantum certificate verifies; the finality is the one of the chain it was notarized on +// +// A level nobody judged is NOT_MEASURED and says why (`cause`). The verdict is INVALID when a level FAILED; PARTIAL when nothing +// failed but something the artifact CLAIMS was not measured (a notarization claim not checked offline, a signature scheme the +// verifier cannot check, a timeline that is not terminal); VALID otherwise, and only with integrity PASSED. `failed` is the sorted +// list of the rule ids that refused: the suite compares it as an exact set. +export const LEVELS = ['integrity', 'authenticity', 'anchoring', 'finality']; +/** Causes that leave a claim of the artifact unmeasured: nothing failed, and the verdict still cannot be VALID. */ +export const CAUZE_PARTIALE = ['claim-not-checked', 'unmeasurable', 'pending', 'incomplete']; + +export function acumulator() { return Object.fromEntries(LEVELS.map((l) => [l, { failed: [], motive: [], passed: [], nm: [] }])); } +export const pica = (acc, level, rule, motiv) => { acc[level].failed.push(rule); if (motiv) acc[level].motive.push(motiv); }; +export const trece = (acc, level, ce) => { acc[level].passed.push(ce); }; +export const nemasurat = (acc, level, cause, reason) => { acc[level].nm.push({ cause, reason }); }; + +export function verdictUnic(artifact, acc) { + const levels = LEVELS.map((l) => { + const a = acc[l]; + if (a.failed.length) return { level: l, state: 'FAILED', rules: [...new Set(a.failed)].sort(), reason: [...new Set(a.motive)].join('; ') }; + const partial = a.nm.find((x) => CAUZE_PARTIALE.includes(x.cause)); + if (partial) return { level: l, state: 'NOT_MEASURED', rules: [], cause: partial.cause, reason: partial.reason }; + if (a.passed.length) return { level: l, state: 'PASSED', rules: [], reason: a.passed.join('; ') }; + const n = a.nm[0] || { cause: 'not-judged', reason: 'no verifier of this artifact judges this level' }; + return { level: l, state: 'NOT_MEASURED', rules: [], cause: n.cause, reason: n.reason }; + }); + const failed = [...new Set(levels.flatMap((x) => x.rules))].sort(); + const partial = levels.some((x) => x.state === 'NOT_MEASURED' && CAUZE_PARTIALE.includes(x.cause)); + const verdict = failed.length ? 'INVALID' : partial || levels[0].state !== 'PASSED' ? 'PARTIAL' : 'VALID'; + return { v: 1, kind: 'aere-conformance-verdict', artifact, verdict, levels, failed }; +} diff --git a/market-settlement/README.md b/market-settlement/README.md index 5ea84a9..18c6c78 100644 --- a/market-settlement/README.md +++ b/market-settlement/README.md @@ -22,11 +22,14 @@ state and every event with its block time and sender, and `judeca` is a pure fun the deadline, dispute strictly inside the window, finalize only after it (unless the requester accepts early), resolution only by the arbiter or after `ARBITRATION_TIMEOUT`, the terminal payout matching the state, the result bytes hashing to the commitment, the replay of the public spec agreeing with whoever won, and the notarized envelope naming this job's spec and result before the window closed. +Every refusal names its rule (`reguli`). A timeline the judge cannot read is refused by name, not thrown, and so is one that lacks an +event the job state implies: a timeline with its submission event withheld used to skip the window rule and come out VALID (found by +the conformance suite on 2026-10-03, `conformance/`). ``` AERE_TESTNET_KEY_FILE= AERE_ETHERS_DIR= node proba-piata-28001.mjs # the flow on 28001 (five scenarios) -node proba-judecata.mjs # the judge on the recorded timelines: 5 honest VALID, 10 forged INVALID, the receipt -node proba-judecata.mjs --control-negativ # 7 plantings on a copy of piata.mjs; each forged fixture must then be accepted +node proba-judecata.mjs # the judge on the recorded timelines: 5 honest VALID, 15 forged or malformed INVALID, the receipt +node proba-judecata.mjs --control-negativ # 10 plantings on a copy of piata.mjs; each forged fixture must then be accepted node extrage-artefact.mjs # regenerate AereComputeMarketV3.json from the contracts build (refuses a changed source) ``` diff --git a/market-settlement/piata.mjs b/market-settlement/piata.mjs index 3d598a9..6ea0758 100644 --- a/market-settlement/piata.mjs +++ b/market-settlement/piata.mjs @@ -21,6 +21,8 @@ import { ruleaza, rezultatHash, rezultatOcteti, specHash as specHashOf, keccak, const AICI = path.dirname(fileURLToPath(import.meta.url)); export const ARTEFACT = path.join(AICI, 'AereComputeMarketV3.json'); export const STATUS = ['None', 'Open', 'Claimed', 'Submitted', 'Disputed', 'Paid', 'Refunded', 'Slashed']; +/** The rules the judge names. A refusal can only name one of these (the helper throws otherwise), so the list is the whole list. */ +export const REGULI = ['forma', 'intreg', 'postare', 'termen', 'fereastra', 'arbitru', 'plata', 'rezultat', 'replay', 'dovada']; export const MODE = ['REPLAY', 'ZK_VERIFIED', 'OPTIMISTIC']; const H32 = /^0x[0-9a-f]{64}$/i; const sha256 = (b) => '0x' + crypto.createHash('sha256').update(b).digest('hex'); @@ -83,51 +85,65 @@ export async function cronologie({ ethers, provider, market, artifact, jobId, fr const ok = (m, cond, text) => { if (!cond) m.push(text); return !!cond; }; const low = (x) => String(x || '').toLowerCase(); export function judeca(d) { - const motive = [], randuri = []; const j = d.job, ev = d.events || []; const un = (n) => ev.find((e) => e.name === n); const toate = (n) => ev.filter((e) => e.name === n); + // a timeline the judge cannot read is refused by name, never thrown at the caller (2026-10-03: until today a missing field threw) + try { return judecaForma(d); } catch (e) { return { verdict: 'INVALID', motive: ['malformed timeline: ' + String(e.message).slice(0, 120)], reguli: ['forma'], randuri: [] }; } +} +function judecaForma(d) { + const motive = [], randuri = [], reguli = new Set(); const cere = (cond, text, regula) => { if (!REGULI.includes(regula)) throw new Error('piata: undeclared rule ' + regula); if (!cond) { motive.push(text); reguli.add(regula); } return !!cond; }; + const j = d.job, ev = d.events || []; const un = (n) => ev.find((e) => e.name === n); const toate = (n) => ev.filter((e) => e.name === n); const t = (e) => (e ? e.timestamp : null); - if (!j || !ev.length) return { verdict: 'INCOMPLETE', motive: ['no job or no events'], randuri }; + if (!j || !ev.length) return { verdict: 'INCOMPLETE', motive: ['no job or no events'], reguli: [], randuri }; + const intregi = (...x) => x.every(Number.isInteger); + const okForma = typeof j === 'object' && Array.isArray(ev) && ev.every((e) => e && typeof e === 'object' && typeof e.name === 'string' && e.args && typeof e.args === 'object' && typeof e.from === 'string' && intregi(e.timestamp, e.blockNumber)) + && !!d.constants && typeof d.constants.arbiter === 'string' && intregi(d.constants.arbitrationTimeout, j.deadline, j.submittedAt, j.challengeWindow, j.status) && (d.result == null || typeof d.result === 'string') /*PAZA:forma*/; + if (!cere(okForma, 'malformed timeline: events need name, args, from, integer timestamp and blockNumber; the job and the constants their integer fields', 'forma')) return { verdict: 'INVALID', motive, reguli: [...reguli].sort(), randuri }; for (const e of ev) randuri.push(`${new Date(e.timestamp * 1000).toISOString()} #${e.blockNumber} ${e.name} by ${e.from.slice(0, 10)}.. ${Object.entries(e.args).filter(([k]) => k !== 'result').map(([k, v]) => k + '=' + (H32.test(String(v)) ? String(v).slice(0, 10) + '..' : String(v).length > 20 ? String(v).slice(0, 10) + '..' : v)).join(' ')}`); const posted = un('JobPosted'), claimed = un('JobClaimed'), submitted = un('ResultSubmitted') || un('ResultReferenced'), disputed = un('JobDisputed'), resolved = un('DisputeResolved'), timedOut = un('DisputeTimedOut'), paid = un('JobPaid'), refunded = un('JobRefunded'), slashed = un('JobSlashed'); + // the timeline is WHOLE against the job state: an event the state implies cannot be withheld (2026-10-03: until today a timeline + // without its ResultSubmitted event skipped the challenge-window rule and came out VALID; found by the conformance suite) + const okIntreg = !!posted && (!j.provider || /^0x0{40}$/.test(String(j.provider)) || !!claimed) && (!(j.submittedAt > 0) || !!submitted) && (!(j.disputedAt > 0) || !!disputed) /*PAZA:intreg*/; + cere(okIntreg, 'the timeline lacks an event the job state implies (JobPosted; JobClaimed when a provider is set; the submission when submittedAt is set; JobDisputed when disputedAt is set)', 'intreg'); + if (!posted) return { verdict: 'INVALID', motive, reguli: [...reguli].sort(), randuri }; // R0 the posting matches the job (the reward is compared through the payout events: the contract zeroes j.reward on settlement) - ok(motive, posted && low(posted.args.requester) === low(j.requester) && low(posted.args.specHash) === low(j.specHash) && Number(posted.args.deadline) === j.deadline && (j.reward === '0' || posted.args.reward === j.reward), 'the JobPosted event does not match the job (requester, reward, specHash, deadline)'); + cere(posted && low(posted.args.requester) === low(j.requester) && low(posted.args.specHash) === low(j.specHash) && Number(posted.args.deadline) === j.deadline && (j.reward === '0' || posted.args.reward === j.reward) /*PAZA:postare*/, 'the JobPosted event does not match the job (requester, reward, specHash, deadline)', 'postare'); // R1 deadlines: a claim and a submission only up to the deadline - if (claimed) ok(motive, t(claimed) <= j.deadline /*PAZA:termen*/, 'the job was claimed after its deadline'); - if (submitted) ok(motive, t(submitted) <= j.deadline && t(submitted) === j.submittedAt /*PAZA:termen*/, 'the result was submitted after the deadline, or submittedAt does not match the event'); - if (refunded && claimed && !submitted && !disputed) ok(motive, t(refunded) > j.deadline /*PAZA:termen*/, 'the escrow was reclaimed as expired before the deadline'); + if (claimed) cere(t(claimed) <= j.deadline /*PAZA:termen*/, 'the job was claimed after its deadline', 'termen'); + if (submitted) cere(t(submitted) <= j.deadline && t(submitted) === j.submittedAt /*PAZA:termen*/, 'the result was submitted after the deadline, or submittedAt does not match the event', 'termen'); + if (refunded && claimed && !submitted && !disputed) cere(t(refunded) > j.deadline /*PAZA:termen*/, 'the escrow was reclaimed as expired before the deadline', 'termen'); // R2 the challenge window: a dispute strictly inside it, a finalize (by anyone but the requester) only after it - if (disputed) ok(motive, submitted && t(disputed) < j.submittedAt + j.challengeWindow /*PAZA:fereastra*/, 'the dispute was raised after the challenge window closed'); - if (paid && !resolved && submitted) ok(motive, low(paid.from) === low(j.requester) || t(paid) >= j.submittedAt + j.challengeWindow /*PAZA:fereastra*/, 'the provider was paid inside the challenge window by someone other than the requester (acceptResult is the requester\'s)'); + if (disputed) cere(submitted && t(disputed) < j.submittedAt + j.challengeWindow /*PAZA:fereastra*/, 'the dispute was raised after the challenge window closed', 'fereastra'); + if (paid && !resolved && submitted) cere(low(paid.from) === low(j.requester) || t(paid) >= j.submittedAt + j.challengeWindow /*PAZA:fereastra*/, 'the provider was paid inside the challenge window by someone other than the requester (acceptResult is the requester\'s)', 'fereastra'); // R3 who resolved: the arbiter, or the permissionless timeout after ARBITRATION_TIMEOUT - if (resolved) ok(motive, low(resolved.from) === low(d.constants.arbiter) /*PAZA:arbitru*/, 'the dispute was resolved by an address that is not the ARBITER'); - if (timedOut) ok(motive, disputed && t(timedOut) >= j.disputedAt + d.constants.arbitrationTimeout /*PAZA:arbitru*/, 'the dispute was timed out before ARBITRATION_TIMEOUT'); - if (resolved || timedOut) ok(motive, !!disputed, 'a resolution without a dispute'); + if (resolved) cere(low(resolved.from) === low(d.constants.arbiter) /*PAZA:arbitru*/, 'the dispute was resolved by an address that is not the ARBITER', 'arbitru'); + if (timedOut) cere(disputed && t(timedOut) >= j.disputedAt + d.constants.arbitrationTimeout /*PAZA:arbitru*/, 'the dispute was timed out before ARBITRATION_TIMEOUT', 'arbitru'); + if (resolved || timedOut) cere(!!disputed /*PAZA:arbitru*/, 'a resolution without a dispute', 'arbitru'); // R4 the terminal payout matches the state const st = STATUS[j.status]; let terminal = null; - if (st === 'Paid') { const okP = paid && low(paid.args.provider) === low(j.provider) && paid.args.reward === posted.args.reward && (!claimed || paid.args.bondReturned === claimed.args.providerBond) && (!resolved || resolved.args.providerWon === true) /*PAZA:plata*/; ok(motive, okP, 'status Paid without a matching JobPaid (provider, reward, bond returned, providerWon)'); terminal = paid && { status: st, payee: paid.args.provider, amount: paid.args.reward, txHash: paid.txHash, blockHash: paid.blockHash }; } - else if (st === 'Slashed') { const okS = slashed && disputed && resolved && resolved.args.providerWon === false && low(slashed.args.challenger) === low(disputed.args.challenger) && (!claimed || slashed.args.slashedProviderBond === claimed.args.providerBond) /*PAZA:plata*/; ok(motive, okS, 'status Slashed without a matching JobSlashed (challenger, provider bond) and DisputeResolved(false)'); terminal = slashed && { status: st, payee: slashed.args.challenger, amount: slashed.args.slashedProviderBond, refundedTo: j.requester, txHash: slashed.txHash, blockHash: slashed.blockHash }; } - else if (st === 'Refunded') { const okR = refunded && low(refunded.args.requester) === low(j.requester) && refunded.args.reward === posted.args.reward /*PAZA:plata*/; ok(motive, okR, 'status Refunded without a matching JobRefunded (requester, reward)'); terminal = refunded && { status: st, payee: refunded.args.requester, amount: refunded.args.reward, txHash: refunded.txHash, blockHash: refunded.blockHash }; } - ok(motive, j.status !== 5 || j.reward === '0', 'a paid job still holds a reward'); + if (st === 'Paid') { const okP = paid && low(paid.args.provider) === low(j.provider) && paid.args.reward === posted.args.reward && (!claimed || paid.args.bondReturned === claimed.args.providerBond) && (!resolved || resolved.args.providerWon === true) /*PAZA:plata*/; cere(okP, 'status Paid without a matching JobPaid (provider, reward, bond returned, providerWon)', 'plata'); terminal = paid && { status: st, payee: paid.args.provider, amount: paid.args.reward, txHash: paid.txHash, blockHash: paid.blockHash }; } + else if (st === 'Slashed') { const okS = slashed && disputed && resolved && resolved.args.providerWon === false && low(slashed.args.challenger) === low(disputed.args.challenger) && (!claimed || slashed.args.slashedProviderBond === claimed.args.providerBond) /*PAZA:plata*/; cere(okS, 'status Slashed without a matching JobSlashed (challenger, provider bond) and DisputeResolved(false)', 'plata'); terminal = slashed && { status: st, payee: slashed.args.challenger, amount: slashed.args.slashedProviderBond, refundedTo: j.requester, txHash: slashed.txHash, blockHash: slashed.blockHash }; } + else if (st === 'Refunded') { const okR = refunded && low(refunded.args.requester) === low(j.requester) && refunded.args.reward === posted.args.reward /*PAZA:plata*/; cere(okR, 'status Refunded without a matching JobRefunded (requester, reward)', 'plata'); terminal = refunded && { status: st, payee: refunded.args.requester, amount: refunded.args.reward, txHash: refunded.txHash, blockHash: refunded.blockHash }; } + cere((j.status !== 5 || j.reward === '0') /*PAZA:plata*/, 'a paid job still holds a reward', 'plata'); // R5 the result bytes hash to the on-chain commitment - if (d.result && submitted) ok(motive, keccak(Buffer.from(d.result.slice(2), 'hex')) === low(j.resultHash) && low(submitted.args.resultHash) === low(j.resultHash) /*PAZA:rezultat*/, 'the submitted bytes do not hash to the job\'s resultHash'); + if (d.result && submitted) cere(keccak(Buffer.from(d.result.slice(2), 'hex')) === low(j.resultHash) && low(submitted.args.resultHash) === low(j.resultHash) /*PAZA:rezultat*/, 'the submitted bytes do not hash to the job\'s resultHash', 'rezultat'); // R6 REPLAY: the public spec recomputed; the arbiter's decision must agree with the recomputation let replay = null; if (d.spec && d.result && submitted) { - ok(motive, specHashOf(d.spec) === low(j.specHash), 'the public spec does not hash to the job\'s specHash'); + cere(specHashOf(d.spec) === low(j.specHash) /*PAZA:replay*/, 'the public spec does not hash to the job\'s specHash', 'replay'); try { const r = ruleaza(d.spec); const corect = rezultatHash(r) === low(j.resultHash); replay = { recomputedHash: rezultatHash(r), providerRight: corect }; if (disputed) { replay.challengerRecomputedRight = low(disputed.args.recomputedResultHash) === rezultatHash(r); } - if (resolved) ok(motive, resolved.args.providerWon === corect /*PAZA:replay*/, `the arbiter sided with the ${resolved.args.providerWon ? 'provider' : 'challenger'} but the replay says the provider is ${corect ? 'right' : 'wrong'}`); - if (st === 'Paid' && !resolved) ok(motive, corect /*PAZA:replay*/, 'the provider was paid for a result the replay does not reproduce (no one disputed in time)'); - } catch (e) { motive.push('the replay could not run: ' + e.message); } + if (resolved) cere(resolved.args.providerWon === corect /*PAZA:replay*/, `the arbiter sided with the ${resolved.args.providerWon ? 'provider' : 'challenger'} but the replay says the provider is ${corect ? 'right' : 'wrong'}`, 'replay'); + if (st === 'Paid' && !resolved) cere(corect /*PAZA:replay*/, 'the provider was paid for a result the replay does not reproduce (no one disputed in time)', 'replay'); + } catch (e) { cere(false, 'the replay could not run: ' + e.message, 'replay'); } } // R7 the provider's envelope names this result and existed before the window closed if (d.envelope) { const e = d.envelope, stmt = e.statement || {}; const okE = e.kind === 'aere-proof-of-execution-attestation' && low(stmt.outputHash) === low(j.resultHash) && low(stmt.inputHash) === low(j.specHash) && sha256(Buffer.from(JSON.stringify(stmt), 'utf8')) === low(e.statementHash) /*PAZA:dovada*/; - ok(motive, okE, 'the execution envelope does not name this job\'s specHash/resultHash, or its statementHash is not its statement\'s'); - if (e.notarization && submitted) ok(motive, Number(e.notarization.firstSeen) <= j.submittedAt + j.challengeWindow /*PAZA:dovada*/, 'the envelope was notarized only after the challenge window closed'); + cere(okE, 'the execution envelope does not name this job\'s specHash/resultHash, or its statementHash is not its statement\'s', 'dovada'); + if (e.notarization && submitted) cere(Number(e.notarization.firstSeen) <= j.submittedAt + j.challengeWindow /*PAZA:dovada*/, 'the envelope was notarized only after the challenge window closed', 'dovada'); } const terminalStatus = ['Paid', 'Refunded', 'Slashed'].includes(st); - return { verdict: motive.length ? 'INVALID' : terminalStatus ? 'VALID' : 'INCOMPLETE', motive, randuri, status: st, terminal, replay }; + return { verdict: motive.length ? 'INVALID' : terminalStatus ? 'VALID' : 'INCOMPLETE', motive, reguli: [...reguli].sort(), randuri, status: st, terminal, replay }; } /** The AIP-23 settlement receipt of a terminal job: the payout transaction, the parties, the amount, the instruction (market, job, status). */ export function chitanta(d, { createdAt = new Date().toISOString() } = {}) { diff --git a/market-settlement/proba-judecata.mjs b/market-settlement/proba-judecata.mjs index 3f0a8c5..357adb4 100644 --- a/market-settlement/proba-judecata.mjs +++ b/market-settlement/proba-judecata.mjs @@ -34,6 +34,11 @@ export function fixturi(P) { F.push({ nume: 'N8 S1 the envelope names another result (outputHash changed, statementHash kept)', asteptat: 'INVALID', paza: 'dovada', r: () => { const d = date('S1'); d.envelope.statement.outputHash = '0x' + 'cc'.repeat(32); return v(P.judeca(d)); } }); F.push({ nume: 'N9 S1 the envelope notarized only after the window closed', asteptat: 'INVALID', paza: 'dovada', r: () => { const d = date('S1'); d.envelope.notarization.firstSeen = d.job.submittedAt + d.job.challengeWindow + 1; return v(P.judeca(d)); } }); F.push({ nume: 'N10 S4 reclaimed as expired BEFORE the deadline', asteptat: 'INVALID', paza: 'termen', r: () => { const d = date('S4'); ev(d, 'JobRefunded').timestamp = d.job.deadline - 1; return v(P.judeca(d)); } }); + F.push({ nume: 'N11 S2 the JobPosted event names another requester than the job', asteptat: 'INVALID', paza: 'postare', r: () => { const d = date('S2'); ev(d, 'JobPosted').args.requester = d.job.provider; return v(P.judeca(d)); } }); + F.push({ nume: 'N12 S5 an event whose time is not a whole number of seconds: refused by name (form)', asteptat: 'INVALID', paza: 'forma', r: () => { const d = date('S5'); ev(d, 'JobPosted').timestamp += 0.5; return v(P.judeca(d)); } }); + F.push({ nume: 'N14 S1 finalized inside the window by a third party, with the ResultSubmitted event withheld (the window rule would be skipped): refused as not whole', asteptat: 'INVALID', paza: 'intreg', r: () => { const d = date('S1'); ev(d, 'JobPaid').timestamp = d.job.submittedAt + 1; d.events = d.events.filter((e) => e.name !== 'ResultSubmitted'); const r = P.judeca(d); return { verdict: r.verdict, detail: r.reguli.join() + ': ' + r.motive.join('; ') }; } }); + F.push({ nume: 'N15 S4 the JobClaimed event withheld (the deadline rule of an expiry would be skipped): refused as not whole', asteptat: 'INVALID', paza: 'intreg', r: () => { const d = date('S4'); d.events = d.events.filter((e) => e.name !== 'JobClaimed'); return v(P.judeca(d)); } }); + F.push({ nume: 'N13 malformed timelines (no constants, an event without args, events not a list) are refused by name, never thrown', asteptat: 'INVALID', r: () => { const rez = [(d) => { delete d.constants; }, (d) => { delete d.events[0].args; }, (d) => { d.events = 'x'; }].map((f) => { const d = date('S2'); f(d); const r = P.judeca(d); return r.verdict + ':' + r.reguli.join(); }); return { verdict: rez.every((x) => x === 'INVALID:forma') ? 'INVALID' : 'VALID', detail: rez.join(' ') }; } }); F.push({ nume: 'R1 the settlement receipt of S1 is an AIP-23 settlement envelope naming the payout tx and the provider', asteptat: 'VALID', r: () => { const d = date('S1'); const c = P.chitanta(d); const t = ev(d, 'JobPaid'); return { verdict: c.kind === 'aere-proof-of-settlement-attestation' && c.statement.txHash === t.txHash && c.statement.to.toLowerCase() === d.job.provider.toLowerCase() && c.statement.chainId === 28001 ? 'VALID' : 'INVALID', detail: c.statementHash.slice(0, 18) + '..' }; } }); return F; } @@ -49,7 +54,7 @@ if (!control) { console.log(`\nmarket judge (evidence ${dovezi[dovezi.length - 1]}): ${verzi} VERDE, ${rosii} ROSU, ${stricate} STRICAT`); process.exitCode = rosii || stricate ? 1 : 0; } else { - const SURSA = fs.readFileSync(MODUL, 'utf8'); const marcaje = ['termen', 'fereastra', 'arbitru', 'plata', 'rezultat', 'replay', 'dovada']; let bune = 0; + const SURSA = fs.readFileSync(MODUL, 'utf8'); const marcaje = ['forma', 'intreg', 'postare', 'termen', 'fereastra', 'arbitru', 'plata', 'rezultat', 'replay', 'dovada']; let bune = 0; for (const m of marcaje) { const copie = path.join(AICI, `_plantat-piata-${process.pid}-${m}.mjs`); const n = SURSA.split(`/*PAZA:${m}*/`).length - 1; const tinte = fixturi(P).filter((f) => f.paza === m); let stare, detaliu; diff --git a/payments/README.md b/payments/README.md index 48bdbdf..facb438 100644 --- a/payments/README.md +++ b/payments/README.md @@ -22,8 +22,9 @@ the USD amount is exactly amount x rate, that the policy shown hashes to the one the inputs and was ALLOW, and, with the chain facts, that the transaction is this payment (from, to, value, block, status). ``` -node proba-risc.mjs # 22 rows, no chain: the verdicts under a policy, a receipt verified, nine forged ones refused by name -node proba-risc.mjs --control-negativ # 8 plantings on copies of risc.mjs and chitanta.mjs; each forged fixture must then be accepted +node proba-risc.mjs # 23 rows, no chain: the verdicts under a policy, a receipt verified, nine forged ones refused by name, + # a malformed payment refused by name (a verdict, not an exception) +node proba-risc.mjs --control-negativ # 10 plantings on copies of risc.mjs and chitanta.mjs; each forged fixture must then be accepted AERE_TESTNET_KEY_FILE= AERE_ETHERS_DIR= node proba-plata-28001.mjs # the flow on testnet 28001 node verifica-chitanta.mjs dovezi/chitanta-28001-.json --rpc https://testnet-rpc.aere.network --verify-proof ``` @@ -34,6 +35,11 @@ post-quantum certified anchor; a payment of 1.50 USD refused above the per-payme in the window refused above the count; the receipt forged (amount changed) INVALID; a looser policy shown under the receipt's policy hash INVALID. The public reader (`verifica-chitanta.mjs`) needs only Node.js: the chain is read by plain JSON-RPC. +Every refusal names its rule: `rules` on a risk verdict (form, asset, counterparty, rate, limit, window; outside the hashed body, so +the hash of a verdict already issued is unchanged), `reguli` on a receipt verdict (binding, amount, policy, risk, chain). The rate is a +decimal string (a JSON number is refused, not rounded), and a history entry the engine cannot count is refused, not left out of the +window. The conformance suite (`conformance/`) holds a vector for each of these rules and runs any implementation against them. + ## What it is not, and what is not measured - **Not KYC, not AML, not sanctions screening.** The policy's refused counterparties are addresses this house measured as sinks on diff --git a/payments/chitanta.mjs b/payments/chitanta.mjs index ff29aa9..1362b07 100644 --- a/payments/chitanta.mjs +++ b/payments/chitanta.mjs @@ -4,12 +4,15 @@ // chainId, from, to, amount, asset). The envelope is what gets notarized on AereNotary, so the receipt's time is the chain's, read back // under a post-quantum certified anchor by the reference verifier; the instruction is what a reader checks against the chain and against // the risk module. `verificaChitanta` is pure (the chain facts come in as arguments: the transaction and its receipt, fetched by the -// caller); every rule carries a PAZA marker for the planting control. Only node:crypto and proof-kinds. +// caller); every rule carries a PAZA marker for the planting control and is NAMED in the verdict (`reguli`: legatura, suma, politica, +// risc, lant), so a reader, or the conformance suite, knows which rule refused, not only that something did. Only node:crypto and proof-kinds. import crypto from 'node:crypto'; import { buildProof } from '../proof-kinds/proof-kinds.mjs'; import { canonical, hashOf, definePolicy, judeca, usdOf, usdText } from './risc.mjs'; export const KIND_INSTRUCTION = 'aere-payment-receipt-instruction'; +/** The rules this verifier names. A refusal can only name one of these (the helper throws otherwise), so the list is the whole list. */ +export const REGULI = ['legatura', 'suma', 'politica', 'risc', 'lant']; const sha256 = (b) => '0x' + crypto.createHash('sha256').update(b).digest('hex'); const H32 = /^0x[0-9a-f]{64}$/i, low = (x) => String(x || '').toLowerCase(); @@ -28,36 +31,36 @@ export function construiesteChitanta({ chainId, txHash, blockHash, payer, payee, * @param {object} o { policy, inputs, tx?: {from, to, value(hex|string), blockHash}, receipt?: {status(hex|number), blockHash} } */ export function verificaChitanta(r, o = {}) { - const motive = []; const ok = (c, m) => { if (!c) motive.push(m); return !!c; }; + const motive = [], reguli = new Set(); const ok = (c, m, regula) => { if (!REGULI.includes(regula)) throw new Error('chitanta: undeclared rule ' + regula); if (!c) { motive.push(m); reguli.add(regula); } return !!c; }; const ins = r && r.instruction, env = r && r.envelope; - if (!ins || ins.kind !== KIND_INSTRUCTION || !env || !env.statement) return { verdict: 'INVALID', motive: ['not a receipt (instruction + settlement envelope)'] }; + if (!ins || ins.kind !== KIND_INSTRUCTION || !env || !env.statement) return { verdict: 'INVALID', motive: ['not a receipt (instruction + settlement envelope)'], reguli: ['legatura'] }; const st = env.statement; // the envelope commits to this instruction, and says the same thing const okLegatura = env.kind === 'aere-proof-of-settlement-attestation' && sha256(Buffer.from(JSON.stringify(st), 'utf8')) === low(env.statementHash) && st.instructionHash === sha256(Buffer.from(canonical(ins), 'utf8')) && st.chainId === ins.chainId && low(st.from) === ins.payer && low(st.to) === ins.payee && st.amount === ins.amount && low(st.asset) === ins.asset && low(st.txHash) === ins.txHash && low(st.blockHash) === ins.blockHash /*PAZA:legatura*/; - ok(okLegatura, 'the envelope does not commit to this instruction (instructionHash, statementHash or the fields differ)'); - ok(H32.test(ins.txHash) && H32.test(ins.blockHash), 'txHash and blockHash must be 32-byte hashes'); + ok(okLegatura, 'the envelope does not commit to this instruction (instructionHash, statementHash or the fields differ)', 'legatura'); + ok(H32.test(ins.txHash) && H32.test(ins.blockHash) /*PAZA:legatura*/, 'txHash and blockHash must be 32-byte hashes', 'legatura'); // the USD amount is the amount at the declared rate, exactly - try { ok(ins.amountUsd === usdText(usdOf(ins.amount, ins.decimals, ins.rate.usdPerUnit)) /*PAZA:suma*/, 'amountUsd is not amount x the declared rate'); } catch (e) { motive.push('the amount or the rate is malformed: ' + e.message); } + try { ok(ins.amountUsd === usdText(usdOf(ins.amount, ins.decimals, ins.rate.usdPerUnit)) /*PAZA:suma*/, 'amountUsd is not amount x the declared rate', 'suma'); } catch (e) { ok(false, 'the amount or the rate is malformed: ' + e.message, 'suma'); } // the policy under the hash is the policy shown - if (o.policy) { try { ok(definePolicy(o.policy).policyHash === ins.risk.policyHash, 'the policy shown does not hash to the policy the verdict names (a policy changed under its hash)'); } catch (e) { motive.push('the policy is refused: ' + e.message); } } - else motive.push('no policy given: the risk verdict cannot be reproduced'); + if (o.policy) { try { ok(definePolicy(o.policy).policyHash === ins.risk.policyHash /*PAZA:politica*/, 'the policy shown does not hash to the policy the verdict names (a policy changed under its hash)', 'politica'); } catch (e) { ok(false, 'the policy is refused: ' + e.message, 'politica'); } } + else ok(false, 'no policy given: the risk verdict cannot be reproduced', 'politica'); // the verdict is reproduced from the same inputs, and it was ALLOW if (o.policy && o.inputs) { try { const v = judeca(o.policy, o.inputs); const okRisc = hashOf(o.inputs) === ins.risk.inputsHash && v.verdictHash === ins.risk.verdictHash && v.decision === 'ALLOW' && ins.risk.decision === 'ALLOW' /*PAZA:risc*/; - ok(okRisc, v.decision !== 'ALLOW' ? 'the risk module REFUSES these inputs under this policy: ' + v.reasons.join('; ') : 'the risk verdict does not reproduce from the inputs and the policy (inputsHash or verdictHash differ)'); - ok(low(o.inputs.payer) === ins.payer && low(o.inputs.payee) === ins.payee && String(o.inputs.amount) === ins.amount && low(o.inputs.asset) === ins.asset && o.inputs.chainId === ins.chainId, 'the inputs judged are not the payment of this receipt'); - ok(o.inputs.rate && o.inputs.rate.usdPerUnit === ins.rate.usdPerUnit && o.inputs.rate.source === ins.rate.source && o.inputs.rate.at === ins.rate.at, 'the rate judged is not the rate on the receipt'); - } catch (e) { motive.push('the risk verdict could not be reproduced: ' + e.message); } - } else if (o.policy) motive.push('no inputs given: the risk verdict cannot be reproduced'); + ok(okRisc, v.decision !== 'ALLOW' ? 'the risk module REFUSES these inputs under this policy: ' + v.reasons.join('; ') : 'the risk verdict does not reproduce from the inputs and the policy (inputsHash or verdictHash differ)', 'risc'); + ok(low(o.inputs.payer) === ins.payer && low(o.inputs.payee) === ins.payee && String(o.inputs.amount) === ins.amount && low(o.inputs.asset) === ins.asset && o.inputs.chainId === ins.chainId /*PAZA:risc*/, 'the inputs judged are not the payment of this receipt', 'risc'); + ok(o.inputs.rate && o.inputs.rate.usdPerUnit === ins.rate.usdPerUnit && o.inputs.rate.source === ins.rate.source && o.inputs.rate.at === ins.rate.at /*PAZA:risc*/, 'the rate judged is not the rate on the receipt', 'risc'); + } catch (e) { ok(false, 'the risk verdict could not be reproduced: ' + e.message, 'risc'); } + } else if (o.policy) ok(false, 'no inputs given: the risk verdict cannot be reproduced', 'risc'); // the chain facts, when given: the transaction is the payment, mined, in the block the receipt names - if (o.tx) { + if (o.tx) try { const val = typeof o.tx.value === 'string' && o.tx.value.startsWith('0x') ? BigInt(o.tx.value).toString() : String(o.tx.value); const status = o.receipt ? Number(BigInt(o.receipt.status)) : null; const okLant = low(o.tx.from) === ins.payer && low(o.tx.to) === ins.payee && (ins.asset !== 'native' || val === ins.amount) && low(o.tx.blockHash) === ins.blockHash && (status === null || status === 1) && (!o.receipt || low(o.receipt.blockHash) === ins.blockHash) /*PAZA:lant*/; - ok(okLant, 'the transaction on chain is not this payment (from, to, value, block or status differ)'); - } - return { verdict: motive.length ? 'INVALID' : 'VALID', motive, amountUsd: ins.amountUsd, chainChecked: !!o.tx }; + ok(okLant, 'the transaction on chain is not this payment (from, to, value, block or status differ)', 'lant'); + } catch (e) { ok(false, 'the transaction facts supplied are malformed: ' + String(e.message).slice(0, 80), 'lant'); } + return { verdict: motive.length ? 'INVALID' : 'VALID', motive, reguli: [...reguli].sort(), amountUsd: ins.amountUsd, chainChecked: !!o.tx }; } diff --git a/payments/proba-risc.mjs b/payments/proba-risc.mjs index c8224e0..fed0756 100644 --- a/payments/proba-risc.mjs +++ b/payments/proba-risc.mjs @@ -41,8 +41,9 @@ export function fixturi({ R, C }) { F.push({ nume: 'R7 the payee is the payer: REFUSE', asteptat: 'REFUSE', paza: 'contrapartida', r: () => dec(R.judeca(POLITICA, inputs({ payee: PAYER })), true) }); F.push({ nume: 'R8 no declared rate: REFUSE', asteptat: 'REFUSE', paza: 'curs', r: () => dec(R.judeca(POLITICA, inputs({ rate: null })), true) }); F.push({ nume: 'R8b with no declared rate the USD value is left unmeasured and named so (never guessed)', asteptat: 'REFUSE', r: () => { const v = R.judeca(POLITICA, inputs({ rate: null })); return { verdict: v.measured.amountUsd === null && v.unmeasured.some((u) => /no declared rate/.test(u)) ? v.decision : 'INVALID', detail: v.unmeasured.find((u) => /rate/.test(u)) || '' }; } }); - F.push({ nume: 'R9 an asset the policy does not allow: REFUSE', asteptat: 'REFUSE', r: () => dec(R.judeca(POLITICA, inputs({ asset: 'erc20:0x8215ba247a3574af8ebc36606eb437811e318fbd' })), true) }); + F.push({ nume: 'R9 an asset the policy does not allow: REFUSE', asteptat: 'REFUSE', paza: 'activ', r: () => dec(R.judeca(POLITICA, inputs({ asset: 'erc20:0x8215ba247a3574af8ebc36606eb437811e318fbd' })), true) }); F.push({ nume: 'R10 a policy with an unknown field is refused by definePolicy (nothing judged under a field the engine ignores)', asteptat: 'REFUSE', r: () => { try { R.definePolicy({ ...POLITICA, kycTier: 2 }); return { verdict: 'ALLOW', detail: 'accepted' }; } catch (e) { return { verdict: 'REFUSE', detail: e.message }; } } }); + F.push({ nume: 'R11 a payer that is not an address: REFUSE, a verdict that names the form rule (until 2026-10-03 this threw instead)', asteptat: 'REFUSE', paza: 'forma', r: () => { const v = R.judeca(POLITICA, inputs({ payer: '0x1234' })); return dec(v, v.decision !== 'REFUSE' || v.rules.join() === 'forma'); } }); // the receipt F.push({ nume: 'C1 a receipt on an ALLOW verdict verifies: envelope commits to the instruction, USD exact, policy under hash, verdict reproduced, transaction matches', asteptat: 'VALID', r: () => { const r = chitantaValida(R, C); const v = verif(C, r); return { verdict: v.verdict, detail: v.motive.join('; ') || r.instruction.amountUsd + ' USD, ' + r.envelope.statementHash.slice(0, 18) + '..' }; } }); F.push({ nume: 'C2 the same receipt without the chain facts: VALID but "chain not consulted"', asteptat: 'VALID', r: () => { const r = chitantaValida(R, C); const v = C.verificaChitanta({ instruction: r.instruction, envelope: r.envelope }, { policy: r.policy, inputs: r.inputs }); return { verdict: v.verdict === 'VALID' && v.chainChecked === false ? 'VALID' : 'INVALID', detail: v.motive.join('; ') }; } }); @@ -74,7 +75,7 @@ if (!control) { const srcR = fs.readFileSync(RISC, 'utf8'), srcC = fs.readFileSync(CHIT, 'utf8'); let bune = 0; // the policy-hash rule in chitanta.mjs carries no marker: it is a diagnostic (a clearer message) under the verdict reproduction, which // already fails on any policy change (the policy hash is inside the verdict hash); the load-bearing check is PAZA:risc - const marcaje = [['contrapartida', 'R'], ['curs', 'R'], ['limita', 'R'], ['fereastra', 'R'], ['legatura', 'C'], ['suma', 'C'], ['risc', 'C'], ['lant', 'C']]; + const marcaje = [['forma', 'R'], ['activ', 'R'], ['contrapartida', 'R'], ['curs', 'R'], ['limita', 'R'], ['fereastra', 'R'], ['legatura', 'C'], ['suma', 'C'], ['risc', 'C'], ['lant', 'C']]; const toate = fixturi(await incarca(RISC, CHIT)); for (const [m, unde] of marcaje) { const cR = path.join(AICI, `_plantat-risc-${process.pid}-${m}.mjs`), cC = path.join(AICI, `_plantat-chitanta-${process.pid}-${m}.mjs`); diff --git a/payments/risc.mjs b/payments/risc.mjs index 9670dfb..5ec214d 100644 --- a/payments/risc.mjs +++ b/payments/risc.mjs @@ -11,6 +11,8 @@ import crypto from 'node:crypto'; export const KIND_POLICY = 'aere-payment-risk-policy'; export const KIND_VERDICT = 'aere-payment-risk-verdict'; +/** The rules this module names. A refusal can only name one of these (the helper throws otherwise), so the list is the whole list. */ +export const REGULI = ['forma', 'activ', 'contrapartida', 'curs', 'limita', 'fereastra']; const sha256 = (s) => '0x' + crypto.createHash('sha256').update(Buffer.from(s, 'utf8')).digest('hex'); const ADDR = /^0x[0-9a-fA-F]{40}$/, INT = /^[0-9]+$/, DEC = /^[0-9]+(\.[0-9]{1,6})?$/; /** Canonical JSON: keys sorted at every depth, no whitespace. */ @@ -54,33 +56,41 @@ export const NEMASURATE = ['sanctions screening: no source consulted', 'identity export function judeca(policyIn, inputs) { const { policy, policyHash } = definePolicy(policyIn); const reasons = [], unmeasured = [...NEMASURATE]; const i = inputs || {}; - const cere = (c, m) => { if (!c) reasons.push(m); return !!c; }; - cere(ADDR.test(i.payer) && ADDR.test(i.payee), 'payer and payee must be addresses'); - cere(Number.isInteger(i.chainId) && typeof i.asset === 'string' && INT.test(String(i.amount)) && BigInt(i.amount || 0) > 0n, 'chainId, asset and a positive integer amount are required'); - cere(Number.isInteger(i.now) && i.now > 0, 'now (unix seconds) is required'); + const rules = new Set(); const cere = (c, m, regula) => { if (!REGULI.includes(regula)) throw new Error('risc: undeclared rule ' + regula); if (!c) { reasons.push(m); rules.add(regula); } return !!c; }; + // declared before the first refusal: a refusal of form returns a verdict too, and the verdict reads these (2026-10-03: until today a + // malformed payment threw "Cannot access 'amountUsd' before initialization" instead of REFUSE naming the form rule; the conformance + // vector of that rule found it) + let amountUsd = null, windowUsd = 0n, windowCount = 0; const windowStart = Number.isInteger(i.now) ? i.now - policy.window.seconds : null; + cere(ADDR.test(i.payer) && ADDR.test(i.payee) /*PAZA:forma*/, 'payer and payee must be addresses', 'forma'); + cere(Number.isInteger(i.chainId) && typeof i.asset === 'string' && INT.test(String(i.amount)) && BigInt(i.amount || 0) > 0n /*PAZA:forma*/, 'chainId, asset and a positive integer amount are required', 'forma'); + cere(Number.isInteger(i.now) && i.now > 0 /*PAZA:forma*/, 'now (unix seconds) is required', 'forma'); + // a history entry the engine cannot count is a refusal, never a payment silently left out of the window (2026-10-03) + cere(i.history == null || (Array.isArray(i.history) && i.history.every((h) => h && typeof h === 'object' && Number.isInteger(h.at) && typeof h.amountUsd === 'string' && DEC.test(h.amountUsd))) /*PAZA:forma*/, 'history must be a list of { at (unix seconds), amountUsd (decimal string) }', 'forma'); if (reasons.length) return verdict('REFUSE'); const asset = policy.allowedAssets.find((a) => a.chainId === i.chainId && a.asset === low(i.asset)); - cere(!!asset, `asset ${i.asset} on chain ${i.chainId} is not allowed by the policy`); + cere(!!asset /*PAZA:activ*/, `asset ${i.asset} on chain ${i.chainId} is not allowed by the policy`, 'activ'); const self = low(i.payer) === low(i.payee); const refuzat = policy.refusedCounterparties.find((r) => r.address === low(i.payee)); const okContrapartida = !self && !refuzat /*PAZA:contrapartida*/; - cere(okContrapartida, self ? 'the payee is the payer' : refuzat ? `refused counterparty: ${refuzat.reason} (source: ${refuzat.source})` : ''); + cere(okContrapartida, self ? 'the payee is the payer' : refuzat ? `refused counterparty: ${refuzat.reason} (source: ${refuzat.source})` : '', 'contrapartida'); const rate = i.rate && typeof i.rate === 'object' ? i.rate : null; - const okCurs = !!(rate && DEC.test(String(rate.usdPerUnit)) && rate.source && rate.at) || !policy.requireRate /*PAZA:curs*/; - if (!okCurs) { reasons.push('the USD rate is not declared (usdPerUnit, source, at): the amount in USD is unmeasured and the policy requires it'); unmeasured.push('USD value of the payment: no declared rate'); } + const rataBuna = !!(rate && typeof rate.usdPerUnit === 'string' && DEC.test(rate.usdPerUnit)); // a decimal STRING: a JSON number is refused, not rounded + const okCurs = (rataBuna && !!rate.source && !!rate.at) || !policy.requireRate /*PAZA:curs*/; + if (!okCurs) { rules.add('curs'); reasons.push('the USD rate is not declared (usdPerUnit, source, at): the amount in USD is unmeasured and the policy requires it'); unmeasured.push('USD value of the payment: no declared rate'); } if (i.identity && i.identity.complianceRecordHash) unmeasured.splice(1, 1, 'identity: a compliance record is named (' + String(i.identity.complianceRecordHash).slice(0, 18) + '..), not judged here'); - let amountUsd = null, windowUsd = 0n, windowCount = 0; const windowStart = i.now - policy.window.seconds; - if (okCurs && asset && rate && rate.usdPerUnit !== undefined) { // with no rate nothing is computed: the USD value stays unmeasured + if (okCurs && asset && rataBuna) { // with no rate nothing is computed: the USD value stays unmeasured amountUsd = usdOf(i.amount, asset.decimals, rate.usdPerUnit); for (const h of Array.isArray(i.history) ? i.history : []) { if (Number.isInteger(h.at) && h.at > windowStart && h.at <= i.now && low(h.payer || i.payer) === low(i.payer)) { windowUsd += usdMicro(h.amountUsd); windowCount++; } } const okLimita = amountUsd <= usdMicro(policy.perPaymentMaxUsd) /*PAZA:limita*/; - cere(okLimita, `above the per-payment limit: ${usdText(amountUsd)} USD > ${policy.perPaymentMaxUsd} USD`); + cere(okLimita, `above the per-payment limit: ${usdText(amountUsd)} USD > ${policy.perPaymentMaxUsd} USD`, 'limita'); const okFereastra = windowUsd + amountUsd <= usdMicro(policy.window.maxUsd) && windowCount + 1 <= policy.window.maxCount /*PAZA:fereastra*/; - cere(okFereastra, windowCount + 1 > policy.window.maxCount ? `above the window count: ${windowCount + 1} payments in ${policy.window.seconds} s > ${policy.window.maxCount}` : `above the window limit: ${usdText(windowUsd + amountUsd)} USD in ${policy.window.seconds} s > ${policy.window.maxUsd} USD`); + cere(okFereastra, windowCount + 1 > policy.window.maxCount ? `above the window count: ${windowCount + 1} payments in ${policy.window.seconds} s > ${policy.window.maxCount}` : `above the window limit: ${usdText(windowUsd + amountUsd)} USD in ${policy.window.seconds} s > ${policy.window.maxUsd} USD`, 'fereastra'); } return verdict(reasons.length ? 'REFUSE' : 'ALLOW'); function verdict(decision) { const measured = { amountUsd: amountUsd === null ? null : usdText(amountUsd), windowUsd: usdText(windowUsd), windowCount, windowStart, historyCounted: windowCount }; const inputsHash = hashOf(i); const corp = { v: 1, kind: KIND_VERDICT, policyId: policy.id, policyHash, inputsHash, decision, reasons: reasons.filter(Boolean), unmeasured, measured }; - return { ...corp, verdictHash: hashOf(corp) }; + // `rules`: the named rules that refused (forma, activ, contrapartida, curs, limita, fereastra), OUTSIDE the hashed body, so the + // verdictHash of every receipt already issued stays what it was + return { ...corp, verdictHash: hashOf(corp), rules: [...rules].sort() }; } } diff --git a/verifiable-data/README.md b/verifiable-data/README.md index 5a7cff0..0e22210 100644 --- a/verifiable-data/README.md +++ b/verifiable-data/README.md @@ -50,7 +50,7 @@ unit, in one function both sides use). A dataset appends; it never rewrites. ## Probes ``` -AERE_VERIFY_PROOF= node proba-verifiable-data.mjs # 22 rows: honest answers VALID, nine forged ones INVALID +AERE_VERIFY_PROOF= node proba-verifiable-data.mjs # 23 rows: honest answers VALID, ten forged or malformed ones INVALID # for their named reason, sampling on a local server AERE_VERIFY_PROOF=... node proba-verifiable-data.mjs --control-negativ # 5 plantings on a copy of baza.mjs; each must make its # forged fixture pass, which proves the check is load-bearing diff --git a/verifiable-data/baza.mjs b/verifiable-data/baza.mjs index 2acf0fd..5c0b6dd 100644 --- a/verifiable-data/baza.mjs +++ b/verifiable-data/baza.mjs @@ -23,6 +23,8 @@ import { leafHash, merkleTree, verifyInclusion, verifyConsistency } from '../ver import { buildProof } from '../proof-kinds/proof-kinds.mjs'; export const FORMAT = 'aere-verifiable-dataset-1'; +/** The rules the verifying side names. A refusal can only name one of these (the helper throws otherwise), so the list is the whole list. */ +export const REGULI = ['forma', 'angajament', 'camp', 'includere', 'index', 'interval', 'ordine', 'completitudine', 'consistenta', 'esantion']; export const KIND_RASPUNS = 'aere-verifiable-query-answer'; export const KIND_INREGISTRARE = 'aere-verifiable-record'; export const KIND_CONSISTENTA = 'aere-verifiable-consistency'; @@ -173,73 +175,83 @@ export function auditeaza(db) { } // ----- verification, without the data (what a reader runs on a commitment and an answer) ----- -const ok = (motive, cond, m) => { if (!cond) motive.push(m); return cond; }; +// every refusal NAMES its rule (forma, angajament, camp, includere, index, interval, ordine, completitudine, consistenta, esantion): the +// rule ids travel on the motive list and come back as `reguli` in each verdict +const ok = (motive, cond, m, regula) => { if (!REGULI.includes(regula)) throw new Error('baza: undeclared rule ' + regula); if (!cond) { motive.push(m); (motive.reguli || (motive.reguli = new Set())).add(regula); } return cond; }; +const reguliDin = (motive) => [...(motive.reguli || [])].sort(); +// the verifying side never throws on a malformed answer (2026-10-03: a row without its queried field, a null row, a neighbour without a +// value used to throw; found by the conformance vectors): what the format cannot carry is a refusal by name, not a crash of the reader +const sigur = (fn, ...a) => { try { return fn(...a); } catch { return null; } }; +const cmp = (a, b) => { try { return comparaValori(a, b); } catch { return NaN; } }; +const valoare = (r, f) => (r && r.disclosed && r.disclosed[f] != null ? r.disclosed[f].value : undefined); function verificaRand(r, commitment, field, motive, eticheta) { - if (!r || typeof r !== 'object' || !r.c || typeof r.c !== 'object' || !r.disclosed) return ok(motive, false, eticheta + ': malformed row'); + const okForma = !!(r && typeof r === 'object' && r.c && typeof r.c === 'object' && r.disclosed) /*PAZA:forma*/; + if (!ok(motive, okForma, eticheta + ': malformed row', 'forma')) return false; for (const [k, d] of Object.entries(r.disclosed)) { - if (!d || typeof d.salt !== 'string') return ok(motive, false, eticheta + ': disclosed field ' + k + ' without a salt'); - const okCamp = r.c[k] === angajamentCamp(k, d.value, d.salt) /*PAZA:camp*/; - if (!ok(motive, okCamp, eticheta + ': the disclosed value of "' + k + '" does not match its commitment')) return false; + if (!ok(motive, !!(d && typeof d.salt === 'string') /*PAZA:camp*/, eticheta + ': disclosed field ' + k + ' without a salt', 'camp')) return false; + const okCamp = r.c[k] === sigur(angajamentCamp, k, d.value, d.salt) /*PAZA:camp*/; + if (!ok(motive, okCamp, eticheta + ': the disclosed value of "' + k + '" does not match its commitment', 'camp')) return false; } - const leaf = frunzaInregistrare(r.id, r.c); - if (!ok(motive, r.logProof && verifyInclusion({ ...r.logProof, leafHash: leaf, treeSize: commitment.size, rootHash: commitment.logRoot }) && r.logProof.index === r.i, eticheta + ': the record is not in the log of version ' + commitment.version)) return false; + const leaf = sigur(frunzaInregistrare, r.id, r.c); + if (!ok(motive, r.logProof && verifyInclusion({ ...r.logProof, leafHash: leaf, treeSize: commitment.size, rootHash: commitment.logRoot }) && r.logProof.index === r.i /*PAZA:includere*/, eticheta + ': the record is not in the log of version ' + commitment.version, 'includere')) return false; if (field !== null) { - if (!ok(motive, r.disclosed[field] !== undefined, eticheta + ': the queried field "' + field + '" is not disclosed')) return false; + if (!ok(motive, r.disclosed[field] !== undefined /*PAZA:index*/, eticheta + ': the queried field "' + field + '" is not disclosed', 'index')) return false; const ix = commitment.indexes[field]; - const okIndex = r.indexProof && verifyInclusion({ ...r.indexProof, leafHash: frunzaIndex(field, r.disclosed[field].value, r.i, leaf), treeSize: ix.size, rootHash: ix.root }) && r.indexProof.index === r.pos; - if (!ok(motive, okIndex, eticheta + ': the row is not at position ' + r.pos + ' of the index "' + field + '"')) return false; + const okIndex = r.indexProof && verifyInclusion({ ...r.indexProof, leafHash: sigur(frunzaIndex, field, valoare(r, field), r.i, leaf), treeSize: ix.size, rootHash: ix.root }) && r.indexProof.index === r.pos /*PAZA:index*/; + if (!ok(motive, okIndex, eticheta + ': the row is not at position ' + r.pos + ' of the index "' + field + '"', 'index')) return false; } return true; } /** A query answer against a commitment: every row proves itself, the rows are the whole contiguous run, the neighbours are outside. */ export function verificaRaspuns(answer, commitment) { const motive = []; - if (!answer || answer.kind !== KIND_RASPUNS || !commitment) return { verdict: 'INVALID', motive: ['not a ' + KIND_RASPUNS], rows: 0 }; - ok(motive, answer.commitmentHash === hashAngajament(commitment) && answer.version === commitment.version && answer.name === commitment.name, 'the answer names another commitment'); + if (!answer || answer.kind !== KIND_RASPUNS || !commitment) return { verdict: 'INVALID', motive: ['not a ' + KIND_RASPUNS], reguli: ['forma'], rows: 0 }; + ok(motive, answer.commitmentHash === hashAngajament(commitment) && answer.version === commitment.version && answer.name === commitment.name /*PAZA:angajament*/, 'the answer names another commitment', 'angajament'); const f = answer.field; const ix = commitment.indexes && commitment.indexes[f]; - if (!ok(motive, !!ix, 'the field "' + f + '" is not indexed in the commitment')) return { verdict: 'INVALID', motive, rows: 0 }; - ok(motive, answer.indexSize === ix.size, 'the answer\'s index size differs from the commitment\'s'); + if (!ok(motive, !!ix, 'the field "' + f + '" is not indexed in the commitment', 'angajament')) return { verdict: 'INVALID', motive, reguli: reguliDin(motive), rows: 0 }; + ok(motive, answer.indexSize === ix.size /*PAZA:angajament*/, 'the answer\'s index size differs from the commitment\'s', 'angajament'); const from = answer.from, to = answer.to; const rows = Array.isArray(answer.rows) ? answer.rows : []; - if (from !== null && to !== null) ok(motive, comparaValori(from, to) <= 0, 'from is above to'); - const inRange = (v) => (from === null || comparaValori(v, from) >= 0) && (to === null || comparaValori(v, to) <= 0); - let start = rows.length ? rows[0].pos : (answer.before ? answer.before.pos + 1 : 0); + if (from !== null && to !== null) ok(motive, cmp(from, to) <= 0 /*PAZA:interval*/, 'from is above to', 'interval'); + const inRange = (v) => (from === null || cmp(v, from) >= 0) && (to === null || cmp(v, to) <= 0); + let start = rows.length ? (rows[0] && typeof rows[0] === 'object' ? rows[0].pos : null) : (answer.before ? answer.before.pos + 1 : 0); + const dovedit = []; // a row that did not prove itself is already refused by name; it is not compared with its neighbour for (const [k, r] of rows.entries()) { - if (!verificaRand(r, commitment, f, motive, 'row ' + k)) continue; - ok(motive, r.pos === start + k, 'row ' + k + ' breaks the contiguous run of the index'); - ok(motive, inRange(r.disclosed[f].value), 'row ' + k + ' is outside the queried range'); - if (k) { const okOrdine = comparaValori(rows[k - 1].disclosed[f].value, r.disclosed[f].value) < 0 || (comparaValori(rows[k - 1].disclosed[f].value, r.disclosed[f].value) === 0 && rows[k - 1].i < r.i) /*PAZA:ordine*/; ok(motive, okOrdine, 'rows ' + (k - 1) + ' and ' + k + ' are not in index order'); } + dovedit[k] = verificaRand(r, commitment, f, motive, 'row ' + k); if (!dovedit[k]) continue; + ok(motive, r.pos === start + k /*PAZA:completitudine*/, 'row ' + k + ' breaks the contiguous run of the index', 'completitudine'); + ok(motive, inRange(valoare(r, f)) /*PAZA:interval*/, 'row ' + k + ' is outside the queried range', 'interval'); + if (k && dovedit[k - 1]) { const okOrdine = cmp(valoare(rows[k - 1], f), valoare(r, f)) < 0 || (cmp(valoare(rows[k - 1], f), valoare(r, f)) === 0 && rows[k - 1].i < r.i) /*PAZA:ordine*/; ok(motive, okOrdine, 'rows ' + (k - 1) + ' and ' + k + ' are not in index order', 'ordine'); } } const end = start + rows.length; const vecin = (n, pos, cond, m) => { - if (!n) return ok(motive, cond, m); - const okVecin = n.pos === pos && n.indexProof && verifyInclusion({ ...n.indexProof, leafHash: frunzaIndex(f, n.value, n.i, n.recordLeaf), treeSize: ix.size, rootHash: ix.root }) && n.indexProof.index === pos; - return ok(motive, okVecin, 'the neighbour at position ' + pos + ' does not prove itself in the index'); + if (!n) return ok(motive, cond /*PAZA:completitudine*/, m, 'completitudine'); + const okVecin = n.pos === pos && n.indexProof && verifyInclusion({ ...n.indexProof, leafHash: sigur(frunzaIndex, f, n.value, n.i, n.recordLeaf), treeSize: ix.size, rootHash: ix.root }) && n.indexProof.index === pos /*PAZA:completitudine*/; + return ok(motive, okVecin, 'the neighbour at position ' + pos + ' does not prove itself in the index', 'completitudine'); }; // completeness: the row before the run is below the range (or the run starts at 0), the row after is above it (or the run ends the index) - const okInainte = vecin(answer.before, start - 1, start === 0, 'the run does not start at 0 and no neighbour before it is shown') && (!answer.before || (from !== null && comparaValori(answer.before.value, from) < 0)) /*PAZA:completitudine*/; - ok(motive, okInainte, 'a row before the run could still be in the range (the answer may be incomplete)'); - const okDupa = vecin(answer.after, end, end === ix.size, 'the run does not end the index and no neighbour after it is shown') && (!answer.after || (to !== null && comparaValori(answer.after.value, to) > 0)) /*PAZA:completitudine*/; - ok(motive, okDupa, 'a row after the run could still be in the range (the answer may be incomplete)'); - return { verdict: motive.length ? 'INVALID' : 'VALID', motive, rows: rows.length }; + const okInainte = vecin(answer.before, start - 1, start === 0, 'the run does not start at 0 and no neighbour before it is shown') && (!answer.before || (from !== null && cmp(answer.before.value, from) < 0)) /*PAZA:completitudine*/; + ok(motive, okInainte, 'a row before the run could still be in the range (the answer may be incomplete)', 'completitudine'); + const okDupa = vecin(answer.after, end, end === ix.size, 'the run does not end the index and no neighbour after it is shown') && (!answer.after || (to !== null && cmp(answer.after.value, to) > 0)) /*PAZA:completitudine*/; + ok(motive, okDupa, 'a row after the run could still be in the range (the answer may be incomplete)', 'completitudine'); + return { verdict: motive.length ? 'INVALID' : 'VALID', motive, reguli: reguliDin(motive), rows: rows.length }; } /** One record (from `dovadaInregistrare` or the serving endpoint) against a commitment. */ export function verificaInregistrare(rec, commitment) { const motive = []; - if (!rec || rec.kind !== KIND_INREGISTRARE) return { ok: false, motive: ['not a ' + KIND_INREGISTRARE] }; - ok(motive, rec.commitmentHash === hashAngajament(commitment) && rec.version === commitment.version, 'the record names another commitment'); + if (!rec || rec.kind !== KIND_INREGISTRARE || !commitment) return { ok: false, motive: ['not a ' + KIND_INREGISTRARE + ' with its commitment'], reguli: ['forma'] }; + ok(motive, rec.commitmentHash === hashAngajament(commitment) && rec.version === commitment.version /*PAZA:angajament*/, 'the record names another commitment', 'angajament'); verificaRand(rec, commitment, null, motive, 'record ' + rec.i); - return { ok: motive.length === 0, motive }; + return { ok: motive.length === 0, motive, reguli: reguliDin(motive) }; } /** A consistency proof between two commitments: the older log is a prefix of the newer (nothing rewritten, nothing removed). */ export function verificaConsistentaVersiuni(d, older, newer) { const motive = []; - if (!d || d.kind !== KIND_CONSISTENTA || !d.proof) return { ok: false, motive: ['not a ' + KIND_CONSISTENTA] }; - ok(motive, d.from.commitmentHash === hashAngajament(older) && d.to.commitmentHash === hashAngajament(newer), 'the proof names other commitments'); + if (!d || d.kind !== KIND_CONSISTENTA || !d.proof || !d.from || !d.to || !older || !newer) return { ok: false, motive: ['not a ' + KIND_CONSISTENTA + ' with its two commitments'], reguli: ['forma'] }; + ok(motive, d.from.commitmentHash === hashAngajament(older) && d.to.commitmentHash === hashAngajament(newer) /*PAZA:angajament*/, 'the proof names other commitments', 'angajament'); const okRadacini = d.proof.firstRoot === older.logRoot && d.proof.secondRoot === newer.logRoot && d.proof.firstSize === older.size && d.proof.secondSize === newer.size /*PAZA:consistenta*/; - ok(motive, okRadacini, 'the proof\'s roots or sizes are not the commitments\''); - ok(motive, verifyConsistency(d.proof), 'the older log is not a prefix of the newer (rewritten history)'); - ok(motive, newer.previous === hashAngajament(older) || newer.version !== older.version + 1, 'the newer version does not name the older as previous'); - return { ok: motive.length === 0, motive }; + ok(motive, okRadacini, 'the proof\'s roots or sizes are not the commitments\'', 'consistenta'); + ok(motive, verifyConsistency(d.proof) /*PAZA:consistenta*/, 'the older log is not a prefix of the newer (rewritten history)', 'consistenta'); + ok(motive, (newer.previous === hashAngajament(older) || newer.version !== older.version + 1) /*PAZA:consistenta*/, 'the newer version does not name the older as previous', 'consistenta'); + return { ok: motive.length === 0, motive, reguli: reguliDin(motive) }; } /** * Availability sampling: k record positions drawn from a seed (random when none; the seed is printed so the draw can be repeated), each @@ -260,7 +272,7 @@ export async function esantioneaza({ url, commitment, k = 16, seed = null, ia }) } const okEsantion = lipsa.length === 0 && verificate === cerute /*PAZA:esantion*/; if (lipsa.length) motive.push('not served: ' + lipsa.join(', ')); - return { ok: okEsantion, seed: s, cerute, verificate, lipsa, motive }; + return { ok: okEsantion, reguli: okEsantion ? [] : ['esantion'], seed: s, cerute, verificate, lipsa, motive }; } /** The AIP-23 `data` envelope of a commitment: sha256 = SHA-256 of the canonical commitment, name = dataset@version. */ export function plicAngajament(commitment, { createdAt = commitment.createdAt } = {}) { diff --git a/verifiable-data/proba-verifiable-data.mjs b/verifiable-data/proba-verifiable-data.mjs index 6fbd58f..fd7abc9 100644 --- a/verifiable-data/proba-verifiable-data.mjs +++ b/verifiable-data/proba-verifiable-data.mjs @@ -81,6 +81,9 @@ export async function fixturi(B, { dir, server }) { const q = { v: 1, kind: B.KIND_RASPUNS, name: 'nesortat', version: 1, commitmentHash: B.hashAngajament(c), field: 'k', from: 'a', to: 'b', indexSize: 2, rows: [rand(0), rand(1)], before: null, after: null }; const x = B.verificaRaspuns(q, c); return { verdict: x.verdict, detail: x.motive.join('; ') }; } }); F.push({ nume: 'N9 a record whose log proof points at another position', asteptat: 'INVALID', r: () => { const d = B.dovadaInregistrare(db, 2, 5); d.i = 6; d.logProof.index = 6; const x = B.verificaInregistrare(d, c2); return { verdict: x.ok ? 'VALID' : 'INVALID', detail: x.motive.join('; ') }; } }); + F.push({ nume: 'N10 malformed answers (a row without the queried field, a null row, a neighbour without a value, rows not a list) are refused by name, never thrown', asteptat: 'INVALID', r: () => { + const rez = [(q) => { delete q.rows[1].disclosed.varsta; }, (q) => { q.rows[1] = null; }, (q) => { q.rows[0] = null; }, (q) => { delete q.before.value; }, (q) => { q.rows = 'x'; }].map((f) => { const q = B.interogheaza(db, 2, { field: 'varsta', from: 30, to: 40 }); f(q); const x = B.verificaRaspuns(q, c2); return x.verdict + ':' + x.reguli.length; }); + return { verdict: rez.every((x) => /^INVALID:[1-9]/.test(x)) ? 'INVALID' : 'VALID', detail: rez.join(' ') }; } }); // availability sampling against the local server const ia = async (u) => { const r = await fetch(u, { signal: AbortSignal.timeout(10000) }); if (!r.ok) return null; return r.json(); }; F.push({ nume: 'A1 availability sampling, 32 records drawn from a seed, all served and verified', asteptat: 'VALID', r: async () => { const x = await B.esantioneaza({ url: server.url, commitment: c2, k: 32, seed: 'proba-a1', ia }); return { verdict: x.ok ? 'VALID' : 'INVALID', detail: `${x.verificate}/${x.cerute}; ${x.motive.join('; ')}` }; } });