{
  "tool_id": "art-590-x402-eip712-digest-recomputer",
  "note": "golden_hash filled by `node golden-parity.test.mjs --update`. domain_separator/struct_hash/digest for every vector below are cross-checked against an independent Python (pycryptodome Keccak) re-implementation, itself anchored on two externally-published references: the EIP-712 spec's own Example.sol 'Ether Mail' domain-separator vector (0xf2cee375fa42b42143804025fc449deafd50cc031ca257e0b194a650a912090f), and the TransferWithAuthorization typehash confirmed against Circle's production circlefin/stablecoin-evm EIP3009.sol (0x7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267) -- not round-trip self-tests of this kernel alone (SPEC-X402-CRYPTO-CORE-1-2026-08-09.md section 4).",
  "vectors": [
    {
      "name": "usdc-mainnet-domain",
      "policy_parameters": {
        "name": "USD Coin",
        "version": "2",
        "chainId": 1,
        "verifyingContract": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
        "from": "0x2A1530C4C41db0B0b2bB646CB5Eb1A67b7158667",
        "to": "0xFFcf8FDEE72ac11b5c542428B35EEF5769C409f2",
        "value": 1000000,
        "validAfter": 0,
        "validBefore": 2000000000,
        "nonce": "0x0000000000000000000000000000000000000000000000000000000000000001"
      },
      "output_payload": {
        "verdict": "DIGEST_COMPUTED",
        "reasons": [],
        "domain": {
          "name": "USD Coin",
          "version": "2",
          "chain_id": "1",
          "verifying_contract": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
        },
        "authorization": {
          "from": "0x2a1530c4c41db0b0b2bb646cb5eb1a67b7158667",
          "to": "0xffcf8fdee72ac11b5c542428b35eef5769c409f2",
          "value": "1000000",
          "valid_after": "0",
          "valid_before": "2000000000",
          "nonce": "0x0000000000000000000000000000000000000000000000000000000000000001"
        },
        "domain_separator": "0x06c37168a7db5138defc7866392bb87a741f9b3d104deb5094588ce041cae335",
        "struct_hash": "0x70eb78101a017556e79276183b47e73810ca4c42f2c19345bdf672ca78d23dd0",
        "digest": "0xb68e5d60d6169bad9739d30399af8f8c7378d464d25f4d971911ab65ef0b014b",
        "domain_typehash": "0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f",
        "transfer_with_authorization_typehash": "0x7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267",
        "scope_note": "Recomputes the EIP-712 digest for an EIP-3009 TransferWithAuthorization struct from caller-supplied domain and authorization fields only. Makes no claim about signature validity, on-chain settlement, or spend -- this node performs no signature recovery and no domain/nonce/window checks (see the sibling x402-signer-recovery-verifier and x402-domain-nonce-window-checker nodes). Zero network calls; every field is caller-supplied and echoed, never independently resolved."
      },
      "golden_hash": "f51e39c4dc2d9a1b527b3ce976d102284208db82fb8f7cd23b6014f103932ab7"
    },
    {
      "name": "usdc-base-domain",
      "policy_parameters": {
        "name": "USD Coin",
        "version": "2",
        "chainId": 8453,
        "verifyingContract": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
        "from": "0x1111111111111111111111111111111111111111",
        "to": "0x2222222222222222222222222222222222222222",
        "value": 500000,
        "validAfter": 1700000000,
        "validBefore": 1800000000,
        "nonce": "0xabababababababababababababababababababababababababababababababab"
      },
      "output_payload": {
        "verdict": "DIGEST_COMPUTED",
        "reasons": [],
        "domain": {
          "name": "USD Coin",
          "version": "2",
          "chain_id": "8453",
          "verifying_contract": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913"
        },
        "authorization": {
          "from": "0x1111111111111111111111111111111111111111",
          "to": "0x2222222222222222222222222222222222222222",
          "value": "500000",
          "valid_after": "1700000000",
          "valid_before": "1800000000",
          "nonce": "0xabababababababababababababababababababababababababababababababab"
        },
        "domain_separator": "0x02fa7265e7c5d81118673727957699e4d68f74cd74b7db77da710fe8a2c7834f",
        "struct_hash": "0xfc4b08be45be6d47af4ad8e8db2008fb1d128b1fe74dda7f1e37ea4f1a03b05c",
        "digest": "0x27718dd92234b13eb1ec01bed1fbd7227338f2c0bbff111c899e02aea7c1d459",
        "domain_typehash": "0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f",
        "transfer_with_authorization_typehash": "0x7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267",
        "scope_note": "Recomputes the EIP-712 digest for an EIP-3009 TransferWithAuthorization struct from caller-supplied domain and authorization fields only. Makes no claim about signature validity, on-chain settlement, or spend -- this node performs no signature recovery and no domain/nonce/window checks (see the sibling x402-signer-recovery-verifier and x402-domain-nonce-window-checker nodes). Zero network calls; every field is caller-supplied and echoed, never independently resolved."
      },
      "golden_hash": "84d9dd7465edb8438748a4c715433ee5133e8f3da0e00e73ba959de9adf82734"
    },
    {
      "name": "synthetic-sepolia-zero-value",
      "policy_parameters": {
        "name": "Test Token",
        "version": "1",
        "chainId": 11155111,
        "verifyingContract": "0xdEdEdEdEdEdEdEdEdEdEdEdEdEdEdEdEdEdEdEdE",
        "from": "0xbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbEbE",
        "to": "0xF0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0",
        "value": 0,
        "validAfter": 0,
        "validBefore": 0,
        "nonce": "0x0000000000000000000000000000000000000000000000000000000000000000"
      },
      "output_payload": {
        "verdict": "DIGEST_COMPUTED",
        "reasons": [],
        "domain": {
          "name": "Test Token",
          "version": "1",
          "chain_id": "11155111",
          "verifying_contract": "0xdededededededededededededededededededede"
        },
        "authorization": {
          "from": "0xbebebebebebebebebebebebebebebebebebebebe",
          "to": "0xf0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0",
          "value": "0",
          "valid_after": "0",
          "valid_before": "0",
          "nonce": "0x0000000000000000000000000000000000000000000000000000000000000000"
        },
        "domain_separator": "0xff803b960f8e13764ea958f1698198810ea9c862961b4ac0134bf2a9a4374d30",
        "struct_hash": "0xb874f90321ff1b8b38f2191b60072ea096b7e27aea1096e899e098ecda6a80d9",
        "digest": "0x4302ecae4565ab562dec0e20ef54c3542b526539c85a6533e927ef3e1672f3c6",
        "domain_typehash": "0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f",
        "transfer_with_authorization_typehash": "0x7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267",
        "scope_note": "Recomputes the EIP-712 digest for an EIP-3009 TransferWithAuthorization struct from caller-supplied domain and authorization fields only. Makes no claim about signature validity, on-chain settlement, or spend -- this node performs no signature recovery and no domain/nonce/window checks (see the sibling x402-signer-recovery-verifier and x402-domain-nonce-window-checker nodes). Zero network calls; every field is caller-supplied and echoed, never independently resolved."
      },
      "golden_hash": "9951847e992278889d5ea1cfcf9970ba3f30856c1c077076b12de7ab86154c1d"
    },
    {
      "name": "missing-domain-fields-indeterminate",
      "policy_parameters": {},
      "output_payload": {
        "verdict": "INDETERMINATE",
        "reasons": [
          "name is required (EIP-712 domain field, never defaulted)",
          "version is required (EIP-712 domain field, never defaulted)",
          "chainId is required and must be a non-negative uint256 (EIP-712 domain field, never defaulted)",
          "verifyingContract is required and must be a 20-byte hex address (EIP-712 domain field, never defaulted -- a guessed value defeats domain separation)",
          "from is required and must be a 20-byte hex address",
          "to is required and must be a 20-byte hex address",
          "value is required and must be a non-negative uint256",
          "validAfter is required and must be a non-negative uint256",
          "validBefore is required and must be a non-negative uint256",
          "nonce is required and must be a 32-byte hex value (bytes32)"
        ],
        "domain": {
          "name": null,
          "version": null,
          "chain_id": null,
          "verifying_contract": null
        },
        "authorization": {
          "from": null,
          "to": null,
          "value": null,
          "valid_after": null,
          "valid_before": null,
          "nonce": null
        },
        "domain_separator": null,
        "struct_hash": null,
        "digest": null,
        "domain_typehash": "0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f",
        "transfer_with_authorization_typehash": "0x7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267",
        "scope_note": "Recomputes the EIP-712 digest for an EIP-3009 TransferWithAuthorization struct from caller-supplied domain and authorization fields only. Makes no claim about signature validity, on-chain settlement, or spend -- this node performs no signature recovery and no domain/nonce/window checks (see the sibling x402-signer-recovery-verifier and x402-domain-nonce-window-checker nodes). Zero network calls; every field is caller-supplied and echoed, never independently resolved."
      },
      "golden_hash": "a65a34eb8548b83556b388b0ab661a24fa65a25ba8648eb1351cf7f585cab6c7"
    }
  ]
}
