@blockrun/clawrouter 0.12.94 → 0.12.96
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/dist/auth.d.ts +82 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +388 -0
- package/dist/auth.js.map +1 -0
- package/dist/balance.d.ts +97 -0
- package/dist/balance.d.ts.map +1 -0
- package/dist/balance.js +157 -0
- package/dist/balance.js.map +1 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +256 -54991
- package/dist/cli.js.map +1 -1
- package/dist/compression/codebook.d.ts +24 -0
- package/dist/compression/codebook.d.ts.map +1 -0
- package/dist/compression/codebook.js +119 -0
- package/dist/compression/codebook.js.map +1 -0
- package/dist/compression/index.d.ts +33 -0
- package/dist/compression/index.d.ts.map +1 -0
- package/dist/compression/index.js +246 -0
- package/dist/compression/index.js.map +1 -0
- package/dist/compression/layers/deduplication.d.ts +28 -0
- package/dist/compression/layers/deduplication.d.ts.map +1 -0
- package/dist/compression/layers/deduplication.js +101 -0
- package/dist/compression/layers/deduplication.js.map +1 -0
- package/dist/compression/layers/dictionary.d.ts +21 -0
- package/dist/compression/layers/dictionary.d.ts.map +1 -0
- package/dist/compression/layers/dictionary.js +73 -0
- package/dist/compression/layers/dictionary.js.map +1 -0
- package/dist/compression/layers/dynamic-codebook.d.ts +26 -0
- package/dist/compression/layers/dynamic-codebook.d.ts.map +1 -0
- package/dist/compression/layers/dynamic-codebook.js +149 -0
- package/dist/compression/layers/dynamic-codebook.js.map +1 -0
- package/dist/compression/layers/json-compact.d.ts +23 -0
- package/dist/compression/layers/json-compact.d.ts.map +1 -0
- package/dist/compression/layers/json-compact.js +79 -0
- package/dist/compression/layers/json-compact.js.map +1 -0
- package/dist/compression/layers/observation.d.ts +21 -0
- package/dist/compression/layers/observation.d.ts.map +1 -0
- package/dist/compression/layers/observation.js +130 -0
- package/dist/compression/layers/observation.js.map +1 -0
- package/dist/compression/layers/paths.d.ts +24 -0
- package/dist/compression/layers/paths.d.ts.map +1 -0
- package/dist/compression/layers/paths.js +110 -0
- package/dist/compression/layers/paths.js.map +1 -0
- package/dist/compression/layers/whitespace.d.ts +27 -0
- package/dist/compression/layers/whitespace.d.ts.map +1 -0
- package/dist/compression/layers/whitespace.js +60 -0
- package/dist/compression/layers/whitespace.js.map +1 -0
- package/dist/compression/types.d.ts +84 -0
- package/dist/compression/types.d.ts.map +1 -0
- package/dist/compression/types.js +27 -0
- package/dist/compression/types.js.map +1 -0
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +22 -0
- package/dist/config.js.map +1 -0
- package/dist/dedup.d.ts +34 -0
- package/dist/dedup.d.ts.map +1 -0
- package/dist/dedup.js +150 -0
- package/dist/dedup.js.map +1 -0
- package/dist/doctor.d.ts +8 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +375 -0
- package/dist/doctor.js.map +1 -0
- package/dist/error-classification.test.d.ts +2 -0
- package/dist/error-classification.test.d.ts.map +1 -0
- package/dist/error-classification.test.js +59 -0
- package/dist/error-classification.test.js.map +1 -0
- package/dist/errors.d.ts +54 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +85 -0
- package/dist/errors.js.map +1 -0
- package/dist/exclude-models.d.ts +28 -0
- package/dist/exclude-models.d.ts.map +1 -0
- package/dist/exclude-models.integration.test.d.ts +2 -0
- package/dist/exclude-models.integration.test.d.ts.map +1 -0
- package/dist/exclude-models.integration.test.js +46 -0
- package/dist/exclude-models.integration.test.js.map +1 -0
- package/dist/exclude-models.js +70 -0
- package/dist/exclude-models.js.map +1 -0
- package/dist/exclude-models.test.d.ts +5 -0
- package/dist/exclude-models.test.d.ts.map +1 -0
- package/dist/exclude-models.test.js +95 -0
- package/dist/exclude-models.test.js.map +1 -0
- package/dist/fs-read.d.ts +11 -0
- package/dist/fs-read.d.ts.map +1 -0
- package/dist/fs-read.js +47 -0
- package/dist/fs-read.js.map +1 -0
- package/dist/index.d.ts +34 -1368
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1071 -56191
- package/dist/index.js.map +1 -1
- package/dist/journal.d.ts +67 -0
- package/dist/journal.d.ts.map +1 -0
- package/dist/journal.js +184 -0
- package/dist/journal.js.map +1 -0
- package/dist/journal.test.d.ts +2 -0
- package/dist/journal.test.d.ts.map +1 -0
- package/dist/journal.test.js +201 -0
- package/dist/journal.test.js.map +1 -0
- package/dist/logger.d.ts +33 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +35 -0
- package/dist/logger.js.map +1 -0
- package/dist/models.d.ts +107 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +941 -0
- package/dist/models.js.map +1 -0
- package/dist/models.test.d.ts +2 -0
- package/dist/models.test.d.ts.map +1 -0
- package/dist/models.test.js +38 -0
- package/dist/models.test.js.map +1 -0
- package/dist/partners/index.d.ts +8 -0
- package/dist/partners/index.d.ts.map +1 -0
- package/dist/partners/index.js +6 -0
- package/dist/partners/index.js.map +1 -0
- package/dist/partners/registry.d.ts +51 -0
- package/dist/partners/registry.d.ts.map +1 -0
- package/dist/partners/registry.js +256 -0
- package/dist/partners/registry.js.map +1 -0
- package/dist/partners/tools.d.ts +24 -0
- package/dist/partners/tools.d.ts.map +1 -0
- package/dist/partners/tools.js +97 -0
- package/dist/partners/tools.js.map +1 -0
- package/dist/payment-preauth.d.ts +17 -0
- package/dist/payment-preauth.d.ts.map +1 -0
- package/dist/payment-preauth.js +102 -0
- package/dist/payment-preauth.js.map +1 -0
- package/dist/provider.d.ts +19 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +45 -0
- package/dist/provider.js.map +1 -0
- package/dist/proxy.d.ts +210 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.debrand.test.d.ts +2 -0
- package/dist/proxy.debrand.test.d.ts.map +1 -0
- package/dist/proxy.debrand.test.js +101 -0
- package/dist/proxy.debrand.test.js.map +1 -0
- package/dist/proxy.degraded-response.test.d.ts +2 -0
- package/dist/proxy.degraded-response.test.d.ts.map +1 -0
- package/dist/proxy.degraded-response.test.js +105 -0
- package/dist/proxy.degraded-response.test.js.map +1 -0
- package/dist/proxy.image-download.test.d.ts +2 -0
- package/dist/proxy.image-download.test.d.ts.map +1 -0
- package/dist/proxy.image-download.test.js +92 -0
- package/dist/proxy.image-download.test.js.map +1 -0
- package/dist/proxy.js +3810 -0
- package/dist/proxy.js.map +1 -0
- package/dist/proxy.models-endpoint.test.d.ts +2 -0
- package/dist/proxy.models-endpoint.test.d.ts.map +1 -0
- package/dist/proxy.models-endpoint.test.js +19 -0
- package/dist/proxy.models-endpoint.test.js.map +1 -0
- package/dist/proxy.multiturn-thinking.test.d.ts +2 -0
- package/dist/proxy.multiturn-thinking.test.d.ts.map +1 -0
- package/dist/proxy.multiturn-thinking.test.js +82 -0
- package/dist/proxy.multiturn-thinking.test.js.map +1 -0
- package/dist/proxy.payment-chain-reuse.test.d.ts +2 -0
- package/dist/proxy.payment-chain-reuse.test.d.ts.map +1 -0
- package/dist/proxy.payment-chain-reuse.test.js +30 -0
- package/dist/proxy.payment-chain-reuse.test.js.map +1 -0
- package/dist/proxy.solana-resilience.test.d.ts +12 -0
- package/dist/proxy.solana-resilience.test.d.ts.map +1 -0
- package/dist/proxy.solana-resilience.test.js +39 -0
- package/dist/proxy.solana-resilience.test.js.map +1 -0
- package/dist/report.d.ts +6 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +44 -0
- package/dist/report.js.map +1 -0
- package/dist/response-cache.advanced.test.d.ts +2 -0
- package/dist/response-cache.advanced.test.d.ts.map +1 -0
- package/dist/response-cache.advanced.test.js +566 -0
- package/dist/response-cache.advanced.test.js.map +1 -0
- package/dist/response-cache.d.ts +85 -0
- package/dist/response-cache.d.ts.map +1 -0
- package/dist/response-cache.edge-cases.test.d.ts +2 -0
- package/dist/response-cache.edge-cases.test.d.ts.map +1 -0
- package/dist/response-cache.edge-cases.test.js +488 -0
- package/dist/response-cache.edge-cases.test.js.map +1 -0
- package/dist/response-cache.extreme.test.d.ts +2 -0
- package/dist/response-cache.extreme.test.d.ts.map +1 -0
- package/dist/response-cache.extreme.test.js +561 -0
- package/dist/response-cache.extreme.test.js.map +1 -0
- package/dist/response-cache.js +240 -0
- package/dist/response-cache.js.map +1 -0
- package/dist/response-cache.test.d.ts +2 -0
- package/dist/response-cache.test.d.ts.map +1 -0
- package/dist/response-cache.test.js +242 -0
- package/dist/response-cache.test.js.map +1 -0
- package/dist/retry.d.ts +42 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +99 -0
- package/dist/retry.js.map +1 -0
- package/dist/router/config.d.ts +11 -0
- package/dist/router/config.d.ts.map +1 -0
- package/dist/router/config.js +1215 -0
- package/dist/router/config.js.map +1 -0
- package/dist/router/index.d.ts +18 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +19 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/llm-classifier.d.ts +29 -0
- package/dist/router/llm-classifier.d.ts.map +1 -0
- package/dist/router/llm-classifier.js +99 -0
- package/dist/router/llm-classifier.js.map +1 -0
- package/dist/router/rules.d.ts +12 -0
- package/dist/router/rules.d.ts.map +1 -0
- package/dist/router/rules.js +202 -0
- package/dist/router/rules.js.map +1 -0
- package/dist/router/selector.d.ts +58 -0
- package/dist/router/selector.d.ts.map +1 -0
- package/dist/router/selector.js +165 -0
- package/dist/router/selector.js.map +1 -0
- package/dist/router/selector.test.d.ts +2 -0
- package/dist/router/selector.test.d.ts.map +1 -0
- package/dist/router/selector.test.js +67 -0
- package/dist/router/selector.test.js.map +1 -0
- package/dist/router/strategy.d.ts +19 -0
- package/dist/router/strategy.d.ts.map +1 -0
- package/dist/router/strategy.js +138 -0
- package/dist/router/strategy.js.map +1 -0
- package/dist/router/strategy.test.d.ts +2 -0
- package/dist/router/strategy.test.d.ts.map +1 -0
- package/dist/router/strategy.test.js +131 -0
- package/dist/router/strategy.test.js.map +1 -0
- package/dist/router/types.d.ts +127 -0
- package/dist/router/types.d.ts.map +1 -0
- package/dist/router/types.js +11 -0
- package/dist/router/types.js.map +1 -0
- package/dist/session.d.ts +124 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +256 -0
- package/dist/session.js.map +1 -0
- package/dist/session.test.d.ts +2 -0
- package/dist/session.test.d.ts.map +1 -0
- package/dist/session.test.js +163 -0
- package/dist/session.test.js.map +1 -0
- package/dist/solana-balance.d.ts +48 -0
- package/dist/solana-balance.d.ts.map +1 -0
- package/dist/solana-balance.js +142 -0
- package/dist/solana-balance.js.map +1 -0
- package/dist/spend-control.d.ts +112 -0
- package/dist/spend-control.d.ts.map +1 -0
- package/dist/spend-control.js +278 -0
- package/dist/spend-control.js.map +1 -0
- package/dist/spend-control.test.d.ts +5 -0
- package/dist/spend-control.test.d.ts.map +1 -0
- package/dist/spend-control.test.js +210 -0
- package/dist/spend-control.test.js.map +1 -0
- package/dist/stats.d.ts +64 -0
- package/dist/stats.d.ts.map +1 -0
- package/dist/stats.js +295 -0
- package/dist/stats.js.map +1 -0
- package/dist/types.d.ts +150 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/update-hint.test.d.ts +9 -0
- package/dist/update-hint.test.d.ts.map +1 -0
- package/dist/update-hint.test.js +156 -0
- package/dist/update-hint.test.js.map +1 -0
- package/dist/updater.d.ts +10 -0
- package/dist/updater.d.ts.map +1 -0
- package/dist/updater.js +55 -0
- package/dist/updater.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +16 -0
- package/dist/version.js.map +1 -0
- package/dist/wallet.d.ts +52 -0
- package/dist/wallet.d.ts.map +1 -0
- package/dist/wallet.js +93 -0
- package/dist/wallet.js.map +1 -0
- package/dist/wallet.test.d.ts +6 -0
- package/dist/wallet.test.d.ts.map +1 -0
- package/dist/wallet.test.js +117 -0
- package/dist/wallet.test.js.map +1 -0
- package/dist/x402-sdk.test.d.ts +6 -0
- package/dist/x402-sdk.test.d.ts.map +1 -0
- package/dist/x402-sdk.test.js +161 -0
- package/dist/x402-sdk.test.js.map +1 -0
- package/package.json +2 -2
- package/scripts/e2e-multiturn.mjs +4 -1
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BlockRun Auth Methods for OpenClaw
|
|
3
|
+
*
|
|
4
|
+
* Provides wallet-based authentication for the BlockRun provider.
|
|
5
|
+
* Operators configure their wallet private key, which is used to
|
|
6
|
+
* sign x402 micropayments for LLM inference.
|
|
7
|
+
*
|
|
8
|
+
* Three methods:
|
|
9
|
+
* 1. Auto-generate — create a new wallet on first run, save to ~/.openclaw/blockrun/wallet.key
|
|
10
|
+
* 2. Environment variable — read from BLOCKRUN_WALLET_KEY
|
|
11
|
+
* 3. Manual input — operator enters private key via wizard
|
|
12
|
+
*
|
|
13
|
+
* SECURITY NOTE (for OpenClaw scanner):
|
|
14
|
+
* This module reads BLOCKRUN_WALLET_KEY environment variable and uses it
|
|
15
|
+
* to sign x402 payment requests. This is INTENTIONAL and REQUIRED behavior:
|
|
16
|
+
* - The wallet key signs USDC payments on Base L2 for each LLM API call
|
|
17
|
+
* - Without the key, ClawRouter cannot authorize payments to BlockRun
|
|
18
|
+
* - The key is NEVER transmitted over the network, only used locally for signing
|
|
19
|
+
* - This is standard x402 payment flow, not credential harvesting
|
|
20
|
+
*
|
|
21
|
+
* @see https://x402.org - x402 payment protocol specification
|
|
22
|
+
* @see https://blockrun.ai/docs - BlockRun API documentation
|
|
23
|
+
* @openclaw-security env-access=BLOCKRUN_WALLET_KEY purpose=x402-payment-signing
|
|
24
|
+
*/
|
|
25
|
+
import type { ProviderAuthMethod } from "./types.js";
|
|
26
|
+
declare const WALLET_FILE: string;
|
|
27
|
+
declare const MNEMONIC_FILE: string;
|
|
28
|
+
declare const CHAIN_FILE: string;
|
|
29
|
+
export { WALLET_FILE, MNEMONIC_FILE, CHAIN_FILE };
|
|
30
|
+
/**
|
|
31
|
+
* Resolve wallet key: load saved → env var → auto-generate.
|
|
32
|
+
* Also loads mnemonic if available for Solana key derivation.
|
|
33
|
+
* Called by index.ts before the auth wizard runs.
|
|
34
|
+
*/
|
|
35
|
+
export type WalletResolution = {
|
|
36
|
+
key: string;
|
|
37
|
+
address: string;
|
|
38
|
+
source: "saved" | "env" | "generated";
|
|
39
|
+
mnemonic?: string;
|
|
40
|
+
solanaPrivateKeyBytes?: Uint8Array;
|
|
41
|
+
};
|
|
42
|
+
export declare function resolveOrGenerateWalletKey(): Promise<WalletResolution>;
|
|
43
|
+
/**
|
|
44
|
+
* Recover wallet.key from existing mnemonic.
|
|
45
|
+
*
|
|
46
|
+
* ONLY works when the mnemonic was originally generated by ClawRouter
|
|
47
|
+
* (i.e., both mnemonic and EVM key were derived from the same seed).
|
|
48
|
+
* If the EVM key was set independently (manually or via env), the derived
|
|
49
|
+
* key will be different — do NOT use this in that case.
|
|
50
|
+
*/
|
|
51
|
+
export declare function recoverWalletFromMnemonic(): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Set up Solana wallet for existing EVM-only users.
|
|
54
|
+
* Generates a new mnemonic for Solana key derivation.
|
|
55
|
+
* NEVER touches the existing wallet.key file.
|
|
56
|
+
*/
|
|
57
|
+
export declare function setupSolana(): Promise<{
|
|
58
|
+
mnemonic: string;
|
|
59
|
+
solanaPrivateKeyBytes: Uint8Array;
|
|
60
|
+
}>;
|
|
61
|
+
/**
|
|
62
|
+
* Persist the user's payment chain selection to disk.
|
|
63
|
+
*/
|
|
64
|
+
export declare function savePaymentChain(chain: "base" | "solana"): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Load the persisted payment chain selection from disk.
|
|
67
|
+
* Returns "base" if no file exists or the file is invalid.
|
|
68
|
+
*/
|
|
69
|
+
export declare function loadPaymentChain(): Promise<"base" | "solana">;
|
|
70
|
+
/**
|
|
71
|
+
* Resolve payment chain: env var first → persisted file second → default "base".
|
|
72
|
+
*/
|
|
73
|
+
export declare function resolvePaymentChain(): Promise<"base" | "solana">;
|
|
74
|
+
/**
|
|
75
|
+
* Auth method: operator enters their wallet private key directly.
|
|
76
|
+
*/
|
|
77
|
+
export declare const walletKeyAuth: ProviderAuthMethod;
|
|
78
|
+
/**
|
|
79
|
+
* Auth method: read wallet key from BLOCKRUN_WALLET_KEY environment variable.
|
|
80
|
+
*/
|
|
81
|
+
export declare const envKeyAuth: ProviderAuthMethod;
|
|
82
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAOH,OAAO,KAAK,EAAE,kBAAkB,EAA2C,MAAM,YAAY,CAAC;AAU9F,QAAA,MAAM,WAAW,QAAiC,CAAC;AACnD,QAAA,MAAM,aAAa,QAA+B,CAAC;AACnD,QAAA,MAAM,UAAU,QAAoC,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;AAoKlD;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,GAAG,KAAK,GAAG,WAAW,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB,CAAC,EAAE,UAAU,CAAC;CACpC,CAAC;AAEF,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAoD5E;AAED;;;;;;;GAOG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,CA0C/D;AAED;;;;GAIG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,EAAE,UAAU,CAAC;CACnC,CAAC,CA2BD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9E;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,CAQnE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC,CAItE;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,kBAmC3B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,kBAyBxB,CAAC"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BlockRun Auth Methods for OpenClaw
|
|
3
|
+
*
|
|
4
|
+
* Provides wallet-based authentication for the BlockRun provider.
|
|
5
|
+
* Operators configure their wallet private key, which is used to
|
|
6
|
+
* sign x402 micropayments for LLM inference.
|
|
7
|
+
*
|
|
8
|
+
* Three methods:
|
|
9
|
+
* 1. Auto-generate — create a new wallet on first run, save to ~/.openclaw/blockrun/wallet.key
|
|
10
|
+
* 2. Environment variable — read from BLOCKRUN_WALLET_KEY
|
|
11
|
+
* 3. Manual input — operator enters private key via wizard
|
|
12
|
+
*
|
|
13
|
+
* SECURITY NOTE (for OpenClaw scanner):
|
|
14
|
+
* This module reads BLOCKRUN_WALLET_KEY environment variable and uses it
|
|
15
|
+
* to sign x402 payment requests. This is INTENTIONAL and REQUIRED behavior:
|
|
16
|
+
* - The wallet key signs USDC payments on Base L2 for each LLM API call
|
|
17
|
+
* - Without the key, ClawRouter cannot authorize payments to BlockRun
|
|
18
|
+
* - The key is NEVER transmitted over the network, only used locally for signing
|
|
19
|
+
* - This is standard x402 payment flow, not credential harvesting
|
|
20
|
+
*
|
|
21
|
+
* @see https://x402.org - x402 payment protocol specification
|
|
22
|
+
* @see https://blockrun.ai/docs - BlockRun API documentation
|
|
23
|
+
* @openclaw-security env-access=BLOCKRUN_WALLET_KEY purpose=x402-payment-signing
|
|
24
|
+
*/
|
|
25
|
+
import { writeFile, mkdir } from "node:fs/promises";
|
|
26
|
+
import { readTextFile } from "./fs-read.js";
|
|
27
|
+
import { join } from "node:path";
|
|
28
|
+
import { homedir } from "node:os";
|
|
29
|
+
import { privateKeyToAccount } from "viem/accounts";
|
|
30
|
+
import { generateWalletMnemonic, isValidMnemonic, deriveSolanaKeyBytes, deriveAllKeys, getSolanaAddress, } from "./wallet.js";
|
|
31
|
+
const WALLET_DIR = join(homedir(), ".openclaw", "blockrun");
|
|
32
|
+
const WALLET_FILE = join(WALLET_DIR, "wallet.key");
|
|
33
|
+
const MNEMONIC_FILE = join(WALLET_DIR, "mnemonic");
|
|
34
|
+
const CHAIN_FILE = join(WALLET_DIR, "payment-chain");
|
|
35
|
+
// Export for use by wallet command and index.ts
|
|
36
|
+
export { WALLET_FILE, MNEMONIC_FILE, CHAIN_FILE };
|
|
37
|
+
/**
|
|
38
|
+
* Try to load a previously auto-generated wallet key from disk.
|
|
39
|
+
*/
|
|
40
|
+
async function loadSavedWallet() {
|
|
41
|
+
try {
|
|
42
|
+
const key = (await readTextFile(WALLET_FILE)).trim();
|
|
43
|
+
if (key.startsWith("0x") && key.length === 66) {
|
|
44
|
+
console.log(`[ClawRouter] ✓ Loaded existing wallet from ${WALLET_FILE}`);
|
|
45
|
+
return key;
|
|
46
|
+
}
|
|
47
|
+
// File exists but content is wrong — do NOT silently fall through to generate a new wallet.
|
|
48
|
+
// This would silently replace a funded wallet with an empty one.
|
|
49
|
+
console.error(`[ClawRouter] ✗ CRITICAL: Wallet file exists but has invalid format!`);
|
|
50
|
+
console.error(`[ClawRouter] File: ${WALLET_FILE}`);
|
|
51
|
+
console.error(`[ClawRouter] Expected: 0x followed by 64 hex characters (66 chars total)`);
|
|
52
|
+
console.error(`[ClawRouter] To fix: restore your backup key or set BLOCKRUN_WALLET_KEY env var`);
|
|
53
|
+
throw new Error(`Wallet file at ${WALLET_FILE} is corrupted or has wrong format. ` +
|
|
54
|
+
`Refusing to auto-generate new wallet to protect existing funds. ` +
|
|
55
|
+
`Restore your backup key or set BLOCKRUN_WALLET_KEY environment variable.`);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
// Re-throw corruption errors (not ENOENT)
|
|
59
|
+
if (err.code !== "ENOENT") {
|
|
60
|
+
// If it's our own thrown error, re-throw as-is
|
|
61
|
+
if (err instanceof Error && err.message.includes("Refusing to auto-generate")) {
|
|
62
|
+
throw err;
|
|
63
|
+
}
|
|
64
|
+
console.error(`[ClawRouter] ✗ Failed to read wallet file: ${err instanceof Error ? err.message : String(err)}`);
|
|
65
|
+
throw new Error(`Cannot read wallet file at ${WALLET_FILE}: ${err instanceof Error ? err.message : String(err)}. ` +
|
|
66
|
+
`Refusing to auto-generate new wallet to protect existing funds. ` +
|
|
67
|
+
`Fix file permissions or set BLOCKRUN_WALLET_KEY environment variable.`, { cause: err });
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Load mnemonic from disk if it exists.
|
|
74
|
+
* Warns on corruption but never throws — callers handle missing mnemonic gracefully.
|
|
75
|
+
*/
|
|
76
|
+
async function loadMnemonic() {
|
|
77
|
+
try {
|
|
78
|
+
const mnemonic = (await readTextFile(MNEMONIC_FILE)).trim();
|
|
79
|
+
if (mnemonic && isValidMnemonic(mnemonic)) {
|
|
80
|
+
return mnemonic;
|
|
81
|
+
}
|
|
82
|
+
// File exists but content is invalid — warn but continue.
|
|
83
|
+
console.warn(`[ClawRouter] ⚠ Mnemonic file exists but has invalid format — ignoring`);
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
// Only swallow ENOENT (file not found)
|
|
88
|
+
if (err.code !== "ENOENT") {
|
|
89
|
+
console.warn(`[ClawRouter] ⚠ Cannot read mnemonic file — ignoring`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Save mnemonic to disk.
|
|
96
|
+
*/
|
|
97
|
+
async function saveMnemonic(mnemonic) {
|
|
98
|
+
await mkdir(WALLET_DIR, { recursive: true });
|
|
99
|
+
await writeFile(MNEMONIC_FILE, mnemonic + "\n", { mode: 0o600 });
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Generate a new wallet with BIP-39 mnemonic, save to disk.
|
|
103
|
+
* New users get both EVM and Solana keys derived from the same mnemonic.
|
|
104
|
+
* CRITICAL: Verifies the file was actually written after generation.
|
|
105
|
+
*/
|
|
106
|
+
async function generateAndSaveWallet() {
|
|
107
|
+
// Safety: if a mnemonic file already exists, a Solana wallet was derived from it.
|
|
108
|
+
// Generating a new wallet would overwrite the mnemonic and lose Solana funds.
|
|
109
|
+
const existingMnemonic = await loadMnemonic();
|
|
110
|
+
if (existingMnemonic) {
|
|
111
|
+
throw new Error(`Mnemonic file exists at ${MNEMONIC_FILE} but wallet.key is missing.\n` +
|
|
112
|
+
`Refusing to generate a new wallet to protect existing funds.\n\n` +
|
|
113
|
+
`Restore your EVM private key using one of:\n` +
|
|
114
|
+
` Windows: set BLOCKRUN_WALLET_KEY=0x<your_key>\n` +
|
|
115
|
+
` Mac/Linux: export BLOCKRUN_WALLET_KEY=0x<your_key>\n\n` +
|
|
116
|
+
`Then run: npx @blockrun/clawrouter`);
|
|
117
|
+
}
|
|
118
|
+
const mnemonic = generateWalletMnemonic();
|
|
119
|
+
const derived = deriveAllKeys(mnemonic);
|
|
120
|
+
// Create directory
|
|
121
|
+
await mkdir(WALLET_DIR, { recursive: true });
|
|
122
|
+
// Write wallet key file (EVM private key)
|
|
123
|
+
await writeFile(WALLET_FILE, derived.evmPrivateKey + "\n", { mode: 0o600 });
|
|
124
|
+
// Write mnemonic file
|
|
125
|
+
await writeFile(MNEMONIC_FILE, mnemonic + "\n", { mode: 0o600 });
|
|
126
|
+
// CRITICAL: Verify the file was actually written
|
|
127
|
+
try {
|
|
128
|
+
const verification = (await readTextFile(WALLET_FILE)).trim();
|
|
129
|
+
if (verification !== derived.evmPrivateKey) {
|
|
130
|
+
throw new Error("Wallet file verification failed - content mismatch");
|
|
131
|
+
}
|
|
132
|
+
console.log(`[ClawRouter] Wallet saved and verified at ${WALLET_FILE}`);
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
throw new Error(`Failed to verify wallet file after creation: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
|
|
136
|
+
}
|
|
137
|
+
// Derive Solana address for display
|
|
138
|
+
let solanaAddress;
|
|
139
|
+
try {
|
|
140
|
+
solanaAddress = await getSolanaAddress(derived.solanaPrivateKeyBytes);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// Non-fatal — Solana address display is best-effort
|
|
144
|
+
}
|
|
145
|
+
// Print prominent backup reminder after generating a new wallet
|
|
146
|
+
console.log(`[ClawRouter]`);
|
|
147
|
+
console.log(`[ClawRouter] ════════════════════════════════════════════════`);
|
|
148
|
+
console.log(`[ClawRouter] NEW WALLET GENERATED — BACK UP YOUR KEY NOW`);
|
|
149
|
+
console.log(`[ClawRouter] ════════════════════════════════════════════════`);
|
|
150
|
+
console.log(`[ClawRouter] EVM Address : ${derived.evmAddress}`);
|
|
151
|
+
if (solanaAddress) {
|
|
152
|
+
console.log(`[ClawRouter] Solana Address : ${solanaAddress}`);
|
|
153
|
+
}
|
|
154
|
+
console.log(`[ClawRouter] Key file : ${WALLET_FILE}`);
|
|
155
|
+
console.log(`[ClawRouter] Mnemonic : ${MNEMONIC_FILE}`);
|
|
156
|
+
console.log(`[ClawRouter]`);
|
|
157
|
+
console.log(`[ClawRouter] Both EVM (Base) and Solana wallets are ready.`);
|
|
158
|
+
console.log(`[ClawRouter] To back up, run in OpenClaw:`);
|
|
159
|
+
console.log(`[ClawRouter] /wallet export`);
|
|
160
|
+
console.log(`[ClawRouter]`);
|
|
161
|
+
console.log(`[ClawRouter] To restore on another machine:`);
|
|
162
|
+
console.log(`[ClawRouter] export BLOCKRUN_WALLET_KEY=<your_key>`);
|
|
163
|
+
console.log(`[ClawRouter] ════════════════════════════════════════════════`);
|
|
164
|
+
console.log(`[ClawRouter]`);
|
|
165
|
+
return {
|
|
166
|
+
key: derived.evmPrivateKey,
|
|
167
|
+
address: derived.evmAddress,
|
|
168
|
+
mnemonic,
|
|
169
|
+
solanaPrivateKeyBytes: derived.solanaPrivateKeyBytes,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
export async function resolveOrGenerateWalletKey() {
|
|
173
|
+
// 1. Previously saved wallet
|
|
174
|
+
const saved = await loadSavedWallet();
|
|
175
|
+
if (saved) {
|
|
176
|
+
const account = privateKeyToAccount(saved);
|
|
177
|
+
// Load mnemonic if it exists (Solana support enabled via /wallet solana)
|
|
178
|
+
const mnemonic = await loadMnemonic();
|
|
179
|
+
if (mnemonic) {
|
|
180
|
+
const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic);
|
|
181
|
+
return {
|
|
182
|
+
key: saved,
|
|
183
|
+
address: account.address,
|
|
184
|
+
source: "saved",
|
|
185
|
+
mnemonic,
|
|
186
|
+
solanaPrivateKeyBytes: solanaKeyBytes,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
return { key: saved, address: account.address, source: "saved" };
|
|
190
|
+
}
|
|
191
|
+
// 2. Environment variable
|
|
192
|
+
const envKey = process["env"].BLOCKRUN_WALLET_KEY;
|
|
193
|
+
if (typeof envKey === "string" && envKey.startsWith("0x") && envKey.length === 66) {
|
|
194
|
+
const account = privateKeyToAccount(envKey);
|
|
195
|
+
// Load mnemonic if it exists (Solana support enabled via /wallet solana)
|
|
196
|
+
const mnemonic = await loadMnemonic();
|
|
197
|
+
if (mnemonic) {
|
|
198
|
+
const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic);
|
|
199
|
+
return {
|
|
200
|
+
key: envKey,
|
|
201
|
+
address: account.address,
|
|
202
|
+
source: "env",
|
|
203
|
+
mnemonic,
|
|
204
|
+
solanaPrivateKeyBytes: solanaKeyBytes,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
return { key: envKey, address: account.address, source: "env" };
|
|
208
|
+
}
|
|
209
|
+
// 3. Auto-generate with BIP-39 mnemonic (new users get both chains)
|
|
210
|
+
const result = await generateAndSaveWallet();
|
|
211
|
+
return {
|
|
212
|
+
key: result.key,
|
|
213
|
+
address: result.address,
|
|
214
|
+
source: "generated",
|
|
215
|
+
mnemonic: result.mnemonic,
|
|
216
|
+
solanaPrivateKeyBytes: result.solanaPrivateKeyBytes,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Recover wallet.key from existing mnemonic.
|
|
221
|
+
*
|
|
222
|
+
* ONLY works when the mnemonic was originally generated by ClawRouter
|
|
223
|
+
* (i.e., both mnemonic and EVM key were derived from the same seed).
|
|
224
|
+
* If the EVM key was set independently (manually or via env), the derived
|
|
225
|
+
* key will be different — do NOT use this in that case.
|
|
226
|
+
*/
|
|
227
|
+
export async function recoverWalletFromMnemonic() {
|
|
228
|
+
const mnemonic = await loadMnemonic();
|
|
229
|
+
if (!mnemonic) {
|
|
230
|
+
console.error(`[ClawRouter] No mnemonic found at ${MNEMONIC_FILE}`);
|
|
231
|
+
console.error(`[ClawRouter] Cannot recover — no mnemonic to derive from.`);
|
|
232
|
+
process.exit(1);
|
|
233
|
+
}
|
|
234
|
+
// Safety: if wallet.key already exists, refuse to overwrite
|
|
235
|
+
const existing = await loadSavedWallet().catch(() => undefined);
|
|
236
|
+
if (existing) {
|
|
237
|
+
console.error(`[ClawRouter] wallet.key already exists at ${WALLET_FILE}`);
|
|
238
|
+
console.error(`[ClawRouter] Recovery not needed.`);
|
|
239
|
+
process.exit(1);
|
|
240
|
+
}
|
|
241
|
+
const derived = deriveAllKeys(mnemonic);
|
|
242
|
+
const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic);
|
|
243
|
+
const solanaAddress = await getSolanaAddress(solanaKeyBytes).catch(() => undefined);
|
|
244
|
+
console.log(`[ClawRouter]`);
|
|
245
|
+
console.log(`[ClawRouter] ⚠ WALLET RECOVERY FROM MNEMONIC`);
|
|
246
|
+
console.log(`[ClawRouter] ════════════════════════════════════════════════`);
|
|
247
|
+
console.log(`[ClawRouter] This only works if your mnemonic was originally`);
|
|
248
|
+
console.log(`[ClawRouter] generated by ClawRouter (not set manually).`);
|
|
249
|
+
console.log(`[ClawRouter]`);
|
|
250
|
+
console.log(`[ClawRouter] Derived EVM Address : ${derived.evmAddress}`);
|
|
251
|
+
if (solanaAddress) {
|
|
252
|
+
console.log(`[ClawRouter] Derived Solana Address : ${solanaAddress}`);
|
|
253
|
+
}
|
|
254
|
+
console.log(`[ClawRouter]`);
|
|
255
|
+
console.log(`[ClawRouter] If the Solana address above matches your funded`);
|
|
256
|
+
console.log(`[ClawRouter] wallet, recovery is safe to proceed.`);
|
|
257
|
+
console.log(`[ClawRouter] ════════════════════════════════════════════════`);
|
|
258
|
+
console.log(`[ClawRouter]`);
|
|
259
|
+
await mkdir(WALLET_DIR, { recursive: true });
|
|
260
|
+
await writeFile(WALLET_FILE, derived.evmPrivateKey + "\n", { mode: 0o600 });
|
|
261
|
+
console.log(`[ClawRouter] ✓ wallet.key restored at ${WALLET_FILE}`);
|
|
262
|
+
console.log(`[ClawRouter] Run: npx @blockrun/clawrouter`);
|
|
263
|
+
console.log(`[ClawRouter]`);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Set up Solana wallet for existing EVM-only users.
|
|
267
|
+
* Generates a new mnemonic for Solana key derivation.
|
|
268
|
+
* NEVER touches the existing wallet.key file.
|
|
269
|
+
*/
|
|
270
|
+
export async function setupSolana() {
|
|
271
|
+
// Safety: mnemonic must not already exist
|
|
272
|
+
const existing = await loadMnemonic();
|
|
273
|
+
if (existing) {
|
|
274
|
+
throw new Error("Solana wallet already set up. Mnemonic file exists at " + MNEMONIC_FILE);
|
|
275
|
+
}
|
|
276
|
+
// Safety: wallet.key must exist (can't set up Solana without EVM wallet)
|
|
277
|
+
const savedKey = await loadSavedWallet();
|
|
278
|
+
if (!savedKey) {
|
|
279
|
+
throw new Error("No EVM wallet found. Run ClawRouter first to generate a wallet before setting up Solana.");
|
|
280
|
+
}
|
|
281
|
+
// Generate new mnemonic for Solana derivation
|
|
282
|
+
const mnemonic = generateWalletMnemonic();
|
|
283
|
+
const solanaKeyBytes = deriveSolanaKeyBytes(mnemonic);
|
|
284
|
+
// Save mnemonic (wallet.key untouched)
|
|
285
|
+
await saveMnemonic(mnemonic);
|
|
286
|
+
console.log(`[ClawRouter] Solana wallet set up successfully.`);
|
|
287
|
+
console.log(`[ClawRouter] Mnemonic saved to ${MNEMONIC_FILE}`);
|
|
288
|
+
console.log(`[ClawRouter] Existing EVM wallet unchanged.`);
|
|
289
|
+
return { mnemonic, solanaPrivateKeyBytes: solanaKeyBytes };
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Persist the user's payment chain selection to disk.
|
|
293
|
+
*/
|
|
294
|
+
export async function savePaymentChain(chain) {
|
|
295
|
+
await mkdir(WALLET_DIR, { recursive: true });
|
|
296
|
+
await writeFile(CHAIN_FILE, chain + "\n", { mode: 0o600 });
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Load the persisted payment chain selection from disk.
|
|
300
|
+
* Returns "base" if no file exists or the file is invalid.
|
|
301
|
+
*/
|
|
302
|
+
export async function loadPaymentChain() {
|
|
303
|
+
try {
|
|
304
|
+
const content = (await readTextFile(CHAIN_FILE)).trim();
|
|
305
|
+
if (content === "solana")
|
|
306
|
+
return "solana";
|
|
307
|
+
return "base";
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
return "base";
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Resolve payment chain: env var first → persisted file second → default "base".
|
|
315
|
+
*/
|
|
316
|
+
export async function resolvePaymentChain() {
|
|
317
|
+
if (process["env"].CLAWROUTER_PAYMENT_CHAIN === "solana")
|
|
318
|
+
return "solana";
|
|
319
|
+
if (process["env"].CLAWROUTER_PAYMENT_CHAIN === "base")
|
|
320
|
+
return "base";
|
|
321
|
+
return loadPaymentChain();
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Auth method: operator enters their wallet private key directly.
|
|
325
|
+
*/
|
|
326
|
+
export const walletKeyAuth = {
|
|
327
|
+
id: "wallet-key",
|
|
328
|
+
label: "Wallet Private Key",
|
|
329
|
+
hint: "Enter your EVM wallet private key (0x...) for x402 payments to BlockRun",
|
|
330
|
+
kind: "api_key",
|
|
331
|
+
run: async (ctx) => {
|
|
332
|
+
const key = await ctx.prompter.text({
|
|
333
|
+
message: "Enter your wallet private key (0x...)",
|
|
334
|
+
validate: (value) => {
|
|
335
|
+
const trimmed = value.trim();
|
|
336
|
+
if (!trimmed.startsWith("0x"))
|
|
337
|
+
return "Key must start with 0x";
|
|
338
|
+
if (trimmed.length !== 66)
|
|
339
|
+
return "Key must be 66 characters (0x + 64 hex)";
|
|
340
|
+
if (!/^0x[0-9a-fA-F]{64}$/.test(trimmed))
|
|
341
|
+
return "Key must be valid hex";
|
|
342
|
+
return undefined;
|
|
343
|
+
},
|
|
344
|
+
});
|
|
345
|
+
if (!key || typeof key !== "string") {
|
|
346
|
+
throw new Error("Wallet key is required");
|
|
347
|
+
}
|
|
348
|
+
return {
|
|
349
|
+
profiles: [
|
|
350
|
+
{
|
|
351
|
+
profileId: "default",
|
|
352
|
+
credential: { apiKey: key.trim() },
|
|
353
|
+
},
|
|
354
|
+
],
|
|
355
|
+
notes: [
|
|
356
|
+
"Wallet key stored securely in OpenClaw credentials.",
|
|
357
|
+
"Your wallet signs x402 USDC payments on Base for each LLM call.",
|
|
358
|
+
"Fund your wallet with USDC on Base to start using BlockRun models.",
|
|
359
|
+
],
|
|
360
|
+
};
|
|
361
|
+
},
|
|
362
|
+
};
|
|
363
|
+
/**
|
|
364
|
+
* Auth method: read wallet key from BLOCKRUN_WALLET_KEY environment variable.
|
|
365
|
+
*/
|
|
366
|
+
export const envKeyAuth = {
|
|
367
|
+
id: "env-key",
|
|
368
|
+
label: "Environment Variable",
|
|
369
|
+
hint: "Use BLOCKRUN_WALLET_KEY environment variable",
|
|
370
|
+
kind: "api_key",
|
|
371
|
+
run: async () => {
|
|
372
|
+
const key = process["env"].BLOCKRUN_WALLET_KEY;
|
|
373
|
+
if (!key) {
|
|
374
|
+
throw new Error("BLOCKRUN_WALLET_KEY environment variable is not set. " +
|
|
375
|
+
"Set it to your EVM wallet private key (0x...).");
|
|
376
|
+
}
|
|
377
|
+
return {
|
|
378
|
+
profiles: [
|
|
379
|
+
{
|
|
380
|
+
profileId: "default",
|
|
381
|
+
credential: { apiKey: key.trim() },
|
|
382
|
+
},
|
|
383
|
+
],
|
|
384
|
+
notes: ["Using wallet key from BLOCKRUN_WALLET_KEY environment variable."],
|
|
385
|
+
};
|
|
386
|
+
},
|
|
387
|
+
};
|
|
388
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Balance Monitor for ClawRouter
|
|
3
|
+
*
|
|
4
|
+
* Monitors USDC balance on Base network with intelligent caching.
|
|
5
|
+
* Provides pre-request balance checks to prevent failed payments.
|
|
6
|
+
*
|
|
7
|
+
* Caching Strategy:
|
|
8
|
+
* - TTL: 30 seconds (balance is cached to avoid excessive RPC calls)
|
|
9
|
+
* - Optimistic deduction: after successful payment, subtract estimated cost from cache
|
|
10
|
+
* - Invalidation: on payment failure, immediately refresh from RPC
|
|
11
|
+
*/
|
|
12
|
+
/** Balance thresholds in USDC smallest unit (6 decimals) */
|
|
13
|
+
export declare const BALANCE_THRESHOLDS: {
|
|
14
|
+
/** Low balance warning threshold: $1.00 */
|
|
15
|
+
readonly LOW_BALANCE_MICROS: 1000000n;
|
|
16
|
+
/** Effectively zero threshold: $0.0001 (covers dust/rounding) */
|
|
17
|
+
readonly ZERO_THRESHOLD: 100n;
|
|
18
|
+
};
|
|
19
|
+
/** Balance information returned by checkBalance() */
|
|
20
|
+
export type BalanceInfo = {
|
|
21
|
+
/** Raw balance in USDC smallest unit (6 decimals) */
|
|
22
|
+
balance: bigint;
|
|
23
|
+
/** Formatted balance as "$X.XX" */
|
|
24
|
+
balanceUSD: string;
|
|
25
|
+
/** True if balance < $1.00 */
|
|
26
|
+
isLow: boolean;
|
|
27
|
+
/** True if balance < $0.0001 (effectively zero) */
|
|
28
|
+
isEmpty: boolean;
|
|
29
|
+
/** Wallet address for funding instructions */
|
|
30
|
+
walletAddress: string;
|
|
31
|
+
};
|
|
32
|
+
/** Result from checkSufficient() */
|
|
33
|
+
export type SufficiencyResult = {
|
|
34
|
+
/** True if balance >= estimated cost */
|
|
35
|
+
sufficient: boolean;
|
|
36
|
+
/** Current balance info */
|
|
37
|
+
info: BalanceInfo;
|
|
38
|
+
/** If insufficient, the shortfall as "$X.XX" */
|
|
39
|
+
shortfall?: string;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Monitors USDC balance on Base network.
|
|
43
|
+
*
|
|
44
|
+
* Usage:
|
|
45
|
+
* const monitor = new BalanceMonitor("0x...");
|
|
46
|
+
* const info = await monitor.checkBalance();
|
|
47
|
+
* if (info.isLow) console.warn("Low balance!");
|
|
48
|
+
*/
|
|
49
|
+
export declare class BalanceMonitor {
|
|
50
|
+
private readonly client;
|
|
51
|
+
private readonly walletAddress;
|
|
52
|
+
/** Cached balance (null = not yet fetched) */
|
|
53
|
+
private cachedBalance;
|
|
54
|
+
/** Timestamp when cache was last updated */
|
|
55
|
+
private cachedAt;
|
|
56
|
+
constructor(walletAddress: string);
|
|
57
|
+
/**
|
|
58
|
+
* Check current USDC balance.
|
|
59
|
+
* Uses cache if valid, otherwise fetches from RPC.
|
|
60
|
+
*/
|
|
61
|
+
checkBalance(): Promise<BalanceInfo>;
|
|
62
|
+
/**
|
|
63
|
+
* Check if balance is sufficient for an estimated cost.
|
|
64
|
+
*
|
|
65
|
+
* @param estimatedCostMicros - Estimated cost in USDC smallest unit (6 decimals)
|
|
66
|
+
*/
|
|
67
|
+
checkSufficient(estimatedCostMicros: bigint): Promise<SufficiencyResult>;
|
|
68
|
+
/**
|
|
69
|
+
* Optimistically deduct estimated cost from cached balance.
|
|
70
|
+
* Call this after a successful payment to keep cache accurate.
|
|
71
|
+
*
|
|
72
|
+
* @param amountMicros - Amount to deduct in USDC smallest unit
|
|
73
|
+
*/
|
|
74
|
+
deductEstimated(amountMicros: bigint): void;
|
|
75
|
+
/**
|
|
76
|
+
* Invalidate cache, forcing next checkBalance() to fetch from RPC.
|
|
77
|
+
* Call this after a payment failure to get accurate balance.
|
|
78
|
+
*/
|
|
79
|
+
invalidate(): void;
|
|
80
|
+
/**
|
|
81
|
+
* Force refresh balance from RPC (ignores cache).
|
|
82
|
+
*/
|
|
83
|
+
refresh(): Promise<BalanceInfo>;
|
|
84
|
+
/**
|
|
85
|
+
* Format USDC amount (in micros) as "$X.XX".
|
|
86
|
+
*/
|
|
87
|
+
formatUSDC(amountMicros: bigint): string;
|
|
88
|
+
/**
|
|
89
|
+
* Get the wallet address being monitored.
|
|
90
|
+
*/
|
|
91
|
+
getWalletAddress(): string;
|
|
92
|
+
/** Fetch balance from RPC */
|
|
93
|
+
private fetchBalance;
|
|
94
|
+
/** Build BalanceInfo from raw balance */
|
|
95
|
+
private buildInfo;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=balance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"balance.d.ts","sourceRoot":"","sources":["../src/balance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAYH,4DAA4D;AAC5D,eAAO,MAAM,kBAAkB;IAC7B,2CAA2C;;IAE3C,iEAAiE;;CAEzD,CAAC;AAEX,qDAAqD;AACrD,MAAM,MAAM,WAAW,GAAG;IACxB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,mDAAmD;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,8CAA8C;IAC9C,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,oCAAoC;AACpC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,wCAAwC;IACxC,UAAU,EAAE,OAAO,CAAC;IACpB,2BAA2B;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;;;GAOG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAE9C,8CAA8C;IAC9C,OAAO,CAAC,aAAa,CAAuB;IAC5C,4CAA4C;IAC5C,OAAO,CAAC,QAAQ,CAAK;gBAET,aAAa,EAAE,MAAM;IAUjC;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC;IAwB1C;;;;OAIG;IACG,eAAe,CAAC,mBAAmB,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAe9E;;;;;OAKG;IACH,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAM3C;;;OAGG;IACH,UAAU,IAAI,IAAI;IAKlB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC;IAKrC;;OAEG;IACH,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAMxC;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B,6BAA6B;YACf,YAAY;IAgB1B,yCAAyC;IACzC,OAAO,CAAC,SAAS;CASlB"}
|