@guveno/wallet-sdk 1.0.0 → 1.0.2
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 +2 -9
- 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/storage/crypto.js
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { createCipheriv, createDecipheriv, randomBytes, scryptSync } from 'node:crypto';
|
|
2
|
-
import { ENCRYPTION_ALGORITHM, ENCRYPTION_KDF, SCRYPT_PARAMS } from '../constants.js';
|
|
3
|
-
import { EncryptionRequiredError, ValidationError, WrongPassphraseError } from '../errors.js';
|
|
4
|
-
export function assertEncryptionPassword(password) {
|
|
5
|
-
if (password == null || password.trim().length === 0) {
|
|
6
|
-
throw new EncryptionRequiredError('An encryption password is required for encrypted wallet groups.');
|
|
7
|
-
}
|
|
8
|
-
return password;
|
|
9
|
-
}
|
|
10
|
-
function deriveKey(password, salt) {
|
|
11
|
-
return scryptSync(password, salt, SCRYPT_PARAMS.keyLength, {
|
|
12
|
-
N: SCRYPT_PARAMS.cost,
|
|
13
|
-
r: SCRYPT_PARAMS.blockSize,
|
|
14
|
-
p: SCRYPT_PARAMS.parallelization
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
export async function encryptMnemonic(mnemonic, password) {
|
|
18
|
-
const encryptionPassword = assertEncryptionPassword(password);
|
|
19
|
-
const salt = randomBytes(16);
|
|
20
|
-
const iv = randomBytes(12);
|
|
21
|
-
const key = deriveKey(encryptionPassword, salt);
|
|
22
|
-
try {
|
|
23
|
-
const cipher = createCipheriv(ENCRYPTION_ALGORITHM, key, iv);
|
|
24
|
-
const ciphertext = Buffer.concat([cipher.update(mnemonic, 'utf8'), cipher.final()]);
|
|
25
|
-
const tag = cipher.getAuthTag();
|
|
26
|
-
return {
|
|
27
|
-
algorithm: ENCRYPTION_ALGORITHM,
|
|
28
|
-
kdf: ENCRYPTION_KDF,
|
|
29
|
-
salt: salt.toString('base64'),
|
|
30
|
-
iv: iv.toString('base64'),
|
|
31
|
-
tag: tag.toString('base64'),
|
|
32
|
-
ciphertext: ciphertext.toString('base64'),
|
|
33
|
-
kdfParams: {
|
|
34
|
-
cost: SCRYPT_PARAMS.cost,
|
|
35
|
-
blockSize: SCRYPT_PARAMS.blockSize,
|
|
36
|
-
parallelization: SCRYPT_PARAMS.parallelization,
|
|
37
|
-
keyLength: SCRYPT_PARAMS.keyLength
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
finally {
|
|
42
|
-
key.fill(0);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
export async function decryptMnemonic(envelope, password) {
|
|
46
|
-
const encryptionPassword = assertEncryptionPassword(password);
|
|
47
|
-
const salt = Buffer.from(envelope.salt, 'base64');
|
|
48
|
-
const iv = Buffer.from(envelope.iv, 'base64');
|
|
49
|
-
const tag = Buffer.from(envelope.tag, 'base64');
|
|
50
|
-
const ciphertext = Buffer.from(envelope.ciphertext, 'base64');
|
|
51
|
-
const key = deriveKey(encryptionPassword, salt);
|
|
52
|
-
try {
|
|
53
|
-
const decipher = createDecipheriv(ENCRYPTION_ALGORITHM, key, iv);
|
|
54
|
-
decipher.setAuthTag(tag);
|
|
55
|
-
const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
|
|
56
|
-
return plaintext.toString('utf8');
|
|
57
|
-
}
|
|
58
|
-
catch (error) {
|
|
59
|
-
throw new WrongPassphraseError('Unable to decrypt the mnemonic. The encryption password may be incorrect.', {
|
|
60
|
-
cause: error
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
finally {
|
|
64
|
-
key.fill(0);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
export async function encryptSecretRecord(keyId, mnemonic, password) {
|
|
68
|
-
return {
|
|
69
|
-
keyId,
|
|
70
|
-
type: 'encrypted',
|
|
71
|
-
envelope: await encryptMnemonic(mnemonic, password)
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
export async function decryptSecretsJson(secretsJson, password) {
|
|
75
|
-
if (secretsJson.secret.type !== 'encrypted') {
|
|
76
|
-
throw new ValidationError('Wallet secrets must be encrypted before they can be decrypted.');
|
|
77
|
-
}
|
|
78
|
-
return decryptMnemonic(secretsJson.secret.envelope, password);
|
|
79
|
-
}
|
|
80
|
-
//# sourceMappingURL=crypto.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/storage/crypto.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { StorageState, WalletStore } from '../types.js';
|
|
2
|
-
export declare function resolveStorageDir(storageDir?: string): string;
|
|
3
|
-
export declare class FileSystemWalletStore implements WalletStore {
|
|
4
|
-
readonly rootDir: string;
|
|
5
|
-
private readonly metadataPath;
|
|
6
|
-
private readonly secretsPath;
|
|
7
|
-
private readonly lockPath;
|
|
8
|
-
constructor(storageDir?: string);
|
|
9
|
-
read(): Promise<StorageState>;
|
|
10
|
-
mutate<T>(mutator: (state: StorageState) => Promise<{
|
|
11
|
-
result: T;
|
|
12
|
-
state: StorageState;
|
|
13
|
-
}> | {
|
|
14
|
-
result: T;
|
|
15
|
-
state: StorageState;
|
|
16
|
-
}): Promise<T>;
|
|
17
|
-
private ensureLayout;
|
|
18
|
-
private writeState;
|
|
19
|
-
private withLock;
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=file-store.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file-store.d.ts","sourceRoot":"","sources":["../../src/storage/file-store.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,YAAY,EAGZ,WAAW,EACZ,MAAM,aAAa,CAAC;AA0JrB,wBAAgB,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAM7D;AAED,qBAAa,qBAAsB,YAAW,WAAW;IACvD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,UAAU,CAAC,EAAE,MAAM;IAOzB,IAAI,IAAI,OAAO,CAAC,YAAY,CAAC;IAmB7B,MAAM,CAAC,CAAC,EACZ,OAAO,EAAE,CACP,KAAK,EAAE,YAAY,KAChB,OAAO,CAAC;QAAE,MAAM,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,YAAY,CAAA;KAAE,CAAC,GAAG;QAAE,MAAM,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,YAAY,CAAA;KAAE,GACpF,OAAO,CAAC,CAAC,CAAC;YASC,YAAY;YAIZ,UAAU;YAWV,QAAQ;CAgCvB"}
|
|
@@ -1,219 +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 { SUPPORTED_CHAINS, SUPPORTED_NETWORKS } from '../chains.js';
|
|
6
|
-
import { DEFAULT_STORAGE_DIR, DEFAULT_STORAGE_ENV_VAR, ENCRYPTION_ALGORITHM, ENCRYPTION_KDF, STORAGE_LOCK_RETRY_MS, STORAGE_LOCK_TIMEOUT_MS, STORAGE_SCHEMA_VERSION } from '../constants.js';
|
|
7
|
-
import { StorageError } from '../errors.js';
|
|
8
|
-
const chainSchema = z.enum(SUPPORTED_CHAINS);
|
|
9
|
-
const networkSchema = z.enum(SUPPORTED_NETWORKS);
|
|
10
|
-
const encryptionStatusSchema = z.object({
|
|
11
|
-
enabled: z.boolean(),
|
|
12
|
-
algorithm: z.literal(ENCRYPTION_ALGORITHM).nullable(),
|
|
13
|
-
kdf: z.literal(ENCRYPTION_KDF).nullable()
|
|
14
|
-
});
|
|
15
|
-
const storedWalletKeySchema = z.object({
|
|
16
|
-
id: z.uuid(),
|
|
17
|
-
fingerprint: z.string(),
|
|
18
|
-
encryption: encryptionStatusSchema,
|
|
19
|
-
createdAt: z.string(),
|
|
20
|
-
updatedAt: z.string()
|
|
21
|
-
});
|
|
22
|
-
const storedWalletSchema = z.object({
|
|
23
|
-
id: z.uuid(),
|
|
24
|
-
keyId: z.uuid(),
|
|
25
|
-
name: z.string(),
|
|
26
|
-
chain: chainSchema,
|
|
27
|
-
network: networkSchema,
|
|
28
|
-
nextAccountIndex: z.number().int().nonnegative(),
|
|
29
|
-
createdAt: z.string(),
|
|
30
|
-
updatedAt: z.string()
|
|
31
|
-
});
|
|
32
|
-
const storedWalletAddressSchema = z.object({
|
|
33
|
-
id: z.uuid(),
|
|
34
|
-
walletId: z.uuid(),
|
|
35
|
-
chain: chainSchema,
|
|
36
|
-
network: networkSchema,
|
|
37
|
-
address: z.string(),
|
|
38
|
-
derivationPath: z.string(),
|
|
39
|
-
index: z.number().int().nonnegative(),
|
|
40
|
-
label: z.string().nullable(),
|
|
41
|
-
createdAt: z.string(),
|
|
42
|
-
updatedAt: z.string()
|
|
43
|
-
});
|
|
44
|
-
const storedMetadataFileSchema = z.object({
|
|
45
|
-
version: z.literal(STORAGE_SCHEMA_VERSION),
|
|
46
|
-
keys: z.array(storedWalletKeySchema),
|
|
47
|
-
wallets: z.array(storedWalletSchema),
|
|
48
|
-
addresses: z.array(storedWalletAddressSchema)
|
|
49
|
-
});
|
|
50
|
-
const encryptedEnvelopeSchema = z.object({
|
|
51
|
-
algorithm: z.literal(ENCRYPTION_ALGORITHM),
|
|
52
|
-
kdf: z.literal(ENCRYPTION_KDF),
|
|
53
|
-
salt: z.string(),
|
|
54
|
-
iv: z.string(),
|
|
55
|
-
tag: z.string(),
|
|
56
|
-
ciphertext: z.string(),
|
|
57
|
-
kdfParams: z.object({
|
|
58
|
-
cost: z.number().int().positive(),
|
|
59
|
-
blockSize: z.number().int().positive(),
|
|
60
|
-
parallelization: z.number().int().positive(),
|
|
61
|
-
keyLength: z.number().int().positive()
|
|
62
|
-
})
|
|
63
|
-
});
|
|
64
|
-
const storedSecretRecordSchema = z.object({
|
|
65
|
-
keyId: z.uuid(),
|
|
66
|
-
type: z.literal('encrypted'),
|
|
67
|
-
envelope: encryptedEnvelopeSchema
|
|
68
|
-
});
|
|
69
|
-
const storedSecretsFileSchema = z.object({
|
|
70
|
-
version: z.literal(STORAGE_SCHEMA_VERSION),
|
|
71
|
-
keys: z.array(storedSecretRecordSchema)
|
|
72
|
-
});
|
|
73
|
-
function emptyMetadata() {
|
|
74
|
-
return {
|
|
75
|
-
version: STORAGE_SCHEMA_VERSION,
|
|
76
|
-
keys: [],
|
|
77
|
-
wallets: [],
|
|
78
|
-
addresses: []
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
function emptySecrets() {
|
|
82
|
-
return {
|
|
83
|
-
version: STORAGE_SCHEMA_VERSION,
|
|
84
|
-
keys: []
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
function delay(ms) {
|
|
88
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
89
|
-
}
|
|
90
|
-
async function readRawJsonFile(filePath) {
|
|
91
|
-
try {
|
|
92
|
-
const raw = await fs.readFile(filePath, 'utf8');
|
|
93
|
-
return JSON.parse(raw);
|
|
94
|
-
}
|
|
95
|
-
catch (error) {
|
|
96
|
-
if (error.code === 'ENOENT') {
|
|
97
|
-
return undefined;
|
|
98
|
-
}
|
|
99
|
-
throw error;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
async function readMetadataFile(filePath) {
|
|
103
|
-
const raw = await readRawJsonFile(filePath);
|
|
104
|
-
if (raw === undefined) {
|
|
105
|
-
return emptyMetadata();
|
|
106
|
-
}
|
|
107
|
-
const parsed = storedMetadataFileSchema.safeParse(raw);
|
|
108
|
-
if (parsed.success) {
|
|
109
|
-
return parsed.data;
|
|
110
|
-
}
|
|
111
|
-
throw new StorageError(`Storage file ${filePath} is malformed.`, {
|
|
112
|
-
cause: parsed.error
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
async function readSecretsFile(filePath) {
|
|
116
|
-
const raw = await readRawJsonFile(filePath);
|
|
117
|
-
if (raw === undefined) {
|
|
118
|
-
return emptySecrets();
|
|
119
|
-
}
|
|
120
|
-
const parsed = storedSecretsFileSchema.safeParse(raw);
|
|
121
|
-
if (parsed.success) {
|
|
122
|
-
return parsed.data;
|
|
123
|
-
}
|
|
124
|
-
throw new StorageError(`Storage file ${filePath} is malformed.`, {
|
|
125
|
-
cause: parsed.error
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
async function writeJsonAtomic(filePath, value) {
|
|
129
|
-
const dir = path.dirname(filePath);
|
|
130
|
-
const tempPath = path.join(dir, `${path.basename(filePath)}.${randomUUID()}.tmp`);
|
|
131
|
-
const payload = `${JSON.stringify(value, null, 2)}\n`;
|
|
132
|
-
await fs.writeFile(tempPath, payload, { encoding: 'utf8', mode: 0o600 });
|
|
133
|
-
await fs.rename(tempPath, filePath);
|
|
134
|
-
}
|
|
135
|
-
export function resolveStorageDir(storageDir) {
|
|
136
|
-
if (storageDir != null) {
|
|
137
|
-
return storageDir;
|
|
138
|
-
}
|
|
139
|
-
return process.env[DEFAULT_STORAGE_ENV_VAR] ?? DEFAULT_STORAGE_DIR;
|
|
140
|
-
}
|
|
141
|
-
export class FileSystemWalletStore {
|
|
142
|
-
rootDir;
|
|
143
|
-
metadataPath;
|
|
144
|
-
secretsPath;
|
|
145
|
-
lockPath;
|
|
146
|
-
constructor(storageDir) {
|
|
147
|
-
this.rootDir = resolveStorageDir(storageDir);
|
|
148
|
-
this.metadataPath = path.join(this.rootDir, 'metadata.json');
|
|
149
|
-
this.secretsPath = path.join(this.rootDir, 'secrets.json');
|
|
150
|
-
this.lockPath = path.join(this.rootDir, '.storage.lock');
|
|
151
|
-
}
|
|
152
|
-
async read() {
|
|
153
|
-
await this.ensureLayout();
|
|
154
|
-
try {
|
|
155
|
-
const [metadata, secrets] = await Promise.all([
|
|
156
|
-
readMetadataFile(this.metadataPath),
|
|
157
|
-
readSecretsFile(this.secretsPath)
|
|
158
|
-
]);
|
|
159
|
-
return { metadata, secrets };
|
|
160
|
-
}
|
|
161
|
-
catch (error) {
|
|
162
|
-
if (error instanceof StorageError) {
|
|
163
|
-
throw error;
|
|
164
|
-
}
|
|
165
|
-
throw new StorageError('Failed to read wallet storage.', { cause: error });
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
async mutate(mutator) {
|
|
169
|
-
return this.withLock(async () => {
|
|
170
|
-
const state = await this.read();
|
|
171
|
-
const outcome = await mutator(state);
|
|
172
|
-
await this.writeState(outcome.state);
|
|
173
|
-
return outcome.result;
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
async ensureLayout() {
|
|
177
|
-
await fs.mkdir(this.rootDir, { recursive: true, mode: 0o700 });
|
|
178
|
-
}
|
|
179
|
-
async writeState(state) {
|
|
180
|
-
try {
|
|
181
|
-
await Promise.all([
|
|
182
|
-
writeJsonAtomic(this.metadataPath, state.metadata),
|
|
183
|
-
writeJsonAtomic(this.secretsPath, state.secrets)
|
|
184
|
-
]);
|
|
185
|
-
}
|
|
186
|
-
catch (error) {
|
|
187
|
-
throw new StorageError('Failed to persist wallet storage.', { cause: error });
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
async withLock(operation) {
|
|
191
|
-
await this.ensureLayout();
|
|
192
|
-
const deadline = Date.now() + STORAGE_LOCK_TIMEOUT_MS;
|
|
193
|
-
while (true) {
|
|
194
|
-
let handle;
|
|
195
|
-
try {
|
|
196
|
-
handle = await fs.open(this.lockPath, 'wx', 0o600);
|
|
197
|
-
}
|
|
198
|
-
catch (error) {
|
|
199
|
-
const code = error.code;
|
|
200
|
-
if (code !== 'EEXIST') {
|
|
201
|
-
throw new StorageError('Failed to acquire the wallet storage lock.', { cause: error });
|
|
202
|
-
}
|
|
203
|
-
if (Date.now() >= deadline) {
|
|
204
|
-
throw new StorageError('Timed out waiting for the wallet storage lock.');
|
|
205
|
-
}
|
|
206
|
-
await delay(STORAGE_LOCK_RETRY_MS);
|
|
207
|
-
continue;
|
|
208
|
-
}
|
|
209
|
-
try {
|
|
210
|
-
return await operation();
|
|
211
|
-
}
|
|
212
|
-
finally {
|
|
213
|
-
await handle.close();
|
|
214
|
-
await fs.unlink(this.lockPath).catch(() => undefined);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
//# sourceMappingURL=file-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file-store.js","sourceRoot":"","sources":["../../src/storage/file-store.ts"],"names":[],"mappings":"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"}
|