Kaynağa Gözat

linting: improved strictness and integrated shared linting rules

benduran 3 hafta önce
ebeveyn
işleme
f63e96d9e2
33 değiştirilmiş dosya ile 657 ekleme ve 189 silme
  1. 0 6
      apps/hermes/client/js/.eslintrc.js
  2. 1 0
      apps/hermes/client/js/eslint.config.js
  3. 3 4
      apps/hermes/client/js/package.json
  4. 1 1
      apps/hermes/client/js/src/examples/hermes-client.ts
  5. 33 22
      apps/hermes/client/js/src/hermes-client.ts
  6. 1 1
      apps/hermes/client/js/src/index.ts
  7. 4 3
      apps/hermes/client/js/src/utils.ts
  8. 330 0
      apps/hermes/client/js/src/zod-schemas.ts
  9. 222 59
      pnpm-lock.yaml
  10. 1 1
      price_service/client/js/.eslintrc.js
  11. 1 1
      price_service/sdk/js/.eslintignore
  12. 0 9
      price_service/sdk/js/.eslintrc.js
  13. 4 0
      price_service/sdk/js/eslint.config.js
  14. 2 3
      price_service/sdk/js/package.json
  15. 2 2
      price_service/sdk/js/src/AccumulatorUpdateData.ts
  16. 4 4
      price_service/sdk/js/src/__tests__/AccumulatorUpdateData.test.ts
  17. 2 2
      price_service/sdk/js/src/__tests__/PriceFeed.test.ts
  18. 9 7
      price_service/sdk/js/src/index.ts
  19. 12 12
      price_service/sdk/js/src/schemas/PriceFeed.ts
  20. 2 7
      pythnet/message_buffer/tsconfig.build.json
  21. 1 1
      target_chains/ethereum/abi_generator/package.json
  22. 1 1
      target_chains/ethereum/sdk/stylus/pyth-mock-solidity/package.json
  23. 0 10
      target_chains/solana/sdk/js/solana_utils/.eslintrc.js
  24. 1 0
      target_chains/solana/sdk/js/solana_utils/eslint.config.js
  25. 2 3
      target_chains/solana/sdk/js/solana_utils/package.json
  26. 0 6
      target_chains/starknet/sdk/js/.eslintrc.js
  27. 1 0
      target_chains/starknet/sdk/js/eslint.config.js
  28. 3 4
      target_chains/starknet/sdk/js/package.json
  29. 1 1
      target_chains/starknet/sdk/js/src/index.ts
  30. 0 6
      target_chains/ton/sdk/js/.eslintrc.js
  31. 1 0
      target_chains/ton/sdk/js/eslint.config.js
  32. 3 4
      target_chains/ton/sdk/js/package.json
  33. 9 9
      target_chains/ton/sdk/js/src/index.ts

+ 0 - 6
apps/hermes/client/js/.eslintrc.js

@@ -1,6 +0,0 @@
-module.exports = {
-  root: true,
-  parser: "@typescript-eslint/parser",
-  plugins: ["@typescript-eslint"],
-  extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
-};

+ 1 - 0
apps/hermes/client/js/eslint.config.js

@@ -0,0 +1 @@
+export { base as default } from "@cprussin/eslint-config";

+ 3 - 4
apps/hermes/client/js/package.json

@@ -37,12 +37,11 @@
   ],
   "license": "Apache-2.0",
   "devDependencies": {
+    "@cprussin/eslint-config": "catalog:",
     "@types/jest": "^29.4.0",
     "@types/node": "^20.14.2",
     "@types/yargs": "^17.0.10",
-    "@typescript-eslint/eslint-plugin": "^5.21.0",
-    "@typescript-eslint/parser": "^5.21.0",
-    "eslint": "^8.14.0",
+    "eslint": "catalog:",
     "jest": "^29.4.0",
     "openapi-zod-client": "^1.18.1",
     "prettier": "catalog:",
@@ -106,4 +105,4 @@
   "module": "./dist/esm/index.js",
   "types": "./dist/cjs/index.d.ts",
   "main": "./dist/cjs/index.js"
-}
+}

+ 1 - 1
apps/hermes/client/js/src/examples/HermesClient.ts → apps/hermes/client/js/src/examples/hermes-client.ts

