@gearbox-protocol/cli-utils 9.0.1 → 9.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.
@@ -0,0 +1,56 @@
1
+ // src/schemas/schema-primitives.ts
2
+ import { getAddress, isAddress } from "viem";
3
+ import { z } from "zod/v4";
4
+ var boolLike = () => z.any().transform((v) => {
5
+ if (typeof v === "string") {
6
+ return ["true", "1"].includes(v.toLowerCase());
7
+ }
8
+ return Boolean(v);
9
+ });
10
+ var stringArrayLike = () => z.union([z.array(z.string()), z.string().transform((val) => val.split(","))]);
11
+ var optionalStringArrayLike = () => stringArrayLike().optional().transform((v) => v?.length ? v : void 0);
12
+ var addressLike = () => z.string().transform((val, ctx) => {
13
+ if (!isAddress(val)) {
14
+ ctx.issues.push({
15
+ code: "custom",
16
+ message: `invalid address ${val}`,
17
+ input: ctx.value
18
+ });
19
+ }
20
+ return getAddress(val);
21
+ });
22
+ var addressArrayLike = () => stringArrayLike().pipe(z.array(addressLike()));
23
+ var optionalAddressArrayLike = () => stringArrayLike().pipe(z.array(addressLike())).optional().transform((v) => v?.length ? v : void 0);
24
+
25
+ // src/schemas/whitelist-schema.ts
26
+ import { NetworkType } from "@gearbox-protocol/sdk";
27
+ import { z as z2 } from "zod/v4";
28
+ var WhitelistItemsSchema = z2.object({
29
+ network: NetworkType,
30
+ addresses: z2.array(addressLike()).min(1),
31
+ reason: z2.string().default(""),
32
+ issue: z2.string().optional(),
33
+ expiresAt: z2.number().optional()
34
+ });
35
+ var WhitelistItemSchema = z2.object({
36
+ network: NetworkType,
37
+ category: z2.string(),
38
+ address: addressLike(),
39
+ reason: z2.string().default(""),
40
+ issue: z2.string().optional(),
41
+ contractType: z2.string().optional(),
42
+ createdAt: z2.number(),
43
+ expiresAt: z2.number().optional()
44
+ });
45
+
46
+ export {
47
+ boolLike,
48
+ stringArrayLike,
49
+ optionalStringArrayLike,
50
+ addressLike,
51
+ addressArrayLike,
52
+ optionalAddressArrayLike,
53
+ WhitelistItemsSchema,
54
+ WhitelistItemSchema
55
+ };
56
+ //# sourceMappingURL=chunk-WVBN5ZL7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schemas/schema-primitives.ts","../src/schemas/whitelist-schema.ts"],"sourcesContent":["import { getAddress, isAddress } from \"viem\";\nimport { z } from \"zod/v4\";\n\nexport const boolLike = () =>\n z.any().transform(v => {\n if (typeof v === \"string\") {\n return [\"true\", \"1\"].includes(v.toLowerCase());\n }\n return Boolean(v);\n });\n\nexport const stringArrayLike = () =>\n z.union([z.array(z.string()), z.string().transform(val => val.split(\",\"))]);\n\nexport const optionalStringArrayLike = () =>\n stringArrayLike()\n .optional()\n .transform(v => (v?.length ? v : undefined));\n\n/**\n * Like Address from abitype/zod, but converts an address into an address that is checksum encoded.\n */\nexport const addressLike = () =>\n z.string().transform((val, ctx) => {\n if (!isAddress(val)) {\n ctx.issues.push({\n code: \"custom\",\n message: `invalid address ${val}`,\n input: ctx.value,\n });\n }\n\n return getAddress(val);\n });\n\nexport const addressArrayLike = () =>\n stringArrayLike().pipe(z.array(addressLike()));\n\nexport const optionalAddressArrayLike = () =>\n stringArrayLike()\n .pipe(z.array(addressLike()))\n .optional()\n .transform(v => (v?.length ? v : undefined));\n","// Mirror of packages/shared/src/whitelist-schema.ts; keep in sync.\nimport { NetworkType } from \"@gearbox-protocol/sdk\";\nimport { z } from \"zod/v4\";\nimport { addressLike } from \"./schema-primitives.js\";\n\nexport const WhitelistItemsSchema = z.object({\n network: NetworkType,\n addresses: z.array(addressLike()).min(1),\n reason: z.string().default(\"\"),\n issue: z.string().optional(),\n expiresAt: z.number().optional(),\n});\n\nexport type WhitelistItemsSchema = z.infer<typeof WhitelistItemsSchema>;\n\nexport const WhitelistItemSchema = z.object({\n network: NetworkType,\n category: z.string(),\n address: addressLike(),\n reason: z.string().default(\"\"),\n issue: z.string().optional(),\n contractType: z.string().optional(),\n createdAt: z.number(),\n expiresAt: z.number().optional(),\n});\n\nexport type WhitelistItemSchema = z.infer<typeof WhitelistItemSchema>;\n"],"mappings":";AAAA,SAAS,YAAY,iBAAiB;AACtC,SAAS,SAAS;AAEX,IAAM,WAAW,MACtB,EAAE,IAAI,EAAE,UAAU,OAAK;AACrB,MAAI,OAAO,MAAM,UAAU;AACzB,WAAO,CAAC,QAAQ,GAAG,EAAE,SAAS,EAAE,YAAY,CAAC;AAAA,EAC/C;AACA,SAAO,QAAQ,CAAC;AAClB,CAAC;AAEI,IAAM,kBAAkB,MAC7B,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,SAAO,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC;AAErE,IAAM,0BAA0B,MACrC,gBAAgB,EACb,SAAS,EACT,UAAU,OAAM,GAAG,SAAS,IAAI,MAAU;AAKxC,IAAM,cAAc,MACzB,EAAE,OAAO,EAAE,UAAU,CAAC,KAAK,QAAQ;AACjC,MAAI,CAAC,UAAU,GAAG,GAAG;AACnB,QAAI,OAAO,KAAK;AAAA,MACd,MAAM;AAAA,MACN,SAAS,mBAAmB,GAAG;AAAA,MAC/B,OAAO,IAAI;AAAA,IACb,CAAC;AAAA,EACH;AAEA,SAAO,WAAW,GAAG;AACvB,CAAC;AAEI,IAAM,mBAAmB,MAC9B,gBAAgB,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC,CAAC;AAExC,IAAM,2BAA2B,MACtC,gBAAgB,EACb,KAAK,EAAE,MAAM,YAAY,CAAC,CAAC,EAC3B,SAAS,EACT,UAAU,OAAM,GAAG,SAAS,IAAI,MAAU;;;ACzC/C,SAAS,mBAAmB;AAC5B,SAAS,KAAAA,UAAS;AAGX,IAAM,uBAAuBC,GAAE,OAAO;AAAA,EAC3C,SAAS;AAAA,EACT,WAAWA,GAAE,MAAM,YAAY,CAAC,EAAE,IAAI,CAAC;AAAA,EACvC,QAAQA,GAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EAC7B,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,WAAWA,GAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAIM,IAAM,sBAAsBA,GAAE,OAAO;AAAA,EAC1C,SAAS;AAAA,EACT,UAAUA,GAAE,OAAO;AAAA,EACnB,SAAS,YAAY;AAAA,EACrB,QAAQA,GAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EAC7B,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,cAAcA,GAAE,OAAO,EAAE,SAAS;AAAA,EAClC,WAAWA,GAAE,OAAO;AAAA,EACpB,WAAWA,GAAE,OAAO,EAAE,SAAS;AACjC,CAAC;","names":["z","z"]}
package/dist/index.d.ts CHANGED
@@ -4,6 +4,8 @@ import { ILogger, NetworkType } from '@gearbox-protocol/sdk';
4
4
  import { ProviderConfig } from '@gearbox-protocol/sdk/dev';
5
5
  import { Markdown } from '@vlad-yakovlev/telegram-md';
6
6
  import YAML from 'yaml';
7
+ import { WhitelistItemSchema } from './schema.js';
8
+ export { WhitelistItemsSchema, addressArrayLike, addressLike, boolLike, optionalAddressArrayLike, optionalStringArrayLike, stringArrayLike } from './schema.js';
7
9
  import { Command } from '@commander-js/extra-typings';
8
10
  import * as z4 from 'zod/v4/core';
9
11
 
@@ -310,16 +312,6 @@ declare class SSMManager {
310
312
  }
311
313
  declare const ssmManagerProxy: (mgr?: SSMManager) => Record<string, Promise<unknown>>;
312
314
 
313
- declare const boolLike: () => z.ZodPipe<z.ZodAny, z.ZodTransform<boolean, any>>;
314
- declare const stringArrayLike: () => z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodPipe<z.ZodString, z.ZodTransform<string[], string>>]>;
315
- declare const optionalStringArrayLike: () => z.ZodPipe<z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodPipe<z.ZodString, z.ZodTransform<string[], string>>]>>, z.ZodTransform<string[] | undefined, string[] | undefined>>;
316
- /**
317
- * Like Address from abitype/zod, but converts an address into an address that is checksum encoded.
318
- */
319
- declare const addressLike: () => z.ZodPipe<z.ZodString, z.ZodTransform<`0x${string}`, string>>;
320
- declare const addressArrayLike: () => 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<`0x${string}`, string>>>>;
321
- declare const optionalAddressArrayLike: () => z.ZodPipe<z.ZodOptional<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<`0x${string}`, string>>>>>, z.ZodTransform<`0x${string}`[] | undefined, `0x${string}`[] | undefined>>;
322
-
323
315
  declare function sleep(ms: number): Promise<unknown>;
324
316
 
