@gearbox-protocol/cli-utils 5.55.0 → 5.57.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.
@@ -0,0 +1,5 @@
1
+ import type { NetworkType } from "@gearbox-protocol/sdk";
2
+ import { type RevolverTransportConfig, type RevolverTransportValue } from "@gearbox-protocol/sdk/dev";
3
+ import type { Transport } from "viem";
4
+ import type { ProvidersSchema } from "./providers-schema.js";
5
+ export declare function createRevolverTransport(network: NetworkType, providers: ProvidersSchema, config?: Omit<RevolverTransportConfig, "network" | "providers">): Transport<"revolver", RevolverTransportValue>;
@@ -0,0 +1,56 @@
1
+ import { RevolverTransport, } from "@gearbox-protocol/sdk/dev";
2
+ import { getAlchemyUrl, getAnkrUrl, getDrpcUrl, getErpcKey, getThirdWebUrl, } from "./providers.js";
3
+ function getProviders(network, config) {
4
+ const { enabledProviders, alchemyKeys = [], ankrKeys = [], drpcKeys = [], thirdwebKeys = [], jsonRpcProviders = [], erpcProjectId, erpcUrl, } = config;
5
+ const result = [];
6
+ for (const p of enabledProviders) {
7
+ switch (p) {
8
+ case "alchemy":
9
+ result.push(...alchemyKeys.map(k => ({
10
+ name: "alchemy",
11
+ url: getAlchemyUrl(network, k.value),
12
+ })));
13
+ break;
14
+ case "drpc":
15
+ result.push(...drpcKeys.map(k => ({
16
+ name: "drpc",
17
+ url: getDrpcUrl(network, k.value),
18
+ })));
19
+ break;
20
+ case "ankr":
21
+ result.push(...ankrKeys.map(k => ({
22
+ name: "ankr",
23
+ url: getAnkrUrl(network, k.value),
24
+ })));
25
+ break;
26
+ case "thirdweb":
27
+ result.push(...thirdwebKeys.map(k => ({
28
+ name: "thirdweb",
29
+ url: getThirdWebUrl(network, k.value),
30
+ })));
31
+ break;
32
+ case "custom":
33
+ result.push(...jsonRpcProviders.map(url => ({
34
+ name: new URL(url.value).hostname,
35
+ url: url.value,
36
+ })));
37
+ break;
38
+ case "erpc":
39
+ if (erpcProjectId && erpcUrl) {
40
+ result.push({
41
+ name: "erpc",
42
+ url: getErpcKey(network, erpcProjectId, erpcUrl),
43
+ });
44
+ }
45
+ break;
46
+ }
47
+ }
48
+ return result.filter(p => !!p.url);
49
+ }
50
+ export function createRevolverTransport(network, providers, config) {
51
+ return RevolverTransport.create({
52
+ network,
53
+ providers: getProviders(network, providers),
54
+ ...config,
55
+ });
56
+ }
package/dist/index.d.ts CHANGED
@@ -1,5 +1,8 @@
1
1
  export * from "./CensoredString.js";
2
2
  export * from "./CensoredURL.js";
3
+ export * from "./createRevolverTransport.js";
4
+ export * from "./providers.js";
5
+ export * from "./providers-schema.js";
3
6
  export * from "./resolveYamlFiles.js";
4
7
  export * from "./SecretsManager.js";
5
8
  export * from "./SSMManager.js";
package/dist/index.js CHANGED
@@ -1,5 +1,8 @@
1
1
  export * from "./CensoredString.js";
2
2
  export * from "./CensoredURL.js";
3
+ export * from "./createRevolverTransport.js";
4
+ export * from "./providers.js";
5
+ export * from "./providers-schema.js";
3
6
  export * from "./resolveYamlFiles.js";
4
7
  export * from "./SecretsManager.js";
5
8
  export * from "./SSMManager.js";