@@ -42,7 +42,7 @@ function extractBasicAuthorizationHeadersFromUrl(urlString: string): {
   const headers: HeadersInit = {};
 
   if (url.username && url.password) {
-    headers["Authorization"] = `Basic ${btoa(
+    headers.Authorization = `Basic ${btoa(
       `${url.username}:${url.password}`,
     )}`;
     url.username = "";

+ 33 - 22
apps/hermes/client/js/src/HermesClient.ts → apps/hermes/client/js/src/hermes-client.ts

@@ -1,7 +1,11 @@
+/* eslint-disable @typescript-eslint/require-await */
+/* eslint-disable @typescript-eslint/no-misused-spread */
+/* eslint-disable @typescript-eslint/no-unsafe-assignment */
 import { EventSource } from "eventsource";
-import { schemas } from "./zodSchemas.js";
 import { z } from "zod";
+
 import { camelToSnakeCaseObject } from "./utils.js";
+import { schemas } from "./zod-schemas.js";
 
 // Accessing schema objects
 export type AssetType = z.infer<typeof schemas.AssetType>;
@@ -48,8 +52,8 @@ export class HermesClient {
   /**
    * Constructs a new Connection.
    *
-   * @param endpoint endpoint URL to the price service. Example: https://website/example/
-   * @param config Optional HermesClientConfig for custom configurations.
+   * @param endpoint - endpoint URL to the price service. Example: https://website/example/
+   * @param config - Optional HermesClientConfig for custom configurations.
    */
   constructor(endpoint: string, config?: HermesClientConfig) {
     this.baseURL = endpoint;
@@ -72,12 +76,13 @@ export class HermesClient {
           ...(options?.signal ? [options.signal] : []),
           AbortSignal.timeout(this.timeout),
         ]),
+
         headers: { ...this.headers, ...options?.headers },
       });
       if (!response.ok) {
         const errorBody = await response.text();
         throw new Error(
-          `HTTP error! status: ${response.status}${
+          `HTTP error! status: ${response.status.toString()}${
             errorBody ? `, body: ${errorBody}` : ""
           }`,
         );
@@ -102,7 +107,7 @@ export class HermesClient {
    * This endpoint can be filtered by asset type and query string.
    * This will throw an error if there is a network problem or the price service returns a non-ok response.
    *
-   * @param options Optional parameters:
+   * @param options - Optional parameters:
    *        - query: String to filter the price feeds. If provided, the results will be filtered to all price feeds whose symbol contains the query string. Query string is case insensitive. Example: "bitcoin".
    *        - assetType: String to filter the price feeds by asset type. Possible values are "crypto", "equity", "fx", "metal", "rates", "crypto_redemption_rate". Filter string is case insensitive.
    *
@@ -117,6 +122,7 @@ export class HermesClient {
     fetchOptions?: RequestInit;
   } = {}): Promise<PriceFeedMetadata[]> {
     const url = this.buildURL("price_feeds");
+    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
     if (options) {
       const transformedOptions = camelToSnakeCaseObject(options);
       this.appendUrlSearchParams(url, transformedOptions);
@@ -133,7 +139,7 @@ export class HermesClient {
    * This endpoint can be customized by specifying the encoding type and whether the results should also return the parsed publisher caps.
    * This will throw an error if there is a network problem or the price service returns a non-ok response.
    *
-   * @param options Optional parameters:
+   * @param options - Optional parameters:
    *        - encoding: Encoding type. If specified, return the publisher caps in the encoding specified by the encoding parameter. Default is hex.
    *        - parsed: Boolean to specify if the parsed publisher caps should be included in the response. Default is false.
    *
@@ -148,6 +154,7 @@ export class HermesClient {
     fetchOptions?: RequestInit;
   } = {}): Promise<PublisherCaps> {
     const url = this.buildURL("updates/publisher_stake_caps/latest");
+    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
     if (options) {
       this.appendUrlSearchParams(url, options);
     }
@@ -163,8 +170,8 @@ export class HermesClient {
    * This endpoint can be customized by specifying the encoding type and whether the results should also return the parsed price update using the options object.
    * This will throw an error if there is a network problem or the price service returns a non-ok response.
    *
-   * @param ids Array of hex-encoded price feed IDs for which updates are requested.
-   * @param options Optional parameters:
+   * @param ids - Array of hex-encoded price feed IDs for which updates are requested.
+   * @param options - Optional parameters:
    *        - encoding: Encoding type. If specified, return the price update in the encoding specified by the encoding parameter. Default is hex.
    *        - parsed: Boolean to specify if the parsed price update should be included in the response. Default is false.
    *        - ignoreInvalidPriceIds: Boolean to specify if invalid price IDs should be ignored instead of returning an error. Default is false.
@@ -198,9 +205,9 @@ export class HermesClient {
    * This endpoint can be customized by specifying the encoding type and whether the results should also return the parsed price update.
    * This will throw an error if there is a network problem or the price service returns a non-ok response.
    *
-   * @param publishTime Unix timestamp in seconds.
-   * @param ids Array of hex-encoded price feed IDs for which updates are requested.
-   * @param options Optional parameters:
+   * @param publishTime - Unix timestamp in seconds.
+   * @param ids - Array of hex-encoded price feed IDs for which updates are requested.
+   * @param options - Optional parameters:
    *        - encoding: Encoding type. If specified, return the price update in the encoding specified by the encoding parameter. Default is hex.
    *        - parsed: Boolean to specify if the parsed price update should be included in the response. Default is false.
    *        - ignoreInvalidPriceIds: Boolean to specify if invalid price IDs should be ignored instead of returning an error. Default is false.
@@ -217,7 +224,7 @@ export class HermesClient {
     },
     fetchOptions?: RequestInit,
   ): Promise<PriceUpdate> {
-    const url = this.buildURL(`updates/price/${publishTime}`);
+    const url = this.buildURL(`updates/price/${publishTime.toString()}`);
     for (const id of ids) {
       url.searchParams.append("ids[]", id);
     }
@@ -237,8 +244,8 @@ export class HermesClient {
    * This will return an EventSource that can be used to listen to streaming updates.
    * If an invalid hex-encoded ID is passed, it will throw an error.
    *
-   * @param ids Array of hex-encoded price feed IDs for which streaming updates are requested.
-   * @param options Optional parameters:
+   * @param ids - Array of hex-encoded price feed IDs for which streaming updates are requested.
+   * @param options - Optional parameters:
    *        - encoding: Encoding type. If specified, updates are returned in the specified encoding. Default is hex.
    *        - parsed: Boolean to specify if the parsed price update should be included in the response. Default is false.
    *        - allowUnordered: Boolean to specify if unordered updates are allowed to be included in the stream. Default is false.
@@ -258,9 +265,9 @@ export class HermesClient {
     },
   ): Promise<EventSource> {
     const url = this.buildURL("updates/price/stream");
-    ids.forEach((id) => {
+    for (const id of ids) {
       url.searchParams.append("ids[]", id);
-    });
+    }
 
     if (options) {
       const transformedOptions = camelToSnakeCaseObject(options);
@@ -284,10 +291,10 @@ export class HermesClient {
    * This endpoint can be customized by specifying the encoding type and whether the results should also return the calculated TWAP using the options object.
    * This will throw an error if there is a network problem or the price service returns a non-ok response.
    *
-   * @param ids Array of hex-encoded price feed IDs for which updates are requested.
-   * @param window_seconds The time window in seconds over which to calculate the TWAP, ending at the current time.
+   * @param ids - Array of hex-encoded price feed IDs for which updates are requested.
+   * @param window_seconds - The time window in seconds over which to calculate the TWAP, ending at the current time.
    *  For example, a value of 300 would return the most recent 5 minute TWAP. Must be greater than 0 and less than or equal to 600 seconds (10 minutes).
-   * @param options Optional parameters:
+   * @param options - Optional parameters:
    *        - encoding: Encoding type. If specified, return the TWAP binary data in the encoding specified by the encoding parameter. Default is hex.
    *        - parsed: Boolean to specify if the calculated TWAP should be included in the response. Default is false.
    *        - ignoreInvalidPriceIds: Boolean to specify if invalid price IDs should be ignored instead of returning an error. Default is false.
@@ -304,7 +311,9 @@ export class HermesClient {
     },
     fetchOptions?: RequestInit,
   ): Promise<TwapsResponse> {
-    const url = this.buildURL(`updates/twap/${window_seconds}/latest`);
+    const url = this.buildURL(
+      `updates/twap/${window_seconds.toString()}/latest`,
+    );
     for (const id of ids) {
       url.searchParams.append("ids[]", id);
     }
@@ -325,15 +334,17 @@ export class HermesClient {
     url: URL,
     params: Record<string, string | boolean>,
   ) {
-    Object.entries(params).forEach(([key, value]) => {
+    for (const [key, value] of Object.entries(params)) {
+      // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
       if (value !== undefined) {
         url.searchParams.append(key, String(value));
       }
-    });
+    }
   }
 
   private buildURL(endpoint: string) {
     return new URL(
+      // eslint-disable-next-line unicorn/relative-url-style
       `./v2/${endpoint}`,
       // We ensure the `baseURL` ends with a `/` so that URL doesn't resolve the
       // path relative to the parent.

+ 1 - 1
apps/hermes/client/js/src/index.ts

@@ -1 +1 @@
-export * from './HermesClient.js';
+export * from "./hermes-client.js";

+ 4 - 3
apps/hermes/client/js/src/utils.ts

@@ -1,15 +1,16 @@
+/* eslint-disable @typescript-eslint/no-non-null-assertion */
 function camelToSnakeCase(str: string): string {
-  return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
+  return str.replaceAll(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
 }
 
 export function camelToSnakeCaseObject(
   obj: Record<string, string | boolean>,
 ): Record<string, string | boolean> {
   const result: Record<string, string | boolean> = {};
-  Object.keys(obj).forEach((key) => {
+  for (const key of Object.keys(obj)) {
     const newKey = camelToSnakeCase(key);
     const val = obj[key];
     result[newKey] = val!;
-  });
+  }
   return result;
 }

+ 330 - 0
apps/hermes/client/js/src/zod-schemas.ts

@@ -0,0 +1,330 @@
+import type { ZodiosOptions } from "@zodios/core";
+import { makeApi, Zodios } from "@zodios/core";
+import { z } from "zod";
+
+const AssetType = z.enum([
+  "crypto",
+  "fx",
+  "equity",
+  "metal",
+  "rates",
+  "crypto_redemption_rate",
+  "commodities",
+  "crypto_index",
+  "crypto_nav",
+]);
+const asset_type = AssetType.nullish();
+const RpcPriceIdentifier = z.string();
+const PriceFeedMetadata = z
+  .object({ attributes: z.record(z.string()), id: RpcPriceIdentifier })
+  .passthrough();
+const PriceIdInput = z.string();
+const EncodingType = z.enum(["hex", "base64"]);
+const BinaryUpdate = z
+  .object({ data: z.array(z.string()), encoding: EncodingType })
+  .passthrough();
+const RpcPrice = z
+  .object({
+    conf: z.string(),
+    expo: z.number().int(),
+    price: z.string(),
+    publish_time: z.number().int(),
+  })
+  .passthrough();
+const RpcPriceFeedMetadataV2 = z
+  .object({
+    prev_publish_time: z.number().int().nullable(),
+    proof_available_time: z.number().int().nullable(),
+    slot: z.number().int().gte(0).nullable(),
+  })
+  .partial()
+  .passthrough();
+const ParsedPriceUpdate = z
+  .object({
+    ema_price: RpcPrice,
+    id: RpcPriceIdentifier,
+    metadata: RpcPriceFeedMetadataV2,
+    price: RpcPrice,
+  })
+  .passthrough();
+const PriceUpdate = z
+  .object({
+    binary: BinaryUpdate,
+    parsed: z.array(ParsedPriceUpdate).nullish(),
+  })
+  .passthrough();
+const ParsedPublisherStakeCap = z
+  .object({ cap: z.number().int().gte(0), publisher: z.string() })
+  .passthrough();
+const ParsedPublisherStakeCapsUpdate = z
+  .object({ publisher_stake_caps: z.array(ParsedPublisherStakeCap) })
+  .passthrough();
+const LatestPublisherStakeCapsUpdateDataResponse = z
+  .object({
+    binary: BinaryUpdate,
+    parsed: z.array(ParsedPublisherStakeCapsUpdate).nullish(),
+  })
+  .passthrough();
+const ParsedPriceFeedTwap = z
+  .object({
+    down_slots_ratio: z.string(),
+    end_timestamp: z.number().int(),
+    id: RpcPriceIdentifier,
+    start_timestamp: z.number().int(),
+    twap: RpcPrice,
+  })
+  .passthrough();
+const TwapsResponse = z
+  .object({
+    binary: BinaryUpdate,
+    parsed: z.array(ParsedPriceFeedTwap).nullish(),
+  })
+  .passthrough();
+
+export const schemas = {
+  AssetType,
+  asset_type,
+  RpcPriceIdentifier,
+  PriceFeedMetadata,
+  PriceIdInput,
+  EncodingType,
+  BinaryUpdate,
+  RpcPrice,
+  RpcPriceFeedMetadataV2,
+  ParsedPriceUpdate,
+  PriceUpdate,
+  ParsedPublisherStakeCap,
+  ParsedPublisherStakeCapsUpdate,
+  LatestPublisherStakeCapsUpdateDataResponse,
+  ParsedPriceFeedTwap,
+  TwapsResponse,
+};
+
+const endpoints = makeApi([
+  {
+    method: "get",
+    path: "/v2/price_feeds",
+    alias: "price_feeds_metadata",
+    description: `Get the set of price feeds.
+
+This endpoint fetches all price feeds from the Pyth network. It can be filtered by asset type
+and query string.`,
+    requestFormat: "json",
+    parameters: [
+      {
+        name: "query",
+        type: "Query",
+        schema: z.string().nullish(),
+      },
+      {
+        name: "asset_type",
+        type: "Query",
+        schema: asset_type,
+      },
+    ],
+    response: z.array(PriceFeedMetadata),
+  },
+  {
+    method: "get",
+    path: "/v2/updates/price/:publish_time",
+    alias: "timestamp_price_updates",
+    description: `Get the latest price updates by price feed id.
+
+Given a collection of price feed ids, retrieve the latest Pyth price for each price feed.`,
+    requestFormat: "json",
+    parameters: [
+      {
+        name: "publish_time",
+        type: "Path",
+        schema: z.number().int(),
+      },
+      {
+        name: "ids[]",
+        type: "Query",
+        schema: z.array(PriceIdInput),
+      },
+      {
+        name: "encoding",
+        type: "Query",
+        schema: z.enum(["hex", "base64"]).optional(),
+      },
+      {
+        name: "parsed",
+        type: "Query",
+        schema: z.boolean().optional(),
+      },
+      {
+        name: "ignore_invalid_price_ids",
+        type: "Query",
+        schema: z.boolean().optional(),
+      },
+    ],
+    response: PriceUpdate,
+    errors: [
+      {
+        status: 404,
+        description: `Price ids not found`,
+        schema: z.void(),
+      },
+    ],
+  },
+  {
+    method: "get",
+    path: "/v2/updates/price/latest",
+    alias: "latest_price_updates",
+    description: `Get the latest price updates by price feed id.
+
+Given a collection of price feed ids, retrieve the latest Pyth price for each price feed.`,
+    requestFormat: "json",
+    parameters: [
+      {
+        name: "ids[]",
+        type: "Query",
+        schema: z.array(PriceIdInput),
+      },
+      {
+        name: "encoding",
+        type: "Query",
+        schema: z.enum(["hex", "base64"]).optional(),
+      },
+      {
+        name: "parsed",
+        type: "Query",
+        schema: z.boolean().optional(),
+      },
+      {
+        name: "ignore_invalid_price_ids",
+        type: "Query",
+        schema: z.boolean().optional(),
+      },
+    ],
+    response: PriceUpdate,
+    errors: [
+      {
+        status: 404,
+        description: `Price ids not found`,
+        schema: z.void(),
+      },
+    ],
+  },
+  {
+    method: "get",
+    path: "/v2/updates/price/stream",
+    alias: "price_stream_sse_handler",
+    description: `SSE route handler for streaming price updates.
+
+The connection will automatically close after 24 hours to prevent resource leaks.
+Clients should implement reconnection logic to maintain continuous price updates.`,
+    requestFormat: "json",
+    parameters: [
+      {
+        name: "ids[]",
+        type: "Query",
+        schema: z.array(PriceIdInput),
+      },
+      {
+        name: "encoding",
+        type: "Query",
+        schema: z.enum(["hex", "base64"]).optional(),
+      },
+      {
+        name: "parsed",
+        type: "Query",
+        schema: z.boolean().optional(),
+      },
+      {
+        name: "allow_unordered",
+        type: "Query",
+        schema: z.boolean().optional(),
+      },
+      {
+        name: "benchmarks_only",
+        type: "Query",
+        schema: z.boolean().optional(),
+      },
+      {
+        name: "ignore_invalid_price_ids",
+        type: "Query",
+        schema: z.boolean().optional(),
+      },
+    ],
+    response: PriceUpdate,
+    errors: [
+      {
+        status: 404,
+        description: `Price ids not found`,
+        schema: z.void(),
+      },
+    ],
+  },
+  {
+    method: "get",
+    path: "/v2/updates/publisher_stake_caps/latest",
+    alias: "latest_publisher_stake_caps",
+    description: `Get the most recent publisher stake caps update data.`,
+    requestFormat: "json",
+    parameters: [
+      {
+        name: "encoding",
+        type: "Query",
+        schema: z.enum(["hex", "base64"]).optional(),
+      },
+      {
+        name: "parsed",
+        type: "Query",
+        schema: z.boolean().optional(),
+      },
+    ],
+    response: LatestPublisherStakeCapsUpdateDataResponse,
+  },
+  {
+    method: "get",
+    path: "/v2/updates/twap/:window_seconds/latest",
+    alias: "latest_twaps",
+    description: `Get the latest TWAP by price feed id with a custom time window.
+
+Given a collection of price feed ids, retrieve the latest Pyth TWAP price for each price feed.`,
+    requestFormat: "json",
+    parameters: [
+      {
+        name: "window_seconds",
+        type: "Path",
+        schema: z.number().int().gte(0),
+      },
+      {
+        name: "ids[]",
+        type: "Query",
+        schema: z.array(PriceIdInput),
+      },
+      {
+        name: "encoding",
+        type: "Query",
+        schema: z.enum(["hex", "base64"]).optional(),
+      },
+      {
+        name: "parsed",
+        type: "Query",
+        schema: z.boolean().optional(),
+      },
+      {
+        name: "ignore_invalid_price_ids",
+        type: "Query",
+        schema: z.boolean().optional(),
+      },
+    ],
+    response: TwapsResponse,
+    errors: [
+      {
+        status: 404,
+        description: `Price ids not found`,
+        schema: z.void(),
+      },
+    ],
+  },
+]);
+
+export const api = new Zodios(endpoints);
+
+export function createApiClient(baseUrl: string, options?: ZodiosOptions) {
+  return new Zodios(baseUrl, endpoints, options);
+}

+ 222 - 59
pnpm-lock.yaml

@@ -819,6 +819,9 @@ importers:
         specifier: ^3.23.8
         version: 3.24.2
     devDependencies:
+      '@cprussin/eslint-config':
+        specifier: 'catalog:'
+        version: 4.0.2(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.30)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@20.17.30)(typescript@5.9.3)))(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@20.17.30)(typescript@5.9.3))(turbo@2.5.8)(typescript@5.9.3)
       '@types/jest':
         specifier: ^29.4.0
         version: 29.5.14
@@ -828,15 +831,9 @@ importers:
       '@types/yargs':
         specifier: ^17.0.10
         version: 17.0.33
-      '@typescript-eslint/eslint-plugin':
-        specifier: ^5.21.0
-        version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.9.3))(eslint@8.56.0)(typescript@5.9.3)
-      '@typescript-eslint/parser':
-        specifier: ^5.21.0
-        version: 5.62.0(eslint@8.56.0)(typescript@5.9.3)
       eslint:
-        specifier: ^8.14.0
-        version: 8.56.0
+        specifier: 'catalog:'
+        version: 9.23.0(jiti@2.4.2)
       jest:
         specifier: ^29.4.0
         version: 29.7.0(@types/node@20.17.30)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@20.17.30)(typescript@5.9.3))
@@ -2232,21 +2229,18 @@ importers:
         specifier: ^5.2.1
         version: 5.2.1
     devDependencies:
+      '@cprussin/eslint-config':
+        specifier: 'catalog:'
+        version: 4.0.2(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(jest@29.7.0(@types/node@16.18.126)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@16.18.126)(typescript@5.9.3)))(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@16.18.126)(typescript@5.9.3))(turbo@2.5.8)(typescript@5.9.3)
       '@types/bn.js':
         specifier: ^5.1.5
         version: 5.1.6
       '@types/jest':
         specifier: ^29.4.0
         version: 29.5.14
-      '@typescript-eslint/eslint-plugin':
-        specifier: ^5.20.0
-        version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.9.3))(eslint@8.56.0)(typescript@5.9.3)
-      '@typescript-eslint/parser':
-        specifier: ^5.20.0
-        version: 5.62.0(eslint@8.56.0)(typescript@5.9.3)
       eslint:
-        specifier: ^8.13.0
-        version: 8.56.0
+        specifier: 'catalog:'
+        version: 9.23.0(jiti@2.4.2)
       jest:
         specifier: ^29.4.0
         version: 29.7.0(@types/node@16.18.126)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@16.18.126)(typescript@5.9.3))
