@xfuel/verify 0.3.0 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +37 -16
  2. package/dist/anchor-trust.d.ts +129 -0
  3. package/dist/anchor-trust.d.ts.map +1 -0
  4. package/dist/anchor-trust.js +395 -0
  5. package/dist/anchor-trust.js.map +1 -0
  6. package/dist/anchor-witness.d.ts +134 -7
  7. package/dist/anchor-witness.d.ts.map +1 -1
  8. package/dist/anchor-witness.js +497 -44
  9. package/dist/anchor-witness.js.map +1 -1
  10. package/dist/carry-forward.d.ts +79 -0
  11. package/dist/carry-forward.d.ts.map +1 -0
  12. package/dist/carry-forward.js +184 -0
  13. package/dist/carry-forward.js.map +1 -0
  14. package/dist/cli.js +674 -30
  15. package/dist/cli.js.map +1 -1
  16. package/dist/epoch.d.ts +143 -0
  17. package/dist/epoch.d.ts.map +1 -0
  18. package/dist/epoch.js +352 -0
  19. package/dist/epoch.js.map +1 -0
  20. package/dist/index.d.ts +86 -5
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +395 -118
  23. package/dist/index.js.map +1 -1
  24. package/dist/issuer-history.d.ts +19 -0
  25. package/dist/issuer-history.d.ts.map +1 -1
  26. package/dist/issuer-history.js +131 -75
  27. package/dist/issuer-history.js.map +1 -1
  28. package/dist/issuer-pin.d.ts +126 -0
  29. package/dist/issuer-pin.d.ts.map +1 -0
  30. package/dist/issuer-pin.js +567 -0
  31. package/dist/issuer-pin.js.map +1 -0
  32. package/dist/preimage.d.ts +29 -0
  33. package/dist/preimage.d.ts.map +1 -1
  34. package/dist/preimage.js +162 -2
  35. package/dist/preimage.js.map +1 -1
  36. package/dist/receipt-lane.d.ts +1 -0
  37. package/dist/receipt-lane.d.ts.map +1 -1
  38. package/dist/receipt-lane.js +5 -2
  39. package/dist/receipt-lane.js.map +1 -1
  40. package/dist/refusal.d.ts +5 -2
  41. package/dist/refusal.d.ts.map +1 -1
  42. package/dist/refusal.js +28 -6
  43. package/dist/refusal.js.map +1 -1
  44. package/dist/request-binding.d.ts +7 -0
  45. package/dist/request-binding.d.ts.map +1 -0
  46. package/dist/request-binding.js +26 -0
  47. package/dist/request-binding.js.map +1 -0
  48. package/dist/row-hash.d.ts +22 -0
  49. package/dist/row-hash.d.ts.map +1 -0
  50. package/dist/row-hash.js +26 -0
  51. package/dist/row-hash.js.map +1 -0
  52. package/dist/v11-receipt.d.ts +21 -0
  53. package/dist/v11-receipt.d.ts.map +1 -0
  54. package/dist/v11-receipt.js +351 -0
  55. package/dist/v11-receipt.js.map +1 -0
  56. package/package.json +1 -1
package/README.md CHANGED
@@ -31,9 +31,14 @@ console.log(fullResult.receipt_lane.freeze); // unsigned; does not change overal
31
31
  ### CLI
32
32
 
