@guveno/wallet-sdk 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/api/client.d.ts +3 -17
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +15 -76
- package/dist/api/client.js.map +1 -1
- package/dist/api/types.d.ts +9 -31
- package/dist/api/types.d.ts.map +1 -1
- package/dist/api/types.js.map +1 -1
- package/dist/config/file-store.d.ts +40 -0
- package/dist/config/file-store.d.ts.map +1 -0
- package/dist/config/file-store.js +118 -0
- package/dist/config/file-store.js.map +1 -0
- package/dist/constants.d.ts +8 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +17 -1
- package/dist/constants.js.map +1 -1
- package/dist/crypto/sealed-box.d.ts +7 -0
- package/dist/crypto/sealed-box.d.ts.map +1 -1
- package/dist/crypto/sealed-box.js +36 -1
- package/dist/crypto/sealed-box.js.map +1 -1
- package/dist/crypto/user-keys.d.ts +31 -0
- package/dist/crypto/user-keys.d.ts.map +1 -0
- package/dist/crypto/user-keys.js +36 -0
- package/dist/crypto/user-keys.js.map +1 -0
- package/dist/encryption-session.d.ts +33 -0
- package/dist/encryption-session.d.ts.map +1 -0
- package/dist/encryption-session.js +59 -0
- package/dist/encryption-session.js.map +1 -0
- package/dist/hot-wallet.d.ts +19 -2
- package/dist/hot-wallet.d.ts.map +1 -1
- package/dist/hot-wallet.js +26 -3
- package/dist/hot-wallet.js.map +1 -1
- package/dist/index.d.ts +12 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +1 -177
- package/dist/types.d.ts.map +1 -1
- package/dist/wallet-service.d.ts +75 -0
- package/dist/wallet-service.d.ts.map +1 -0
- package/dist/wallet-service.js +113 -0
- package/dist/wallet-service.js.map +1 -0
- package/package.json +5 -4
- package/dist/manager.d.ts +0 -28
- package/dist/manager.d.ts.map +0 -1
- package/dist/manager.js +0 -499
- package/dist/manager.js.map +0 -1
- package/dist/session/file-store.d.ts +0 -10
- package/dist/session/file-store.d.ts.map +0 -1
- package/dist/session/file-store.js +0 -88
- package/dist/session/file-store.js.map +0 -1
- package/dist/storage/crypto.d.ts +0 -7
- package/dist/storage/crypto.d.ts.map +0 -1
- package/dist/storage/crypto.js +0 -80
- package/dist/storage/crypto.js.map +0 -1
- package/dist/storage/file-store.d.ts +0 -21
- package/dist/storage/file-store.d.ts.map +0 -1
- package/dist/storage/file-store.js +0 -219
- package/dist/storage/file-store.js.map +0 -1
package/dist/manager.js
DELETED
|
@@ -1,499 +0,0 @@
|
|
|
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
|
package/dist/manager.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { ApiSession, ApiSessionStore } from '../api/types.js';
|
|
2
|
-
export declare class FileSystemApiSessionStore implements ApiSessionStore {
|
|
3
|
-
readonly rootDir: string;
|
|
4
|
-
private readonly sessionPath;
|
|
5
|
-
constructor(storageDir?: string);
|
|
6
|
-
read(): Promise<ApiSession | null>;
|
|
7
|
-
write(session: ApiSession): Promise<void>;
|
|
8
|
-
clear(): Promise<void>;
|
|
9
|
-
}
|
|
10
|
-
//# sourceMappingURL=file-store.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file-store.d.ts","sourceRoot":"","sources":["../../src/session/file-store.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AA6CnE,qBAAa,yBAA0B,YAAW,eAAe;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,UAAU,CAAC,EAAE,MAAM;IAKzB,IAAI,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAmBlC,KAAK,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAa7B"}
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { promises as fs } from 'node:fs';
|
|
2
|
-
import { randomUUID } from 'node:crypto';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { z } from 'zod';
|
|
5
|
-
import { StorageError } from '../errors.js';
|
|
6
|
-
import { resolveStorageDir } from '../storage/file-store.js';
|
|
7
|
-
const jsonObjectSchema = z.record(z.string(), z.unknown());
|
|
8
|
-
const companyMembershipSchema = z.object({
|
|
9
|
-
id: z.number().int().positive(),
|
|
10
|
-
name: z.string(),
|
|
11
|
-
role: z.enum(['owner', 'admin', 'manager', 'signer', 'viewer'])
|
|
12
|
-
});
|
|
13
|
-
const userEncryptionKeySchema = z.object({
|
|
14
|
-
id: z.uuid(),
|
|
15
|
-
publicKey: z.string(),
|
|
16
|
-
encryptedPrivateKeyJson: jsonObjectSchema,
|
|
17
|
-
createdAt: z.iso.datetime(),
|
|
18
|
-
updatedAt: z.iso.datetime()
|
|
19
|
-
});
|
|
20
|
-
const apiUserSchema = z.object({
|
|
21
|
-
id: z.number().int().positive(),
|
|
22
|
-
email: z.email(),
|
|
23
|
-
company: companyMembershipSchema.nullable(),
|
|
24
|
-
encryptionKey: userEncryptionKeySchema.nullable(),
|
|
25
|
-
createdAt: z.iso.datetime(),
|
|
26
|
-
updatedAt: z.iso.datetime()
|
|
27
|
-
});
|
|
28
|
-
const sessionSchema = z.object({
|
|
29
|
-
baseUrl: z.url(),
|
|
30
|
-
accessToken: z.string().min(1),
|
|
31
|
-
tokenType: z.literal('Bearer'),
|
|
32
|
-
expiresIn: z.string().min(1),
|
|
33
|
-
user: apiUserSchema,
|
|
34
|
-
authenticatedAt: z.iso.datetime()
|
|
35
|
-
});
|
|
36
|
-
async function writeJsonAtomic(filePath, value) {
|
|
37
|
-
const dir = path.dirname(filePath);
|
|
38
|
-
const tempPath = path.join(dir, `${path.basename(filePath)}.${randomUUID()}.tmp`);
|
|
39
|
-
const payload = `${JSON.stringify(value, null, 2)}\n`;
|
|
40
|
-
await fs.writeFile(tempPath, payload, { encoding: 'utf8', mode: 0o600 });
|
|
41
|
-
await fs.rename(tempPath, filePath);
|
|
42
|
-
}
|
|
43
|
-
export class FileSystemApiSessionStore {
|
|
44
|
-
rootDir;
|
|
45
|
-
sessionPath;
|
|
46
|
-
constructor(storageDir) {
|
|
47
|
-
this.rootDir = resolveStorageDir(storageDir);
|
|
48
|
-
this.sessionPath = path.join(this.rootDir, 'auth-session.json');
|
|
49
|
-
}
|
|
50
|
-
async read() {
|
|
51
|
-
await fs.mkdir(this.rootDir, { recursive: true, mode: 0o700 });
|
|
52
|
-
try {
|
|
53
|
-
const raw = await fs.readFile(this.sessionPath, 'utf8');
|
|
54
|
-
return sessionSchema.parse(JSON.parse(raw));
|
|
55
|
-
}
|
|
56
|
-
catch (error) {
|
|
57
|
-
if (error.code === 'ENOENT') {
|
|
58
|
-
return null;
|
|
59
|
-
}
|
|
60
|
-
if (error instanceof z.ZodError) {
|
|
61
|
-
throw new StorageError(`Session file ${this.sessionPath} is malformed.`, { cause: error });
|
|
62
|
-
}
|
|
63
|
-
throw new StorageError('Failed to read the API session store.', { cause: error });
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
async write(session) {
|
|
67
|
-
await fs.mkdir(this.rootDir, { recursive: true, mode: 0o700 });
|
|
68
|
-
try {
|
|
69
|
-
await writeJsonAtomic(this.sessionPath, session);
|
|
70
|
-
}
|
|
71
|
-
catch (error) {
|
|
72
|
-
throw new StorageError('Failed to persist the API session store.', { cause: error });
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
async clear() {
|
|
76
|
-
try {
|
|
77
|
-
await fs.unlink(this.sessionPath);
|
|
78
|
-
}
|
|
79
|
-
catch (error) {
|
|
80
|
-
const code = error.code;
|
|
81
|
-
if (code === 'ENOENT') {
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
throw new StorageError('Failed to clear the API session store.', { cause: error });
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
//# sourceMappingURL=file-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../src/session/file-store.ts"],"names":[],"mappings":"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"}
|
package/dist/storage/crypto.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { EncryptedSecretEnvelope, EncryptedStoredSecretRecord, WalletGroupSecretsJson } from '../types.js';
|
|
2
|
-
export declare function assertEncryptionPassword(password: string | undefined): string;
|
|
3
|
-
export declare function encryptMnemonic(mnemonic: string, password: string): Promise<EncryptedSecretEnvelope>;
|
|
4
|
-
export declare function decryptMnemonic(envelope: EncryptedSecretEnvelope, password: string | undefined): Promise<string>;
|
|
5
|
-
export declare function encryptSecretRecord(keyId: string, mnemonic: string, password: string): Promise<EncryptedStoredSecretRecord>;
|
|
6
|
-
export declare function decryptSecretsJson(secretsJson: WalletGroupSecretsJson, password: string | undefined): Promise<string>;
|
|
7
|
-
//# sourceMappingURL=crypto.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/storage/crypto.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,uBAAuB,EACvB,2BAA2B,EAC3B,sBAAsB,EACvB,MAAM,aAAa,CAAC;AAErB,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAM7E;AAUD,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CA4B1G;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,uBAAuB,EACjC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,OAAO,CAAC,MAAM,CAAC,CAoBjB;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,2BAA2B,CAAC,CAMtC;AAED,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,sBAAsB,EACnC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,OAAO,CAAC,MAAM,CAAC,CAMjB"}
|