@@ -2829,6 +2823,9 @@ importers:
         specifier: ^2.2.7
         version: 2.2.7
     devDependencies:
+      '@cprussin/eslint-config':
+        specifier: 'catalog:'
+        version: 4.0.2(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@22.14.0)(typescript@5.9.3)))(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@22.14.0)(typescript@5.9.3))(turbo@2.5.8)(typescript@5.9.3)
       '@solana/wallet-adapter-react':
         specifier: ^0.15.28
         version: 0.15.36(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(react-native@0.78.2(@babel/core@7.27.1)(@babel/preset-env@7.26.9(@babel/core@7.27.1))(@types/react@19.1.0)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10))(react@19.1.0)
@@ -2838,15 +2835,9 @@ importers:
       '@types/node':
         specifier: ^22.5.1
         version: 22.14.0
-      '@typescript-eslint/eslint-plugin':
-        specifier: ^5.20.0
-        version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.9.3))(eslint@8.56.0)(typescript@5.9.3)
-      '@typescript-eslint/parser':
-        specifier: ^5.20.0
-        version: 5.62.0(eslint@8.56.0)(typescript@5.9.3)
       eslint:
-        specifier: ^8.13.0
-        version: 8.56.0
+        specifier: 'catalog:'
+        version: 9.23.0(jiti@2.4.2)
       jest:
         specifier: ^29.4.0
         version: 29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@22.14.0)(typescript@5.9.3))