33
33
  ```bash
34
- # Local binding verification (no network required)
34
+ # Local binding verification.
35
+ # Issuer history is fetched unless you pass --issuer-history-file or --no-issuer-history.
36
+ # A payload v10 receipt fails offline (exit 1) when that fetch cannot run.
35
37
  npx xfuel-verify receipt.json
36
38
 
39
+ # Explicit offline. --no-issuer-history skips the kid window.
40
+ npx xfuel-verify receipt.json --no-issuer-history
41
+
37
42
  # Hash the canonical object (must match signed payload_hash) and read not_after
38
43
  # from a pinned issuer-history snapshot. Both flags are offline.
39
44
  npx xfuel-verify receipt.json --canonical-preimage preimage.json --issuer-history-file issuer-history.json
@@ -65,9 +70,10 @@ npx xfuel-verify receipt.json inclusion.json head.json --rpc
65
70
  | Output hash | No | Hash is on the receipt |
66
71
  | On-chain settlement | Yes | Query Base RPC for tx |
67
72
  | Nullifier anchor | Yes | Query ZKVerifierSP1 contract |
68
- | Anchored receipt root | Yes, with `--rpc` | Inclusion proof, then Solana memo and Base calldata for that root |
73
+ | Tree head and inclusion | No | Head ES256 signature over size and root, then an index-and-size-bound inclusion proof |
74
+ | Anchored receipt root | Yes, with `--rpc` | The offline head and inclusion checks, then Solana memo and fee payer and Base calldata and sender |
69
75
  | Canonical preimage | No | SHA-256 of `--canonical-preimage`, or the stored canonical object, matches signed `payload_hash` |
70
- | Issuer history | No, with `--issuer-history-file` | `iat` is inside the kid's `not_before` / `not_after`. A payload v10 pin must match the snapshot hash |
76
+ | Issuer history | Yes, unless `--no-issuer-history` or `--issuer-history-file` | `iat` is inside the kid's `not_before` / `not_after`. A payload v10 pin must match the snapshot hash. Offline v10 fails if the fetch cannot run |
71
77
 
72
78
  ## Issuer Signature Verification (ES256)
73
79
 
@@ -81,20 +87,28 @@ counts only when the verifying key is trusted:
81
87
  production kid `IvFpmC-vPhkY_v0vidsrWVT9uzlE5XWKZgAEOeJTq1Q`. Override with
82
88
  `--trusted-kid`, or disable with `--no-trusted-kid`.
83
89
 
90
+ The epoch record and the tree head use those same sources, with or without `--rpc`. `xfuel-verify receipt.json inclusion.json head.json` checks the head signature and the inclusion proof offline. `--rpc` adds the chain checks. An embedded key still has to match the trusted-kid pin, or the kid has to be in a verified issuer-history entry. The head's signed `anchors.base.from` and `anchors.solana.fee_payer` must be on the anchor-wallet list (the package pin, or a verified `/.well-known/anchor-wallets.json`). The chain sender and fee payer must be those wallets. `--version` prints the package version.
91
+
92
+ Anchor mode also checks a content-addressed issuer pin when the receipt or the head carries `issuer_key_pin`, or when you pass `--issuer-pin`. The pin is a 40-hex commit plus the SHA-256 of `docs/well-known/issuer-key.json`. A branch name is not fetched. A claimed pin requires `issuer_signature.jws` verified under that key. Unsigned envelope kids do not satisfy the check. The registration self-signature is checked when the file has one. A claimed era with no pin fails `ISSUER_PIN_DOWNGRADE`. Receipts that do not claim the era skip this check. The pin chain is Base Sepolia (`eip155:84532`). See [issuer-key-pin.md](../../docs/product/issuer-key-pin.md).
93
+
84
94
  `issuer_jwk` on the receipt is not a trust root. A copy re-signed with an
85
95
  arbitrary P-256 key reports `key untrusted` (`issuer_signature.valid === false`),
86
96
  including when `--jwks-file` points at the real JWKS.
87
97
 
88
98
  ```bash
89
- # Offline: default production pin, no network
90
- npx xfuel-verify receipt.json
91
-
92
- # Recompute published preimages and check the kid window.
93
- # A payload v10 receipt pins issuer_history. Hash the stored canonical object:
94
- curl -sS "https://api.chit402.com/receipt/RECEIPT_ID?format=json" -o receipt.json
95
- curl -sS "https://api.chit402.com/receipt/RECEIPT_ID/preimage" -o preimage.json
96
- curl -sS "https://api.chit402.com/.well-known/issuer-history.json?version=1" -o issuer-history.json
97
- npx xfuel-verify receipt.json --canonical-preimage preimage.json --issuer-history-file issuer-history.json
99
+ # Explicit offline. The default command fetches issuer history.
100
+ npx xfuel-verify receipt.json --no-issuer-history
101
+
102
+ # Recompute a published canonical preimage and check the kid window.
103
+ # curl -f stops on HTTP errors. Most receipts have no /preimage (a 404).
104
+ # A missing preimage is not a verification failure: omit --canonical-preimage.
105
+ curl -fsS "https://api.chit402.com/receipt/RECEIPT_ID?format=json" -o receipt.json
106
+ curl -fsS "https://api.chit402.com/.well-known/issuer-history.json?version=1" -o issuer-history.json
107
+ if curl -fsS "https://api.chit402.com/receipt/RECEIPT_ID/preimage" -o preimage.json; then
108
+ npx xfuel-verify receipt.json --canonical-preimage preimage.json --issuer-history-file issuer-history.json
109
+ else
110
+ npx xfuel-verify receipt.json --issuer-history-file issuer-history.json
111
+ fi
98
112
 
99
113
  # Trust the published JWKS instead of (or in addition to) the pin
100
114
  curl -o issuer-jwks.json https://api.chit402.com/.well-known/jwks.json
@@ -111,13 +125,20 @@ const result = await verifyReceipt(receipt);
111
125
  console.log(result.issuer_signature.valid); // true only for a trusted key
112
126
  console.log(result.issuer_signature.key_trusted);
113
127
  console.log(result.amount_usdc); // from verified claims, not the outer copy
