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
package/dist/kit.js ADDED
@@ -0,0 +1,290 @@
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
+ import { contractInstanceExists } from "./rpc-data.js";
27
+ export class PasskeyKit {
28
+ rpc;
29
+ rpcUrl;
30
+ networkPassphrase;
31
+ walletWasmHash;
32
+ rpId;
33
+ /** Lifecycle event emitter (walletCreated, walletConnected, …). */
34
+ events = new PasskeyEventEmitter();
35
+ timeoutInSeconds;
36
+ webAuthn;
37
+ credentialManager;
38
+ signerManager;
39
+ submissionManager;
40
+ /** The connected passkey's base64url keyId, if any. */
41
+ keyId;
42
+ /** The connected wallet client, if any. */
43
+ wallet;
44
+ constructor(config) {
45
+ if (!config.rpcUrl) {
46
+ throw new ConfigurationError("rpcUrl is required", PasskeyKitErrorCode.MISSING_CONFIG);
47
+ }
48
+ if (!config.networkPassphrase) {
49
+ throw new ConfigurationError("networkPassphrase is required", PasskeyKitErrorCode.MISSING_CONFIG);
50
+ }
51
+ if (!config.walletWasmHash) {
52
+ throw new ConfigurationError("walletWasmHash is required", PasskeyKitErrorCode.MISSING_CONFIG);
53
+ }
54
+ this.rpc = new Server(config.rpcUrl);
55
+ this.rpcUrl = config.rpcUrl;
56
+ this.networkPassphrase = config.networkPassphrase;
57
+ this.walletWasmHash = config.walletWasmHash;
58
+ this.rpId = config.rpId;
59
+ this.timeoutInSeconds = config.timeoutInSeconds ?? DEFAULT_TIMEOUT_SECONDS;
60
+ this.webAuthn =
61
+ config.WebAuthn ?? { startRegistration, startAuthentication };
62
+ const deployerKeypair = resolveDeployer(config.deploySource);
63
+ this.credentialManager = new CredentialManager({
64
+ rpId: this.rpId,
65
+ webAuthn: this.webAuthn,
66
+ storage: config.storage,
67
+ });
68
+ this.signerManager = new SignerManager({
69
+ networkPassphrase: this.networkPassphrase,
70
+ timeoutInSeconds: this.timeoutInSeconds,
71
+ rpc: this.rpc,
72
+ getWallet: () => this.wallet,
73
+ getContractId: () => this.wallet?.options.contractId,
74
+ getSignerContext: () => this.signerContext(),
75
+ calculateExpiration: () => calculateExpiration({ rpc: this.rpc, timeoutInSeconds: this.timeoutInSeconds }),
76
+ });
77
+ this.submissionManager = new SubmissionManager({
78
+ rpc: this.rpc,
79
+ rpcUrl: config.rpcUrl,
80
+ networkPassphrase: this.networkPassphrase,
81
+ walletWasmHash: this.walletWasmHash,
82
+ deployerKeypair,
83
+ timeoutInSeconds: this.timeoutInSeconds,
84
+ });
85
+ }
86
+ /** The connected wallet's contract id, if any. */
87
+ get contractId() {
88
+ return this.wallet?.options.contractId;
89
+ }
90
+ /** The fee-paying deployer's `G…` public key. */
91
+ get deployerPublicKey() {
92
+ return this.submissionManager.deployerPublicKey;
93
+ }
94
+ signerContext() {
95
+ return { rpId: this.rpId, webAuthn: this.webAuthn, defaultKeyId: this.keyId };
96
+ }
97
+ // -- Passkey / wallet lifecycle ---------------------------------------------
98
+ /** Run a passkey registration ceremony without deploying a wallet. */
99
+ createKey(appName, userName, options) {
100
+ return this.credentialManager.createKey(appName, userName, options?.authenticatorSelection);
101
+ }
102
+ /**
103
+ * Register a passkey and deploy a smart wallet initialized with it as the
104
+ * first signer. Returns the signed deploy transaction (submit it via
105
+ * `PasskeyServer`).
106
+ */
107
+ async createWallet(appName, userName, options) {
108
+ const created = await this.createKey(appName, userName, options);
109
+ const deployTx = await this.submissionManager.buildDeployTransaction(created.keyIdBuffer, created.publicKey);
110
+ const contractId = deployTx.result.options.contractId;
111
+ this.wallet = new PasskeyClient({
112
+ contractId,
113
+ rpcUrl: this.rpcUrl,
114
+ networkPassphrase: this.networkPassphrase,
115
+ });
116
+ this.keyId = created.keyId;
117
+ const signedTx = await this.submissionManager.signDeploy(deployTx);
118
+ await this.credentialManager.rememberPasskey({
119
+ keyId: created.keyId,
120
+ publicKey: created.publicKey,
121
+ contractId,
122
+ createdAt: Date.now(),
123
+ });
124
+ this.events.emit("walletCreated", { contractId, keyId: created.keyId });
125
+ return {
126
+ rawResponse: created.rawResponse,
127
+ keyId: created.keyIdBuffer,
128
+ keyIdBase64: created.keyId,
129
+ contractId,
130
+ signedTx,
131
+ };
132
+ }
133
+ /**
134
+ * Connect an existing wallet from a passkey.
135
+ *
136
+ * Resolves the wallet address by (1) deterministic derivation from the keyId,
137
+ * (2) local storage, then (3) an injected indexer lookup — and then VERIFIES
138
+ * ownership: the keyId must resolve to a live signer on the wallet (#601 F7).
139
+ * This closes the unverified reverse-lookup hole (#598 F3) at the SDK layer.
140
+ *
141
+ * @throws {WalletOwnershipError} If the keyId is not a signer on the wallet.
142
+ */
143
+ async connectWallet(options) {
144
+ let rawResponse;
145
+ let keyId = options?.keyId;
146
+ if (!keyId) {
147
+ const auth = await this.credentialManager.authenticate();
148
+ keyId = auth.keyId;
149
+ rawResponse = auth.rawResponse;
150
+ }
151
+ const keyIdBase64 = keyId instanceof Uint8Array ? base64url(Buffer.from(keyId)) : keyId;
152
+ const keyIdBuffer = keyId instanceof Uint8Array ? Buffer.from(keyId) : base64url.toBuffer(keyId);
153
+ // 1) Deterministic derivation, confirmed by an on-chain instance read.
154
+ // Transport errors (429/5xx/timeout) propagate — only an authoritative
155
+ // not-found may abandon the canonical derivation for the less-trusted
156
+ // storage/indexer fallbacks.
157
+ let contractId = this.submissionManager.deriveWalletAddress(keyIdBuffer);
158
+ if (!(await contractInstanceExists(this.rpc, contractId))) {
159
+ // 2) local storage, then 3) injected indexer lookup.
160
+ contractId =
161
+ (await this.credentialManager.lookupContractId(keyIdBase64)) ??
162
+ (options?.getContractId
163
+ ? await options.getContractId(keyIdBase64)
164
+ : undefined);
165
+ }
166
+ if (!contractId) {
167
+ throw new PasskeyKitError("Could not resolve a wallet for the given passkey", PasskeyKitErrorCode.WALLET_NOT_FOUND, { context: { keyId: keyIdBase64 } });
168
+ }
169
+ this.wallet = new PasskeyClient({
170
+ contractId,
171
+ rpcUrl: this.rpcUrl,
172
+ networkPassphrase: this.networkPassphrase,
173
+ });
174
+ this.keyId = keyIdBase64;
175
+ // 3) Ownership verification (F7): the keyId must be a live signer.
176
+ // A thrown error here is a transport failure, not proof of non-ownership —
177
+ // surface it as-is (a valid passkey must not read as an ownership mismatch
178
+ // because the RPC hiccuped); only a definitive not-found (`null`) does.
179
+ let signerVal;
180
+ try {
181
+ signerVal = await this.signerManager.getSigner(SignerKey.Secp256r1(keyIdBase64));
182
+ }
183
+ catch (err) {
184
+ this.wallet = undefined;
185
+ this.keyId = undefined;
186
+ throw err;
187
+ }
188
+ if (!signerVal) {
189
+ this.wallet = undefined;
190
+ this.keyId = undefined;
191
+ throw new WalletOwnershipError("The passkey is not a signer on the resolved wallet", { contractId, keyId: keyIdBase64 });
192
+ }
193
+ // 4) Optional wasm-hash check (opt-in; upgraded wallets differ by design).
194
+ // A failed check must leave the kit disconnected — otherwise a subsequent
195
+ // sign() would operate on the contract the caller just rejected.
196
+ if (options?.verifyWasmHash) {
197
+ try {
198
+ await this.assertWalletWasmHash(contractId);
199
+ }
200
+ catch (err) {
201
+ this.wallet = undefined;
202
+ this.keyId = undefined;
203
+ throw err;
204
+ }
205
+ }
206
+ this.events.emit("walletConnected", { contractId, keyId: keyIdBase64 });
207
+ return { rawResponse, keyId: keyIdBuffer, keyIdBase64, contractId };
208
+ }
209
+ async assertWalletWasmHash(contractId) {
210
+ const instance = await this.rpc.getContractData(contractId, xdr.ScVal.scvLedgerKeyContractInstance());
211
+ const executable = instance.val
212
+ .contractData()
213
+ .val()
214
+ .instance()
215
+ .executable();
216
+ if (executable.switch().name !== "contractExecutableWasm") {
217
+ throw new WalletOwnershipError("Wallet is not a WASM contract", {
218
+ contractId,
219
+ });
220
+ }
221
+ const wasmHash = executable.wasmHash().toString("hex");
222
+ if (wasmHash !== this.walletWasmHash.toLowerCase()) {
223
+ throw new WalletOwnershipError("Wallet WASM hash does not match", {
224
+ contractId,
225
+ expected: this.walletWasmHash,
226
+ actual: wasmHash,
227
+ });
228
+ }
229
+ }
230
+ /** Disconnect the current wallet. */
231
+ disconnect() {
232
+ const contractId = this.contractId;
233
+ this.wallet = undefined;
234
+ this.keyId = undefined;
235
+ if (contractId) {
236
+ this.events.emit("walletDisconnected", { contractId });
237
+ }
238
+ }
239
+ // -- Signing -----------------------------------------------------------------
240
+ /** Sign a single auth entry (defaults to the connected passkey signer). */
241
+ signAuthEntry(entry, signer, options) {
242
+ return this.signerManager.signAuthEntry(entry, signer, options);
243
+ }
244
+ /** Sign an assembled transaction's wallet auth entries. */
245
+ sign(txn, signer, options) {
246
+ return this.signerManager.sign(txn, signer, options);
247
+ }
248
+ // -- Signer management -------------------------------------------------------
249
+ addSecp256r1(keyId, publicKey, limits, store, expiration) {
250
+ return this.signerManager.addSecp256r1(keyId, publicKey, limits, store, expiration);
251
+ }
252
+ /**
253
+ * Update a passkey signer's limits/storage/expiration. The public key is
254
+ * re-read from the ledger — never caller- or indexer-supplied.
255
+ */
256
+ updateSecp256r1(keyId, limits, store, expiration) {
257
+ return this.signerManager.updateSecp256r1(keyId, limits, store, expiration);
258
+ }
259
+ addEd25519(publicKey, limits, store, expiration) {
260
+ return this.signerManager.addEd25519(publicKey, limits, store, expiration);
261
+ }
262
+ updateEd25519(publicKey, limits, store, expiration) {
263
+ return this.signerManager.updateEd25519(publicKey, limits, store, expiration);
264
+ }
265
+ addPolicy(policy, limits, store, expiration) {
266
+ return this.signerManager.addPolicy(policy, limits, store, expiration);
267
+ }
268
+ updatePolicy(policy, limits, store, expiration) {
269
+ return this.signerManager.updatePolicy(policy, limits, store, expiration);
270
+ }
271
+ remove(signerKey) {
272
+ return this.signerManager.remove(signerKey);
273
+ }
274
+ /** Build an `upgrade(new_wasm_hash)` transaction for the connected wallet. */
275
+ upgrade(newWasmHash) {
276
+ return this.signerManager.upgrade(newWasmHash);
277
+ }
278
+ /** Read a signer entry from the ledger (temporary before persistent). */
279
+ getSigner(signerKey) {
280
+ return this.signerManager.getSigner(signerKey);
281
+ }
282
+ /** Require a connected wallet, or throw. */
283
+ requireWallet() {
284
+ if (!this.wallet) {
285
+ throw new WalletNotConnectedError();
286
+ }
287
+ return this.wallet;
288
+ }
289
+ }
290
+ //# sourceMappingURL=kit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kit.js","sourceRoot":"","sources":["../src/kit.ts"],"names":[],"mappings":"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"}
@@ -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,62 @@
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 { SignerKey, SignerStore, 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
+ /**
41
+ * Update a passkey signer's limits/storage/expiration.
42
+ *
43
+ * The signer's `publicKey` is deliberately NOT a parameter: `update_signer`
44
+ * replaces the whole on-chain `SignerVal`, so the ledger is treated as the
45
+ * single source of truth for key material — a limits-only update must never
46
+ * change the stored public key. The authoritative key
47
+ * is re-read from the ledger here, and only that value is written back.
48
+ *
49
+ * @throws {SignerNotFoundError} If the keyId is not a live on-chain signer.
50
+ */
51
+ updateSecp256r1(keyId: string | Uint8Array, limits: SignerLimits, store: SignerStore, expiration?: number): Promise<WalletTx>;
52
+ addEd25519(publicKey: string, limits: SignerLimits, store: SignerStore, expiration?: number): Promise<WalletTx>;
53
+ updateEd25519(publicKey: string, limits: SignerLimits, store: SignerStore, expiration?: number): Promise<WalletTx>;
54
+ addPolicy(policy: string, limits: SignerLimits, store: SignerStore, expiration?: number): Promise<WalletTx>;
55
+ updatePolicy(policy: string, limits: SignerLimits, store: SignerStore, expiration?: number): Promise<WalletTx>;
56
+ remove(signerKey: SignerKey): Promise<WalletTx>;
57
+ /** Build an `upgrade(new_wasm_hash)` transaction. */
58
+ upgrade(newWasmHash: Buffer | Uint8Array): Promise<WalletTx>;
59
+ /** Read a signer entry from the ledger (temporary before persistent). */
60
+ getSigner(signerKey: SignerKey): Promise<SignerVal | null>;
61
+ }
62
+ //# 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,111 @@
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 { SignerKey, } from "../types.js";
14
+ import base64url from "../base64url.js";
15
+ import { SignerNotFoundError, WalletNotConnectedError } from "../errors.js";
16
+ import { signAuthEntry as signAuthEntryOp, sign as signOp, } from "../kit/tx-ops.js";
17
+ import { buildEd25519SignerTx, buildPolicySignerTx, buildRemoveSignerTx, buildSecp256r1SignerTx, buildUpgradeTx, getSigner as getSignerOp, } from "../kit/wallet-ops.js";
18
+ /** Extract the contract `Spec` from a generated client (not in the public type). */
19
+ function specOf(wallet) {
20
+ return wallet.spec;
21
+ }
22
+ export class SignerManager {
23
+ deps;
24
+ constructor(deps) {
25
+ this.deps = deps;
26
+ }
27
+ requireWallet() {
28
+ const wallet = this.deps.getWallet();
29
+ if (!wallet) {
30
+ throw new WalletNotConnectedError("perform a signer operation");
31
+ }
32
+ return { wallet, spec: specOf(wallet) };
33
+ }
34
+ writeDeps() {
35
+ return {
36
+ wallet: this.requireWallet().wallet,
37
+ timeoutInSeconds: this.deps.timeoutInSeconds,
38
+ };
39
+ }
40
+ // -- Signing pipeline --------------------------------------------------------
41
+ signAuthEntryDeps() {
42
+ return {
43
+ networkPassphrase: this.deps.networkPassphrase,
44
+ spec: this.requireWallet().spec,
45
+ signerContext: this.deps.getSignerContext(),
46
+ calculateExpiration: this.deps.calculateExpiration,
47
+ };
48
+ }
49
+ /** Sign a single auth entry with `signer` (defaults to the connected passkey). */
50
+ signAuthEntry(entry, signer = new PasskeySigner(), options) {
51
+ return signAuthEntryOp(this.signAuthEntryDeps(), entry, signer, options);
52
+ }
53
+ /** Sign an assembled transaction's wallet auth entries. */
54
+ sign(txn, signer = new PasskeySigner(), options) {
55
+ return signOp({ ...this.signAuthEntryDeps(), getContractId: this.deps.getContractId }, txn, signer, options);
56
+ }
57
+ // -- Signer writes -----------------------------------------------------------
58
+ addSecp256r1(keyId, publicKey, limits, store, expiration) {
59
+ return buildSecp256r1SignerTx(this.writeDeps(), "add_signer", keyId, publicKey, limits, store, expiration);
60
+ }
61
+ /**
62
+ * Update a passkey signer's limits/storage/expiration.
63
+ *
64
+ * The signer's `publicKey` is deliberately NOT a parameter: `update_signer`
65
+ * replaces the whole on-chain `SignerVal`, so the ledger is treated as the
66
+ * single source of truth for key material — a limits-only update must never
67
+ * change the stored public key. The authoritative key
68
+ * is re-read from the ledger here, and only that value is written back.
69
+ *
70
+ * @throws {SignerNotFoundError} If the keyId is not a live on-chain signer.
71
+ */
72
+ async updateSecp256r1(keyId, limits, store, expiration) {
73
+ const keyIdBase64 = typeof keyId === "string" ? keyId : base64url(Buffer.from(keyId));
74
+ const signerVal = await this.getSigner(SignerKey.Secp256r1(keyIdBase64));
75
+ if (!signerVal || signerVal.tag !== "Secp256r1") {
76
+ throw new SignerNotFoundError(keyIdBase64, "Cannot update a Secp256r1 signer that does not exist on-chain.");
77
+ }
78
+ const [publicKey] = signerVal.values;
79
+ return buildSecp256r1SignerTx(this.writeDeps(), "update_signer", keyIdBase64, publicKey, limits, store, expiration);
80
+ }
81
+ addEd25519(publicKey, limits, store, expiration) {
82
+ return buildEd25519SignerTx(this.writeDeps(), "add_signer", publicKey, limits, store, expiration);
83
+ }
84
+ updateEd25519(publicKey, limits, store, expiration) {
85
+ return buildEd25519SignerTx(this.writeDeps(), "update_signer", publicKey, limits, store, expiration);
86
+ }
87
+ addPolicy(policy, limits, store, expiration) {
88
+ return buildPolicySignerTx(this.writeDeps(), "add_signer", policy, limits, store, expiration);
89
+ }
90
+ updatePolicy(policy, limits, store, expiration) {
91
+ return buildPolicySignerTx(this.writeDeps(), "update_signer", policy, limits, store, expiration);
92
+ }
93
+ remove(signerKey) {
94
+ return buildRemoveSignerTx(this.writeDeps(), signerKey);
95
+ }
96
+ /** Build an `upgrade(new_wasm_hash)` transaction. */
97
+ upgrade(newWasmHash) {
98
+ return buildUpgradeTx(this.writeDeps(), newWasmHash);
99
+ }
100
+ // -- Reads -------------------------------------------------------------------
101
+ /** Read a signer entry from the ledger (temporary before persistent). */
102
+ getSigner(signerKey) {
103
+ const { spec } = this.requireWallet();
104
+ const contractId = this.deps.getContractId();
105
+ if (!contractId) {
106
+ throw new WalletNotConnectedError("read a signer");
107
+ }
108
+ return getSignerOp({ rpc: this.deps.rpc, spec }, contractId, signerKey);
109
+ }
110
+ }
111
+ //# 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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"}