@@ -2862,18 +2853,15 @@ importers:
 
   target_chains/starknet/sdk/js:
     devDependencies:
+      '@cprussin/eslint-config':
+        specifier: 'catalog:'
+        version: 4.0.2(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(jest@29.7.0(@types/node@18.19.86)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.86)(typescript@5.9.3)))(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.86)(typescript@5.9.3))(turbo@2.5.8)(typescript@5.9.3)
       '@types/node':
         specifier: ^18.11.18
         version: 18.19.86
-      '@typescript-eslint/eslint-plugin':
-        specifier: ^5.21.0
-        version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.9.3))(eslint@8.56.0)(typescript@5.9.3)
-      '@typescript-eslint/parser':
-        specifier: ^5.21.0
-        version: 5.62.0(eslint@8.56.0)(typescript@5.9.3)
       eslint:
-        specifier: ^8.14.0
-        version: 8.56.0
+        specifier: 'catalog:'
+        version: 9.23.0(jiti@2.4.2)
       jest:
         specifier: ^29.4.1
         version: 29.7.0(@types/node@18.19.86)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.86)(typescript@5.9.3))
@@ -3121,6 +3109,9 @@ importers:
 
   target_chains/ton/sdk/js:
     devDependencies:
+      '@cprussin/eslint-config':
+        specifier: 'catalog:'
+        version: 4.0.2(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(jest@29.7.0(@types/node@18.19.86)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.86)(typescript@5.9.3)))(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.86)(typescript@5.9.3))(turbo@2.5.8)(typescript@5.9.3)
       '@ton/core':
         specifier: ^0.59.0
         version: 0.59.1(@ton/crypto@3.3.0)
@@ -3133,15 +3124,9 @@ importers:
       '@types/node':
         specifier: ^18.11.18
         version: 18.19.86
-      '@typescript-eslint/eslint-plugin':
-        specifier: ^5.21.0
-        version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@5.9.3))(eslint@8.56.0)(typescript@5.9.3)
-      '@typescript-eslint/parser':
-        specifier: ^5.21.0
-        version: 5.62.0(eslint@8.56.0)(typescript@5.9.3)
       eslint:
-        specifier: ^8.14.0
-        version: 8.56.0
+        specifier: 'catalog:'
+        version: 9.23.0(jiti@2.4.2)
       jest:
         specifier: ^29.4.1
         version: 29.7.0(@types/node@18.19.86)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.86)(typescript@5.9.3))
@@ -25107,6 +25092,43 @@ snapshots:
       - turbo
       - typescript
 
+  '@cprussin/eslint-config@4.0.2(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(jest@29.7.0(@types/node@16.18.126)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@16.18.126)(typescript@5.9.3)))(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@16.18.126)(typescript@5.9.3))(turbo@2.5.8)(typescript@5.9.3)':
+    dependencies:
+      '@eslint/eslintrc': 3.3.1
+      '@eslint/js': 9.23.0
+      '@next/eslint-plugin-next': 15.2.4
+      eslint: 9.23.0(jiti@2.4.2)
+      eslint-config-prettier: 10.1.1(eslint@9.23.0(jiti@2.4.2))
+      eslint-config-turbo: 2.4.4(eslint@9.23.0(jiti@2.4.2))(turbo@2.5.8)
+      eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))
+      eslint-plugin-jest: 28.11.0(@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(jest@29.7.0(@types/node@16.18.126)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@16.18.126)(typescript@5.9.3)))(typescript@5.9.3)
+      eslint-plugin-jest-dom: 5.5.0(@testing-library/dom@10.4.0)(eslint@9.23.0(jiti@2.4.2))
+      eslint-plugin-jsonc: 2.20.0(eslint@9.23.0(jiti@2.4.2))
+      eslint-plugin-jsx-a11y: 6.10.2(eslint@9.23.0(jiti@2.4.2))
+      eslint-plugin-n: 17.17.0(eslint@9.23.0(jiti@2.4.2))
+      eslint-plugin-react: 7.37.4(eslint@9.23.0(jiti@2.4.2))
+      eslint-plugin-react-hooks: 5.2.0(eslint@9.23.0(jiti@2.4.2))
+      eslint-plugin-storybook: 0.11.6(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3)
+      eslint-plugin-tailwindcss: 3.18.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@16.18.126)(typescript@5.9.3)))
+      eslint-plugin-testing-library: 7.1.1(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3)
+      eslint-plugin-tsdoc: 0.4.0
+      eslint-plugin-unicorn: 57.0.0(eslint@9.23.0(jiti@2.4.2))
+      globals: 16.0.0
+      tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@16.18.126)(typescript@5.9.3))
+      typescript-eslint: 8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3)
+    transitivePeerDependencies:
+      - '@eslint/json'
+      - '@testing-library/dom'
+      - '@typescript-eslint/eslint-plugin'
+      - '@typescript-eslint/parser'
+      - eslint-import-resolver-typescript
+      - eslint-import-resolver-webpack
+      - jest
+      - supports-color
+      - ts-node
+      - turbo
+      - typescript
+
   '@cprussin/eslint-config@4.0.2(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(jest@29.7.0(@types/node@18.19.86)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.86)(typescript@5.9.3)))(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.86)(typescript@5.9.3))(turbo@2.5.8)(typescript@5.9.3)':
     dependencies:
       '@eslint/eslintrc': 3.3.1