114
- console.log(result.claim_mismatches); // outer payment / caller_binding vs JWS
128
+ console.log(result.claim_mismatches); // any signed path whose outer copy disagrees
129
+ console.log(result.unsigned_fields); // outer paths the signature does not cover
130
+ console.log(result.verified_scope); // 'signed_claims'
115
131
  ```
116
132
 
117
133
  Amount, payer, payee, asset, and tx are read from the verified JWS claims.
118
- If the unsigned outer `payment` or `caller_binding` disagrees, verification
119
- fails. `--check-payer` on Base confirms payer, payee, asset, and amount in the
120
- USDC `Transfer` log.
134
+ Every signed path is compared with the outer receipt. A mismatch fails.
135
+ Paths the signature does not cover are `unsigned_fields` and are printed as
136
+ `UNVERIFIED`. Overall does not verify them. The outer document `schema` is
137
+ not a copy of the JWS `schema`. `--check-payer` on Base confirms payer, payee,
138
+ asset, and amount in the USDC `Transfer` log.
139
+
140
+ `xfuel-verify receipt.json inclusion.json head.json` also runs those receipt
141
+ checks. A matching inclusion proof does not make a tampered receipt VERIFIED.
121
142
 
122
143
  A paid USDC receipt whose signed `binding.expected_commitment` is null is
123
144
  reported as “No payment-binding commitment”, not as an unmetered or TFUEL receipt.
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Bind an anchored tree head to the issuer.
3
+ *
4
+ * Anchor mode trusts a head only when its ES256 `issuer_signature` verifies
5
+ * under the same rules as a receipt: a JWKS key matched by kid, an embedded
6
+ * key whose RFC 7638 thumbprint is a pinned kid, or a kid in a verified
7
+ * issuer-history document. The signed payload must match the outer fields
8
+ * the anchor check uses.
9
+ *
10
+ * The Base sender and the Solana fee payer in that payload must be on the
11
+ * issuer's anchor-wallet list, and the transactions the RPC returns must
12
+ * have been sent by those wallets.
13
+ *
14
+ * The list is the package pin, plus wallets inside a verified
15
+ * `chit402.anchor_wallets.v1` document or a verified issuer-history
16
+ * payload's `anchor_wallets`. Two later sources are named and not read:
17
+ * the Base `ChitIssuerRoot` registry (draft #485) and the DNS TXT at
18
+ * `_issuer.chit402.com`. This module does not embed a registry address
19
+ * and does not resolve DNS.
20
+ */
21
+ import { type Es256Jwk } from './jws.js';
22
+ import { type IssuerHistoryDocument } from './issuer-history.js';
23
+ /** Confirmed sender of Base tx 0x1d8d7ea255170c8d4b87bef9382e13555dded2072fd877ce35f995f1ab54ee09. */
24
+ export declare const PINNED_BASE_ANCHOR_WALLET = "0x1844D1F5FE42aff1Cce6F776514Fd40374079582";
25
+ /** Fee payer of Solana memo 61RHMsPPseUc35v5oxDEtANEDCvXk5fmxZdrFDMknGWc5m7U8YhMfz4En1eFFj3z9n67ZtMiha1zkwnneL2LUiXk. */
26
+ export declare const PINNED_SOLANA_ANCHOR_FEE_PAYER = "BHTnbPu6UZ7zQZ7Qpkpz4LcUQbMN73YDsMtvaNXpEioD";
27
+ /** A head signed before `anchors.base.from` and `anchors.solana.fee_payer` existed. Never VERIFIED. */
28
+ export declare const LEGACY_HEAD_UNPINNED_SIGNER = "LEGACY_HEAD_UNPINNED_SIGNER";
29
+ export declare const ANCHOR_WALLETS_SCHEMA = "chit402.anchor_wallets.v1";
30
+ export declare const ANCHOR_WALLETS_JWT_TYP = "chit402-anchor-wallets+jwt";
31
+ /** Sources this version does not query. A later build can fill the same list. */
32
+ export declare const ANCHOR_WALLET_SOURCES_NOT_CONSULTED: readonly ["issuer_root", "dns"];
33
+ export declare const HEAD_TRUST_MESSAGES: Record<string, string>;
34
+ interface JwksLike {
35
+ keys?: Es256Jwk[];
36
+ }
37
+ export interface TreeHeadDocument {
38
+ schema?: string;
39
+ payload_version?: number;
40
+ root?: string | null;
41
+ tree_size?: number | null;
42
+ epoch?: number | null;
43
+ prev_epoch_root?: string | null;
44
+ prev_epoch_size?: number | null;
45
+ published_at?: string | null;
46
+ anchors?: {
47
+ base?: {
48
+ status?: string | null;
49
+ tx?: string | null;
50
+ calldata?: string | null;
51
+ chain_id?: number | null;
52
+ from?: string | null;
53
+ } | null;
54
+ solana?: {
55
+ status?: string | null;
56
+ signature?: string | null;
57
+ slot?: number | null;
58
+ cluster?: string | null;
59
+ memo?: string | null;
60
+ fee_payer?: string | null;
61
+ } | null;
62
+ } | null;
63
+ issuer_signature?: {
64
+ jws?: string;
65
+ kid?: string;
66
+ issuer_jwk?: Es256Jwk;
67
+ };
68
+ }
69
+ export interface HeadTrustResult {
70
+ ok: boolean;
71
+ reason: string | null;
72
+ message: string | null;
73
+ kid: string | null;
74
+ trust: 'jwks' | 'pinned_kid' | 'issuer_history' | null;
75
+ payload: Record<string, unknown> | null;
76
+ }
77
+ export interface AnchorWalletList {
78
+ base: string[];
79
+ solana: string[];
80
+ sources: Array<'pin' | 'well_known' | 'issuer_history'>;
81
+ not_consulted: readonly ['issuer_root', 'dns'];
82
+ }
83
+ /**
84
+ * True when a verified head anchors a chain but the signature does not name
85
+ * that chain's signer. Those fields were added after the epoch-1 head and
86
+ * after the epoch-2 head signed at 07:43 ET on 2026-10-07. A pending side
87
+ * is not this case.
88
+ */
89
+ export declare function headOmitsPinnedSigner(payload: Record<string, unknown> | null | undefined): boolean;
90
+ /** Signed payload must carry the same root, size, epoch, and anchors the check uses. */
91
+ export declare function headClaimsMatch(outer: TreeHeadDocument, payload: Record<string, unknown>): string | null;
92
+ export declare function verifyTreeHeadTrust(head: TreeHeadDocument | null | undefined, { jwks, trustedKids, issuerHistory, strictIssuerHistory, }?: {
93
+ jwks?: JwksLike;
94
+ trustedKids?: readonly string[];
95
+ issuerHistory?: IssuerHistoryDocument | null;
96
+ strictIssuerHistory?: boolean;
97
+ }): HeadTrustResult;
98
+ export declare function verifyAnchorWalletDocument(doc: {
99
+ schema?: string;
100
+ base?: unknown;
101
+ solana?: unknown;
102
+ issuer_signature?: {
103
+ jws?: string;
104
+ issuer_jwk?: Es256Jwk;
105
+ };
106
+ } | null | undefined, { jwks, trustedKids }?: {
107
+ jwks?: JwksLike;
108
+ trustedKids?: readonly string[];
109
+ }): {
110
+ ok: true;
111
+ base: string[];
112
+ solana: string[];
113
+ } | {
114
+ ok: false;
115
+ reason: string;
116
+ };
117
+ export declare function compileAnchorWallets({ jwks, trustedKids, issuerHistory, published, }?: {
118
+ jwks?: JwksLike;
119
+ trustedKids?: readonly string[];
120
+ issuerHistory?: IssuerHistoryDocument | null;
121
+ published?: {
122
+ base: string[];
123
+ solana: string[];
124
+ } | null;
125
+ }): AnchorWalletList;
126
+ export declare function walletListed(list: readonly string[], value: string, chain: 'base' | 'solana'): boolean;
127
+ export declare function sameBaseAddress(left: string, right: string): boolean;
128
+ export {};
129
+ //# sourceMappingURL=anchor-trust.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchor-trust.d.ts","sourceRoot":"","sources":["../src/anchor-trust.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,395 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HEAD_TRUST_MESSAGES = exports.ANCHOR_WALLET_SOURCES_NOT_CONSULTED = exports.ANCHOR_WALLETS_JWT_TYP = exports.ANCHOR_WALLETS_SCHEMA = exports.LEGACY_HEAD_UNPINNED_SIGNER = exports.PINNED_SOLANA_ANCHOR_FEE_PAYER = exports.PINNED_BASE_ANCHOR_WALLET = void 0;
4
+ exports.headOmitsPinnedSigner = headOmitsPinnedSigner;
5
+ exports.headClaimsMatch = headClaimsMatch;
6
+ exports.verifyTreeHeadTrust = verifyTreeHeadTrust;
7
+ exports.verifyAnchorWalletDocument = verifyAnchorWalletDocument;
8
+ exports.compileAnchorWallets = compileAnchorWallets;
9
+ exports.walletListed = walletListed;
10
+ exports.sameBaseAddress = sameBaseAddress;
11
+ /**
12
+ * Bind an anchored tree head to the issuer.
13
+ *
14
+ * Anchor mode trusts a head only when its ES256 `issuer_signature` verifies
15
+ * under the same rules as a receipt: a JWKS key matched by kid, an embedded
16
+ * key whose RFC 7638 thumbprint is a pinned kid, or a kid in a verified
17
+ * issuer-history document. The signed payload must match the outer fields
18
+ * the anchor check uses.
19
+ *
20
+ * The Base sender and the Solana fee payer in that payload must be on the
21
+ * issuer's anchor-wallet list, and the transactions the RPC returns must
22
+ * have been sent by those wallets.
23
+ *
24
+ * The list is the package pin, plus wallets inside a verified
25
+ * `chit402.anchor_wallets.v1` document or a verified issuer-history
26
+ * payload's `anchor_wallets`. Two later sources are named and not read:
27
+ * the Base `ChitIssuerRoot` registry (draft #485) and the DNS TXT at
28
+ * `_issuer.chit402.com`. This module does not embed a registry address
29
+ * and does not resolve DNS.
30
+ */
31
+ const jws_js_1 = require("./jws.js");
32
+ const issuer_history_js_1 = require("./issuer-history.js");
33
+ /** Confirmed sender of Base tx 0x1d8d7ea255170c8d4b87bef9382e13555dded2072fd877ce35f995f1ab54ee09. */
34
+ exports.PINNED_BASE_ANCHOR_WALLET = '0x1844D1F5FE42aff1Cce6F776514Fd40374079582';
35
+ /** Fee payer of Solana memo 61RHMsPPseUc35v5oxDEtANEDCvXk5fmxZdrFDMknGWc5m7U8YhMfz4En1eFFj3z9n67ZtMiha1zkwnneL2LUiXk. */
36
+ exports.PINNED_SOLANA_ANCHOR_FEE_PAYER = 'BHTnbPu6UZ7zQZ7Qpkpz4LcUQbMN73YDsMtvaNXpEioD';
37
+ /** A head signed before `anchors.base.from` and `anchors.solana.fee_payer` existed. Never VERIFIED. */
38
+ exports.LEGACY_HEAD_UNPINNED_SIGNER = 'LEGACY_HEAD_UNPINNED_SIGNER';
39
+ exports.ANCHOR_WALLETS_SCHEMA = 'chit402.anchor_wallets.v1';
40
+ exports.ANCHOR_WALLETS_JWT_TYP = 'chit402-anchor-wallets+jwt';
41
+ /** Sources this version does not query. A later build can fill the same list. */
42
+ exports.ANCHOR_WALLET_SOURCES_NOT_CONSULTED = ['issuer_root', 'dns'];
43
+ exports.HEAD_TRUST_MESSAGES = {
44
+ head_signature_missing: 'Tree head has no issuer_signature. Anchor mode requires a valid ES256 signature from a trusted issuer key.',
45
+ head_signature_invalid: 'Tree head issuer_signature is not a valid ES256 signature.',
46
+ head_key_untrusted: 'Tree head kid is not trusted. Trust is the production pin, a verified issuer-history entry, or a JWKS key matched by kid.',
47
+ head_claims_mismatch: 'Signed tree head does not match the root, size, epoch, or anchors on the head.',
48
+ head_kid_window: 'Tree head kid is outside its issuer-history window.',
49
+ published_at_missing: 'Tree head has no published_at. The kid is revoked or has not_after, so the window cannot be checked.',
50
+ issuer_history_invalid: 'Issuer history did not verify, so the tree head key was not trusted from it.',
51
+ anchor_wallets_invalid: 'Issuer anchor-wallet list did not verify.',
52
+ anchor_sender_missing: 'Signed head does not name anchors.base.from. An anchored Base transaction must name its sender.',
53
+ fee_payer_missing: 'Signed head does not name anchors.solana.fee_payer. An anchored Solana memo must name its fee payer.',
54
+ LEGACY_HEAD_UNPINNED_SIGNER: 'This tree head was signed before anchor signer pinning. It does not name the Base sender or the Solana fee payer. Use a newer head.',
55
+ anchor_sender_unlisted: 'Base anchor wallet is not on the issuer anchor-wallet list.',
56
+ fee_payer_unlisted: 'Solana fee payer is not on the issuer anchor-wallet list.',
57
+ sender_mismatch: 'Base transaction sender does not match the signed anchor wallet.',
58
+ fee_payer_mismatch: 'Solana fee payer does not match the signed fee payer.',
59
+ };
60
+ function jwksCandidates(jwks, kid) {
61
+ const keys = jwks?.keys || [];
62
+ const es256 = keys.filter((key) => (0, jws_js_1.isEs256PublicJwk)(key) && (key.alg == null || key.alg === 'ES256'));
63
+ if (!kid)
64
+ return es256;
65
+ return es256.filter((key) => key.kid === kid);
66
+ }
67
+ function decodePayload(jws) {
68
+ const part = jws.split('.')[1];
69
+ if (!part)
70
+ return null;
71
+ try {
72
+ return JSON.parse(Buffer.from(part, 'base64url').toString('utf8'));
73
+ }
74
+ catch {
75
+ return null;
76
+ }
77
+ }
78
+ /**
79
+ * Same ES256 trust order as `verifyIssuerSignatureWithJwks` for a compact JWS:
80
+ * JWKS by kid, then an embedded key whose thumbprint is a pinned kid.
81
+ */
82
+ function trustCompactJws(jws, embedded, jwks, trustedKids) {
83
+ const header = (0, jws_js_1.readJwsHeader)(jws);
84
+ const kid = header?.kid || embedded?.kid || null;
85
+ const fromJwks = jwksCandidates(jwks, kid || undefined);
86
+ for (const key of fromJwks) {
87
+ const verified = (0, jws_js_1.verifyIssuerJws)(jws, key);
88
+ if (verified.valid && verified.payload) {
89
+ return { ok: true, trust: 'jwks', kid: key.kid || kid, payload: verified.payload, reason: '' };
90
+ }
91
+ }
92
+ const pinned = !!(embedded && (0, jws_js_1.isPinnedTrustedJwk)(embedded, trustedKids));
93
+ if (pinned && embedded) {
94
+ const verified = (0, jws_js_1.verifyIssuerJws)(jws, embedded);
95
+ if (verified.valid && verified.payload) {
96
+ return {
97
+ ok: true,
98
+ trust: 'pinned_kid',
99
+ kid: embedded.kid || (0, jws_js_1.jwkThumbprint)(embedded),
100
+ payload: verified.payload,
101
+ reason: '',
102
+ };
103
+ }
104
+ return { ok: false, trust: 'pinned_kid', kid, payload: null, reason: verified.reason || 'head_signature_invalid' };
105
+ }
106
+ if (embedded && (0, jws_js_1.verifyIssuerJws)(jws, embedded).valid) {
107
+ return { ok: false, trust: null, kid: embedded.kid || kid, payload: null, reason: jws_js_1.KEY_UNTRUSTED };
108
+ }
109
+ if (fromJwks.length === 0 && !pinned) {
110
+ return { ok: false, trust: null, kid, payload: null, reason: jws_js_1.KEY_UNTRUSTED };
111
+ }
112
+ return { ok: false, trust: null, kid, payload: null, reason: 'head_signature_invalid' };
113
+ }
114
+ function historyEntryMatches(entry, kid) {
115
+ if (entry.kid === kid)
116
+ return true;
117
+ return Boolean(entry.jwk && (0, jws_js_1.isEs256PublicJwk)(entry.jwk) && (0, jws_js_1.jwkThumbprint)(entry.jwk) === kid);
118
+ }
119
+ function historyEntryKey(doc, kid) {
120
+ if (!kid)
121
+ return null;
122
+ for (const entry of doc.entries || []) {
123
+ if (!entry?.jwk || !(0, jws_js_1.isEs256PublicJwk)(entry.jwk))
124
+ continue;
125
+ if (historyEntryMatches(entry, kid))
126
+ return entry.jwk;
127
+ }
128
+ return null;
129
+ }
130
+ function historyEntriesForKid(doc, kid) {
131
+ return (doc.entries || []).filter((entry) => entry && historyEntryMatches(entry, kid));
132
+ }
133
+ function stable(value) {
134
+ if (Array.isArray(value))
135
+ return `[${value.map((item) => stable(item)).join(',')}]`;
136
+ if (value && typeof value === 'object') {
137
+ const obj = value;
138
+ const keys = Object.keys(obj).sort();
139
+ return `{${keys.map((key) => `${JSON.stringify(key)}:${stable(obj[key])}`).join(',')}}`;
140
+ }
141
+ return JSON.stringify(value ?? null);
142
+ }
143
+ function normalizeRoot(root) {
144
+ const hex = String(root || '').replace(/^0x/, '').toLowerCase();
145
+ return /^[0-9a-f]{64}$/.test(hex) ? hex : null;
146
+ }
147
+ const MATCHED_FIELDS = [
148
+ 'schema',
149
+ 'payload_version',
150
+ 'tree_size',
151
+ 'epoch',
152
+ 'prev_epoch_root',
153
+ 'prev_epoch_size',
154
+ 'published_at',
155
+ 'anchors',
156
+ ];
157
+ function signerNamed(value) {
158
+ return typeof value === 'string' && value.trim() !== '';
159
+ }
160
+ function anchoredSide(side, id) {
161
+ if (!side || side.status === 'pending')
162
+ return false;
163
+ return signerNamed(side[id]);
164
+ }
165
+ /**
166
+ * True when a verified head anchors a chain but the signature does not name
167
+ * that chain's signer. Those fields were added after the epoch-1 head and
168
+ * after the epoch-2 head signed at 07:43 ET on 2026-10-07. A pending side
169
+ * is not this case.
170
+ */
171
+ function headOmitsPinnedSigner(payload) {
172
+ const anchors = payload?.anchors;
173
+ if (!anchors || typeof anchors !== 'object')
174
+ return false;
175
+ const base = anchors.base;
176
+ const solana = anchors.solana;
177
+ if (anchoredSide(base, 'tx') && !signerNamed(base?.from))
178
+ return true;
179
+ if (anchoredSide(solana, 'signature') && !signerNamed(solana?.fee_payer))
180
+ return true;
181
+ return false;
182
+ }
183
+ /** Signed payload must carry the same root, size, epoch, and anchors the check uses. */
184
+ function headClaimsMatch(outer, payload) {
185
+ const outerRoot = normalizeRoot(outer.root);
186
+ const signedRoot = normalizeRoot(payload.root);
187
+ if (!outerRoot || outerRoot !== signedRoot)
188
+ return 'root';
189
+ for (const field of MATCHED_FIELDS) {
190
+ const hasPayload = Object.prototype.hasOwnProperty.call(payload, field);
191
+ const hasOuter = Object.prototype.hasOwnProperty.call(outer, field);
192
+ if (!hasPayload && !hasOuter)
193
+ continue;
194
+ if (hasPayload !== hasOuter)
195
+ return field;
196
+ const signed = payload[field];
197
+ const claimed = outer[field];
198
+ if (field === 'tree_size' || field === 'epoch' || field === 'prev_epoch_size' || field === 'payload_version') {
199
+ if (Number(signed) !== Number(claimed))
200
+ return field;
201
+ continue;
202
+ }
203
+ if (stable(signed) !== stable(claimed))
204
+ return field;
205
+ }
206
+ return null;
207
+ }
208
+ function fail(reason, detail) {
209
+ const base = exports.HEAD_TRUST_MESSAGES[reason] || reason;
210
+ return {
211
+ ok: false,
212
+ reason,
213
+ message: detail ? `${base} (${detail})` : base,
214
+ kid: null,
215
+ trust: null,
216
+ payload: null,
217
+ };
218
+ }
219
+ function verifyTreeHeadTrust(head, { jwks, trustedKids, issuerHistory = null, strictIssuerHistory = false, } = {}) {
220
+ const jws = head?.issuer_signature?.jws;
221
+ if (!jws)
222
+ return fail('head_signature_missing');
223
+ const pins = trustedKids ?? jws_js_1.DEFAULT_TRUSTED_ISSUER_KIDS;
224
+ const embedded = head?.issuer_signature?.issuer_jwk;
225
+ const direct = trustCompactJws(jws, embedded, jwks, pins);
226
+ let trust = direct.trust;
227
+ let payload = direct.payload;
228
+ let kid = direct.kid;
229
+ const historyKeys = jwks?.keys ? { keys: jwks.keys } : undefined;
230
+ let historyOk = false;
231
+ if (issuerHistory) {
232
+ const verified = (0, issuer_history_js_1.verifyIssuerHistoryDocument)(issuerHistory, { jwks: historyKeys, trustedKids: pins });
233
+ if (!verified.valid) {
234
+ return { ...fail('issuer_history_invalid', verified.reason), kid };
235
+ }
236
+ historyOk = true;
237
+ if (!payload) {
238
+ const headerKid = (0, jws_js_1.readJwsHeader)(jws)?.kid || head?.issuer_signature?.kid || null;
239
+ const entryKey = historyEntryKey(issuerHistory, headerKid);
240
+ if (entryKey) {
241
+ const checked = (0, jws_js_1.verifyIssuerJws)(jws, entryKey);
242
+ if (checked.valid && checked.payload) {
243
+ trust = 'issuer_history';
244
+ payload = checked.payload;
245
+ kid = headerKid;
246
+ }
247
+ }
248
+ }
249
+ }
250
+ else if (strictIssuerHistory) {
251
+ return { ...fail('issuer_history_invalid', 'issuer history was required and was not loaded'), kid };
252
+ }
253
+ if (!payload || !trust) {
254
+ if (direct.reason === jws_js_1.KEY_UNTRUSTED)
255
+ return { ...fail('head_key_untrusted'), kid };
256
+ return { ...fail('head_signature_invalid', direct.reason === 'head_signature_invalid' ? undefined : direct.reason), kid };
257
+ }
258
+ const mismatch = headClaimsMatch(head || {}, payload);
259
+ if (mismatch) {
260
+ return { ...fail('head_claims_mismatch', mismatch), kid, payload };
261
+ }
262
+ if (historyOk && issuerHistory && kid) {
263
+ const publishedAt = Object.prototype.hasOwnProperty.call(head || {}, 'published_at')
264
+ ? head?.published_at
265
+ : payload.published_at;
266
+ const window = headHistoryWindow(issuerHistory, kid, publishedAt);
267
+ if (!window.ok) {
268
+ const reason = window.reason === 'published_at_missing' ? 'published_at_missing' : 'head_kid_window';
269
+ const detail = reason === 'head_kid_window' ? (window.reason || undefined) : undefined;
270
+ return { ...fail(reason, detail), kid, trust, payload };
271
+ }
272
+ }
273
+ return { ok: true, reason: null, message: null, kid, trust, payload };
274
+ }
275
+ /**
276
+ * A signed published_at is checked with the receipt window rules.
277
+ * v1 heads omit the field, and a closed head with no observed chain time
278
+ * signs null. That is not issued_at_missing. An active kid with an open
279
+ * window still verifies. A revoked kid, or one with not_after, fails closed
280
+ * because the missing time cannot show the head was signed inside the window.
281
+ */
282
+ function headHistoryWindow(doc, kid, publishedAt) {
283
+ const matches = historyEntriesForKid(doc, kid);
284
+ if (matches.length === 0)
285
+ return { ok: false, reason: 'kid_not_in_history' };
286
+ if (matches.length !== 1)
287
+ return { ok: false, reason: 'kid_ambiguous' };
288
+ const entry = matches[0];
289
+ const hasTime = publishedAt != null && publishedAt !== '';
290
+ if (hasTime)
291
+ return (0, issuer_history_js_1.issuerEntryWindow)(entry, publishedAt);
292
+ const notBefore = entry.not_before ? Date.parse(entry.not_before) : NaN;
293
+ if (!Number.isFinite(notBefore))
294
+ return { ok: false, reason: 'not_before_missing' };
295
+ if (notBefore > Date.now())
296
+ return { ok: false, reason: 'issued_before_not_before' };
297
+ if (entry.status === 'revoked' || entry.not_after != null) {
298
+ return { ok: false, reason: 'published_at_missing' };
299
+ }
300
+ return { ok: true, reason: null };
301
+ }
302
+ function asAddressList(value, chain) {
303
+ if (!Array.isArray(value))
304
+ return [];
305
+ const out = [];
306
+ for (const item of value) {
307
+ if (typeof item !== 'string')
308
+ continue;
309
+ if (chain === 'base') {
310
+ if (/^0x[0-9a-fA-F]{40}$/.test(item))
311
+ out.push(item);
312
+ }
313
+ else if (/^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(item)) {
314
+ out.push(item);
315
+ }
316
+ }
317
+ return out;
318
+ }
319
+ function verifyAnchorWalletDocument(doc, { jwks, trustedKids } = {}) {
320
+ const jws = doc?.issuer_signature?.jws;
321
+ if (!doc || doc.schema !== exports.ANCHOR_WALLETS_SCHEMA || !jws) {
322
+ return { ok: false, reason: 'anchor_wallets_invalid' };
323
+ }
324
+ const pins = trustedKids ?? jws_js_1.DEFAULT_TRUSTED_ISSUER_KIDS;
325
+ const trusted = trustCompactJws(jws, doc.issuer_signature?.issuer_jwk, jwks, pins);
326
+ if (!trusted.ok || !trusted.payload)
327
+ return { ok: false, reason: 'anchor_wallets_invalid' };
328
+ if (trusted.payload.schema !== exports.ANCHOR_WALLETS_SCHEMA)
329
+ return { ok: false, reason: 'anchor_wallets_invalid' };
330
+ const base = asAddressList(trusted.payload.base, 'base');
331
+ const solana = asAddressList(trusted.payload.solana, 'solana');
332
+ if (stable(base) !== stable(asAddressList(doc.base, 'base')))
333
+ return { ok: false, reason: 'anchor_wallets_invalid' };
334
+ if (stable(solana) !== stable(asAddressList(doc.solana, 'solana')))
335
+ return { ok: false, reason: 'anchor_wallets_invalid' };
336
+ return { ok: true, base, solana };
337
+ }
338
+ function walletsFromHistory(doc, jwks, trustedKids) {
339
+ if (!doc?.issuer_signature?.jws)
340
+ return null;
341
+ const verified = (0, issuer_history_js_1.verifyIssuerHistoryDocument)(doc, { jwks: jwks?.keys ? { keys: jwks.keys } : undefined, trustedKids });
342
+ if (!verified.valid)
343
+ return null;
344
+ const payload = decodePayload(doc.issuer_signature.jws);
345
+ const listed = payload?.anchor_wallets;
346
+ if (!listed || typeof listed !== 'object')
347
+ return { base: [], solana: [] };
348
+ const row = listed;
349
+ return { base: asAddressList(row.base, 'base'), solana: asAddressList(row.solana, 'solana') };
350
+ }
351
+ function unique(values, chain) {
352
+ const seen = new Set();
353
+ const out = [];
354
+ for (const value of values) {
355
+ const key = chain === 'base' ? value.toLowerCase() : value;
356
+ if (seen.has(key))
357
+ continue;
358
+ seen.add(key);
359
+ out.push(value);
360
+ }
361
+ return out;
362
+ }
363
+ function compileAnchorWallets({ jwks, trustedKids, issuerHistory = null, published = null, } = {}) {
364
+ const base = [exports.PINNED_BASE_ANCHOR_WALLET];
365
+ const solana = [exports.PINNED_SOLANA_ANCHOR_FEE_PAYER];
366
+ const sources = ['pin'];
367
+ const fromHistory = walletsFromHistory(issuerHistory, jwks, trustedKids);
368
+ if (fromHistory && (fromHistory.base.length || fromHistory.solana.length)) {
369
+ base.push(...fromHistory.base);
370
+ solana.push(...fromHistory.solana);
371
+ sources.push('issuer_history');
372
+ }
373
+ if (published) {
374
+ base.push(...published.base);
375
+ solana.push(...published.solana);
376
+ sources.push('well_known');
377
+ }
378
+ return {
379
+ base: unique(base, 'base'),
380
+ solana: unique(solana, 'solana'),
381
+ sources,
382
+ not_consulted: exports.ANCHOR_WALLET_SOURCES_NOT_CONSULTED,
383
+ };
384
+ }
385
+ function walletListed(list, value, chain) {
386
+ if (chain === 'base') {
387
+ const needle = value.toLowerCase();
388
+ return list.some((item) => item.toLowerCase() === needle);
389
+ }
390
+ return list.includes(value);
391
+ }
392
+ function sameBaseAddress(left, right) {
393
+ return left.toLowerCase() === right.toLowerCase();
394
+ }
395
+ //# sourceMappingURL=anchor-trust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchor-trust.js","sourceRoot":"","sources":["../src/anchor-trust.ts"],"names":[],"mappings":"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"}