@guveno/wallet-sdk 1.0.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 (100) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +211 -0
  3. package/dist/api/client.d.ts +48 -0
  4. package/dist/api/client.d.ts.map +1 -0
  5. package/dist/api/client.js +563 -0
  6. package/dist/api/client.js.map +1 -0
  7. package/dist/api/types.d.ts +237 -0
  8. package/dist/api/types.d.ts.map +1 -0
  9. package/dist/api/types.js +9 -0
  10. package/dist/api/types.js.map +1 -0
  11. package/dist/chains.d.ts +25 -0
  12. package/dist/chains.d.ts.map +1 -0
  13. package/dist/chains.js +67 -0
  14. package/dist/chains.js.map +1 -0
  15. package/dist/constants.d.ts +17 -0
  16. package/dist/constants.d.ts.map +1 -0
  17. package/dist/constants.js +19 -0
  18. package/dist/constants.js.map +1 -0
  19. package/dist/crypto/sealed-box.d.ts +8 -0
  20. package/dist/crypto/sealed-box.d.ts.map +1 -0
  21. package/dist/crypto/sealed-box.js +66 -0
  22. package/dist/crypto/sealed-box.js.map +1 -0
  23. package/dist/derivation.d.ts +26 -0
  24. package/dist/derivation.d.ts.map +1 -0
  25. package/dist/derivation.js +121 -0
  26. package/dist/derivation.js.map +1 -0
  27. package/dist/errors.d.ts +81 -0
  28. package/dist/errors.d.ts.map +1 -0
  29. package/dist/errors.js +95 -0
  30. package/dist/errors.js.map +1 -0
  31. package/dist/hot-wallet.d.ts +57 -0
  32. package/dist/hot-wallet.d.ts.map +1 -0
  33. package/dist/hot-wallet.js +139 -0
  34. package/dist/hot-wallet.js.map +1 -0
  35. package/dist/index.d.ts +29 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +21 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/keyprovider/file-provider.d.ts +19 -0
  40. package/dist/keyprovider/file-provider.d.ts.map +1 -0
  41. package/dist/keyprovider/file-provider.js +48 -0
  42. package/dist/keyprovider/file-provider.js.map +1 -0
  43. package/dist/keyprovider/index.d.ts +13 -0
  44. package/dist/keyprovider/index.d.ts.map +1 -0
  45. package/dist/keyprovider/index.js +3 -0
  46. package/dist/keyprovider/index.js.map +1 -0
  47. package/dist/keyprovider/kms-provider.d.ts +26 -0
  48. package/dist/keyprovider/kms-provider.d.ts.map +1 -0
  49. package/dist/keyprovider/kms-provider.js +32 -0
  50. package/dist/keyprovider/kms-provider.js.map +1 -0
  51. package/dist/manager.d.ts +28 -0
  52. package/dist/manager.d.ts.map +1 -0
  53. package/dist/manager.js +499 -0
  54. package/dist/manager.js.map +1 -0
  55. package/dist/mnemonic.d.ts +13 -0
  56. package/dist/mnemonic.d.ts.map +1 -0
  57. package/dist/mnemonic.js +44 -0
  58. package/dist/mnemonic.js.map +1 -0
  59. package/dist/session/file-store.d.ts +10 -0
  60. package/dist/session/file-store.d.ts.map +1 -0
  61. package/dist/session/file-store.js +88 -0
  62. package/dist/session/file-store.js.map +1 -0
  63. package/dist/signing/sign-bitcoin.d.ts +14 -0
  64. package/dist/signing/sign-bitcoin.d.ts.map +1 -0
  65. package/dist/signing/sign-bitcoin.js +133 -0
  66. package/dist/signing/sign-bitcoin.js.map +1 -0
  67. package/dist/signing/sign-ethereum.d.ts +13 -0
  68. package/dist/signing/sign-ethereum.d.ts.map +1 -0
  69. package/dist/signing/sign-ethereum.js +49 -0
  70. package/dist/signing/sign-ethereum.js.map +1 -0
  71. package/dist/signing/sign-polkadot.d.ts +9 -0
  72. package/dist/signing/sign-polkadot.d.ts.map +1 -0
  73. package/dist/signing/sign-polkadot.js +79 -0
  74. package/dist/signing/sign-polkadot.js.map +1 -0
  75. package/dist/signing/sign-withdrawal.d.ts +21 -0
  76. package/dist/signing/sign-withdrawal.d.ts.map +1 -0
  77. package/dist/signing/sign-withdrawal.js +35 -0
  78. package/dist/signing/sign-withdrawal.js.map +1 -0
  79. package/dist/signing/sign-xrp.d.ts +7 -0
  80. package/dist/signing/sign-xrp.d.ts.map +1 -0
  81. package/dist/signing/sign-xrp.js +27 -0
  82. package/dist/signing/sign-xrp.js.map +1 -0
  83. package/dist/signing/types.d.ts +84 -0
  84. package/dist/signing/types.d.ts.map +1 -0
  85. package/dist/signing/types.js +15 -0
  86. package/dist/signing/types.js.map +1 -0
  87. package/dist/storage/crypto.d.ts +7 -0
  88. package/dist/storage/crypto.d.ts.map +1 -0
  89. package/dist/storage/crypto.js +80 -0
  90. package/dist/storage/crypto.js.map +1 -0
  91. package/dist/storage/file-store.d.ts +21 -0
  92. package/dist/storage/file-store.d.ts.map +1 -0
  93. package/dist/storage/file-store.js +219 -0
  94. package/dist/storage/file-store.js.map +1 -0
  95. package/dist/types.d.ts +187 -0
  96. package/dist/types.d.ts.map +1 -0
  97. package/dist/types.js +2 -0
  98. package/dist/types.js.map +1 -0
  99. package/docs/security.md +119 -0
  100. package/package.json +76 -0
