@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.
- package/LICENSE +21 -0
- package/README.md +211 -0
- package/dist/api/client.d.ts +48 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +563 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/types.d.ts +237 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +9 -0
- package/dist/api/types.js.map +1 -0
- package/dist/chains.d.ts +25 -0
- package/dist/chains.d.ts.map +1 -0
- package/dist/chains.js +67 -0
- package/dist/chains.js.map +1 -0
- package/dist/constants.d.ts +17 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +19 -0
- package/dist/constants.js.map +1 -0
- package/dist/crypto/sealed-box.d.ts +8 -0
- package/dist/crypto/sealed-box.d.ts.map +1 -0
- package/dist/crypto/sealed-box.js +66 -0
- package/dist/crypto/sealed-box.js.map +1 -0
- package/dist/derivation.d.ts +26 -0
- package/dist/derivation.d.ts.map +1 -0
- package/dist/derivation.js +121 -0
- package/dist/derivation.js.map +1 -0
- package/dist/errors.d.ts +81 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +95 -0
- package/dist/errors.js.map +1 -0
- package/dist/hot-wallet.d.ts +57 -0
- package/dist/hot-wallet.d.ts.map +1 -0
- package/dist/hot-wallet.js +139 -0
- package/dist/hot-wallet.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/keyprovider/file-provider.d.ts +19 -0
- package/dist/keyprovider/file-provider.d.ts.map +1 -0
- package/dist/keyprovider/file-provider.js +48 -0
- package/dist/keyprovider/file-provider.js.map +1 -0
- package/dist/keyprovider/index.d.ts +13 -0
- package/dist/keyprovider/index.d.ts.map +1 -0
- package/dist/keyprovider/index.js +3 -0
- package/dist/keyprovider/index.js.map +1 -0
- package/dist/keyprovider/kms-provider.d.ts +26 -0
- package/dist/keyprovider/kms-provider.d.ts.map +1 -0
- package/dist/keyprovider/kms-provider.js +32 -0
- package/dist/keyprovider/kms-provider.js.map +1 -0
- package/dist/manager.d.ts +28 -0
- package/dist/manager.d.ts.map +1 -0
- package/dist/manager.js +499 -0
- package/dist/manager.js.map +1 -0
- package/dist/mnemonic.d.ts +13 -0
- package/dist/mnemonic.d.ts.map +1 -0
- package/dist/mnemonic.js +44 -0
- package/dist/mnemonic.js.map +1 -0
- package/dist/session/file-store.d.ts +10 -0
- package/dist/session/file-store.d.ts.map +1 -0
- package/dist/session/file-store.js +88 -0
- package/dist/session/file-store.js.map +1 -0
- package/dist/signing/sign-bitcoin.d.ts +14 -0
- package/dist/signing/sign-bitcoin.d.ts.map +1 -0
- package/dist/signing/sign-bitcoin.js +133 -0
- package/dist/signing/sign-bitcoin.js.map +1 -0
- package/dist/signing/sign-ethereum.d.ts +13 -0
- package/dist/signing/sign-ethereum.d.ts.map +1 -0
- package/dist/signing/sign-ethereum.js +49 -0
- package/dist/signing/sign-ethereum.js.map +1 -0
- package/dist/signing/sign-polkadot.d.ts +9 -0
- package/dist/signing/sign-polkadot.d.ts.map +1 -0
- package/dist/signing/sign-polkadot.js +79 -0
- package/dist/signing/sign-polkadot.js.map +1 -0
- package/dist/signing/sign-withdrawal.d.ts +21 -0
- package/dist/signing/sign-withdrawal.d.ts.map +1 -0
- package/dist/signing/sign-withdrawal.js +35 -0
- package/dist/signing/sign-withdrawal.js.map +1 -0
- package/dist/signing/sign-xrp.d.ts +7 -0
- package/dist/signing/sign-xrp.d.ts.map +1 -0
- package/dist/signing/sign-xrp.js +27 -0
- package/dist/signing/sign-xrp.js.map +1 -0
- package/dist/signing/types.d.ts +84 -0
- package/dist/signing/types.d.ts.map +1 -0
- package/dist/signing/types.js +15 -0
- package/dist/signing/types.js.map +1 -0
- package/dist/storage/crypto.d.ts +7 -0
- package/dist/storage/crypto.d.ts.map +1 -0
- package/dist/storage/crypto.js +80 -0
- package/dist/storage/crypto.js.map +1 -0
- package/dist/storage/file-store.d.ts +21 -0
- package/dist/storage/file-store.d.ts.map +1 -0
- package/dist/storage/file-store.js +219 -0
- package/dist/storage/file-store.js.map +1 -0
- package/dist/types.d.ts +187 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/docs/security.md +119 -0
- 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"}
|
package/dist/manager.js
ADDED
|
@@ -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"}
|