@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-hint.test.js","sourceRoot":"","sources":["../src/update-hint.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-update checker for ClawRouter.
|
|
3
|
+
* Checks npm registry on startup and notifies user if update available.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Check npm registry for latest version.
|
|
7
|
+
* Non-blocking, silent on errors.
|
|
8
|
+
*/
|
|
9
|
+
export declare function checkForUpdates(): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=updater.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../src/updater.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuBH;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CA2BrD"}
|
package/dist/updater.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-update checker for ClawRouter.
|
|
3
|
+
* Checks npm registry on startup and notifies user if update available.
|
|
4
|
+
*/
|
|
5
|
+
import { VERSION } from "./version.js";
|
|
6
|
+
const NPM_REGISTRY = "https://registry.npmjs.org/@blockrun/clawrouter/latest";
|
|
7
|
+
const CHECK_TIMEOUT_MS = 5_000; // Don't block startup for more than 5s
|
|
8
|
+
/**
|
|
9
|
+
* Compare semver versions. Returns:
|
|
10
|
+
* 1 if a > b
|
|
11
|
+
* 0 if a === b
|
|
12
|
+
* -1 if a < b
|
|
13
|
+
*/
|
|
14
|
+
function compareSemver(a, b) {
|
|
15
|
+
const pa = a.split(".").map(Number);
|
|
16
|
+
const pb = b.split(".").map(Number);
|
|
17
|
+
for (let i = 0; i < 3; i++) {
|
|
18
|
+
if ((pa[i] || 0) > (pb[i] || 0))
|
|
19
|
+
return 1;
|
|
20
|
+
if ((pa[i] || 0) < (pb[i] || 0))
|
|
21
|
+
return -1;
|
|
22
|
+
}
|
|
23
|
+
return 0;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Check npm registry for latest version.
|
|
27
|
+
* Non-blocking, silent on errors.
|
|
28
|
+
*/
|
|
29
|
+
export async function checkForUpdates() {
|
|
30
|
+
try {
|
|
31
|
+
const controller = new AbortController();
|
|
32
|
+
const timeout = setTimeout(() => controller.abort(), CHECK_TIMEOUT_MS);
|
|
33
|
+
const res = await fetch(NPM_REGISTRY, {
|
|
34
|
+
signal: controller.signal,
|
|
35
|
+
headers: { Accept: "application/json" },
|
|
36
|
+
});
|
|
37
|
+
clearTimeout(timeout);
|
|
38
|
+
if (!res.ok)
|
|
39
|
+
return;
|
|
40
|
+
const data = (await res.json());
|
|
41
|
+
const latest = data.version;
|
|
42
|
+
if (!latest)
|
|
43
|
+
return;
|
|
44
|
+
if (compareSemver(latest, VERSION) > 0) {
|
|
45
|
+
console.log("");
|
|
46
|
+
console.log(`\x1b[33m⬆️ ClawRouter ${latest} available (you have ${VERSION})\x1b[0m`);
|
|
47
|
+
console.log(` Run: \x1b[36mnpx @blockrun/clawrouter@latest\x1b[0m`);
|
|
48
|
+
console.log("");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Silent fail - don't disrupt startup
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=updater.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updater.js","sourceRoot":"","sources":["../src/updater.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,YAAY,GAAG,wDAAwD,CAAC;AAC9E,MAAM,gBAAgB,GAAG,KAAK,CAAC,CAAC,uCAAuC;AAEvE;;;;;GAKG;AACH,SAAS,aAAa,CAAC,CAAS,EAAE,CAAS;IACzC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAEvE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE;YACpC,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;SACxC,CAAC,CAAC;QACH,YAAY,CAAC,OAAO,CAAC,CAAC;QAEtB,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO;QAEpB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyB,CAAC;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;QAE5B,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,IAAI,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,wBAAwB,OAAO,UAAU,CAAC,CAAC;YACvF,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;YACtE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,OAAO,QAAc,CAAC;AACnC,eAAO,MAAM,UAAU,QAA0B,CAAC"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single source of truth for version.
|
|
3
|
+
* Reads from package.json at build time via tsup's define.
|
|
4
|
+
*/
|
|
5
|
+
import { createRequire } from "node:module";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
import { dirname, join } from "node:path";
|
|
8
|
+
// Read package.json at runtime
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const __dirname = dirname(__filename);
|
|
11
|
+
// In dist/, go up one level to find package.json
|
|
12
|
+
const require = createRequire(import.meta.url);
|
|
13
|
+
const pkg = require(join(__dirname, "..", "package.json"));
|
|
14
|
+
export const VERSION = pkg.version;
|
|
15
|
+
export const USER_AGENT = `clawrouter/${VERSION}`;
|
|
16
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,+BAA+B;AAC/B,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,iDAAiD;AACjD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAwB,CAAC;AAElF,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;AACnC,MAAM,CAAC,MAAM,UAAU,GAAG,cAAc,OAAO,EAAE,CAAC"}
|
package/dist/wallet.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wallet Key Derivation
|
|
3
|
+
*
|
|
4
|
+
* BIP-39 mnemonic generation + BIP-44 HD key derivation for EVM and Solana.
|
|
5
|
+
* Absorbed from @blockrun/clawwallet. No file I/O here - auth.ts handles persistence.
|
|
6
|
+
*
|
|
7
|
+
* Solana uses SLIP-10 Ed25519 derivation (Phantom/Solflare/Backpack compatible).
|
|
8
|
+
* EVM uses standard BIP-32 secp256k1 derivation.
|
|
9
|
+
*/
|
|
10
|
+
export interface DerivedKeys {
|
|
11
|
+
mnemonic: string;
|
|
12
|
+
evmPrivateKey: `0x${string}`;
|
|
13
|
+
evmAddress: string;
|
|
14
|
+
solanaPrivateKeyBytes: Uint8Array;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Generate a 24-word BIP-39 mnemonic.
|
|
18
|
+
*/
|
|
19
|
+
export declare function generateWalletMnemonic(): string;
|
|
20
|
+
/**
|
|
21
|
+
* Validate a BIP-39 mnemonic.
|
|
22
|
+
*/
|
|
23
|
+
export declare function isValidMnemonic(mnemonic: string): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Derive EVM private key and address from a BIP-39 mnemonic.
|
|
26
|
+
* Path: m/44'/60'/0'/0/0 (standard Ethereum derivation)
|
|
27
|
+
*/
|
|
28
|
+
export declare function deriveEvmKey(mnemonic: string): {
|
|
29
|
+
privateKey: `0x${string}`;
|
|
30
|
+
address: string;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Derive 32-byte Solana private key using SLIP-10 Ed25519 derivation.
|
|
34
|
+
* Path: m/44'/501'/0'/0' (Phantom / Solflare / Backpack compatible)
|
|
35
|
+
*
|
|
36
|
+
* Algorithm (SLIP-0010 for Ed25519):
|
|
37
|
+
* 1. Master: HMAC-SHA512(key="ed25519 seed", data=bip39_seed) → IL=key, IR=chainCode
|
|
38
|
+
* 2. For each hardened child index:
|
|
39
|
+
* HMAC-SHA512(key=chainCode, data=0x00 || key || ser32(index)) → split again
|
|
40
|
+
* 3. Final IL (32 bytes) = Ed25519 private key seed
|
|
41
|
+
*/
|
|
42
|
+
export declare function deriveSolanaKeyBytes(mnemonic: string): Uint8Array;
|
|
43
|
+
/**
|
|
44
|
+
* Derive both EVM and Solana keys from a single mnemonic.
|
|
45
|
+
*/
|
|
46
|
+
export declare function deriveAllKeys(mnemonic: string): DerivedKeys;
|
|
47
|
+
/**
|
|
48
|
+
* Get the Solana address from 32-byte private key bytes.
|
|
49
|
+
* Uses @solana/kit's createKeyPairSignerFromPrivateKeyBytes (dynamic import).
|
|
50
|
+
*/
|
|
51
|
+
export declare function getSolanaAddress(privateKeyBytes: Uint8Array): Promise<string>;
|
|
52
|
+
//# sourceMappingURL=wallet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAYH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,KAAK,MAAM,EAAE,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB,EAAE,UAAU,CAAC;CACnC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAQ7F;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAwBjE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAI3D;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,eAAe,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAInF"}
|
package/dist/wallet.js
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wallet Key Derivation
|
|
3
|
+
*
|
|
4
|
+
* BIP-39 mnemonic generation + BIP-44 HD key derivation for EVM and Solana.
|
|
5
|
+
* Absorbed from @blockrun/clawwallet. No file I/O here - auth.ts handles persistence.
|
|
6
|
+
*
|
|
7
|
+
* Solana uses SLIP-10 Ed25519 derivation (Phantom/Solflare/Backpack compatible).
|
|
8
|
+
* EVM uses standard BIP-32 secp256k1 derivation.
|
|
9
|
+
*/
|
|
10
|
+
import { HDKey } from "@scure/bip32";
|
|
11
|
+
import { generateMnemonic, mnemonicToSeedSync, validateMnemonic } from "@scure/bip39";
|
|
12
|
+
import { wordlist as english } from "@scure/bip39/wordlists/english";
|
|
13
|
+
import { hmac } from "@noble/hashes/hmac";
|
|
14
|
+
import { sha512 } from "@noble/hashes/sha512";
|
|
15
|
+
import { privateKeyToAccount } from "viem/accounts";
|
|
16
|
+
const ETH_DERIVATION_PATH = "m/44'/60'/0'/0/0";
|
|
17
|
+
const SOLANA_HARDENED_INDICES = [44 + 0x80000000, 501 + 0x80000000, 0 + 0x80000000, 0 + 0x80000000]; // m/44'/501'/0'/0'
|
|
18
|
+
/**
|
|
19
|
+
* Generate a 24-word BIP-39 mnemonic.
|
|
20
|
+
*/
|
|
21
|
+
export function generateWalletMnemonic() {
|
|
22
|
+
return generateMnemonic(english, 256);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Validate a BIP-39 mnemonic.
|
|
26
|
+
*/
|
|
27
|
+
export function isValidMnemonic(mnemonic) {
|
|
28
|
+
return validateMnemonic(mnemonic, english);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Derive EVM private key and address from a BIP-39 mnemonic.
|
|
32
|
+
* Path: m/44'/60'/0'/0/0 (standard Ethereum derivation)
|
|
33
|
+
*/
|
|
34
|
+
export function deriveEvmKey(mnemonic) {
|
|
35
|
+
const seed = mnemonicToSeedSync(mnemonic);
|
|
36
|
+
const hdKey = HDKey.fromMasterSeed(seed);
|
|
37
|
+
const derived = hdKey.derive(ETH_DERIVATION_PATH);
|
|
38
|
+
if (!derived.privateKey)
|
|
39
|
+
throw new Error("Failed to derive EVM private key");
|
|
40
|
+
const hex = `0x${Buffer.from(derived.privateKey).toString("hex")}`;
|
|
41
|
+
const account = privateKeyToAccount(hex);
|
|
42
|
+
return { privateKey: hex, address: account.address };
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Derive 32-byte Solana private key using SLIP-10 Ed25519 derivation.
|
|
46
|
+
* Path: m/44'/501'/0'/0' (Phantom / Solflare / Backpack compatible)
|
|
47
|
+
*
|
|
48
|
+
* Algorithm (SLIP-0010 for Ed25519):
|
|
49
|
+
* 1. Master: HMAC-SHA512(key="ed25519 seed", data=bip39_seed) → IL=key, IR=chainCode
|
|
50
|
+
* 2. For each hardened child index:
|
|
51
|
+
* HMAC-SHA512(key=chainCode, data=0x00 || key || ser32(index)) → split again
|
|
52
|
+
* 3. Final IL (32 bytes) = Ed25519 private key seed
|
|
53
|
+
*/
|
|
54
|
+
export function deriveSolanaKeyBytes(mnemonic) {
|
|
55
|
+
const seed = mnemonicToSeedSync(mnemonic);
|
|
56
|
+
// Master key from SLIP-10
|
|
57
|
+
let I = hmac(sha512, "ed25519 seed", seed);
|
|
58
|
+
let key = I.slice(0, 32);
|
|
59
|
+
let chainCode = I.slice(32);
|
|
60
|
+
// Derive each hardened child: m/44'/501'/0'/0'
|
|
61
|
+
for (const index of SOLANA_HARDENED_INDICES) {
|
|
62
|
+
const data = new Uint8Array(37);
|
|
63
|
+
data[0] = 0x00;
|
|
64
|
+
data.set(key, 1);
|
|
65
|
+
// ser32 big-endian
|
|
66
|
+
data[33] = (index >>> 24) & 0xff;
|
|
67
|
+
data[34] = (index >>> 16) & 0xff;
|
|
68
|
+
data[35] = (index >>> 8) & 0xff;
|
|
69
|
+
data[36] = index & 0xff;
|
|
70
|
+
I = hmac(sha512, chainCode, data);
|
|
71
|
+
key = I.slice(0, 32);
|
|
72
|
+
chainCode = I.slice(32);
|
|
73
|
+
}
|
|
74
|
+
return new Uint8Array(key);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Derive both EVM and Solana keys from a single mnemonic.
|
|
78
|
+
*/
|
|
79
|
+
export function deriveAllKeys(mnemonic) {
|
|
80
|
+
const { privateKey: evmPrivateKey, address: evmAddress } = deriveEvmKey(mnemonic);
|
|
81
|
+
const solanaPrivateKeyBytes = deriveSolanaKeyBytes(mnemonic);
|
|
82
|
+
return { mnemonic, evmPrivateKey, evmAddress, solanaPrivateKeyBytes };
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get the Solana address from 32-byte private key bytes.
|
|
86
|
+
* Uses @solana/kit's createKeyPairSignerFromPrivateKeyBytes (dynamic import).
|
|
87
|
+
*/
|
|
88
|
+
export async function getSolanaAddress(privateKeyBytes) {
|
|
89
|
+
const { createKeyPairSignerFromPrivateKeyBytes } = await import("@solana/kit");
|
|
90
|
+
const signer = await createKeyPairSignerFromPrivateKeyBytes(privateKeyBytes);
|
|
91
|
+
return signer.address;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=wallet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.test.d.ts","sourceRoot":"","sources":["../src/wallet.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wallet derivation tests — BIP-39 mnemonic + BIP-44 key derivation.
|
|
3
|
+
* Tests SLIP-10 Ed25519 (Phantom-compatible) derivation.
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, expect } from "vitest";
|
|
6
|
+
import { generateWalletMnemonic, isValidMnemonic, deriveEvmKey, deriveSolanaKeyBytes, deriveAllKeys, } from "./wallet.js";
|
|
7
|
+
describe("wallet key derivation", () => {
|
|
8
|
+
const TEST_MNEMONIC = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art";
|
|
9
|
+
// Known SLIP-10 Ed25519 derivation result for the test mnemonic at m/44'/501'/0'/0'
|
|
10
|
+
const EXPECTED_SLIP10_KEY_HEX = "7c139e1a603ca04f5f7cff194e1bb6f6d1b9098470ea90695ab628488a9f921b";
|
|
11
|
+
const EXPECTED_SLIP10_ADDRESS = "3Cy3YNTFywCmxoxt8n7UH6hg6dLo5uACowX3CFceaSnx";
|
|
12
|
+
describe("generateWalletMnemonic", () => {
|
|
13
|
+
it("generates a valid 24-word mnemonic", () => {
|
|
14
|
+
const mnemonic = generateWalletMnemonic();
|
|
15
|
+
const words = mnemonic.split(" ");
|
|
16
|
+
expect(words).toHaveLength(24);
|
|
17
|
+
expect(isValidMnemonic(mnemonic)).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
it("generates unique mnemonics each time", () => {
|
|
20
|
+
const a = generateWalletMnemonic();
|
|
21
|
+
const b = generateWalletMnemonic();
|
|
22
|
+
expect(a).not.toBe(b);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
describe("isValidMnemonic", () => {
|
|
26
|
+
it("accepts valid mnemonics", () => {
|
|
27
|
+
expect(isValidMnemonic(TEST_MNEMONIC)).toBe(true);
|
|
28
|
+
});
|
|
29
|
+
it("rejects invalid strings", () => {
|
|
30
|
+
expect(isValidMnemonic("not a valid mnemonic")).toBe(false);
|
|
31
|
+
expect(isValidMnemonic("")).toBe(false);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
describe("deriveEvmKey", () => {
|
|
35
|
+
it("derives a valid 0x-prefixed 66-char hex key", () => {
|
|
36
|
+
const { privateKey, address } = deriveEvmKey(TEST_MNEMONIC);
|
|
37
|
+
expect(privateKey).toMatch(/^0x[0-9a-f]{64}$/);
|
|
38
|
+
expect(address).toMatch(/^0x[0-9a-fA-F]{40}$/);
|
|
39
|
+
});
|
|
40
|
+
it("is deterministic for the same mnemonic", () => {
|
|
41
|
+
const a = deriveEvmKey(TEST_MNEMONIC);
|
|
42
|
+
const b = deriveEvmKey(TEST_MNEMONIC);
|
|
43
|
+
expect(a.privateKey).toBe(b.privateKey);
|
|
44
|
+
expect(a.address).toBe(b.address);
|
|
45
|
+
});
|
|
46
|
+
it("derives different keys for different mnemonics", () => {
|
|
47
|
+
const a = deriveEvmKey(TEST_MNEMONIC);
|
|
48
|
+
const b = deriveEvmKey(generateWalletMnemonic());
|
|
49
|
+
expect(a.privateKey).not.toBe(b.privateKey);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe("deriveSolanaKeyBytes (SLIP-10 Ed25519)", () => {
|
|
53
|
+
it("returns a 32-byte Uint8Array", () => {
|
|
54
|
+
const bytes = deriveSolanaKeyBytes(TEST_MNEMONIC);
|
|
55
|
+
expect(bytes).toBeInstanceOf(Uint8Array);
|
|
56
|
+
expect(bytes.length).toBe(32);
|
|
57
|
+
});
|
|
58
|
+
it("is deterministic for the same mnemonic", () => {
|
|
59
|
+
const a = deriveSolanaKeyBytes(TEST_MNEMONIC);
|
|
60
|
+
const b = deriveSolanaKeyBytes(TEST_MNEMONIC);
|
|
61
|
+
expect(Buffer.from(a).toString("hex")).toBe(Buffer.from(b).toString("hex"));
|
|
62
|
+
});
|
|
63
|
+
it("derives different keys for different mnemonics", () => {
|
|
64
|
+
const a = deriveSolanaKeyBytes(TEST_MNEMONIC);
|
|
65
|
+
const b = deriveSolanaKeyBytes(generateWalletMnemonic());
|
|
66
|
+
expect(Buffer.from(a).toString("hex")).not.toBe(Buffer.from(b).toString("hex"));
|
|
67
|
+
});
|
|
68
|
+
it("produces known SLIP-10 key for test mnemonic", () => {
|
|
69
|
+
const bytes = deriveSolanaKeyBytes(TEST_MNEMONIC);
|
|
70
|
+
expect(Buffer.from(bytes).toString("hex")).toBe(EXPECTED_SLIP10_KEY_HEX);
|
|
71
|
+
});
|
|
72
|
+
it("produces Phantom-compatible Solana address", async () => {
|
|
73
|
+
const { createKeyPairSignerFromPrivateKeyBytes } = await import("@solana/kit");
|
|
74
|
+
const bytes = deriveSolanaKeyBytes(TEST_MNEMONIC);
|
|
75
|
+
const signer = await createKeyPairSignerFromPrivateKeyBytes(bytes);
|
|
76
|
+
expect(signer.address).toBe(EXPECTED_SLIP10_ADDRESS);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe("deriveAllKeys", () => {
|
|
80
|
+
it("returns EVM and Solana keys from a single mnemonic", () => {
|
|
81
|
+
const keys = deriveAllKeys(TEST_MNEMONIC);
|
|
82
|
+
expect(keys.mnemonic).toBe(TEST_MNEMONIC);
|
|
83
|
+
expect(keys.evmPrivateKey).toMatch(/^0x[0-9a-f]{64}$/);
|
|
84
|
+
expect(keys.evmAddress).toMatch(/^0x[0-9a-fA-F]{40}$/);
|
|
85
|
+
expect(keys.solanaPrivateKeyBytes).toBeInstanceOf(Uint8Array);
|
|
86
|
+
expect(keys.solanaPrivateKeyBytes.length).toBe(32);
|
|
87
|
+
});
|
|
88
|
+
it("uses SLIP-10 derivation for Solana key", () => {
|
|
89
|
+
const keys = deriveAllKeys(TEST_MNEMONIC);
|
|
90
|
+
expect(Buffer.from(keys.solanaPrivateKeyBytes).toString("hex")).toBe(EXPECTED_SLIP10_KEY_HEX);
|
|
91
|
+
});
|
|
92
|
+
it("EVM and Solana keys are different", () => {
|
|
93
|
+
const keys = deriveAllKeys(TEST_MNEMONIC);
|
|
94
|
+
const evmHex = keys.evmPrivateKey.slice(2);
|
|
95
|
+
const solHex = Buffer.from(keys.solanaPrivateKeyBytes).toString("hex");
|
|
96
|
+
expect(evmHex).not.toBe(solHex);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
describe("Solana key produces valid signer", () => {
|
|
100
|
+
it("createKeyPairSignerFromPrivateKeyBytes accepts derived bytes", async () => {
|
|
101
|
+
const { createKeyPairSignerFromPrivateKeyBytes } = await import("@solana/kit");
|
|
102
|
+
const bytes = deriveSolanaKeyBytes(TEST_MNEMONIC);
|
|
103
|
+
const signer = await createKeyPairSignerFromPrivateKeyBytes(bytes);
|
|
104
|
+
expect(typeof signer.address).toBe("string");
|
|
105
|
+
expect(signer.address.length).toBeGreaterThan(20);
|
|
106
|
+
});
|
|
107
|
+
it("same mnemonic produces same Solana address", async () => {
|
|
108
|
+
const { createKeyPairSignerFromPrivateKeyBytes } = await import("@solana/kit");
|
|
109
|
+
const bytesA = deriveSolanaKeyBytes(TEST_MNEMONIC);
|
|
110
|
+
const bytesB = deriveSolanaKeyBytes(TEST_MNEMONIC);
|
|
111
|
+
const signerA = await createKeyPairSignerFromPrivateKeyBytes(bytesA);
|
|
112
|
+
const signerB = await createKeyPairSignerFromPrivateKeyBytes(bytesB);
|
|
113
|
+
expect(signerA.address).toBe(signerB.address);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
//# sourceMappingURL=wallet.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.test.js","sourceRoot":"","sources":["../src/wallet.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402-sdk.test.d.ts","sourceRoot":"","sources":["../src/x402-sdk.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* x402 SDK integration tests — verifies client setup, scheme registration,
|
|
3
|
+
* and wrapFetchWithPayment behavior.
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, expect, vi } from "vitest";
|
|
6
|
+
import { wrapFetchWithPayment, x402Client } from "@x402/fetch";
|
|
7
|
+
import { registerExactEvmScheme } from "@x402/evm/exact/client";
|
|
8
|
+
import { toClientEvmSigner } from "@x402/evm";
|
|
9
|
+
import { createPublicClient, http } from "viem";
|
|
10
|
+
import { base } from "viem/chains";
|
|
11
|
+
import { privateKeyToAccount } from "viem/accounts";
|
|
12
|
+
import { deriveAllKeys } from "./wallet.js";
|
|
13
|
+
// Deterministic test mnemonic (DO NOT use in production)
|
|
14
|
+
const TEST_MNEMONIC = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art";
|
|
15
|
+
function createTestEvmClient() {
|
|
16
|
+
const keys = deriveAllKeys(TEST_MNEMONIC);
|
|
17
|
+
const account = privateKeyToAccount(keys.evmPrivateKey);
|
|
18
|
+
const publicClient = createPublicClient({ chain: base, transport: http() });
|
|
19
|
+
const signer = toClientEvmSigner(account, publicClient);
|
|
20
|
+
const client = new x402Client();
|
|
21
|
+
registerExactEvmScheme(client, { signer });
|
|
22
|
+
return client;
|
|
23
|
+
}
|
|
24
|
+
describe("x402 SDK integration", () => {
|
|
25
|
+
describe("x402Client creation", () => {
|
|
26
|
+
it("creates a client and registers EVM scheme without error", () => {
|
|
27
|
+
const client = createTestEvmClient();
|
|
28
|
+
expect(client).toBeInstanceOf(x402Client);
|
|
29
|
+
});
|
|
30
|
+
it("registers Solana scheme via registerExactSvmScheme", async () => {
|
|
31
|
+
const { registerExactSvmScheme } = await import("@x402/svm/exact/client");
|
|
32
|
+
const { createKeyPairSignerFromPrivateKeyBytes } = await import("@solana/kit");
|
|
33
|
+
const keys = deriveAllKeys(TEST_MNEMONIC);
|
|
34
|
+
const solanaSigner = await createKeyPairSignerFromPrivateKeyBytes(keys.solanaPrivateKeyBytes);
|
|
35
|
+
const client = createTestEvmClient();
|
|
36
|
+
// Should not throw
|
|
37
|
+
registerExactSvmScheme(client, { signer: solanaSigner });
|
|
38
|
+
});
|
|
39
|
+
it("registers both EVM and Solana on the same client", async () => {
|
|
40
|
+
const { registerExactSvmScheme } = await import("@x402/svm/exact/client");
|
|
41
|
+
const { createKeyPairSignerFromPrivateKeyBytes } = await import("@solana/kit");
|
|
42
|
+
const keys = deriveAllKeys(TEST_MNEMONIC);
|
|
43
|
+
const account = privateKeyToAccount(keys.evmPrivateKey);
|
|
44
|
+
const publicClient = createPublicClient({ chain: base, transport: http() });
|
|
45
|
+
const evmSigner = toClientEvmSigner(account, publicClient);
|
|
46
|
+
const solanaSigner = await createKeyPairSignerFromPrivateKeyBytes(keys.solanaPrivateKeyBytes);
|
|
47
|
+
const client = new x402Client();
|
|
48
|
+
registerExactEvmScheme(client, { signer: evmSigner });
|
|
49
|
+
registerExactSvmScheme(client, { signer: solanaSigner });
|
|
50
|
+
// Client exists and didn't throw during dual registration
|
|
51
|
+
expect(client).toBeInstanceOf(x402Client);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
describe("wrapFetchWithPayment", () => {
|
|
55
|
+
it("passes through non-402 responses unchanged", async () => {
|
|
56
|
+
const mockResponse = new Response(JSON.stringify({ ok: true }), {
|
|
57
|
+
status: 200,
|
|
58
|
+
headers: { "Content-Type": "application/json" },
|
|
59
|
+
});
|
|
60
|
+
const mockFetch = vi.fn().mockResolvedValue(mockResponse);
|
|
61
|
+
const client = createTestEvmClient();
|
|
62
|
+
const payFetch = wrapFetchWithPayment(mockFetch, client);
|
|
63
|
+
const res = await payFetch("https://example.com/api");
|
|
64
|
+
expect(res.status).toBe(200);
|
|
65
|
+
expect(mockFetch).toHaveBeenCalledTimes(1);
|
|
66
|
+
const body = await res.json();
|
|
67
|
+
expect(body).toEqual({ ok: true });
|
|
68
|
+
});
|
|
69
|
+
it("passes through streaming responses without buffering", async () => {
|
|
70
|
+
const encoder = new TextEncoder();
|
|
71
|
+
const stream = new ReadableStream({
|
|
72
|
+
start(controller) {
|
|
73
|
+
controller.enqueue(encoder.encode("data: chunk1\n\n"));
|
|
74
|
+
controller.enqueue(encoder.encode("data: chunk2\n\n"));
|
|
75
|
+
controller.close();
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
const mockResponse = new Response(stream, {
|
|
79
|
+
status: 200,
|
|
80
|
+
headers: { "Content-Type": "text/event-stream" },
|
|
81
|
+
});
|
|
82
|
+
const mockFetch = vi.fn().mockResolvedValue(mockResponse);
|
|
83
|
+
const client = createTestEvmClient();
|
|
84
|
+
const payFetch = wrapFetchWithPayment(mockFetch, client);
|
|
85
|
+
const res = await payFetch("https://example.com/stream");
|
|
86
|
+
expect(res.status).toBe(200);
|
|
87
|
+
expect(res.headers.get("Content-Type")).toBe("text/event-stream");
|
|
88
|
+
// Body is still a readable stream
|
|
89
|
+
const text = await res.text();
|
|
90
|
+
expect(text).toContain("chunk1");
|
|
91
|
+
expect(text).toContain("chunk2");
|
|
92
|
+
});
|
|
93
|
+
it("attempts payment on 402 response", async () => {
|
|
94
|
+
// First call returns 402, second (after payment) returns 200
|
|
95
|
+
const mockFetch = vi
|
|
96
|
+
.fn()
|
|
97
|
+
.mockResolvedValueOnce(new Response(JSON.stringify({ error: "payment required" }), {
|
|
98
|
+
status: 402,
|
|
99
|
+
headers: {
|
|
100
|
+
"X-PAYMENT": JSON.stringify({
|
|
101
|
+
x402Version: 1,
|
|
102
|
+
scheme: "exact",
|
|
103
|
+
network: "base",
|
|
104
|
+
paymentRequirements: [
|
|
105
|
+
{
|
|
106
|
+
scheme: "exact",
|
|
107
|
+
network: "base",
|
|
108
|
+
maxAmountRequired: "1000",
|
|
109
|
+
resource: "https://example.com/api",
|
|
110
|
+
description: "test",
|
|
111
|
+
mimeType: "application/json",
|
|
112
|
+
payTo: "0x0000000000000000000000000000000000000001",
|
|
113
|
+
maxTimeoutSeconds: 60,
|
|
114
|
+
asset: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
|
|
115
|
+
outputSchema: undefined,
|
|
116
|
+
extra: {},
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
}),
|
|
120
|
+
},
|
|
121
|
+
}))
|
|
122
|
+
.mockResolvedValueOnce(new Response(JSON.stringify({ result: "paid" }), { status: 200 }));
|
|
123
|
+
const client = createTestEvmClient();
|
|
124
|
+
const payFetch = wrapFetchWithPayment(mockFetch, client);
|
|
125
|
+
// This will get the 402, attempt to sign payment, and retry.
|
|
126
|
+
// The signing may fail (no real on-chain state) but the flow
|
|
127
|
+
// demonstrates the SDK processes 402 responses correctly.
|
|
128
|
+
try {
|
|
129
|
+
const res = await payFetch("https://example.com/api");
|
|
130
|
+
// If payment signing succeeded (unlikely without chain state),
|
|
131
|
+
// the second response should be returned
|
|
132
|
+
expect(res.status).toBe(200);
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
// Expected: signing fails without real chain state,
|
|
136
|
+
// but the error should be about payment creation, not parsing
|
|
137
|
+
expect(err).toBeInstanceOf(Error);
|
|
138
|
+
expect(err.message).toMatch(/payment/i);
|
|
139
|
+
}
|
|
140
|
+
// First call always happens (gets the 402)
|
|
141
|
+
expect(mockFetch).toHaveBeenCalledTimes(1);
|
|
142
|
+
});
|
|
143
|
+
it("preserves request headers on non-402 pass-through", async () => {
|
|
144
|
+
const mockFetch = vi.fn().mockResolvedValue(new Response("ok", { status: 200 }));
|
|
145
|
+
const client = createTestEvmClient();
|
|
146
|
+
const payFetch = wrapFetchWithPayment(mockFetch, client);
|
|
147
|
+
await payFetch("https://example.com/api", {
|
|
148
|
+
method: "POST",
|
|
149
|
+
headers: {
|
|
150
|
+
"Content-Type": "application/json",
|
|
151
|
+
"X-Custom": "test-value",
|
|
152
|
+
},
|
|
153
|
+
body: JSON.stringify({ prompt: "hello" }),
|
|
154
|
+
});
|
|
155
|
+
const calledRequest = mockFetch.mock.calls[0][0];
|
|
156
|
+
expect(calledRequest.headers.get("Content-Type")).toBe("application/json");
|
|
157
|
+
expect(calledRequest.headers.get("X-Custom")).toBe("test-value");
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
//# sourceMappingURL=x402-sdk.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402-sdk.test.js","sourceRoot":"","sources":["../src/x402-sdk.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blockrun/clawrouter",
|
|
3
|
-
"version": "0.12.
|
|
3
|
+
"version": "0.12.96",
|
|
4
4
|
"description": "Smart LLM router — save 85% on inference costs. 55+ models (11 free), one wallet, x402 micropayments.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -90,7 +90,7 @@
|
|
|
90
90
|
"devDependencies": {
|
|
91
91
|
"@eslint/js": "^10.0.1",
|
|
92
92
|
"eslint": "^10.0.2",
|
|
93
|
-
"openclaw": "
|
|
93
|
+
"openclaw": "^2026.3.31",
|
|
94
94
|
"prettier": "^3.8.1",
|
|
95
95
|
"tsup": "^8.0.0",
|
|
96
96
|
"tsx": "^4.21.0",
|
|
@@ -54,7 +54,10 @@ async function collectSSE(response) {
|
|
|
54
54
|
for (const line of lines) {
|
|
55
55
|
if (!line.startsWith("data: ")) continue;
|
|
56
56
|
const raw = line.slice(6).trim();
|
|
57
|
-
if (raw === "[DONE]") {
|
|
57
|
+
if (raw === "[DONE]") {
|
|
58
|
+
done = true;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
58
61
|
|
|
59
62
|
let chunk;
|
|
60
63
|
try {
|