{
  "tool_id": "art-605-merkle-airdrop-proof-verifier",
  "note": "golden_hash filled by `node golden-parity.test.mjs --update`. Leaf derivation and _hashPair follow ETHMATH-WAVE-BUILD-SPEC.md section 4 / OpenZeppelin MerkleProof.sol (processProof/_hashPair) and StandardMerkleTree's (address,uint256) double-hash leaf convention; the same vendored @noble/hashes keccak_256 bundle SPEC-X402-CRYPTO-CORE-1-2026-08-09.md section 3 already named -- no new vendoring, no hand-rolled hashing. Every vector's output_payload was produced by executing compute() directly (never hand-typed), including an independent re-derivation of each Merkle tree/root in a separate throwaway script that agreed byte-for-byte with the kernel's own recompute before being copied in here.",
  "vectors": [
    {
      "name": "depth-0-single-leaf-empty-proof",
      "policy_parameters": {
        "address": "0x1111111111111111111111111111111111111111",
        "amount": "1000000000000000000",
        "encoding_variant": "double-hash",
        "proof": [],
        "claimed_root": "0xb38ec842db1cd54e5e5ce48491f1a404551e9726ebda349d0478e189e0996dd4"
      },
      "output_payload": {
        "leaf": "0xb38ec842db1cd54e5e5ce48491f1a404551e9726ebda349d0478e189e0996dd4",
        "computed_root": "0xb38ec842db1cd54e5e5ce48491f1a404551e9726ebda349d0478e189e0996dd4",
        "path": [],
        "encoding_variant_used": "double-hash",
        "pair_sort_used": true,
        "root_matches_claimed": true,
        "path_intact": null,
        "first_divergent_step": null,
        "note": "Pure hash recomputation over caller-declared leaf fields and sibling path -- OpenZeppelin MerkleProof.verify shape (leaf, then _hashPair per proof step, compared to claimed_root). This kernel does NOT know whether claimed_root is the root actually recorded on any chain, whether this leaf's airdrop allocation has already been claimed/redeemed, whether the underlying Merkle tree was constructed correctly from the full allocation list, or who controls the address. It only reports whether the supplied leaf + proof recompute to claimed_root, and (when a claimed_path is supplied for re-verification) the earliest step at which the recompute diverges from that claim.",
        "reasons": []
      },
      "golden_hash": "f8734c6473324221a85d6aab4a992ae298b65078ca244032edf9a94f9176b11e"
    },
    {
      "name": "depth-2-four-leaf-tree-sorted-pair-match",
      "policy_parameters": {
        "address": "0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
        "amount": "500000000000000000",
        "encoding_variant": "double-hash",
        "proof": [
          "0x865dedfe6cef2f8cf9268591348753e1e7b38ea9b3a034f7652f509c1de02715",
          "0x9c4a3c85fe1bc11f77cb8969a0cfd2274e650bccff41be7fe6e07d7393c646a2"
        ],
        "claimed_root": "0xbe1908a4af2c584df499732c668c2ede9fea42a9dab52245a9a01fe0c65e5e79"
      },
      "output_payload": {
        "leaf": "0xd2249cd7cbfe9fc2fa5992b91d5dde24f951706bb96dbb9e6d32b0bf2fdd9b1e",
        "computed_root": "0xbe1908a4af2c584df499732c668c2ede9fea42a9dab52245a9a01fe0c65e5e79",
        "path": [
          {
            "step": 0,
            "sibling": "0x865dedfe6cef2f8cf9268591348753e1e7b38ea9b3a034f7652f509c1de02715",
            "position_used": null,
            "running_hash": "0x7abb58a29d55a10f8deb85991d7cf6d3434c4a95677520344d74b3e321da01ad"
          },
          {
            "step": 1,
            "sibling": "0x9c4a3c85fe1bc11f77cb8969a0cfd2274e650bccff41be7fe6e07d7393c646a2",
            "position_used": null,
            "running_hash": "0xbe1908a4af2c584df499732c668c2ede9fea42a9dab52245a9a01fe0c65e5e79"
          }
        ],
        "encoding_variant_used": "double-hash",
        "pair_sort_used": true,
        "root_matches_claimed": true,
        "path_intact": null,
        "first_divergent_step": null,
        "note": "Pure hash recomputation over caller-declared leaf fields and sibling path -- OpenZeppelin MerkleProof.verify shape (leaf, then _hashPair per proof step, compared to claimed_root). This kernel does NOT know whether claimed_root is the root actually recorded on any chain, whether this leaf's airdrop allocation has already been claimed/redeemed, whether the underlying Merkle tree was constructed correctly from the full allocation list, or who controls the address. It only reports whether the supplied leaf + proof recompute to claimed_root, and (when a claimed_path is supplied for re-verification) the earliest step at which the recompute diverges from that claim.",
        "reasons": []
      },
      "golden_hash": "7d191a63a74508164898108d116278189195f2d5dc10ed05e80733fc37e0eb22"
    },
    {
      "name": "single-hash-variant-explicit-position-no-sort",
      "policy_parameters": {
        "address": "0x1234567890123456789012345678901234567890",
        "amount": "42",
        "encoding_variant": "single-hash",
        "pair_sort": false,
        "proof": [
          {
            "sibling": "0x847778049841a11c34004b445564c4844aa96db4699ce61e94a67a178226a8fa",
            "position": "right"
          }
        ],
        "claimed_root": "0x633e56a4f06768a2ffa3b19c510d4dd1097b77171eaae8e6738f8fb9d4a8a2b5"
      },
      "output_payload": {
        "leaf": "0x4220827be32e7c245e0cc491b25d54bf231d74059611d02456f351610e80d78c",
        "computed_root": "0x633e56a4f06768a2ffa3b19c510d4dd1097b77171eaae8e6738f8fb9d4a8a2b5",
        "path": [
          {
            "step": 0,
            "sibling": "0x847778049841a11c34004b445564c4844aa96db4699ce61e94a67a178226a8fa",
            "position_used": "right",
            "running_hash": "0x633e56a4f06768a2ffa3b19c510d4dd1097b77171eaae8e6738f8fb9d4a8a2b5"
          }
        ],
        "encoding_variant_used": "single-hash",
        "pair_sort_used": false,
        "root_matches_claimed": true,
        "path_intact": null,
        "first_divergent_step": null,
        "note": "Pure hash recomputation over caller-declared leaf fields and sibling path -- OpenZeppelin MerkleProof.verify shape (leaf, then _hashPair per proof step, compared to claimed_root). This kernel does NOT know whether claimed_root is the root actually recorded on any chain, whether this leaf's airdrop allocation has already been claimed/redeemed, whether the underlying Merkle tree was constructed correctly from the full allocation list, or who controls the address. It only reports whether the supplied leaf + proof recompute to claimed_root, and (when a claimed_path is supplied for re-verification) the earliest step at which the recompute diverges from that claim.",
        "reasons": []
      },
      "golden_hash": "9ba836cbc0ec1f1080a75624ab6159f0661c8e26b84656edc35bd7e8f6f73925"
    },
    {
      "name": "diverges-at-step-0-tampered-claimed-path",
      "policy_parameters": {
        "address": "0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
        "amount": "500000000000000000",
        "encoding_variant": "double-hash",
        "proof": [
          "0x865dedfe6cef2f8cf9268591348753e1e7b38ea9b3a034f7652f509c1de02715",
          "0x9c4a3c85fe1bc11f77cb8969a0cfd2274e650bccff41be7fe6e07d7393c646a2"
        ],
        "claimed_root": "0xbe1908a4af2c584df499732c668c2ede9fea42a9dab52245a9a01fe0c65e5e79",
        "claimed_path": [
          "0x0000000000000000000000000000000000000000000000000000000000000001",
          "0xbe1908a4af2c584df499732c668c2ede9fea42a9dab52245a9a01fe0c65e5e79"
        ]
      },
      "output_payload": {
        "leaf": "0xd2249cd7cbfe9fc2fa5992b91d5dde24f951706bb96dbb9e6d32b0bf2fdd9b1e",
        "computed_root": "0xbe1908a4af2c584df499732c668c2ede9fea42a9dab52245a9a01fe0c65e5e79",
        "path": [
          {
            "step": 0,
            "sibling": "0x865dedfe6cef2f8cf9268591348753e1e7b38ea9b3a034f7652f509c1de02715",
            "position_used": null,
            "running_hash": "0x7abb58a29d55a10f8deb85991d7cf6d3434c4a95677520344d74b3e321da01ad"
          },
          {
            "step": 1,
            "sibling": "0x9c4a3c85fe1bc11f77cb8969a0cfd2274e650bccff41be7fe6e07d7393c646a2",
            "position_used": null,
            "running_hash": "0xbe1908a4af2c584df499732c668c2ede9fea42a9dab52245a9a01fe0c65e5e79"
          }
        ],
        "encoding_variant_used": "double-hash",
        "pair_sort_used": true,
        "root_matches_claimed": true,
        "path_intact": false,
        "first_divergent_step": 0,
        "note": "Pure hash recomputation over caller-declared leaf fields and sibling path -- OpenZeppelin MerkleProof.verify shape (leaf, then _hashPair per proof step, compared to claimed_root). This kernel does NOT know whether claimed_root is the root actually recorded on any chain, whether this leaf's airdrop allocation has already been claimed/redeemed, whether the underlying Merkle tree was constructed correctly from the full allocation list, or who controls the address. It only reports whether the supplied leaf + proof recompute to claimed_root, and (when a claimed_path is supplied for re-verification) the earliest step at which the recompute diverges from that claim.",
        "reasons": []
      },
      "golden_hash": "0863b2173c84ba0113f63f8ccf868e6242e891d18b0f39f3d7c2b13a01db34f9"
    },
    {
      "name": "malformed-empty-input-indeterminate",
      "policy_parameters": {},
      "output_payload": {
        "leaf": null,
        "computed_root": null,
        "path": [],
        "encoding_variant_used": null,
        "pair_sort_used": true,
        "root_matches_claimed": null,
        "path_intact": null,
        "first_divergent_step": null,
        "note": "Pure hash recomputation over caller-declared leaf fields and sibling path -- OpenZeppelin MerkleProof.verify shape (leaf, then _hashPair per proof step, compared to claimed_root). This kernel does NOT know whether claimed_root is the root actually recorded on any chain, whether this leaf's airdrop allocation has already been claimed/redeemed, whether the underlying Merkle tree was constructed correctly from the full allocation list, or who controls the address. It only reports whether the supplied leaf + proof recompute to claimed_root, and (when a claimed_path is supplied for re-verification) the earliest step at which the recompute diverges from that claim.",
        "reasons": [
          "address is required and must be a 0x-prefixed 20-byte (40 hex char) address",
          "amount is required and must be a non-negative uint256, as a decimal or 0x-hex string",
          "claimed_root is required and must be a 0x-prefixed 32-byte (64 hex char) hash",
          "proof is required and must be an array (empty array means the leaf is the root)"
        ]
      },
      "golden_hash": "7e92aaf8039ac62d40bed34ade03e8df9100944c8b5bb06ca0d6de9d3dd36f0a"
    }
  ]
}
