passkey-kit 0.12.0 → 0.13.1

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 +399 -227
  2. package/{types → dist}/base.d.ts +2 -1
  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 +87 -0
  11. package/dist/constants.d.ts.map +1 -0
  12. package/dist/constants.js +111 -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 +129 -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 +88 -0
  39. package/dist/indexer/mercury.d.ts.map +1 -0
  40. package/dist/indexer/mercury.js +237 -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 +89 -0
  51. package/dist/kit/auth-payload.d.ts.map +1 -0
  52. package/dist/kit/auth-payload.js +203 -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 +92 -0
  59. package/dist/kit/tx-ops.d.ts.map +1 -0
  60. package/dist/kit/tx-ops.js +113 -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 +128 -0
  71. package/dist/kit.d.ts.map +1 -0
  72. package/dist/kit.js +276 -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 +51 -0
  83. package/dist/managers/signer-manager.d.ts.map +1 -0
  84. package/dist/managers/signer-manager.js +92 -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 +119 -0
  93. package/dist/relayer.js.map +1 -0
  94. package/dist/rpc-data.d.ts +35 -0
  95. package/dist/rpc-data.d.ts.map +1 -0
  96. package/dist/rpc-data.js +49 -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 +52 -0
  131. package/dist/utils.d.ts.map +1 -0
  132. package/dist/utils.js +153 -0
  133. package/dist/utils.js.map +1 -0
  134. package/dist/validation.d.ts +40 -0
  135. package/dist/validation.d.ts.map +1 -0
  136. package/dist/validation.js +73 -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 +48 -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 -18
  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 -18
  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 -698
  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 -89
  170. package/types/sac.d.ts +0 -13
  171. package/types/server.d.ts +0 -29
  172. package/types/types.d.ts +0 -22