@@ -0,0 +1,32 @@
1
+ import { KeyResolutionError } from '../errors.js';
2
+ /**
3
+ * Resolves mnemonics by handing each wallet's wrapped secret to a caller-supplied
4
+ * {@link KmsDecryptFn}. The plaintext mnemonic exists only transiently in process
5
+ * memory while a withdrawal is signed (the "unwrap-then-sign" model).
6
+ */
7
+ export class KmsKeyProvider {
8
+ entries;
9
+ decrypt;
10
+ constructor(options) {
11
+ this.entries = { ...options.entries };
12
+ this.decrypt = options.decrypt;
13
+ }
14
+ async getMnemonic(keyFingerprint) {
15
+ const wrapped = this.entries[keyFingerprint];
16
+ if (typeof wrapped !== 'string' || wrapped.length === 0) {
17
+ throw new KeyResolutionError(`No wrapped secret configured for key fingerprint "${keyFingerprint}".`);
18
+ }
19
+ let mnemonic;
20
+ try {
21
+ mnemonic = await this.decrypt(wrapped, keyFingerprint);
22
+ }
23
+ catch (error) {
24
+ throw new KeyResolutionError(`Failed to unwrap the secret for "${keyFingerprint}".`, { cause: error });
25
+ }
26
+ if (typeof mnemonic !== 'string' || mnemonic.trim().length === 0) {
27
+ throw new KeyResolutionError(`Unwrap returned an empty mnemonic for "${keyFingerprint}".`);
28
+ }
29
+ return mnemonic;
30
+ }
31
+ }
32
+ //# sourceMappingURL=kms-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kms-provider.js","sourceRoot":"","sources":["../../src/keyprovider/kms-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAkBlD;;;;GAIG;AACH,MAAM,OAAO,cAAc;IACR,OAAO,CAAyB;IAChC,OAAO,CAAe;IAEvC,YAAY,OAA8B;QACxC,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QACtC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,cAAsB;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAE7C,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,kBAAkB,CAAC,qDAAqD,cAAc,IAAI,CAAC,CAAC;QACxG,CAAC;QAED,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,kBAAkB,CAAC,oCAAoC,cAAc,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACzG,CAAC;QAED,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjE,MAAM,IAAI,kBAAkB,CAAC,0CAA0C,cAAc,IAAI,CAAC,CAAC;QAC7F,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF"}
@@ -0,0 +1,28 @@
1
+ import type { CreateApiWalletInput } from './api/types.js';
2
+ import type { CreateWalletGroupOptions, CreateWalletGroupResult, DeriveAddressOptions, DerivedAccount, ImportWalletGroupOptions, ImportWalletGroupResult, LabelAccountOptions, WalletGroup, WalletGroupMetadataExport, WalletGroupRecordExport, WalletGroupSummary, WalletManagerOptions, WalletStore } from './types.js';
3
+ type EncryptionPasswordCarrier = {
4
+ encryptionPassword?: string;
5
+ };
6
+ export declare class WalletManager {
7
+ readonly store: WalletStore;
8
+ constructor(options?: WalletManagerOptions);
9
+ createWalletGroup(options: CreateWalletGroupOptions): Promise<CreateWalletGroupResult>;
10
+ importWalletGroup(options: ImportWalletGroupOptions): Promise<ImportWalletGroupResult>;
11
+ deriveAddress(options: DeriveAddressOptions): Promise<DerivedAccount>;
12
+ listWalletGroups(): Promise<WalletGroupSummary[]>;
13
+ getWalletGroup(groupIdentifier: string): Promise<WalletGroup>;
14
+ getFirstAddress(groupIdentifier: string): Promise<DerivedAccount>;
15
+ listDerivedAccounts(groupIdentifier: string): Promise<DerivedAccount[]>;
16
+ renameWalletGroup(groupIdentifier: string, newName: string): Promise<WalletGroup>;
17
+ labelAccount(options: LabelAccountOptions): Promise<DerivedAccount>;
18
+ exportWalletGroupMetadata(groupIdentifier: string): Promise<WalletGroupMetadataExport>;
19
+ exportWalletGroupRecord(groupIdentifier: string, options?: EncryptionPasswordCarrier): Promise<WalletGroupRecordExport>;
20
+ exportWalletForApi(groupIdentifier: string, options: EncryptionPasswordCarrier & {
21
+ recipientPublicKey: string;
22
+ }): Promise<CreateApiWalletInput>;
23
+ revealMnemonic(groupIdentifier: string, encryptionPassword?: string): Promise<string>;
24
+ }
25
+ export declare class EthereumWalletManager extends WalletManager {
26
+ }
27
+ export {};
28
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EACV,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,EACpB,cAAc,EAEd,wBAAwB,EACxB,uBAAuB,EACvB,mBAAmB,EAQnB,WAAW,EACX,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,EAElB,oBAAoB,EACpB,WAAW,EACZ,MAAM,YAAY,CAAC;AAgKpB,KAAK,yBAAyB,GAAG;IAC/B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AA+GF,qBAAa,aAAa;IACxB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;gBAEhB,OAAO,GAAE,oBAAyB;IAIxC,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAyDtF,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IA6GtF,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC;IAiCrE,gBAAgB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IASjD,cAAc,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAW7D,eAAe,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAWjE,mBAAmB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAKvE,iBAAiB,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAqBjF,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,CAAC;IA+BnE,yBAAyB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAuBtF,uBAAuB,CAC3B,eAAe,EAAE,MAAM,EACvB,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,uBAAuB,CAAC;IAwC7B,kBAAkB,CACtB,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,yBAAyB,GAAG;QAAE,kBAAkB,EAAE,MAAM,CAAA;KAAE,GAClE,OAAO,CAAC,oBAAoB,CAAC;IAc1B,cAAc,CAAC,eAAe,EAAE,MAAM,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAW5F;AAED,qBAAa,qBAAsB,SAAQ,aAAa;CAAG"}
@@ -0,0 +1,499 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { assertSupportedChain, assertSupportedNetwork } from './chains.js';
3
+ import { ENCRYPTION_ALGORITHM, ENCRYPTION_KDF, STORAGE_SCHEMA_VERSION, SUPPORTED_MNEMONIC_WORD_COUNTS } from './constants.js';
4
+ import { deriveAddress } from './derivation.js';
5
+ import { ConflictError, EncryptionRequiredError, NotFoundError, ValidationError } from './errors.js';
6
+ import { assertValidMnemonic, generateRandomMnemonic } from './mnemonic.js';
7
+ import { decryptMnemonic, encryptSecretRecord } from './storage/crypto.js';
8
+ import { FileSystemWalletStore } from './storage/file-store.js';
9
+ import { sealSecret } from './crypto/sealed-box.js';
10
+ function nowIso() {
11
+ return new Date().toISOString();
12
+ }
13
+ function normalizeGroupName(name) {
14
+ const normalized = name.trim();
15
+ if (!normalized) {
16
+ throw new ValidationError('Wallet group name cannot be empty.');
17
+ }
18
+ return normalized;
19
+ }
20
+ function normalizeLabel(label) {
21
+ if (label == null) {
22
+ return null;
23
+ }
24
+ const normalized = label.trim();
25
+ return normalized.length === 0 ? null : normalized;
26
+ }
27
+ function canonicalName(name) {
28
+ return normalizeGroupName(name).toLowerCase();
29
+ }
30
+ function fingerprintMnemonic(mnemonic) {
31
+ return createHash('sha256').update(mnemonic, 'utf8').digest('hex');
32
+ }
33
+ function toDerivedAccount(address) {
34
+ return {
35
+ chain: address.chain,
36
+ network: address.network,
37
+ address: address.address,
38
+ derivationPath: address.derivationPath,
39
+ index: address.index,
40
+ label: address.label,
41
+ createdAt: address.createdAt,
42
+ updatedAt: address.updatedAt
43
+ };
44
+ }
45
+ function findWalletByIdOrName(wallets, identifier) {
46
+ const trimmed = identifier.trim();
47
+ return wallets.find((wallet) => wallet.id === trimmed || canonicalName(wallet.name) === trimmed.toLowerCase());
48
+ }
49
+ function findWalletByKeyAndChain(wallets, keyId, chain, network) {
50
+ return wallets.find((wallet) => wallet.keyId === keyId && wallet.chain === chain && wallet.network === network);
51
+ }
52
+ function findKeyById(keys, keyId) {
53
+ return keys.find((key) => key.id === keyId);
54
+ }
55
+ function findKeyByFingerprint(keys, fingerprint) {
56
+ return keys.find((key) => key.fingerprint === fingerprint);
57
+ }
58
+ function listWalletAddresses(state, walletId) {
59
+ return state.metadata.addresses
60
+ .filter((address) => address.walletId === walletId)
61
+ .slice()
62
+ .sort((left, right) => left.index - right.index);
63
+ }
64
+ function countWalletsForKey(wallets, keyId) {
65
+ return wallets.reduce((count, wallet) => count + (wallet.keyId === keyId ? 1 : 0), 0);
66
+ }
67
+ function toWalletKeySummary(state, key) {
68
+ return {
69
+ id: key.id,
70
+ fingerprint: key.fingerprint,
71
+ walletCount: countWalletsForKey(state.metadata.wallets, key.id),
72
+ createdAt: key.createdAt,
73
+ updatedAt: key.updatedAt,
74
+ encryption: key.encryption
75
+ };
76
+ }
77
+ function toWalletGroup(state, wallet) {
78
+ const key = findKeyById(state.metadata.keys, wallet.keyId);
79
+ if (key == null) {
80
+ throw new NotFoundError(`No key material was found for wallet "${wallet.id}".`);
81
+ }
82
+ const accounts = listWalletAddresses(state, wallet.id).map(toDerivedAccount);
83
+ const [firstAccount] = accounts;
84
+ if (firstAccount == null) {
85
+ throw new ValidationError(`Wallet group "${wallet.name}" does not contain any derived accounts.`);
86
+ }
87
+ return {
88
+ id: wallet.id,
89
+ keyId: key.id,
90
+ keyFingerprint: key.fingerprint,
91
+ name: wallet.name,
92
+ chain: wallet.chain,
93
+ network: wallet.network,
94
+ firstAddress: firstAccount.address,
95
+ addressCount: accounts.length,
96
+ createdAt: wallet.createdAt,
97
+ updatedAt: wallet.updatedAt,
98
+ encryption: key.encryption,
99
+ accounts
100
+ };
101
+ }
102
+ function toWalletGroupSummary(state, wallet) {
103
+ const group = toWalletGroup(state, wallet);
104
+ return {
105
+ id: group.id,
106
+ keyId: group.keyId,
107
+ keyFingerprint: group.keyFingerprint,
108
+ name: group.name,
109
+ chain: group.chain,
110
+ network: group.network,
111
+ firstAddress: group.firstAddress,
112
+ addressCount: group.addressCount,
113
+ createdAt: group.createdAt,
114
+ updatedAt: group.updatedAt,
115
+ encryption: group.encryption
116
+ };
117
+ }
118
+ function assertUniqueWalletName(wallets, name, excludeWalletId) {
119
+ const normalized = canonicalName(name);
120
+ const conflictingWallet = wallets.find((wallet) => canonicalName(wallet.name) === normalized && wallet.id !== excludeWalletId);
121
+ if (conflictingWallet != null) {
122
+ throw new ConflictError(`A wallet group named "${name}" already exists.`);
123
+ }
124
+ }
125
+ function findSecretRecord(state, keyId) {
126
+ const secret = state.secrets.keys.find((entry) => entry.keyId === keyId);
127
+ if (secret == null) {
128
+ throw new NotFoundError(`No secret material was found for key "${keyId}".`);
129
+ }
130
+ return secret;
131
+ }
132
+ function resolveEncryptionPassword(options, requirement = 'optional') {
133
+ const password = options.encryptionPassword;
134
+ if (password == null) {
135
+ if (requirement === 'required') {
136
+ throw new EncryptionRequiredError('An encryption password is required to persist wallet secrets.');
137
+ }
138
+ return undefined;
139
+ }
140
+ if (password.trim().length === 0) {
141
+ throw new ValidationError('Encryption password cannot be empty.');
142
+ }
143
+ return password;
144
+ }
145
+ function requireEncryptionPassword(options) {
146
+ const password = resolveEncryptionPassword(options, 'required');
147
+ if (password == null) {
148
+ throw new EncryptionRequiredError('An encryption password is required to persist wallet secrets.');
149
+ }
150
+ return password;
151
+ }
152
+ function encryptedStatus() {
153
+ return {
154
+ enabled: true,
155
+ algorithm: ENCRYPTION_ALGORITHM,
156
+ kdf: ENCRYPTION_KDF
157
+ };
158
+ }
159
+ async function resolveMnemonicFromSecret(secret, encryptionPassword) {
160
+ if (!encryptionPassword) {
161
+ throw new EncryptionRequiredError('This wallet key is encrypted. Supply its encryption password to decrypt or derive addresses.');
162
+ }
163
+ return decryptMnemonic(secret.envelope, encryptionPassword);
164
+ }
165
+ function assertSupportedWordCount(value) {
166
+ const wordCount = value ?? 12;
167
+ if (!SUPPORTED_MNEMONIC_WORD_COUNTS.includes(wordCount)) {
168
+ throw new ValidationError('Mnemonic word count must be 12 or 24.');
169
+ }
170
+ return wordCount;
171
+ }
172
+ async function buildSecretRecord(keyId, mnemonic, encryptionPassword) {
173
+ return encryptSecretRecord(keyId, mnemonic, encryptionPassword);
174
+ }
175
+ async function createStoredWalletAddress(walletId, chain, network, index, mnemonic, label) {
176
+ const derived = await deriveAddress(mnemonic, index, { chain, network });
177
+ const timestamp = nowIso();
178
+ return {
179
+ id: randomUUID(),
180
+ walletId,
181
+ chain: derived.chain,
182
+ network: derived.network,
183
+ address: derived.address,
184
+ derivationPath: derived.derivationPath,
185
+ index: derived.index,
186
+ label,
187
+ createdAt: timestamp,
188
+ updatedAt: timestamp
189
+ };
190
+ }
191
+ async function assertKeyMatchesMnemonic(state, key, mnemonic, encryptionPassword) {
192
+ const secret = findSecretRecord(state, key.id);
193
+ const storedMnemonic = await resolveMnemonicFromSecret(secret, encryptionPassword);
194
+ if (storedMnemonic !== mnemonic) {
195
+ throw new ConflictError('The provided mnemonic does not match the existing local key material.');
196
+ }
197
+ }
198
+ export class WalletManager {
199
+ store;
200
+ constructor(options = {}) {
201
+ this.store = options.store ?? new FileSystemWalletStore(options.storageDir);
202
+ }
203
+ async createWalletGroup(options) {
204
+ const groupName = normalizeGroupName(options.name);
205
+ const chain = assertSupportedChain(options.chain);
206
+ const network = assertSupportedNetwork(options.network);
207
+ const accountLabel = normalizeLabel(options.accountLabel);
208
+ const wordCount = assertSupportedWordCount(options.words);
209
+ const encryptionPassword = requireEncryptionPassword(options);
210
+ return this.store.mutate(async (state) => {
211
+ assertUniqueWalletName(state.metadata.wallets, groupName);
212
+ let mnemonic = generateRandomMnemonic(wordCount);
213
+ let fingerprint = fingerprintMnemonic(mnemonic);
214
+ while (state.metadata.keys.some((key) => key.fingerprint === fingerprint)) {
215
+ mnemonic = generateRandomMnemonic(wordCount);
216
+ fingerprint = fingerprintMnemonic(mnemonic);
217
+ }
218
+ const timestamp = nowIso();
219
+ const keyId = randomUUID();
220
+ const walletId = randomUUID();
221
+ const key = {
222
+ id: keyId,
223
+ fingerprint,
224
+ encryption: encryptedStatus(),
225
+ createdAt: timestamp,
226
+ updatedAt: timestamp
227
+ };
228
+ const wallet = {
229
+ id: walletId,
230
+ keyId,
231
+ name: groupName,
232
+ chain,
233
+ network,
234
+ nextAccountIndex: 1,
235
+ createdAt: timestamp,
236
+ updatedAt: timestamp
237
+ };
238
+ const firstAddress = await createStoredWalletAddress(walletId, chain, network, 0, mnemonic, accountLabel);
239
+ state.metadata.keys.push(key);
240
+ state.metadata.wallets.push(wallet);
241
+ state.metadata.addresses.push(firstAddress);
242
+ state.secrets.keys.push(await buildSecretRecord(keyId, mnemonic, encryptionPassword));
243
+ return {
244
+ result: {
245
+ group: toWalletGroup(state, wallet),
246
+ firstAccount: toDerivedAccount(firstAddress),
247
+ mnemonic
248
+ },
249
+ state
250
+ };
251
+ });
252
+ }
253
+ async importWalletGroup(options) {
254
+ const groupName = normalizeGroupName(options.name);
255
+ const chain = assertSupportedChain(options.chain);
256
+ const network = assertSupportedNetwork(options.network);
257
+ const accountLabel = normalizeLabel(options.accountLabel);
258
+ const mnemonic = assertValidMnemonic(options.mnemonic);
259
+ const fingerprint = fingerprintMnemonic(mnemonic);
260
+ const encryptionPassword = requireEncryptionPassword(options);
261
+ return this.store.mutate(async (state) => {
262
+ const existingKey = findKeyByFingerprint(state.metadata.keys, fingerprint);
263
+ if (existingKey != null) {
264
+ await assertKeyMatchesMnemonic(state, existingKey, mnemonic, encryptionPassword);
265
+ const existingWallet = findWalletByKeyAndChain(state.metadata.wallets, existingKey.id, chain, network);
266
+ if (existingWallet != null) {
267
+ const nextAddress = await createStoredWalletAddress(existingWallet.id, existingWallet.chain, existingWallet.network, existingWallet.nextAccountIndex, mnemonic, accountLabel);
268
+ existingWallet.nextAccountIndex += 1;
269
+ existingWallet.updatedAt = nowIso();
270
+ state.metadata.addresses.push(nextAddress);
271
+ return {
272
+ result: {
273
+ group: toWalletGroup(state, existingWallet),
274
+ account: toDerivedAccount(nextAddress),
275
+ reusedExistingGroup: true
276
+ },
277
+ state
278
+ };
279
+ }
280
+ assertUniqueWalletName(state.metadata.wallets, groupName);
281
+ const timestamp = nowIso();
282
+ const wallet = {
283
+ id: randomUUID(),
284
+ keyId: existingKey.id,
285
+ name: groupName,
286
+ chain,
287
+ network,
288
+ nextAccountIndex: 1,
289
+ createdAt: timestamp,
290
+ updatedAt: timestamp
291
+ };
292
+ const firstAddress = await createStoredWalletAddress(wallet.id, chain, network, 0, mnemonic, accountLabel);
293
+ state.metadata.wallets.push(wallet);
294
+ state.metadata.addresses.push(firstAddress);
295
+ return {
296
+ result: {
297
+ group: toWalletGroup(state, wallet),
298
+ account: toDerivedAccount(firstAddress),
299
+ reusedExistingGroup: false
300
+ },
301
+ state
302
+ };
303
+ }
304
+ assertUniqueWalletName(state.metadata.wallets, groupName);
305
+ const timestamp = nowIso();
306
+ const keyId = randomUUID();
307
+ const walletId = randomUUID();
308
+ const key = {
309
+ id: keyId,
310
+ fingerprint,
311
+ encryption: encryptedStatus(),
312
+ createdAt: timestamp,
313
+ updatedAt: timestamp
314
+ };
315
+ const wallet = {
316
+ id: walletId,
317
+ keyId,
318
+ name: groupName,
319
+ chain,
320
+ network,
321
+ nextAccountIndex: 1,
322
+ createdAt: timestamp,
323
+ updatedAt: timestamp
324
+ };
325
+ const firstAddress = await createStoredWalletAddress(walletId, chain, network, 0, mnemonic, accountLabel);
326
+ state.metadata.keys.push(key);
327
+ state.metadata.wallets.push(wallet);
328
+ state.metadata.addresses.push(firstAddress);
329
+ state.secrets.keys.push(await buildSecretRecord(keyId, mnemonic, encryptionPassword));
330
+ return {
331
+ result: {
332
+ group: toWalletGroup(state, wallet),
333
+ account: toDerivedAccount(firstAddress),
334
+ reusedExistingGroup: false
335
+ },
336
+ state
337
+ };
338
+ });
339
+ }
340
+ async deriveAddress(options) {
341
+ const label = normalizeLabel(options.label);
342
+ const encryptionPassword = resolveEncryptionPassword(options);
343
+ return this.store.mutate(async (state) => {
344
+ const wallet = findWalletByIdOrName(state.metadata.wallets, options.group);
345
+ if (wallet == null) {
346
+ throw new NotFoundError(`Wallet group "${options.group}" was not found.`);
347
+ }
348
+ const secret = findSecretRecord(state, wallet.keyId);
349
+ const mnemonic = await resolveMnemonicFromSecret(secret, encryptionPassword);
350
+ const nextAddress = await createStoredWalletAddress(wallet.id, wallet.chain, wallet.network, wallet.nextAccountIndex, mnemonic, label);
351
+ wallet.nextAccountIndex += 1;
352
+ wallet.updatedAt = nowIso();
353
+ state.metadata.addresses.push(nextAddress);
354
+ return {
355
+ result: toDerivedAccount(nextAddress),
356
+ state
357
+ };
358
+ });
359
+ }
360
+ async listWalletGroups() {
361
+ const state = await this.store.read();
362
+ return state.metadata.wallets
363
+ .slice()
364
+ .sort((left, right) => left.createdAt.localeCompare(right.createdAt))
365
+ .map((wallet) => toWalletGroupSummary(state, wallet));
366
+ }
367
+ async getWalletGroup(groupIdentifier) {
368
+ const state = await this.store.read();
369
+ const wallet = findWalletByIdOrName(state.metadata.wallets, groupIdentifier);
370
+ if (wallet == null) {
371
+ throw new NotFoundError(`Wallet group "${groupIdentifier}" was not found.`);
372
+ }
373
+ return toWalletGroup(state, wallet);
374
+ }
375
+ async getFirstAddress(groupIdentifier) {
376
+ const group = await this.getWalletGroup(groupIdentifier);
377
+ const [firstAccount] = group.accounts;
378
+ if (firstAccount == null) {
379
+ throw new NotFoundError(`Wallet group "${groupIdentifier}" does not have any derived accounts.`);
380
+ }
381
+ return firstAccount;
382
+ }
383
+ async listDerivedAccounts(groupIdentifier) {
384
+ const group = await this.getWalletGroup(groupIdentifier);
385
+ return group.accounts;
386
+ }
387
+ async renameWalletGroup(groupIdentifier, newName) {
388
+ const normalizedName = normalizeGroupName(newName);
389
+ return this.store.mutate(async (state) => {
390
+ const wallet = findWalletByIdOrName(state.metadata.wallets, groupIdentifier);
391
+ if (wallet == null) {
392
+ throw new NotFoundError(`Wallet group "${groupIdentifier}" was not found.`);
393
+ }
394
+ assertUniqueWalletName(state.metadata.wallets, normalizedName, wallet.id);
395
+ wallet.name = normalizedName;
396
+ wallet.updatedAt = nowIso();
397
+ return {
398
+ result: toWalletGroup(state, wallet),
399
+ state
400
+ };
401
+ });
402
+ }
403
+ async labelAccount(options) {
404
+ const label = normalizeLabel(options.label);
405
+ return this.store.mutate(async (state) => {
406
+ const wallet = findWalletByIdOrName(state.metadata.wallets, options.group);
407
+ if (wallet == null) {
408
+ throw new NotFoundError(`Wallet group "${options.group}" was not found.`);
409
+ }
410
+ const address = state.metadata.addresses.find((candidate) => candidate.walletId === wallet.id && candidate.index === options.index);
411
+ if (address == null) {
412
+ throw new NotFoundError(`Wallet group "${wallet.name}" does not have an account at index ${options.index}.`);
413
+ }
414
+ address.label = label;
415
+ address.updatedAt = nowIso();
416
+ wallet.updatedAt = address.updatedAt;
417
+ return {
418
+ result: toDerivedAccount(address),
419
+ state
420
+ };
421
+ });
422
+ }
423
+ async exportWalletGroupMetadata(groupIdentifier) {
424
+ const state = await this.store.read();
425
+ const wallet = findWalletByIdOrName(state.metadata.wallets, groupIdentifier);
426
+ if (wallet == null) {
427
+ throw new NotFoundError(`Wallet group "${groupIdentifier}" was not found.`);
428
+ }
429
+ const key = findKeyById(state.metadata.keys, wallet.keyId);
430
+ if (key == null) {
431
+ throw new NotFoundError(`No key material was found for wallet "${wallet.id}".`);
432
+ }
433
+ return {
434
+ version: STORAGE_SCHEMA_VERSION,
435
+ exportedAt: nowIso(),
436
+ key: toWalletKeySummary(state, key),
437
+ wallet: toWalletGroupSummary(state, wallet),
438
+ addresses: listWalletAddresses(state, wallet.id).map(toDerivedAccount)
439
+ };
440
+ }
441
+ async exportWalletGroupRecord(groupIdentifier, options = {}) {
442
+ const state = await this.store.read();
443
+ const wallet = findWalletByIdOrName(state.metadata.wallets, groupIdentifier);
444
+ if (wallet == null) {
445
+ throw new NotFoundError(`Wallet group "${groupIdentifier}" was not found.`);
446
+ }
447
+ const key = findKeyById(state.metadata.keys, wallet.keyId);
448
+ if (key == null) {
449
+ throw new NotFoundError(`No key material was found for wallet "${wallet.id}".`);
450
+ }
451
+ const walletAddresses = listWalletAddresses(state, wallet.id);
452
+ const encryptedSecret = findSecretRecord(state, key.id);
453
+ return {
454
+ groupName: wallet.name,
455
+ chain: wallet.chain,
456
+ keyFingerprint: key.fingerprint,
457
+ metadataJson: {
458
+ version: STORAGE_SCHEMA_VERSION,
459
+ key: JSON.parse(JSON.stringify(key)),
460
+ wallet: JSON.parse(JSON.stringify(wallet)),
461
+ addresses: JSON.parse(JSON.stringify(walletAddresses))
462
+ },
463
+ secretsJson: {
464
+ version: STORAGE_SCHEMA_VERSION,
465
+ secret: JSON.parse(JSON.stringify(encryptedSecret))
466
+ },
467
+ addresses: walletAddresses.map((address) => ({
468
+ address: address.address,
469
+ derivationPath: address.derivationPath,
470
+ accountIndex: address.index,
471
+ label: address.label
472
+ }))
473
+ };
474
+ }
475
+ async exportWalletForApi(groupIdentifier, options) {
476
+ const record = await this.exportWalletGroupRecord(groupIdentifier);
477
+ const mnemonic = await this.revealMnemonic(groupIdentifier, options.encryptionPassword);
478
+ return {
479
+ name: record.groupName,
480
+ chain: record.chain,
481
+ network: record.metadataJson.wallet.network,
482
+ keyFingerprint: record.keyFingerprint,
483
+ encryptedSecretJson: sealSecret(mnemonic, options.recipientPublicKey),
484
+ addresses: record.addresses
485
+ };
486
+ }
487
+ async revealMnemonic(groupIdentifier, encryptionPassword) {
488
+ const state = await this.store.read();
489
+ const wallet = findWalletByIdOrName(state.metadata.wallets, groupIdentifier);
490
+ if (wallet == null) {
491
+ throw new NotFoundError(`Wallet group "${groupIdentifier}" was not found.`);
492
+ }
493
+ const secret = findSecretRecord(state, wallet.keyId);
494
+ return resolveMnemonicFromSecret(secret, encryptionPassword);
495
+ }
496
+ }
497
+ export class EthereumWalletManager extends WalletManager {
498
+ }
499
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { MnemonicWordCount } from './types.js';
2
+ export declare function normalizeMnemonic(mnemonic: string): string;
3
+ export declare function getMnemonicWordCount(mnemonic: string): number;
4
+ export declare function isSupportedMnemonicWordCount(count: number): count is MnemonicWordCount;
5
+ export declare function assertValidMnemonic(mnemonic: string): string;
6
+ export declare function generateRandomMnemonic(wordCount?: MnemonicWordCount): string;
7
+ /**
8
+ * SHA-256 of the trimmed mnemonic, hex-encoded — the `keyFingerprint` a wallet is
9
+ * registered under. Used to confirm a key provider returned the mnemonic that
10
+ * actually belongs to a given wallet before signing.
11
+ */
12
+ export declare function fingerprintMnemonic(mnemonic: string): string;
13
+ //# sourceMappingURL=mnemonic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mnemonic.d.ts","sourceRoot":"","sources":["../src/mnemonic.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAO1D;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG7D;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,iBAAiB,CAEtF;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAa5D;AAED,wBAAgB,sBAAsB,CAAC,SAAS,GAAE,iBAAsB,GAAG,MAAM,CAGhF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE5D"}