passkey-kit 0.12.1 → 0.14.0

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 (172) hide show
  1. package/README.md +408 -227
  2. package/{types → dist}/base.d.ts +1 -0
  3. package/dist/base.d.ts.map +1 -0
  4. package/{src/base.ts → dist/base.js} +8 -10
  5. package/dist/base.js.map +1 -0
  6. package/dist/base64url.d.ts +18 -0
  7. package/dist/base64url.d.ts.map +1 -0
  8. package/dist/base64url.js +18 -0
  9. package/dist/base64url.js.map +1 -0
  10. package/dist/constants.d.ts +91 -0
  11. package/dist/constants.d.ts.map +1 -0
  12. package/dist/constants.js +115 -0
  13. package/dist/constants.js.map +1 -0
  14. package/dist/contract-errors.d.ts +69 -0
  15. package/dist/contract-errors.d.ts.map +1 -0
  16. package/dist/contract-errors.js +132 -0
  17. package/dist/contract-errors.js.map +1 -0
  18. package/dist/errors.d.ts +163 -0
  19. package/dist/errors.d.ts.map +1 -0
  20. package/dist/errors.js +244 -0
  21. package/dist/errors.js.map +1 -0
  22. package/dist/events.d.ts +94 -0
  23. package/dist/events.d.ts.map +1 -0
  24. package/dist/events.js +92 -0
  25. package/dist/events.js.map +1 -0
  26. package/dist/index.d.ts +22 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +36 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/indexer/codec.d.ts +18 -0
  31. package/dist/indexer/codec.d.ts.map +1 -0
  32. package/dist/indexer/codec.js +32 -0
  33. package/dist/indexer/codec.js.map +1 -0
  34. package/dist/indexer/index.d.ts +25 -0
  35. package/dist/indexer/index.d.ts.map +1 -0
  36. package/dist/indexer/index.js +34 -0
  37. package/dist/indexer/index.js.map +1 -0
  38. package/dist/indexer/mercury.d.ts +94 -0
  39. package/dist/indexer/mercury.d.ts.map +1 -0
  40. package/dist/indexer/mercury.js +245 -0
  41. package/dist/indexer/mercury.js.map +1 -0
  42. package/dist/indexer/stellar-indexer.d.ts +115 -0
  43. package/dist/indexer/stellar-indexer.d.ts.map +1 -0
  44. package/dist/indexer/stellar-indexer.js +279 -0
  45. package/dist/indexer/stellar-indexer.js.map +1 -0
  46. package/dist/indexer/types.d.ts +73 -0
  47. package/dist/indexer/types.d.ts.map +1 -0
  48. package/dist/indexer/types.js +9 -0
  49. package/dist/indexer/types.js.map +1 -0
  50. package/dist/kit/auth-payload.d.ts +106 -0
  51. package/dist/kit/auth-payload.d.ts.map +1 -0
  52. package/dist/kit/auth-payload.js +227 -0
  53. package/dist/kit/auth-payload.js.map +1 -0
  54. package/dist/kit/deploy-ops.d.ts +45 -0
  55. package/dist/kit/deploy-ops.d.ts.map +1 -0
  56. package/dist/kit/deploy-ops.js +69 -0
  57. package/dist/kit/deploy-ops.js.map +1 -0
  58. package/dist/kit/tx-ops.d.ts +95 -0
  59. package/dist/kit/tx-ops.d.ts.map +1 -0
  60. package/dist/kit/tx-ops.js +125 -0
  61. package/dist/kit/tx-ops.js.map +1 -0
  62. package/dist/kit/wallet-ops.d.ts +59 -0
  63. package/dist/kit/wallet-ops.d.ts.map +1 -0
  64. package/dist/kit/wallet-ops.js +122 -0
  65. package/dist/kit/wallet-ops.js.map +1 -0
  66. package/dist/kit/webauthn-ops.d.ts +55 -0
  67. package/dist/kit/webauthn-ops.d.ts.map +1 -0
  68. package/dist/kit/webauthn-ops.js +79 -0
  69. package/dist/kit/webauthn-ops.js.map +1 -0
  70. package/dist/kit.d.ts +132 -0
  71. package/dist/kit.d.ts.map +1 -0
  72. package/dist/kit.js +290 -0
  73. package/dist/kit.js.map +1 -0
  74. package/dist/managers/credential-manager.d.ts +39 -0
  75. package/dist/managers/credential-manager.d.ts.map +1 -0
  76. package/dist/managers/credential-manager.js +47 -0
  77. package/dist/managers/credential-manager.js.map +1 -0
  78. package/dist/managers/index.d.ts +7 -0
  79. package/dist/managers/index.d.ts.map +1 -0
  80. package/dist/managers/index.js +7 -0
  81. package/dist/managers/index.js.map +1 -0
  82. package/dist/managers/signer-manager.d.ts +62 -0
  83. package/dist/managers/signer-manager.d.ts.map +1 -0
  84. package/dist/managers/signer-manager.js +111 -0
  85. package/dist/managers/signer-manager.js.map +1 -0
  86. package/dist/managers/submission-manager.d.ts +52 -0
  87. package/dist/managers/submission-manager.d.ts.map +1 -0
  88. package/dist/managers/submission-manager.js +77 -0
  89. package/dist/managers/submission-manager.js.map +1 -0
  90. package/dist/relayer.d.ts +61 -0
  91. package/dist/relayer.d.ts.map +1 -0
  92. package/dist/relayer.js +122 -0
  93. package/dist/relayer.js.map +1 -0
  94. package/dist/rpc-data.d.ts +45 -0
  95. package/dist/rpc-data.d.ts.map +1 -0
  96. package/dist/rpc-data.js +61 -0
  97. package/dist/rpc-data.js.map +1 -0
  98. package/dist/sac.d.ts +31 -0
  99. package/dist/sac.d.ts.map +1 -0
  100. package/dist/sac.js +47 -0
  101. package/dist/sac.js.map +1 -0
  102. package/dist/server.d.ts +79 -0
  103. package/dist/server.d.ts.map +1 -0
  104. package/dist/server.js +152 -0
  105. package/dist/server.js.map +1 -0
  106. package/dist/signers.d.ts +83 -0
  107. package/dist/signers.d.ts.map +1 -0
  108. package/dist/signers.js +124 -0
  109. package/dist/signers.js.map +1 -0
  110. package/dist/storage/index.d.ts +13 -0
  111. package/dist/storage/index.d.ts.map +1 -0
  112. package/dist/storage/index.js +12 -0
  113. package/dist/storage/index.js.map +1 -0
  114. package/dist/storage/indexeddb.d.ts +26 -0
  115. package/dist/storage/indexeddb.d.ts.map +1 -0
  116. package/dist/storage/indexeddb.js +100 -0
  117. package/dist/storage/indexeddb.js.map +1 -0
  118. package/dist/storage/localStorage.d.ts +22 -0
  119. package/dist/storage/localStorage.d.ts.map +1 -0
  120. package/dist/storage/localStorage.js +86 -0
  121. package/dist/storage/localStorage.js.map +1 -0
  122. package/dist/storage/memory.d.ts +18 -0
  123. package/dist/storage/memory.d.ts.map +1 -0
  124. package/dist/storage/memory.js +41 -0
  125. package/dist/storage/memory.js.map +1 -0
  126. package/dist/types.d.ts +136 -0
  127. package/dist/types.d.ts.map +1 -0
  128. package/dist/types.js +39 -0
  129. package/dist/types.js.map +1 -0
  130. package/dist/utils.d.ts +72 -0
  131. package/dist/utils.d.ts.map +1 -0
  132. package/dist/utils.js +253 -0
  133. package/dist/utils.js.map +1 -0
  134. package/dist/validation.d.ts +42 -0
  135. package/dist/validation.d.ts.map +1 -0
  136. package/dist/validation.js +75 -0
  137. package/dist/validation.js.map +1 -0
  138. package/dist/version.d.ts +7 -0
  139. package/dist/version.d.ts.map +1 -0
  140. package/dist/version.js +9 -0
  141. package/dist/version.js.map +1 -0
  142. package/package.json +47 -20
  143. package/.claude/settings.local.json +0 -20
  144. package/.cursorrules +0 -170
  145. package/.gitattributes +0 -2
  146. package/.github/workflows/release.yml +0 -21
  147. package/.vscode/settings.json +0 -6
  148. package/PROPOSAL.md +0 -397
  149. package/cheatsheet.txt +0 -18
  150. package/clone-js-sdk.sh +0 -21
  151. package/packages/passkey-kit-sdk/README.md +0 -54
  152. package/packages/passkey-kit-sdk/package.json +0 -21
  153. package/packages/passkey-kit-sdk/src/index.ts +0 -171
  154. package/packages/passkey-kit-sdk/tsconfig.json +0 -98
  155. package/packages/passkey-kit-sdk/types/index.d.ts +0 -190
  156. package/packages/sac-sdk/README.md +0 -54
  157. package/packages/sac-sdk/package.json +0 -21
  158. package/packages/sac-sdk/src/index.ts +0 -586
  159. package/packages/sac-sdk/tsconfig.json +0 -98
  160. package/packages/sac-sdk/types/index.d.ts +0 -532
  161. package/pnpm-workspace.yaml +0 -2
  162. package/src/index.ts +0 -5
  163. package/src/kit.ts +0 -823
  164. package/src/sac.ts +0 -29
  165. package/src/server.ts +0 -179
  166. package/src/types.ts +0 -32
  167. package/tsconfig.json +0 -28
  168. package/types/index.d.ts +0 -5
  169. package/types/kit.d.ts +0 -95
  170. package/types/sac.d.ts +0 -13
  171. package/types/server.d.ts +0 -29
  172. package/types/types.d.ts +0 -22