package/dist/kit.js ADDED
@@ -0,0 +1,276 @@
1
+ /**
2
+ * `PasskeyKit` — the browser-side facade for creating and using smart-wallet
3
+ * accounts with WebAuthn passkeys.
4
+ *
5
+ * This is a ground-up rewrite of the old monolithic `kit.ts`. The signing
6
+ * pipeline, WebAuthn ceremonies, deploy path, and signer writes now live in
7
+ * dependency-injected managers ({@link CredentialManager}, {@link SignerManager},
8
+ * {@link SubmissionManager}) wired here with late-bound closures. All Protocol-27
9
+ * probe shims, dead commented experiments, and the legacy factory-address
10
+ * fallback are gone — the kit targets stellar-sdk >= 16 and the current wallet.
11
+ *
12
+ * @packageDocumentation
13
+ */
14
+ import { xdr } from "@stellar/stellar-sdk";
15
+ import { Server } from "@stellar/stellar-sdk/rpc";
16
+ import { startAuthentication, startRegistration, } from "@simplewebauthn/browser";
17
+ import { Client as PasskeyClient } from "passkey-kit-sdk";
18
+ import base64url from "./base64url.js";
19
+ import { SignerKey, } from "./types.js";
20
+ import { ConfigurationError, PasskeyKitError, PasskeyKitErrorCode, WalletNotConnectedError, WalletOwnershipError, } from "./errors.js";
21
+ import { PasskeyEventEmitter } from "./events.js";
22
+ import { DEFAULT_TIMEOUT_SECONDS } from "./constants.js";
23
+ import { calculateExpiration } from "./kit/tx-ops.js";
24
+ import { CredentialManager, SignerManager, SubmissionManager, } from "./managers/index.js";
25
+ import { resolveDeployer } from "./kit/deploy-ops.js";
26
+ export class PasskeyKit {
27
+ rpc;
28
+ rpcUrl;
29
+ networkPassphrase;
30
+ walletWasmHash;
31
+ rpId;
32
+ /** Lifecycle event emitter (walletCreated, walletConnected, …). */
33
+ events = new PasskeyEventEmitter();
34
+ timeoutInSeconds;
35
+ webAuthn;
36
+ credentialManager;
37
+ signerManager;
38
+ submissionManager;
39
+ /** The connected passkey's base64url keyId, if any. */
40
+ keyId;
41
+ /** The connected wallet client, if any. */
42
+ wallet;
43
+ constructor(config) {
44
+ if (!config.rpcUrl) {
45
+ throw new ConfigurationError("rpcUrl is required", PasskeyKitErrorCode.MISSING_CONFIG);
46
+ }
47
+ if (!config.networkPassphrase) {
48
+ throw new ConfigurationError("networkPassphrase is required", PasskeyKitErrorCode.MISSING_CONFIG);
49
+ }
50
+ if (!config.walletWasmHash) {
51
+ throw new ConfigurationError("walletWasmHash is required", PasskeyKitErrorCode.MISSING_CONFIG);
52
+ }
53
+ this.rpc = new Server(config.rpcUrl);
54
+ this.rpcUrl = config.rpcUrl;
55
+ this.networkPassphrase = config.networkPassphrase;
56
+ this.walletWasmHash = config.walletWasmHash;
57
+ this.rpId = config.rpId;
58
+ this.timeoutInSeconds = config.timeoutInSeconds ?? DEFAULT_TIMEOUT_SECONDS;
59
+ this.webAuthn =
60
+ config.WebAuthn ?? { startRegistration, startAuthentication };
61
+ const deployerKeypair = resolveDeployer(config.deploySource);
62
+ this.credentialManager = new CredentialManager({
63
+ rpId: this.rpId,
64
+ webAuthn: this.webAuthn,
65
+ storage: config.storage,
66
+ });
67
+ this.signerManager = new SignerManager({
68
+ networkPassphrase: this.networkPassphrase,
69
+ timeoutInSeconds: this.timeoutInSeconds,
70
+ rpc: this.rpc,
71
+ getWallet: () => this.wallet,
72
+ getContractId: () => this.wallet?.options.contractId,
73
+ getSignerContext: () => this.signerContext(),
74
+ calculateExpiration: () => calculateExpiration({ rpc: this.rpc, timeoutInSeconds: this.timeoutInSeconds }),
75
+ });
76
+ this.submissionManager = new SubmissionManager({
77
+ rpc: this.rpc,
78
+ rpcUrl: config.rpcUrl,
79
+ networkPassphrase: this.networkPassphrase,
80
+ walletWasmHash: this.walletWasmHash,
81
+ deployerKeypair,
82
+ timeoutInSeconds: this.timeoutInSeconds,
83
+ });
84
+ }
85
+ /** The connected wallet's contract id, if any. */
86
+ get contractId() {
87
+ return this.wallet?.options.contractId;
88
+ }
89
+ /** The fee-paying deployer's `G…` public key. */
90
+ get deployerPublicKey() {
91
+ return this.submissionManager.deployerPublicKey;
92
+ }
93
+ signerContext() {
94
+ return { rpId: this.rpId, webAuthn: this.webAuthn, defaultKeyId: this.keyId };
95
+ }
96
+ // -- Passkey / wallet lifecycle ---------------------------------------------
97
+ /** Run a passkey registration ceremony without deploying a wallet. */
98
+ createKey(appName, userName, options) {
99
+ return this.credentialManager.createKey(appName, userName, options?.authenticatorSelection);
100
+ }
101
+ /**
102
+ * Register a passkey and deploy a smart wallet initialized with it as the
103
+ * first signer. Returns the signed deploy transaction (submit it via
104
+ * `PasskeyServer`).
105
+ */
106
+ async createWallet(appName, userName, options) {
107
+ const created = await this.createKey(appName, userName, options);
108
+ const deployTx = await this.submissionManager.buildDeployTransaction(created.keyIdBuffer, created.publicKey);
109
+ const contractId = deployTx.result.options.contractId;
110
+ this.wallet = new PasskeyClient({
111
+ contractId,
112
+ rpcUrl: this.rpcUrl,
113
+ networkPassphrase: this.networkPassphrase,
114
+ });
115
+ this.keyId = created.keyId;
116
+ const signedTx = await this.submissionManager.signDeploy(deployTx);
117
+ await this.credentialManager.rememberPasskey({
118
+ keyId: created.keyId,
119
+ publicKey: created.publicKey,
120
+ contractId,
121
+ createdAt: Date.now(),
122
+ });
123
+ this.events.emit("walletCreated", { contractId, keyId: created.keyId });
124
+ return {
125
+ rawResponse: created.rawResponse,
126
+ keyId: created.keyIdBuffer,
127
+ keyIdBase64: created.keyId,
128
+ contractId,
129
+ signedTx,
130
+ };
131
+ }
132
+ /**
133
+ * Connect an existing wallet from a passkey.
134
+ *
135
+ * Resolves the wallet address by (1) deterministic derivation from the keyId,
136
+ * (2) local storage, then (3) an injected indexer lookup — and then VERIFIES
137
+ * ownership: the keyId must resolve to a live signer on the wallet (#601 F7).
138
+ * This closes the unverified reverse-lookup hole (#598 F3) at the SDK layer.
139
+ *
140
+ * @throws {WalletOwnershipError} If the keyId is not a signer on the wallet.
141
+ */
142
+ async connectWallet(options) {
143
+ let rawResponse;
144
+ let keyId = options?.keyId;
145
+ if (!keyId) {
146
+ const auth = await this.credentialManager.authenticate();
147
+ keyId = auth.keyId;
148
+ rawResponse = auth.rawResponse;
149
+ }
150
+ const keyIdBase64 = keyId instanceof Uint8Array ? base64url(Buffer.from(keyId)) : keyId;
151
+ const keyIdBuffer = keyId instanceof Uint8Array ? Buffer.from(keyId) : base64url.toBuffer(keyId);
152
+ // 1) Deterministic derivation, confirmed by an on-chain instance read.
153
+ let contractId = this.submissionManager.deriveWalletAddress(keyIdBuffer);
154
+ try {
155
+ await this.rpc.getContractData(contractId, xdr.ScVal.scvLedgerKeyContractInstance());
156
+ }
157
+ catch {
158
+ // 2) local storage, then 3) injected indexer lookup.
159
+ contractId =
160
+ (await this.credentialManager.lookupContractId(keyIdBase64)) ??
161
+ (options?.getContractId
162
+ ? await options.getContractId(keyIdBase64)
163
+ : undefined);
164
+ }
165
+ if (!contractId) {
166
+ throw new PasskeyKitError("Could not resolve a wallet for the given passkey", PasskeyKitErrorCode.WALLET_NOT_FOUND, { context: { keyId: keyIdBase64 } });
167
+ }
168
+ this.wallet = new PasskeyClient({
169
+ contractId,
170
+ rpcUrl: this.rpcUrl,
171
+ networkPassphrase: this.networkPassphrase,
172
+ });
173
+ this.keyId = keyIdBase64;
174
+ // 3) Ownership verification (F7): the keyId must be a live signer.
175
+ // A thrown error here is a transport failure, not proof of non-ownership —
176
+ // surface it as-is (a valid passkey must not read as an ownership mismatch
177
+ // because the RPC hiccuped); only a definitive not-found (`null`) does.
178
+ let signerVal;
179
+ try {
180
+ signerVal = await this.signerManager.getSigner(SignerKey.Secp256r1(keyIdBase64));
181
+ }
182
+ catch (err) {
183
+ this.wallet = undefined;
184
+ this.keyId = undefined;
185
+ throw err;
186
+ }
187
+ if (!signerVal) {
188
+ this.wallet = undefined;
189
+ this.keyId = undefined;
190
+ throw new WalletOwnershipError("The passkey is not a signer on the resolved wallet", { contractId, keyId: keyIdBase64 });
191
+ }
192
+ // 4) Optional wasm-hash check (opt-in; upgraded wallets differ by design).
193
+ if (options?.verifyWasmHash) {
194
+ await this.assertWalletWasmHash(contractId);
195
+ }
196
+ this.events.emit("walletConnected", { contractId, keyId: keyIdBase64 });
197
+ return { rawResponse, keyId: keyIdBuffer, keyIdBase64, contractId };
198
+ }
199
+ async assertWalletWasmHash(contractId) {
200
+ const instance = await this.rpc.getContractData(contractId, xdr.ScVal.scvLedgerKeyContractInstance());
201
+ const executable = instance.val
202
+ .contractData()
203
+ .val()
204
+ .instance()
205
+ .executable();
206
+ if (executable.switch().name !== "contractExecutableWasm") {
207
+ throw new WalletOwnershipError("Wallet is not a WASM contract", {
208
+ contractId,
209
+ });
210
+ }
211
+ const wasmHash = executable.wasmHash().toString("hex");
212
+ if (wasmHash !== this.walletWasmHash.toLowerCase()) {
213
+ throw new WalletOwnershipError("Wallet WASM hash does not match", {
214
+ contractId,
215
+ expected: this.walletWasmHash,
216
+ actual: wasmHash,
217
+ });
218
+ }
219
+ }
220
+ /** Disconnect the current wallet. */
221
+ disconnect() {
222
+ const contractId = this.contractId;
223
+ this.wallet = undefined;
224
+ this.keyId = undefined;
225
+ if (contractId) {
226
+ this.events.emit("walletDisconnected", { contractId });
227
+ }
228
+ }
229
+ // -- Signing -----------------------------------------------------------------
230
+ /** Sign a single auth entry (defaults to the connected passkey signer). */
231
+ signAuthEntry(entry, signer, options) {
232
+ return this.signerManager.signAuthEntry(entry, signer, options);
233
+ }
234
+ /** Sign an assembled transaction's wallet auth entries. */
235
+ sign(txn, signer, options) {
236
+ return this.signerManager.sign(txn, signer, options);
237
+ }
238
+ // -- Signer management -------------------------------------------------------
239
+ addSecp256r1(keyId, publicKey, limits, store, expiration) {
240
+ return this.signerManager.addSecp256r1(keyId, publicKey, limits, store, expiration);
241
+ }
242
+ updateSecp256r1(keyId, publicKey, limits, store, expiration) {
243
+ return this.signerManager.updateSecp256r1(keyId, publicKey, limits, store, expiration);
244
+ }
245
+ addEd25519(publicKey, limits, store, expiration) {
246
+ return this.signerManager.addEd25519(publicKey, limits, store, expiration);
247
+ }
248
+ updateEd25519(publicKey, limits, store, expiration) {
249
+ return this.signerManager.updateEd25519(publicKey, limits, store, expiration);
250
+ }
251
+ addPolicy(policy, limits, store, expiration) {
252
+ return this.signerManager.addPolicy(policy, limits, store, expiration);
253
+ }
254
+ updatePolicy(policy, limits, store, expiration) {
255
+ return this.signerManager.updatePolicy(policy, limits, store, expiration);
256
+ }
257
+ remove(signerKey) {
258
+ return this.signerManager.remove(signerKey);
259
+ }
260
+ /** Build an `upgrade(new_wasm_hash)` transaction for the connected wallet. */
261
+ upgrade(newWasmHash) {
262
+ return this.signerManager.upgrade(newWasmHash);
263
+ }
264
+ /** Read a signer entry from the ledger (temporary before persistent). */
265
+ getSigner(signerKey) {
266
+ return this.signerManager.getSigner(signerKey);
267
+ }
268
+ /** Require a connected wallet, or throw. */
269
+ requireWallet() {
270
+ if (!this.wallet) {
271
+ throw new WalletNotConnectedError();
272
+ }
273
+ return this.wallet;
274
+ }
275
+ }
276
+ //# sourceMappingURL=kit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kit.js","sourceRoot":"","sources":["../src/kit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EACL,mBAAmB,EACnB,iBAAiB,GAGlB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,EACL,SAAS,GAMV,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAKzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AA6CtD,MAAM,OAAO,UAAU;IACZ,GAAG,CAAS;IACZ,MAAM,CAAS;IACf,iBAAiB,CAAS;IAC1B,cAAc,CAAS;IACvB,IAAI,CAAU;IAEvB,mEAAmE;IAC1D,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;IAE3B,gBAAgB,CAAS;IACzB,QAAQ,CAAiB;IAEzB,iBAAiB,CAAoB;IACrC,aAAa,CAAgB;IAC7B,iBAAiB,CAAoB;IAEtD,uDAAuD;IACvD,KAAK,CAAqB;IAC1B,2CAA2C;IAC3C,MAAM,CAA4B;IAElC,YAAY,MAAwB;QAClC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,kBAAkB,CAC1B,oBAAoB,EACpB,mBAAmB,CAAC,cAAc,CACnC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC9B,MAAM,IAAI,kBAAkB,CAC1B,+BAA+B,EAC/B,mBAAmB,CAAC,cAAc,CACnC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YAC3B,MAAM,IAAI,kBAAkB,CAC1B,4BAA4B,EAC5B,mBAAmB,CAAC,cAAc,CACnC,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;QAClD,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;QAC5C,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,uBAAuB,CAAC;QAC3E,IAAI,CAAC,QAAQ;YACX,MAAM,CAAC,QAAQ,IAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAqB,CAAC;QAEpF,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAE7D,IAAI,CAAC,iBAAiB,GAAG,IAAI,iBAAiB,CAAC;YAC7C,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC;YACrC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM;YAC5B,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU;YACpD,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE;YAC5C,mBAAmB,EAAE,GAAG,EAAE,CACxB,mBAAmB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC;SAClF,CAAC,CAAC;QAEH,IAAI,CAAC,iBAAiB,GAAG,IAAI,iBAAiB,CAAC;YAC7C,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,eAAe;YACf,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;SACxC,CAAC,CAAC;IACL,CAAC;IAED,kDAAkD;IAClD,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC;IACzC,CAAC;IAED,iDAAiD;IACjD,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC;IAClD,CAAC;IAEO,aAAa;QACnB,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAChF,CAAC;IAED,8EAA8E;IAE9E,sEAAsE;IACtE,SAAS,CACP,OAAe,EACf,QAAgB,EAChB,OAAuB;QAEvB,OAAO,IAAI,CAAC,iBAAiB,CAAC,SAAS,CACrC,OAAO,EACP,QAAQ,EACR,OAAO,EAAE,sBAAsB,CAChC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,YAAY,CAChB,OAAe,EACf,QAAgB,EAChB,OAAuB;QAEvB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEjE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,CAClE,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,SAAS,CAClB,CAAC;QACF,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;QAEtD,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAAC;YAC9B,UAAU;YACV,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;SAC1C,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAE3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAEnE,MAAM,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC;YAC3C,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,UAAU;YACV,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAExE,OAAO;YACL,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,KAAK,EAAE,OAAO,CAAC,WAAW;YAC1B,WAAW,EAAE,OAAO,CAAC,KAAK;YAC1B,UAAU;YACV,QAAQ;SACT,CAAC;IACJ,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,aAAa,CAAC,OAAwB;QAC1C,IAAI,WAAmD,CAAC;QACxD,IAAI,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC;QAE3B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,CAAC;YACzD,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACnB,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACjC,CAAC;QAED,MAAM,WAAW,GACf,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACtE,MAAM,WAAW,GACf,KAAK,YAAY,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAE/E,uEAAuE;QACvE,IAAI,UAAU,GACZ,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;QAC1D,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAC5B,UAAU,EACV,GAAG,CAAC,KAAK,CAAC,4BAA4B,EAAE,CACzC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,qDAAqD;YACrD,UAAU;gBACR,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;oBAC5D,CAAC,OAAO,EAAE,aAAa;wBACrB,CAAC,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC;wBAC1C,CAAC,CAAC,SAAS,CAAC,CAAC;QACnB,CAAC;QAED,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,eAAe,CACvB,kDAAkD,EAClD,mBAAmB,CAAC,gBAAgB,EACpC,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,CACpC,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAAC;YAC9B,UAAU;YACV,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;SAC1C,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC;QAEzB,mEAAmE;QACnE,2EAA2E;QAC3E,2EAA2E;QAC3E,wEAAwE;QACxE,IAAI,SAAS,CAAC;QACd,IAAI,CAAC;YACH,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,CAC5C,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CACjC,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;YACvB,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;YACvB,MAAM,IAAI,oBAAoB,CAC5B,oDAAoD,EACpD,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,CACnC,CAAC;QACJ,CAAC;QAED,2EAA2E;QAC3E,IAAI,OAAO,EAAE,cAAc,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAExE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;IACtE,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,UAAkB;QACnD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAC7C,UAAU,EACV,GAAG,CAAC,KAAK,CAAC,4BAA4B,EAAE,CACzC,CAAC;QACF,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG;aAC5B,YAAY,EAAE;aACd,GAAG,EAAE;aACL,QAAQ,EAAE;aACV,UAAU,EAAE,CAAC;QAChB,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;YAC1D,MAAM,IAAI,oBAAoB,CAAC,+BAA+B,EAAE;gBAC9D,UAAU;aACX,CAAC,CAAC;QACL,CAAC;QACD,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvD,IAAI,QAAQ,KAAK,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,EAAE,CAAC;YACnD,MAAM,IAAI,oBAAoB,CAAC,iCAAiC,EAAE;gBAChE,UAAU;gBACV,QAAQ,EAAE,IAAI,CAAC,cAAc;gBAC7B,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,UAAU;QACR,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,+EAA+E;IAE/E,2EAA2E;IAC3E,aAAa,CACX,KAAoC,EACpC,MAAe,EACf,OAAqB;QAErB,OAAO,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;IAED,2DAA2D;IAC3D,IAAI,CACF,GAA4B,EAC5B,MAAe,EACf,OAAqB;QAErB,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,+EAA+E;IAE/E,YAAY,CACV,KAA0B,EAC1B,SAA8B,EAC9B,MAAoB,EACpB,KAAkB,EAClB,UAAmB;QAEnB,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IACtF,CAAC;IACD,eAAe,CACb,KAA0B,EAC1B,SAA8B,EAC9B,MAAoB,EACpB,KAAkB,EAClB,UAAmB;QAEnB,OAAO,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IACzF,CAAC;IACD,UAAU,CACR,SAAiB,EACjB,MAAoB,EACpB,KAAkB,EAClB,UAAmB;QAEnB,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAC7E,CAAC;IACD,aAAa,CACX,SAAiB,EACjB,MAAoB,EACpB,KAAkB,EAClB,UAAmB;QAEnB,OAAO,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAChF,CAAC;IACD,SAAS,CACP,MAAc,EACd,MAAoB,EACpB,KAAkB,EAClB,UAAmB;QAEnB,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IACzE,CAAC;IACD,YAAY,CACV,MAAc,EACd,MAAoB,EACpB,KAAkB,EAClB,UAAmB;QAEnB,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,CAAC,SAAoB;QACzB,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC;IAED,8EAA8E;IAC9E,OAAO,CAAC,WAAgC;QACtC,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACjD,CAAC;IAED,yEAAyE;IACzE,SAAS,CAAC,SAAoB;QAC5B,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC;IAED,4CAA4C;IAC5C,aAAa;QACX,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,uBAAuB,EAAE,CAAC;QACtC,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Credential manager: WebAuthn passkey ceremonies + optional passkey-record
3
+ * persistence.
4
+ *
5
+ * Constructed from a plain {@link CredentialManagerDeps} object so it is fully
6
+ * unit-testable with `vi.fn()` fakes (no live authenticator or RPC needed).
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ import type { AuthenticatorSelectionCriteria } from "@simplewebauthn/browser";
11
+ import type { StorageAdapter, StoredPasskey } from "../types.js";
12
+ import { type AuthenticatedPasskey, type CreatedPasskey, type WebAuthnClient } from "../kit/webauthn-ops.js";
13
+ export interface CredentialManagerDeps {
14
+ rpId?: string;
15
+ webAuthn: WebAuthnClient;
16
+ /** Optional passkey-record store; when absent, remember/lookup are no-ops. */
17
+ storage?: StorageAdapter;
18
+ }
19
+ export declare class CredentialManager {
20
+ private readonly deps;
21
+ constructor(deps: CredentialManagerDeps);
22
+ private get webAuthnDeps();
23
+ /** Run a registration ceremony, returning the new passkey + its public key. */
24
+ createKey(appName: string, userName: string, authenticatorSelection?: AuthenticatorSelectionCriteria): Promise<CreatedPasskey>;
25
+ /** Run a discoverable-credential authentication ceremony. */
26
+ authenticate(): Promise<AuthenticatedPasskey>;
27
+ /** Persist a passkey → wallet association (no-op without a storage adapter). */
28
+ rememberPasskey(record: StoredPasskey): Promise<void>;
29
+ /** Remove a persisted passkey record (no-op without a storage adapter). */
30
+ forgetPasskey(keyId: string): Promise<void>;
31
+ /** Look up a stored passkey record by keyId. */
32
+ getPasskey(keyId: string): Promise<StoredPasskey | null>;
33
+ /**
34
+ * Resolve a wallet contract id for a keyId from local storage, if a record
35
+ * exists. Used as an indexer-free `connectWallet` fallback.
36
+ */
37
+ lookupContractId(keyId: string): Promise<string | undefined>;
38
+ }
39
+ //# sourceMappingURL=credential-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-manager.d.ts","sourceRoot":"","sources":["../../src/managers/credential-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,cAAc,CAAC;IACzB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,qBAAqB;IAExD,OAAO,KAAK,YAAY,GAEvB;IAED,+EAA+E;IAC/E,SAAS,CACP,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,sBAAsB,CAAC,EAAE,8BAA8B,GACtD,OAAO,CAAC,cAAc,CAAC;IAS1B,6DAA6D;IAC7D,YAAY,IAAI,OAAO,CAAC,oBAAoB,CAAC;IAI7C,gFAAgF;IAC1E,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D,2EAA2E;IACrE,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,gDAAgD;IAC1C,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAI9D;;;OAGG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CAGnE"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Credential manager: WebAuthn passkey ceremonies + optional passkey-record
3
+ * persistence.
4
+ *
5
+ * Constructed from a plain {@link CredentialManagerDeps} object so it is fully
6
+ * unit-testable with `vi.fn()` fakes (no live authenticator or RPC needed).
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ import { authenticatePasskey, createPasskey, } from "../kit/webauthn-ops.js";
11
+ export class CredentialManager {
12
+ deps;
13
+ constructor(deps) {
14
+ this.deps = deps;
15
+ }
16
+ get webAuthnDeps() {
17
+ return { rpId: this.deps.rpId, webAuthn: this.deps.webAuthn };
18
+ }
19
+ /** Run a registration ceremony, returning the new passkey + its public key. */
20
+ createKey(appName, userName, authenticatorSelection) {
21
+ return createPasskey(this.webAuthnDeps, appName, userName, authenticatorSelection);
22
+ }
23
+ /** Run a discoverable-credential authentication ceremony. */
24
+ authenticate() {
25
+ return authenticatePasskey(this.webAuthnDeps);
26
+ }
27
+ /** Persist a passkey → wallet association (no-op without a storage adapter). */
28
+ async rememberPasskey(record) {
29
+ await this.deps.storage?.save(record);
30
+ }
31
+ /** Remove a persisted passkey record (no-op without a storage adapter). */
32
+ async forgetPasskey(keyId) {
33
+ await this.deps.storage?.delete(keyId);
34
+ }
35
+ /** Look up a stored passkey record by keyId. */
36
+ async getPasskey(keyId) {
37
+ return (await this.deps.storage?.get(keyId)) ?? null;
38
+ }
39
+ /**
40
+ * Resolve a wallet contract id for a keyId from local storage, if a record
41
+ * exists. Used as an indexer-free `connectWallet` fallback.
42
+ */
43
+ async lookupContractId(keyId) {
44
+ return (await this.getPasskey(keyId))?.contractId;
45
+ }
46
+ }
47
+ //# sourceMappingURL=credential-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-manager.js","sourceRoot":"","sources":["../../src/managers/credential-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EACL,mBAAmB,EACnB,aAAa,GAId,MAAM,wBAAwB,CAAC;AAShC,MAAM,OAAO,iBAAiB;IACC;IAA7B,YAA6B,IAA2B;QAA3B,SAAI,GAAJ,IAAI,CAAuB;IAAG,CAAC;IAE5D,IAAY,YAAY;QACtB,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;IAChE,CAAC;IAED,+EAA+E;IAC/E,SAAS,CACP,OAAe,EACf,QAAgB,EAChB,sBAAuD;QAEvD,OAAO,aAAa,CAClB,IAAI,CAAC,YAAY,EACjB,OAAO,EACP,QAAQ,EACR,sBAAsB,CACvB,CAAC;IACJ,CAAC;IAED,6DAA6D;IAC7D,YAAY;QACV,OAAO,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAChD,CAAC;IAED,gFAAgF;IAChF,KAAK,CAAC,eAAe,CAAC,MAAqB;QACzC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,aAAa,CAAC,KAAa;QAC/B,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,gDAAgD;IAChD,KAAK,CAAC,UAAU,CAAC,KAAa;QAC5B,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC;IACvD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB,CAAC,KAAa;QAClC,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC;IACpD,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Dependency-injected managers that compose the kit facade.
3
+ */
4
+ export { CredentialManager, type CredentialManagerDeps, } from "./credential-manager.js";
5
+ export { SignerManager, type SignerManagerDeps } from "./signer-manager.js";
6
+ export { SubmissionManager, type SubmissionManagerDeps, } from "./submission-manager.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/managers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,iBAAiB,EACjB,KAAK,qBAAqB,GAC3B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EACL,iBAAiB,EACjB,KAAK,qBAAqB,GAC3B,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Dependency-injected managers that compose the kit facade.
3
+ */
4
+ export { CredentialManager, } from "./credential-manager.js";
5
+ export { SignerManager } from "./signer-manager.js";
6
+ export { SubmissionManager, } from "./submission-manager.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/managers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,iBAAiB,GAElB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,aAAa,EAA0B,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EACL,iBAAiB,GAElB,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Signer manager: the signing pipeline and signer-write builders for the
3
+ * connected wallet.
4
+ *
5
+ * Owns nothing directly — every wallet-dependent value is a late-bound closure
6
+ * ({@link SignerManagerDeps.getWallet} / `getContractId` / `getSpec`) supplied by
7
+ * the kit facade, so the manager is constructed once and always sees current
8
+ * state. That indirection is also what makes it `vi.fn()`-testable.
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ import { xdr } from "@stellar/stellar-sdk";
13
+ import type { Server } from "@stellar/stellar-sdk/rpc";
14
+ import type { AssembledTransaction } from "@stellar/stellar-sdk/contract";
15
+ import type { Client as PasskeyClient, SignerVal } from "passkey-kit-sdk";
16
+ import type { Signer, SignerContext } from "../signers.js";
17
+ import { SignerStore, type SignerKey, type SignerLimits } from "../types.js";
18
+ import { type SignOptions } from "../kit/tx-ops.js";
19
+ import { type WalletTx } from "../kit/wallet-ops.js";
20
+ export interface SignerManagerDeps {
21
+ networkPassphrase: string;
22
+ timeoutInSeconds: number;
23
+ rpc: Server;
24
+ getWallet: () => PasskeyClient | undefined;
25
+ getContractId: () => string | undefined;
26
+ getSignerContext: () => SignerContext;
27
+ calculateExpiration: () => Promise<number>;
28
+ }
29
+ export declare class SignerManager {
30
+ private readonly deps;
31
+ constructor(deps: SignerManagerDeps);
32
+ private requireWallet;
33
+ private writeDeps;
34
+ private signAuthEntryDeps;
35
+ /** Sign a single auth entry with `signer` (defaults to the connected passkey). */
36
+ signAuthEntry(entry: xdr.SorobanAuthorizationEntry, signer?: Signer, options?: SignOptions): Promise<xdr.SorobanAuthorizationEntry>;
37
+ /** Sign an assembled transaction's wallet auth entries. */
38
+ sign<T>(txn: AssembledTransaction<T>, signer?: Signer, options?: SignOptions): Promise<AssembledTransaction<T>>;
39
+ addSecp256r1(keyId: string | Uint8Array, publicKey: string | Uint8Array, limits: SignerLimits, store: SignerStore, expiration?: number): Promise<WalletTx>;
40
+ updateSecp256r1(keyId: string | Uint8Array, publicKey: string | Uint8Array, limits: SignerLimits, store: SignerStore, expiration?: number): Promise<WalletTx>;
41
+ addEd25519(publicKey: string, limits: SignerLimits, store: SignerStore, expiration?: number): Promise<WalletTx>;
42
+ updateEd25519(publicKey: string, limits: SignerLimits, store: SignerStore, expiration?: number): Promise<WalletTx>;
43
+ addPolicy(policy: string, limits: SignerLimits, store: SignerStore, expiration?: number): Promise<WalletTx>;
44
+ updatePolicy(policy: string, limits: SignerLimits, store: SignerStore, expiration?: number): Promise<WalletTx>;
45
+ remove(signerKey: SignerKey): Promise<WalletTx>;
46
+ /** Build an `upgrade(new_wasm_hash)` transaction. */
47
+ upgrade(newWasmHash: Buffer | Uint8Array): Promise<WalletTx>;
48
+ /** Read a signer entry from the ledger (temporary before persistent). */
49
+ getSigner(signerKey: SignerKey): Promise<SignerVal | null>;
50
+ }
51
+ //# sourceMappingURL=signer-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer-manager.d.ts","sourceRoot":"","sources":["../../src/managers/signer-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Signer manager: the signing pipeline and signer-write builders for the
3
+ * connected wallet.
4
+ *
5
+ * Owns nothing directly — every wallet-dependent value is a late-bound closure
6
+ * ({@link SignerManagerDeps.getWallet} / `getContractId` / `getSpec`) supplied by
7
+ * the kit facade, so the manager is constructed once and always sees current
8
+ * state. That indirection is also what makes it `vi.fn()`-testable.
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ import { PasskeySigner } from "../signers.js";
13
+ import { WalletNotConnectedError } from "../errors.js";
14
+ import { signAuthEntry as signAuthEntryOp, sign as signOp, } from "../kit/tx-ops.js";
15
+ import { buildEd25519SignerTx, buildPolicySignerTx, buildRemoveSignerTx, buildSecp256r1SignerTx, buildUpgradeTx, getSigner as getSignerOp, } from "../kit/wallet-ops.js";
16
+ /** Extract the contract `Spec` from a generated client (not in the public type). */
17
+ function specOf(wallet) {
18
+ return wallet.spec;
19
+ }
20
+ export class SignerManager {
21
+ deps;
22
+ constructor(deps) {
23
+ this.deps = deps;
24
+ }
25
+ requireWallet() {
26
+ const wallet = this.deps.getWallet();
27
+ if (!wallet) {
28
+ throw new WalletNotConnectedError("perform a signer operation");
29
+ }
30
+ return { wallet, spec: specOf(wallet) };
31
+ }
32
+ writeDeps() {
33
+ return {
34
+ wallet: this.requireWallet().wallet,
35
+ timeoutInSeconds: this.deps.timeoutInSeconds,
36
+ };
37
+ }
38
+ // -- Signing pipeline --------------------------------------------------------
39
+ signAuthEntryDeps() {
40
+ return {
41
+ networkPassphrase: this.deps.networkPassphrase,
42
+ spec: this.requireWallet().spec,
43
+ signerContext: this.deps.getSignerContext(),
44
+ calculateExpiration: this.deps.calculateExpiration,
45
+ };
46
+ }
47
+ /** Sign a single auth entry with `signer` (defaults to the connected passkey). */
48
+ signAuthEntry(entry, signer = new PasskeySigner(), options) {
49
+ return signAuthEntryOp(this.signAuthEntryDeps(), entry, signer, options);
50
+ }
51
+ /** Sign an assembled transaction's wallet auth entries. */
52
+ sign(txn, signer = new PasskeySigner(), options) {
53
+ return signOp({ ...this.signAuthEntryDeps(), getContractId: this.deps.getContractId }, txn, signer, options);
54
+ }
55
+ // -- Signer writes -----------------------------------------------------------
56
+ addSecp256r1(keyId, publicKey, limits, store, expiration) {
57
+ return buildSecp256r1SignerTx(this.writeDeps(), "add_signer", keyId, publicKey, limits, store, expiration);
58
+ }
59
+ updateSecp256r1(keyId, publicKey, limits, store, expiration) {
60
+ return buildSecp256r1SignerTx(this.writeDeps(), "update_signer", keyId, publicKey, limits, store, expiration);
61
+ }
62
+ addEd25519(publicKey, limits, store, expiration) {
63
+ return buildEd25519SignerTx(this.writeDeps(), "add_signer", publicKey, limits, store, expiration);
64
+ }
65
+ updateEd25519(publicKey, limits, store, expiration) {
66
+ return buildEd25519SignerTx(this.writeDeps(), "update_signer", publicKey, limits, store, expiration);
67
+ }
68
+ addPolicy(policy, limits, store, expiration) {
69
+ return buildPolicySignerTx(this.writeDeps(), "add_signer", policy, limits, store, expiration);
70
+ }
71
+ updatePolicy(policy, limits, store, expiration) {
72
+ return buildPolicySignerTx(this.writeDeps(), "update_signer", policy, limits, store, expiration);
73
+ }
74
+ remove(signerKey) {
75
+ return buildRemoveSignerTx(this.writeDeps(), signerKey);
76
+ }
77
+ /** Build an `upgrade(new_wasm_hash)` transaction. */
78
+ upgrade(newWasmHash) {
79
+ return buildUpgradeTx(this.writeDeps(), newWasmHash);
80
+ }
81
+ // -- Reads -------------------------------------------------------------------
82
+ /** Read a signer entry from the ledger (temporary before persistent). */
83
+ getSigner(signerKey) {
84
+ const { spec } = this.requireWallet();
85
+ const contractId = this.deps.getContractId();
86
+ if (!contractId) {
87
+ throw new WalletNotConnectedError("read a signer");
88
+ }
89
+ return getSignerOp({ rpc: this.deps.rpc, spec }, contractId, signerKey);
90
+ }
91
+ }
92
+ //# sourceMappingURL=signer-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer-manager.js","sourceRoot":"","sources":["../../src/managers/signer-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Submission manager: builds and signs the deploy transaction with the fee-
3
+ * paying deployer keypair, derives deterministic wallet addresses, and drives
4
+ * the footprint-restore flow.
5
+ *
6
+ * Network submission itself is the server's job (`PasskeyServer` / relayer); this
7
+ * manager owns the deployer keypair and the fee-payer signature that make a
8
+ * deploy transaction submittable.
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ import type { Keypair } from "@stellar/stellar-sdk";
13
+ import type { AssembledTransaction } from "@stellar/stellar-sdk/contract";
14
+ import type { Server } from "@stellar/stellar-sdk/rpc";
15
+ import type { Client as PasskeyClient } from "passkey-kit-sdk";
16
+ import { type RestorePreamble } from "../kit/tx-ops.js";
17
+ export interface SubmissionManagerDeps {
18
+ rpc: Server;
19
+ rpcUrl: string;
20
+ networkPassphrase: string;
21
+ walletWasmHash: string;
22
+ deployerKeypair: Keypair;
23
+ timeoutInSeconds: number;
24
+ }
25
+ export declare class SubmissionManager {
26
+ private readonly deps;
27
+ constructor(deps: SubmissionManagerDeps);
28
+ /** The deployer's `G…` public key (fee source + derivation deployer). */
29
+ get deployerPublicKey(): string;
30
+ /** Deterministically derive the wallet address for a passkey credential. */
31
+ deriveWalletAddress(keyId: Buffer): string;
32
+ /** Build the wallet deploy transaction (initial Secp256r1 signer). */
33
+ buildDeployTransaction(keyId: Buffer, publicKey: Uint8Array): Promise<AssembledTransaction<PasskeyClient>>;
34
+ /**
35
+ * Sign a deploy transaction with the deployer keypair (the fee source) and
36
+ * return the signed transaction XDR.
37
+ *
38
+ * The deploy carries source-account auth, so it is submitted through the
39
+ * relayer's fee-bump (`{ xdr }`) path. A fee-bumped Soroban inner transaction
40
+ * must have `fee == resourceFee` — the fee-bump supplies the inclusion fee —
41
+ * or the relayer rejects it with a fee mismatch ("Transaction fee must be
42
+ * equal to the resource fee"). The assembled fee is `inclusion + resource`,
43
+ * so pin it to the resource fee BEFORE the deployer signs (the signature
44
+ * commits to the fee). `TransactionBuilder.cloneFrom` drops
45
+ * `SorobanTransactionData` (→ txMalformed), so set the fee field surgically on
46
+ * the envelope and rebuild.
47
+ */
48
+ signDeploy(tx: AssembledTransaction<PasskeyClient>): Promise<string>;
49
+ /** Restore an archived footprint reported by simulation. */
50
+ restoreFootprint(restorePreamble: RestorePreamble): Promise<string>;
51
+ }
52
+ //# sourceMappingURL=submission-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submission-manager.d.ts","sourceRoot":"","sources":["../../src/managers/submission-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAe,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAK/D,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,qBAAqB;IAExD,yEAAyE;IACzE,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED,4EAA4E;IAC5E,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAU1C,sEAAsE;IACtE,sBAAsB,CACpB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,UAAU,GACpB,OAAO,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAc/C;;;;;;;;;;;;;OAaG;IACG,UAAU,CAAC,EAAE,EAAE,oBAAoB,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAiB1E,4DAA4D;IAC5D,gBAAgB,CAAC,eAAe,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;CAWpE"}