@@ -25144,6 +25166,43 @@ snapshots:
       - turbo
       - typescript
 
+  '@cprussin/eslint-config@4.0.2(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.30)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@20.17.30)(typescript@5.9.3)))(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@20.17.30)(typescript@5.9.3))(turbo@2.5.8)(typescript@5.9.3)':
+    dependencies:
+      '@eslint/eslintrc': 3.3.1
+      '@eslint/js': 9.23.0
+      '@next/eslint-plugin-next': 15.2.4
+      eslint: 9.23.0(jiti@2.4.2)
+      eslint-config-prettier: 10.1.1(eslint@9.23.0(jiti@2.4.2))
+      eslint-config-turbo: 2.4.4(eslint@9.23.0(jiti@2.4.2))(turbo@2.5.8)
+      eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))
+      eslint-plugin-jest: 28.11.0(@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.30)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@20.17.30)(typescript@5.9.3)))(typescript@5.9.3)
+      eslint-plugin-jest-dom: 5.5.0(@testing-library/dom@10.4.0)(eslint@9.23.0(jiti@2.4.2))
+      eslint-plugin-jsonc: 2.20.0(eslint@9.23.0(jiti@2.4.2))
+      eslint-plugin-jsx-a11y: 6.10.2(eslint@9.23.0(jiti@2.4.2))
+      eslint-plugin-n: 17.17.0(eslint@9.23.0(jiti@2.4.2))
+      eslint-plugin-react: 7.37.4(eslint@9.23.0(jiti@2.4.2))
+      eslint-plugin-react-hooks: 5.2.0(eslint@9.23.0(jiti@2.4.2))
+      eslint-plugin-storybook: 0.11.6(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3)
+      eslint-plugin-tailwindcss: 3.18.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@20.17.30)(typescript@5.9.3)))
+      eslint-plugin-testing-library: 7.1.1(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3)
+      eslint-plugin-tsdoc: 0.4.0
+      eslint-plugin-unicorn: 57.0.0(eslint@9.23.0(jiti@2.4.2))
+      globals: 16.0.0
+      tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@20.17.30)(typescript@5.9.3))
+      typescript-eslint: 8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3)
+    transitivePeerDependencies:
+      - '@eslint/json'
+      - '@testing-library/dom'
+      - '@typescript-eslint/eslint-plugin'
+      - '@typescript-eslint/parser'
+      - eslint-import-resolver-typescript
+      - eslint-import-resolver-webpack
+      - jest
+      - supports-color
+      - ts-node
+      - turbo
+      - typescript
+
   '@cprussin/eslint-config@4.0.2(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@22.14.0)(typescript@5.9.3)))(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@22.14.0)(typescript@5.9.3))(turbo@2.5.8)(typescript@5.9.3)':
     dependencies:
       '@eslint/eslintrc': 3.3.1
@@ -31581,7 +31640,7 @@ snapshots:
 
   '@rollup/pluginutils@5.1.4(rollup@4.52.5)':
     dependencies:
-      '@types/estree': 1.0.7
+      '@types/estree': 1.0.8
       estree-walker: 2.0.2
       picomatch: 4.0.3
     optionalDependencies:
@@ -35300,16 +35359,16 @@ snapshots:
   '@types/eslint-scope@3.7.7':
     dependencies:
       '@types/eslint': 9.6.1
-      '@types/estree': 1.0.7
+      '@types/estree': 1.0.8
 
   '@types/eslint@9.6.1':
     dependencies:
-      '@types/estree': 1.0.7
+      '@types/estree': 1.0.8
       '@types/json-schema': 7.0.15
 
   '@types/estree-jsx@1.0.5':
     dependencies:
-      '@types/estree': 1.0.7
+      '@types/estree': 1.0.8
 
   '@types/estree@1.0.7': {}
 
@@ -40323,6 +40382,17 @@ snapshots:
       - supports-color
       - typescript
 
+  eslint-plugin-jest@28.11.0(@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(jest@29.7.0(@types/node@16.18.126)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@16.18.126)(typescript@5.9.3)))(typescript@5.9.3):
+    dependencies:
+      '@typescript-eslint/utils': 8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3)
+      eslint: 9.23.0(jiti@2.4.2)
+    optionalDependencies:
+      '@typescript-eslint/eslint-plugin': 8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3)
+      jest: 29.7.0(@types/node@16.18.126)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@16.18.126)(typescript@5.9.3))
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+
   eslint-plugin-jest@28.11.0(@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(jest@29.7.0(@types/node@18.19.86)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.86)(typescript@5.9.3)))(typescript@5.9.3):
     dependencies:
       '@typescript-eslint/utils': 8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3)
@@ -40334,6 +40404,17 @@ snapshots:
       - supports-color
       - typescript
 
+  eslint-plugin-jest@28.11.0(@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(jest@29.7.0(@types/node@20.17.30)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@20.17.30)(typescript@5.9.3)))(typescript@5.9.3):
+    dependencies:
+      '@typescript-eslint/utils': 8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3)
+      eslint: 9.23.0(jiti@2.4.2)
+    optionalDependencies:
+      '@typescript-eslint/eslint-plugin': 8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3)
+      jest: 29.7.0(@types/node@20.17.30)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@20.17.30)(typescript@5.9.3))
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+
   eslint-plugin-jest@28.11.0(@typescript-eslint/eslint-plugin@8.29.0(@typescript-eslint/parser@8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3))(eslint@9.23.0(jiti@2.4.2))(jest@29.7.0(@types/node@22.14.0)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@22.14.0)(typescript@5.9.3)))(typescript@5.9.3):
     dependencies:
       '@typescript-eslint/utils': 8.29.0(eslint@9.23.0(jiti@2.4.2))(typescript@5.9.3)
@@ -40471,12 +40552,24 @@ snapshots:
       - supports-color
       - typescript
 
+  eslint-plugin-tailwindcss@3.18.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@16.18.126)(typescript@5.9.3))):
+    dependencies:
+      fast-glob: 3.3.3
+      postcss: 8.5.3
+      tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@16.18.126)(typescript@5.9.3))
+
   eslint-plugin-tailwindcss@3.18.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.86)(typescript@5.9.3))):
     dependencies:
       fast-glob: 3.3.3
       postcss: 8.5.3
       tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.86)(typescript@5.9.3))
 
+  eslint-plugin-tailwindcss@3.18.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@20.17.30)(typescript@5.9.3))):
+    dependencies:
+      fast-glob: 3.3.3
+      postcss: 8.5.3
+      tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@20.17.30)(typescript@5.9.3))
+
   eslint-plugin-tailwindcss@3.18.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@22.14.0)(typescript@5.9.3))):
     dependencies:
       fast-glob: 3.3.3
@@ -40598,7 +40691,7 @@ snapshots:
       '@humanfs/node': 0.16.6
       '@humanwhocodes/module-importer': 1.0.1
       '@humanwhocodes/retry': 0.4.2
-      '@types/estree': 1.0.7
+      '@types/estree': 1.0.8
       '@types/json-schema': 7.0.15
       ajv: 6.12.6
       chalk: 4.1.2
@@ -40662,7 +40755,7 @@ snapshots:
 
   estree-util-attach-comments@3.0.0:
     dependencies:
-      '@types/estree': 1.0.7
+      '@types/estree': 1.0.8
 
   estree-util-build-jsx@3.0.1:
     dependencies:
@@ -40675,7 +40768,7 @@ snapshots:
 
   estree-util-scope@1.0.0:
     dependencies:
-      '@types/estree': 1.0.7
+      '@types/estree': 1.0.8
       devlop: 1.1.0
 
   estree-util-to-js@2.0.0:
@@ -40697,7 +40790,7 @@ snapshots:
 
   estree-walker@3.0.3:
     dependencies:
-      '@types/estree': 1.0.7
+      '@types/estree': 1.0.8
 
   esutils@2.0.3: {}
 
@@ -45209,7 +45302,7 @@ snapshots:
 
   micromark-extension-mdx-expression@3.0.1:
     dependencies:
-      '@types/estree': 1.0.7
+      '@types/estree': 1.0.8
       devlop: 1.1.0
       micromark-factory-mdx-expression: 2.0.3
       micromark-factory-space: 2.0.1
@@ -45220,7 +45313,7 @@ snapshots:
 
   micromark-extension-mdx-jsx@3.0.2:
     dependencies:
-      '@types/estree': 1.0.7
+      '@types/estree': 1.0.8
       devlop: 1.1.0
       estree-util-is-identifier-name: 3.0.0
       micromark-factory-mdx-expression: 2.0.3
@@ -45237,7 +45330,7 @@ snapshots:
 
   micromark-extension-mdxjs-esm@3.0.0:
     dependencies:
-      '@types/estree': 1.0.7
+      '@types/estree': 1.0.8
       devlop: 1.1.0
       micromark-core-commonmark: 2.0.3
       micromark-util-character: 2.1.1
@@ -45273,7 +45366,7 @@ snapshots:
 
   micromark-factory-mdx-expression@2.0.3:
     dependencies:
-      '@types/estree': 1.0.7
+      '@types/estree': 1.0.8
       devlop: 1.1.0
       micromark-factory-space: 2.0.1
       micromark-util-character: 2.1.1
@@ -45337,7 +45430,7 @@ snapshots:
 
   micromark-util-events-to-acorn@2.0.3:
     dependencies:
-      '@types/estree': 1.0.7
+      '@types/estree': 1.0.8
       '@types/unist': 3.0.3
       devlop: 1.1.0
       estree-util-visit: 2.0.0
@@ -46595,6 +46688,14 @@ snapshots:
       camelcase-css: 2.0.1
       postcss: 8.5.3
 
+  postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@16.18.126)(typescript@5.9.3)):
+    dependencies:
+      lilconfig: 3.1.3
+      yaml: 2.7.1
+    optionalDependencies:
+      postcss: 8.5.3
+      ts-node: 10.9.2(@swc/core@1.13.5)(@types/node@16.18.126)(typescript@5.9.3)
+
   postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.86)(typescript@5.9.3)):
     dependencies:
       lilconfig: 3.1.3
@@ -46603,6 +46704,14 @@ snapshots:
       postcss: 8.5.3
       ts-node: 10.9.2(@swc/core@1.13.5)(@types/node@18.19.86)(typescript@5.9.3)
 
+  postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@20.17.30)(typescript@5.9.3)):
+    dependencies:
+      lilconfig: 3.1.3
+      yaml: 2.7.1
+    optionalDependencies:
+      postcss: 8.5.3
+      ts-node: 10.9.2(@swc/core@1.13.5)(@types/node@20.17.30)(typescript@5.9.3)
+
   postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@22.14.0)(typescript@5.9.3)):
     dependencies:
       lilconfig: 3.1.3
@@ -47587,7 +47696,7 @@ snapshots:
 
   recma-build-jsx@1.0.0:
     dependencies:
-      '@types/estree': 1.0.7
+      '@types/estree': 1.0.8
       estree-util-build-jsx: 3.0.1
       vfile: 6.0.3
 
@@ -47603,14 +47712,14 @@ snapshots:
 
   recma-parse@1.0.0:
     dependencies:
-      '@types/estree': 1.0.7
+      '@types/estree': 1.0.8
       esast-util-from-js: 2.0.1
       unified: 11.0.5
       vfile: 6.0.3
 
   recma-stringify@1.0.0:
     dependencies:
-      '@types/estree': 1.0.7
+      '@types/estree': 1.0.8
       estree-util-to-js: 2.0.0
       unified: 11.0.5
       vfile: 6.0.3
@@ -47723,7 +47832,7 @@ snapshots:
 
   rehype-recma@1.0.0:
     dependencies:
-      '@types/estree': 1.0.7
+      '@types/estree': 1.0.8
       '@types/hast': 3.0.4
       hast-util-to-estree: 3.1.3
     transitivePeerDependencies:
@@ -49177,6 +49286,33 @@ snapshots:
     dependencies:
       tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@22.14.0)(typescript@5.9.3))
 
+  tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@16.18.126)(typescript@5.9.3)):
+    dependencies:
+      '@alloc/quick-lru': 5.2.0
+      arg: 5.0.2
+      chokidar: 3.6.0
+      didyoumean: 1.2.2
+      dlv: 1.1.3
+      fast-glob: 3.3.3
+      glob-parent: 6.0.2
+      is-glob: 4.0.3
+      jiti: 1.21.7
+      lilconfig: 3.1.3
+      micromatch: 4.0.8
+      normalize-path: 3.0.0
+      object-hash: 3.0.0
+      picocolors: 1.1.1
+      postcss: 8.5.3
+      postcss-import: 15.1.0(postcss@8.5.3)
+      postcss-js: 4.0.1(postcss@8.5.3)
+      postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@16.18.126)(typescript@5.9.3))
+      postcss-nested: 6.2.0(postcss@8.5.3)
+      postcss-selector-parser: 6.1.2
+      resolve: 1.22.10
+      sucrase: 3.35.0
+    transitivePeerDependencies:
+      - ts-node
+
   tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@18.19.86)(typescript@5.9.3)):
     dependencies:
       '@alloc/quick-lru': 5.2.0
@@ -49204,6 +49340,33 @@ snapshots:
     transitivePeerDependencies:
       - ts-node
 
+  tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@20.17.30)(typescript@5.9.3)):
+    dependencies:
+      '@alloc/quick-lru': 5.2.0
+      arg: 5.0.2
+      chokidar: 3.6.0
+      didyoumean: 1.2.2
+      dlv: 1.1.3
+      fast-glob: 3.3.3
+      glob-parent: 6.0.2
+      is-glob: 4.0.3
+      jiti: 1.21.7
+      lilconfig: 3.1.3
+      micromatch: 4.0.8
+      normalize-path: 3.0.0
+      object-hash: 3.0.0
+      picocolors: 1.1.1
+      postcss: 8.5.3
+      postcss-import: 15.1.0(postcss@8.5.3)
+      postcss-js: 4.0.1(postcss@8.5.3)
+      postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@20.17.30)(typescript@5.9.3))
+      postcss-nested: 6.2.0(postcss@8.5.3)
+      postcss-selector-parser: 6.1.2
+      resolve: 1.22.10
+      sucrase: 3.35.0
+    transitivePeerDependencies:
+      - ts-node
+
   tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.13.5)(@types/node@22.14.0)(typescript@5.9.3)):
     dependencies:
       '@alloc/quick-lru': 5.2.0
@@ -51516,7 +51679,7 @@ snapshots:
   webpack@5.98.0:
     dependencies:
       '@types/eslint-scope': 3.7.7
-      '@types/estree': 1.0.7
+      '@types/estree': 1.0.8
       '@webassemblyjs/ast': 1.14.1
       '@webassemblyjs/wasm-edit': 1.14.1
       '@webassemblyjs/wasm-parser': 1.14.1
@@ -51546,7 +51709,7 @@ snapshots:
   webpack@5.98.0(@swc/core@1.13.5)(esbuild@0.25.9):
     dependencies:
       '@types/eslint-scope': 3.7.7
-      '@types/estree': 1.0.7
+      '@types/estree': 1.0.8
       '@webassemblyjs/ast': 1.14.1
       '@webassemblyjs/wasm-edit': 1.14.1
       '@webassemblyjs/wasm-parser': 1.14.1

+ 1 - 1
price_service/client/js/.eslintrc.js