@@ -0,0 +1,30 @@
1
+ import { z } from "zod/v4";
2
+ import { CensoredString } from "./CensoredString.js";
3
+ import { CensoredURL } from "./CensoredURL.js";
4
+ export declare const RpcProvider: z.ZodEnum<{
5
+ custom: "custom";
6
+ alchemy: "alchemy";
7
+ drpc: "drpc";
8
+ ankr: "ankr";
9
+ thirdweb: "thirdweb";
10
+ erpc: "erpc";
11
+ }>;
12
+ export type RpcProvider = z.infer<typeof RpcProvider>;
13
+ export declare const ProvidersSchema: z.ZodObject<{
14
+ jsonRpcProviders: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodPipe<z.ZodString, z.ZodTransform<string[], string>>]>, z.ZodArray<z.ZodPipe<z.ZodURL, z.ZodTransform<CensoredURL, string>>>>, z.ZodTransform<CensoredURL[] | undefined, CensoredURL[]>>>;
15
+ enabledProviders: z.ZodDefault<z.ZodPipe<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodPipe<z.ZodString, z.ZodTransform<string[], string>>]>, z.ZodArray<z.ZodEnum<{
16
+ custom: "custom";
17
+ alchemy: "alchemy";
18
+ drpc: "drpc";
19
+ ankr: "ankr";
20
+ thirdweb: "thirdweb";
21
+ erpc: "erpc";
22
+ }>>>>;
23
+ alchemyKeys: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodPipe<z.ZodString, z.ZodTransform<string[], string>>]>, z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<CensoredString<string>, string>>>>, z.ZodTransform<CensoredString<string>[] | undefined, CensoredString<string>[]>>>;
24
+ drpcKeys: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodPipe<z.ZodString, z.ZodTransform<string[], string>>]>, z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<CensoredString<string>, string>>>>, z.ZodTransform<CensoredString<string>[] | undefined, CensoredString<string>[]>>>;
25
+ ankrKeys: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodPipe<z.ZodString, z.ZodTransform<string[], string>>]>, z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<CensoredString<string>, string>>>>, z.ZodTransform<CensoredString<string>[] | undefined, CensoredString<string>[]>>>;
26
+ thirdwebKeys: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodPipe<z.ZodString, z.ZodTransform<string[], string>>]>, z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<CensoredString<string>, string>>>>, z.ZodTransform<CensoredString<string>[] | undefined, CensoredString<string>[]>>>;
27
+ erpcProjectId: z.ZodOptional<z.ZodString>;
28
+ erpcUrl: z.ZodDefault<z.ZodURL>;
29
+ }, z.core.$strip>;
30
+ export type ProvidersSchema = z.infer<typeof ProvidersSchema>;
@@ -0,0 +1,103 @@
1
+ import { z } from "zod/v4";
2
+ import { CensoredString } from "./CensoredString.js";
3
+ import { CensoredURL } from "./CensoredURL.js";
4
+ import { stringArrayLike } from "./schema-primitives.js";
5
+ import { zommandRegistry } from "./Zommand.js";
6
+ export const RpcProvider = z.enum([
7
+ "alchemy",
8
+ "drpc",
9
+ "ankr",
10
+ "thirdweb",
11
+ "custom",
12
+ "erpc",
13
+ ]);
14
+ export const ProvidersSchema = z.object({
15
+ /**
16
+ * RPC providers to use
17
+ */
18
+ jsonRpcProviders: stringArrayLike()
19
+ .pipe(z.array(z.url().transform(CensoredURL.transform)))
20
+ .transform(a => (a.length ? a : undefined))
21
+ .optional()
22
+ .register(zommandRegistry, {
23
+ flags: "--json-rpc-providers <urls...>",
24
+ description: "RPC providers to use, comma separated full http urls.",
25
+ env: "JSON_RPC_PROVIDERS",
26
+ }),
27
+ /**
28
+ * RPC providers to use with their keys
29
+ * Order matters
30
+ */
31
+ enabledProviders: stringArrayLike()
32
+ .pipe(z.array(RpcProvider))
33
+ .default(["erpc", "custom", "drpc", "alchemy", "ankr", "thirdweb"])
34
+ .register(zommandRegistry, {
35
+ flags: "--enabled-providers <providers...>",
36
+ description: "Keyed RPC providers to use, comma separated, order matters. Possible values: custom (for full json rpc urls)/alchemy/drpc/ankr/thirdweb",
37
+ env: "ENABLED_PROVIDERS",
38
+ }),
39
+ /**
40
+ * Alchemy API keys to use
41
+ */
42
+ alchemyKeys: stringArrayLike()
43
+ .pipe(z.array(z.string().transform(CensoredString.transform)))
44
+ .transform(a => (a.length ? a : undefined))
45
+ .optional()
46
+ .register(zommandRegistry, {
47
+ flags: "--alchemy-keys <keys...>",
48
+ description: "Alchemy API keys to use, comma separated",
49
+ env: "ALCHEMY_KEYS",
50
+ }),
51
+ /**
52
+ * DRPC API keys to use
53
+ */
54
+ drpcKeys: stringArrayLike()
55
+ .pipe(z.array(z.string().transform(CensoredString.transform)))
56
+ .transform(a => (a.length ? a : undefined))
57
+ .optional()
58
+ .register(zommandRegistry, {
59
+ flags: "--drpc-keys <keys...>",
60
+ description: "DRPC API keys to use, comma separated",
61
+ env: "DRPC_KEYS",
62
+ }),
63
+ /**
64
+ * Ankr API keys to use
65
+ */
66
+ ankrKeys: stringArrayLike()
67
+ .pipe(z.array(z.string().transform(CensoredString.transform)))
68
+ .transform(a => (a.length ? a : undefined))
69
+ .optional()
70
+ .register(zommandRegistry, {
71
+ flags: "--ankr-keys <keys...>",
72
+ description: "Ankr API keys to use, comma separated",
73
+ env: "ANKR_KEYS",
74
+ }),
75
+ /**
76
+ * Thirdweb API keys to use
77
+ */
78
+ thirdwebKeys: stringArrayLike()
79
+ .pipe(z.array(z.string().transform(CensoredString.transform)))
80
+ .transform(a => (a.length ? a : undefined))
81
+ .optional()
82
+ .register(zommandRegistry, {
83
+ flags: "--thirdweb-keys <keys...>",
84
+ description: "Thirdweb API keys to use, comma separated",
85
+ env: "THIRDWEB_KEYS",
86
+ }),
87
+ /**
88
+ * If set, eRPC will be added as first provider
89
+ */
90
+ erpcProjectId: z.string().optional().register(zommandRegistry, {
91
+ flags: "--erpc-project-id <project-id>",
92
+ description: "If set, eRPC will be added as first provider",
93
+ env: "ERPC_PROJECT_ID",
94
+ }),
95
+ /**
96
+ * eRPC URL to use
97
+ */
98
+ erpcUrl: z.url().default("http://erpc.local").register(zommandRegistry, {
99
+ flags: "--erpc-url <url>",
100
+ description: "eRPC URL to use",
101
+ env: "ERPC_URL",
102
+ }),
103
+ });
@@ -0,0 +1,6 @@
1
+ import { type NetworkType } from "@gearbox-protocol/sdk";
2
+ export declare function getAlchemyUrl(network: NetworkType, apiKey: string, protocol?: "http" | "ws"): string | undefined;
3
+ export declare function getDrpcUrl(network: NetworkType, apiKey: string, protocol?: "http" | "ws"): string | undefined;
4
+ export declare function getAnkrUrl(network: NetworkType, apiKey: string, protocol?: "http" | "ws"): string | undefined;
5
+ export declare function getThirdWebUrl(network: NetworkType, apiKey: string, protocol?: "http" | "ws"): string | undefined;
6
+ export declare function getErpcKey(network: NetworkType, projectId?: string, urlBase?: string): string | undefined;
@@ -0,0 +1,99 @@
1
+ import { chains, getChain } from "@gearbox-protocol/sdk";
2
+ export function getAlchemyUrl(network, apiKey, protocol = "http") {
3
+ const alchemyDomain = ALCHEMY_DOMAINS[network];
4
+ if (!alchemyDomain) {
5
+ return undefined;
6
+ }
7
+ return `${protocol}s://${alchemyDomain}.g.alchemy.com/v2/${apiKey}`;
8
+ }
9
+ const DRPC_NETS = {
10
+ Arbitrum: "arbitrum",
11
+ Base: "base",
12
+ BNB: "bsc",
13
+ Mainnet: "ethereum",
14
+ Optimism: "optimism",
15
+ Sonic: "sonic",
16
+ WorldChain: "worldchain",
17
+ Berachain: "berachain",
18
+ Avalanche: "avalanche",
19
+ Monad: "monad-testnet",
20
+ Hemi: "hemi",
21
+ Lisk: "lisk",
22
+ MegaETH: null,
23
+ Etherlink: null,
24
+ Plasma: "plasma",
25
+ };
26
+ const ALCHEMY_DOMAINS = {
27
+ Mainnet: "eth-mainnet",
28
+ Arbitrum: "arb-mainnet",
29
+ Optimism: "opt-mainnet",
30
+ Base: "base-mainnet",
31
+ Sonic: "sonic-mainnet",
32
+ Monad: "monad-testnet",
33
+ Berachain: "berachain-mainnet",
34
+ Avalanche: "avax-mainnet",
35
+ BNB: "bnb-mainnet",
36
+ WorldChain: "worldchain-mainnet",
37
+ MegaETH: null,
38
+ Etherlink: null,
39
+ Hemi: null,
40
+ Lisk: null,
41
+ Plasma: "plasma-mainnet",
42
+ };
43
+ export function getDrpcUrl(network, apiKey, protocol = "http") {
44
+ const net = DRPC_NETS[network];
45
+ return net ? `${protocol}s://lb.drpc.org/${net}/${apiKey}` : undefined;
46
+ }
47
+ const ANKR_DOMAINS = {
48
+ Arbitrum: "arbitrum",
49
+ Avalanche: "avalanche",
50
+ Base: "base",
51
+ Berachain: null,
52
+ BNB: "bsc",
53
+ Etherlink: "etherlink_mainnet",
54
+ Hemi: null,
55
+ Lisk: null,
56
+ Mainnet: "eth",
57
+ MegaETH: null,
58
+ Monad: "monad_testnet",
59
+ Optimism: "optimism",
60
+ Plasma: null,
61
+ Sonic: "sonic_mainnet",
62
+ WorldChain: null,
63
+ };
64
+ export function getAnkrUrl(network, apiKey, protocol = "http") {
65
+ const net = ANKR_DOMAINS[network];
66
+ const sep = protocol === "ws" ? "/ws/" : "/";
67
+ return net ? `${protocol}s://rpc.ankr.com/${net}${sep}${apiKey}` : undefined;
68
+ }
69
+ const THIRDWEB_DOMAINS = {
70
+ Arbitrum: chains.Arbitrum.id.toString(),
71
+ Avalanche: chains.Avalanche.id.toString(),
72
+ Base: chains.Base.id.toString(),
73
+ Berachain: chains.Berachain.id.toString(),
74
+ BNB: chains.BNB.id.toString(),
75
+ Etherlink: chains.Etherlink.id.toString(),
76
+ Hemi: chains.Hemi.id.toString(),
77
+ Lisk: chains.Lisk.id.toString(),
78
+ Mainnet: chains.Mainnet.id.toString(),
79
+ MegaETH: chains.MegaETH.id.toString(),
80
+ Monad: chains.Monad.id.toString(),
81
+ Optimism: chains.Optimism.id.toString(),
82
+ Plasma: chains.Plasma.id.toString(),
83
+ Sonic: chains.Sonic.id.toString(),
84
+ WorldChain: chains.WorldChain.id.toString(),
85
+ };
86
+ export function getThirdWebUrl(network, apiKey, protocol = "http") {
87
+ if (protocol === "ws") {
88
+ return undefined;
89
+ }
90
+ const net = THIRDWEB_DOMAINS[network];
91
+ return `https://${net}.rpc.thirdweb.com/${apiKey}`;
92
+ }
93
+ export function getErpcKey(network, projectId, urlBase) {
94
+ if (!projectId || !urlBase) {
95
+ return undefined;
96
+ }
97
+ const chain = getChain(network);
98
+ return `${urlBase}/${projectId}/evm/${chain.id}`;
99
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gearbox-protocol/cli-utils",
3
3
  "description": "Utils for creating cli apps",
4
- "version": "5.55.0",
4
+ "version": "5.57.0",
5
5
  "homepage": "https://gearbox.fi",
6
6
  "keywords": [
7
7
  "gearbox"
@@ -29,17 +29,19 @@
29
29
  "package:version": "yarn version"
30
30
  },
31
31
  "dependencies": {
32
- "@aws-sdk/client-secrets-manager": "^3.914.0",
33
- "@aws-sdk/client-ssm": "^3.914.0",
32
+ "@aws-sdk/client-secrets-manager": "^3.922.0",
33
+ "@aws-sdk/client-ssm": "^3.922.0",
34
+ "@gearbox-protocol/sdk": ">=10.4.3",
34
35
  "abitype": "^1.1.1",
35
- "commander": "^14.0.1",
36
+ "commander": "^14.0.2",
36
37
  "lodash-es": "^4.17.21",
38
+ "viem": "^2.38.6",
37
39
  "yaml": "^2.8.1",
38
40
  "zod": "^4.1.12"
39
41
  },
40
42
  "devDependencies": {
41
43
  "@commander-js/extra-typings": "^14.0.0",
42
44
  "@types/lodash-es": "^4.17.12",
43
- "@types/node": "^24.9.1"
45
+ "@types/node": "^24.10.0"
44
46
  }
45
47
  }