@bsv/wallet-toolbox 1.2.36 → 1.2.38
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.
- package/.github/pull_request_template.md +0 -2
- package/docs/client.md +244 -169
- package/docs/wallet.md +244 -169
- package/out/src/CWIStyleWalletManager.d.ts +151 -131
- package/out/src/CWIStyleWalletManager.d.ts.map +1 -1
- package/out/src/CWIStyleWalletManager.js +654 -555
- package/out/src/CWIStyleWalletManager.js.map +1 -1
- package/out/src/__tests/CWIStyleWalletManager.test.js +6 -6
- package/out/src/__tests/CWIStyleWalletManager.test.js.map +1 -1
- package/out/test/Wallet/local/localWallet.man.test.js.map +1 -1
- package/out/test/Wallet/local/localWallet2.man.test.js +11 -2
- package/out/test/Wallet/local/localWallet2.man.test.js.map +1 -1
- package/out/test/Wallet/support/opers1.man.test.js +7 -5
- package/out/test/Wallet/support/opers1.man.test.js.map +1 -1
- package/out/tsconfig.all.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/CWIStyleWalletManager.ts +821 -663
- package/src/__tests/CWIStyleWalletManager.test.ts +6 -6
- package/test/Wallet/local/localWallet.man.test.ts +1 -5
- package/test/Wallet/local/localWallet2.man.test.ts +15 -4
- package/test/Wallet/support/opers1.man.test.ts +27 -22
|
@@ -4,28 +4,57 @@ import { PrivilegedKeyManager } from './sdk/PrivilegedKeyManager';
|
|
|
4
4
|
* Number of rounds used in PBKDF2 for deriving password keys.
|
|
5
5
|
*/
|
|
6
6
|
export declare const PBKDF2_NUM_ROUNDS = 7777;
|
|
7
|
+
/**
|
|
8
|
+
* Unique Identifier for the default profile (16 zero bytes).
|
|
9
|
+
*/
|
|
10
|
+
export declare const DEFAULT_PROFILE_ID: number[];
|
|
11
|
+
/**
|
|
12
|
+
* Describes the structure of a user profile within the wallet.
|
|
13
|
+
*/
|
|
14
|
+
export interface Profile {
|
|
15
|
+
/**
|
|
16
|
+
* User-defined name for the profile.
|
|
17
|
+
*/
|
|
18
|
+
name: string;
|
|
19
|
+
/**
|
|
20
|
+
* Unique 16-byte identifier for the profile.
|
|
21
|
+
*/
|
|
22
|
+
id: number[];
|
|
23
|
+
/**
|
|
24
|
+
* 32-byte random pad XOR'd with the root primary key to derive the profile's primary key.
|
|
25
|
+
*/
|
|
26
|
+
primaryPad: number[];
|
|
27
|
+
/**
|
|
28
|
+
* 32-byte random pad XOR'd with the root privileged key to derive the profile's privileged key.
|
|
29
|
+
*/
|
|
30
|
+
privilegedPad: number[];
|
|
31
|
+
/**
|
|
32
|
+
* Timestamp (seconds since epoch) when the profile was created.
|
|
33
|
+
*/
|
|
34
|
+
createdAt: number;
|
|
35
|
+
}
|
|
7
36
|
/**
|
|
8
37
|
* Describes the structure of a User Management Protocol (UMP) token.
|
|
9
38
|
*/
|
|
10
39
|
export interface UMPToken {
|
|
11
40
|
/**
|
|
12
|
-
* Primary key encrypted by the XOR of the password and presentation keys.
|
|
41
|
+
* Root Primary key encrypted by the XOR of the password and presentation keys.
|
|
13
42
|
*/
|
|
14
43
|
passwordPresentationPrimary: number[];
|
|
15
44
|
/**
|
|
16
|
-
* Primary key encrypted by the XOR of the password and recovery keys.
|
|
45
|
+
* Root Primary key encrypted by the XOR of the password and recovery keys.
|
|
17
46
|
*/
|
|
18
47
|
passwordRecoveryPrimary: number[];
|
|
19
48
|
/**
|
|
20
|
-
* Primary key encrypted by the XOR of the presentation and recovery keys.
|
|
49
|
+
* Root Primary key encrypted by the XOR of the presentation and recovery keys.
|
|
21
50
|
*/
|
|
22
51
|
presentationRecoveryPrimary: number[];
|
|
23
52
|
/**
|
|
24
|
-
* Privileged key encrypted by the XOR of the password and primary keys.
|
|
53
|
+
* Root Privileged key encrypted by the XOR of the password and primary keys.
|
|
25
54
|
*/
|
|
26
55
|
passwordPrimaryPrivileged: number[];
|
|
27
56
|
/**
|
|
28
|
-
* Privileged key encrypted by the XOR of the presentation and recovery keys.
|
|
57
|
+
* Root Privileged key encrypted by the XOR of the presentation and recovery keys.
|
|
29
58
|
*/
|
|
30
59
|
presentationRecoveryPrivileged: number[];
|
|
31
60
|
/**
|
|
@@ -41,17 +70,22 @@ export interface UMPToken {
|
|
|
41
70
|
*/
|
|
42
71
|
recoveryHash: number[];
|
|
43
72
|
/**
|
|
44
|
-
* A copy of the presentation key encrypted with the privileged key.
|
|
73
|
+
* A copy of the presentation key encrypted with the root privileged key.
|
|
45
74
|
*/
|
|
46
75
|
presentationKeyEncrypted: number[];
|
|
47
76
|
/**
|
|
48
|
-
* A copy of the recovery key encrypted with the privileged key.
|
|
77
|
+
* A copy of the recovery key encrypted with the root privileged key.
|
|
49
78
|
*/
|
|
50
79
|
recoveryKeyEncrypted: number[];
|
|
51
80
|
/**
|
|
52
|
-
* A copy of the password key encrypted with the privileged key.
|
|
81
|
+
* A copy of the password key encrypted with the root privileged key.
|
|
53
82
|
*/
|
|
54
83
|
passwordKeyEncrypted: number[];
|
|
84
|
+
/**
|
|
85
|
+
* Optional field containing the encrypted profile data.
|
|
86
|
+
* JSON string -> Encrypted Bytes using root privileged key.
|
|
87
|
+
*/
|
|
88
|
+
profilesEncrypted?: number[];
|
|
55
89
|
/**
|
|
56
90
|
* Describes the token's location on-chain, if it's already been published.
|
|
57
91
|
*/
|
|
@@ -80,13 +114,14 @@ export interface UMPTokenInteractor {
|
|
|
80
114
|
/**
|
|
81
115
|
* Creates (and optionally consumes the previous version of) a UMP token on-chain.
|
|
82
116
|
*
|
|
83
|
-
* @param wallet The wallet that might be used to create a new token.
|
|
117
|
+
* @param wallet The wallet that might be used to create a new token (MUST be operating under the DEFAULT profile).
|
|
84
118
|
* @param adminOriginator The domain name of the administrative originator.
|
|
85
119
|
* @param token The new UMP token to create.
|
|
86
120
|
* @param oldTokenToConsume If provided, the old token that must be consumed in the same transaction.
|
|
87
121
|
* @returns The newly created outpoint.
|
|
88
122
|
*/
|
|
89
|
-
buildAndSend: (wallet: WalletInterface,
|
|
123
|
+
buildAndSend: (wallet: WalletInterface, // This wallet MUST be the one built for the default profile
|
|
124
|
+
adminOriginator: OriginatorDomainNameStringUnder250Bytes, token: UMPToken, oldTokenToConsume?: UMPToken) => Promise<OutpointString>;
|
|
90
125
|
}
|
|
91
126
|
/**
|
|
92
127
|
* @class OverlayUMPTokenInteractor
|
|
@@ -139,13 +174,14 @@ export declare class OverlayUMPTokenInteractor implements UMPTokenInteractor {
|
|
|
139
174
|
* then broadcast and published under the `tm_users` topic using a SHIP broadcast, ensuring
|
|
140
175
|
* overlay participants see the updated token.
|
|
141
176
|
*
|
|
142
|
-
* @param wallet The wallet used to build and sign the transaction.
|
|
177
|
+
* @param wallet The wallet used to build and sign the transaction (MUST be operating under the DEFAULT profile).
|
|
143
178
|
* @param adminOriginator The domain/FQDN of the administrative originator (wallet operator).
|
|
144
179
|
* @param token The new UMPToken to create on-chain.
|
|
145
180
|
* @param oldTokenToConsume Optionally, an existing token to consume/spend in the same transaction.
|
|
146
181
|
* @returns The outpoint of the newly created UMP token (e.g. "abcd1234...ef.0").
|
|
147
182
|
*/
|
|
148
|
-
buildAndSend(wallet: WalletInterface,
|
|
183
|
+
buildAndSend(wallet: WalletInterface, // This wallet MUST be the one built for the default profile
|
|
184
|
+
adminOriginator: OriginatorDomainNameStringUnder250Bytes, token: UMPToken, oldTokenToConsume?: UMPToken): Promise<OutpointString>;
|
|
149
185
|
/**
|
|
150
186
|
* Attempts to parse a LookupAnswer from the UMP lookup service. If successful,
|
|
151
187
|
* extracts the token fields from the resulting transaction and constructs
|
|
@@ -164,11 +200,12 @@ export declare class OverlayUMPTokenInteractor implements UMPTokenInteractor {
|
|
|
164
200
|
}
|
|
165
201
|
/**
|
|
166
202
|
* Manages a "CWI-style" wallet that uses a UMP token and a
|
|
167
|
-
* multi-key authentication scheme (password, presentation key, and recovery key)
|
|
203
|
+
* multi-key authentication scheme (password, presentation key, and recovery key),
|
|
204
|
+
* supporting multiple user profiles under a single account.
|
|
168
205
|
*/
|
|
169
206
|
export declare class CWIStyleWalletManager implements WalletInterface {
|
|
170
207
|
/**
|
|
171
|
-
* Whether the user is currently authenticated.
|
|
208
|
+
* Whether the user is currently authenticated (i.e., root keys are available).
|
|
172
209
|
*/
|
|
173
210
|
authenticated: boolean;
|
|
174
211
|
/**
|
|
@@ -192,199 +229,182 @@ export declare class CWIStyleWalletManager implements WalletInterface {
|
|
|
192
229
|
*/
|
|
193
230
|
private passwordRetriever;
|
|
194
231
|
/**
|
|
195
|
-
*
|
|
196
|
-
* Allows integration with faucets, and provides the presentation key for use in claiming faucet funds
|
|
197
|
-
* that may be bound to it.
|
|
232
|
+
* Optional function to fund a new Wallet after the new-user flow.
|
|
198
233
|
*/
|
|
199
234
|
private newWalletFunder?;
|
|
200
235
|
/**
|
|
201
|
-
* Builds the underlying wallet
|
|
236
|
+
* Builds the underlying wallet for a specific profile.
|
|
202
237
|
*/
|
|
203
238
|
private walletBuilder;
|
|
204
239
|
/**
|
|
205
|
-
*
|
|
206
|
-
* - 'presentation-key-and-password'
|
|
207
|
-
* - 'presentation-key-and-recovery-key'
|
|
208
|
-
* - 'recovery-key-and-password'
|
|
240
|
+
* Current mode of authentication.
|
|
209
241
|
*/
|
|
210
242
|
authenticationMode: 'presentation-key-and-password' | 'presentation-key-and-recovery-key' | 'recovery-key-and-password';
|
|
211
243
|
/**
|
|
212
|
-
* Indicates
|
|
213
|
-
* - 'new-user'
|
|
214
|
-
* - 'existing-user'
|
|
244
|
+
* Indicates new user or existing user flow.
|
|
215
245
|
*/
|
|
216
246
|
authenticationFlow: 'new-user' | 'existing-user';
|
|
217
247
|
/**
|
|
218
|
-
* The current UMP token in use
|
|
248
|
+
* The current UMP token in use.
|
|
219
249
|
*/
|
|
220
250
|
private currentUMPToken?;
|
|
221
251
|
/**
|
|
222
|
-
*
|
|
252
|
+
* Temporarily retained presentation key.
|
|
223
253
|
*/
|
|
224
254
|
private presentationKey?;
|
|
225
255
|
/**
|
|
226
|
-
*
|
|
256
|
+
* Temporarily retained recovery key.
|
|
227
257
|
*/
|
|
228
258
|
private recoveryKey?;
|
|
229
259
|
/**
|
|
230
|
-
* The user's primary key,
|
|
231
|
-
* It is also stored within state snapshots.
|
|
260
|
+
* The user's *root* primary key, derived from authentication factors.
|
|
232
261
|
*/
|
|
233
|
-
private
|
|
262
|
+
private rootPrimaryKey?;
|
|
234
263
|
/**
|
|
235
|
-
* The
|
|
236
|
-
|
|
264
|
+
* The currently active profile ID (null or DEFAULT_PROFILE_ID means default profile).
|
|
265
|
+
*/
|
|
266
|
+
private activeProfileId;
|
|
267
|
+
/**
|
|
268
|
+
* List of loaded non-default profiles.
|
|
269
|
+
*/
|
|
270
|
+
private profiles;
|
|
271
|
+
/**
|
|
272
|
+
* The underlying wallet instance for the *active* profile.
|
|
237
273
|
*/
|
|
238
274
|
private underlying?;
|
|
239
275
|
/**
|
|
240
|
-
* Privileged key manager associated with the
|
|
241
|
-
* short-term administrative tasks (e.g. re-wrapping or rotating keys).
|
|
276
|
+
* Privileged key manager associated with the *root* keys, aware of the active profile.
|
|
242
277
|
*/
|
|
243
|
-
private
|
|
278
|
+
private rootPrivilegedKeyManager?;
|
|
244
279
|
/**
|
|
245
280
|
* Constructs a new CWIStyleWalletManager.
|
|
246
281
|
*
|
|
247
282
|
* @param adminOriginator The domain name of the administrative originator.
|
|
248
|
-
* @param walletBuilder A function that can build an underlying wallet instance
|
|
249
|
-
*
|
|
250
|
-
* @param
|
|
251
|
-
* @param
|
|
252
|
-
* @param
|
|
253
|
-
* @param
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
/**
|
|
258
|
-
* Provides the presentation key
|
|
259
|
-
* If a UMP token is found based on the key's hash, this is an existing-user flow.
|
|
260
|
-
* Otherwise, it is treated as a new-user flow.
|
|
261
|
-
*
|
|
262
|
-
* @param key The user's presentation key (32 bytes).
|
|
263
|
-
* @throws {Error} if user is already authenticated, or if the current mode does not require a presentation key.
|
|
283
|
+
* @param walletBuilder A function that can build an underlying wallet instance for a profile.
|
|
284
|
+
* @param interactor An instance of UMPTokenInteractor.
|
|
285
|
+
* @param recoveryKeySaver A function to persist a new recovery key.
|
|
286
|
+
* @param passwordRetriever A function to request the user's password.
|
|
287
|
+
* @param newWalletFunder Optional function to fund a new wallet.
|
|
288
|
+
* @param stateSnapshot Optional previously saved state snapshot.
|
|
289
|
+
*/
|
|
290
|
+
constructor(adminOriginator: OriginatorDomainNameStringUnder250Bytes, walletBuilder: (profilePrimaryKey: number[], profilePrivilegedKeyManager: PrivilegedKeyManager, profileId: number[]) => Promise<WalletInterface>, interactor: UMPTokenInteractor | undefined, recoveryKeySaver: (key: number[]) => Promise<true>, passwordRetriever: (reason: string, test: (passwordCandidate: string) => boolean) => Promise<string>, newWalletFunder?: (presentationKey: number[], wallet: WalletInterface, // Default profile wallet
|
|
291
|
+
adminOriginator: OriginatorDomainNameStringUnder250Bytes) => Promise<void>, stateSnapshot?: number[]);
|
|
292
|
+
/**
|
|
293
|
+
* Provides the presentation key.
|
|
264
294
|
*/
|
|
265
295
|
providePresentationKey(key: number[]): Promise<void>;
|
|
266
296
|
/**
|
|
267
|
-
* Provides the password
|
|
268
|
-
*
|
|
269
|
-
* - **Existing user**:
|
|
270
|
-
* Decrypts the primary key using the provided password (and either the presentation key or recovery key, depending on the mode).
|
|
271
|
-
* Then builds the underlying wallet, marking the user as authenticated.
|
|
272
|
-
*
|
|
273
|
-
* - **New user**:
|
|
274
|
-
* Generates a new UMP token with fresh keys (primary, privileged, recovery). Publishes it on-chain and builds the wallet.
|
|
275
|
-
*
|
|
276
|
-
* @param password The user's password as a string.
|
|
277
|
-
* @throws {Error} If the user is already authenticated, if the mode does not use a password, or if required keys are missing.
|
|
297
|
+
* Provides the password.
|
|
278
298
|
*/
|
|
279
299
|
providePassword(password: string): Promise<void>;
|
|
280
300
|
/**
|
|
281
|
-
* Provides the recovery key
|
|
282
|
-
*
|
|
283
|
-
* @param recoveryKey The user's recovery key (32 bytes).
|
|
284
|
-
* @throws {Error} if user is already authenticated, if the mode does not use a recovery key,
|
|
285
|
-
* or if a required presentation key is missing in "presentation-key-and-recovery-key" mode.
|
|
301
|
+
* Provides the recovery key.
|
|
286
302
|
*/
|
|
287
303
|
provideRecoveryKey(recoveryKey: number[]): Promise<void>;
|
|
288
304
|
/**
|
|
289
|
-
* Saves the current wallet state (
|
|
290
|
-
*
|
|
291
|
-
*
|
|
305
|
+
* Saves the current wallet state (root key, UMP token, active profile) into an encrypted snapshot.
|
|
306
|
+
* Version 2 format: [1 byte version=2] + [32 byte snapshot key] + [16 byte activeProfileId] + [encrypted payload]
|
|
307
|
+
* Encrypted Payload: [32 byte rootPrimaryKey] + [varint token length + serialized UMP token]
|
|
292
308
|
*
|
|
293
|
-
* @
|
|
294
|
-
* Storing the snapshot provides a fully authenticated state.
|
|
295
|
-
* This **must** be securely stored (e.g. system keychain or encrypted file).
|
|
296
|
-
* If attackers gain access to this snapshot, they can fully control the wallet.
|
|
297
|
-
*
|
|
298
|
-
* @returns An array of bytes representing the encrypted snapshot.
|
|
299
|
-
* @throws {Error} if no primary key or token is currently set.
|
|
309
|
+
* @returns Encrypted snapshot bytes.
|
|
300
310
|
*/
|
|
301
311
|
saveSnapshot(): number[];
|
|
302
312
|
/**
|
|
303
|
-
* Loads a previously saved state snapshot
|
|
304
|
-
*
|
|
313
|
+
* Loads a previously saved state snapshot. Restores root key, UMP token, profiles, and active profile.
|
|
314
|
+
* Handles Version 1 (legacy) and Version 2 formats.
|
|
305
315
|
*
|
|
306
|
-
* @param snapshot
|
|
307
|
-
* @throws {Error} If the snapshot format is invalid or decryption fails.
|
|
316
|
+
* @param snapshot Encrypted snapshot bytes.
|
|
308
317
|
*/
|
|
309
318
|
loadSnapshot(snapshot: number[]): Promise<void>;
|
|
310
319
|
/**
|
|
311
|
-
* Destroys the
|
|
320
|
+
* Destroys the wallet state, clearing keys, tokens, and profiles.
|
|
312
321
|
*/
|
|
313
322
|
destroy(): void;
|
|
314
323
|
/**
|
|
315
|
-
*
|
|
324
|
+
* Lists all available profiles, including the default profile.
|
|
325
|
+
* @returns Array of profile info objects, including an 'active' flag.
|
|
326
|
+
*/
|
|
327
|
+
listProfiles(): Array<{
|
|
328
|
+
id: number[];
|
|
329
|
+
name: string;
|
|
330
|
+
createdAt: number | null;
|
|
331
|
+
active: boolean;
|
|
332
|
+
}>;
|
|
333
|
+
/**
|
|
334
|
+
* Adds a new profile with the given name.
|
|
335
|
+
* Generates necessary pads and updates the UMP token.
|
|
336
|
+
* Does not switch to the new profile automatically.
|
|
316
337
|
*
|
|
317
|
-
* @param
|
|
318
|
-
* @
|
|
338
|
+
* @param name The desired name for the new profile.
|
|
339
|
+
* @returns The ID of the newly created profile.
|
|
319
340
|
*/
|
|
320
|
-
|
|
341
|
+
addProfile(name: string): Promise<number[]>;
|
|
321
342
|
/**
|
|
322
|
-
*
|
|
343
|
+
* Deletes a profile by its ID.
|
|
344
|
+
* Cannot delete the default profile. If the active profile is deleted,
|
|
345
|
+
* it switches back to the default profile.
|
|
323
346
|
*
|
|
324
|
-
* @
|
|
347
|
+
* @param profileId The 16-byte ID of the profile to delete.
|
|
325
348
|
*/
|
|
326
|
-
|
|
349
|
+
deleteProfile(profileId: number[]): Promise<void>;
|
|
327
350
|
/**
|
|
328
|
-
*
|
|
351
|
+
* Switches the active profile. This re-derives keys and rebuilds the underlying wallet.
|
|
329
352
|
*
|
|
330
|
-
* @
|
|
353
|
+
* @param profileId The 16-byte ID of the profile to switch to (use DEFAULT_PROFILE_ID for default).
|
|
354
|
+
*/
|
|
355
|
+
switchProfile(profileId: number[]): Promise<void>;
|
|
356
|
+
/**
|
|
357
|
+
* Changes the user's password. Re-wraps keys and updates the UMP token.
|
|
358
|
+
*/
|
|
359
|
+
changePassword(newPassword: string): Promise<void>;
|
|
360
|
+
/**
|
|
361
|
+
* Retrieves the current recovery key. Requires privileged access.
|
|
362
|
+
*/
|
|
363
|
+
getRecoveryKey(): Promise<number[]>;
|
|
364
|
+
/**
|
|
365
|
+
* Changes the user's recovery key. Prompts user to save the new key.
|
|
331
366
|
*/
|
|
332
367
|
changeRecoveryKey(): Promise<void>;
|
|
333
368
|
/**
|
|
334
369
|
* Changes the user's presentation key.
|
|
335
|
-
*
|
|
336
|
-
* @param presentationKey The new presentation key (32 bytes).
|
|
337
|
-
* @throws {Error} If the user is not authenticated, or if underlying token references are missing.
|
|
338
370
|
*/
|
|
339
|
-
changePresentationKey(
|
|
371
|
+
changePresentationKey(newPresentationKey: number[]): Promise<void>;
|
|
340
372
|
/**
|
|
341
|
-
*
|
|
342
|
-
*
|
|
343
|
-
* @param passwordSalt The PBKDF2 salt for the new password factor.
|
|
344
|
-
* @param passwordKey The PBKDF2-derived password key (32 bytes).
|
|
345
|
-
* @param presentationKey The new or existing presentation key (32 bytes).
|
|
346
|
-
* @param recoveryKey The new or existing recovery key (32 bytes).
|
|
347
|
-
* @param primaryKey The user's primary key for re-wrapping.
|
|
348
|
-
* @param privilegedKey The user's privileged key for re-wrapping.
|
|
349
|
-
* @throws {Error} If the user is not authenticated or if keys are unavailable.
|
|
373
|
+
* Performs XOR operation on two byte arrays.
|
|
350
374
|
*/
|
|
351
|
-
private
|
|
375
|
+
private XOR;
|
|
352
376
|
/**
|
|
353
|
-
*
|
|
354
|
-
*
|
|
355
|
-
* @param
|
|
356
|
-
* @param
|
|
357
|
-
* @returns
|
|
358
|
-
* @throws {Error} if the two arrays are not the same length.
|
|
377
|
+
* Helper to decrypt a specific factor (key) stored encrypted in the UMP token.
|
|
378
|
+
* Requires the root privileged key manager.
|
|
379
|
+
* @param factorName Name of the factor to decrypt ('passwordKey', 'presentationKey', 'recoveryKey', 'privilegedKey').
|
|
380
|
+
* @param getRoot If true and factorName is 'privilegedKey', returns the root privileged key bytes directly.
|
|
381
|
+
* @returns The decrypted key bytes.
|
|
359
382
|
*/
|
|
360
|
-
private
|
|
383
|
+
private getFactor;
|
|
361
384
|
/**
|
|
362
|
-
*
|
|
363
|
-
*
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
*
|
|
368
|
-
*
|
|
369
|
-
* @returns A byte array representing the serialized token.
|
|
370
|
-
* @throws {Error} if the token has no currentOutpoint (required for serialization).
|
|
385
|
+
* Recomputes UMP token fields with updated factors and profiles, then publishes the update.
|
|
386
|
+
* This operation requires the *root* privileged key and the *default* profile wallet.
|
|
387
|
+
*/
|
|
388
|
+
private updateAuthFactors;
|
|
389
|
+
/**
|
|
390
|
+
* Serializes a UMP token to binary format (Version 2 with optional profiles).
|
|
391
|
+
* Layout: [1 byte version=2] + [11 * (varint len + bytes) for standard fields] + [1 byte profile_flag] + [IF flag=1 THEN varint len + profile bytes] + [varint len + outpoint bytes]
|
|
371
392
|
*/
|
|
372
393
|
private serializeUMPToken;
|
|
373
394
|
/**
|
|
374
|
-
*
|
|
375
|
-
*
|
|
376
|
-
* @param bin The serialized byte array.
|
|
377
|
-
* @returns The reconstructed UMP token.
|
|
378
|
-
* @throws {Error} if the version byte is unexpected or if parsing fails.
|
|
395
|
+
* Deserializes a UMP token from binary format (Handles Version 1 and 2).
|
|
379
396
|
*/
|
|
380
397
|
private deserializeUMPToken;
|
|
381
398
|
/**
|
|
382
|
-
*
|
|
399
|
+
* Sets up the root key infrastructure after authentication or loading from snapshot.
|
|
400
|
+
* Initializes the root primary key, root privileged key manager, loads profiles,
|
|
401
|
+
* and sets the authenticated flag. Does NOT switch profile initially.
|
|
383
402
|
*
|
|
384
|
-
* @param
|
|
385
|
-
* @param
|
|
403
|
+
* @param rootPrimaryKey The user's root primary key (32 bytes).
|
|
404
|
+
* @param ephemeralRootPrivilegedKey Optional root privileged key (e.g., during recovery flows).
|
|
386
405
|
*/
|
|
387
|
-
private
|
|
406
|
+
private setupRootInfrastructure;
|
|
407
|
+
private checkAuthAndUnderlying;
|
|
388
408
|
getPublicKey(args: GetPublicKeyArgs, originator?: OriginatorDomainNameStringUnder250Bytes): Promise<GetPublicKeyResult>;
|
|
389
409
|
revealCounterpartyKeyLinkage(args: RevealCounterpartyKeyLinkageArgs, originator?: OriginatorDomainNameStringUnder250Bytes): Promise<RevealCounterpartyKeyLinkageResult>;
|
|
390
410
|
revealSpecificKeyLinkage(args: RevealSpecificKeyLinkageArgs, originator?: OriginatorDomainNameStringUnder250Bytes): Promise<RevealSpecificKeyLinkageResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CWIStyleWalletManager.d.ts","sourceRoot":"","sources":["../../src/CWIStyleWalletManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,wBAAwB,EACxB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,yBAAyB,EACzB,0BAA0B,EAC1B,aAAa,EACb,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,eAAe,EACf,iBAAiB,EACjB,uCAAuC,EACvC,oBAAoB,EACpB,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,EAC3B,oBAAoB,EACpB,sBAAsB,EACtB,gCAAgC,EAChC,kCAAkC,EAClC,4BAA4B,EAC5B,8BAA8B,EAC9B,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,cAAc,EAEd,cAAc,EAKd,eAAe,EAChB,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AAEjE;;GAEG;AACH,eAAO,MAAM,iBAAiB,OAAO,CAAA;AAErC;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB;;OAEG;IACH,2BAA2B,EAAE,MAAM,EAAE,CAAA;IAErC;;OAEG;IACH,uBAAuB,EAAE,MAAM,EAAE,CAAA;IAEjC;;OAEG;IACH,2BAA2B,EAAE,MAAM,EAAE,CAAA;IAErC;;OAEG;IACH,yBAAyB,EAAE,MAAM,EAAE,CAAA;IAEnC;;OAEG;IACH,8BAA8B,EAAE,MAAM,EAAE,CAAA;IAExC;;OAEG;IACH,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAE1B;;OAEG;IACH,YAAY,EAAE,MAAM,EAAE,CAAA;IAEtB;;OAEG;IACH,YAAY,EAAE,MAAM,EAAE,CAAA;IAEtB;;OAEG;IACH,wBAAwB,EAAE,MAAM,EAAE,CAAA;IAElC;;OAEG;IACH,oBAAoB,EAAE,MAAM,EAAE,CAAA;IAE9B;;OAEG;IACH,oBAAoB,EAAE,MAAM,EAAE,CAAA;IAE9B;;OAEG;IACH,eAAe,CAAC,EAAE,cAAc,CAAA;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;;OAMG;IACH,yBAAyB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAA;IAE5E;;;;;;OAMG;IACH,qBAAqB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAA;IAExE;;;;;;;;OAQG;IACH,YAAY,EAAE,CACZ,MAAM,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"CWIStyleWalletManager.d.ts","sourceRoot":"","sources":["../../src/CWIStyleWalletManager.ts"],"names":[],"mappings":"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"}
|