@@ -1,4 +1,4 @@
-module.exports = {
+export default {
   root: true,
   parser: "@typescript-eslint/parser",
   plugins: ["@typescript-eslint"],

+ 1 - 1
price_service/sdk/js/.eslintignore

@@ -1,3 +1,3 @@
 node_modules/
-lib/
+dist/
 **/schemas

+ 0 - 9
price_service/sdk/js/.eslintrc.js

@@ -1,9 +0,0 @@
-module.exports = {
-  root: true,
-  parser: "@typescript-eslint/parser",
-  plugins: ["@typescript-eslint"],
-  extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
-  rules: {
-    "@typescript-eslint/no-explicit-any": "off",
-  },
-};

+ 4 - 0
price_service/sdk/js/eslint.config.js

@@ -0,0 +1,4 @@
+import { base } from "@cprussin/eslint-config";
+import { globalIgnores } from "eslint/config";
+
+export default [globalIgnores(["**/schemas/*"]), ...base];

+ 2 - 3
price_service/sdk/js/package.json

@@ -34,11 +34,10 @@
   ],
   "license": "Apache-2.0",
   "devDependencies": {
+    "@cprussin/eslint-config": "catalog:",
     "@types/bn.js": "^5.1.5",
     "@types/jest": "^29.4.0",
-    "@typescript-eslint/eslint-plugin": "^5.20.0",
-    "@typescript-eslint/parser": "^5.20.0",
-    "eslint": "^8.13.0",
+    "eslint": "catalog:",
     "jest": "^29.4.0",
     "prettier": "catalog:",
     "quicktype": "^23.0.76",

+ 2 - 2
price_service/sdk/js/src/AccumulatorUpdateData.ts

@@ -35,7 +35,7 @@ export type TwapMessage = {
 
 export function isAccumulatorUpdateData(updateBytes: Buffer): boolean {
   return (
-    updateBytes.toString("hex").slice(0, 8) === ACCUMULATOR_MAGIC &&
+    updateBytes.toString("hex").startsWith(ACCUMULATOR_MAGIC) &&
     updateBytes[4] === MAJOR_VERSION &&
     updateBytes[5] === MINOR_VERSION
   );
@@ -199,7 +199,7 @@ export function parseAccumulatorUpdateData(
     const proof = [];
     for (let j = 0; j < numProofs; j++) {
       proof.push(
-        Array.from(data.subarray(cursor, cursor + KECCAK160_HASH_SIZE)),
+        [...data.subarray(cursor, cursor + KECCAK160_HASH_SIZE)],
       );
       cursor += KECCAK160_HASH_SIZE;
     }

+ 4 - 4
price_service/sdk/js/src/__tests__/AccumulatorUpdateData.test.ts

@@ -61,8 +61,8 @@ describe("Test parse accumulator update", () => {
           2,
           1,
         ),
-      ).updates.length,
-    ).toBe(0);
+      ).updates,
+    ).toHaveLength(0);
 
     expect(
       parseAccumulatorUpdateData(
@@ -71,8 +71,8 @@ describe("Test parse accumulator update", () => {
           0,
           5,
         ),
-      ).updates.length,
-    ).toBe(3);
+      ).updates,
+    ).toHaveLength(3);
 
     // eslint-disable-next-line @typescript-eslint/no-unused-vars
     const { vaa, updates } = parseAccumulatorUpdateData(

+ 2 - 2
price_service/sdk/js/src/__tests__/PriceFeed.test.ts

@@ -40,7 +40,7 @@ test("Parsing Price Feed works as expected", () => {
   });
   expect(priceFeed.getEmaPriceUnchecked()).toStrictEqual(expectedEmaPrice);
 
-  jest.setSystemTime(20000);
+  jest.setSystemTime(20_000);
   expect(priceFeed.getPriceNoOlderThan(15)).toStrictEqual(expectedPrice);
   expect(priceFeed.getPriceNoOlderThan(5)).toBeUndefined();
   expect(priceFeed.getEmaPriceNoOlderThan(15)).toStrictEqual(expectedEmaPrice);
@@ -105,7 +105,7 @@ test("getVAA returns string as expected", () => {
 
   const priceFeed = PriceFeed.fromJson(data);
 
-  expect(priceFeed.getVAA()).toStrictEqual(
+  expect(priceFeed.getVAA()).toBe(
     "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef",
   );
 });

+ 9 - 7
price_service/sdk/js/src/index.ts

@@ -1,9 +1,11 @@
-import {
-  Convert,
-  type Price as JsonPrice,
-  type PriceFeed as JsonPriceFeed,
-  type PriceFeedMetadata as JsonPriceFeedMetadata,
+/* eslint-disable @typescript-eslint/no-unsafe-assignment */
+/* eslint-disable @typescript-eslint/no-explicit-any */
+import type {
+  Price as JsonPrice,
+  PriceFeed as JsonPriceFeed,
+  PriceFeedMetadata as JsonPriceFeedMetadata,
 } from "./schemas/PriceFeed.js";
+import { Convert } from "./schemas/PriceFeed.js";
 
 export type UnixTimestamp = number;
 export type DurationInSeconds = number;
@@ -267,7 +269,7 @@ export class PriceFeed {
    * applications that require a sufficiently-recent price. Returns `undefined` if the price
    * is not recent enough.
    *
-   * @param age return a price as long as it has been updated within this number of seconds
+   * @param age - return a price as long as it has been updated within this number of seconds
    * @returns a Price struct containing the price, confidence interval along with the exponent for
    * both numbers, and its publish time, or `undefined` if no price update occurred within `age` seconds of the current time.
    */
@@ -297,7 +299,7 @@ export class PriceFeed {
    * At the moment, the confidence interval returned by this method is computed in
    * a somewhat questionable way, so we do not recommend using it for high-value applications.
    *
-   * @param age return a price as long as it has been updated within this number of seconds
+   * @param age - return a price as long as it has been updated within this number of seconds
    * @returns a Price struct containing the EMA price, confidence interval along with the exponent for
    * both numbers, and its publish time, or `undefined` if no price update occurred within `age` seconds of the current time.
    */

+ 12 - 12
price_service/sdk/js/src/schemas/PriceFeed.ts

@@ -10,7 +10,7 @@
 /**
  * Represents an aggregate price from Pyth publisher feeds.
  */
-export interface PriceFeed {
+export type PriceFeed = {
   /**
    * Exponentially-weighted moving average Price
    */
@@ -40,7 +40,7 @@ export interface PriceFeed {
  *
  * Price
  */
-export interface Price {
+export type Price = {
   /**
    * Confidence interval around the price.
    */
@@ -64,7 +64,7 @@ export interface Price {
  *
  * Represents metadata of a price feed.
  */
-export interface PriceFeedMetadata {
+export type PriceFeedMetadata = {
   /**
    * Attestation time of the price
    */
@@ -121,13 +121,13 @@ export class Convert {
 
 function invalidValue(typ: any, val: any, key: any = ""): never {
   if (key) {
-    throw Error(
+    throw new Error(
       `Invalid value for key "${key}". Expected type ${JSON.stringify(
         typ,
       )} but got ${JSON.stringify(val)}`,
     );
   }
-  throw Error(
+  throw new Error(
     `Invalid value ${JSON.stringify(val)} for type ${JSON.stringify(typ)}`,
   );
 }
@@ -163,13 +163,13 @@ function transform(val: any, typ: any, getProps: any, key: any = ""): any {
       const typ = typs[i];
       try {
         return transform(val, typ, getProps);
-      } catch (_) {}
+      } catch {}
     }
     return invalidValue(typs, val);
   }
 
   function transformEnum(cases: string[], val: any): any {
-    if (cases.indexOf(val) !== -1) return val;
+    if (cases.includes(val)) return val;
     return invalidValue(cases, val);
   }
 
@@ -191,7 +191,7 @@ function transform(val: any, typ: any, getProps: any, key: any = ""): any {
   }
 
   function transformObject(
-    props: { [k: string]: any },
+    props: Record<string, any>,
     additional: any,
     val: any,
   ): any {
@@ -199,18 +199,18 @@ function transform(val: any, typ: any, getProps: any, key: any = ""): any {
       return invalidValue("object", val);
     }
     const result: any = {};
-    Object.getOwnPropertyNames(props).forEach((key) => {
+    for (const key of Object.getOwnPropertyNames(props)) {
       const prop = props[key];
       const v = Object.prototype.hasOwnProperty.call(val, key)
         ? val[key]
         : undefined;
       result[prop.key] = transform(v, prop.typ, getProps, prop.key);
-    });
-    Object.getOwnPropertyNames(val).forEach((key) => {
+    }
+    for (const key of Object.getOwnPropertyNames(val)) {
       if (!Object.prototype.hasOwnProperty.call(props, key)) {
         result[key] = transform(val[key], additional, getProps, key);
       }
-    });
+    }
     return result;
   }
 

+ 2 - 7
pythnet/message_buffer/tsconfig.build.json

@@ -5,10 +5,5 @@
     "incremental": false,
     "declaration": true
   },
-  "exclude": [
-    "node_modules",
-    "dist",
-    "examples/",
-    "**/__tests__/*"
-  ]
-}
+  "exclude": ["node_modules", "dist", "examples/", "**/__tests__/*"]
+}

+ 1 - 1
target_chains/ethereum/abi_generator/package.json

@@ -31,4 +31,4 @@
     "pnpm": ">=10.19.0"
   },
   "packageManager": "pnpm@10.19.0"
-}
+}

+ 1 - 1
target_chains/ethereum/sdk/stylus/pyth-mock-solidity/package.json

@@ -29,4 +29,4 @@
     "pnpm": ">=10.19.0"
   },
   "packageManager": "pnpm@10.19.0"
-}
+}

+ 0 - 10
target_chains/solana/sdk/js/solana_utils/.eslintrc.js

@@ -1,10 +0,0 @@
-module.exports = {
-  root: true,
-  parser: "@typescript-eslint/parser",
-  plugins: ["@typescript-eslint"],
-  extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
-  rules: {
-    "@typescript-eslint/no-explicit-any": "off",
-    "@typescript-eslint/ban-ts-comment": "off",
-  },
-};

+ 1 - 0
target_chains/solana/sdk/js/solana_utils/eslint.config.js

@@ -0,0 +1 @@
+export { base as default } from "@cprussin/eslint-config";

+ 2 - 3
target_chains/solana/sdk/js/solana_utils/package.json

@@ -34,12 +34,11 @@
   ],
   "license": "Apache-2.0",
   "devDependencies": {
+    "@cprussin/eslint-config": "catalog:",
     "@solana/wallet-adapter-react": "^0.15.28",
     "@types/jest": "^29.4.0",
     "@types/node": "^22.5.1",
-    "@typescript-eslint/eslint-plugin": "^5.20.0",
-    "@typescript-eslint/parser": "^5.20.0",
-    "eslint": "^8.13.0",
+    "eslint": "catalog:",
     "jest": "^29.4.0",
     "prettier": "catalog:",
     "quicktype": "^23.0.76",

+ 0 - 6
target_chains/starknet/sdk/js/.eslintrc.js

@@ -1,6 +0,0 @@
-module.exports = {
-  root: true,
-  parser: "@typescript-eslint/parser",
-  plugins: ["@typescript-eslint"],
-  extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
-};

+ 1 - 0
target_chains/starknet/sdk/js/eslint.config.js

@@ -0,0 +1 @@
+export { base as default } from "@cprussin/eslint-config";

+ 3 - 4
target_chains/starknet/sdk/js/package.json

@@ -37,10 +37,9 @@
   ],
   "license": "Apache-2.0",
   "devDependencies": {
+    "@cprussin/eslint-config": "catalog:",
     "@types/node": "^18.11.18",
-    "@typescript-eslint/eslint-plugin": "^5.21.0",
-    "@typescript-eslint/parser": "^5.21.0",
-    "eslint": "^8.14.0",
+    "eslint": "catalog:",
     "jest": "^29.4.1",
     "prettier": "catalog:",
     "ts-jest": "^29.0.5",
@@ -66,4 +65,4 @@
     "./package.json": "./package.json"
   },
   "module": "./dist/esm/index.js"
-}
+}

+ 1 - 1
target_chains/starknet/sdk/js/src/index.ts

@@ -59,6 +59,6 @@ export class ByteBuffer {
       }
       pos += 31;
     }
-    return new ByteBuffer(data.length == 0 ? 0 : 31, data);
+    return new ByteBuffer(data.length === 0 ? 0 : 31, data);
   }
 }

