imm-cli 0.1.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/README.md +315 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +112 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +251 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/immbook.d.ts +16 -0
- package/dist/commands/immbook.d.ts.map +1 -0
- package/dist/commands/immbook.js +795 -0
- package/dist/commands/immbook.js.map +1 -0
- package/dist/commands/jaine.d.ts +3 -0
- package/dist/commands/jaine.d.ts.map +1 -0
- package/dist/commands/jaine.js +1397 -0
- package/dist/commands/jaine.js.map +1 -0
- package/dist/commands/send.d.ts +3 -0
- package/dist/commands/send.d.ts.map +1 -0
- package/dist/commands/send.js +229 -0
- package/dist/commands/send.js.map +1 -0
- package/dist/commands/setup.d.ts +3 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +83 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/slop-app.d.ts +9 -0
- package/dist/commands/slop-app.d.ts.map +1 -0
- package/dist/commands/slop-app.js +793 -0
- package/dist/commands/slop-app.js.map +1 -0
- package/dist/commands/slop.d.ts +3 -0
- package/dist/commands/slop.d.ts.map +1 -0
- package/dist/commands/slop.js +1053 -0
- package/dist/commands/slop.js.map +1 -0
- package/dist/commands/wallet.d.ts +3 -0
- package/dist/commands/wallet.d.ts.map +1 -0
- package/dist/commands/wallet.js +298 -0
- package/dist/commands/wallet.js.map +1 -0
- package/dist/config/paths.d.ts +6 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +24 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/store.d.ts +44 -0
- package/dist/config/store.d.ts.map +1 -0
- package/dist/config/store.js +109 -0
- package/dist/config/store.js.map +1 -0
- package/dist/constants/chain.d.ts +56 -0
- package/dist/constants/chain.d.ts.map +1 -0
- package/dist/constants/chain.js +50 -0
- package/dist/constants/chain.js.map +1 -0
- package/dist/errors.d.ts +86 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +100 -0
- package/dist/errors.js.map +1 -0
- package/dist/immbook/api.d.ts +38 -0
- package/dist/immbook/api.d.ts.map +1 -0
- package/dist/immbook/api.js +86 -0
- package/dist/immbook/api.js.map +1 -0
- package/dist/immbook/auth.d.ts +31 -0
- package/dist/immbook/auth.d.ts.map +1 -0
- package/dist/immbook/auth.js +93 -0
- package/dist/immbook/auth.js.map +1 -0
- package/dist/immbook/comments.d.ts +26 -0
- package/dist/immbook/comments.d.ts.map +1 -0
- package/dist/immbook/comments.js +20 -0
- package/dist/immbook/comments.js.map +1 -0
- package/dist/immbook/follows.d.ts +19 -0
- package/dist/immbook/follows.d.ts.map +1 -0
- package/dist/immbook/follows.js +21 -0
- package/dist/immbook/follows.js.map +1 -0
- package/dist/immbook/jwtCache.d.ts +15 -0
- package/dist/immbook/jwtCache.d.ts.map +1 -0
- package/dist/immbook/jwtCache.js +63 -0
- package/dist/immbook/jwtCache.js.map +1 -0
- package/dist/immbook/points.d.ts +35 -0
- package/dist/immbook/points.d.ts.map +1 -0
- package/dist/immbook/points.js +20 -0
- package/dist/immbook/points.js.map +1 -0
- package/dist/immbook/posts.d.ts +46 -0
- package/dist/immbook/posts.d.ts.map +1 -0
- package/dist/immbook/posts.js +43 -0
- package/dist/immbook/posts.js.map +1 -0
- package/dist/immbook/profile.d.ts +29 -0
- package/dist/immbook/profile.d.ts.map +1 -0
- package/dist/immbook/profile.js +14 -0
- package/dist/immbook/profile.js.map +1 -0
- package/dist/immbook/submolts.d.ts +22 -0
- package/dist/immbook/submolts.d.ts.map +1 -0
- package/dist/immbook/submolts.js +24 -0
- package/dist/immbook/submolts.js.map +1 -0
- package/dist/immbook/tradeProof.d.ts +21 -0
- package/dist/immbook/tradeProof.d.ts.map +1 -0
- package/dist/immbook/tradeProof.js +14 -0
- package/dist/immbook/tradeProof.js.map +1 -0
- package/dist/immbook/votes.d.ts +17 -0
- package/dist/immbook/votes.d.ts.map +1 -0
- package/dist/immbook/votes.js +20 -0
- package/dist/immbook/votes.js.map +1 -0
- package/dist/intents/store.d.ts +22 -0
- package/dist/intents/store.d.ts.map +1 -0
- package/dist/intents/store.js +76 -0
- package/dist/intents/store.js.map +1 -0
- package/dist/intents/types.d.ts +21 -0
- package/dist/intents/types.d.ts.map +1 -0
- package/dist/intents/types.js +2 -0
- package/dist/intents/types.js.map +1 -0
- package/dist/jaine/abi/erc20.d.ts +90 -0
- package/dist/jaine/abi/erc20.d.ts.map +1 -0
- package/dist/jaine/abi/erc20.js +65 -0
- package/dist/jaine/abi/erc20.js.map +1 -0
- package/dist/jaine/abi/factory.d.ts +38 -0
- package/dist/jaine/abi/factory.d.ts.map +1 -0
- package/dist/jaine/abi/factory.js +26 -0
- package/dist/jaine/abi/factory.js.map +1 -0
- package/dist/jaine/abi/index.d.ts +11 -0
- package/dist/jaine/abi/index.d.ts.map +1 -0
- package/dist/jaine/abi/index.js +11 -0
- package/dist/jaine/abi/index.js.map +1 -0
- package/dist/jaine/abi/nftManager.d.ts +282 -0
- package/dist/jaine/abi/nftManager.d.ts.map +1 -0
- package/dist/jaine/abi/nftManager.js +182 -0
- package/dist/jaine/abi/nftManager.js.map +1 -0
- package/dist/jaine/abi/pool.d.ts +77 -0
- package/dist/jaine/abi/pool.d.ts.map +1 -0
- package/dist/jaine/abi/pool.js +56 -0
- package/dist/jaine/abi/pool.js.map +1 -0
- package/dist/jaine/abi/quoter.d.ts +84 -0
- package/dist/jaine/abi/quoter.d.ts.map +1 -0
- package/dist/jaine/abi/quoter.js +53 -0
- package/dist/jaine/abi/quoter.js.map +1 -0
- package/dist/jaine/abi/router.d.ts +135 -0
- package/dist/jaine/abi/router.d.ts.map +1 -0
- package/dist/jaine/abi/router.js +88 -0
- package/dist/jaine/abi/router.js.map +1 -0
- package/dist/jaine/abi/w0g.d.ts +41 -0
- package/dist/jaine/abi/w0g.d.ts.map +1 -0
- package/dist/jaine/abi/w0g.js +34 -0
- package/dist/jaine/abi/w0g.js.map +1 -0
- package/dist/jaine/allowance.d.ts +48 -0
- package/dist/jaine/allowance.d.ts.map +1 -0
- package/dist/jaine/allowance.js +192 -0
- package/dist/jaine/allowance.js.map +1 -0
- package/dist/jaine/coreTokens.d.ts +32 -0
- package/dist/jaine/coreTokens.d.ts.map +1 -0
- package/dist/jaine/coreTokens.js +91 -0
- package/dist/jaine/coreTokens.js.map +1 -0
- package/dist/jaine/pathEncoding.d.ts +39 -0
- package/dist/jaine/pathEncoding.d.ts.map +1 -0
- package/dist/jaine/pathEncoding.js +98 -0
- package/dist/jaine/pathEncoding.js.map +1 -0
- package/dist/jaine/paths.d.ts +11 -0
- package/dist/jaine/paths.d.ts.map +1 -0
- package/dist/jaine/paths.js +20 -0
- package/dist/jaine/paths.js.map +1 -0
- package/dist/jaine/poolCache.d.ts +42 -0
- package/dist/jaine/poolCache.d.ts.map +1 -0
- package/dist/jaine/poolCache.js +164 -0
- package/dist/jaine/poolCache.js.map +1 -0
- package/dist/jaine/routing.d.ts +41 -0
- package/dist/jaine/routing.d.ts.map +1 -0
- package/dist/jaine/routing.js +247 -0
- package/dist/jaine/routing.js.map +1 -0
- package/dist/jaine/userTokens.d.ts +27 -0
- package/dist/jaine/userTokens.d.ts.map +1 -0
- package/dist/jaine/userTokens.js +89 -0
- package/dist/jaine/userTokens.js.map +1 -0
- package/dist/slop/abi/factory.d.ts +128 -0
- package/dist/slop/abi/factory.d.ts.map +1 -0
- package/dist/slop/abi/factory.js +70 -0
- package/dist/slop/abi/factory.js.map +1 -0
- package/dist/slop/abi/feeCollector.d.ts +95 -0
- package/dist/slop/abi/feeCollector.d.ts.map +1 -0
- package/dist/slop/abi/feeCollector.js +71 -0
- package/dist/slop/abi/feeCollector.js.map +1 -0
- package/dist/slop/abi/index.d.ts +5 -0
- package/dist/slop/abi/index.d.ts.map +1 -0
- package/dist/slop/abi/index.js +5 -0
- package/dist/slop/abi/index.js.map +1 -0
- package/dist/slop/abi/registry.d.ts +135 -0
- package/dist/slop/abi/registry.d.ts.map +1 -0
- package/dist/slop/abi/registry.js +90 -0
- package/dist/slop/abi/registry.js.map +1 -0
- package/dist/slop/abi/token.d.ts +320 -0
- package/dist/slop/abi/token.d.ts.map +1 -0
- package/dist/slop/abi/token.js +251 -0
- package/dist/slop/abi/token.js.map +1 -0
- package/dist/slop/quote.d.ts +80 -0
- package/dist/slop/quote.d.ts.map +1 -0
- package/dist/slop/quote.js +174 -0
- package/dist/slop/quote.js.map +1 -0
- package/dist/utils/canonicalJson.d.ts +8 -0
- package/dist/utils/canonicalJson.d.ts.map +1 -0
- package/dist/utils/canonicalJson.js +20 -0
- package/dist/utils/canonicalJson.js.map +1 -0
- package/dist/utils/env.d.ts +11 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/env.js +20 -0
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/http.d.ts +19 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/dist/utils/http.js +61 -0
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/logger.d.ts +4 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +21 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/output.d.ts +19 -0
- package/dist/utils/output.d.ts.map +1 -0
- package/dist/utils/output.js +37 -0
- package/dist/utils/output.js.map +1 -0
- package/dist/utils/respond.d.ts +19 -0
- package/dist/utils/respond.d.ts.map +1 -0
- package/dist/utils/respond.js +25 -0
- package/dist/utils/respond.js.map +1 -0
- package/dist/utils/ui.d.ts +38 -0
- package/dist/utils/ui.d.ts.map +1 -0
- package/dist/utils/ui.js +126 -0
- package/dist/utils/ui.js.map +1 -0
- package/dist/wallet/client.d.ts +4 -0
- package/dist/wallet/client.d.ts.map +1 -0
- package/dist/wallet/client.js +53 -0
- package/dist/wallet/client.js.map +1 -0
- package/dist/wallet/keystore.d.ts +21 -0
- package/dist/wallet/keystore.d.ts.map +1 -0
- package/dist/wallet/keystore.js +111 -0
- package/dist/wallet/keystore.js.map +1 -0
- package/package.json +56 -0
- package/skills/imm/SKILL.md +617 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP utilities with timeout and error handling.
|
|
3
|
+
*/
|
|
4
|
+
import { ImmError, ErrorCodes } from "../errors.js";
|
|
5
|
+
const DEFAULT_TIMEOUT_MS = 30000;
|
|
6
|
+
/**
|
|
7
|
+
* Fetch with timeout and standardized error handling.
|
|
8
|
+
*/
|
|
9
|
+
export async function fetchWithTimeout(url, options = {}) {
|
|
10
|
+
const { timeoutMs = DEFAULT_TIMEOUT_MS, ...fetchOptions } = options;
|
|
11
|
+
const controller = new AbortController();
|
|
12
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
13
|
+
try {
|
|
14
|
+
const response = await fetch(url, {
|
|
15
|
+
...fetchOptions,
|
|
16
|
+
signal: controller.signal,
|
|
17
|
+
});
|
|
18
|
+
return response;
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
if (err instanceof Error && err.name === "AbortError") {
|
|
22
|
+
throw new ImmError(ErrorCodes.HTTP_TIMEOUT, `Request timed out after ${timeoutMs}ms`, "Check network connectivity or try again later");
|
|
23
|
+
}
|
|
24
|
+
throw new ImmError(ErrorCodes.HTTP_REQUEST_FAILED, err instanceof Error ? err.message : "HTTP request failed", "Check network connectivity");
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
clearTimeout(timeoutId);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Parse JSON response with error handling.
|
|
32
|
+
*/
|
|
33
|
+
export async function parseJsonResponse(response) {
|
|
34
|
+
if (!response.ok) {
|
|
35
|
+
let errorMessage = `HTTP ${response.status}: ${response.statusText}`;
|
|
36
|
+
try {
|
|
37
|
+
const errorBody = await response.json();
|
|
38
|
+
if (errorBody.error) {
|
|
39
|
+
errorMessage = errorBody.error;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Ignore JSON parse errors for error response
|
|
44
|
+
}
|
|
45
|
+
throw new ImmError(ErrorCodes.HTTP_REQUEST_FAILED, errorMessage);
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
return (await response.json());
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
throw new ImmError(ErrorCodes.HTTP_REQUEST_FAILED, "Failed to parse JSON response");
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Combined fetch + JSON parse with error handling.
|
|
56
|
+
*/
|
|
57
|
+
export async function fetchJson(url, options = {}) {
|
|
58
|
+
const response = await fetchWithTimeout(url, options);
|
|
59
|
+
return parseJsonResponse(response);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/utils/http.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAMjC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAW,EACX,UAAwB,EAAE;IAE1B,MAAM,EAAE,SAAS,GAAG,kBAAkB,EAAE,GAAG,YAAY,EAAE,GAAG,OAAO,CAAC;IAEpE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAElE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,GAAG,YAAY;YACf,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACtD,MAAM,IAAI,QAAQ,CAChB,UAAU,CAAC,YAAY,EACvB,2BAA2B,SAAS,IAAI,EACxC,+CAA+C,CAChD,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,QAAQ,CAChB,UAAU,CAAC,mBAAmB,EAC9B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,EAC1D,4BAA4B,CAC7B,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAI,QAAkB;IAC3D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,YAAY,GAAG,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;QACrE,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;gBACpB,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC;YACjC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,8CAA8C;QAChD,CAAC;QACD,MAAM,IAAI,QAAQ,CAAC,UAAU,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,QAAQ,CAChB,UAAU,CAAC,mBAAmB,EAC9B,+BAA+B,CAChC,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAW,EACX,UAAwB,EAAE;IAE1B,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACtD,OAAO,iBAAiB,CAAI,QAAQ,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAsB9B,eAAO,MAAM,MAAM,gBAQjB,CAAC;AAEH,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import winston from "winston";
|
|
2
|
+
const LOG_LEVEL = process.env.LOG_LEVEL ?? "info";
|
|
3
|
+
const IS_PRODUCTION = process.env.NODE_ENV === "production";
|
|
4
|
+
const colorizedFormat = winston.format.combine(winston.format.timestamp({ format: "HH:mm:ss" }), winston.format.colorize(), winston.format.printf(({ level, message, timestamp }) => {
|
|
5
|
+
return `${timestamp} ${level}: ${message}`;
|
|
6
|
+
}));
|
|
7
|
+
const plainFormat = winston.format.combine(winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }), winston.format.printf(({ level, message, timestamp }) => {
|
|
8
|
+
return `${timestamp} [${level.toUpperCase()}]: ${message}`;
|
|
9
|
+
}));
|
|
10
|
+
// All logs go to stderr (stdout reserved for machine-readable output)
|
|
11
|
+
export const logger = winston.createLogger({
|
|
12
|
+
level: LOG_LEVEL,
|
|
13
|
+
format: IS_PRODUCTION ? plainFormat : colorizedFormat,
|
|
14
|
+
transports: [
|
|
15
|
+
new winston.transports.Stream({
|
|
16
|
+
stream: process.stderr,
|
|
17
|
+
}),
|
|
18
|
+
],
|
|
19
|
+
});
|
|
20
|
+
export default logger;
|
|
21
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAG9B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC;AAClD,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;AAE5D,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAC5C,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAChD,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,EACzB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;IACtD,OAAO,GAAG,SAAS,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;AAC7C,CAAC,CAAC,CACH,CAAC;AAEF,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CACxC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,EAC3D,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;IACtD,OAAO,GAAG,SAAS,KAAK,KAAK,CAAC,WAAW,EAAE,MAAM,OAAO,EAAE,CAAC;AAC7D,CAAC,CAAC,CACH,CAAC;AAEF,sEAAsE;AACtE,MAAM,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IACzC,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe;IACrD,UAAU,EAAE;QACV,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;YAC5B,MAAM,EAAE,OAAO,CAAC,MAA6B;SAC9C,CAAC;KACH;CACF,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized output layer for stdout/stderr separation.
|
|
3
|
+
*
|
|
4
|
+
* Convention:
|
|
5
|
+
* - stdout: machine-readable data (addresses, JSON) for piping/scripting
|
|
6
|
+
* - stderr: human UI (spinners, boxes, tables, logs)
|
|
7
|
+
*/
|
|
8
|
+
export declare function setJsonMode(enabled: boolean): void;
|
|
9
|
+
/**
|
|
10
|
+
* Returns true if running in headless mode (JSON output or non-TTY).
|
|
11
|
+
* Used by UI helpers to suppress interactive output.
|
|
12
|
+
*/
|
|
13
|
+
export declare function isHeadless(): boolean;
|
|
14
|
+
export declare function writeStdout(text: string): void;
|
|
15
|
+
export declare function writeStderr(text: string): void;
|
|
16
|
+
export declare function writeJson(data: unknown): void;
|
|
17
|
+
export declare function writeJsonError(code: string, message: string, hint?: string): void;
|
|
18
|
+
export declare function writeJsonSuccess<T extends Record<string, unknown>>(data: T): void;
|
|
19
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAElD;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAE7C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAIjF;AAED,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAEjF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized output layer for stdout/stderr separation.
|
|
3
|
+
*
|
|
4
|
+
* Convention:
|
|
5
|
+
* - stdout: machine-readable data (addresses, JSON) for piping/scripting
|
|
6
|
+
* - stderr: human UI (spinners, boxes, tables, logs)
|
|
7
|
+
*/
|
|
8
|
+
let jsonModeEnabled = false;
|
|
9
|
+
export function setJsonMode(enabled) {
|
|
10
|
+
jsonModeEnabled = enabled;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Returns true if running in headless mode (JSON output or non-TTY).
|
|
14
|
+
* Used by UI helpers to suppress interactive output.
|
|
15
|
+
*/
|
|
16
|
+
export function isHeadless() {
|
|
17
|
+
return jsonModeEnabled || !process.stderr.isTTY;
|
|
18
|
+
}
|
|
19
|
+
export function writeStdout(text) {
|
|
20
|
+
process.stdout.write(text + "\n");
|
|
21
|
+
}
|
|
22
|
+
export function writeStderr(text) {
|
|
23
|
+
process.stderr.write(text + "\n");
|
|
24
|
+
}
|
|
25
|
+
export function writeJson(data) {
|
|
26
|
+
writeStdout(JSON.stringify(data));
|
|
27
|
+
}
|
|
28
|
+
export function writeJsonError(code, message, hint) {
|
|
29
|
+
const error = { code, message };
|
|
30
|
+
if (hint)
|
|
31
|
+
error.hint = hint;
|
|
32
|
+
writeJson({ success: false, error });
|
|
33
|
+
}
|
|
34
|
+
export function writeJsonSuccess(data) {
|
|
35
|
+
writeJson({ success: true, ...data });
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,IAAI,eAAe,GAAG,KAAK,CAAC;AAE5B,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,eAAe,GAAG,OAAO,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,eAAe,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,OAAe,EAAE,IAAa;IACzE,MAAM,KAAK,GAAqD,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAClF,IAAI,IAAI;QAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAoC,IAAO;IACzE,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized command response handler.
|
|
3
|
+
* Routes output to JSON (headless) or UI boxes (TTY) based on mode.
|
|
4
|
+
*/
|
|
5
|
+
export interface CommandResult<T extends Record<string, unknown>> {
|
|
6
|
+
data: T;
|
|
7
|
+
ui?: {
|
|
8
|
+
type: "success" | "info" | "warn";
|
|
9
|
+
title: string;
|
|
10
|
+
body: string;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Unified response function for commands.
|
|
15
|
+
* - Headless mode: outputs JSON to stdout
|
|
16
|
+
* - TTY mode: displays appropriate UI box
|
|
17
|
+
*/
|
|
18
|
+
export declare function respond<T extends Record<string, unknown>>(result: CommandResult<T>): void;
|
|
19
|
+
//# sourceMappingURL=respond.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"respond.d.ts","sourceRoot":"","sources":["../../src/utils/respond.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC9D,IAAI,EAAE,CAAC,CAAC;IACR,EAAE,CAAC,EAAE;QACH,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;QAClC,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,IAAI,CAYzF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized command response handler.
|
|
3
|
+
* Routes output to JSON (headless) or UI boxes (TTY) based on mode.
|
|
4
|
+
*/
|
|
5
|
+
import { isHeadless, writeJsonSuccess } from "./output.js";
|
|
6
|
+
import { successBox, infoBox, warnBox } from "./ui.js";
|
|
7
|
+
/**
|
|
8
|
+
* Unified response function for commands.
|
|
9
|
+
* - Headless mode: outputs JSON to stdout
|
|
10
|
+
* - TTY mode: displays appropriate UI box
|
|
11
|
+
*/
|
|
12
|
+
export function respond(result) {
|
|
13
|
+
if (isHeadless()) {
|
|
14
|
+
writeJsonSuccess(result.data);
|
|
15
|
+
}
|
|
16
|
+
else if (result.ui) {
|
|
17
|
+
const boxFn = result.ui.type === "success"
|
|
18
|
+
? successBox
|
|
19
|
+
: result.ui.type === "warn"
|
|
20
|
+
? warnBox
|
|
21
|
+
: infoBox;
|
|
22
|
+
boxFn(result.ui.title, result.ui.body);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=respond.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"respond.js","sourceRoot":"","sources":["../../src/utils/respond.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAWvD;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAoC,MAAwB;IACjF,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;SAAM,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACrB,MAAM,KAAK,GACT,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS;YAC1B,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,MAAM;gBACzB,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,OAAO,CAAC;QAChB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import Table from "cli-table3";
|
|
2
|
+
import { type Ora } from "ora";
|
|
3
|
+
/**
|
|
4
|
+
* Noop spinner for headless mode - implements same interface as Ora
|
|
5
|
+
*/
|
|
6
|
+
interface NoopSpinner {
|
|
7
|
+
start: () => NoopSpinner;
|
|
8
|
+
succeed: (text?: string) => NoopSpinner;
|
|
9
|
+
fail: (text?: string) => NoopSpinner;
|
|
10
|
+
stop: () => NoopSpinner;
|
|
11
|
+
text: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function printLogo(): void;
|
|
14
|
+
export declare function spinner(text: string): Ora | NoopSpinner;
|
|
15
|
+
export declare function successBox(title: string, content: string): void;
|
|
16
|
+
export declare function errorBox(title: string, content: string): void;
|
|
17
|
+
export declare function infoBox(title: string, content: string): void;
|
|
18
|
+
export declare function warnBox(title: string, content: string): void;
|
|
19
|
+
export interface TableColumn {
|
|
20
|
+
header: string;
|
|
21
|
+
width?: number;
|
|
22
|
+
}
|
|
23
|
+
export declare function createTable(columns: TableColumn[]): Table.Table;
|
|
24
|
+
export declare function printTable(columns: TableColumn[], rows: string[][]): void;
|
|
25
|
+
export declare function formatAddress(address: string, chars?: number): string;
|
|
26
|
+
export declare function formatBalance(value: bigint, decimals: number, precision?: number): string;
|
|
27
|
+
export declare const colors: {
|
|
28
|
+
success: import("chalk").ChalkInstance;
|
|
29
|
+
error: import("chalk").ChalkInstance;
|
|
30
|
+
warn: import("chalk").ChalkInstance;
|
|
31
|
+
info: import("chalk").ChalkInstance;
|
|
32
|
+
muted: import("chalk").ChalkInstance;
|
|
33
|
+
bold: import("chalk").ChalkInstance;
|
|
34
|
+
address: import("chalk").ChalkInstance;
|
|
35
|
+
value: import("chalk").ChalkInstance;
|
|
36
|
+
};
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=ui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/utils/ui.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAKpC;;GAEG;AACH,UAAU,WAAW;IACnB,KAAK,EAAE,MAAM,WAAW,CAAC;IACzB,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,WAAW,CAAC;IACxC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,WAAW,CAAC;IACrC,IAAI,EAAE,MAAM,WAAW,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAKD,wBAAgB,SAAS,IAAI,IAAI,CAShC;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,GAAG,WAAW,CAgBvD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAY/D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAY7D;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAY5D;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAY5D;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAS/D;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAIzE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,MAAM,CAGhE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,SAAI,GAAG,MAAM,CAepF;AAED,eAAO,MAAM,MAAM;;;;;;;;;CASlB,CAAC"}
|
package/dist/utils/ui.js
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import boxen from "boxen";
|
|
3
|
+
import Table from "cli-table3";
|
|
4
|
+
import ora from "ora";
|
|
5
|
+
import figlet from "figlet";
|
|
6
|
+
import gradient from "gradient-string";
|
|
7
|
+
import { writeStderr, isHeadless } from "./output.js";
|
|
8
|
+
// Gradient for logo: cyan -> magenta
|
|
9
|
+
const logoGradient = gradient(["cyan", "magenta"]);
|
|
10
|
+
export function printLogo() {
|
|
11
|
+
const logo = figlet.textSync("IMM", {
|
|
12
|
+
font: "Standard",
|
|
13
|
+
horizontalLayout: "default",
|
|
14
|
+
});
|
|
15
|
+
writeStderr(logoGradient(logo));
|
|
16
|
+
writeStderr(chalk.gray(" Intelligent Money Market") + chalk.cyan(" • ") + chalk.gray("0G Network"));
|
|
17
|
+
writeStderr("");
|
|
18
|
+
}
|
|
19
|
+
export function spinner(text) {
|
|
20
|
+
if (isHeadless()) {
|
|
21
|
+
const noop = {
|
|
22
|
+
start: () => noop,
|
|
23
|
+
succeed: () => noop,
|
|
24
|
+
fail: () => noop,
|
|
25
|
+
stop: () => noop,
|
|
26
|
+
text: "",
|
|
27
|
+
};
|
|
28
|
+
return noop;
|
|
29
|
+
}
|
|
30
|
+
return ora({
|
|
31
|
+
text,
|
|
32
|
+
color: "cyan",
|
|
33
|
+
spinner: "dots",
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export function successBox(title, content) {
|
|
37
|
+
if (isHeadless())
|
|
38
|
+
return;
|
|
39
|
+
writeStderr(boxen(content, {
|
|
40
|
+
title: chalk.green(`✓ ${title}`),
|
|
41
|
+
titleAlignment: "left",
|
|
42
|
+
padding: 1,
|
|
43
|
+
margin: { top: 1, bottom: 1, left: 0, right: 0 },
|
|
44
|
+
borderColor: "green",
|
|
45
|
+
borderStyle: "round",
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
export function errorBox(title, content) {
|
|
49
|
+
if (isHeadless())
|
|
50
|
+
return;
|
|
51
|
+
writeStderr(boxen(content, {
|
|
52
|
+
title: chalk.red(`✗ ${title}`),
|
|
53
|
+
titleAlignment: "left",
|
|
54
|
+
padding: 1,
|
|
55
|
+
margin: { top: 1, bottom: 1, left: 0, right: 0 },
|
|
56
|
+
borderColor: "red",
|
|
57
|
+
borderStyle: "round",
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
export function infoBox(title, content) {
|
|
61
|
+
if (isHeadless())
|
|
62
|
+
return;
|
|
63
|
+
writeStderr(boxen(content, {
|
|
64
|
+
title: chalk.cyan(`ℹ ${title}`),
|
|
65
|
+
titleAlignment: "left",
|
|
66
|
+
padding: 1,
|
|
67
|
+
margin: { top: 1, bottom: 1, left: 0, right: 0 },
|
|
68
|
+
borderColor: "cyan",
|
|
69
|
+
borderStyle: "round",
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
72
|
+
export function warnBox(title, content) {
|
|
73
|
+
if (isHeadless())
|
|
74
|
+
return;
|
|
75
|
+
writeStderr(boxen(content, {
|
|
76
|
+
title: chalk.yellow(`⚠ ${title}`),
|
|
77
|
+
titleAlignment: "left",
|
|
78
|
+
padding: 1,
|
|
79
|
+
margin: { top: 1, bottom: 1, left: 0, right: 0 },
|
|
80
|
+
borderColor: "yellow",
|
|
81
|
+
borderStyle: "round",
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
export function createTable(columns) {
|
|
85
|
+
return new Table({
|
|
86
|
+
head: columns.map((c) => chalk.cyan(c.header)),
|
|
87
|
+
colWidths: columns.map((c) => c.width ?? null),
|
|
88
|
+
style: {
|
|
89
|
+
head: [],
|
|
90
|
+
border: ["gray"],
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
export function printTable(columns, rows) {
|
|
95
|
+
const table = createTable(columns);
|
|
96
|
+
rows.forEach((row) => table.push(row));
|
|
97
|
+
writeStderr(table.toString());
|
|
98
|
+
}
|
|
99
|
+
export function formatAddress(address, chars = 6) {
|
|
100
|
+
if (address.length <= chars * 2 + 2)
|
|
101
|
+
return address;
|
|
102
|
+
return `${address.slice(0, chars + 2)}...${address.slice(-chars)}`;
|
|
103
|
+
}
|
|
104
|
+
export function formatBalance(value, decimals, precision = 4) {
|
|
105
|
+
const divisor = 10n ** BigInt(decimals);
|
|
106
|
+
const integerPart = value / divisor;
|
|
107
|
+
const fractionalPart = value % divisor;
|
|
108
|
+
const fractionalStr = fractionalPart.toString().padStart(decimals, "0").slice(0, precision);
|
|
109
|
+
// Remove trailing zeros
|
|
110
|
+
const trimmedFractional = fractionalStr.replace(/0+$/, "");
|
|
111
|
+
if (trimmedFractional === "") {
|
|
112
|
+
return integerPart.toLocaleString();
|
|
113
|
+
}
|
|
114
|
+
return `${integerPart.toLocaleString()}.${trimmedFractional}`;
|
|
115
|
+
}
|
|
116
|
+
export const colors = {
|
|
117
|
+
success: chalk.green,
|
|
118
|
+
error: chalk.red,
|
|
119
|
+
warn: chalk.yellow,
|
|
120
|
+
info: chalk.cyan,
|
|
121
|
+
muted: chalk.gray,
|
|
122
|
+
bold: chalk.bold,
|
|
123
|
+
address: chalk.magenta,
|
|
124
|
+
value: chalk.yellow,
|
|
125
|
+
};
|
|
126
|
+
//# sourceMappingURL=ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/utils/ui.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/wallet/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,YAAY,EAAc,MAAM,MAAM,CAAC;AAgC/E,wBAAgB,eAAe,IAAI,YAAY,CAwB9C;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { createPublicClient, http } from "viem";
|
|
2
|
+
import { loadConfig } from "../config/store.js";
|
|
3
|
+
import logger from "../utils/logger.js";
|
|
4
|
+
const RPC_TIMEOUT = 10_000; // 10 seconds
|
|
5
|
+
let cachedClient = null;
|
|
6
|
+
let cachedRpcUrl = null;
|
|
7
|
+
function create0GChain(config) {
|
|
8
|
+
return {
|
|
9
|
+
id: config.chain.chainId,
|
|
10
|
+
name: "0G Mainnet",
|
|
11
|
+
nativeCurrency: {
|
|
12
|
+
name: "0G",
|
|
13
|
+
symbol: "0G",
|
|
14
|
+
decimals: 18,
|
|
15
|
+
},
|
|
16
|
+
rpcUrls: {
|
|
17
|
+
default: {
|
|
18
|
+
http: [config.chain.rpcUrl],
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
blockExplorers: {
|
|
22
|
+
default: {
|
|
23
|
+
name: "0G Explorer",
|
|
24
|
+
url: config.chain.explorerUrl,
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export function getPublicClient() {
|
|
30
|
+
const config = loadConfig();
|
|
31
|
+
const rpcUrl = config.chain.rpcUrl;
|
|
32
|
+
// Return cached client if RPC URL hasn't changed
|
|
33
|
+
if (cachedClient && cachedRpcUrl === rpcUrl) {
|
|
34
|
+
return cachedClient;
|
|
35
|
+
}
|
|
36
|
+
logger.debug(`Creating viem client for ${rpcUrl}`);
|
|
37
|
+
const chain = create0GChain(config);
|
|
38
|
+
cachedClient = createPublicClient({
|
|
39
|
+
chain,
|
|
40
|
+
transport: http(rpcUrl, {
|
|
41
|
+
timeout: RPC_TIMEOUT,
|
|
42
|
+
retryCount: 2,
|
|
43
|
+
retryDelay: 1000,
|
|
44
|
+
}),
|
|
45
|
+
});
|
|
46
|
+
cachedRpcUrl = rpcUrl;
|
|
47
|
+
return cachedClient;
|
|
48
|
+
}
|
|
49
|
+
export function clearClientCache() {
|
|
50
|
+
cachedClient = null;
|
|
51
|
+
cachedRpcUrl = null;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/wallet/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAiC,MAAM,MAAM,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,aAAa;AAEzC,IAAI,YAAY,GAAwB,IAAI,CAAC;AAC7C,IAAI,YAAY,GAAkB,IAAI,CAAC;AAEvC,SAAS,aAAa,CAAC,MAAqC;IAC1D,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;QACxB,IAAI,EAAE,YAAY;QAClB,cAAc,EAAE;YACd,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,EAAE;SACb;QACD,OAAO,EAAE;YACP,OAAO,EAAE;gBACP,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;aAC5B;SACF;QACD,cAAc,EAAE;YACd,OAAO,EAAE;gBACP,IAAI,EAAE,aAAa;gBACnB,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW;aAC9B;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;IAEnC,iDAAiD;IACjD,IAAI,YAAY,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;QAC5C,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,4BAA4B,MAAM,EAAE,CAAC,CAAC;IAEnD,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAEpC,YAAY,GAAG,kBAAkB,CAAC;QAChC,KAAK;QACL,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE;YACtB,OAAO,EAAE,WAAW;YACpB,UAAU,EAAE,CAAC;YACb,UAAU,EAAE,IAAI;SACjB,CAAC;KACH,CAAC,CAAC;IAEH,YAAY,GAAG,MAAM,CAAC;IACtB,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,YAAY,GAAG,IAAI,CAAC;IACpB,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Hex } from "viem";
|
|
2
|
+
export interface KeystoreV1 {
|
|
3
|
+
version: 1;
|
|
4
|
+
ciphertext: string;
|
|
5
|
+
iv: string;
|
|
6
|
+
salt: string;
|
|
7
|
+
tag: string;
|
|
8
|
+
kdf: {
|
|
9
|
+
name: "scrypt";
|
|
10
|
+
N: number;
|
|
11
|
+
r: number;
|
|
12
|
+
p: number;
|
|
13
|
+
dkLen: number;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export declare function encryptPrivateKey(plainPk: string, password: string): KeystoreV1;
|
|
17
|
+
export declare function decryptPrivateKey(keystore: KeystoreV1, password: string): Hex;
|
|
18
|
+
export declare function saveKeystore(keystore: KeystoreV1): void;
|
|
19
|
+
export declare function loadKeystore(): KeystoreV1 | null;
|
|
20
|
+
export declare function keystoreExists(): boolean;
|
|
21
|
+
//# sourceMappingURL=keystore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keystore.d.ts","sourceRoot":"","sources":["../../src/wallet/keystore.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAMhC,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,CAAC,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE;QACH,IAAI,EAAE,QAAQ,CAAC;QACf,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;QACV,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAsBD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CA4B/E;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CA2B7E;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI,CAoBvD;AAED,wBAAgB,YAAY,IAAI,UAAU,GAAG,IAAI,CAYhD;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { randomBytes, scryptSync, createCipheriv, createDecipheriv } from "node:crypto";
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync, renameSync, unlinkSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { KEYSTORE_FILE } from "../config/paths.js";
|
|
5
|
+
import { ensureConfigDir } from "../config/store.js";
|
|
6
|
+
import { ImmError, ErrorCodes } from "../errors.js";
|
|
7
|
+
import logger from "../utils/logger.js";
|
|
8
|
+
const KDF_PARAMS = {
|
|
9
|
+
name: "scrypt",
|
|
10
|
+
N: 2 ** 14, // 16384
|
|
11
|
+
r: 8,
|
|
12
|
+
p: 1,
|
|
13
|
+
dkLen: 32,
|
|
14
|
+
};
|
|
15
|
+
function normalizePrivateKey(pk) {
|
|
16
|
+
// Remove 0x prefix if present
|
|
17
|
+
const cleaned = pk.startsWith("0x") ? pk.slice(2) : pk;
|
|
18
|
+
// Validate hex format and length (32 bytes = 64 hex chars)
|
|
19
|
+
if (!/^[0-9a-fA-F]{64}$/.test(cleaned)) {
|
|
20
|
+
throw new Error("Invalid private key: must be 32 bytes hex");
|
|
21
|
+
}
|
|
22
|
+
return `0x${cleaned.toLowerCase()}`;
|
|
23
|
+
}
|
|
24
|
+
export function encryptPrivateKey(plainPk, password) {
|
|
25
|
+
const normalizedPk = normalizePrivateKey(plainPk);
|
|
26
|
+
const pkBuffer = Buffer.from(normalizedPk.slice(2), "hex");
|
|
27
|
+
// Generate random salt and IV
|
|
28
|
+
const salt = randomBytes(32);
|
|
29
|
+
const iv = randomBytes(12); // 96 bits for GCM
|
|
30
|
+
// Derive key using scrypt
|
|
31
|
+
const key = scryptSync(password, salt, KDF_PARAMS.dkLen, {
|
|
32
|
+
N: KDF_PARAMS.N,
|
|
33
|
+
r: KDF_PARAMS.r,
|
|
34
|
+
p: KDF_PARAMS.p,
|
|
35
|
+
});
|
|
36
|
+
// Encrypt with AES-256-GCM
|
|
37
|
+
const cipher = createCipheriv("aes-256-gcm", key, iv);
|
|
38
|
+
const ciphertext = Buffer.concat([cipher.update(pkBuffer), cipher.final()]);
|
|
39
|
+
const tag = cipher.getAuthTag();
|
|
40
|
+
return {
|
|
41
|
+
version: 1,
|
|
42
|
+
ciphertext: ciphertext.toString("base64"),
|
|
43
|
+
iv: iv.toString("base64"),
|
|
44
|
+
salt: salt.toString("base64"),
|
|
45
|
+
tag: tag.toString("base64"),
|
|
46
|
+
kdf: KDF_PARAMS,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export function decryptPrivateKey(keystore, password) {
|
|
50
|
+
if (keystore.version !== 1) {
|
|
51
|
+
throw new Error(`Unsupported keystore version: ${keystore.version}`);
|
|
52
|
+
}
|
|
53
|
+
const salt = Buffer.from(keystore.salt, "base64");
|
|
54
|
+
const iv = Buffer.from(keystore.iv, "base64");
|
|
55
|
+
const ciphertext = Buffer.from(keystore.ciphertext, "base64");
|
|
56
|
+
const tag = Buffer.from(keystore.tag, "base64");
|
|
57
|
+
// Derive key using scrypt
|
|
58
|
+
const key = scryptSync(password, salt, keystore.kdf.dkLen, {
|
|
59
|
+
N: keystore.kdf.N,
|
|
60
|
+
r: keystore.kdf.r,
|
|
61
|
+
p: keystore.kdf.p,
|
|
62
|
+
});
|
|
63
|
+
// Decrypt with AES-256-GCM
|
|
64
|
+
const decipher = createDecipheriv("aes-256-gcm", key, iv);
|
|
65
|
+
decipher.setAuthTag(tag);
|
|
66
|
+
try {
|
|
67
|
+
const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
|
|
68
|
+
return `0x${decrypted.toString("hex")}`;
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
throw new ImmError(ErrorCodes.KEYSTORE_DECRYPT_FAILED, "Decryption failed: wrong password or corrupted keystore");
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export function saveKeystore(keystore) {
|
|
75
|
+
ensureConfigDir();
|
|
76
|
+
const dir = dirname(KEYSTORE_FILE);
|
|
77
|
+
const tmpFile = join(dir, `.keystore.tmp.${Date.now()}.json`);
|
|
78
|
+
try {
|
|
79
|
+
writeFileSync(tmpFile, JSON.stringify(keystore, null, 2), "utf-8");
|
|
80
|
+
renameSync(tmpFile, KEYSTORE_FILE);
|
|
81
|
+
logger.debug(`Keystore saved to ${KEYSTORE_FILE}`);
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
try {
|
|
85
|
+
if (existsSync(tmpFile)) {
|
|
86
|
+
unlinkSync(tmpFile);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// Ignore cleanup errors
|
|
91
|
+
}
|
|
92
|
+
throw err;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export function loadKeystore() {
|
|
96
|
+
if (!existsSync(KEYSTORE_FILE)) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
const raw = readFileSync(KEYSTORE_FILE, "utf-8");
|
|
101
|
+
return JSON.parse(raw);
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
logger.error(`Failed to parse keystore: ${err}`);
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
export function keystoreExists() {
|
|
109
|
+
return existsSync(KEYSTORE_FILE);
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=keystore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keystore.js","sourceRoot":"","sources":["../../src/wallet/keystore.ts"],"names":[],"mappings":"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"}
|