325
317
  interface IValue<V extends string = string> {
@@ -327,60 +319,6 @@ interface IValue<V extends string = string> {
327
319
  }
328
320
  declare function uncensorMap<V extends string = string>(map: Record<string, IValue<V>>): Record<string, V>;
329
321
 
330
- declare const WhitelistItemsSchema: z.ZodObject<{
331
- network: z.ZodEnum<{
332
- Mainnet: "Mainnet";
333
- Arbitrum: "Arbitrum";
334
- Optimism: "Optimism";
335
- Base: "Base";
336
- Sonic: "Sonic";
337
- MegaETH: "MegaETH";
338
- Monad: "Monad";
339
- Berachain: "Berachain";
340
- Avalanche: "Avalanche";
341
- BNB: "BNB";
342
- WorldChain: "WorldChain";
343
- Etherlink: "Etherlink";
344
- Hemi: "Hemi";
345
- Lisk: "Lisk";
346
- Plasma: "Plasma";
347
- Somnia: "Somnia";
348
- }>;
349
- addresses: z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<`0x${string}`, string>>>;
350
- reason: z.ZodDefault<z.ZodString>;
351
- issue: z.ZodOptional<z.ZodString>;
352
- expiresAt: z.ZodOptional<z.ZodNumber>;
353
- }, z.core.$strip>;
354
- type WhitelistItemsSchema = z.infer<typeof WhitelistItemsSchema>;
355
- declare const WhitelistItemSchema: z.ZodObject<{
356
- network: z.ZodEnum<{
357
- Mainnet: "Mainnet";
358
- Arbitrum: "Arbitrum";
359
- Optimism: "Optimism";
360
- Base: "Base";
361
- Sonic: "Sonic";
362
- MegaETH: "MegaETH";
363
- Monad: "Monad";
364
- Berachain: "Berachain";
365
- Avalanche: "Avalanche";
366
- BNB: "BNB";
367
- WorldChain: "WorldChain";
368
- Etherlink: "Etherlink";
369
- Hemi: "Hemi";
370
- Lisk: "Lisk";
371
- Plasma: "Plasma";
372
- Somnia: "Somnia";
373
- }>;
374
- category: z.ZodString;
375
- address: z.ZodPipe<z.ZodString, z.ZodTransform<`0x${string}`, string>>;
376
- reason: z.ZodDefault<z.ZodString>;
377
- issue: z.ZodOptional<z.ZodString>;
378
- contractType: z.ZodOptional<z.ZodString>;
379
- createdAt: z.ZodNumber;
380
- expiresAt: z.ZodOptional<z.ZodNumber>;
381
- }, z.core.$strip>;
382
- type WhitelistItemSchema = z.infer<typeof WhitelistItemSchema>;
383
-
384
322
  interface WhitelistOptions {
385
323
  url: string;
386
324
  network: NetworkType;
@@ -433,4 +371,4 @@ declare class Zommand<T extends z4.$ZodTypes, Args extends any[] = []> extends C
433
371
  action(fn: (this: this, ...args: [...Args, z4.output<T>, this]) => void | Promise<void>): this;
434
372
  }
435
373
 
436
- export { CensoredString, CensoredURL, type HttpTransportOptions, type IDedupableNotification, type INotification, type INotificationService, type INotifier, type IValue, NotificationConfig, type NotificationLike, type NotificationSeverity, NotificationsService, type NotificationsServiceOptions, ProvidersSchema, RpcProvider, SSMManager, SecretsManager, SignlConfig, SlackConfig, TelegramConfig, type TemplateData, type ThrottleFn, Whitelist, WhitelistItemSchema, WhitelistItemsSchema, type WhitelistOptions, Zommand, type ZommandOptions, addressArrayLike, addressLike, boolLike, compressObject, createNotifier, createPinoCensor, decompressObject, fetchRetry, getAlchemyUrl, getAnkrUrl, getDrpcUrl, getErpcKey, getFirstHttpTransportOptions, getProviders, getRelativePath, getThirdWebUrl, optionalAddressArrayLike, optionalStringArrayLike, resolveFromObject, resolveYamlDoc, resolveYamlFiles, secretsManagerProxy, sleep, ssmManagerProxy, stringArrayLike, uncensorMap, zommandRegistry };
374
+ export { CensoredString, CensoredURL, type HttpTransportOptions, type IDedupableNotification, type INotification, type INotificationService, type INotifier, type IValue, NotificationConfig, type NotificationLike, type NotificationSeverity, NotificationsService, type NotificationsServiceOptions, ProvidersSchema, RpcProvider, SSMManager, SecretsManager, SignlConfig, SlackConfig, TelegramConfig, type TemplateData, type ThrottleFn, Whitelist, WhitelistItemSchema, type WhitelistOptions, Zommand, type ZommandOptions, compressObject, createNotifier, createPinoCensor, decompressObject, fetchRetry, getAlchemyUrl, getAnkrUrl, getDrpcUrl, getErpcKey, getFirstHttpTransportOptions, getProviders, getRelativePath, getThirdWebUrl, resolveFromObject, resolveYamlDoc, resolveYamlFiles, secretsManagerProxy, sleep, ssmManagerProxy, uncensorMap, zommandRegistry };
package/dist/index.js CHANGED
@@ -1,3 +1,14 @@
1
+ import {
2
+ WhitelistItemSchema,
3
+ WhitelistItemsSchema,
4
+ addressArrayLike,
5
+ addressLike,
6
+ boolLike,
7
+ optionalAddressArrayLike,
8
+ optionalStringArrayLike,
9
+ stringArrayLike
10
+ } from "./chunk-WVBN5ZL7.js";
11
+
1
12
  // src/CensoredString.ts
2
13
  var CensoredString = class _CensoredString {
3
14
  #value;
@@ -567,62 +578,36 @@ var SlackNotifier = class {
567
578
  };
568
579
 
569
580
  // src/notifications/schema.ts
570
- import { z as z2 } from "zod/v4";
571
-
572
- // src/schema-primitives.ts
573
- import { getAddress, isAddress } from "viem";
574
581
  import { z } from "zod/v4";
575
- var boolLike = () => z.any().transform((v) => {
576
- if (typeof v === "string") {
577
- return ["true", "1"].includes(v.toLowerCase());
578
- }
579
- return Boolean(v);
580
- });
581
- var stringArrayLike = () => z.union([z.array(z.string()), z.string().transform((val) => val.split(","))]);
582
- var optionalStringArrayLike = () => stringArrayLike().optional().transform((v) => v?.length ? v : void 0);
583
- var addressLike = () => z.string().transform((val, ctx) => {
584
- if (!isAddress(val)) {
585
- ctx.issues.push({
586
- code: "custom",
587
- message: `invalid address ${val}`,
588
- input: ctx.value
589
- });
590
- }
591
- return getAddress(val);
592
- });
593
- var addressArrayLike = () => stringArrayLike().pipe(z.array(addressLike()));
594
- var optionalAddressArrayLike = () => stringArrayLike().pipe(z.array(addressLike())).optional().transform((v) => v?.length ? v : void 0);
595
-
596
- // src/notifications/schema.ts
597
- var TelegramConfig = z2.object({
598
- type: z2.literal("telegram"),
599
- token: z2.union([z2.string(), z2.instanceof(CensoredString)]).transform(CensoredString.transform),
600
- alertsChannel: z2.union([z2.string().startsWith("-"), z2.instanceof(CensoredString)]).transform(CensoredString.transform),
582
+ var TelegramConfig = z.object({
583
+ type: z.literal("telegram"),
584
+ token: z.union([z.string(), z.instanceof(CensoredString)]).transform(CensoredString.transform),
585
+ alertsChannel: z.union([z.string().startsWith("-"), z.instanceof(CensoredString)]).transform(CensoredString.transform),
601
586
  /**
602
587
  * Optional channel to send notifications to
603
588
  * If not set, notifications will not be sent
604
589
  */
605
- notificationsChannel: z2.union([z2.string().startsWith("-"), z2.instanceof(CensoredString)]).transform(CensoredString.transform).optional(),
606
- prefix: z2.string().optional()
590
+ notificationsChannel: z.union([z.string().startsWith("-"), z.instanceof(CensoredString)]).transform(CensoredString.transform).optional(),
591
+ prefix: z.string().optional()
607
592
  });
608
- var SlackConfig = z2.object({
609
- type: z2.literal("slack"),
593
+ var SlackConfig = z.object({
594
+ type: z.literal("slack"),
610
595
  /**
611
596
  * Slack webhook URL for sending notifications
612
597
  */
613
- webhookUrl: z2.union([z2.string(), z2.instanceof(CensoredString)]).transform(CensoredString.transform),
598
+ webhookUrl: z.union([z.string(), z.instanceof(CensoredString)]).transform(CensoredString.transform),
614
599
  /**
615
600
  * If true, only alerts will be sent. Informational notifications are suppressed
616
601
  */
617
602
  alertsOnly: boolLike().optional()
618
603
  });
619
- var NotificationConfig = z2.discriminatedUnion("type", [
604
+ var NotificationConfig = z.discriminatedUnion("type", [
620
605
  TelegramConfig,
621
606
  SlackConfig
622
607
  ]);
623
- var SignlConfig = z2.object({
624
- apiKey: z2.union([z2.string(), z2.instanceof(CensoredString)]).transform(CensoredString.transform),
625
- teamId: z2.union([z2.string(), z2.instanceof(CensoredString)]).transform(CensoredString.transform)
608
+ var SignlConfig = z.object({
609
+ apiKey: z.union([z.string(), z.instanceof(CensoredString)]).transform(CensoredString.transform),
610
+ teamId: z.union([z.string(), z.instanceof(CensoredString)]).transform(CensoredString.transform)
626
611
  });
627
612
 
628
613
  // src/notifications/TelegramNotifier.ts
@@ -955,7 +940,7 @@ var NotificationsService = class {
955
940
 
956
941
  // src/providers-schema.ts
957
942
  import { SUPPORTED_NETWORKS } from "@gearbox-protocol/sdk";
958
- import { z as z3 } from "zod/v4";
943
+ import { z as z2 } from "zod/v4";
959
944
 
960
945
  // src/Zommand.ts
961
946
  import { Command, Option } from "@commander-js/extra-typings";
@@ -1064,7 +1049,7 @@ var Zommand = class extends Command {
1064
1049
  };
1065
1050
 
1066
1051
  // src/providers-schema.ts
1067
- var RpcProvider = z3.enum([
1052
+ var RpcProvider = z2.enum([
1068
1053
  "alchemy",
1069
1054
  "drpc",
1070
1055
  "ankr",
@@ -1072,8 +1057,8 @@ var RpcProvider = z3.enum([
1072
1057
  "custom",
1073
1058
  "erpc"
1074
1059
  ]);
1075
- var ProvidersSchema = z3.object({
1076
- network: z3.enum(SUPPORTED_NETWORKS).register(zommandRegistry, {
1060
+ var ProvidersSchema = z2.object({
1061
+ network: z2.enum(SUPPORTED_NETWORKS).register(zommandRegistry, {
1077
1062
  flags: "--network <network>",
1078
1063
  description: "Gearbox-supported network",
1079
1064
  env: "NETWORK"
@@ -1081,7 +1066,7 @@ var ProvidersSchema = z3.object({
1081
1066
  /**
1082
1067
  * RPC providers to use
1083
1068
  */
1084
- jsonRpcProviders: stringArrayLike().pipe(z3.array(z3.url().transform(CensoredURL.transform))).transform((a) => a.length ? a : void 0).optional().register(zommandRegistry, {
1069
+ jsonRpcProviders: stringArrayLike().pipe(z2.array(z2.url().transform(CensoredURL.transform))).transform((a) => a.length ? a : void 0).optional().register(zommandRegistry, {
1085
1070
  flags: "--json-rpc-providers <urls...>",
1086
1071
  description: "RPC providers to use, comma separated full http urls.",
1087
1072
  env: "JSON_RPC_PROVIDERS"
@@ -1090,7 +1075,7 @@ var ProvidersSchema = z3.object({
1090
1075
  * RPC providers to use with their keys
1091
1076
  * Order matters
1092
1077
  */
1093
- enabledProviders: stringArrayLike().pipe(z3.array(RpcProvider)).optional().register(zommandRegistry, {
1078
+ enabledProviders: stringArrayLike().pipe(z2.array(RpcProvider)).optional().register(zommandRegistry, {
1094
1079
  flags: "--enabled-providers <providers...>",
1095
1080
  description: "Keyed RPC providers to use, comma separated, order matters. Possible values: custom (for full json rpc urls)/alchemy/drpc/ankr/thirdweb",
1096
1081
  env: "ENABLED_PROVIDERS"
@@ -1098,7 +1083,7 @@ var ProvidersSchema = z3.object({
1098
1083
  /**
1099
1084
  * Alchemy API keys to use
1100
1085
  */
1101
- alchemyKeys: stringArrayLike().pipe(z3.array(z3.string().transform(CensoredString.transform))).transform((a) => a.length ? a : void 0).optional().register(zommandRegistry, {
1086
+ alchemyKeys: stringArrayLike().pipe(z2.array(z2.string().transform(CensoredString.transform))).transform((a) => a.length ? a : void 0).optional().register(zommandRegistry, {
1102
1087
  flags: "--alchemy-keys <keys...>",
1103
1088
  description: "Alchemy API keys to use, comma separated",
1104
1089
  env: "ALCHEMY_KEYS"
@@ -1106,7 +1091,7 @@ var ProvidersSchema = z3.object({
1106
1091
  /**
1107
1092
  * DRPC API keys to use
1108
1093
  */
1109
- drpcKeys: stringArrayLike().pipe(z3.array(z3.string().transform(CensoredString.transform))).transform((a) => a.length ? a : void 0).optional().register(zommandRegistry, {
1094
+ drpcKeys: stringArrayLike().pipe(z2.array(z2.string().transform(CensoredString.transform))).transform((a) => a.length ? a : void 0).optional().register(zommandRegistry, {
1110
1095
  flags: "--drpc-keys <keys...>",
1111
1096
  description: "DRPC API keys to use, comma separated",
1112
1097
  env: "DRPC_KEYS"
@@ -1114,7 +1099,7 @@ var ProvidersSchema = z3.object({
1114
1099
  /**
1115
1100
  * Ankr API keys to use
1116
1101
  */
1117
- ankrKeys: stringArrayLike().pipe(z3.array(z3.string().transform(CensoredString.transform))).transform((a) => a.length ? a : void 0).optional().register(zommandRegistry, {
1102
+ ankrKeys: stringArrayLike().pipe(z2.array(z2.string().transform(CensoredString.transform))).transform((a) => a.length ? a : void 0).optional().register(zommandRegistry, {
1118
1103
  flags: "--ankr-keys <keys...>",
1119
1104
  description: "Ankr API keys to use, comma separated",
1120
1105
  env: "ANKR_KEYS"
@@ -1122,7 +1107,7 @@ var ProvidersSchema = z3.object({
1122
1107
  /**
1123
1108
  * Thirdweb API keys to use
1124
1109
  */
1125
- thirdwebKeys: stringArrayLike().pipe(z3.array(z3.string().transform(CensoredString.transform))).transform((a) => a.length ? a : void 0).optional().register(zommandRegistry, {
1110
+ thirdwebKeys: stringArrayLike().pipe(z2.array(z2.string().transform(CensoredString.transform))).transform((a) => a.length ? a : void 0).optional().register(zommandRegistry, {
1126
1111
  flags: "--thirdweb-keys <keys...>",
1127
1112
  description: "Thirdweb API keys to use, comma separated",
1128
1113
  env: "THIRDWEB_KEYS"
@@ -1130,7 +1115,7 @@ var ProvidersSchema = z3.object({
1130
1115
  /**
1131
1116
  * If set, eRPC will be added as first provider
1132
1117
  */
1133
- erpcProjectId: z3.string().optional().register(zommandRegistry, {
1118
+ erpcProjectId: z2.string().optional().register(zommandRegistry, {
1134
1119
  flags: "--erpc-project-id <project-id>",
1135
1120
  description: "If set, eRPC will be added as first provider",
1136
1121
  env: "ERPC_PROJECT_ID"
@@ -1138,7 +1123,7 @@ var ProvidersSchema = z3.object({
1138
1123
  /**
1139
1124
  * eRPC URL to use
1140
1125
  */
1141
- erpcUrl: z3.url().default("http://erpc.local").register(zommandRegistry, {
1126
+ erpcUrl: z2.url().default("http://erpc.local").register(zommandRegistry, {
1142
1127
  flags: "--erpc-url <url>",
1143
1128
  description: "eRPC URL to use",
1144
1129
  env: "ERPC_URL"
@@ -1146,7 +1131,7 @@ var ProvidersSchema = z3.object({
1146
1131
  /**
1147
1132
  * Timeout for JSON RPC requests, in milliseconds
1148
1133
  */
1149
- jsonRpcTimeout: z3.coerce.number().int().positive().optional().register(zommandRegistry, {
1134
+ jsonRpcTimeout: z2.coerce.number().int().positive().optional().register(zommandRegistry, {
1150
1135
  flags: "--json-rpc-timeout <timeout>",
1151
1136
  description: "Timeout for JSON RPC requests, in milliseconds",
1152
1137
  env: "JSON_RPC_TIMEOUT"
@@ -1248,34 +1233,10 @@ function uncensorMap(map) {
1248
1233
  }
1249
1234
 
1250
1235
  // src/Whitelist.ts
1251
- import { setInterval } from "timers";
1252
1236
  import { AddressMap as AddressMap2 } from "@gearbox-protocol/sdk";
1253
- import { z as z6 } from "zod/v4";
1254
-
1255
- // src/whitelist-schema.ts
1256
- import { NetworkType } from "@gearbox-protocol/sdk";
1257
- import { z as z5 } from "zod/v4";
1258
- var WhitelistItemsSchema = z5.object({
1259
- network: NetworkType,
1260
- addresses: z5.array(addressLike()).min(1),
1261
- reason: z5.string().default(""),
1262
- issue: z5.string().optional(),
1263
- expiresAt: z5.number().optional()
1264
- });
1265
- var WhitelistItemSchema = z5.object({
1266
- network: NetworkType,
1267
- category: z5.string(),
1268
- address: addressLike(),
1269
- reason: z5.string().default(""),
1270
- issue: z5.string().optional(),
1271
- contractType: z5.string().optional(),
1272
- createdAt: z5.number(),
1273
- expiresAt: z5.number().optional()
1274
- });
1275
-
1276
- // src/Whitelist.ts
1237
+ import { z as z3 } from "zod/v4";
1277
1238
  var REFRESH_INTERVAL_MS = 10 * 60 * 1e3;
1278
- var WhitelistResponse = z6.array(WhitelistItemSchema);
1239
+ var WhitelistResponse = z3.array(WhitelistItemSchema);
1279
1240
  var Whitelist = class {
1280
1241
  #url;
1281
1242
  #network;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/CensoredString.ts","../src/CensoredURL.ts","../src/compressedConfig.ts","../src/resolveYamlFiles.ts","../src/getPromisePath.ts","../src/createPinoCensor.ts","../src/sleep.ts","../src/fetchRetry.ts","../src/providers.ts","../src/getProviders.ts","../src/getFirstHttpTransportOptions.ts","../src/notifications/createNotifier.ts","../src/notifications/SlackNotifier.ts","../src/notifications/schema.ts","../src/schema-primitives.ts","../src/notifications/TelegramNotifier.ts","../src/notifications/ThrottleManager.ts","../src/notifications/NotificationsService.ts","../src/notifications/SignlNotifier.ts","../src/providers-schema.ts","../src/Zommand.ts","../src/SecretsManager.ts","../src/SSMManager.ts","../src/uncensorMap.ts","../src/Whitelist.ts","../src/whitelist-schema.ts"],"sourcesContent":["export class CensoredString<V extends string = string> {\n readonly #value: V;\n readonly #censored: string;\n\n public static transform<T extends string>(\n value: T | CensoredString<T>,\n ): CensoredString<T> {\n if (value instanceof CensoredString) {\n return value;\n }\n return new CensoredString(value);\n }\n\n constructor(value: V) {\n this.#value = value;\n const visibleLen = Math.min(4, Math.floor(0.2 * value.length));\n if (visibleLen < 1) {\n this.#censored = \"*\".repeat(Math.min(8, value.length));\n } else {\n this.#censored =\n \"*\".repeat(Math.min(8, value.length - visibleLen)) +\n value.slice(-1 * visibleLen);\n }\n }\n\n public get value(): V {\n return this.#value;\n }\n\n public toString(): string {\n return this.#censored;\n }\n\n public toJSON(): string {\n return this.toString();\n }\n}\n","/**\n * Assumes that host is always visible, and the secret part is in path or query\n */\nexport class CensoredURL {\n readonly #value: string;\n readonly #censored: string;\n\n public static transform(value: string | CensoredURL): CensoredURL {\n if (value instanceof CensoredURL) {\n return value;\n }\n return new CensoredURL(value);\n }\n\n constructor(url: string) {\n this.#value = url;\n if (\n url.includes(\"127.0.0.1\") ||\n url.includes(\"localhost\") ||\n url.includes(\"host.docker.internal\")\n ) {\n this.#censored = url;\n } else {\n try {\n const u = new URL(url);\n if (u.username || u.password) {\n u.username = u.username ? \"****\" : \"\";\n u.password = u.password ? \"****\" : \"\";\n }\n u.pathname = \"/\";\n u.search = \"\";\n this.#censored = `${u.href}******`;\n } catch {\n const visibleLen = Math.min(4, Math.floor(0.2 * url.length));\n if (visibleLen < 1) {\n this.#censored = \"*\".repeat(Math.min(8, url.length));\n } else {\n this.#censored =\n \"*\".repeat(Math.min(8, url.length - visibleLen)) +\n url.slice(-1 * visibleLen);\n }\n }\n }\n }\n\n public get value(): string {\n return this.#value;\n }\n\n public toString(): string {\n return this.#censored;\n }\n\n public toJSON(): string {\n return this.toString();\n }\n}\n","import { deflateSync, inflateSync } from \"node:zlib\";\nimport { resolveFromObject } from \"./resolveYamlFiles.js\";\n\n/**\n * Compress a plain JS object into a base64url string\n * suitable for env vars.\n */\nexport function compressObject(obj: unknown): string {\n const json = JSON.stringify(obj);\n const compressed = deflateSync(Buffer.from(json, \"utf8\"));\n return compressed.toString(\"base64url\");\n}\n\n/**\n * Decompress a base64url string back into a JS object\n * Allows to pass template data to resolve promises/env\n */\nexport async function decompressObject<T = unknown>(\n value: string,\n templateData?: Record<string, unknown>,\n): Promise<T> {\n const compressed = Buffer.from(value, \"base64url\");\n const str = inflateSync(compressed).toString(\"utf8\");\n const json = JSON.parse(str);\n const result = await resolveFromObject(json, templateData);\n return result as T;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { dirname, resolve as pathResolve } from \"node:path\";\nimport { GetObjectCommand, S3Client } from \"@aws-sdk/client-s3\";\nimport YAML, { isPair, isScalar, isSeq } from \"yaml\";\nimport getPromisePath from \"./getPromisePath.js\";\n\nexport type TemplateData = Record<string, unknown>;\n\n/**\n * Template key regexp\n * Consists of alphanumeric+underscore parts separated by dots, all wrappped in env-style brackets\n * e.g. ${KEY} or ${KEY.SUBKEY}\n *\n * Optionally supports a bash-style default value via `:-`, e.g. `${KEY:-fallback}`.\n * The default is used when the resolved value is undefined, null, or an empty string.\n * Capture groups: 1 = key path, 2 = optional default literal (no `}` allowed).\n */\nconst templateKeyRegex = /\\$\\{([\\w-]+(?:\\.[\\w-]+)*)(?::-([^}]*))?\\}/g;\n\n/**\n * Replaces all `${...}` template tokens in a string using the provided template data.\n * Supports bash-style `${KEY:-default}` fallback when the resolved value is missing\n * (undefined, null, or empty string). The default is a literal and is not further\n * interpolated.\n */\nasync function resolveScalarValue(\n val: string,\n templateData?: TemplateData,\n): Promise<string> {\n const matches = val.matchAll(templateKeyRegex);\n for (const match of matches) {\n const [whole, key, defaultValue] = match;\n const resolved = await getPromisePath(templateData, key);\n if (resolved !== undefined && resolved !== null && resolved !== \"\") {\n val = val.replace(whole, String(resolved));\n } else if (defaultValue !== undefined) {\n val = val.replace(whole, defaultValue);\n }\n }\n return val;\n}\n\n/**\n * Merges yaml files, respecting .extends references.\n * Performs env variable substitution on the config.\n * Respects YAML anchors and aliases, and merge keys - so that they can be shared across two files\n *\n * x-* anchors are removed from resulting document (a-la docker compose yaml)\n *\n * @param file\n * @param templateData\n * @returns\n */\nexport async function resolveYamlFiles(\n file: string,\n templateData?: TemplateData,\n): Promise<object> {\n const doc = await resolveYamlDoc(file, templateData);\n const obj = doc.toJSON();\n return Object.fromEntries(\n Object.entries(obj).filter(([k]) => !k.startsWith(\"x-\")),\n );\n}\n\n/**\n * Merges yaml documents, respecting .extends references.\n * Optionally, performs env-style variable substitution on the config.\n * Respects YAML anchors and aliases, and merge keys - so that they can be shared across two files\n * Supports s3 links for file\n *\n * @param file\n * @param templateData\n * @returns\n */\nexport async function resolveYamlDoc(\n file: string,\n templateData?: TemplateData,\n): Promise<YAML.Document> {\n const content = await loadFile(file);\n // if (templateData) {\n // const compiled = template(content);\n // content = compiled(templateData);\n // }\n let cfgRaw: YAML.Document = YAML.parseDocument(content, { merge: true });\n // let cfgRaw = YAML.parse(content, { merge: true });\n if (cfgRaw.has(\"extends\")) {\n const baseFile = cfgRaw.get(\"extends\") as string;\n const extended = cfgRaw;\n // extends is a relative path to the base file\n cfgRaw = await resolveYamlDoc(\n getRelativePath(file, baseFile),\n templateData,\n );\n YAML.visit(extended, {\n Pair(_, pair, rawPath) {\n const path = getNodesPath(rawPath);\n if (isScalar(pair.key) && (isScalar(pair.value) || isSeq(pair.value))) {\n if (pair.key.value === \"extends\") {\n return;\n }\n cfgRaw.setIn([...path, pair.key.value], pair.value);\n return YAML.visit.SKIP;\n }\n },\n });\n }\n\n await YAML.visitAsync(cfgRaw, {\n Scalar: async (_, node) => {\n if (typeof node.value === \"string\") {\n node.value = await resolveScalarValue(node.value, templateData);\n }\n },\n });\n\n return cfgRaw;\n}\n\n/**\n * Helper function that gets object with templated values\n * Just because async ast already exists in yaml, but not in json reviver\n * @param json\n * @param templateData\n * @returns\n */\nexport async function resolveFromObject(\n json: object,\n templateData?: TemplateData,\n): Promise<object> {\n const content = YAML.stringify(json);\n const cfgRaw: YAML.Document = YAML.parseDocument(content, { merge: true });\n\n await YAML.visitAsync(cfgRaw, {\n Scalar: async (_, node) => {\n if (typeof node.value === \"string\") {\n node.value = await resolveScalarValue(node.value, templateData);\n }\n },\n });\n\n return cfgRaw.toJSON();\n}\n\nfunction getNodesPath(\n nodes: readonly (YAML.Node | YAML.Document | YAML.Pair)[],\n): unknown[] {\n return nodes\n .map(n => {\n if (isPair(n) && isScalar(n.key)) {\n return n.key.value;\n }\n return \"\";\n })\n .filter(Boolean);\n}\n\n/**\n * Loads file from s3 or local file system\n * @param file - s3 link or local file path\n * @returns file content\n */\nasync function loadFile(file: string): Promise<string> {\n if (file.startsWith(\"s3://\")) {\n return await loadS3File(file);\n }\n return await readFile(file, \"utf-8\");\n}\n\n/**\n * Loads file from s3\n * @param file - s3 link like s3://bucket/path/to/file.yaml\n * @returns file content\n */\nasync function loadS3File(file: string): Promise<string> {\n const url = new URL(file);\n const bucket = url.hostname;\n const key = url.pathname.slice(1);\n\n const s3 = new S3Client({});\n const response = await s3.send(\n new GetObjectCommand({\n Bucket: bucket,\n Key: key,\n }),\n );\n if (!response.Body) {\n throw new Error(`file ${file} not found`);\n }\n return response.Body.transformToString(\"utf-8\");\n}\n\n/**\n * Given file and a relative file path, returns full path of the relative file\n * Supports s3 links for base file\n * @param file\n * @param relativeFile\n */\nexport function getRelativePath(\n baseFile: string,\n relativeFile: string,\n): string {\n if (baseFile.startsWith(\"s3://\")) {\n const url = new URL(baseFile);\n const relPathname = pathResolve(dirname(url.pathname), relativeFile);\n url.pathname = relPathname;\n return url.toString();\n }\n return pathResolve(dirname(baseFile), relativeFile);\n}\n","/**\n * Similar to lodash.get, but supports promises\n * @param object\n * @param keys\n * @returns\n */\nexport default async function getPromisePath<V = any>(\n object: any,\n path: string,\n): Promise<V> {\n return getPromised(object, path.split(\".\"));\n}\n\nasync function getPromised<V = any>(object: any, keys: string[]): Promise<V> {\n if (keys.length === 0) {\n return Promise.resolve(object);\n }\n const [key, ...rest] = keys;\n const value = object[key];\n const resolved = await Promise.resolve(value);\n return getPromised(resolved, rest);\n}\n","import { CensoredString } from \"./CensoredString.js\";\nimport { CensoredURL } from \"./CensoredURL.js\";\n\n/**\n * Raw values shorter than this are not censored, to avoid masking unrelated\n * substrings throughout the log output.\n */\nconst MIN_SECRET_LENGTH = 4;\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction collectSecrets(value: unknown, out: Map<string, string>): void {\n if (value == null) {\n return;\n }\n if (value instanceof CensoredString || value instanceof CensoredURL) {\n const raw = value.value;\n if (raw.length >= MIN_SECRET_LENGTH) {\n out.set(raw, value.toString());\n }\n return;\n }\n if (typeof value !== \"object\") {\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) {\n collectSecrets(item, out);\n }\n return;\n }\n for (const item of Object.values(value)) {\n collectSecrets(item, out);\n }\n}\n\n/**\n * Gathers known secrets from a config and returns a function that replaces each raw secret with its masked representation.\n * Intended for pino's `hooks.streamWrite`\n */\nexport function createPinoCensor(config: unknown): (s: string) => string {\n const map = new Map<string, string>();\n collectSecrets(config, map);\n if (map.size === 0) {\n return s => s;\n }\n // Longer secrets first so a secret that is a substring of another does not\n // shadow the longer match.\n const pattern = [...map.keys()]\n .sort((a, b) => b.length - a.length)\n .map(escapeRegExp)\n .join(\"|\");\n const re = new RegExp(pattern, \"g\");\n return s => s.replace(re, m => map.get(m) ?? m);\n}\n","// Mirror of packages/shared/src/sleep.ts; keep in sync.\nexport async function sleep(ms: number) {\n return new Promise(resolve => {\n setTimeout(resolve, ms);\n });\n}\n","// Mirror of packages/shared/src/fetchRetry.ts; keep in sync.\nimport { sleep } from \"./sleep.js\";\n\nconst DEFAULT_RETRIES = 5;\nconst DEFAULT_RETRY_INTERVAL = 1000;\n\ninterface RetrySettings {\n retries?: number;\n retryInterval?: number;\n validateResponse?: (response: Response) => void;\n}\n\nexport async function fetchRetry(\n input: string | URL,\n init: RequestInit & RetrySettings = {},\n): Promise<Response> {\n const {\n retries = DEFAULT_RETRIES,\n retryInterval = DEFAULT_RETRY_INTERVAL,\n validateResponse,\n ...options\n } = init;\n try {\n const response = await fetch(input, options);\n validateResponse?.(response);\n return response;\n } catch (e: any) {\n if (retries > 0) {\n await sleep(retryInterval);\n return fetchRetry(input, {\n ...options,\n retries: retries - 1,\n retryInterval,\n validateResponse,\n });\n } else {\n throw e;\n }\n }\n}\n","import { chains, getChain, type NetworkType } from \"@gearbox-protocol/sdk\";\n\nexport function getAlchemyUrl(\n network: NetworkType,\n apiKey: string,\n protocol: \"http\" | \"ws\" = \"http\",\n): string | undefined {\n const alchemyDomain = ALCHEMY_DOMAINS[network];\n if (!alchemyDomain) {\n return undefined;\n }\n return `${protocol}s://${alchemyDomain}.g.alchemy.com/v2/${apiKey}`;\n}\n\nconst DRPC_NETS: Record<NetworkType, string | null> = {\n Arbitrum: \"arbitrum\",\n Base: \"base\",\n BNB: \"bsc\",\n Mainnet: \"ethereum\",\n Optimism: \"optimism\",\n Sonic: \"sonic\",\n WorldChain: \"worldchain\",\n Berachain: \"berachain\",\n Avalanche: \"avalanche\",\n Monad: \"monad\",\n Hemi: \"hemi\",\n Lisk: \"lisk\",\n MegaETH: null,\n Etherlink: null,\n Plasma: \"plasma\",\n Somnia: null,\n};\n\nconst ALCHEMY_DOMAINS: Record<NetworkType, string | null> = {\n Mainnet: \"eth-mainnet\",\n Arbitrum: \"arb-mainnet\",\n Optimism: \"opt-mainnet\",\n Base: \"base-mainnet\",\n Sonic: \"sonic-mainnet\",\n Monad: \"monad-mainnet\",\n Berachain: \"berachain-mainnet\",\n Avalanche: \"avax-mainnet\",\n BNB: \"bnb-mainnet\",\n WorldChain: \"worldchain-mainnet\",\n MegaETH: null,\n Etherlink: null,\n Hemi: null,\n Lisk: null,\n Plasma: \"plasma-mainnet\",\n Somnia: null,\n};\n\nexport function getDrpcUrl(\n network: NetworkType,\n apiKey: string,\n protocol: \"http\" | \"ws\" = \"http\",\n): string | undefined {\n const net = DRPC_NETS[network];\n return net ? `${protocol}s://lb.drpc.org/${net}/${apiKey}` : undefined;\n}\n\nconst ANKR_DOMAINS: Record<NetworkType, string | null> = {\n Arbitrum: \"arbitrum\",\n Avalanche: \"avalanche\",\n Base: \"base\",\n Berachain: null,\n BNB: \"bsc\",\n Etherlink: \"etherlink_mainnet\",\n Hemi: null,\n Lisk: null,\n Mainnet: \"eth\",\n MegaETH: null,\n Monad: null,\n Optimism: \"optimism\",\n Plasma: null,\n Sonic: \"sonic_mainnet\",\n WorldChain: null,\n Somnia: \"somnia_mainnet\",\n};\n\nexport function getAnkrUrl(\n network: NetworkType,\n apiKey: string,\n protocol: \"http\" | \"ws\" = \"http\",\n): string | undefined {\n const net = ANKR_DOMAINS[network];\n const sep = protocol === \"ws\" ? \"/ws/\" : \"/\";\n return net ? `${protocol}s://rpc.ankr.com/${net}${sep}${apiKey}` : undefined;\n}\n\nconst THIRDWEB_DOMAINS: Record<NetworkType, string | null> = {\n Arbitrum: chains.Arbitrum.id.toString(),\n Avalanche: chains.Avalanche.id.toString(),\n Base: chains.Base.id.toString(),\n Berachain: chains.Berachain.id.toString(),\n BNB: chains.BNB.id.toString(),\n Etherlink: chains.Etherlink.id.toString(),\n Hemi: chains.Hemi.id.toString(),\n Lisk: chains.Lisk.id.toString(),\n Mainnet: chains.Mainnet.id.toString(),\n MegaETH: chains.MegaETH.id.toString(),\n Monad: chains.Monad.id.toString(),\n Optimism: chains.Optimism.id.toString(),\n Plasma: chains.Plasma.id.toString(),\n Sonic: chains.Sonic.id.toString(),\n WorldChain: chains.WorldChain.id.toString(),\n Somnia: chains.Somnia.id.toString(),\n};\n\nexport function getThirdWebUrl(\n network: NetworkType,\n apiKey: string,\n protocol: \"http\" | \"ws\" = \"http\",\n): string | undefined {\n if (protocol === \"ws\") {\n return undefined;\n }\n const net = THIRDWEB_DOMAINS[network];\n return `https://${net}.rpc.thirdweb.com/${apiKey}`;\n}\n\nexport function getErpcKey(\n network: NetworkType,\n projectId?: string,\n urlBase?: string,\n): string | undefined {\n if (!projectId || !urlBase) {\n return undefined;\n }\n const chain = getChain(network);\n return `${urlBase}/${projectId}/evm/${chain.id}`;\n}\n","import type { ILogger } from \"@gearbox-protocol/sdk\";\nimport type { ProviderConfig } from \"@gearbox-protocol/sdk/dev\";\nimport type { PartialBy } from \"viem\";\nimport { CensoredURL } from \"./CensoredURL.js\";\nimport {\n getAlchemyUrl,\n getAnkrUrl,\n getDrpcUrl,\n getErpcKey,\n getThirdWebUrl,\n} from \"./providers.js\";\nimport type { ProvidersSchema } from \"./providers-schema.js\";\n\nexport function getProviders(\n config: ProvidersSchema,\n logger?: ILogger,\n): ProviderConfig[] {\n const {\n network,\n\n enabledProviders = [\n \"erpc\",\n \"custom\",\n \"drpc\",\n \"alchemy\",\n \"ankr\",\n \"thirdweb\",\n ],\n alchemyKeys = [],\n ankrKeys = [],\n drpcKeys = [],\n thirdwebKeys = [],\n jsonRpcProviders = [],\n\n erpcProjectId,\n erpcUrl,\n } = config;\n const result: PartialBy<ProviderConfig, \"url\">[] = [];\n for (const p of enabledProviders) {\n switch (p) {\n case \"alchemy\":\n result.push(\n ...alchemyKeys.map(k => ({\n name: \"alchemy\",\n url: getAlchemyUrl(network, k.value),\n })),\n );\n break;\n case \"drpc\":\n result.push(\n ...drpcKeys.map(k => ({\n name: \"drpc\",\n url: getDrpcUrl(network, k.value),\n })),\n );\n break;\n case \"ankr\":\n result.push(\n ...ankrKeys.map(k => ({\n name: \"ankr\",\n url: getAnkrUrl(network, k.value),\n })),\n );\n break;\n case \"thirdweb\":\n result.push(\n ...thirdwebKeys.map(k => ({\n name: \"thirdweb\",\n url: getThirdWebUrl(network, k.value),\n })),\n );\n break;\n case \"custom\":\n result.push(\n ...jsonRpcProviders.map((url): ProviderConfig => {\n const urlObj = new URL(url.value);\n const hasCredentials = urlObj.username || urlObj.password;\n\n let cleanUrl = url.value;\n let httpTransportOptions: ProviderConfig[\"httpTransportOptions\"] =\n {};\n\n if (hasCredentials) {\n // Create URL without credentials\n const cleanUrlObj = new URL(url.value);\n cleanUrlObj.username = \"\";\n cleanUrlObj.password = \"\";\n cleanUrl = cleanUrlObj.toString();\n\n // Create Basic Auth header\n const credentials = `${urlObj.username}:${urlObj.password}`;\n const encodedCredentials =\n Buffer.from(credentials).toString(\"base64\");\n\n httpTransportOptions = {\n fetchOptions: {\n headers: {\n Authorization: `Basic ${encodedCredentials}`,\n },\n },\n };\n }\n\n return {\n name: getTopLevelDomain(urlObj),\n url: cleanUrl,\n httpTransportOptions,\n };\n }),\n );\n break;\n case \"erpc\":\n if (erpcProjectId && erpcUrl) {\n result.push({\n name: \"erpc\",\n url: getErpcKey(network, erpcProjectId, erpcUrl),\n });\n }\n break;\n }\n }\n if (logger) {\n const providers = result\n .filter(p => !!p.url)\n .map(p => ({\n name: p.name,\n url: new CensoredURL(p.url!),\n }));\n logger.debug({ providers, network }, \"gathered providers\");\n }\n return result\n .map(p => ({\n ...p,\n httpClientOptions: {\n ...p.httpTransportOptions,\n methods: { exclude: [\"eth_fillTransaction\"] },\n },\n }))\n .filter(p => !!p.url) as ProviderConfig[];\n}\n\n/**\n * Take the last two parts for top-level domain (e.g., \"google.com\" from \"a.b.c.google.com\")\n **/\nfunction getTopLevelDomain({ hostname }: URL): string {\n const parts = hostname.split(\".\");\n return parts.length >= 2 ? parts.slice(-2).join(\".\") : hostname;\n}\n","import type { HttpTransportConfig } from \"viem\";\nimport { getProviders } from \"./getProviders.js\";\nimport type { ProvidersSchema } from \"./providers-schema.js\";\n\nexport interface HttpTransportOptions {\n url?: string | undefined;\n config: HttpTransportConfig;\n}\n\nexport function getFirstHttpTransportOptions(\n config: ProvidersSchema,\n): HttpTransportOptions {\n const [provider] = getProviders(config);\n if (!provider) {\n throw new Error(\"No provider found\");\n }\n return {\n url: provider.url,\n config: {\n ...provider.httpTransportOptions,\n },\n };\n}\n","import type { ILogger } from \"@gearbox-protocol/sdk\";\nimport { prettifyError } from \"zod\";\nimport { SlackNotifier } from \"./SlackNotifier.js\";\nimport { NotificationConfig } from \"./schema.js\";\nimport { TelegramNotifier } from \"./TelegramNotifier.js\";\nimport type { INotifier } from \"./types.js\";\n\nexport function createNotifier(\n config: NotificationConfig,\n logger?: ILogger,\n): INotifier | undefined {\n const parsed = NotificationConfig.safeParse(config);\n if (!parsed.success) {\n console.log(\">>>>\", parsed.error);\n logger?.warn(`invalid notification config: ${prettifyError(parsed.error)}`);\n return undefined;\n }\n\n switch (parsed.data.type) {\n case \"telegram\":\n return new TelegramNotifier(parsed.data, logger);\n case \"slack\":\n return new SlackNotifier(parsed.data, logger);\n }\n}\n","import type { ILogger } from \"@gearbox-protocol/sdk\";\nimport type { SlackConfig } from \"./schema.js\";\nimport type {\n IDedupableNotification,\n INotifier,\n NotificationSeverity,\n} from \"./types.js\";\n\n// TODO: no throttling or deduplication yet\nexport class SlackNotifier implements INotifier {\n readonly #config: SlackConfig;\n readonly #logger?: ILogger;\n\n constructor(config: SlackConfig, logger?: ILogger) {\n this.#config = config;\n this.#logger = logger;\n }\n\n public notify(\n message: IDedupableNotification,\n severity: NotificationSeverity,\n ): void {\n if (this.#config.alertsOnly && severity === \"notification\") {\n return;\n }\n const emoji = severity === \"alert\" ? \"🚨\" : \"ℹ️\";\n const messageText = typeof message === \"string\" ? message : message.plain;\n\n void this.#sendToSlack(`${emoji} Alert: ${messageText}`);\n }\n\n async #sendToSlack(text: string): Promise<void> {\n try {\n this.#logger?.debug(`Sending message to Slack: ${text}`);\n\n // Use fetch instead of axios to avoid adding dependencies\n const response = await fetch(this.#config.webhookUrl.value, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ text }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n this.#logger?.debug(\"Slack message sent successfully\");\n } catch (error) {\n this.#logger?.error(\"Error sending Slack message:\", error);\n throw error;\n }\n }\n}\n","import { z } from \"zod/v4\";\nimport { CensoredString } from \"../CensoredString.js\";\nimport { boolLike } from \"../schema-primitives.js\";\n\nexport const TelegramConfig = z.object({\n type: z.literal(\"telegram\"),\n token: z\n .union([z.string(), z.instanceof(CensoredString)])\n .transform(CensoredString.transform),\n alertsChannel: z\n .union([z.string().startsWith(\"-\"), z.instanceof(CensoredString)])\n .transform(CensoredString.transform),\n /**\n * Optional channel to send notifications to\n * If not set, notifications will not be sent\n */\n notificationsChannel: z\n .union([z.string().startsWith(\"-\"), z.instanceof(CensoredString)])\n .transform(CensoredString.transform)\n .optional(),\n prefix: z.string().optional(),\n});\n\nexport type TelegramConfig = z.infer<typeof TelegramConfig>;\n\nexport const SlackConfig = z.object({\n type: z.literal(\"slack\"),\n /**\n * Slack webhook URL for sending notifications\n */\n webhookUrl: z\n .union([z.string(), z.instanceof(CensoredString)])\n .transform(CensoredString.transform),\n /**\n * If true, only alerts will be sent. Informational notifications are suppressed\n */\n alertsOnly: boolLike().optional(),\n});\n\nexport type SlackConfig = z.infer<typeof SlackConfig>;\n\nexport const NotificationConfig = z.discriminatedUnion(\"type\", [\n TelegramConfig,\n SlackConfig,\n]);\n\nexport type NotificationConfig = z.infer<typeof NotificationConfig>;\n\nexport const SignlConfig = z.object({\n apiKey: z\n .union([z.string(), z.instanceof(CensoredString)])\n .transform(CensoredString.transform),\n teamId: z\n .union([z.string(), z.instanceof(CensoredString)])\n .transform(CensoredString.transform),\n});\n\nexport type SignlConfig = z.infer<typeof SignlConfig>;\n","import { getAddress, isAddress } from \"viem\";\nimport { z } from \"zod/v4\";\n\nexport const boolLike = () =>\n z.any().transform(v => {\n if (typeof v === \"string\") {\n return [\"true\", \"1\"].includes(v.toLowerCase());\n }\n return Boolean(v);\n });\n\nexport const stringArrayLike = () =>\n z.union([z.array(z.string()), z.string().transform(val => val.split(\",\"))]);\n\nexport const optionalStringArrayLike = () =>\n stringArrayLike()\n .optional()\n .transform(v => (v?.length ? v : undefined));\n\n/**\n * Like Address from abitype/zod, but converts an address into an address that is checksum encoded.\n */\nexport const addressLike = () =>\n z.string().transform((val, ctx) => {\n if (!isAddress(val)) {\n ctx.issues.push({\n code: \"custom\",\n message: `invalid address ${val}`,\n input: ctx.value,\n });\n }\n\n return getAddress(val);\n });\n\nexport const addressArrayLike = () =>\n stringArrayLike().pipe(z.array(addressLike()));\n\nexport const optionalAddressArrayLike = () =>\n stringArrayLike()\n .pipe(z.array(addressLike()))\n .optional()\n .transform(v => (v?.length ? v : undefined));\n","import type { ILogger } from \"@gearbox-protocol/sdk\";\nimport { md } from \"@vlad-yakovlev/telegram-md\";\nimport Queue from \"p-queue\";\nimport { withRetry } from \"viem\";\nimport type { TelegramConfig } from \"./schema.js\";\nimport { ThrottleManager } from \"./ThrottleManager.js\";\nimport type {\n IDedupableNotification,\n INotifier,\n NotificationSeverity,\n} from \"./types.js\";\n\nexport type TelegramNotifierOptions = TelegramConfig & {\n retryInterval?: number;\n retryCount?: number;\n maxChunkSize?: number;\n fetchFn?: typeof fetch;\n};\n\ninterface TelegramPayload {\n text: string;\n parse_mode?: \"MarkdownV2\";\n}\n\nconst DEFAULT_RETRY_INTERVAL = 1000;\nconst DEFAULT_RETRY_COUNT = 5;\nconst DEFAULT_MAX_CHUNK_SIZE = 4096;\n\nexport class TelegramNotifier implements INotifier {\n readonly #logger?: ILogger;\n readonly #alertsChannel: string;\n readonly #notificationsChannel?: string;\n readonly #botToken: string;\n readonly #prefix?: string;\n\n readonly #retryInterval: number;\n readonly #retryCount: number;\n readonly #maxChunkSize: number;\n readonly #fetchFn: typeof fetch;\n readonly #queue = new Queue({\n concurrency: 1,\n // https://core.telegram.org/bots/faq#my-bot-is-hitting-limits-how-do-i-avoid-this\n // 20 messages/minute limit\n interval: 60_000,\n intervalCap: 20,\n strict: true,\n });\n readonly #throttleManager = new ThrottleManager();\n\n constructor(opts: TelegramNotifierOptions, logger?: ILogger) {\n this.#logger = logger;\n this.#alertsChannel = opts.alertsChannel.value;\n this.#botToken = opts.token.value;\n this.#notificationsChannel = opts.notificationsChannel?.value;\n this.#prefix = opts.prefix;\n this.#retryInterval = opts.retryInterval ?? DEFAULT_RETRY_INTERVAL;\n this.#retryCount = opts.retryCount ?? DEFAULT_RETRY_COUNT;\n this.#maxChunkSize = opts.maxChunkSize ?? DEFAULT_MAX_CHUNK_SIZE;\n this.#fetchFn = opts.fetchFn ?? fetch;\n }\n\n public notify(\n message: IDedupableNotification,\n severity: NotificationSeverity,\n ): void {\n const dest =\n severity === \"alert\" ? this.#alertsChannel : this.#notificationsChannel;\n if (!dest) {\n return;\n }\n this.#enqueueTelegram(message, dest, severity === \"alert\");\n }\n\n async #enqueueTelegram(\n message: IDedupableNotification,\n channelId: string,\n severe = false,\n ): Promise<void> {\n if (!this.#throttleManager.canSend(message.dedupeKey)) {\n return;\n }\n\n const payloads = this.#toTelegramPayloads(message);\n for (const payload of payloads) {\n this.#queue.add(\n () =>\n this.#sendToTelegram(payload, channelId, severe).catch(e =>\n this.#logger?.error(e),\n ),\n {\n priority: severe ? 100 : 0,\n timeout: this.#retryInterval * this.#retryCount * 2,\n },\n );\n }\n\n this.#throttleManager.onSent(message.dedupeKey, message.throttleFn);\n }\n\n async #sendToTelegram(\n payload: TelegramPayload,\n channelId: string,\n severe = false,\n ): Promise<void> {\n const severity = severe ? \"alert\" : \"notification\";\n this.#logger?.debug(\n `sending telegram ${severity} to channel ${channelId}...`,\n );\n const url = `https://api.telegram.org/bot${this.#botToken}/sendMessage`;\n\n try {\n await withRetry(\n async () => {\n const resp = await this.#fetchFn(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n ...payload,\n chat_id: channelId,\n }),\n });\n if (resp.ok) {\n this.#logger?.debug(`telegram ${severity} sent successfully`);\n } else {\n const txt = await resp.text();\n throw new Error(`api error ${resp.status}: ${txt}`);\n }\n },\n { delay: this.#retryInterval, retryCount: this.#retryCount },\n );\n } catch (e) {\n this.#logger?.error(`cannot send telegram ${severity}: ${e}`);\n }\n }\n\n #toTelegramPayloads(message: IDedupableNotification): TelegramPayload[] {\n const { md: mdMessage, plain } = message;\n if (!mdMessage) {\n return this.#slicePlainText(plain);\n }\n let text = mdMessage;\n if (this.#prefix) {\n text = md.join([md.bold(this.#prefix), text], \" \");\n }\n const mdText = text.toString();\n if (mdText.length > this.#maxChunkSize) {\n return this.#slicePlainText(plain);\n }\n return [{ text: mdText, parse_mode: \"MarkdownV2\" }];\n }\n\n /**\n * Telegram has a limit on message size (default 4096 characters).\n * This function slices the text into chunks respecting the limit.\n * Each chunk is prefixed with the prefix (if set), ensuring the total length <= maxChunkSize.\n * @param text - The text to slice.\n * @returns An array of texts.\n */\n #slicePlainText(text: string): TelegramPayload[] {\n const chunks = [];\n const prefix = this.#prefix ? `${this.#prefix} ` : \"\";\n const maxChunkSize = this.#maxChunkSize - prefix.length;\n\n for (let i = 0; i < text.length; i += maxChunkSize) {\n const chunkText = text.slice(i, i + maxChunkSize);\n chunks.push({ text: `${prefix}${chunkText}` });\n }\n return chunks;\n }\n}\n","import { LRUCache } from \"lru-cache\";\nimport type { ThrottleFn } from \"./types.js\";\n\ninterface ThrottleState {\n lastAlertTime: number;\n currentWait: number;\n}\n\nexport function defaultBackoffFn(prevWait: number): number {\n return Math.min(\n prevWait ? prevWait * 2 : 10 * 60 * 1000, // 10 minutes\n 24 * 60 * 60 * 1000, // 24 hours\n );\n}\n\n/**\n * Manages per-feed throttling with exponential backoff.\n * Each dedupe key has its own independent throttle timer.\n */\nexport class ThrottleManager {\n #state = new LRUCache<string, ThrottleState>({ max: 5000 });\n\n /**\n * Checks if it's permitted to send a message for the given dedupe key\n * @returns\n */\n public canSend(dedupeKey?: string): boolean {\n if (!dedupeKey) {\n return true;\n }\n const state = this.#getState(dedupeKey);\n const timeSinceLastAlert = Date.now() - state.lastAlertTime;\n return timeSinceLastAlert >= state.currentWait;\n }\n\n /**\n * Records that notification was sent for the given dedupe key\n */\n public onSent(\n dedupeKey?: string,\n throttleFn: ThrottleFn = defaultBackoffFn,\n ): void {\n if (!dedupeKey) {\n return;\n }\n const state = this.#getState(dedupeKey);\n this.#state.set(dedupeKey, {\n lastAlertTime: Date.now(),\n currentWait: throttleFn(state.currentWait),\n });\n }\n\n #getState(dedupeKey: string): ThrottleState {\n return this.#state.get(dedupeKey) ?? { lastAlertTime: 0, currentWait: 0 };\n }\n}\n","import { ADDRESS_0X0, AddressMap, type ILogger } from \"@gearbox-protocol/sdk\";\nimport type { Address } from \"viem\";\nimport { createNotifier } from \"./createNotifier.js\";\nimport SignlNotifier, { type SignlServiceOptions } from \"./SignlNotifier.js\";\nimport type { NotificationConfig } from \"./schema.js\";\nimport type {\n IDedupableNotification,\n INotification,\n INotificationService,\n INotifier,\n NotificationLike,\n NotificationSeverity,\n} from \"./types.js\";\n\nexport interface NotificationsServiceOptions {\n notifications: Array<NotificationConfig & { recipient?: Address }>;\n signl?: SignlServiceOptions;\n}\n\nexport class NotificationsService implements INotificationService {\n readonly #logger?: ILogger;\n readonly #notifiers = new AddressMap<INotifier>();\n readonly #signlNotifier?: SignlNotifier;\n\n constructor(options: NotificationsServiceOptions, logger?: ILogger) {\n this.#logger = logger;\n for (const n of options.notifications) {\n const recipient = n.recipient ?? ADDRESS_0X0;\n const notifier = createNotifier(n, logger);\n if (notifier) {\n this.#notifiers.upsert(recipient, notifier);\n }\n }\n\n if (options.signl) {\n this.#signlNotifier = new SignlNotifier(options.signl);\n } else {\n this.#logger?.warn(\"signl notifier not configured\");\n }\n }\n\n public registerRecipient(\n address: Address,\n options: NotificationConfig,\n ): void {\n const notifier = createNotifier(options, this.#logger);\n if (notifier) {\n this.#notifiers.upsert(address, notifier);\n }\n }\n\n public signl(message: string, dedupeKey?: string): void {\n this.#signlNotifier?.alert(message, dedupeKey);\n }\n\n public alert(msg: NotificationLike): void {\n this.#notify(msg, \"alert\");\n }\n\n public notify(msg: NotificationLike): void {\n this.#notify(msg, \"notification\");\n }\n\n #notify(msg: NotificationLike, severity: NotificationSeverity): void {\n const message = this.#toNotification(msg);\n for (const [addr, notifier] of this.#notifiers.entries()) {\n const recipient = addr === ADDRESS_0X0 ? undefined : addr;\n const recipientNotification = message.messageFor(recipient);\n if (recipientNotification) {\n const notification = this.#toDedupableNotification(\n recipientNotification,\n );\n notifier.notify(notification, severity);\n // log global notifications\n if (addr === ADDRESS_0X0) {\n if (severity === \"alert\") {\n this.#logger?.warn(notification.plain);\n } else {\n this.#logger?.debug(notification.plain);\n }\n }\n }\n }\n }\n\n #toNotification(message: NotificationLike): INotification {\n // global notification without deduplication\n if (typeof message === \"string\" || !(\"messageFor\" in message)) {\n return {\n messageFor: (recipient?: Address) => (recipient ? undefined : message),\n };\n }\n return message;\n }\n\n #toDedupableNotification(\n msg: string | IDedupableNotification,\n ): IDedupableNotification {\n if (typeof msg === \"string\") {\n return {\n plain: msg,\n };\n }\n return msg;\n }\n}\n","import type { ILogger } from \"@gearbox-protocol/sdk\";\nimport { withRetry } from \"viem\";\nimport type { CensoredString } from \"../CensoredString.js\";\nimport type { SignlConfig } from \"./schema.js\";\nimport { ThrottleManager } from \"./ThrottleManager.js\";\nimport type { ThrottleFn } from \"./types.js\";\n\nexport type SignlServiceOptions = SignlConfig & {\n retryInterval?: number;\n retryCount?: number;\n throttleFn?: ThrottleFn;\n};\n\nconst DEFAULT_RETRY_INTERVAL = 1000;\nconst DEFAULT_RETRY_COUNT = 5;\n\nexport default class SignlNotifier {\n readonly #logger?: ILogger;\n\n readonly #apiKey: CensoredString;\n readonly #teamId: CensoredString;\n readonly #retryInterval: number;\n readonly #retryCount: number;\n\n readonly #throttleManager = new ThrottleManager();\n readonly #throttleFn?: ThrottleFn;\n\n constructor(opts: SignlServiceOptions, logger?: ILogger) {\n this.#apiKey = opts.apiKey;\n this.#teamId = opts.teamId;\n this.#retryInterval = opts.retryInterval ?? DEFAULT_RETRY_INTERVAL;\n this.#retryCount = opts.retryCount ?? DEFAULT_RETRY_COUNT;\n this.#logger = logger;\n this.#throttleFn = opts.throttleFn;\n this.#logger?.info(opts, \"signl notifier configured\");\n }\n\n public alert(message: string, dedupeKey?: string): void {\n void this.#sendAlert(message, dedupeKey).catch(e => this.#logger?.error(e));\n }\n\n async #sendAlert(message: string, dedupeKey?: string): Promise<void> {\n if (dedupeKey && !this.#throttleManager.canSend(dedupeKey)) {\n return;\n }\n\n const text = message.slice(0, 64); // it's to be shown in mobile notifications anyways\n this.#logger?.debug(\"sending signl alert\");\n\n await withRetry(\n async () => {\n const resp = await fetch(\n `https://connect.signl4.com/api/v2/alerts?x-s4-api-key=${this.#apiKey.value}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n category: \"emergency\",\n severity: 0,\n teamId: this.#teamId.value,\n text,\n title: \"GEARBOX ALERT\",\n }),\n },\n );\n if (resp.ok) {\n this.#logger?.warn(\"signl alert sent\");\n const data = await resp.json();\n this.#logger?.info(`signl alert response: ${JSON.stringify(data)}`);\n } else {\n throw new Error(`signl api error ${resp.status}: ${resp.statusText}`);\n }\n },\n { delay: this.#retryInterval, retryCount: this.#retryCount },\n );\n\n if (dedupeKey) {\n this.#throttleManager.onSent(dedupeKey, this.#throttleFn);\n }\n }\n}\n","import { SUPPORTED_NETWORKS } from \"@gearbox-protocol/sdk\";\nimport { z } from \"zod/v4\";\nimport { CensoredString } from \"./CensoredString.js\";\nimport { CensoredURL } from \"./CensoredURL.js\";\nimport { stringArrayLike } from \"./schema-primitives.js\";\nimport { zommandRegistry } from \"./Zommand.js\";\n\nexport const RpcProvider = z.enum([\n \"alchemy\",\n \"drpc\",\n \"ankr\",\n \"thirdweb\",\n \"custom\",\n \"erpc\",\n]);\nexport type RpcProvider = z.infer<typeof RpcProvider>;\n\nexport const ProvidersSchema = z.object({\n network: z.enum(SUPPORTED_NETWORKS).register(zommandRegistry, {\n flags: \"--network <network>\",\n description: \"Gearbox-supported network\",\n env: \"NETWORK\",\n }),\n /**\n * RPC providers to use\n */\n jsonRpcProviders: stringArrayLike()\n .pipe(z.array(z.url().transform(CensoredURL.transform)))\n .transform(a => (a.length ? a : undefined))\n .optional()\n .register(zommandRegistry, {\n flags: \"--json-rpc-providers <urls...>\",\n description: \"RPC providers to use, comma separated full http urls.\",\n env: \"JSON_RPC_PROVIDERS\",\n }),\n /**\n * RPC providers to use with their keys\n * Order matters\n */\n enabledProviders: stringArrayLike()\n .pipe(z.array(RpcProvider))\n .optional()\n .register(zommandRegistry, {\n flags: \"--enabled-providers <providers...>\",\n description:\n \"Keyed RPC providers to use, comma separated, order matters. Possible values: custom (for full json rpc urls)/alchemy/drpc/ankr/thirdweb\",\n env: \"ENABLED_PROVIDERS\",\n }),\n /**\n * Alchemy API keys to use\n */\n alchemyKeys: stringArrayLike()\n .pipe(z.array(z.string().transform(CensoredString.transform)))\n .transform(a => (a.length ? a : undefined))\n .optional()\n .register(zommandRegistry, {\n flags: \"--alchemy-keys <keys...>\",\n description: \"Alchemy API keys to use, comma separated\",\n env: \"ALCHEMY_KEYS\",\n }),\n /**\n * DRPC API keys to use\n */\n drpcKeys: stringArrayLike()\n .pipe(z.array(z.string().transform(CensoredString.transform)))\n .transform(a => (a.length ? a : undefined))\n .optional()\n .register(zommandRegistry, {\n flags: \"--drpc-keys <keys...>\",\n description: \"DRPC API keys to use, comma separated\",\n env: \"DRPC_KEYS\",\n }),\n /**\n * Ankr API keys to use\n */\n ankrKeys: stringArrayLike()\n .pipe(z.array(z.string().transform(CensoredString.transform)))\n .transform(a => (a.length ? a : undefined))\n .optional()\n .register(zommandRegistry, {\n flags: \"--ankr-keys <keys...>\",\n description: \"Ankr API keys to use, comma separated\",\n env: \"ANKR_KEYS\",\n }),\n /**\n * Thirdweb API keys to use\n */\n thirdwebKeys: stringArrayLike()\n .pipe(z.array(z.string().transform(CensoredString.transform)))\n .transform(a => (a.length ? a : undefined))\n .optional()\n .register(zommandRegistry, {\n flags: \"--thirdweb-keys <keys...>\",\n description: \"Thirdweb API keys to use, comma separated\",\n env: \"THIRDWEB_KEYS\",\n }),\n /**\n * If set, eRPC will be added as first provider\n */\n erpcProjectId: z.string().optional().register(zommandRegistry, {\n flags: \"--erpc-project-id <project-id>\",\n description: \"If set, eRPC will be added as first provider\",\n env: \"ERPC_PROJECT_ID\",\n }),\n /**\n * eRPC URL to use\n */\n erpcUrl: z.url().default(\"http://erpc.local\").register(zommandRegistry, {\n flags: \"--erpc-url <url>\",\n description: \"eRPC URL to use\",\n env: \"ERPC_URL\",\n }),\n /**\n * Timeout for JSON RPC requests, in milliseconds\n */\n jsonRpcTimeout: z.coerce\n .number()\n .int()\n .positive()\n .optional()\n .register(zommandRegistry, {\n flags: \"--json-rpc-timeout <timeout>\",\n description: \"Timeout for JSON RPC requests, in milliseconds\",\n env: \"JSON_RPC_TIMEOUT\",\n }),\n});\n\nexport type ProvidersSchema = z.infer<typeof ProvidersSchema>;\n","import { Command, Option } from \"@commander-js/extra-typings\";\nimport * as z4 from \"zod/v4/core\";\nimport { decompressObject } from \"./compressedConfig.js\";\nimport type { TemplateData } from \"./resolveYamlFiles.js\";\nimport { resolveYamlFiles } from \"./resolveYamlFiles.js\";\n\nexport const zommandRegistry = z4.registry<{\n flags: string;\n env?: string;\n description?: string;\n}>();\n\nexport interface ZommandOptions<T extends z4.$ZodTypes> {\n schema: T;\n templateData?: TemplateData;\n /**\n * If value is string, it's used as default value for config file\n */\n configFile?: boolean | string;\n /**\n * If true, allows to pass config zlib compressed config as --inline-config=... or INLINE_CONFIG env var\n */\n inlineConfig?: boolean;\n}\n\nexport class Zommand<\n T extends z4.$ZodTypes,\n Args extends any[] = [],\n> extends Command<Args, z4.output<T>> {\n #schema: T;\n #templatedData?: TemplateData;\n #envToObjectKeys: Record<string, string> = {};\n\n constructor(name: string, opts: ZommandOptions<T>) {\n super(name);\n const {\n schema,\n templateData,\n configFile = true,\n inlineConfig = true,\n } = opts;\n this.#schema = schema;\n this.#templatedData = templateData;\n const def = this.#schema._zod.def;\n\n if (def.type === \"object\") {\n this.#addOptionsFromObject(def);\n } else if (def.type === \"union\") {\n for (const o of def.options) {\n const opt = o as z4.$ZodTypes;\n if (opt._zod.def.type === \"object\") {\n this.#addOptionsFromObject(opt._zod.def);\n }\n }\n } else {\n throw new Error(\n `expected object schema, got ${this.#schema._zod.def.type}`,\n );\n }\n\n if (configFile) {\n let opt = new Option(\"--config [file]\", \"config file (or s3 link\");\n if (typeof configFile === \"string\") {\n opt = opt.default(configFile);\n }\n this.addOption(opt);\n }\n\n if (inlineConfig) {\n this.addOption(new Option(\"--inline-config [config]\", \"inline config\"));\n }\n }\n\n #addOptionsFromObject(def: z4.$ZodObjectDef): void {\n const shape = def.shape;\n for (const [key, optionSchema] of Object.entries(shape)) {\n const meta = zommandRegistry.get(optionSchema);\n if (!meta) {\n continue;\n }\n // this avoids duplicate options in case of discriminated unions\n const existing = this.options.find(o => o.flags === meta.flags);\n if (!existing) {\n let description = meta.description;\n if (meta.env) {\n description = `${description} (env variable ${meta.env})`;\n }\n this.addOption(new Option(meta.flags, description));\n if (meta.env) {\n this.#envToObjectKeys[meta.env] = key;\n }\n }\n }\n }\n\n override action(\n fn: (\n this: this,\n ...args: [...Args, z4.output<T>, this]\n ) => void | Promise<void>,\n ): this {\n return super.action(async (...args: [...Args, any, this]) => {\n const argz = args;\n const _cmd = argz.splice(-1);\n const [{ config, inlineConfig, ...opts }] = argz.splice(-1);\n\n let fromYaml: object = {};\n if (config) {\n fromYaml = await resolveYamlFiles(config, {\n ...(process.env as Record<string, string>),\n ...this.#templatedData,\n });\n }\n let fromInlineConfig: object = {};\n if (inlineConfig) {\n fromInlineConfig = await decompressObject(\n inlineConfig,\n this.#templatedData,\n );\n } else if (process.env.INLINE_CONFIG) {\n fromInlineConfig = await decompressObject(\n process.env.INLINE_CONFIG,\n this.#templatedData,\n );\n }\n\n const schemaFromEnv: Record<string, string> = {};\n for (const [env, key] of Object.entries(this.#envToObjectKeys)) {\n if (process.env[env]) {\n schemaFromEnv[key] = process.env[env]!;\n }\n }\n\n // deep merge is not required: env and cli flags are for top-level only\n const combined = {\n ...schemaFromEnv,\n ...fromYaml,\n ...fromInlineConfig,\n ...opts,\n };\n\n const data = z4.parse(this.#schema, combined);\n await fn.apply(this, [...argz, data, this]);\n });\n }\n}\n","import {\n GetSecretValueCommand,\n SecretsManagerClient,\n} from \"@aws-sdk/client-secrets-manager\";\n\nexport class SecretsManager {\n #smClient?: SecretsManagerClient;\n #secrets: Map<string, string> = new Map();\n\n public async secret(key: string): Promise<string> {\n const [SecretId, ...jsonPath] = key.split(\".\");\n const secretStr = await this.#getSecret(SecretId);\n if (!jsonPath.length) {\n return secretStr;\n }\n let v = JSON.parse(secretStr);\n for (const p of jsonPath) {\n v = v[p];\n }\n if (!v || typeof v !== \"string\") {\n throw new Error(`cannot find secret '${key}'`);\n }\n return v;\n }\n\n public async secretRaw(key: string): Promise<unknown> {\n const val = await this.#getSecret(key);\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n\n async #getSecret(SecretId: string): Promise<string> {\n if (this.#secrets.has(SecretId)) {\n return this.#secrets.get(SecretId)!;\n }\n\n if (!this.#smClient) {\n this.#smClient = new SecretsManagerClient({});\n }\n // https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/ssm/command/GetParameterCommand/\n const { SecretString } = await this.#smClient.send(\n new GetSecretValueCommand({ SecretId }),\n );\n if (!SecretString) {\n throw new Error(`secret '${SecretId}' not found`);\n }\n this.#secrets.set(SecretId, SecretString);\n\n return SecretString;\n }\n}\n\nexport const secretsManagerProxy = (\n mgr?: SecretsManager,\n): Record<string, Promise<unknown>> =>\n new Proxy<any>(mgr ?? new SecretsManager(), {\n get(target, prop) {\n if (\n typeof prop === \"string\" &&\n ![\"secret\", \"secretRaw\", \"then\", \"catch\", \"finally\"].includes(prop)\n ) {\n return target.secretRaw(prop);\n }\n },\n });\n","import { GetParameterCommand, SSMClient } from \"@aws-sdk/client-ssm\";\n\nexport class SSMManager {\n #ssmClient?: SSMClient;\n #parameters: Map<string, string> = new Map();\n\n public async parameter(name: string): Promise<string> {\n if (this.#parameters.has(name)) {\n return this.#parameters.get(name)!;\n }\n\n if (!this.#ssmClient) {\n this.#ssmClient = new SSMClient({});\n }\n\n const response = await this.#ssmClient.send(\n new GetParameterCommand({\n Name: name,\n }),\n );\n const value = response.Parameter?.Value;\n if (!value) {\n throw new Error(`parameter ${name} value not found`);\n }\n this.#parameters.set(name, value);\n return value;\n }\n}\n\nexport const ssmManagerProxy = (\n mgr?: SSMManager,\n): Record<string, Promise<unknown>> =>\n new Proxy<any>(mgr ?? new SSMManager(), {\n get(target, prop) {\n if (\n typeof prop === \"string\" &&\n ![\"parameter\", \"then\", \"catch\", \"finally\"].includes(prop)\n ) {\n return target.parameter(prop);\n }\n },\n });\n","export interface IValue<V extends string = string> {\n value: V;\n}\n\nexport function uncensorMap<V extends string = string>(\n map: Record<string, IValue<V>>,\n): Record<string, V> {\n return Object.fromEntries(Object.entries(map).map(([k, v]) => [k, v.value]));\n}\n","import { setInterval } from \"node:timers\";\nimport type { ILogger, NetworkType } from \"@gearbox-protocol/sdk\";\nimport { AddressMap } from \"@gearbox-protocol/sdk\";\nimport { z } from \"zod/v4\";\nimport { fetchRetry } from \"./fetchRetry.js\";\nimport { WhitelistItemSchema } from \"./whitelist-schema.js\";\n\nconst REFRESH_INTERVAL_MS = 10 * 60 * 1000;\n\nconst WhitelistResponse = z.array(WhitelistItemSchema);\n\nexport interface WhitelistOptions {\n url: string;\n network: NetworkType;\n logger?: ILogger;\n}\n\n/**\n * Fetches a network-scoped whitelist from the deploy-tools backend and keeps\n * it in memory with a 10-minute refresh interval.\n *\n * On fetch failure the previous in-memory copy is retained; if no successful\n * fetch has occurred yet the whitelist is considered empty.\n */\nexport class Whitelist {\n readonly #url: string;\n readonly #network: NetworkType;\n readonly #logger?: ILogger;\n\n #items = new AddressMap<WhitelistItemSchema>();\n #refreshInterval?: NodeJS.Timeout;\n\n constructor({ url, network, logger }: WhitelistOptions) {\n this.#url = url;\n this.#network = network;\n this.#logger = logger?.child?.({ name: \"whitelist\" }) ?? logger;\n }\n\n /**\n * Performs the initial fetch and starts the periodic refresh timer.\n * Failure of the initial fetch is non-fatal: the whitelist stays empty.\n */\n public async start(): Promise<void> {\n this.#logger?.info(\n `loading ${this.#network} whitelist from ${this.#url}, refresh every ${REFRESH_INTERVAL_MS / 1000}s`,\n );\n await this.#refresh();\n this.#refreshInterval = setInterval(() => {\n this.#refresh().catch(e => {\n this.#logger?.warn(`unexpected whitelist refresh error: ${e}`);\n });\n }, REFRESH_INTERVAL_MS);\n }\n\n /** Stops the refresh timer. */\n public stop(): void {\n if (this.#refreshInterval) {\n clearInterval(this.#refreshInterval);\n this.#refreshInterval = undefined;\n }\n }\n\n /**\n * Fetches the whitelist from the backend, parses it and atomically\n * replaces the in-memory map. On any error logs a warning and retains\n * the previous map.\n */\n async #refresh(): Promise<void> {\n try {\n const resp = await fetchRetry(this.#url);\n if (!resp.ok) {\n throw new Error(\n `whitelist fetch failed: ${resp.status} ${resp.statusText}`,\n );\n }\n const data = await resp.json();\n const items = WhitelistResponse.parse(data).filter(\n i => i.network === this.#network,\n );\n const next = new AddressMap<WhitelistItemSchema>();\n for (const item of items) {\n next.upsert(item.address, item);\n }\n this.#items = next;\n this.#logger?.debug(\n `loaded ${items.length} whitelist entries for ${this.#network}`,\n );\n } catch (e) {\n this.#logger?.warn(\n `failed to refresh whitelist from ${this.#url}, keeping previous version: ${e}`,\n );\n }\n }\n\n /**\n * Returns the matching whitelist entry for the given address, or\n * `undefined` if absent or expired.\n */\n public has(address: string): WhitelistItemSchema | undefined {\n const item = this.#items.get(address);\n if (!item) {\n return undefined;\n }\n if (item.expiresAt !== undefined && Date.now() / 1000 >= item.expiresAt) {\n return undefined;\n }\n return item;\n }\n}\n","// Mirror of packages/shared/src/whitelist-schema.ts; keep in sync.\nimport { NetworkType } from \"@gearbox-protocol/sdk\";\nimport { z } from \"zod/v4\";\nimport { addressLike } from \"./schema-primitives.js\";\n\nexport const WhitelistItemsSchema = z.object({\n network: NetworkType,\n addresses: z.array(addressLike()).min(1),\n reason: z.string().default(\"\"),\n issue: z.string().optional(),\n expiresAt: z.number().optional(),\n});\n\nexport type WhitelistItemsSchema = z.infer<typeof WhitelistItemsSchema>;\n\nexport const WhitelistItemSchema = z.object({\n network: NetworkType,\n category: z.string(),\n address: addressLike(),\n reason: z.string().default(\"\"),\n issue: z.string().optional(),\n contractType: z.string().optional(),\n createdAt: z.number(),\n expiresAt: z.number().optional(),\n});\n\nexport type WhitelistItemSchema = z.infer<typeof WhitelistItemSchema>;\n"],"mappings":"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","names":["z","z","DEFAULT_RETRY_INTERVAL","withRetry","DEFAULT_RETRY_INTERVAL","DEFAULT_RETRY_COUNT","withRetry","z","z","AddressMap","z","z","z","z","AddressMap"]}
1
+ {"version":3,"sources":["../src/CensoredString.ts","../src/CensoredURL.ts","../src/compressedConfig.ts","../src/resolveYamlFiles.ts","../src/getPromisePath.ts","../src/createPinoCensor.ts","../src/sleep.ts","../src/fetchRetry.ts","../src/providers.ts","../src/getProviders.ts","../src/getFirstHttpTransportOptions.ts","../src/notifications/createNotifier.ts","../src/notifications/SlackNotifier.ts","../src/notifications/schema.ts","../src/notifications/TelegramNotifier.ts","../src/notifications/ThrottleManager.ts","../src/notifications/NotificationsService.ts","../src/notifications/SignlNotifier.ts","../src/providers-schema.ts","../src/Zommand.ts","../src/SecretsManager.ts","../src/SSMManager.ts","../src/uncensorMap.ts","../src/Whitelist.ts"],"sourcesContent":["export class CensoredString<V extends string = string> {\n readonly #value: V;\n readonly #censored: string;\n\n public static transform<T extends string>(\n value: T | CensoredString<T>,\n ): CensoredString<T> {\n if (value instanceof CensoredString) {\n return value;\n }\n return new CensoredString(value);\n }\n\n constructor(value: V) {\n this.#value = value;\n const visibleLen = Math.min(4, Math.floor(0.2 * value.length));\n if (visibleLen < 1) {\n this.#censored = \"*\".repeat(Math.min(8, value.length));\n } else {\n this.#censored =\n \"*\".repeat(Math.min(8, value.length - visibleLen)) +\n value.slice(-1 * visibleLen);\n }\n }\n\n public get value(): V {\n return this.#value;\n }\n\n public toString(): string {\n return this.#censored;\n }\n\n public toJSON(): string {\n return this.toString();\n }\n}\n","/**\n * Assumes that host is always visible, and the secret part is in path or query\n */\nexport class CensoredURL {\n readonly #value: string;\n readonly #censored: string;\n\n public static transform(value: string | CensoredURL): CensoredURL {\n if (value instanceof CensoredURL) {\n return value;\n }\n return new CensoredURL(value);\n }\n\n constructor(url: string) {\n this.#value = url;\n if (\n url.includes(\"127.0.0.1\") ||\n url.includes(\"localhost\") ||\n url.includes(\"host.docker.internal\")\n ) {\n this.#censored = url;\n } else {\n try {\n const u = new URL(url);\n if (u.username || u.password) {\n u.username = u.username ? \"****\" : \"\";\n u.password = u.password ? \"****\" : \"\";\n }\n u.pathname = \"/\";\n u.search = \"\";\n this.#censored = `${u.href}******`;\n } catch {\n const visibleLen = Math.min(4, Math.floor(0.2 * url.length));\n if (visibleLen < 1) {\n this.#censored = \"*\".repeat(Math.min(8, url.length));\n } else {\n this.#censored =\n \"*\".repeat(Math.min(8, url.length - visibleLen)) +\n url.slice(-1 * visibleLen);\n }\n }\n }\n }\n\n public get value(): string {\n return this.#value;\n }\n\n public toString(): string {\n return this.#censored;\n }\n\n public toJSON(): string {\n return this.toString();\n }\n}\n","import { deflateSync, inflateSync } from \"node:zlib\";\nimport { resolveFromObject } from \"./resolveYamlFiles.js\";\n\n/**\n * Compress a plain JS object into a base64url string\n * suitable for env vars.\n */\nexport function compressObject(obj: unknown): string {\n const json = JSON.stringify(obj);\n const compressed = deflateSync(Buffer.from(json, \"utf8\"));\n return compressed.toString(\"base64url\");\n}\n\n/**\n * Decompress a base64url string back into a JS object\n * Allows to pass template data to resolve promises/env\n */\nexport async function decompressObject<T = unknown>(\n value: string,\n templateData?: Record<string, unknown>,\n): Promise<T> {\n const compressed = Buffer.from(value, \"base64url\");\n const str = inflateSync(compressed).toString(\"utf8\");\n const json = JSON.parse(str);\n const result = await resolveFromObject(json, templateData);\n return result as T;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { dirname, resolve as pathResolve } from \"node:path\";\nimport { GetObjectCommand, S3Client } from \"@aws-sdk/client-s3\";\nimport YAML, { isPair, isScalar, isSeq } from \"yaml\";\nimport getPromisePath from \"./getPromisePath.js\";\n\nexport type TemplateData = Record<string, unknown>;\n\n/**\n * Template key regexp\n * Consists of alphanumeric+underscore parts separated by dots, all wrappped in env-style brackets\n * e.g. ${KEY} or ${KEY.SUBKEY}\n *\n * Optionally supports a bash-style default value via `:-`, e.g. `${KEY:-fallback}`.\n * The default is used when the resolved value is undefined, null, or an empty string.\n * Capture groups: 1 = key path, 2 = optional default literal (no `}` allowed).\n */\nconst templateKeyRegex = /\\$\\{([\\w-]+(?:\\.[\\w-]+)*)(?::-([^}]*))?\\}/g;\n\n/**\n * Replaces all `${...}` template tokens in a string using the provided template data.\n * Supports bash-style `${KEY:-default}` fallback when the resolved value is missing\n * (undefined, null, or empty string). The default is a literal and is not further\n * interpolated.\n */\nasync function resolveScalarValue(\n val: string,\n templateData?: TemplateData,\n): Promise<string> {\n const matches = val.matchAll(templateKeyRegex);\n for (const match of matches) {\n const [whole, key, defaultValue] = match;\n const resolved = await getPromisePath(templateData, key);\n if (resolved !== undefined && resolved !== null && resolved !== \"\") {\n val = val.replace(whole, String(resolved));\n } else if (defaultValue !== undefined) {\n val = val.replace(whole, defaultValue);\n }\n }\n return val;\n}\n\n/**\n * Merges yaml files, respecting .extends references.\n * Performs env variable substitution on the config.\n * Respects YAML anchors and aliases, and merge keys - so that they can be shared across two files\n *\n * x-* anchors are removed from resulting document (a-la docker compose yaml)\n *\n * @param file\n * @param templateData\n * @returns\n */\nexport async function resolveYamlFiles(\n file: string,\n templateData?: TemplateData,\n): Promise<object> {\n const doc = await resolveYamlDoc(file, templateData);\n const obj = doc.toJSON();\n return Object.fromEntries(\n Object.entries(obj).filter(([k]) => !k.startsWith(\"x-\")),\n );\n}\n\n/**\n * Merges yaml documents, respecting .extends references.\n * Optionally, performs env-style variable substitution on the config.\n * Respects YAML anchors and aliases, and merge keys - so that they can be shared across two files\n * Supports s3 links for file\n *\n * @param file\n * @param templateData\n * @returns\n */\nexport async function resolveYamlDoc(\n file: string,\n templateData?: TemplateData,\n): Promise<YAML.Document> {\n const content = await loadFile(file);\n // if (templateData) {\n // const compiled = template(content);\n // content = compiled(templateData);\n // }\n let cfgRaw: YAML.Document = YAML.parseDocument(content, { merge: true });\n // let cfgRaw = YAML.parse(content, { merge: true });\n if (cfgRaw.has(\"extends\")) {\n const baseFile = cfgRaw.get(\"extends\") as string;\n const extended = cfgRaw;\n // extends is a relative path to the base file\n cfgRaw = await resolveYamlDoc(\n getRelativePath(file, baseFile),\n templateData,\n );\n YAML.visit(extended, {\n Pair(_, pair, rawPath) {\n const path = getNodesPath(rawPath);\n if (isScalar(pair.key) && (isScalar(pair.value) || isSeq(pair.value))) {\n if (pair.key.value === \"extends\") {\n return;\n }\n cfgRaw.setIn([...path, pair.key.value], pair.value);\n return YAML.visit.SKIP;\n }\n },\n });\n }\n\n await YAML.visitAsync(cfgRaw, {\n Scalar: async (_, node) => {\n if (typeof node.value === \"string\") {\n node.value = await resolveScalarValue(node.value, templateData);\n }\n },\n });\n\n return cfgRaw;\n}\n\n/**\n * Helper function that gets object with templated values\n * Just because async ast already exists in yaml, but not in json reviver\n * @param json\n * @param templateData\n * @returns\n */\nexport async function resolveFromObject(\n json: object,\n templateData?: TemplateData,\n): Promise<object> {\n const content = YAML.stringify(json);\n const cfgRaw: YAML.Document = YAML.parseDocument(content, { merge: true });\n\n await YAML.visitAsync(cfgRaw, {\n Scalar: async (_, node) => {\n if (typeof node.value === \"string\") {\n node.value = await resolveScalarValue(node.value, templateData);\n }\n },\n });\n\n return cfgRaw.toJSON();\n}\n\nfunction getNodesPath(\n nodes: readonly (YAML.Node | YAML.Document | YAML.Pair)[],\n): unknown[] {\n return nodes\n .map(n => {\n if (isPair(n) && isScalar(n.key)) {\n return n.key.value;\n }\n return \"\";\n })\n .filter(Boolean);\n}\n\n/**\n * Loads file from s3 or local file system\n * @param file - s3 link or local file path\n * @returns file content\n */\nasync function loadFile(file: string): Promise<string> {\n if (file.startsWith(\"s3://\")) {\n return await loadS3File(file);\n }\n return await readFile(file, \"utf-8\");\n}\n\n/**\n * Loads file from s3\n * @param file - s3 link like s3://bucket/path/to/file.yaml\n * @returns file content\n */\nasync function loadS3File(file: string): Promise<string> {\n const url = new URL(file);\n const bucket = url.hostname;\n const key = url.pathname.slice(1);\n\n const s3 = new S3Client({});\n const response = await s3.send(\n new GetObjectCommand({\n Bucket: bucket,\n Key: key,\n }),\n );\n if (!response.Body) {\n throw new Error(`file ${file} not found`);\n }\n return response.Body.transformToString(\"utf-8\");\n}\n\n/**\n * Given file and a relative file path, returns full path of the relative file\n * Supports s3 links for base file\n * @param file\n * @param relativeFile\n */\nexport function getRelativePath(\n baseFile: string,\n relativeFile: string,\n): string {\n if (baseFile.startsWith(\"s3://\")) {\n const url = new URL(baseFile);\n const relPathname = pathResolve(dirname(url.pathname), relativeFile);\n url.pathname = relPathname;\n return url.toString();\n }\n return pathResolve(dirname(baseFile), relativeFile);\n}\n","/**\n * Similar to lodash.get, but supports promises\n * @param object\n * @param keys\n * @returns\n */\nexport default async function getPromisePath<V = any>(\n object: any,\n path: string,\n): Promise<V> {\n return getPromised(object, path.split(\".\"));\n}\n\nasync function getPromised<V = any>(object: any, keys: string[]): Promise<V> {\n if (keys.length === 0) {\n return Promise.resolve(object);\n }\n const [key, ...rest] = keys;\n const value = object[key];\n const resolved = await Promise.resolve(value);\n return getPromised(resolved, rest);\n}\n","import { CensoredString } from \"./CensoredString.js\";\nimport { CensoredURL } from \"./CensoredURL.js\";\n\n/**\n * Raw values shorter than this are not censored, to avoid masking unrelated\n * substrings throughout the log output.\n */\nconst MIN_SECRET_LENGTH = 4;\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction collectSecrets(value: unknown, out: Map<string, string>): void {\n if (value == null) {\n return;\n }\n if (value instanceof CensoredString || value instanceof CensoredURL) {\n const raw = value.value;\n if (raw.length >= MIN_SECRET_LENGTH) {\n out.set(raw, value.toString());\n }\n return;\n }\n if (typeof value !== \"object\") {\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) {\n collectSecrets(item, out);\n }\n return;\n }\n for (const item of Object.values(value)) {\n collectSecrets(item, out);\n }\n}\n\n/**\n * Gathers known secrets from a config and returns a function that replaces each raw secret with its masked representation.\n * Intended for pino's `hooks.streamWrite`\n */\nexport function createPinoCensor(config: unknown): (s: string) => string {\n const map = new Map<string, string>();\n collectSecrets(config, map);\n if (map.size === 0) {\n return s => s;\n }\n // Longer secrets first so a secret that is a substring of another does not\n // shadow the longer match.\n const pattern = [...map.keys()]\n .sort((a, b) => b.length - a.length)\n .map(escapeRegExp)\n .join(\"|\");\n const re = new RegExp(pattern, \"g\");\n return s => s.replace(re, m => map.get(m) ?? m);\n}\n","// Mirror of packages/shared/src/sleep.ts; keep in sync.\nexport async function sleep(ms: number) {\n return new Promise(resolve => {\n setTimeout(resolve, ms);\n });\n}\n","// Mirror of packages/shared/src/fetchRetry.ts; keep in sync.\nimport { sleep } from \"./sleep.js\";\n\nconst DEFAULT_RETRIES = 5;\nconst DEFAULT_RETRY_INTERVAL = 1000;\n\ninterface RetrySettings {\n retries?: number;\n retryInterval?: number;\n validateResponse?: (response: Response) => void;\n}\n\nexport async function fetchRetry(\n input: string | URL,\n init: RequestInit & RetrySettings = {},\n): Promise<Response> {\n const {\n retries = DEFAULT_RETRIES,\n retryInterval = DEFAULT_RETRY_INTERVAL,\n validateResponse,\n ...options\n } = init;\n try {\n const response = await fetch(input, options);\n validateResponse?.(response);\n return response;\n } catch (e: any) {\n if (retries > 0) {\n await sleep(retryInterval);\n return fetchRetry(input, {\n ...options,\n retries: retries - 1,\n retryInterval,\n validateResponse,\n });\n } else {\n throw e;\n }\n }\n}\n","import { chains, getChain, type NetworkType } from \"@gearbox-protocol/sdk\";\n\nexport function getAlchemyUrl(\n network: NetworkType,\n apiKey: string,\n protocol: \"http\" | \"ws\" = \"http\",\n): string | undefined {\n const alchemyDomain = ALCHEMY_DOMAINS[network];\n if (!alchemyDomain) {\n return undefined;\n }\n return `${protocol}s://${alchemyDomain}.g.alchemy.com/v2/${apiKey}`;\n}\n\nconst DRPC_NETS: Record<NetworkType, string | null> = {\n Arbitrum: \"arbitrum\",\n Base: \"base\",\n BNB: \"bsc\",\n Mainnet: \"ethereum\",\n Optimism: \"optimism\",\n Sonic: \"sonic\",\n WorldChain: \"worldchain\",\n Berachain: \"berachain\",\n Avalanche: \"avalanche\",\n Monad: \"monad\",\n Hemi: \"hemi\",\n Lisk: \"lisk\",\n MegaETH: null,\n Etherlink: null,\n Plasma: \"plasma\",\n Somnia: null,\n};\n\nconst ALCHEMY_DOMAINS: Record<NetworkType, string | null> = {\n Mainnet: \"eth-mainnet\",\n Arbitrum: \"arb-mainnet\",\n Optimism: \"opt-mainnet\",\n Base: \"base-mainnet\",\n Sonic: \"sonic-mainnet\",\n Monad: \"monad-mainnet\",\n Berachain: \"berachain-mainnet\",\n Avalanche: \"avax-mainnet\",\n BNB: \"bnb-mainnet\",\n WorldChain: \"worldchain-mainnet\",\n MegaETH: null,\n Etherlink: null,\n Hemi: null,\n Lisk: null,\n Plasma: \"plasma-mainnet\",\n Somnia: null,\n};\n\nexport function getDrpcUrl(\n network: NetworkType,\n apiKey: string,\n protocol: \"http\" | \"ws\" = \"http\",\n): string | undefined {\n const net = DRPC_NETS[network];\n return net ? `${protocol}s://lb.drpc.org/${net}/${apiKey}` : undefined;\n}\n\nconst ANKR_DOMAINS: Record<NetworkType, string | null> = {\n Arbitrum: \"arbitrum\",\n Avalanche: \"avalanche\",\n Base: \"base\",\n Berachain: null,\n BNB: \"bsc\",\n Etherlink: \"etherlink_mainnet\",\n Hemi: null,\n Lisk: null,\n Mainnet: \"eth\",\n MegaETH: null,\n Monad: null,\n Optimism: \"optimism\",\n Plasma: null,\n Sonic: \"sonic_mainnet\",\n WorldChain: null,\n Somnia: \"somnia_mainnet\",\n};\n\nexport function getAnkrUrl(\n network: NetworkType,\n apiKey: string,\n protocol: \"http\" | \"ws\" = \"http\",\n): string | undefined {\n const net = ANKR_DOMAINS[network];\n const sep = protocol === \"ws\" ? \"/ws/\" : \"/\";\n return net ? `${protocol}s://rpc.ankr.com/${net}${sep}${apiKey}` : undefined;\n}\n\nconst THIRDWEB_DOMAINS: Record<NetworkType, string | null> = {\n Arbitrum: chains.Arbitrum.id.toString(),\n Avalanche: chains.Avalanche.id.toString(),\n Base: chains.Base.id.toString(),\n Berachain: chains.Berachain.id.toString(),\n BNB: chains.BNB.id.toString(),\n Etherlink: chains.Etherlink.id.toString(),\n Hemi: chains.Hemi.id.toString(),\n Lisk: chains.Lisk.id.toString(),\n Mainnet: chains.Mainnet.id.toString(),\n MegaETH: chains.MegaETH.id.toString(),\n Monad: chains.Monad.id.toString(),\n Optimism: chains.Optimism.id.toString(),\n Plasma: chains.Plasma.id.toString(),\n Sonic: chains.Sonic.id.toString(),\n WorldChain: chains.WorldChain.id.toString(),\n Somnia: chains.Somnia.id.toString(),\n};\n\nexport function getThirdWebUrl(\n network: NetworkType,\n apiKey: string,\n protocol: \"http\" | \"ws\" = \"http\",\n): string | undefined {\n if (protocol === \"ws\") {\n return undefined;\n }\n const net = THIRDWEB_DOMAINS[network];\n return `https://${net}.rpc.thirdweb.com/${apiKey}`;\n}\n\nexport function getErpcKey(\n network: NetworkType,\n projectId?: string,\n urlBase?: string,\n): string | undefined {\n if (!projectId || !urlBase) {\n return undefined;\n }\n const chain = getChain(network);\n return `${urlBase}/${projectId}/evm/${chain.id}`;\n}\n","import type { ILogger } from \"@gearbox-protocol/sdk\";\nimport type { ProviderConfig } from \"@gearbox-protocol/sdk/dev\";\nimport type { PartialBy } from \"viem\";\nimport { CensoredURL } from \"./CensoredURL.js\";\nimport {\n getAlchemyUrl,\n getAnkrUrl,\n getDrpcUrl,\n getErpcKey,\n getThirdWebUrl,\n} from \"./providers.js\";\nimport type { ProvidersSchema } from \"./providers-schema.js\";\n\nexport function getProviders(\n config: ProvidersSchema,\n logger?: ILogger,\n): ProviderConfig[] {\n const {\n network,\n\n enabledProviders = [\n \"erpc\",\n \"custom\",\n \"drpc\",\n \"alchemy\",\n \"ankr\",\n \"thirdweb\",\n ],\n alchemyKeys = [],\n ankrKeys = [],\n drpcKeys = [],\n thirdwebKeys = [],\n jsonRpcProviders = [],\n\n erpcProjectId,\n erpcUrl,\n } = config;\n const result: PartialBy<ProviderConfig, \"url\">[] = [];\n for (const p of enabledProviders) {\n switch (p) {\n case \"alchemy\":\n result.push(\n ...alchemyKeys.map(k => ({\n name: \"alchemy\",\n url: getAlchemyUrl(network, k.value),\n })),\n );\n break;\n case \"drpc\":\n result.push(\n ...drpcKeys.map(k => ({\n name: \"drpc\",\n url: getDrpcUrl(network, k.value),\n })),\n );\n break;\n case \"ankr\":\n result.push(\n ...ankrKeys.map(k => ({\n name: \"ankr\",\n url: getAnkrUrl(network, k.value),\n })),\n );\n break;\n case \"thirdweb\":\n result.push(\n ...thirdwebKeys.map(k => ({\n name: \"thirdweb\",\n url: getThirdWebUrl(network, k.value),\n })),\n );\n break;\n case \"custom\":\n result.push(\n ...jsonRpcProviders.map((url): ProviderConfig => {\n const urlObj = new URL(url.value);\n const hasCredentials = urlObj.username || urlObj.password;\n\n let cleanUrl = url.value;\n let httpTransportOptions: ProviderConfig[\"httpTransportOptions\"] =\n {};\n\n if (hasCredentials) {\n // Create URL without credentials\n const cleanUrlObj = new URL(url.value);\n cleanUrlObj.username = \"\";\n cleanUrlObj.password = \"\";\n cleanUrl = cleanUrlObj.toString();\n\n // Create Basic Auth header\n const credentials = `${urlObj.username}:${urlObj.password}`;\n const encodedCredentials =\n Buffer.from(credentials).toString(\"base64\");\n\n httpTransportOptions = {\n fetchOptions: {\n headers: {\n Authorization: `Basic ${encodedCredentials}`,\n },\n },\n };\n }\n\n return {\n name: getTopLevelDomain(urlObj),\n url: cleanUrl,\n httpTransportOptions,\n };\n }),\n );\n break;\n case \"erpc\":\n if (erpcProjectId && erpcUrl) {\n result.push({\n name: \"erpc\",\n url: getErpcKey(network, erpcProjectId, erpcUrl),\n });\n }\n break;\n }\n }\n if (logger) {\n const providers = result\n .filter(p => !!p.url)\n .map(p => ({\n name: p.name,\n url: new CensoredURL(p.url!),\n }));\n logger.debug({ providers, network }, \"gathered providers\");\n }\n return result\n .map(p => ({\n ...p,\n httpClientOptions: {\n ...p.httpTransportOptions,\n methods: { exclude: [\"eth_fillTransaction\"] },\n },\n }))\n .filter(p => !!p.url) as ProviderConfig[];\n}\n\n/**\n * Take the last two parts for top-level domain (e.g., \"google.com\" from \"a.b.c.google.com\")\n **/\nfunction getTopLevelDomain({ hostname }: URL): string {\n const parts = hostname.split(\".\");\n return parts.length >= 2 ? parts.slice(-2).join(\".\") : hostname;\n}\n","import type { HttpTransportConfig } from \"viem\";\nimport { getProviders } from \"./getProviders.js\";\nimport type { ProvidersSchema } from \"./providers-schema.js\";\n\nexport interface HttpTransportOptions {\n url?: string | undefined;\n config: HttpTransportConfig;\n}\n\nexport function getFirstHttpTransportOptions(\n config: ProvidersSchema,\n): HttpTransportOptions {\n const [provider] = getProviders(config);\n if (!provider) {\n throw new Error(\"No provider found\");\n }\n return {\n url: provider.url,\n config: {\n ...provider.httpTransportOptions,\n },\n };\n}\n","import type { ILogger } from \"@gearbox-protocol/sdk\";\nimport { prettifyError } from \"zod\";\nimport { SlackNotifier } from \"./SlackNotifier.js\";\nimport { NotificationConfig } from \"./schema.js\";\nimport { TelegramNotifier } from \"./TelegramNotifier.js\";\nimport type { INotifier } from \"./types.js\";\n\nexport function createNotifier(\n config: NotificationConfig,\n logger?: ILogger,\n): INotifier | undefined {\n const parsed = NotificationConfig.safeParse(config);\n if (!parsed.success) {\n console.log(\">>>>\", parsed.error);\n logger?.warn(`invalid notification config: ${prettifyError(parsed.error)}`);\n return undefined;\n }\n\n switch (parsed.data.type) {\n case \"telegram\":\n return new TelegramNotifier(parsed.data, logger);\n case \"slack\":\n return new SlackNotifier(parsed.data, logger);\n }\n}\n","import type { ILogger } from \"@gearbox-protocol/sdk\";\nimport type { SlackConfig } from \"./schema.js\";\nimport type {\n IDedupableNotification,\n INotifier,\n NotificationSeverity,\n} from \"./types.js\";\n\n// TODO: no throttling or deduplication yet\nexport class SlackNotifier implements INotifier {\n readonly #config: SlackConfig;\n readonly #logger?: ILogger;\n\n constructor(config: SlackConfig, logger?: ILogger) {\n this.#config = config;\n this.#logger = logger;\n }\n\n public notify(\n message: IDedupableNotification,\n severity: NotificationSeverity,\n ): void {\n if (this.#config.alertsOnly && severity === \"notification\") {\n return;\n }\n const emoji = severity === \"alert\" ? \"🚨\" : \"ℹ️\";\n const messageText = typeof message === \"string\" ? message : message.plain;\n\n void this.#sendToSlack(`${emoji} Alert: ${messageText}`);\n }\n\n async #sendToSlack(text: string): Promise<void> {\n try {\n this.#logger?.debug(`Sending message to Slack: ${text}`);\n\n // Use fetch instead of axios to avoid adding dependencies\n const response = await fetch(this.#config.webhookUrl.value, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ text }),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n this.#logger?.debug(\"Slack message sent successfully\");\n } catch (error) {\n this.#logger?.error(\"Error sending Slack message:\", error);\n throw error;\n }\n }\n}\n","import { z } from \"zod/v4\";\nimport { CensoredString } from \"../CensoredString.js\";\nimport { boolLike } from \"../schemas/schema-primitives.js\";\n\nexport const TelegramConfig = z.object({\n type: z.literal(\"telegram\"),\n token: z\n .union([z.string(), z.instanceof(CensoredString)])\n .transform(CensoredString.transform),\n alertsChannel: z\n .union([z.string().startsWith(\"-\"), z.instanceof(CensoredString)])\n .transform(CensoredString.transform),\n /**\n * Optional channel to send notifications to\n * If not set, notifications will not be sent\n */\n notificationsChannel: z\n .union([z.string().startsWith(\"-\"), z.instanceof(CensoredString)])\n .transform(CensoredString.transform)\n .optional(),\n prefix: z.string().optional(),\n});\n\nexport type TelegramConfig = z.infer<typeof TelegramConfig>;\n\nexport const SlackConfig = z.object({\n type: z.literal(\"slack\"),\n /**\n * Slack webhook URL for sending notifications\n */\n webhookUrl: z\n .union([z.string(), z.instanceof(CensoredString)])\n .transform(CensoredString.transform),\n /**\n * If true, only alerts will be sent. Informational notifications are suppressed\n */\n alertsOnly: boolLike().optional(),\n});\n\nexport type SlackConfig = z.infer<typeof SlackConfig>;\n\nexport const NotificationConfig = z.discriminatedUnion(\"type\", [\n TelegramConfig,\n SlackConfig,\n]);\n\nexport type NotificationConfig = z.infer<typeof NotificationConfig>;\n\nexport const SignlConfig = z.object({\n apiKey: z\n .union([z.string(), z.instanceof(CensoredString)])\n .transform(CensoredString.transform),\n teamId: z\n .union([z.string(), z.instanceof(CensoredString)])\n .transform(CensoredString.transform),\n});\n\nexport type SignlConfig = z.infer<typeof SignlConfig>;\n","import type { ILogger } from \"@gearbox-protocol/sdk\";\nimport { md } from \"@vlad-yakovlev/telegram-md\";\nimport Queue from \"p-queue\";\nimport { withRetry } from \"viem\";\nimport type { TelegramConfig } from \"./schema.js\";\nimport { ThrottleManager } from \"./ThrottleManager.js\";\nimport type {\n IDedupableNotification,\n INotifier,\n NotificationSeverity,\n} from \"./types.js\";\n\nexport type TelegramNotifierOptions = TelegramConfig & {\n retryInterval?: number;\n retryCount?: number;\n maxChunkSize?: number;\n fetchFn?: typeof fetch;\n};\n\ninterface TelegramPayload {\n text: string;\n parse_mode?: \"MarkdownV2\";\n}\n\nconst DEFAULT_RETRY_INTERVAL = 1000;\nconst DEFAULT_RETRY_COUNT = 5;\nconst DEFAULT_MAX_CHUNK_SIZE = 4096;\n\nexport class TelegramNotifier implements INotifier {\n readonly #logger?: ILogger;\n readonly #alertsChannel: string;\n readonly #notificationsChannel?: string;\n readonly #botToken: string;\n readonly #prefix?: string;\n\n readonly #retryInterval: number;\n readonly #retryCount: number;\n readonly #maxChunkSize: number;\n readonly #fetchFn: typeof fetch;\n readonly #queue = new Queue({\n concurrency: 1,\n // https://core.telegram.org/bots/faq#my-bot-is-hitting-limits-how-do-i-avoid-this\n // 20 messages/minute limit\n interval: 60_000,\n intervalCap: 20,\n strict: true,\n });\n readonly #throttleManager = new ThrottleManager();\n\n constructor(opts: TelegramNotifierOptions, logger?: ILogger) {\n this.#logger = logger;\n this.#alertsChannel = opts.alertsChannel.value;\n this.#botToken = opts.token.value;\n this.#notificationsChannel = opts.notificationsChannel?.value;\n this.#prefix = opts.prefix;\n this.#retryInterval = opts.retryInterval ?? DEFAULT_RETRY_INTERVAL;\n this.#retryCount = opts.retryCount ?? DEFAULT_RETRY_COUNT;\n this.#maxChunkSize = opts.maxChunkSize ?? DEFAULT_MAX_CHUNK_SIZE;\n this.#fetchFn = opts.fetchFn ?? fetch;\n }\n\n public notify(\n message: IDedupableNotification,\n severity: NotificationSeverity,\n ): void {\n const dest =\n severity === \"alert\" ? this.#alertsChannel : this.#notificationsChannel;\n if (!dest) {\n return;\n }\n this.#enqueueTelegram(message, dest, severity === \"alert\");\n }\n\n async #enqueueTelegram(\n message: IDedupableNotification,\n channelId: string,\n severe = false,\n ): Promise<void> {\n if (!this.#throttleManager.canSend(message.dedupeKey)) {\n return;\n }\n\n const payloads = this.#toTelegramPayloads(message);\n for (const payload of payloads) {\n this.#queue.add(\n () =>\n this.#sendToTelegram(payload, channelId, severe).catch(e =>\n this.#logger?.error(e),\n ),\n {\n priority: severe ? 100 : 0,\n timeout: this.#retryInterval * this.#retryCount * 2,\n },\n );\n }\n\n this.#throttleManager.onSent(message.dedupeKey, message.throttleFn);\n }\n\n async #sendToTelegram(\n payload: TelegramPayload,\n channelId: string,\n severe = false,\n ): Promise<void> {\n const severity = severe ? \"alert\" : \"notification\";\n this.#logger?.debug(\n `sending telegram ${severity} to channel ${channelId}...`,\n );\n const url = `https://api.telegram.org/bot${this.#botToken}/sendMessage`;\n\n try {\n await withRetry(\n async () => {\n const resp = await this.#fetchFn(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n ...payload,\n chat_id: channelId,\n }),\n });\n if (resp.ok) {\n this.#logger?.debug(`telegram ${severity} sent successfully`);\n } else {\n const txt = await resp.text();\n throw new Error(`api error ${resp.status}: ${txt}`);\n }\n },\n { delay: this.#retryInterval, retryCount: this.#retryCount },\n );\n } catch (e) {\n this.#logger?.error(`cannot send telegram ${severity}: ${e}`);\n }\n }\n\n #toTelegramPayloads(message: IDedupableNotification): TelegramPayload[] {\n const { md: mdMessage, plain } = message;\n if (!mdMessage) {\n return this.#slicePlainText(plain);\n }\n let text = mdMessage;\n if (this.#prefix) {\n text = md.join([md.bold(this.#prefix), text], \" \");\n }\n const mdText = text.toString();\n if (mdText.length > this.#maxChunkSize) {\n return this.#slicePlainText(plain);\n }\n return [{ text: mdText, parse_mode: \"MarkdownV2\" }];\n }\n\n /**\n * Telegram has a limit on message size (default 4096 characters).\n * This function slices the text into chunks respecting the limit.\n * Each chunk is prefixed with the prefix (if set), ensuring the total length <= maxChunkSize.\n * @param text - The text to slice.\n * @returns An array of texts.\n */\n #slicePlainText(text: string): TelegramPayload[] {\n const chunks = [];\n const prefix = this.#prefix ? `${this.#prefix} ` : \"\";\n const maxChunkSize = this.#maxChunkSize - prefix.length;\n\n for (let i = 0; i < text.length; i += maxChunkSize) {\n const chunkText = text.slice(i, i + maxChunkSize);\n chunks.push({ text: `${prefix}${chunkText}` });\n }\n return chunks;\n }\n}\n","import { LRUCache } from \"lru-cache\";\nimport type { ThrottleFn } from \"./types.js\";\n\ninterface ThrottleState {\n lastAlertTime: number;\n currentWait: number;\n}\n\nexport function defaultBackoffFn(prevWait: number): number {\n return Math.min(\n prevWait ? prevWait * 2 : 10 * 60 * 1000, // 10 minutes\n 24 * 60 * 60 * 1000, // 24 hours\n );\n}\n\n/**\n * Manages per-feed throttling with exponential backoff.\n * Each dedupe key has its own independent throttle timer.\n */\nexport class ThrottleManager {\n #state = new LRUCache<string, ThrottleState>({ max: 5000 });\n\n /**\n * Checks if it's permitted to send a message for the given dedupe key\n * @returns\n */\n public canSend(dedupeKey?: string): boolean {\n if (!dedupeKey) {\n return true;\n }\n const state = this.#getState(dedupeKey);\n const timeSinceLastAlert = Date.now() - state.lastAlertTime;\n return timeSinceLastAlert >= state.currentWait;\n }\n\n /**\n * Records that notification was sent for the given dedupe key\n */\n public onSent(\n dedupeKey?: string,\n throttleFn: ThrottleFn = defaultBackoffFn,\n ): void {\n if (!dedupeKey) {\n return;\n }\n const state = this.#getState(dedupeKey);\n this.#state.set(dedupeKey, {\n lastAlertTime: Date.now(),\n currentWait: throttleFn(state.currentWait),\n });\n }\n\n #getState(dedupeKey: string): ThrottleState {\n return this.#state.get(dedupeKey) ?? { lastAlertTime: 0, currentWait: 0 };\n }\n}\n","import { ADDRESS_0X0, AddressMap, type ILogger } from \"@gearbox-protocol/sdk\";\nimport type { Address } from \"viem\";\nimport { createNotifier } from \"./createNotifier.js\";\nimport SignlNotifier, { type SignlServiceOptions } from \"./SignlNotifier.js\";\nimport type { NotificationConfig } from \"./schema.js\";\nimport type {\n IDedupableNotification,\n INotification,\n INotificationService,\n INotifier,\n NotificationLike,\n NotificationSeverity,\n} from \"./types.js\";\n\nexport interface NotificationsServiceOptions {\n notifications: Array<NotificationConfig & { recipient?: Address }>;\n signl?: SignlServiceOptions;\n}\n\nexport class NotificationsService implements INotificationService {\n readonly #logger?: ILogger;\n readonly #notifiers = new AddressMap<INotifier>();\n readonly #signlNotifier?: SignlNotifier;\n\n constructor(options: NotificationsServiceOptions, logger?: ILogger) {\n this.#logger = logger;\n for (const n of options.notifications) {\n const recipient = n.recipient ?? ADDRESS_0X0;\n const notifier = createNotifier(n, logger);\n if (notifier) {\n this.#notifiers.upsert(recipient, notifier);\n }\n }\n\n if (options.signl) {\n this.#signlNotifier = new SignlNotifier(options.signl);\n } else {\n this.#logger?.warn(\"signl notifier not configured\");\n }\n }\n\n public registerRecipient(\n address: Address,\n options: NotificationConfig,\n ): void {\n const notifier = createNotifier(options, this.#logger);\n if (notifier) {\n this.#notifiers.upsert(address, notifier);\n }\n }\n\n public signl(message: string, dedupeKey?: string): void {\n this.#signlNotifier?.alert(message, dedupeKey);\n }\n\n public alert(msg: NotificationLike): void {\n this.#notify(msg, \"alert\");\n }\n\n public notify(msg: NotificationLike): void {\n this.#notify(msg, \"notification\");\n }\n\n #notify(msg: NotificationLike, severity: NotificationSeverity): void {\n const message = this.#toNotification(msg);\n for (const [addr, notifier] of this.#notifiers.entries()) {\n const recipient = addr === ADDRESS_0X0 ? undefined : addr;\n const recipientNotification = message.messageFor(recipient);\n if (recipientNotification) {\n const notification = this.#toDedupableNotification(\n recipientNotification,\n );\n notifier.notify(notification, severity);\n // log global notifications\n if (addr === ADDRESS_0X0) {\n if (severity === \"alert\") {\n this.#logger?.warn(notification.plain);\n } else {\n this.#logger?.debug(notification.plain);\n }\n }\n }\n }\n }\n\n #toNotification(message: NotificationLike): INotification {\n // global notification without deduplication\n if (typeof message === \"string\" || !(\"messageFor\" in message)) {\n return {\n messageFor: (recipient?: Address) => (recipient ? undefined : message),\n };\n }\n return message;\n }\n\n #toDedupableNotification(\n msg: string | IDedupableNotification,\n ): IDedupableNotification {\n if (typeof msg === \"string\") {\n return {\n plain: msg,\n };\n }\n return msg;\n }\n}\n","import type { ILogger } from \"@gearbox-protocol/sdk\";\nimport { withRetry } from \"viem\";\nimport type { CensoredString } from \"../CensoredString.js\";\nimport type { SignlConfig } from \"./schema.js\";\nimport { ThrottleManager } from \"./ThrottleManager.js\";\nimport type { ThrottleFn } from \"./types.js\";\n\nexport type SignlServiceOptions = SignlConfig & {\n retryInterval?: number;\n retryCount?: number;\n throttleFn?: ThrottleFn;\n};\n\nconst DEFAULT_RETRY_INTERVAL = 1000;\nconst DEFAULT_RETRY_COUNT = 5;\n\nexport default class SignlNotifier {\n readonly #logger?: ILogger;\n\n readonly #apiKey: CensoredString;\n readonly #teamId: CensoredString;\n readonly #retryInterval: number;\n readonly #retryCount: number;\n\n readonly #throttleManager = new ThrottleManager();\n readonly #throttleFn?: ThrottleFn;\n\n constructor(opts: SignlServiceOptions, logger?: ILogger) {\n this.#apiKey = opts.apiKey;\n this.#teamId = opts.teamId;\n this.#retryInterval = opts.retryInterval ?? DEFAULT_RETRY_INTERVAL;\n this.#retryCount = opts.retryCount ?? DEFAULT_RETRY_COUNT;\n this.#logger = logger;\n this.#throttleFn = opts.throttleFn;\n this.#logger?.info(opts, \"signl notifier configured\");\n }\n\n public alert(message: string, dedupeKey?: string): void {\n void this.#sendAlert(message, dedupeKey).catch(e => this.#logger?.error(e));\n }\n\n async #sendAlert(message: string, dedupeKey?: string): Promise<void> {\n if (dedupeKey && !this.#throttleManager.canSend(dedupeKey)) {\n return;\n }\n\n const text = message.slice(0, 64); // it's to be shown in mobile notifications anyways\n this.#logger?.debug(\"sending signl alert\");\n\n await withRetry(\n async () => {\n const resp = await fetch(\n `https://connect.signl4.com/api/v2/alerts?x-s4-api-key=${this.#apiKey.value}`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n category: \"emergency\",\n severity: 0,\n teamId: this.#teamId.value,\n text,\n title: \"GEARBOX ALERT\",\n }),\n },\n );\n if (resp.ok) {\n this.#logger?.warn(\"signl alert sent\");\n const data = await resp.json();\n this.#logger?.info(`signl alert response: ${JSON.stringify(data)}`);\n } else {\n throw new Error(`signl api error ${resp.status}: ${resp.statusText}`);\n }\n },\n { delay: this.#retryInterval, retryCount: this.#retryCount },\n );\n\n if (dedupeKey) {\n this.#throttleManager.onSent(dedupeKey, this.#throttleFn);\n }\n }\n}\n","import { SUPPORTED_NETWORKS } from \"@gearbox-protocol/sdk\";\nimport { z } from \"zod/v4\";\nimport { CensoredString } from \"./CensoredString.js\";\nimport { CensoredURL } from \"./CensoredURL.js\";\nimport { stringArrayLike } from \"./schemas/schema-primitives.js\";\nimport { zommandRegistry } from \"./Zommand.js\";\n\nexport const RpcProvider = z.enum([\n \"alchemy\",\n \"drpc\",\n \"ankr\",\n \"thirdweb\",\n \"custom\",\n \"erpc\",\n]);\nexport type RpcProvider = z.infer<typeof RpcProvider>;\n\nexport const ProvidersSchema = z.object({\n network: z.enum(SUPPORTED_NETWORKS).register(zommandRegistry, {\n flags: \"--network <network>\",\n description: \"Gearbox-supported network\",\n env: \"NETWORK\",\n }),\n /**\n * RPC providers to use\n */\n jsonRpcProviders: stringArrayLike()\n .pipe(z.array(z.url().transform(CensoredURL.transform)))\n .transform(a => (a.length ? a : undefined))\n .optional()\n .register(zommandRegistry, {\n flags: \"--json-rpc-providers <urls...>\",\n description: \"RPC providers to use, comma separated full http urls.\",\n env: \"JSON_RPC_PROVIDERS\",\n }),\n /**\n * RPC providers to use with their keys\n * Order matters\n */\n enabledProviders: stringArrayLike()\n .pipe(z.array(RpcProvider))\n .optional()\n .register(zommandRegistry, {\n flags: \"--enabled-providers <providers...>\",\n description:\n \"Keyed RPC providers to use, comma separated, order matters. Possible values: custom (for full json rpc urls)/alchemy/drpc/ankr/thirdweb\",\n env: \"ENABLED_PROVIDERS\",\n }),\n /**\n * Alchemy API keys to use\n */\n alchemyKeys: stringArrayLike()\n .pipe(z.array(z.string().transform(CensoredString.transform)))\n .transform(a => (a.length ? a : undefined))\n .optional()\n .register(zommandRegistry, {\n flags: \"--alchemy-keys <keys...>\",\n description: \"Alchemy API keys to use, comma separated\",\n env: \"ALCHEMY_KEYS\",\n }),\n /**\n * DRPC API keys to use\n */\n drpcKeys: stringArrayLike()\n .pipe(z.array(z.string().transform(CensoredString.transform)))\n .transform(a => (a.length ? a : undefined))\n .optional()\n .register(zommandRegistry, {\n flags: \"--drpc-keys <keys...>\",\n description: \"DRPC API keys to use, comma separated\",\n env: \"DRPC_KEYS\",\n }),\n /**\n * Ankr API keys to use\n */\n ankrKeys: stringArrayLike()\n .pipe(z.array(z.string().transform(CensoredString.transform)))\n .transform(a => (a.length ? a : undefined))\n .optional()\n .register(zommandRegistry, {\n flags: \"--ankr-keys <keys...>\",\n description: \"Ankr API keys to use, comma separated\",\n env: \"ANKR_KEYS\",\n }),\n /**\n * Thirdweb API keys to use\n */\n thirdwebKeys: stringArrayLike()\n .pipe(z.array(z.string().transform(CensoredString.transform)))\n .transform(a => (a.length ? a : undefined))\n .optional()\n .register(zommandRegistry, {\n flags: \"--thirdweb-keys <keys...>\",\n description: \"Thirdweb API keys to use, comma separated\",\n env: \"THIRDWEB_KEYS\",\n }),\n /**\n * If set, eRPC will be added as first provider\n */\n erpcProjectId: z.string().optional().register(zommandRegistry, {\n flags: \"--erpc-project-id <project-id>\",\n description: \"If set, eRPC will be added as first provider\",\n env: \"ERPC_PROJECT_ID\",\n }),\n /**\n * eRPC URL to use\n */\n erpcUrl: z.url().default(\"http://erpc.local\").register(zommandRegistry, {\n flags: \"--erpc-url <url>\",\n description: \"eRPC URL to use\",\n env: \"ERPC_URL\",\n }),\n /**\n * Timeout for JSON RPC requests, in milliseconds\n */\n jsonRpcTimeout: z.coerce\n .number()\n .int()\n .positive()\n .optional()\n .register(zommandRegistry, {\n flags: \"--json-rpc-timeout <timeout>\",\n description: \"Timeout for JSON RPC requests, in milliseconds\",\n env: \"JSON_RPC_TIMEOUT\",\n }),\n});\n\nexport type ProvidersSchema = z.infer<typeof ProvidersSchema>;\n","import { Command, Option } from \"@commander-js/extra-typings\";\nimport * as z4 from \"zod/v4/core\";\nimport { decompressObject } from \"./compressedConfig.js\";\nimport type { TemplateData } from \"./resolveYamlFiles.js\";\nimport { resolveYamlFiles } from \"./resolveYamlFiles.js\";\n\nexport const zommandRegistry = z4.registry<{\n flags: string;\n env?: string;\n description?: string;\n}>();\n\nexport interface ZommandOptions<T extends z4.$ZodTypes> {\n schema: T;\n templateData?: TemplateData;\n /**\n * If value is string, it's used as default value for config file\n */\n configFile?: boolean | string;\n /**\n * If true, allows to pass config zlib compressed config as --inline-config=... or INLINE_CONFIG env var\n */\n inlineConfig?: boolean;\n}\n\nexport class Zommand<\n T extends z4.$ZodTypes,\n Args extends any[] = [],\n> extends Command<Args, z4.output<T>> {\n #schema: T;\n #templatedData?: TemplateData;\n #envToObjectKeys: Record<string, string> = {};\n\n constructor(name: string, opts: ZommandOptions<T>) {\n super(name);\n const {\n schema,\n templateData,\n configFile = true,\n inlineConfig = true,\n } = opts;\n this.#schema = schema;\n this.#templatedData = templateData;\n const def = this.#schema._zod.def;\n\n if (def.type === \"object\") {\n this.#addOptionsFromObject(def);\n } else if (def.type === \"union\") {\n for (const o of def.options) {\n const opt = o as z4.$ZodTypes;\n if (opt._zod.def.type === \"object\") {\n this.#addOptionsFromObject(opt._zod.def);\n }\n }\n } else {\n throw new Error(\n `expected object schema, got ${this.#schema._zod.def.type}`,\n );\n }\n\n if (configFile) {\n let opt = new Option(\"--config [file]\", \"config file (or s3 link\");\n if (typeof configFile === \"string\") {\n opt = opt.default(configFile);\n }\n this.addOption(opt);\n }\n\n if (inlineConfig) {\n this.addOption(new Option(\"--inline-config [config]\", \"inline config\"));\n }\n }\n\n #addOptionsFromObject(def: z4.$ZodObjectDef): void {\n const shape = def.shape;\n for (const [key, optionSchema] of Object.entries(shape)) {\n const meta = zommandRegistry.get(optionSchema);\n if (!meta) {\n continue;\n }\n // this avoids duplicate options in case of discriminated unions\n const existing = this.options.find(o => o.flags === meta.flags);\n if (!existing) {\n let description = meta.description;\n if (meta.env) {\n description = `${description} (env variable ${meta.env})`;\n }\n this.addOption(new Option(meta.flags, description));\n if (meta.env) {\n this.#envToObjectKeys[meta.env] = key;\n }\n }\n }\n }\n\n override action(\n fn: (\n this: this,\n ...args: [...Args, z4.output<T>, this]\n ) => void | Promise<void>,\n ): this {\n return super.action(async (...args: [...Args, any, this]) => {\n const argz = args;\n const _cmd = argz.splice(-1);\n const [{ config, inlineConfig, ...opts }] = argz.splice(-1);\n\n let fromYaml: object = {};\n if (config) {\n fromYaml = await resolveYamlFiles(config, {\n ...(process.env as Record<string, string>),\n ...this.#templatedData,\n });\n }\n let fromInlineConfig: object = {};\n if (inlineConfig) {\n fromInlineConfig = await decompressObject(\n inlineConfig,\n this.#templatedData,\n );\n } else if (process.env.INLINE_CONFIG) {\n fromInlineConfig = await decompressObject(\n process.env.INLINE_CONFIG,\n this.#templatedData,\n );\n }\n\n const schemaFromEnv: Record<string, string> = {};\n for (const [env, key] of Object.entries(this.#envToObjectKeys)) {\n if (process.env[env]) {\n schemaFromEnv[key] = process.env[env]!;\n }\n }\n\n // deep merge is not required: env and cli flags are for top-level only\n const combined = {\n ...schemaFromEnv,\n ...fromYaml,\n ...fromInlineConfig,\n ...opts,\n };\n\n const data = z4.parse(this.#schema, combined);\n await fn.apply(this, [...argz, data, this]);\n });\n }\n}\n","import {\n GetSecretValueCommand,\n SecretsManagerClient,\n} from \"@aws-sdk/client-secrets-manager\";\n\nexport class SecretsManager {\n #smClient?: SecretsManagerClient;\n #secrets: Map<string, string> = new Map();\n\n public async secret(key: string): Promise<string> {\n const [SecretId, ...jsonPath] = key.split(\".\");\n const secretStr = await this.#getSecret(SecretId);\n if (!jsonPath.length) {\n return secretStr;\n }\n let v = JSON.parse(secretStr);\n for (const p of jsonPath) {\n v = v[p];\n }\n if (!v || typeof v !== \"string\") {\n throw new Error(`cannot find secret '${key}'`);\n }\n return v;\n }\n\n public async secretRaw(key: string): Promise<unknown> {\n const val = await this.#getSecret(key);\n try {\n return JSON.parse(val);\n } catch {\n return val;\n }\n }\n\n async #getSecret(SecretId: string): Promise<string> {\n if (this.#secrets.has(SecretId)) {\n return this.#secrets.get(SecretId)!;\n }\n\n if (!this.#smClient) {\n this.#smClient = new SecretsManagerClient({});\n }\n // https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/ssm/command/GetParameterCommand/\n const { SecretString } = await this.#smClient.send(\n new GetSecretValueCommand({ SecretId }),\n );\n if (!SecretString) {\n throw new Error(`secret '${SecretId}' not found`);\n }\n this.#secrets.set(SecretId, SecretString);\n\n return SecretString;\n }\n}\n\nexport const secretsManagerProxy = (\n mgr?: SecretsManager,\n): Record<string, Promise<unknown>> =>\n new Proxy<any>(mgr ?? new SecretsManager(), {\n get(target, prop) {\n if (\n typeof prop === \"string\" &&\n ![\"secret\", \"secretRaw\", \"then\", \"catch\", \"finally\"].includes(prop)\n ) {\n return target.secretRaw(prop);\n }\n },\n });\n","import { GetParameterCommand, SSMClient } from \"@aws-sdk/client-ssm\";\n\nexport class SSMManager {\n #ssmClient?: SSMClient;\n #parameters: Map<string, string> = new Map();\n\n public async parameter(name: string): Promise<string> {\n if (this.#parameters.has(name)) {\n return this.#parameters.get(name)!;\n }\n\n if (!this.#ssmClient) {\n this.#ssmClient = new SSMClient({});\n }\n\n const response = await this.#ssmClient.send(\n new GetParameterCommand({\n Name: name,\n }),\n );\n const value = response.Parameter?.Value;\n if (!value) {\n throw new Error(`parameter ${name} value not found`);\n }\n this.#parameters.set(name, value);\n return value;\n }\n}\n\nexport const ssmManagerProxy = (\n mgr?: SSMManager,\n): Record<string, Promise<unknown>> =>\n new Proxy<any>(mgr ?? new SSMManager(), {\n get(target, prop) {\n if (\n typeof prop === \"string\" &&\n ![\"parameter\", \"then\", \"catch\", \"finally\"].includes(prop)\n ) {\n return target.parameter(prop);\n }\n },\n });\n","export interface IValue<V extends string = string> {\n value: V;\n}\n\nexport function uncensorMap<V extends string = string>(\n map: Record<string, IValue<V>>,\n): Record<string, V> {\n return Object.fromEntries(Object.entries(map).map(([k, v]) => [k, v.value]));\n}\n","import type { ILogger, NetworkType } from \"@gearbox-protocol/sdk\";\nimport { AddressMap } from \"@gearbox-protocol/sdk\";\nimport { z } from \"zod/v4\";\nimport { fetchRetry } from \"./fetchRetry.js\";\nimport { WhitelistItemSchema } from \"./schemas/whitelist-schema.js\";\n\nconst REFRESH_INTERVAL_MS = 10 * 60 * 1000;\n\nconst WhitelistResponse = z.array(WhitelistItemSchema);\n\nexport interface WhitelistOptions {\n url: string;\n network: NetworkType;\n logger?: ILogger;\n}\n\n/**\n * Fetches a network-scoped whitelist from the deploy-tools backend and keeps\n * it in memory with a 10-minute refresh interval.\n *\n * On fetch failure the previous in-memory copy is retained; if no successful\n * fetch has occurred yet the whitelist is considered empty.\n */\nexport class Whitelist {\n readonly #url: string;\n readonly #network: NetworkType;\n readonly #logger?: ILogger;\n\n #items = new AddressMap<WhitelistItemSchema>();\n #refreshInterval?: number;\n\n constructor({ url, network, logger }: WhitelistOptions) {\n this.#url = url;\n this.#network = network;\n this.#logger = logger?.child?.({ name: \"whitelist\" }) ?? logger;\n }\n\n /**\n * Performs the initial fetch and starts the periodic refresh timer.\n * Failure of the initial fetch is non-fatal: the whitelist stays empty.\n */\n public async start(): Promise<void> {\n this.#logger?.info(\n `loading ${this.#network} whitelist from ${this.#url}, refresh every ${REFRESH_INTERVAL_MS / 1000}s`,\n );\n await this.#refresh();\n this.#refreshInterval = setInterval(() => {\n this.#refresh().catch(e => {\n this.#logger?.warn(`unexpected whitelist refresh error: ${e}`);\n });\n }, REFRESH_INTERVAL_MS) as unknown as number;\n }\n\n /** Stops the refresh timer. */\n public stop(): void {\n if (this.#refreshInterval) {\n clearInterval(this.#refreshInterval);\n this.#refreshInterval = undefined;\n }\n }\n\n /**\n * Fetches the whitelist from the backend, parses it and atomically\n * replaces the in-memory map. On any error logs a warning and retains\n * the previous map.\n */\n async #refresh(): Promise<void> {\n try {\n const resp = await fetchRetry(this.#url);\n if (!resp.ok) {\n throw new Error(\n `whitelist fetch failed: ${resp.status} ${resp.statusText}`,\n );\n }\n const data = await resp.json();\n const items = WhitelistResponse.parse(data).filter(\n i => i.network === this.#network,\n );\n const next = new AddressMap<WhitelistItemSchema>();\n for (const item of items) {\n next.upsert(item.address, item);\n }\n this.#items = next;\n this.#logger?.debug(\n `loaded ${items.length} whitelist entries for ${this.#network}`,\n );\n } catch (e) {\n this.#logger?.warn(\n `failed to refresh whitelist from ${this.#url}, keeping previous version: ${e}`,\n );\n }\n }\n\n /**\n * Returns the matching whitelist entry for the given address, or\n * `undefined` if absent or expired.\n */\n public has(address: string): WhitelistItemSchema | undefined {\n const item = this.#items.get(address);\n if (!item) {\n return undefined;\n }\n if (item.expiresAt !== undefined && Date.now() / 1000 >= item.expiresAt) {\n return undefined;\n }\n return item;\n }\n}\n"],"mappings":"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","names":["DEFAULT_RETRY_INTERVAL","withRetry","DEFAULT_RETRY_INTERVAL","DEFAULT_RETRY_COUNT","withRetry","z","z","AddressMap","z","z","AddressMap"]}
@@ -0,0 +1,67 @@
1
+ import { z } from 'zod/v4';
2
+
3
+ declare const boolLike: () => z.ZodPipe<z.ZodAny, z.ZodTransform<boolean, any>>;
4
+ declare const stringArrayLike: () => z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodPipe<z.ZodString, z.ZodTransform<string[], string>>]>;
5
+ declare const optionalStringArrayLike: () => z.ZodPipe<z.ZodOptional<z.ZodUnion<readonly [z.ZodArray<z.ZodString>, z.ZodPipe<z.ZodString, z.ZodTransform<string[], string>>]>>, z.ZodTransform<string[] | undefined, string[] | undefined>>;
6
+ /**
7
+ * Like Address from abitype/zod, but converts an address into an address that is checksum encoded.
8
+ */
9
+ declare const addressLike: () => z.ZodPipe<z.ZodString, z.ZodTransform<`0x${string}`, string>>;
10
+ declare const addressArrayLike: () => 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<`0x${string}`, string>>>>;
11
+ declare const optionalAddressArrayLike: () => z.ZodPipe<z.ZodOptional<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<`0x${string}`, string>>>>>, z.ZodTransform<`0x${string}`[] | undefined, `0x${string}`[] | undefined>>;
12
+
13
+ declare const WhitelistItemsSchema: z.ZodObject<{
14
+ network: z.ZodEnum<{
15
+ Mainnet: "Mainnet";
16
+ Arbitrum: "Arbitrum";
17
+ Optimism: "Optimism";
18
+ Base: "Base";
19
+ Sonic: "Sonic";
20
+ MegaETH: "MegaETH";
21
+ Monad: "Monad";
22
+ Berachain: "Berachain";
23
+ Avalanche: "Avalanche";
24
+ BNB: "BNB";
25
+ WorldChain: "WorldChain";
26
+ Etherlink: "Etherlink";
27
+ Hemi: "Hemi";
28
+ Lisk: "Lisk";
29
+ Plasma: "Plasma";
30
+ Somnia: "Somnia";
31
+ }>;
32
+ addresses: z.ZodArray<z.ZodPipe<z.ZodString, z.ZodTransform<`0x${string}`, string>>>;
33
+ reason: z.ZodDefault<z.ZodString>;
34
+ issue: z.ZodOptional<z.ZodString>;
35
+ expiresAt: z.ZodOptional<z.ZodNumber>;
36
+ }, z.core.$strip>;
37
+ type WhitelistItemsSchema = z.infer<typeof WhitelistItemsSchema>;
38
+ declare const WhitelistItemSchema: z.ZodObject<{
39
+ network: z.ZodEnum<{
40
+ Mainnet: "Mainnet";
41
+ Arbitrum: "Arbitrum";
42
+ Optimism: "Optimism";
43
+ Base: "Base";
44
+ Sonic: "Sonic";
45
+ MegaETH: "MegaETH";
46
+ Monad: "Monad";
47
+ Berachain: "Berachain";
48
+ Avalanche: "Avalanche";
49
+ BNB: "BNB";
50
+ WorldChain: "WorldChain";
51
+ Etherlink: "Etherlink";
52
+ Hemi: "Hemi";
53
+ Lisk: "Lisk";
54
+ Plasma: "Plasma";
55
+ Somnia: "Somnia";
56
+ }>;
57
+ category: z.ZodString;
58
+ address: z.ZodPipe<z.ZodString, z.ZodTransform<`0x${string}`, string>>;
59
+ reason: z.ZodDefault<z.ZodString>;
60
+ issue: z.ZodOptional<z.ZodString>;
61
+ contractType: z.ZodOptional<z.ZodString>;
62
+ createdAt: z.ZodNumber;
63
+ expiresAt: z.ZodOptional<z.ZodNumber>;
64
+ }, z.core.$strip>;
65
+ type WhitelistItemSchema = z.infer<typeof WhitelistItemSchema>;
66
+
67
+ export { WhitelistItemSchema, WhitelistItemsSchema, addressArrayLike, addressLike, boolLike, optionalAddressArrayLike, optionalStringArrayLike, stringArrayLike };
package/dist/schema.js ADDED
@@ -0,0 +1,21 @@
1
+ import {
2
+ WhitelistItemSchema,
3
+ WhitelistItemsSchema,
4
+ addressArrayLike,
5
+ addressLike,
6
+ boolLike,
7
+ optionalAddressArrayLike,
8
+ optionalStringArrayLike,
9
+ stringArrayLike
10
+ } from "./chunk-WVBN5ZL7.js";
11
+ export {
12
+ WhitelistItemSchema,
13
+ WhitelistItemsSchema,
14
+ addressArrayLike,
15
+ addressLike,
16
+ boolLike,
17
+ optionalAddressArrayLike,
18
+ optionalStringArrayLike,
19
+ stringArrayLike
20
+ };
21
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gearbox-protocol/cli-utils",
3
- "version": "9.0.1",
3
+ "version": "9.1.0",
4
4
  "description": "Utils for creating cli apps",
5
5
  "homepage": "https://gearbox.fi",
6
6
  "keywords": [
@@ -17,6 +17,17 @@
17
17
  "module": "./dist/index.js",
18
18
  "types": "./dist/index.d.ts",
19
19
  "typings": "./dist/index.d.ts",
20
+ "exports": {
21
+ ".": {
22
+ "types": "./dist/index.d.ts",
23
+ "default": "./dist/index.js"
24
+ },
25
+ "./schema": {
26
+ "types": "./dist/schema.d.ts",
27
+ "default": "./dist/schema.js"
28
+ },
29
+ "./package.json": "./package.json"
30
+ },
20
31
  "files": [
21
32
  "dist"
22
33
  ],