@@ -0,0 +1,279 @@
1
+ /**
2
+ * Stellar Indexer backend (Creit Tech), over `POST /v1/contract-data/`.
3
+ *
4
+ * The wallet stores one top-level contract-data entry per signer
5
+ * (`key = SignerKey ScVal`, `val = SignerVal`), so signer enumeration is a
6
+ * contract-scoped query and reverse lookup is derive-then-confirm: derive the
7
+ * wallet address from the keyId, then confirm the signer entry exists there.
8
+ * Removed signers appear as tombstoned (`deleted_at`) entries.
9
+ *
10
+ * WIRE FORMAT (F2-confirmed, todo 959 c2502 / todo 967):
11
+ * - The live API returns each entry's `key`/`val` as **JSON ScVal**, e.g.
12
+ * `{"vec":[{"symbol":"Secp256r1"},{"bytes":"<hex>"}]}` — NOT base64 XDR. We
13
+ * convert JSON ScVal -> `xdr.ScVal` ({@link jsonScValToXdr}) and reuse the
14
+ * contract-spec decoders (`scValToSignerKey`/`decodeSignerVal`). The JSON
15
+ * convention is the standard Stellar one: `symbol`, `bytes` (hex), `address`
16
+ * (strkey), `vec` (array), `map` (`[{key,val}]`), `u64`/`i64` (string),
17
+ * `u32`/`i32` (number), `bool`, `string`, `void` (None).
18
+ * - Entry fields: `id, contract_id, durability, key, val,
19
+ * last_modified_ledger_seq, tx_meta_version, timestamp, created_at,
20
+ * updated_at, deleted_at`.
21
+ *
22
+ * NETWORK: **the Stellar Indexer indexes MAINNET only** — a testnet contract
23
+ * returns HTTP 200 with zero entries (F2). To keep "unsupported network" from
24
+ * masquerading as "wallet has no signers", the backend is network-aware: use
25
+ * {@link StellarIndexerBackend.forNetwork} (returns `null` off mainnet), and a
26
+ * config pinned to a non-mainnet passphrase throws at construction rather than
27
+ * silently returning `[]`. Live validation therefore needs a mainnet v1 wallet
28
+ * (endgame-gated); until then this is unit-tested against the documented shape.
29
+ *
30
+ * @packageDocumentation
31
+ */
32
+ import { Address, Networks, nativeToScVal, xdr } from "@stellar/stellar-sdk";
33
+ import { IndexerError, PasskeyKitErrorCode } from "../errors.js";
34
+ import { DEFAULT_INDEXER_TIMEOUT_MS } from "../constants.js";
35
+ import { deriveContractAddress } from "../utils.js";
36
+ import { buildWalletSigner, decodeSignerVal, deriveStatus, scValToSignerKey, signerKeyToIndexerJson, } from "./codec.js";
37
+ /** Max contract ids per contract-data request (API cap). */
38
+ export const MAX_CONTRACTS_PER_QUERY = 25;
39
+ /** The only network the Stellar Indexer indexes (mainnet). */
40
+ export const STELLAR_INDEXER_NETWORK = Networks.PUBLIC;
41
+ export class StellarIndexerBackend {
42
+ config;
43
+ constructor(config) {
44
+ this.config = config;
45
+ if (!config.url || !config.accessToken) {
46
+ throw new IndexerError("StellarIndexerBackend requires url and accessToken", PasskeyKitErrorCode.INDEXER_NOT_CONFIGURED);
47
+ }
48
+ if (config.networkPassphrase &&
49
+ config.networkPassphrase !== STELLAR_INDEXER_NETWORK) {
50
+ throw new IndexerError(`Stellar Indexer indexes mainnet only; refusing a backend pinned to "${config.networkPassphrase}". ` +
51
+ `Use StellarIndexerBackend.forNetwork(...) to get null off mainnet.`, PasskeyKitErrorCode.INDEXER_NOT_CONFIGURED);
52
+ }
53
+ }
54
+ /**
55
+ * Network-aware factory: the backend for mainnet, or `null` for any other
56
+ * network (the Stellar Indexer doesn't index testnet, so "discovery disabled"
57
+ * is the honest answer — callers treat `null` as no-indexer rather than an
58
+ * empty signer set).
59
+ */
60
+ static forNetwork(config, networkPassphrase) {
61
+ if (networkPassphrase !== STELLAR_INDEXER_NETWORK)
62
+ return null;
63
+ return new StellarIndexerBackend({ ...config, networkPassphrase });
64
+ }
65
+ nowSeconds() {
66
+ return this.config.now ? this.config.now() : Math.floor(Date.now() / 1000);
67
+ }
68
+ async query(body) {
69
+ const controller = new AbortController();
70
+ const timeout = setTimeout(() => controller.abort(), DEFAULT_INDEXER_TIMEOUT_MS);
71
+ try {
72
+ const response = await fetch(`${this.config.url}/v1/contract-data/`, {
73
+ method: "POST",
74
+ headers: {
75
+ "Content-Type": "application/json",
76
+ Authorization: `Bearer ${this.config.accessToken}`,
77
+ },
78
+ body: JSON.stringify(body),
79
+ signal: controller.signal,
80
+ });
81
+ if (!response.ok) {
82
+ const text = await response.text().catch(() => "");
83
+ throw new IndexerError(`Stellar Indexer request failed (${response.status}): ${text.slice(0, 200)}`, PasskeyKitErrorCode.INDEXER_REQUEST_FAILED, { status: response.status });
84
+ }
85
+ const json = (await response.json());
86
+ return extractEntries(json);
87
+ }
88
+ catch (err) {
89
+ if (err instanceof IndexerError)
90
+ throw err;
91
+ const aborted = err instanceof Error && err.name === "AbortError";
92
+ throw new IndexerError(aborted ? "Stellar Indexer request timed out" : String(err), PasskeyKitErrorCode.INDEXER_REQUEST_FAILED, undefined, err instanceof Error ? err : undefined);
93
+ }
94
+ finally {
95
+ clearTimeout(timeout);
96
+ }
97
+ }
98
+ async getSigners(wallet) {
99
+ const entries = await this.query({ contracts: [wallet] });
100
+ return this.entriesToSigners(entries);
101
+ }
102
+ /**
103
+ * Group entries by signer key and resolve status. A key with any live entry
104
+ * is live/expired; a key whose every entry is tombstoned (no live counterpart
105
+ * in either durability) is `removed`.
106
+ */
107
+ entriesToSigners(entries) {
108
+ const groups = new Map();
109
+ for (const entry of entries) {
110
+ // Group on the raw JSON ScVal of the key (identical signer keys serialize
111
+ // identically); decode once per group below.
112
+ const groupKey = JSON.stringify(entry.key);
113
+ const list = groups.get(groupKey) ?? [];
114
+ list.push(entry);
115
+ groups.set(groupKey, list);
116
+ }
117
+ const signers = [];
118
+ for (const [, group] of groups) {
119
+ const live = group.find((e) => e.deleted_at == null);
120
+ const chosen = live ?? group[0];
121
+ const key = scValToSignerKey(jsonScValToXdr(chosen.key));
122
+ const decoded = decodeSignerVal(jsonScValToXdr(chosen.val));
123
+ const storage = chosen.durability;
124
+ const status = live
125
+ ? deriveStatus({
126
+ expiration: decoded.expiration,
127
+ nowSeconds: this.nowSeconds(),
128
+ })
129
+ : "removed";
130
+ signers.push(buildWalletSigner(key, decoded, storage, status));
131
+ }
132
+ return signers;
133
+ }
134
+ /**
135
+ * Reverse lookup via derive-then-confirm. Only Secp256r1 keyIds are
136
+ * derivable; Ed25519/Policy signers are not discoverable through this backend
137
+ * (use Mercury's event-driven index for those).
138
+ */
139
+ async findWallets(key) {
140
+ if (key.key !== "Secp256r1") {
141
+ return [];
142
+ }
143
+ if (!this.config.hardening) {
144
+ throw new IndexerError("findWallets requires hardening deps (networkPassphrase + deployerPublicKey) to derive candidates", PasskeyKitErrorCode.INDEXER_NOT_CONFIGURED);
145
+ }
146
+ const candidate = deriveContractAddress(Buffer.from(key.value, "base64url"), this.config.hardening.deployerPublicKey, this.config.hardening.networkPassphrase);
147
+ const entries = await this.query({
148
+ contracts: [candidate],
149
+ key: signerKeyToIndexerJson(key),
150
+ });
151
+ // Confirmed only if the derived wallet holds a live entry for this key.
152
+ const live = entries.some((e) => e.deleted_at == null);
153
+ return live ? [candidate] : [];
154
+ }
155
+ async health() {
156
+ try {
157
+ await this.query({
158
+ contracts: ["CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF"],
159
+ });
160
+ return { ok: true, backend: "stellar-indexer" };
161
+ }
162
+ catch (err) {
163
+ return {
164
+ ok: false,
165
+ backend: "stellar-indexer",
166
+ detail: err instanceof Error ? err.message : String(err),
167
+ };
168
+ }
169
+ }
170
+ }
171
+ /**
172
+ * Pull the entries array out of a few known response shapes.
173
+ *
174
+ * A genuinely empty response (`null`/`undefined` or `{}`) yields `[]`, but an
175
+ * UNRECOGNIZED non-empty envelope throws rather than silently degrading to `[]`:
176
+ * conflating "shape changed" with "wallet has no signers" would burn the whole
177
+ * retry budget and then report a valid wallet as signer-less (audit LOW).
178
+ */
179
+ function extractEntries(json) {
180
+ if (Array.isArray(json))
181
+ return json;
182
+ if (json == null)
183
+ return [];
184
+ if (typeof json === "object") {
185
+ const obj = json;
186
+ if (Array.isArray(obj.entries))
187
+ return obj.entries;
188
+ if (Array.isArray(obj.data))
189
+ return obj.data;
190
+ if (Object.keys(obj).length === 0)
191
+ return []; // genuinely-empty object
192
+ }
193
+ throw new IndexerError("Unrecognized Stellar Indexer response shape (expected an array or { entries | data: [...] })", PasskeyKitErrorCode.INDEXER_REQUEST_FAILED);
194
+ }
195
+ /**
196
+ * Convert a Stellar JSON-ScVal object into an `xdr.ScVal`.
197
+ *
198
+ * The Stellar Indexer serializes ledger-entry `key`/`val` as JSON ScVal — a
199
+ * single-key object per value (`{"vec":[...]}`, `{"symbol":"…"}`, …). This is
200
+ * the inverse of that serialization for the variants a smart-wallet
201
+ * SignerKey/SignerVal can contain, letting the contract-spec decoders take over.
202
+ *
203
+ * Unknown variant keys THROW (never silently misdecode): an unexpected wire
204
+ * shape must surface as an error, not a wrong signer.
205
+ */
206
+ export function jsonScValToXdr(json) {
207
+ // Some encoders represent `void`/None as a bare null.
208
+ if (json === null || json === undefined)
209
+ return xdr.ScVal.scvVoid();
210
+ if (typeof json !== "object") {
211
+ throw new IndexerError(`Unrecognized JSON ScVal (not an object): ${JSON.stringify(json)}`, PasskeyKitErrorCode.INDEXER_REQUEST_FAILED);
212
+ }
213
+ const obj = json;
214
+ const keys = Object.keys(obj);
215
+ if (keys.length !== 1) {
216
+ throw new IndexerError(`Unrecognized JSON ScVal (expected exactly one type key): ${JSON.stringify(keys)}`, PasskeyKitErrorCode.INDEXER_REQUEST_FAILED);
217
+ }
218
+ const tag = keys[0];
219
+ const v = obj[tag];
220
+ switch (tag) {
221
+ case "void":
222
+ return xdr.ScVal.scvVoid();
223
+ case "bool":
224
+ return xdr.ScVal.scvBool(Boolean(v));
225
+ case "u32":
226
+ return xdr.ScVal.scvU32(Number(v));
227
+ case "i32":
228
+ return xdr.ScVal.scvI32(Number(v));
229
+ case "u64":
230
+ return nativeToScVal(BigInt(v), { type: "u64" });
231
+ case "i64":
232
+ return nativeToScVal(BigInt(v), { type: "i64" });
233
+ case "timepoint":
234
+ return nativeToScVal(BigInt(v), { type: "timepoint" });
235
+ case "duration":
236
+ return nativeToScVal(BigInt(v), { type: "duration" });
237
+ case "u128":
238
+ return nativeToScVal(bigIntOfParts(v), { type: "u128" });
239
+ case "i128":
240
+ return nativeToScVal(bigIntOfParts(v), { type: "i128" });
241
+ case "u256":
242
+ return nativeToScVal(bigIntOfParts(v), { type: "u256" });
243
+ case "i256":
244
+ return nativeToScVal(bigIntOfParts(v), { type: "i256" });
245
+ case "bytes":
246
+ return xdr.ScVal.scvBytes(Buffer.from(String(v), "hex"));
247
+ case "string":
248
+ return xdr.ScVal.scvString(String(v));
249
+ case "symbol":
250
+ return xdr.ScVal.scvSymbol(String(v));
251
+ case "address":
252
+ return Address.fromString(String(v)).toScVal();
253
+ case "vec":
254
+ return xdr.ScVal.scvVec(v.map(jsonScValToXdr));
255
+ case "map":
256
+ return xdr.ScVal.scvMap(v.map((e) => new xdr.ScMapEntry({
257
+ key: jsonScValToXdr(e.key),
258
+ val: jsonScValToXdr(e.val),
259
+ })));
260
+ default:
261
+ throw new IndexerError(`Unsupported JSON ScVal type "${tag}"`, PasskeyKitErrorCode.INDEXER_REQUEST_FAILED);
262
+ }
263
+ }
264
+ /**
265
+ * Coerce a large-integer JSON ScVal value to a bigint, accepting either a
266
+ * decimal string/number or a `{ hi, lo }` multi-part object (the exact 128/256
267
+ * wire shape is undocumented and unused by SignerVal — u64 covers expiration —
268
+ * so this stays tolerant).
269
+ */
270
+ function bigIntOfParts(v) {
271
+ if (typeof v === "string" || typeof v === "number")
272
+ return BigInt(v);
273
+ if (v && typeof v === "object" && "hi" in v && "lo" in v) {
274
+ const { hi, lo } = v;
275
+ return (BigInt(hi) << 64n) | BigInt(lo);
276
+ }
277
+ throw new IndexerError(`Unrecognized large-integer JSON ScVal value: ${JSON.stringify(v)}`, PasskeyKitErrorCode.INDEXER_REQUEST_FAILED);
278
+ }
279
+ //# sourceMappingURL=stellar-indexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stellar-indexer.js","sourceRoot":"","sources":["../../src/indexer/stellar-indexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Indexer abstraction: one {@link SignerIndexer} interface, resolved by the
3
+ * keyless {@link MercuryIndexer} backend into the {@link WalletSigner} shape so a
4
+ * signer added through the demo is discoverable and asserted in the browser e2e.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ import type { SignerKey, SignerLimits } from "../types.js";
9
+ /** Storage durability of a signer's ledger entry. */
10
+ export type SignerStorageClass = "persistent" | "temporary";
11
+ /**
12
+ * Lifecycle status of a signer, derived from the entry + expiration:
13
+ * - `live` — present and not expired.
14
+ * - `expired` — present but past its expiration timestamp.
15
+ * - `evicted` — a temporary entry whose ledger state was evicted (TTL).
16
+ * - `removed` — tombstoned (remove_signer), no live counterpart in either
17
+ * durability.
18
+ */
19
+ export type SignerStatus = "live" | "expired" | "evicted" | "removed";
20
+ /** A signer as resolved by an indexer backend. */
21
+ export interface WalletSigner {
22
+ /** The signer's key (kind + value). */
23
+ key: SignerKey;
24
+ /** 65-byte secp256r1 public key, for Secp256r1 signers. */
25
+ publicKey?: Uint8Array;
26
+ /**
27
+ * Expiration as a UNIX timestamp in seconds (inclusive), if set. The reworked
28
+ * contract stores expiration as a timestamp, not a ledger sequence (#602).
29
+ */
30
+ expiration?: number;
31
+ /** Per-contract limits (`undefined` = unlimited). */
32
+ limits?: SignerLimits;
33
+ /** Storage durability of the entry. */
34
+ storage: SignerStorageClass;
35
+ /** Derived lifecycle status. */
36
+ status: SignerStatus;
37
+ }
38
+ /** Health of an indexer backend. */
39
+ export interface IndexerHealth {
40
+ /** Whether the backend answered a health probe. */
41
+ ok: boolean;
42
+ /** Backend identifier (e.g. "mercury"). */
43
+ backend: string;
44
+ /** Optional human-readable detail. */
45
+ detail?: string;
46
+ }
47
+ /**
48
+ * A pluggable signer indexer.
49
+ *
50
+ * Null-tolerant seam (per SAK): a backend that is *not configured* is
51
+ * represented as `null` at the call site (see `forNetwork`); a backend that is
52
+ * configured but *fails* throws; a health/404 degrades to `{ ok: false }`
53
+ * rather than throwing.
54
+ */
55
+ export interface SignerIndexer {
56
+ /** Enumerate all signers currently indexed for a wallet. */
57
+ getSigners(wallet: string): Promise<WalletSigner[]>;
58
+ /** Reverse lookup: the wallet contract ids a signer key belongs to. */
59
+ findWallets(key: SignerKey): Promise<string[]>;
60
+ /** Probe backend health (degrades to `{ ok: false }` rather than throwing). */
61
+ health(): Promise<IndexerHealth>;
62
+ }
63
+ /**
64
+ * Deps for the SDK-side `findWallets` hardening (#598 F3): before trusting a
65
+ * reverse-lookup result, the candidate wallet is confirmed by re-deriving its
66
+ * address from the keyId (deterministic derivation) — no unverified `res[0]`.
67
+ */
68
+ export interface FindWalletsHardeningDeps {
69
+ networkPassphrase: string;
70
+ /** The canonical deployer `G…` public key used for derivation. */
71
+ deployerPublicKey: string;
72
+ }
73
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/indexer/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3D,qDAAqD;AACrD,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,WAAW,CAAC;AAE5D;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAEtE,kDAAkD;AAClD,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,GAAG,EAAE,SAAS,CAAC;IACf,2DAA2D;IAC3D,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,uCAAuC;IACvC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,gCAAgC;IAChC,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,oCAAoC;AACpC,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,EAAE,EAAE,OAAO,CAAC;IACZ,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,4DAA4D;IAC5D,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACpD,uEAAuE;IACvE,WAAW,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,+EAA+E;IAC/E,MAAM,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CAClC;AAED;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kEAAkE;IAClE,iBAAiB,EAAE,MAAM,CAAC;CAC3B"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Indexer abstraction: one {@link SignerIndexer} interface, resolved by the
3
+ * keyless {@link MercuryIndexer} backend into the {@link WalletSigner} shape so a
4
+ * signer added through the demo is discoverable and asserted in the browser e2e.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/indexer/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Soroban authorization-entry payload helpers + the flat `Signatures` map codec.
3
+ *
4
+ * These are thin wrappers over the stellar-sdk's native Protocol-27 auth
5
+ * primitives (`buildAuthorizationEntryPreimage`). The old kit hand-rolled a
6
+ * stack of "does this SDK support P27?" probe shims; on stellar-sdk >= 16 those
7
+ * are all dead, so this module simply uses the SDK.
8
+ *
9
+ * The smart wallet's `__check_auth` reads a `Signatures` value — a single
10
+ * `Map<SignerKey, Signature>` — from the address credentials. Each signer
11
+ * contributes one entry keyed by its on-chain `SignerKey`. The host rejects an
12
+ * `ScMap` whose keys are not in the host's canonical sort order, so the map is
13
+ * sorted with {@link compareScVal} (NOT a byte/`localeCompare` sort — see below).
14
+ *
15
+ * @packageDocumentation
16
+ */
17
+ import { xdr } from "@stellar/stellar-sdk";
18
+ import type { Spec as ContractSpec } from "@stellar/stellar-sdk/contract";
19
+ import type { Signature as SDKSignature, SignerKey as SDKSignerKey } from "passkey-kit-sdk";
20
+ /**
21
+ * Extract the {@link xdr.SorobanAddressCredentials} from a credentials union,
22
+ * for the address / addressV2 / addressWithDelegates variants.
23
+ *
24
+ * @throws {SigningError} If the credentials are not address-based.
25
+ */
26
+ export declare function getAddressCredentials(credentials: xdr.SorobanCredentials): xdr.SorobanAddressCredentials;
27
+ /**
28
+ * Whether a credentials union uses an address-bound signature payload (the P27
29
+ * V2 / with-delegates variants), whose preimage binds the invoker address.
30
+ */
31
+ export declare function usesAddressBoundPayload(credentials: xdr.SorobanCredentials): boolean;
32
+ /**
33
+ * Coerce a credentials union to an address-bound variant (CAP-0071-02).
34
+ *
35
+ * Legacy V1 `sorobanCredentialsAddress` credentials are upgraded to
36
+ * `sorobanCredentialsAddressV2` IN PLACE of the signed payload's semantics: the
37
+ * V2 preimage (`HashIdPreimageSorobanAuthorizationWithAddress`) binds the
38
+ * authorizing address into the hash the signer signs, so the same signer key on
39
+ * two different wallets can never produce interchangeable signatures. V1's
40
+ * preimage has no address field — signing it verbatim would produce a payload
41
+ * that is identical across wallets for a signer key installed on more than
42
+ * one wallet.
43
+ *
44
+ * Already-address-bound variants (V2, with-delegates) pass through unchanged.
45
+ *
46
+ * @throws {SigningError} If the credentials are not address-based.
47
+ */
48
+ export declare function toAddressBoundCredentials(credentials: xdr.SorobanCredentials): xdr.SorobanCredentials;
49
+ /**
50
+ * Assert that a signature-expiration ledger is a valid `u32`.
51
+ *
52
+ * @throws {SigningError} If not a `u32` integer.
53
+ */
54
+ export declare function assertSignatureExpirationLedger(expiration: number): void;
55
+ /**
56
+ * Build the signature payload (the 32-byte hash a signer signs) for an
57
+ * authorization entry at a given expiration ledger.
58
+ *
59
+ * Sets the expiration on the entry's address credentials, then hashes the SDK's
60
+ * canonical authorization-entry preimage. Works for the address, addressV2, and
61
+ * addressWithDelegates credential variants.
62
+ *
63
+ * @throws {SigningError} If `expiration` is not a valid `u32`.
64
+ */
65
+ export declare function buildSignaturePayload(networkPassphrase: string, entry: xdr.SorobanAuthorizationEntry, expiration: number): Buffer;
66
+ /**
67
+ * Compare two ScVals in the order the Soroban host uses when it validates that
68
+ * an ScMap is sorted by key (host `metered_map::from_map`, which rejects an
69
+ * unsorted map with `InvalidInput`).
70
+ *
71
+ * This is deliberately NOT a comparison of the XDR byte encodings. XDR prefixes
72
+ * every variable-length payload (Bytes, Symbol, String, Vec) with a 4-byte
73
+ * length, so `toXDR("hex")` sorting is length-major; the host instead compares
74
+ * those payloads element-wise by content (Rust slice `Ord`), where a shorter
75
+ * value that is a prefix of a longer one sorts first. The old kit's
76
+ * `localeCompare` on a symbol+hex string approximated this and could diverge
77
+ * from the host, producing a map the wallet rejects at `__check_auth`.
78
+ *
79
+ * Only the shapes that appear as `SignerKey` map keys are handled precisely
80
+ * (Vec, Symbol, String, Bytes, Address). All other shapes are same-type here
81
+ * (the discriminant is compared first), so their fixed-width XDR encodings sort
82
+ * order-equivalently to the host.
83
+ */
84
+ export declare function compareScVal(a: xdr.ScVal, b: xdr.ScVal): number;
85
+ /** The `SignerVal` UDT type def, for decoding a stored signer entry's value. */
86
+ export declare const SIGNER_VAL_UDT: xdr.ScSpecTypeDef;
87
+ /** Encode a native `SignerKey` union into its contract ScVal via the spec. */
88
+ export declare function signerKeyToScVal(spec: ContractSpec, key: SDKSignerKey): xdr.ScVal;
89
+ /**
90
+ * Encode a native `Signature` union into its contract ScVal via the spec, or
91
+ * `scvVoid` when there is no signature value (policy signers).
92
+ */
93
+ export declare function signatureToScVal(spec: ContractSpec, val: SDKSignature | undefined): xdr.ScVal;
94
+ /**
95
+ * Upsert a `(SignerKey, Signature)` pair into the entry's `Signatures` value,
96
+ * which is encoded as `scvVec([ scvMap([...]) ])`.
97
+ *
98
+ * A signer key already present in the map is replaced (co-signing is idempotent
99
+ * per signer). The map is re-sorted by key in host order after every insert, so
100
+ * the wallet's `__check_auth` accepts it.
101
+ *
102
+ * @throws {SigningError} If the existing signature is neither void nor a
103
+ * Signatures vec.
104
+ */
105
+ export declare function upsertSignatureEntry(credentials: xdr.SorobanAddressCredentials, scKey: xdr.ScVal, scVal: xdr.ScVal): void;
106
+ //# sourceMappingURL=auth-payload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-payload.d.ts","sourceRoot":"","sources":["../../src/kit/auth-payload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAGL,GAAG,EACJ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,IAAI,IAAI,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,KAAK,EACV,SAAS,IAAI,YAAY,EACzB,SAAS,IAAI,YAAY,EAC1B,MAAM,iBAAiB,CAAC;AAOzB;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,GAAG,CAAC,kBAAkB,GAClC,GAAG,CAAC,yBAAyB,CAc/B;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,GAAG,CAAC,kBAAkB,GAClC,OAAO,CAMT;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,GAAG,CAAC,kBAAkB,GAClC,GAAG,CAAC,kBAAkB,CASxB;AAED;;;;GAIG;AACH,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAYxE;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,iBAAiB,EAAE,MAAM,EACzB,KAAK,EAAE,GAAG,CAAC,yBAAyB,EACpC,UAAU,EAAE,MAAM,GACjB,MAAM,CAaR;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,GAAG,MAAM,CAmD/D;AAaD,gFAAgF;AAChF,eAAO,MAAM,cAAc,mBAE1B,CAAC;AAEF,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,YAAY,EAClB,GAAG,EAAE,YAAY,GAChB,GAAG,CAAC,KAAK,CAEX;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,YAAY,EAClB,GAAG,EAAE,YAAY,GAAG,SAAS,GAC5B,GAAG,CAAC,KAAK,CAEX;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,GAAG,CAAC,yBAAyB,EAC1C,KAAK,EAAE,GAAG,CAAC,KAAK,EAChB,KAAK,EAAE,GAAG,CAAC,KAAK,GACf,IAAI,CAmCN"}