@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 @@
|
|
|
1
|
+
{"version":3,"file":"derivation.js","sourceRoot":"","sources":["../src/derivation.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
export type WalletSdkErrorCode = 'VALIDATION_ERROR' | 'NOT_FOUND' | 'CONFLICT' | 'ENCRYPTION_REQUIRED' | 'WRONG_PASSWORD' | 'STORAGE_ERROR' | 'AUTHENTICATION_ERROR' | 'API_ERROR' | 'RATE_LIMIT' | 'KEY_RESOLUTION_ERROR' | 'SIGNING_ERROR';
|
|
2
|
+
export declare class WalletSdkError extends Error {
|
|
3
|
+
readonly code: WalletSdkErrorCode;
|
|
4
|
+
readonly cause?: unknown;
|
|
5
|
+
constructor(code: WalletSdkErrorCode, message: string, options?: {
|
|
6
|
+
cause?: unknown;
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
export declare class ValidationError extends WalletSdkError {
|
|
10
|
+
constructor(message: string, options?: {
|
|
11
|
+
cause?: unknown;
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export declare class NotFoundError extends WalletSdkError {
|
|
15
|
+
constructor(message: string, options?: {
|
|
16
|
+
cause?: unknown;
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export declare class ConflictError extends WalletSdkError {
|
|
20
|
+
constructor(message: string, options?: {
|
|
21
|
+
cause?: unknown;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
export declare class EncryptionRequiredError extends WalletSdkError {
|
|
25
|
+
constructor(message: string, options?: {
|
|
26
|
+
cause?: unknown;
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
export declare class WrongPasswordError extends WalletSdkError {
|
|
30
|
+
constructor(message: string, options?: {
|
|
31
|
+
cause?: unknown;
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
export declare class WrongPassphraseError extends WrongPasswordError {
|
|
35
|
+
constructor(message: string, options?: {
|
|
36
|
+
cause?: unknown;
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
export declare class StorageError extends WalletSdkError {
|
|
40
|
+
constructor(message: string, options?: {
|
|
41
|
+
cause?: unknown;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
export declare class AuthenticationError extends WalletSdkError {
|
|
45
|
+
constructor(message: string, options?: {
|
|
46
|
+
cause?: unknown;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/** A key provider could not resolve or unwrap the mnemonic for a wallet's key. */
|
|
50
|
+
export declare class KeyResolutionError extends WalletSdkError {
|
|
51
|
+
constructor(message: string, options?: {
|
|
52
|
+
cause?: unknown;
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/** Signing a withdrawal failed — unsupported chain, fingerprint mismatch, or a signer error. */
|
|
56
|
+
export declare class SigningError extends WalletSdkError {
|
|
57
|
+
constructor(message: string, options?: {
|
|
58
|
+
cause?: unknown;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
export declare class ApiError extends WalletSdkError {
|
|
62
|
+
readonly statusCode: number | undefined;
|
|
63
|
+
readonly responseBody: unknown;
|
|
64
|
+
constructor(message: string, options?: {
|
|
65
|
+
cause?: unknown;
|
|
66
|
+
statusCode?: number;
|
|
67
|
+
responseBody?: unknown;
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/** The API returned 429 Too Many Requests. `retryAfter` is the Retry-After header in seconds, when present. */
|
|
71
|
+
export declare class RateLimitError extends WalletSdkError {
|
|
72
|
+
readonly statusCode = 429;
|
|
73
|
+
readonly retryAfter: number | undefined;
|
|
74
|
+
readonly responseBody: unknown;
|
|
75
|
+
constructor(message: string, options?: {
|
|
76
|
+
cause?: unknown;
|
|
77
|
+
retryAfter?: number;
|
|
78
|
+
responseBody?: unknown;
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
export class WalletSdkError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
cause;
|
|
4
|
+
constructor(code, message, options) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = 'WalletSdkError';
|
|
7
|
+
this.code = code;
|
|
8
|
+
this.cause = options?.cause;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class ValidationError extends WalletSdkError {
|
|
12
|
+
constructor(message, options) {
|
|
13
|
+
super('VALIDATION_ERROR', message, options);
|
|
14
|
+
this.name = 'ValidationError';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export class NotFoundError extends WalletSdkError {
|
|
18
|
+
constructor(message, options) {
|
|
19
|
+
super('NOT_FOUND', message, options);
|
|
20
|
+
this.name = 'NotFoundError';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export class ConflictError extends WalletSdkError {
|
|
24
|
+
constructor(message, options) {
|
|
25
|
+
super('CONFLICT', message, options);
|
|
26
|
+
this.name = 'ConflictError';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export class EncryptionRequiredError extends WalletSdkError {
|
|
30
|
+
constructor(message, options) {
|
|
31
|
+
super('ENCRYPTION_REQUIRED', message, options);
|
|
32
|
+
this.name = 'EncryptionRequiredError';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export class WrongPasswordError extends WalletSdkError {
|
|
36
|
+
constructor(message, options) {
|
|
37
|
+
super('WRONG_PASSWORD', message, options);
|
|
38
|
+
this.name = 'WrongPasswordError';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export class WrongPassphraseError extends WrongPasswordError {
|
|
42
|
+
constructor(message, options) {
|
|
43
|
+
super(message, options);
|
|
44
|
+
this.name = 'WrongPassphraseError';
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export class StorageError extends WalletSdkError {
|
|
48
|
+
constructor(message, options) {
|
|
49
|
+
super('STORAGE_ERROR', message, options);
|
|
50
|
+
this.name = 'StorageError';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export class AuthenticationError extends WalletSdkError {
|
|
54
|
+
constructor(message, options) {
|
|
55
|
+
super('AUTHENTICATION_ERROR', message, options);
|
|
56
|
+
this.name = 'AuthenticationError';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/** A key provider could not resolve or unwrap the mnemonic for a wallet's key. */
|
|
60
|
+
export class KeyResolutionError extends WalletSdkError {
|
|
61
|
+
constructor(message, options) {
|
|
62
|
+
super('KEY_RESOLUTION_ERROR', message, options);
|
|
63
|
+
this.name = 'KeyResolutionError';
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** Signing a withdrawal failed — unsupported chain, fingerprint mismatch, or a signer error. */
|
|
67
|
+
export class SigningError extends WalletSdkError {
|
|
68
|
+
constructor(message, options) {
|
|
69
|
+
super('SIGNING_ERROR', message, options);
|
|
70
|
+
this.name = 'SigningError';
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export class ApiError extends WalletSdkError {
|
|
74
|
+
statusCode;
|
|
75
|
+
responseBody;
|
|
76
|
+
constructor(message, options) {
|
|
77
|
+
super('API_ERROR', message, options);
|
|
78
|
+
this.name = 'ApiError';
|
|
79
|
+
this.statusCode = options?.statusCode;
|
|
80
|
+
this.responseBody = options?.responseBody;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/** The API returned 429 Too Many Requests. `retryAfter` is the Retry-After header in seconds, when present. */
|
|
84
|
+
export class RateLimitError extends WalletSdkError {
|
|
85
|
+
statusCode = 429;
|
|
86
|
+
retryAfter;
|
|
87
|
+
responseBody;
|
|
88
|
+
constructor(message, options) {
|
|
89
|
+
super('RATE_LIMIT', message, options);
|
|
90
|
+
this.name = 'RateLimitError';
|
|
91
|
+
this.retryAfter = options?.retryAfter;
|
|
92
|
+
this.responseBody = options?.responseBody;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { GuvenoApiClient } from './api/client.js';
|
|
2
|
+
import type { ApiWithdrawal } from './api/types.js';
|
|
3
|
+
import type { KeyProvider } from './keyprovider/index.js';
|
|
4
|
+
import type { EthereumGasOverrides } from './signing/sign-ethereum.js';
|
|
5
|
+
import type { BitcoinOutput } from './signing/types.js';
|
|
6
|
+
export interface HotWalletOptions {
|
|
7
|
+
/** API client authenticated with an API key whose role is in WITHDRAWAL_ROLES (owner/admin/manager/signer). */
|
|
8
|
+
api: GuvenoApiClient;
|
|
9
|
+
/** Resolves the mnemonic for a wallet's key — plaintext file or KMS/HSM-wrapped. */
|
|
10
|
+
keys: KeyProvider;
|
|
11
|
+
}
|
|
12
|
+
export interface WithdrawInput {
|
|
13
|
+
addressId: number;
|
|
14
|
+
assetId: number;
|
|
15
|
+
/** Required for Ethereum/XRP/Polkadot; for Bitcoin pass `outputs` instead. */
|
|
16
|
+
toAddress?: string;
|
|
17
|
+
amount?: string;
|
|
18
|
+
/** Bitcoin multi-output sends. */
|
|
19
|
+
outputs?: BitcoinOutput[];
|
|
20
|
+
/** XRP destination tag. */
|
|
21
|
+
destinationTag?: number;
|
|
22
|
+
ethereumGas?: EthereumGasOverrides;
|
|
23
|
+
/** Reused across this call's prepare + broadcast for replay-safe retries; auto-generated when omitted. */
|
|
24
|
+
idempotencyKey?: string;
|
|
25
|
+
/** Optimization: the address's wallet, to avoid scanning every wallet to resolve it. */
|
|
26
|
+
walletId?: number;
|
|
27
|
+
/** Fast path: skip all lookups by supplying the source address's derivation path directly. */
|
|
28
|
+
derivationPath?: string;
|
|
29
|
+
/** Fast path: the wallet's key fingerprint (also the key provider lookup key). */
|
|
30
|
+
keyFingerprint?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Automated withdrawal signer for headless callers (e.g. an exchange hot wallet).
|
|
34
|
+
* Runs the full `prepare → sign → broadcast` loop: the server never holds key
|
|
35
|
+
* material; the mnemonic is unwrapped from the {@link KeyProvider}, used in-process
|
|
36
|
+
* to sign, then dropped. Withdrawals on the same source address are serialized so
|
|
37
|
+
* concurrent sends can't collide on a nonce.
|
|
38
|
+
*/
|
|
39
|
+
export declare class HotWallet {
|
|
40
|
+
private readonly api;
|
|
41
|
+
private readonly keys;
|
|
42
|
+
private readonly addressContexts;
|
|
43
|
+
private readonly queues;
|
|
44
|
+
private fullyIndexed;
|
|
45
|
+
constructor(options: HotWalletOptions);
|
|
46
|
+
/** Prepare, sign, and broadcast a withdrawal. Resolves to the broadcast withdrawal record. */
|
|
47
|
+
withdraw(input: WithdrawInput): Promise<ApiWithdrawal>;
|
|
48
|
+
/** Fetch the current state of a withdrawal (e.g. to poll for confirmation). */
|
|
49
|
+
getWithdrawal(withdrawalId: number): Promise<ApiWithdrawal>;
|
|
50
|
+
private runWithdraw;
|
|
51
|
+
private resolveAddress;
|
|
52
|
+
private indexWallet;
|
|
53
|
+
private indexAllWallets;
|
|
54
|
+
/** Chain the per-`addressId` tasks so two withdrawals from one address never overlap. */
|
|
55
|
+
private serialize;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=hot-wallet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hot-wallet.d.ts","sourceRoot":"","sources":["../src/hot-wallet.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAGvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,WAAW,gBAAgB;IAC/B,+GAA+G;IAC/G,GAAG,EAAE,eAAe,CAAC;IACrB,oFAAoF;IACpF,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,2BAA2B;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACnC,0GAA0G;IAC1G,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wFAAwF;IACxF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8FAA8F;IAC9F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAUD;;;;;;GAMG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkB;IACtC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;IACnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAC9D,OAAO,CAAC,YAAY,CAAS;gBAEjB,OAAO,EAAE,gBAAgB;IAKrC,8FAA8F;IACxF,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAI5D,+EAA+E;IACzE,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;YAInD,WAAW;YAgDX,cAAc;YA4Bd,WAAW;YAqBX,eAAe;IAY7B,yFAAyF;IACzF,OAAO,CAAC,SAAS;CAYlB"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { NotFoundError, SigningError } from './errors.js';
|
|
3
|
+
import { fingerprintMnemonic } from './mnemonic.js';
|
|
4
|
+
import { canSignChain, signWithdrawal } from './signing/sign-withdrawal.js';
|
|
5
|
+
/**
|
|
6
|
+
* Automated withdrawal signer for headless callers (e.g. an exchange hot wallet).
|
|
7
|
+
* Runs the full `prepare → sign → broadcast` loop: the server never holds key
|
|
8
|
+
* material; the mnemonic is unwrapped from the {@link KeyProvider}, used in-process
|
|
9
|
+
* to sign, then dropped. Withdrawals on the same source address are serialized so
|
|
10
|
+
* concurrent sends can't collide on a nonce.
|
|
11
|
+
*/
|
|
12
|
+
export class HotWallet {
|
|
13
|
+
api;
|
|
14
|
+
keys;
|
|
15
|
+
addressContexts = new Map();
|
|
16
|
+
queues = new Map();
|
|
17
|
+
fullyIndexed = false;
|
|
18
|
+
constructor(options) {
|
|
19
|
+
this.api = options.api;
|
|
20
|
+
this.keys = options.keys;
|
|
21
|
+
}
|
|
22
|
+
/** Prepare, sign, and broadcast a withdrawal. Resolves to the broadcast withdrawal record. */
|
|
23
|
+
async withdraw(input) {
|
|
24
|
+
return this.serialize(input.addressId, () => this.runWithdraw(input));
|
|
25
|
+
}
|
|
26
|
+
/** Fetch the current state of a withdrawal (e.g. to poll for confirmation). */
|
|
27
|
+
async getWithdrawal(withdrawalId) {
|
|
28
|
+
return this.api.getWithdrawal(withdrawalId);
|
|
29
|
+
}
|
|
30
|
+
async runWithdraw(input) {
|
|
31
|
+
const context = await this.resolveAddress(input);
|
|
32
|
+
if (context.chain != null && !canSignChain(context.chain)) {
|
|
33
|
+
throw new SigningError(`The hot wallet cannot sign ${context.chain} withdrawals.`);
|
|
34
|
+
}
|
|
35
|
+
const { withdrawal, signingPayload } = await this.api.prepareWithdrawal({
|
|
36
|
+
addressId: input.addressId,
|
|
37
|
+
assetId: input.assetId,
|
|
38
|
+
...(input.toAddress !== undefined ? { toAddress: input.toAddress } : {}),
|
|
39
|
+
...(input.amount !== undefined ? { amount: input.amount } : {}),
|
|
40
|
+
...(input.outputs !== undefined ? { outputs: input.outputs } : {}),
|
|
41
|
+
...(input.destinationTag !== undefined ? { destinationTag: input.destinationTag } : {}),
|
|
42
|
+
idempotencyKey: input.idempotencyKey ?? randomUUID()
|
|
43
|
+
});
|
|
44
|
+
if (!canSignChain(signingPayload.chain)) {
|
|
45
|
+
throw new SigningError(`The hot wallet cannot sign ${signingPayload.chain} withdrawals.`);
|
|
46
|
+
}
|
|
47
|
+
let mnemonic = (await this.keys.getMnemonic(context.keyFingerprint)).trim();
|
|
48
|
+
try {
|
|
49
|
+
const actual = fingerprintMnemonic(mnemonic);
|
|
50
|
+
if (actual !== context.keyFingerprint) {
|
|
51
|
+
throw new SigningError(`Key provider returned a mnemonic whose fingerprint (${actual}) does not match wallet key ${context.keyFingerprint}.`);
|
|
52
|
+
}
|
|
53
|
+
const signedRawTx = await signWithdrawal({
|
|
54
|
+
payload: signingPayload,
|
|
55
|
+
mnemonic,
|
|
56
|
+
derivationPath: context.derivationPath,
|
|
57
|
+
...(input.ethereumGas !== undefined ? { ethereumGas: input.ethereumGas } : {})
|
|
58
|
+
});
|
|
59
|
+
return await this.api.broadcastWithdrawal({
|
|
60
|
+
withdrawalId: withdrawal.id,
|
|
61
|
+
signedRawTx,
|
|
62
|
+
idempotencyKey: input.idempotencyKey ?? randomUUID()
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
// Best-effort: drop the reference so the plaintext mnemonic can be collected.
|
|
67
|
+
mnemonic = '';
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async resolveAddress(input) {
|
|
71
|
+
if (input.derivationPath != null && input.keyFingerprint != null) {
|
|
72
|
+
const context = {
|
|
73
|
+
derivationPath: input.derivationPath,
|
|
74
|
+
keyFingerprint: input.keyFingerprint
|
|
75
|
+
};
|
|
76
|
+
this.addressContexts.set(input.addressId, context);
|
|
77
|
+
return context;
|
|
78
|
+
}
|
|
79
|
+
const cached = this.addressContexts.get(input.addressId);
|
|
80
|
+
if (cached != null) {
|
|
81
|
+
return cached;
|
|
82
|
+
}
|
|
83
|
+
if (input.walletId != null) {
|
|
84
|
+
await this.indexWallet(input.walletId);
|
|
85
|
+
}
|
|
86
|
+
else if (!this.fullyIndexed) {
|
|
87
|
+
await this.indexAllWallets();
|
|
88
|
+
}
|
|
89
|
+
const resolved = this.addressContexts.get(input.addressId);
|
|
90
|
+
if (resolved == null) {
|
|
91
|
+
throw new NotFoundError(`Address ${input.addressId} was not found in any accessible wallet.`);
|
|
92
|
+
}
|
|
93
|
+
return resolved;
|
|
94
|
+
}
|
|
95
|
+
async indexWallet(walletId) {
|
|
96
|
+
const detail = await this.api.getWalletRecord(walletId);
|
|
97
|
+
const keyFingerprint = detail.key?.fingerprint;
|
|
98
|
+
if (keyFingerprint == null) {
|
|
99
|
+
throw new SigningError(`Wallet ${walletId} has no key fingerprint; cannot resolve a signing key.`);
|
|
100
|
+
}
|
|
101
|
+
let cursor;
|
|
102
|
+
do {
|
|
103
|
+
const page = await this.api.listWalletAddresses(walletId, cursor != null ? { cursor } : {});
|
|
104
|
+
for (const address of page.items) {
|
|
105
|
+
this.addressContexts.set(address.id, {
|
|
106
|
+
derivationPath: address.derivationPath,
|
|
107
|
+
keyFingerprint,
|
|
108
|
+
chain: address.chain
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
cursor = page.pageInfo.hasNextPage ? page.pageInfo.nextCursor ?? undefined : undefined;
|
|
112
|
+
} while (cursor != null);
|
|
113
|
+
}
|
|
114
|
+
async indexAllWallets() {
|
|
115
|
+
let cursor;
|
|
116
|
+
do {
|
|
117
|
+
const page = await this.api.listWalletRecordPage(cursor != null ? { cursor } : {});
|
|
118
|
+
for (const wallet of page.items) {
|
|
119
|
+
await this.indexWallet(wallet.id);
|
|
120
|
+
}
|
|
121
|
+
cursor = page.pageInfo.hasNextPage ? page.pageInfo.nextCursor ?? undefined : undefined;
|
|
122
|
+
} while (cursor != null);
|
|
123
|
+
this.fullyIndexed = true;
|
|
124
|
+
}
|
|
125
|
+
/** Chain the per-`addressId` tasks so two withdrawals from one address never overlap. */
|
|
126
|
+
serialize(addressId, task) {
|
|
127
|
+
const previous = this.queues.get(addressId) ?? Promise.resolve();
|
|
128
|
+
const run = previous.catch(() => undefined).then(task);
|
|
129
|
+
const tracked = run.catch(() => undefined);
|
|
130
|
+
this.queues.set(addressId, tracked);
|
|
131
|
+
void tracked.then(() => {
|
|
132
|
+
if (this.queues.get(addressId) === tracked) {
|
|
133
|
+
this.queues.delete(addressId);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
return run;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=hot-wallet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hot-wallet.js","sourceRoot":"","sources":["../src/hot-wallet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAwC5E;;;;;;GAMG;AACH,MAAM,OAAO,SAAS;IACH,GAAG,CAAkB;IACrB,IAAI,CAAc;IAClB,eAAe,GAAG,IAAI,GAAG,EAA0B,CAAC;IACpD,MAAM,GAAG,IAAI,GAAG,EAA4B,CAAC;IACtD,YAAY,GAAG,KAAK,CAAC;IAE7B,YAAY,OAAyB;QACnC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,8FAA8F;IAC9F,KAAK,CAAC,QAAQ,CAAC,KAAoB;QACjC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,+EAA+E;IAC/E,KAAK,CAAC,aAAa,CAAC,YAAoB;QACtC,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,KAAoB;QAC5C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAEjD,IAAI,OAAO,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,YAAY,CAAC,8BAA8B,OAAO,CAAC,KAAK,eAAe,CAAC,CAAC;QACrF,CAAC;QAED,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC;YACtE,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClE,GAAG,CAAC,KAAK,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvF,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,UAAU,EAAE;SACrD,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,YAAY,CAAC,8BAA8B,cAAc,CAAC,KAAK,eAAe,CAAC,CAAC;QAC5F,CAAC;QAED,IAAI,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5E,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YAC7C,IAAI,MAAM,KAAK,OAAO,CAAC,cAAc,EAAE,CAAC;gBACtC,MAAM,IAAI,YAAY,CACpB,uDAAuD,MAAM,+BAA+B,OAAO,CAAC,cAAc,GAAG,CACtH,CAAC;YACJ,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC;gBACvC,OAAO,EAAE,cAAc;gBACvB,QAAQ;gBACR,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,GAAG,CAAC,KAAK,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/E,CAAC,CAAC;YAEH,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC;gBACxC,YAAY,EAAE,UAAU,CAAC,EAAE;gBAC3B,WAAW;gBACX,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,UAAU,EAAE;aACrD,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,8EAA8E;YAC9E,QAAQ,GAAG,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,KAAoB;QAC/C,IAAI,KAAK,CAAC,cAAc,IAAI,IAAI,IAAI,KAAK,CAAC,cAAc,IAAI,IAAI,EAAE,CAAC;YACjE,MAAM,OAAO,GAAmB;gBAC9B,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,cAAc,EAAE,KAAK,CAAC,cAAc;aACrC,CAAC;YACF,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACzD,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;YAC3B,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YAC9B,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC/B,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC3D,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,aAAa,CAAC,WAAW,KAAK,CAAC,SAAS,0CAA0C,CAAC,CAAC;QAChG,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,QAAgB;QACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC;QAC/C,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;YAC3B,MAAM,IAAI,YAAY,CAAC,UAAU,QAAQ,wDAAwD,CAAC,CAAC;QACrG,CAAC;QAED,IAAI,MAA0B,CAAC;QAC/B,GAAG,CAAC;YACF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5F,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACjC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE;oBACnC,cAAc,EAAE,OAAO,CAAC,cAAc;oBACtC,cAAc;oBACd,KAAK,EAAE,OAAO,CAAC,KAAK;iBACrB,CAAC,CAAC;YACL,CAAC;YACD,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACzF,CAAC,QAAQ,MAAM,IAAI,IAAI,EAAE;IAC3B,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,IAAI,MAA0B,CAAC;QAC/B,GAAG,CAAC;YACF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,oBAAoB,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACnF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAChC,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACpC,CAAC;YACD,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACzF,CAAC,QAAQ,MAAM,IAAI,IAAI,EAAE;QACzB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED,yFAAyF;IACjF,SAAS,CAAI,SAAiB,EAAE,IAAsB;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACjE,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACpC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;YACrB,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,OAAO,EAAE,CAAC;gBAC3C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export { GuvenoApiClient } from './api/client.js';
|
|
2
|
+
export { WEBHOOK_EVENT_TYPES } from './api/types.js';
|
|
3
|
+
export { FileSystemApiSessionStore } from './session/file-store.js';
|
|
4
|
+
export { WalletManager, EthereumWalletManager } from './manager.js';
|
|
5
|
+
export { FileSystemWalletStore, resolveStorageDir } from './storage/file-store.js';
|
|
6
|
+
export { decryptSecretsJson } from './storage/crypto.js';
|
|
7
|
+
export { sealSecret } from './crypto/sealed-box.js';
|
|
8
|
+
export { DEFAULT_CHAIN, CHAIN_DEFINITIONS, POLKADOT_SS58_FORMAT, SUPPORTED_CHAINS, SUPPORTED_NETWORKS } from './chains.js';
|
|
9
|
+
export { DEFAULT_API_BASE_URL, DEFAULT_API_BASE_URL_ENV_VAR } from './constants.js';
|
|
10
|
+
export { buildDerivationPath, deriveAddress, deriveBitcoinAddress, deriveEthereumAddress, derivePolkadotAddress, deriveXrpAddress } from './derivation.js';
|
|
11
|
+
export { assertValidMnemonic, fingerprintMnemonic, generateRandomMnemonic, getMnemonicWordCount, normalizeMnemonic } from './mnemonic.js';
|
|
12
|
+
export { HotWallet } from './hot-wallet.js';
|
|
13
|
+
export { FileKeyProvider, KmsKeyProvider } from './keyprovider/index.js';
|
|
14
|
+
export { signWithdrawal, SIGNABLE_CHAINS, canSignChain } from './signing/sign-withdrawal.js';
|
|
15
|
+
export { signEthereumWithdrawal } from './signing/sign-ethereum.js';
|
|
16
|
+
export { signXrpWithdrawal } from './signing/sign-xrp.js';
|
|
17
|
+
export { signBitcoinWithdrawal } from './signing/sign-bitcoin.js';
|
|
18
|
+
export { signPolkadotWithdrawal } from './signing/sign-polkadot.js';
|
|
19
|
+
export { UnsupportedSigningError, WithdrawalExpiredError } from './signing/types.js';
|
|
20
|
+
export { ApiError, AuthenticationError, ConflictError, EncryptionRequiredError, KeyResolutionError, NotFoundError, RateLimitError, SigningError, StorageError, ValidationError, WalletSdkError, WrongPasswordError, WrongPassphraseError } from './errors.js';
|
|
21
|
+
export type { HotWalletOptions, WithdrawInput } from './hot-wallet.js';
|
|
22
|
+
export type { KeyProvider, KmsKeyProviderOptions, KmsDecryptFn } from './keyprovider/index.js';
|
|
23
|
+
export type { MnemonicMap } from './keyprovider/file-provider.js';
|
|
24
|
+
export type { SignWithdrawalInput } from './signing/sign-withdrawal.js';
|
|
25
|
+
export type { EthereumGasOverrides } from './signing/sign-ethereum.js';
|
|
26
|
+
export type { BitcoinChainState, BitcoinOutput, ChainState, EthereumChainState, PolkadotChainState, SigningAsset, SigningPayload, XrpChainState } from './signing/types.js';
|
|
27
|
+
export type { CreateWalletGroupOptions, CreateWalletGroupResult, DeriveAddressOptions, DerivedAccount, EncryptedStoredSecretRecord, EncryptionStatus, ImportWalletGroupOptions, ImportWalletGroupResult, LabelAccountOptions, MnemonicWordCount, SupportedChain, SupportedNetwork, WalletGroup, WalletGroupMetadataJson, WalletGroupMetadataExport, WalletGroupRecordExport, WalletKeySummary, WalletRecordAddressExport, WalletGroupSecretsJson, WalletGroupSummary, WalletManagerOptions, WalletManagerOptions as HdWalletManagerOptions } from './types.js';
|
|
28
|
+
export type { ApiAuthResponse, ApiChain, ApiClientOptions, ApiCompanyMembership, ApiCompanyRole, ApiKeyAccess, ApiKeySummary, ApiNetwork, ApiPageInfo, ApiRecordStatus, ApiSession, ApiSessionStore, ApiSignupResponse, ApiUser, ApiUserEncryptionKey, ApiVerifyEmailInput, ApiWalletAddress, ApiWalletDetail, ApiWalletKeySecret, ApiWalletSummary, ApiWalletType, ApiWebhook, ApiWebhookDelivery, ApiWebhookDeliveryStatus, ApiWebhookEventType, ApiWebhookType, ApiWebhookWithSecret, ApiWithdrawal, ApiWithdrawalStatus, BroadcastWithdrawalInput, CreateApiWalletInput, CreateApiWebhookInput, ListApiAddressOptions, ListApiWalletOptions, ListApiWebhookDeliveryOptions, ListApiWithdrawalOptions, PrepareWithdrawalInput, PrepareWithdrawalResult, UpdateApiWalletInput, ApiAuthResponse as ApiAuthPayload, ApiClientOptions as ApiClientConfig, ApiSession as SavedApiSession, ApiSessionStore as SavedApiSessionStore, ApiUser as AuthenticatedApiUser, ApiWalletDetail as RemoteWalletDetail, ApiWalletSummary as RemoteWalletSummary, CreateApiWalletInput as CreateRemoteWalletInput, UpdateApiWalletInput as UpdateRemoteWalletInput } from './api/types.js';
|
|
29
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export { GuvenoApiClient } from './api/client.js';
|
|
2
|
+
export { WEBHOOK_EVENT_TYPES } from './api/types.js';
|
|
3
|
+
export { FileSystemApiSessionStore } from './session/file-store.js';
|
|
4
|
+
export { WalletManager, EthereumWalletManager } from './manager.js';
|
|
5
|
+
export { FileSystemWalletStore, resolveStorageDir } from './storage/file-store.js';
|
|
6
|
+
export { decryptSecretsJson } from './storage/crypto.js';
|
|
7
|
+
export { sealSecret } from './crypto/sealed-box.js';
|
|
8
|
+
export { DEFAULT_CHAIN, CHAIN_DEFINITIONS, POLKADOT_SS58_FORMAT, SUPPORTED_CHAINS, SUPPORTED_NETWORKS } from './chains.js';
|
|
9
|
+
export { DEFAULT_API_BASE_URL, DEFAULT_API_BASE_URL_ENV_VAR } from './constants.js';
|
|
10
|
+
export { buildDerivationPath, deriveAddress, deriveBitcoinAddress, deriveEthereumAddress, derivePolkadotAddress, deriveXrpAddress } from './derivation.js';
|
|
11
|
+
export { assertValidMnemonic, fingerprintMnemonic, generateRandomMnemonic, getMnemonicWordCount, normalizeMnemonic } from './mnemonic.js';
|
|
12
|
+
export { HotWallet } from './hot-wallet.js';
|
|
13
|
+
export { FileKeyProvider, KmsKeyProvider } from './keyprovider/index.js';
|
|
14
|
+
export { signWithdrawal, SIGNABLE_CHAINS, canSignChain } from './signing/sign-withdrawal.js';
|
|
15
|
+
export { signEthereumWithdrawal } from './signing/sign-ethereum.js';
|
|
16
|
+
export { signXrpWithdrawal } from './signing/sign-xrp.js';
|
|
17
|
+
export { signBitcoinWithdrawal } from './signing/sign-bitcoin.js';
|
|
18
|
+
export { signPolkadotWithdrawal } from './signing/sign-polkadot.js';
|
|
19
|
+
export { UnsupportedSigningError, WithdrawalExpiredError } from './signing/types.js';
|
|
20
|
+
export { ApiError, AuthenticationError, ConflictError, EncryptionRequiredError, KeyResolutionError, NotFoundError, RateLimitError, SigningError, StorageError, ValidationError, WalletSdkError, WrongPasswordError, WrongPassphraseError } from './errors.js';
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC7F,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EACL,QAAQ,EACR,mBAAmB,EACnB,aAAa,EACb,uBAAuB,EACvB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { KeyProvider } from './index.js';
|
|
2
|
+
/** A `fingerprint → mnemonic` map, supplied inline or read from a JSON file of the same shape. */
|
|
3
|
+
export type MnemonicMap = Record<string, string>;
|
|
4
|
+
/**
|
|
5
|
+
* Resolves mnemonics from a plaintext source: either an in-memory
|
|
6
|
+
* `fingerprint → mnemonic` map, or a JSON file of that shape. Intended for the
|
|
7
|
+
* "plaintext key json" deployment where the secret store (file permissions, a
|
|
8
|
+
* mounted secret, an injected env value) handles protection at rest.
|
|
9
|
+
*
|
|
10
|
+
* For KMS/HSM-protected material use {@link KmsKeyProvider} instead.
|
|
11
|
+
*/
|
|
12
|
+
export declare class FileKeyProvider implements KeyProvider {
|
|
13
|
+
private readonly filePath;
|
|
14
|
+
private cache;
|
|
15
|
+
constructor(source: string | MnemonicMap);
|
|
16
|
+
getMnemonic(keyFingerprint: string): Promise<string>;
|
|
17
|
+
private load;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=file-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-provider.d.ts","sourceRoot":"","sources":["../../src/keyprovider/file-provider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,kGAAkG;AAClG,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEjD;;;;;;;GAOG;AACH,qBAAa,eAAgB,YAAW,WAAW;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,KAAK,CAA0B;gBAE3B,MAAM,EAAE,MAAM,GAAG,WAAW;IAQlC,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAW5C,IAAI;CAmBnB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { KeyResolutionError } from '../errors.js';
|
|
3
|
+
/**
|
|
4
|
+
* Resolves mnemonics from a plaintext source: either an in-memory
|
|
5
|
+
* `fingerprint → mnemonic` map, or a JSON file of that shape. Intended for the
|
|
6
|
+
* "plaintext key json" deployment where the secret store (file permissions, a
|
|
7
|
+
* mounted secret, an injected env value) handles protection at rest.
|
|
8
|
+
*
|
|
9
|
+
* For KMS/HSM-protected material use {@link KmsKeyProvider} instead.
|
|
10
|
+
*/
|
|
11
|
+
export class FileKeyProvider {
|
|
12
|
+
filePath;
|
|
13
|
+
cache;
|
|
14
|
+
constructor(source) {
|
|
15
|
+
if (typeof source === 'string') {
|
|
16
|
+
this.filePath = source;
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
this.cache = { ...source };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async getMnemonic(keyFingerprint) {
|
|
23
|
+
const entries = await this.load();
|
|
24
|
+
const mnemonic = entries[keyFingerprint];
|
|
25
|
+
if (typeof mnemonic !== 'string' || mnemonic.trim().length === 0) {
|
|
26
|
+
throw new KeyResolutionError(`No mnemonic configured for key fingerprint "${keyFingerprint}".`);
|
|
27
|
+
}
|
|
28
|
+
return mnemonic;
|
|
29
|
+
}
|
|
30
|
+
async load() {
|
|
31
|
+
if (this.cache != null) {
|
|
32
|
+
return this.cache;
|
|
33
|
+
}
|
|
34
|
+
let parsed;
|
|
35
|
+
try {
|
|
36
|
+
parsed = JSON.parse(await readFile(this.filePath, 'utf8'));
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
throw new KeyResolutionError(`Failed to read key file at "${this.filePath}".`, { cause: error });
|
|
40
|
+
}
|
|
41
|
+
if (parsed == null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
42
|
+
throw new KeyResolutionError('Key file must be a JSON object mapping fingerprint to mnemonic.');
|
|
43
|
+
}
|
|
44
|
+
this.cache = parsed;
|
|
45
|
+
return this.cache;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=file-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-provider.js","sourceRoot":"","sources":["../../src/keyprovider/file-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAMlD;;;;;;;GAOG;AACH,MAAM,OAAO,eAAe;IACT,QAAQ,CAAqB;IACtC,KAAK,CAA0B;IAEvC,YAAY,MAA4B;QACtC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,cAAsB;QACtC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;QAEzC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjE,MAAM,IAAI,kBAAkB,CAAC,+CAA+C,cAAc,IAAI,CAAC,CAAC;QAClG,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QAED,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAkB,EAAE,MAAM,CAAC,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,kBAAkB,CAAC,+BAA+B,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACnG,CAAC;QAED,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1E,MAAM,IAAI,kBAAkB,CAAC,iEAAiE,CAAC,CAAC;QAClG,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,MAAqB,CAAC;QACnC,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves the BIP39 mnemonic for a wallet's signing key, identified by the
|
|
3
|
+
* wallet's `keyFingerprint`. Implementations decide where the secret lives —
|
|
4
|
+
* a plaintext file ({@link FileKeyProvider}) or a KMS/HSM-wrapped blob
|
|
5
|
+
* ({@link KmsKeyProvider}). The returned mnemonic is held in memory only for the
|
|
6
|
+
* duration of a single signing call.
|
|
7
|
+
*/
|
|
8
|
+
export interface KeyProvider {
|
|
9
|
+
getMnemonic(keyFingerprint: string): Promise<string>;
|
|
10
|
+
}
|
|
11
|
+
export { FileKeyProvider } from './file-provider.js';
|
|
12
|
+
export { KmsKeyProvider, type KmsKeyProviderOptions, type KmsDecryptFn } from './kms-provider.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/keyprovider/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACtD;AAED,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/keyprovider/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAiD,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { KeyProvider } from './index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Decrypts a wrapped secret into a plaintext mnemonic. Supplied by the caller so
|
|
4
|
+
* the SDK stays free of any cloud dependency — back it with AWS KMS `Decrypt`,
|
|
5
|
+
* GCP KMS, HashiCorp Vault, or an HSM unwrap call. Receives the wrapped value for
|
|
6
|
+
* a given fingerprint and must return the mnemonic string.
|
|
7
|
+
*/
|
|
8
|
+
export type KmsDecryptFn = (wrapped: string, keyFingerprint: string) => Promise<string>;
|
|
9
|
+
export interface KmsKeyProviderOptions {
|
|
10
|
+
/** Map of `keyFingerprint → wrapped/encrypted secret` (ciphertext, blob ref, etc.). */
|
|
11
|
+
entries: Record<string, string>;
|
|
12
|
+
/** Caller-supplied unwrap routine (KMS/HSM/Vault). */
|
|
13
|
+
decrypt: KmsDecryptFn;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Resolves mnemonics by handing each wallet's wrapped secret to a caller-supplied
|
|
17
|
+
* {@link KmsDecryptFn}. The plaintext mnemonic exists only transiently in process
|
|
18
|
+
* memory while a withdrawal is signed (the "unwrap-then-sign" model).
|
|
19
|
+
*/
|
|
20
|
+
export declare class KmsKeyProvider implements KeyProvider {
|
|
21
|
+
private readonly entries;
|
|
22
|
+
private readonly decrypt;
|
|
23
|
+
constructor(options: KmsKeyProviderOptions);
|
|
24
|
+
getMnemonic(keyFingerprint: string): Promise<string>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=kms-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kms-provider.d.ts","sourceRoot":"","sources":["../../src/keyprovider/kms-provider.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAExF,MAAM,WAAW,qBAAqB;IACpC,uFAAuF;IACvF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,sDAAsD;IACtD,OAAO,EAAE,YAAY,CAAC;CACvB;AAED;;;;GAIG;AACH,qBAAa,cAAe,YAAW,WAAW;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;gBAE3B,OAAO,EAAE,qBAAqB;IAKpC,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAoB3D"}
|