+ 0 - 6
target_chains/ton/sdk/js/.eslintrc.js

@@ -1,6 +0,0 @@
-module.exports = {
-  root: true,
-  parser: "@typescript-eslint/parser",
-  plugins: ["@typescript-eslint"],
-  extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
-};

+ 1 - 0
target_chains/ton/sdk/js/eslint.config.js

@@ -0,0 +1 @@
+export { base as default } from "@cprussin/eslint-config";

+ 3 - 4
target_chains/ton/sdk/js/package.json

@@ -36,13 +36,12 @@
   ],
   "license": "Apache-2.0",
   "devDependencies": {
+    "@cprussin/eslint-config": "catalog:",
     "@ton/core": "^0.59.0",
     "@ton/crypto": "^3.3.0",
     "@ton/ton": "^15.1.0",
     "@types/node": "^18.11.18",
-    "@typescript-eslint/eslint-plugin": "^5.21.0",
-    "@typescript-eslint/parser": "^5.21.0",
-    "eslint": "^8.14.0",
+    "eslint": "catalog:",
     "jest": "^29.4.1",
     "prettier": "catalog:",
     "ts-jest": "^29.0.5",
@@ -68,4 +67,4 @@
     "./package.json": "./package.json"
   },
   "module": "./dist/esm/index.js"
-}
+}

+ 9 - 9
target_chains/ton/sdk/js/src/index.ts

@@ -1,10 +1,10 @@
+/* eslint-disable @typescript-eslint/no-non-null-assertion */
+import type { Contract, Sender } from "@ton/core";
 import {
   Address,
   beginCell,
   Cell,
-  type Contract,
   Dictionary,
-  type Sender,
   SendMode,
   toNano,
 } from "@ton/core";
@@ -15,15 +15,15 @@ export const PYTH_CONTRACT_ADDRESS_MAINNET =
 export const PYTH_CONTRACT_ADDRESS_TESTNET =
   "EQB4ZnrI5qsP_IUJgVJNwEGKLzZWsQOFhiaqDbD7pTt_f9oU";
 // This is defined in target_chains/ton/contracts/common/gas.fc
-export const UPDATE_PRICE_FEEDS_BASE_GAS = 300000n;
-export const UPDATE_PRICE_FEEDS_PER_UPDATE_GAS = 90000n;
+export const UPDATE_PRICE_FEEDS_BASE_GAS = 300_000n;
+export const UPDATE_PRICE_FEEDS_PER_UPDATE_GAS = 90_000n;
 // Current settings in basechain are as follows: 1 unit of gas costs 400 nanotons
 export const GAS_PRICE_FACTOR = 400n;
 
-export interface DataSource {
+export type DataSource = {
   emitterChain: number;
   emitterAddress: string;
-}
+};
 
 export class PythContract implements Contract {
   constructor(
@@ -250,7 +250,7 @@ export class PythContract implements Contract {
 
 export function createCellChain(buffer: Buffer): Cell {
   const chunks = bufferToChunks(buffer, 127);
-  let lastCell: Cell | null = null;
+  let lastCell: Cell | undefined;
   // Iterate through chunks in reverse order
   for (let i = chunks.length - 1; i >= 0; i--) {
     const chunk = chunks[i]!;
@@ -305,10 +305,10 @@ export function parseDataSources(cell: Cell): DataSource[] {
   return dataSources;
 }
 
-export function parseDataSource(cell: Cell): DataSource | null {
+export function parseDataSource(cell: Cell): DataSource | null | undefined {
   const slice = cell.beginParse();
   if (slice.remainingBits === 0) {
-    return null;
+    return;
   }
   const emitterChain = slice.loadUint(16);
   const emitterAddress = slice.loadUintBig(256).toString(16).padStart(64, "0");