From 528aae25283f43f359baffef11430edb5e9ed491 Mon Sep 17 00:00:00 2001 From: Daniel Chew Date: Mon, 17 Mar 2025 16:33:56 +0700 Subject: [PATCH 01/18] add prom metrics --- apps/price_pusher/README.md | 88 +++ apps/price_pusher/alerts.yml | 47 ++ .../docker-compose.metrics.sample.yaml | 77 +++ apps/price_pusher/grafana-dashboard.json | 553 ++++++++++++++++++ apps/price_pusher/package.json | 3 + apps/price_pusher/prometheus.yml | 66 +++ apps/price_pusher/src/controller.ts | 71 ++- apps/price_pusher/src/evm/command.ts | 18 +- apps/price_pusher/src/index.ts | 3 + apps/price_pusher/src/metrics.ts | 133 +++++ apps/price_pusher/src/options.ts | 18 + pnpm-lock.yaml | 194 ++++-- 12 files changed, 1226 insertions(+), 45 deletions(-) create mode 100644 apps/price_pusher/alerts.yml create mode 100644 apps/price_pusher/docker-compose.metrics.sample.yaml create mode 100644 apps/price_pusher/grafana-dashboard.json create mode 100644 apps/price_pusher/prometheus.yml create mode 100644 apps/price_pusher/src/metrics.ts diff --git a/apps/price_pusher/README.md b/apps/price_pusher/README.md index 76256c41ce..7923ce76a7 100644 --- a/apps/price_pusher/README.md +++ b/apps/price_pusher/README.md @@ -259,3 +259,91 @@ pushed twice and you won't pay additional costs most of the time.** However, the conditions in the RPCs because they are often behind a load balancer which can sometimes cause rejected transactions to land on-chain. You can reduce the chances of additional cost overhead by reducing the pushing frequency. + +## Prometheus Metrics + +The price_pusher now supports Prometheus metrics to monitor the health and performance of the price update service. Metrics are exposed via an HTTP endpoint that can be scraped by Prometheus. + +### Available Metrics + +The following metrics are available: + +- **pyth_price_last_published_time**: The last published time of a price feed in unix timestamp +- **pyth_price_updates_total**: Total number of price updates pushed to the chain +- **pyth_price_update_duration_seconds**: Duration of price update operations in seconds +- **pyth_active_price_feeds**: Number of active price feeds being monitored +- **pyth_price_update_errors_total**: Total number of errors encountered during price updates +- **pyth_price_update_attempts_total**: Total number of price update attempts + +### Configuration + +Metrics are enabled by default and can be configured using the following command-line options: + +- `--enable-metrics`: Enable or disable the Prometheus metrics server (default: true) +- `--metrics-port`: Port for the Prometheus metrics server (default: 9090) + +Example: + +```bash +node lib/index.js evm --config config.evm.mainnet.json --metrics-port 9091 +``` + +### Running Locally with Docker + +You can run a local Prometheus instance to test the metrics: + +1. Create a `prometheus.yml` file: + +```yaml +global: + scrape_interval: 15s + +scrape_configs: + - job_name: "price_pusher" + static_configs: + - targets: ["localhost:9090"] +``` + +2. Run Prometheus with Docker: + +```bash +docker run -d --name prometheus -p 9090:9090 \ + -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \ + prom/prometheus +``` + +3. Run Grafana with Docker: + +```bash +docker run -d --name grafana -p 3000:3000 grafana/grafana +``` + +4. Access Grafana at http://localhost:3000 (default credentials: admin/admin) and add Prometheus as a data source (URL: http://host.docker.internal:9090). + +### Example Grafana Queries + +Here are some example Grafana queries to monitor your price feeds: + +1. Last published time for each price feed: + +``` +pyth_price_last_published_time +``` + +2. Number of price updates in the last hour: + +``` +sum(increase(pyth_price_updates_total[1h])) +``` + +3. Price feeds not updated in the last hour: + +``` +time() - pyth_price_last_published_time > 3600 +``` + +4. Average update duration: + +``` +rate(pyth_price_update_duration_seconds_sum[5m]) / rate(pyth_price_update_duration_seconds_count[5m]) +``` diff --git a/apps/price_pusher/alerts.yml b/apps/price_pusher/alerts.yml new file mode 100644 index 0000000000..651262ef83 --- /dev/null +++ b/apps/price_pusher/alerts.yml @@ -0,0 +1,47 @@ +groups: + - name: price_pusher_alerts + rules: + - alert: PriceFeedNotUpdated + expr: time() - pyth_price_last_published_time > 3600 + for: 5m + labels: + severity: warning + annotations: + summary: "Price feed not updated" + description: "Price feed {{ $labels.alias }} has not been updated for more than 1 hour" + + - alert: HighErrorRate + expr: sum(increase(pyth_price_update_errors_total[15m])) > 5 + for: 5m + labels: + severity: warning + annotations: + summary: "High error rate in price updates" + description: "There have been more than 5 errors in the last 15 minutes" + + - alert: NoRecentPriceUpdates + expr: sum(increase(pyth_price_updates_total[30m])) == 0 + for: 5m + labels: + severity: critical + annotations: + summary: "No recent price updates" + description: "No price updates have been pushed in the last 30 minutes" + + - alert: PricePusherDown + expr: up{job=~"price_pusher.*"} == 0 + for: 1m + labels: + severity: critical + annotations: + summary: "Price pusher service is down" + description: "The price pusher service {{ $labels.instance }} is down" + + - alert: HighUpdateDuration + expr: rate(pyth_price_update_duration_seconds_sum[5m]) / rate(pyth_price_update_duration_seconds_count[5m]) > 5 + for: 5m + labels: + severity: warning + annotations: + summary: "High update duration" + description: "Price updates are taking longer than 5 seconds on average" diff --git a/apps/price_pusher/docker-compose.metrics.sample.yaml b/apps/price_pusher/docker-compose.metrics.sample.yaml new file mode 100644 index 0000000000..df3b051a06 --- /dev/null +++ b/apps/price_pusher/docker-compose.metrics.sample.yaml @@ -0,0 +1,77 @@ +version: "3" + +services: + prometheus: + image: prom/prometheus:latest + container_name: prometheus + ports: + - "9090:9090" + volumes: + - ./prometheus.yml:/etc/prometheus/prometheus.yml + - ./alerts.yml:/etc/prometheus/alerts.yml + command: + - "--config.file=/etc/prometheus/prometheus.yml" + - "--storage.tsdb.path=/prometheus" + - "--web.console.libraries=/usr/share/prometheus/console_libraries" + - "--web.console.templates=/usr/share/prometheus/consoles" + networks: + - monitoring + + grafana: + image: grafana/grafana:latest + container_name: grafana + ports: + - "3000:3000" + volumes: + - grafana-storage:/var/lib/grafana + environment: + - GF_SECURITY_ADMIN_USER=admin + - GF_SECURITY_ADMIN_PASSWORD=admin + - GF_USERS_ALLOW_SIGN_UP=false + depends_on: + - prometheus + networks: + - monitoring + + # Example price_pusher service for Ethereum + # price_pusher_ethereum: + # image: your-price-pusher-image:latest + # container_name: price_pusher_ethereum + # volumes: + # - ./config.evm.mainnet.json:/app/config.json + # - ./mnemonic:/app/mnemonic + # command: > + # node lib/index.js evm + # --config /app/config.json + # --mnemonic-file /app/mnemonic + # --metrics-port 9091 + # ports: + # - "9091:9091" + # networks: + # - monitoring + # restart: unless-stopped + + # Example price_pusher service for Solana + # price_pusher_solana: + # image: your-price-pusher-image:latest + # container_name: price_pusher_solana + # volumes: + # - ./config.solana.mainnet.json:/app/config.json + # - ./mnemonic:/app/mnemonic + # command: > + # node lib/index.js solana + # --config /app/config.json + # --mnemonic-file /app/mnemonic + # --metrics-port 9092 + # ports: + # - "9092:9092" + # networks: + # - monitoring + # restart: unless-stopped + +networks: + monitoring: + driver: bridge + +volumes: + grafana-storage: diff --git a/apps/price_pusher/grafana-dashboard.json b/apps/price_pusher/grafana-dashboard.json new file mode 100644 index 0000000000..0633b3e37f --- /dev/null +++ b/apps/price_pusher/grafana-dashboard.json @@ -0,0 +1,553 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 1, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 3600 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 1, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "title": "Time Since Last Update", + "type": "timeseries", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "time() - pyth_price_last_published_time", + "legendFormat": "{{alias}}", + "range": true, + "refId": "A" + } + ] + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 3600 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 2, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": ["lastNotNull"], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "10.0.0", + "title": "Time Since Last Update (Stat)", + "type": "stat", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "time() - pyth_price_last_published_time", + "legendFormat": "{{alias}}", + "range": true, + "refId": "A" + } + ] + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "title": "Price Updates (Last Hour)", + "type": "timeseries", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "sum(increase(pyth_price_updates_total[1h]))", + "legendFormat": "Updates", + "range": true, + "refId": "A" + } + ] + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 8 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "title": "Average Update Duration", + "type": "timeseries", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "rate(pyth_price_update_duration_seconds_sum[5m]) / rate(pyth_price_update_duration_seconds_count[5m])", + "legendFormat": "{{alias}}", + "range": true, + "refId": "A" + } + ] + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 5, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "title": "Active Price Feeds", + "type": "timeseries", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "pyth_active_price_feeds", + "legendFormat": "Active Feeds", + "range": true, + "refId": "A" + } + ] + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 16 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "title": "Update Errors", + "type": "timeseries", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "sum(increase(pyth_price_update_errors_total[5m]))", + "legendFormat": "Errors", + "range": true, + "refId": "A" + } + ] + } + ], + "refresh": "5s", + "schemaVersion": 38, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Pyth Price Pusher Dashboard", + "uid": "pyth-price-pusher", + "version": 1, + "weekStart": "" +} diff --git a/apps/price_pusher/package.json b/apps/price_pusher/package.json index 1b78f9560c..9a28847a10 100644 --- a/apps/price_pusher/package.json +++ b/apps/price_pusher/package.json @@ -45,6 +45,7 @@ "license": "Apache-2.0", "devDependencies": { "@types/ethereum-protocol": "^1.0.2", + "@types/express": "^4.17.21", "@types/jest": "^27.4.1", "@types/yargs": "^17.0.10", "@typescript-eslint/eslint-plugin": "^6.0.0", @@ -76,11 +77,13 @@ "@ton/ton": "^15.1.0", "@types/pino": "^7.0.5", "aptos": "^1.8.5", + "express": "^4.18.2", "fuels": "^0.94.5", "jito-ts": "^3.0.1", "joi": "^17.6.0", "near-api-js": "^3.0.2", "pino": "^9.2.0", + "prom-client": "^15.1.0", "viem": "^2.19.4", "yaml": "^2.1.1", "yargs": "^17.5.1" diff --git a/apps/price_pusher/prometheus.yml b/apps/price_pusher/prometheus.yml new file mode 100644 index 0000000000..07e706e386 --- /dev/null +++ b/apps/price_pusher/prometheus.yml @@ -0,0 +1,66 @@ +global: + scrape_interval: 15s + evaluation_interval: 15s + +scrape_configs: + - job_name: "price_pusher" + static_configs: + - targets: ["host.docker.internal:9091"] + relabel_configs: + - source_labels: [__address__] + target_label: instance + replacement: "price_pusher" + + # Add more price_pusher instances for different chains + # - job_name: 'price_pusher_ethereum' + # static_configs: + # - targets: ['localhost:9091'] + # relabel_configs: + # - source_labels: [__address__] + # target_label: instance + # replacement: 'ethereum' + # - source_labels: [__address__] + # target_label: chain + # replacement: 'ethereum' + + # - job_name: 'price_pusher_solana' + # static_configs: + # - targets: ['localhost:9092'] + # relabel_configs: + # - source_labels: [__address__] + # target_label: instance + # replacement: 'solana' + # - source_labels: [__address__] + # target_label: chain + # replacement: 'solana' + +alerting: + alertmanagers: + - static_configs: + - targets: + # - alertmanager:9093 + +# Alert rules +rule_files: + - "alerts.yml" +# Sample alerts.yml content: +# groups: +# - name: price_pusher_alerts +# rules: +# - alert: PriceFeedNotUpdated +# expr: time() - pyth_price_last_published_time > 3600 +# for: 5m +# labels: +# severity: warning +# annotations: +# summary: "Price feed not updated" +# description: "Price feed {{ $labels.alias }} has not been updated for more than 1 hour" +# +# - alert: HighErrorRate +# expr: sum(increase(pyth_price_update_errors_total[15m])) > 5 +# for: 5m +# labels: +# severity: warning +# annotations: +# summary: "High error rate in price updates" +# description: "There have been more than 5 errors in the last 15 minutes" diff --git a/apps/price_pusher/src/controller.ts b/apps/price_pusher/src/controller.ts index 418f1ea732..9e26b7e677 100644 --- a/apps/price_pusher/src/controller.ts +++ b/apps/price_pusher/src/controller.ts @@ -3,9 +3,12 @@ import { DurationInSeconds, sleep } from "./utils"; import { IPriceListener, IPricePusher } from "./interface"; import { PriceConfig, shouldUpdate, UpdateCondition } from "./price-config"; import { Logger } from "pino"; +import { PricePusherMetrics } from "./metrics"; export class Controller { private pushingFrequency: DurationInSeconds; + private metrics?: PricePusherMetrics; + constructor( private priceConfigs: PriceConfig[], private sourcePriceListener: IPriceListener, @@ -14,9 +17,16 @@ export class Controller { private logger: Logger, config: { pushingFrequency: DurationInSeconds; - }, + metrics?: PricePusherMetrics; + } ) { this.pushingFrequency = config.pushingFrequency; + this.metrics = config.metrics; + + // Set the number of active price feeds if metrics are enabled + if (this.metrics) { + this.metrics.setActivePriceFeeds(this.priceConfigs.length); + } } async start() { @@ -38,18 +48,34 @@ export class Controller { for (const priceConfig of this.priceConfigs) { const priceId = priceConfig.id; + const alias = priceConfig.alias; const targetLatestPrice = this.targetPriceListener.getLatestPriceInfo(priceId); const sourceLatestPrice = this.sourcePriceListener.getLatestPriceInfo(priceId); + // Update metrics for the last published time if available + if (this.metrics && targetLatestPrice) { + this.metrics.updateLastPublishedTime( + priceId, + alias, + targetLatestPrice + ); + } + const priceShouldUpdate = shouldUpdate( priceConfig, sourceLatestPrice, targetLatestPrice, this.logger, ); + + // Record price update attempt in metrics + if (this.metrics) { + this.metrics.recordPriceUpdateAttempt(priceId, alias); + } + if (priceShouldUpdate == UpdateCondition.YES) { pushThresholdMet = true; } @@ -75,7 +101,48 @@ export class Controller { // note that the priceIds are without leading "0x" const priceIds = pricesToPush.map((priceConfig) => priceConfig.id); - this.targetChainPricePusher.updatePriceFeed(priceIds, pubTimesToPush); + + try { + // Start timers for each price update if metrics are enabled + const timers = this.metrics + ? pricesToPush.map((config) => ({ + config, + timer: this.metrics!.startPriceUpdateTimer( + config.id, + config.alias + ), + })) + : []; + + await this.targetChainPricePusher.updatePriceFeed( + priceIds, + pubTimesToPush + ); + + // Record successful updates and end timers + if (this.metrics) { + for (const { config, timer } of timers) { + this.metrics.recordPriceUpdate(config.id, config.alias); + timer(); // End the timer + } + } + } catch (error) { + this.logger.error( + { error, priceIds }, + "Error pushing price updates to chain" + ); + + // Record errors in metrics + if (this.metrics) { + for (const config of pricesToPush) { + this.metrics.recordPriceUpdateError( + config.id, + config.alias, + error instanceof Error ? error.name : "unknown" + ); + } + } + } } else { this.logger.info("None of the checks were triggered. No push needed."); } diff --git a/apps/price_pusher/src/evm/command.ts b/apps/price_pusher/src/evm/command.ts index be6f3af08f..10c2878035 100644 --- a/apps/price_pusher/src/evm/command.ts +++ b/apps/price_pusher/src/evm/command.ts @@ -11,6 +11,7 @@ import pino from "pino"; import { createClient } from "./super-wallet"; import { createPythContract } from "./pyth-contract"; import { isWsEndpoint, filterInvalidPriceItems } from "../utils"; +import { PricePusherMetrics } from "../metrics"; export default { command: "evm", @@ -83,6 +84,8 @@ export default { ...options.pushingFrequency, ...options.logLevel, ...options.controllerLogLevel, + ...options.enableMetrics, + ...options.metricsPort, }, handler: async function (argv: any) { // FIXME: type checks for this @@ -103,6 +106,8 @@ export default { updateFeeMultiplier, logLevel, controllerLogLevel, + enableMetrics, + metricsPort, } = argv; console.log("***** priceServiceEndpoint *****", priceServiceEndpoint); @@ -131,6 +136,14 @@ export default { priceItems = existingPriceItems; + // Initialize metrics if enabled + let metrics: PricePusherMetrics | undefined; + if (enableMetrics) { + metrics = new PricePusherMetrics(logger.child({ module: "Metrics" })); + metrics.start(metricsPort); + logger.info(`Metrics server started on port ${metricsPort}`); + } + const pythListener = new PythPriceListener( hermesClient, priceItems, @@ -183,7 +196,10 @@ export default { evmListener, evmPusher, logger.child({ module: "Controller" }, { level: controllerLogLevel }), - { pushingFrequency }, + { + pushingFrequency, + metrics, + } ); controller.start(); diff --git a/apps/price_pusher/src/index.ts b/apps/price_pusher/src/index.ts index 4d53438d58..13a508fddd 100644 --- a/apps/price_pusher/src/index.ts +++ b/apps/price_pusher/src/index.ts @@ -9,6 +9,7 @@ import near from "./near/command"; import solana from "./solana/command"; import fuel from "./fuel/command"; import ton from "./ton/command"; +import { enableMetrics, metricsPort } from "./options"; yargs(hideBin(process.argv)) .parserConfiguration({ @@ -16,6 +17,8 @@ yargs(hideBin(process.argv)) }) .config("config") .global("config") + .option("enable-metrics", enableMetrics["enable-metrics"]) + .option("metrics-port", metricsPort["metrics-port"]) .command(evm) .command(fuel) .command(injective) diff --git a/apps/price_pusher/src/metrics.ts b/apps/price_pusher/src/metrics.ts new file mode 100644 index 0000000000..71b65f5746 --- /dev/null +++ b/apps/price_pusher/src/metrics.ts @@ -0,0 +1,133 @@ +import { Registry, Counter, Gauge, Histogram } from "prom-client"; +import express from "express"; +import { PriceInfo } from "./interface"; +import { Logger } from "pino"; + +// Define the metrics we want to track +export class PricePusherMetrics { + private registry: Registry; + private server: express.Express; + private logger: Logger; + + // Metrics for price feed updates + public lastPublishedTime: Gauge; + public priceUpdatesTotal: Counter; + public priceUpdateDuration: Histogram; + public activePriceFeeds: Gauge; + public priceUpdateErrors: Counter; + public priceUpdateAttempts: Counter; + + constructor(logger: Logger) { + this.logger = logger; + this.registry = new Registry(); + this.server = express(); + + // Register the default metrics (memory, CPU, etc.) + this.registry.setDefaultLabels({ app: "price_pusher" }); + + // Create metrics + this.lastPublishedTime = new Gauge({ + name: "pyth_price_last_published_time", + help: "The last published time of a price feed in unix timestamp", + labelNames: ["price_id", "alias"], + registers: [this.registry], + }); + + this.priceUpdatesTotal = new Counter({ + name: "pyth_price_updates_total", + help: "Total number of price updates pushed to the chain", + labelNames: ["price_id", "alias"], + registers: [this.registry], + }); + + this.priceUpdateDuration = new Histogram({ + name: "pyth_price_update_duration_seconds", + help: "Duration of price update operations in seconds", + labelNames: ["price_id", "alias"], + buckets: [0.1, 0.5, 1, 2, 5, 10], + registers: [this.registry], + }); + + this.activePriceFeeds = new Gauge({ + name: "pyth_active_price_feeds", + help: "Number of active price feeds being monitored", + registers: [this.registry], + }); + + this.priceUpdateErrors = new Counter({ + name: "pyth_price_update_errors_total", + help: "Total number of errors encountered during price updates", + labelNames: ["price_id", "alias", "error_type"], + registers: [this.registry], + }); + + this.priceUpdateAttempts = new Counter({ + name: "pyth_price_update_attempts_total", + help: "Total number of price update attempts", + labelNames: ["price_id", "alias"], + registers: [this.registry], + }); + + // Setup the metrics endpoint + this.server.get("/metrics", async (req, res) => { + res.set("Content-Type", this.registry.contentType); + res.end(await this.registry.metrics()); + }); + } + + // Start the metrics server + public start(port: number): void { + this.server.listen(port, () => { + this.logger.info(`Metrics server started on port ${port}`); + }); + } + + // Update the last published time for a price feed + public updateLastPublishedTime( + priceId: string, + alias: string, + priceInfo: PriceInfo + ): void { + this.lastPublishedTime.set( + { price_id: priceId, alias }, + priceInfo.publishTime + ); + } + + // Record a successful price update + public recordPriceUpdate(priceId: string, alias: string): void { + this.priceUpdatesTotal.inc({ price_id: priceId, alias }); + } + + // Record a price update attempt + public recordPriceUpdateAttempt(priceId: string, alias: string): void { + this.priceUpdateAttempts.inc({ price_id: priceId, alias }); + } + + // Record a price update error + public recordPriceUpdateError( + priceId: string, + alias: string, + errorType: string + ): void { + this.priceUpdateErrors.inc({ + price_id: priceId, + alias, + error_type: errorType, + }); + } + + // Set the number of active price feeds + public setActivePriceFeeds(count: number): void { + this.activePriceFeeds.set(count); + } + + // Create a timer for measuring price update duration + public startPriceUpdateTimer(priceId: string, alias: string): () => void { + const end = this.priceUpdateDuration.startTimer({ + price_id: priceId, + alias, + }); + return end; + } +} diff --git a/apps/price_pusher/src/options.ts b/apps/price_pusher/src/options.ts index 1c09bf0f32..d80b4565d2 100644 --- a/apps/price_pusher/src/options.ts +++ b/apps/price_pusher/src/options.ts @@ -76,3 +76,21 @@ export const controllerLogLevel = { choices: ["trace", "debug", "info", "warn", "error"], } as Options, }; + +export const enableMetrics = { + "enable-metrics": { + description: "Enable Prometheus metrics server", + type: "boolean", + required: false, + default: true, + } as Options, +}; + +export const metricsPort = { + "metrics-port": { + description: "Port for the Prometheus metrics server", + type: "number", + required: false, + default: 9090, + } as Options, +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6da5eb2a0d..6bffb14ad1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -802,7 +802,10 @@ importers: version: 3.0.4(encoding@0.1.13) pino: specifier: ^9.2.0 - version: 9.6.0 + version: 9.5.0 + prom-client: + specifier: ^15.1.0 + version: 15.1.3 viem: specifier: ^2.19.4 version: 2.23.11(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) @@ -6278,6 +6281,10 @@ packages: '@octokit/types@13.8.0': resolution: {integrity: sha512-x7DjTIbEpEWXK99DMd01QfWy0hd5h4EN+Q7shkdKds3otGQP+oWE/y0A76i1OvH9fygo4ddvNf7ZvF0t78P98A==} + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + '@openzeppelin/contract-loader@0.6.3': resolution: {integrity: sha512-cOFIjBjwbGgZhDZsitNgJl0Ye1rd5yu/Yx5LMgeq3u0ZYzldm4uObzHDFq4gjDdoypvyORjjJa3BlFA7eAnVIg==} @@ -11458,6 +11465,9 @@ packages: bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + bintrees@1.0.2: + resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} + bip32@2.0.6: resolution: {integrity: sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==} engines: {node: '>=6.0.0'} @@ -18176,6 +18186,10 @@ packages: resolution: {integrity: sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + prom-client@15.1.3: + resolution: {integrity: sha512-6ZiOBfCywsD4k1BN9IX0uZhF+tJkV8q8llP64G5Hajs4JOeVLPCwpPVcpXy3BwYiUGgyJzsJJQeOIv7+hDSq8g==} + engines: {node: ^16 || ^18 || >=20} + promise-all-reject-late@1.0.1: resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} @@ -19941,9 +19955,11 @@ packages: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} - tar@7.4.3: - resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} - engines: {node: '>=18'} + tdigest@0.1.2: + resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} + + telejson@7.2.0: + resolution: {integrity: sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==} temp-dir@1.0.0: resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} @@ -23996,7 +24012,7 @@ snapshots: '@cosmjs/socket': 0.30.1(bufferutil@4.0.9)(utf-8-validate@6.0.3) '@cosmjs/stream': 0.30.1 '@cosmjs/utils': 0.30.1 - axios: 0.21.4(debug@4.4.0) + axios: 0.21.4(debug@4.3.7) readonly-date: 1.0.0 xstream: 11.14.0 transitivePeerDependencies: @@ -24175,7 +24191,7 @@ snapshots: - supports-color - utf-8-validate - '@cprussin/jest-runner-prettier@1.0.0(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(prettier@3.5.3)': + '@cprussin/jest-config@1.4.1(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(@opentelemetry/api@1.9.0)(@types/node@22.8.2)(babel-jest@29.7.0(@babel/core@7.25.8))(bufferutil@4.0.8)(eslint@9.13.0(jiti@1.21.0))(sass@1.80.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))(utf-8-validate@5.0.10)': dependencies: create-lite-jest-runner: 1.1.2(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2))) emphasize: 5.0.0 @@ -26323,7 +26339,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 18.19.80 + '@types/node': 20.14.15 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -26547,7 +26563,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.80 + '@types/node': 20.14.15 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -26565,7 +26581,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 18.19.80 + '@types/node': 20.14.15 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -26587,7 +26603,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 18.19.80 + '@types/node': 20.14.15 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -27637,9 +27653,62 @@ snapshots: dependencies: glob: 10.3.10 - '@next/eslint-plugin-next@15.2.2': + '@next/swc-darwin-arm64@14.2.15': + optional: true + + '@next/swc-darwin-arm64@15.1.2': + optional: true + + '@next/swc-darwin-x64@14.2.15': + optional: true + + '@next/swc-darwin-x64@15.1.2': + optional: true + + '@next/swc-linux-arm64-gnu@14.2.15': + optional: true + + '@next/swc-linux-arm64-gnu@15.1.2': + optional: true + + '@next/swc-linux-arm64-musl@14.2.15': + optional: true + + '@next/swc-linux-arm64-musl@15.1.2': + optional: true + + '@next/swc-linux-x64-gnu@14.2.15': + optional: true + + '@next/swc-linux-x64-gnu@15.1.2': + optional: true + + '@next/swc-linux-x64-musl@14.2.15': + optional: true + + '@next/swc-linux-x64-musl@15.1.2': + optional: true + + '@next/swc-win32-arm64-msvc@14.2.15': + optional: true + + '@next/swc-win32-arm64-msvc@15.1.2': + optional: true + + '@next/swc-win32-ia32-msvc@14.2.15': + optional: true + + '@next/swc-win32-x64-msvc@14.2.15': + optional: true + + '@next/swc-win32-x64-msvc@15.1.2': + optional: true + + '@next/third-parties@14.2.6(next@15.1.2(@babel/core@7.25.8)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.80.7))(react@19.0.0)': dependencies: - fast-glob: 3.3.1 + next: 15.1.2(@babel/core@7.25.8)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.80.7) + react: 19.0.0 + third-party-capital: 1.0.20 '@next/swc-darwin-arm64@15.2.2': optional: true @@ -28120,6 +28189,8 @@ snapshots: dependencies: '@octokit/openapi-types': 23.0.1 + '@opentelemetry/api@1.9.0': {} + '@openzeppelin/contract-loader@0.6.3': dependencies: find-up: 4.1.0 @@ -33953,7 +34024,7 @@ snapshots: '@types/bn.js@4.11.6': dependencies: - '@types/node': 18.19.80 + '@types/node': 20.14.15 '@types/bn.js@5.1.6': dependencies: @@ -33981,7 +34052,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 18.19.80 + '@types/node': 20.14.15 '@types/cors@2.8.12': optional: true @@ -34075,7 +34146,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 18.19.80 + '@types/node': 20.14.15 '@types/hast@2.3.10': dependencies: @@ -34123,7 +34194,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 18.19.80 + '@types/node': 20.14.15 '@types/lodash.values@4.3.9': dependencies: @@ -34188,7 +34259,7 @@ snapshots: '@types/pbkdf2@3.1.2': dependencies: - '@types/node': 18.19.80 + '@types/node': 20.14.15 '@types/pino@7.0.5': dependencies: @@ -34210,11 +34281,11 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 18.19.80 + '@types/node': 20.14.15 '@types/secp256k1@4.0.6': dependencies: - '@types/node': 18.19.80 + '@types/node': 20.14.15 '@types/seedrandom@3.0.1': {} @@ -34271,7 +34342,7 @@ snapshots: '@types/ws@7.4.7': dependencies: - '@types/node': 18.19.80 + '@types/node': 20.14.15 '@types/ws@8.18.0': dependencies: @@ -36739,6 +36810,8 @@ snapshots: dependencies: file-uri-to-path: 1.0.0 + bintrees@1.0.2: {} + bip32@2.0.6: dependencies: '@types/node': 10.12.18 @@ -42257,7 +42330,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.80 + '@types/node': 20.14.15 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.3 @@ -42762,7 +42835,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.80 + '@types/node': 20.14.15 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -42774,7 +42847,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 18.19.80 + '@types/node': 20.14.15 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -42820,7 +42893,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 18.19.80 + '@types/node': 20.14.15 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -42867,7 +42940,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.80 + '@types/node': 20.14.15 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -42895,7 +42968,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.80 + '@types/node': 20.14.15 chalk: 4.1.2 cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.2 @@ -42960,7 +43033,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.80 + '@types/node': 20.14.15 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -42981,7 +43054,7 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 18.19.80 + '@types/node': 20.14.15 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -44855,7 +44928,34 @@ snapshots: next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1): dependencies: - '@next/env': 15.2.2 + '@next/env': 14.2.15 + '@swc/helpers': 0.5.5 + busboy: 1.6.0 + caniuse-lite: 1.0.30001669 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.25.8)(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 14.2.15 + '@next/swc-darwin-x64': 14.2.15 + '@next/swc-linux-arm64-gnu': 14.2.15 + '@next/swc-linux-arm64-musl': 14.2.15 + '@next/swc-linux-x64-gnu': 14.2.15 + '@next/swc-linux-x64-musl': 14.2.15 + '@next/swc-win32-arm64-msvc': 14.2.15 + '@next/swc-win32-ia32-msvc': 14.2.15 + '@next/swc-win32-x64-msvc': 14.2.15 + '@opentelemetry/api': 1.9.0 + sass: 1.80.7 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + next@15.1.2(@babel/core@7.25.8)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@19.0.0))(react@19.0.0)(sass@1.80.7): + dependencies: + '@next/env': 15.1.2 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 @@ -44865,15 +44965,16 @@ snapshots: react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(@babel/core@7.26.10)(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.2.2 - '@next/swc-darwin-x64': 15.2.2 - '@next/swc-linux-arm64-gnu': 15.2.2 - '@next/swc-linux-arm64-musl': 15.2.2 - '@next/swc-linux-x64-gnu': 15.2.2 - '@next/swc-linux-x64-musl': 15.2.2 - '@next/swc-win32-arm64-msvc': 15.2.2 - '@next/swc-win32-x64-msvc': 15.2.2 - sass: 1.85.1 + '@next/swc-darwin-arm64': 15.1.2 + '@next/swc-darwin-x64': 15.1.2 + '@next/swc-linux-arm64-gnu': 15.1.2 + '@next/swc-linux-arm64-musl': 15.1.2 + '@next/swc-linux-x64-gnu': 15.1.2 + '@next/swc-linux-x64-musl': 15.1.2 + '@next/swc-win32-arm64-msvc': 15.1.2 + '@next/swc-win32-x64-msvc': 15.1.2 + '@opentelemetry/api': 1.9.0 + sass: 1.80.7 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' @@ -46214,6 +46315,11 @@ snapshots: proggy@2.0.0: {} + prom-client@15.1.3: + dependencies: + '@opentelemetry/api': 1.9.0 + tdigest: 0.1.2 + promise-all-reject-late@1.0.1: {} promise-call-limit@3.0.2: {} @@ -46274,7 +46380,7 @@ snapshots: '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 '@types/long': 4.0.2 - '@types/node': 18.19.80 + '@types/node': 20.14.15 long: 4.0.0 protobufjs@7.4.0: @@ -46289,8 +46395,8 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 18.19.80 - long: 5.3.1 + '@types/node': 20.14.15 + long: 5.2.3 protocols@2.0.2: {} @@ -48723,7 +48829,11 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 - tar@7.4.3: + tdigest@0.1.2: + dependencies: + bintrees: 1.0.2 + + telejson@7.2.0: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 From 342ddbf123d83a7467b8cf928acf39cabd8d46a2 Mon Sep 17 00:00:00 2001 From: Daniel Chew Date: Mon, 17 Mar 2025 17:19:39 +0700 Subject: [PATCH 02/18] resolve lock --- pnpm-lock.yaml | 613 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 545 insertions(+), 68 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6bffb14ad1..8a60db9a9d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,7 +26,7 @@ catalogs: version: 4.0.1 '@cprussin/jest-config': specifier: ^2.0.1 - version: 2.0.1 + version: 1.4.1 '@cprussin/prettier-config': specifier: ^2.2.1 version: 2.2.1 @@ -44,7 +44,7 @@ catalogs: version: 2.2.0 '@next/third-parties': specifier: ^15.2.2 - version: 15.2.2 + version: 15.0.2 '@phosphor-icons/react': specifier: ^2.1.7 version: 2.1.7 @@ -179,13 +179,13 @@ catalogs: version: 12.5.0 next: specifier: ^15.2.2 - version: 15.2.2 + version: 15.1.2 next-themes: specifier: ^0.4.6 version: 0.4.6 nuqs: specifier: ^2.4.1 - version: 2.4.1 + version: 2.1.2 pino: specifier: ^9.6.0 version: 9.6.0 @@ -802,7 +802,7 @@ importers: version: 3.0.4(encoding@0.1.13) pino: specifier: ^9.2.0 - version: 9.5.0 + version: 9.6.0 prom-client: specifier: ^15.1.0 version: 15.1.3 @@ -3279,6 +3279,13 @@ packages: resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} engines: {node: '>=6.9.0'} + '@babel/eslint-parser@7.26.10': + resolution: {integrity: sha512-QsfQZr4AiLpKqn7fz+j7SN+f43z2DZCgGyYbNJ2vJOqKfG4E6MZer1+jqGZqKJaxq/gdO2DC/nUu45+pOL5p2Q==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 + '@babel/generator@7.26.10': resolution: {integrity: sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==} engines: {node: '>=6.9.0'} @@ -3951,6 +3958,9 @@ packages: '@balena/dockerignore@1.0.2': resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} + '@base2/pretty-print-object@1.0.1': + resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -4134,11 +4144,17 @@ packages: '@cosmology/lcd@0.13.5': resolution: {integrity: sha512-CI8KFsJcgp0RINF8wHpv3Y9yR4Fb9ZnGucyoUICjtX2XT4NVBK+fvZuRFj5TP34km8TpEOb+WV2T7IN/pZsD7Q==} + '@cprussin/eslint-config@3.0.0': + resolution: {integrity: sha512-SwI4V8WBUDDClYjUh5BOwEzByCmtichuR94tvbJSx0JQJDzH9uGrPMazGDzOdhYVchBFsV9pBjPXU4SNfqrcGw==} + '@cprussin/eslint-config@4.0.1': resolution: {integrity: sha512-CNY8kdJqRGvcGls0xuC2d+t1QARVVaQZ40sNJnLByITDwc5iNTkgMPyAQi4x0yGqYAu5z10OjBAYWCbyXmdY3g==} peerDependencies: eslint: ^9.22.0 + '@cprussin/jest-config@1.4.1': + resolution: {integrity: sha512-Ui+oLiRGg3rTnusQCZKN6N+8Tw0nD7AVweIXJBc+VDJyCNufe4K1mapequNphm9JnBrW12HFq4oevnHshcroEw==} + '@cprussin/jest-config@2.0.1': resolution: {integrity: sha512-p5rTSH4gst8dvbwPaibnSpp8Vj7NBbqY70AfYdI8kluYC4F+oGZqjwwBKxZ9WkWnm8NfijbVXc5DimlC7Dt6jA==} peerDependencies: @@ -4585,6 +4601,15 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint/compat@1.2.7': + resolution: {integrity: sha512-xvv7hJE32yhegJ8xNAnb62ggiAwTYHBpUCWhRxEj/ksvgDJuSXfoDkBcRYaYNFiJ+jH0IE3K16hd+xXzhBgNbg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^9.10.0 + peerDependenciesMeta: + eslint: + optional: true + '@eslint/config-array@0.19.2': resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5746,6 +5771,9 @@ packages: '@microsoft/tsdoc-config@0.17.1': resolution: {integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==} + '@microsoft/tsdoc@0.15.0': + resolution: {integrity: sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==} + '@microsoft/tsdoc@0.15.1': resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} @@ -5838,8 +5866,11 @@ packages: '@near-js/wallet-account@1.1.1': resolution: {integrity: sha512-NnoJKtogBQ7Qz+AP+LdF70BP8Az6UXQori7OjPqJLMo73bn6lh5Ywvegwd1EB7ZEVe4BRt9+f9QkbU5M8ANfAw==} - '@next/env@15.2.2': - resolution: {integrity: sha512-yWgopCfA9XDR8ZH3taB5nRKtKJ1Q5fYsTOuYkzIIoS8TJ0UAUKAGF73JnGszbjk2ufAQDj6mDdgsJAFx5CLtYQ==} + '@next/env@14.2.15': + resolution: {integrity: sha512-S1qaj25Wru2dUpcIZMjxeMVSwkt8BK4dmWHHiBuRstcIyOsMapqT4A4jSB6onvqeygkSSmOkyny9VVx8JIGamQ==} + + '@next/env@15.1.2': + resolution: {integrity: sha512-Hm3jIGsoUl6RLB1vzY+dZeqb+/kWPZ+h34yiWxW0dV87l8Im/eMOwpOA+a0L78U0HM04syEjXuRlCozqpwuojQ==} '@next/eslint-plugin-next@14.2.24': resolution: {integrity: sha512-FDL3qs+5DML0AJz56DCVr+KnFYivxeAX73En8QbPw9GjJZ6zbfvqDy+HrarHFzbsIASn7y8y5ySJ/lllSruNVQ==} @@ -5847,54 +5878,114 @@ packages: '@next/eslint-plugin-next@15.2.2': resolution: {integrity: sha512-1+BzokFuFQIfLaRxUKf2u5In4xhPV7tUgKcK53ywvFl6+LXHWHpFkcV7VNeKlyQKUotwiq4fy/aDNF9EiUp4RQ==} - '@next/swc-darwin-arm64@15.2.2': - resolution: {integrity: sha512-HNBRnz+bkZ+KfyOExpUxTMR0Ow8nkkcE6IlsdEa9W/rI7gefud19+Sn1xYKwB9pdCdxIP1lPru/ZfjfA+iT8pw==} + '@next/swc-darwin-arm64@14.2.15': + resolution: {integrity: sha512-Rvh7KU9hOUBnZ9TJ28n2Oa7dD9cvDBKua9IKx7cfQQ0GoYUwg9ig31O2oMwH3wm+pE3IkAQ67ZobPfEgurPZIA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.2.2': - resolution: {integrity: sha512-mJOUwp7al63tDpLpEFpKwwg5jwvtL1lhRW2fI1Aog0nYCPAhxbJsaZKdoVyPZCy8MYf/iQVNDuk/+i29iLCzIA==} + '@next/swc-darwin-arm64@15.1.2': + resolution: {integrity: sha512-b9TN7q+j5/7+rGLhFAVZiKJGIASuo8tWvInGfAd8wsULjB1uNGRCj1z1WZwwPWzVQbIKWFYqc+9L7W09qwt52w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@14.2.15': + resolution: {integrity: sha512-5TGyjFcf8ampZP3e+FyCax5zFVHi+Oe7sZyaKOngsqyaNEpOgkKB3sqmymkZfowy3ufGA/tUgDPPxpQx931lHg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.2.2': - resolution: {integrity: sha512-5ZZ0Zwy3SgMr7MfWtRE7cQWVssfOvxYfD9O7XHM7KM4nrf5EOeqwq67ZXDgo86LVmffgsu5tPO57EeFKRnrfSQ==} + '@next/swc-darwin-x64@15.1.2': + resolution: {integrity: sha512-caR62jNDUCU+qobStO6YJ05p9E+LR0EoXh1EEmyU69cYydsAy7drMcOlUlRtQihM6K6QfvNwJuLhsHcCzNpqtA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@14.2.15': + resolution: {integrity: sha512-3Bwv4oc08ONiQ3FiOLKT72Q+ndEMyLNsc/D3qnLMbtUYTQAmkx9E/JRu0DBpHxNddBmNT5hxz1mYBphJ3mfrrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.2.2': - resolution: {integrity: sha512-cgKWBuFMLlJ4TWcFHl1KOaVVUAF8vy4qEvX5KsNd0Yj5mhu989QFCq1WjuaEbv/tO1ZpsQI6h/0YR8bLwEi+nA==} + '@next/swc-linux-arm64-gnu@15.1.2': + resolution: {integrity: sha512-fHHXBusURjBmN6VBUtu6/5s7cCeEkuGAb/ZZiGHBLVBXMBy4D5QpM8P33Or8JD1nlOjm/ZT9sEE5HouQ0F+hUA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.2.2': - resolution: {integrity: sha512-c3kWSOSsVL8rcNBBfOq1+/j2PKs2nsMwJUV4icUxRgGBwUOfppeh7YhN5s79enBQFU+8xRgVatFkhHU1QW7yUA==} + '@next/swc-linux-arm64-musl@14.2.15': + resolution: {integrity: sha512-k5xf/tg1FBv/M4CMd8S+JL3uV9BnnRmoe7F+GWC3DxkTCD9aewFRH1s5rJ1zkzDa+Do4zyN8qD0N8c84Hu96FQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@15.1.2': + resolution: {integrity: sha512-9CF1Pnivij7+M3G74lxr+e9h6o2YNIe7QtExWq1KUK4hsOLTBv6FJikEwCaC3NeYTflzrm69E5UfwEAbV2U9/g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@14.2.15': + resolution: {integrity: sha512-kE6q38hbrRbKEkkVn62reLXhThLRh6/TvgSP56GkFNhU22TbIrQDEMrO7j0IcQHcew2wfykq8lZyHFabz0oBrA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.2.2': - resolution: {integrity: sha512-PXTW9PLTxdNlVYgPJ0equojcq1kNu5NtwcNjRjHAB+/sdoKZ+X8FBu70fdJFadkxFIGekQTyRvPMFF+SOJaQjw==} + '@next/swc-linux-x64-gnu@15.1.2': + resolution: {integrity: sha512-tINV7WmcTUf4oM/eN3Yuu/f8jQ5C6AkueZPKeALs/qfdfX57eNv4Ij7rt0SA6iZ8+fMobVfcFVv664Op0caCCg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.2.2': - resolution: {integrity: sha512-nG644Es5llSGEcTaXhnGWR/aThM/hIaz0jx4MDg4gWC8GfTCp8eDBWZ77CVuv2ha/uL9Ce+nPTfYkSLG67/sHg==} + '@next/swc-linux-x64-musl@14.2.15': + resolution: {integrity: sha512-PZ5YE9ouy/IdO7QVJeIcyLn/Rc4ml9M2G4y3kCM9MNf1YKvFY4heg3pVa/jQbMro+tP6yc4G2o9LjAz1zxD7tQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@15.1.2': + resolution: {integrity: sha512-jf2IseC4WRsGkzeUw/cK3wci9pxR53GlLAt30+y+B+2qAQxMw6WAC3QrANIKxkcoPU3JFh/10uFfmoMDF9JXKg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@14.2.15': + resolution: {integrity: sha512-2raR16703kBvYEQD9HNLyb0/394yfqzmIeyp2nDzcPV4yPjqNUG3ohX6jX00WryXz6s1FXpVhsCo3i+g4RUX+g==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.2.2': - resolution: {integrity: sha512-52nWy65S/R6/kejz3jpvHAjZDPKIbEQu4x9jDBzmB9jJfuOy5rspjKu4u77+fI4M/WzLXrrQd57hlFGzz1ubcQ==} + '@next/swc-win32-arm64-msvc@15.1.2': + resolution: {integrity: sha512-wvg7MlfnaociP7k8lxLX4s2iBJm4BrNiNFhVUY+Yur5yhAJHfkS8qPPeDEUH8rQiY0PX3u/P7Q/wcg6Mv6GSAA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-ia32-msvc@14.2.15': + resolution: {integrity: sha512-fyTE8cklgkyR1p03kJa5zXEaZ9El+kDNM5A+66+8evQS5e/6v0Gk28LqA0Jet8gKSOyP+OTm/tJHzMlGdQerdQ==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@next/swc-win32-x64-msvc@14.2.15': + resolution: {integrity: sha512-SzqGbsLsP9OwKNUG9nekShTwhj6JSB9ZLMWQ8g1gG6hdE5gQLncbnbymrwy2yVmH9nikSLYRYxYMFu78Ggp7/g==} engines: {node: '>= 10'} cpu: [x64] os: [win32] + '@next/swc-win32-x64-msvc@15.1.2': + resolution: {integrity: sha512-D3cNA8NoT3aWISWmo7HF5Eyko/0OdOO+VagkoJuiTk7pyX3P/b+n8XA/MYvyR+xSVcbKn68B1rY9fgqjNISqzQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@next/third-parties@15.0.2': + resolution: {integrity: sha512-Ohlh0KKfag3Vrx+yuSMJ/fSoCVvRoVG9wRiz8jvYelmg+l0970d41VoGzF2UeKwh9s5qXVRDVqiN/mIeiJ4iLg==} + peerDependencies: + next: ^13.0.0 || ^14.0.0 || ^15.0.0 + react: ^18.2.0 || 19.0.0-rc-02c0e824-20241028 + '@next/third-parties@15.2.2': resolution: {integrity: sha512-MLytjU67N5HdIq0Ch8kSB7EGL9JWZaT8C4YzSzjWRTXbf67G3m9Om+ziKqItEnkUNWZeYRzdn1VsDCpcUaIUwg==} peerDependencies: @@ -5904,6 +5995,9 @@ packages: '@ngraveio/bc-ur@1.1.13': resolution: {integrity: sha512-j73akJMV4+vLR2yQ4AphPIT5HZmxVjn/LxpL7YHoINnXoH6ccc90Zzck6/n6a3bCXOVZwBxq+YHwbAKRV+P8Zg==} + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + '@noble/ciphers@1.2.1': resolution: {integrity: sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==} engines: {node: ^14.21.3 || >=16} @@ -8979,7 +9073,7 @@ packages: resolution: {integrity: sha512-YIp6ILreXGxfN0je3yGaphY1wrKYQTX2gGyCsEwLi8QSO3g0Up89snDLE2KJ4zgDbXLojxqjTuMwQ5G8KteAUg==} engines: {node: '>=18.0.0'} peerDependencies: - next: ^13.5.0 || ^14.0.0 || ^15.0.0 + next: ^13.5.0 || ^14.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta storybook: ^8.6.7 @@ -9204,6 +9298,9 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@swc/helpers@0.5.5': + resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + '@szmarczak/http-timer@4.0.6': resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} @@ -9792,6 +9889,9 @@ packages: '@types/doctrine@0.0.9': resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} + '@types/escodegen@0.0.6': + resolution: {integrity: sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==} + '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -9801,6 +9901,9 @@ packages: '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + '@types/estree@0.0.51': + resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} + '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -10066,6 +10169,17 @@ packages: typescript: optional: true + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/eslint-plugin@8.26.1': resolution: {integrity: sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10104,6 +10218,16 @@ packages: typescript: optional: true + '@typescript-eslint/parser@7.18.0': + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/parser@8.26.1': resolution: {integrity: sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10115,6 +10239,10 @@ packages: resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/scope-manager@6.21.0': resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} engines: {node: ^16.0.0 || >=18.0.0} @@ -10123,6 +10251,10 @@ packages: resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} + engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/scope-manager@8.26.1': resolution: {integrity: sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10157,6 +10289,16 @@ packages: typescript: optional: true + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/type-utils@8.26.1': resolution: {integrity: sha512-Kcj/TagJLwoY/5w9JGEFV0dclQdyqw9+VMndxOJKtoFSjfZhLXhYjzsQEeyza03rwHx2vFEGvrJWJBXKleRvZg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10168,6 +10310,10 @@ packages: resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/types@6.21.0': resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} engines: {node: ^16.0.0 || >=18.0.0} @@ -10176,6 +10322,10 @@ packages: resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/types@8.26.1': resolution: {integrity: sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10189,6 +10339,15 @@ packages: typescript: optional: true + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/typescript-estree@6.21.0': resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -10207,6 +10366,15 @@ packages: typescript: optional: true + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/typescript-estree@8.26.1': resolution: {integrity: sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10219,6 +10387,12 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/utils@6.21.0': resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -10231,6 +10405,12 @@ packages: peerDependencies: eslint: ^8.56.0 + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + '@typescript-eslint/utils@8.26.1': resolution: {integrity: sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10242,6 +10422,10 @@ packages: resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/visitor-keys@6.21.0': resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} engines: {node: ^16.0.0 || >=18.0.0} @@ -10250,6 +10434,10 @@ packages: resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/visitor-keys@8.26.1': resolution: {integrity: sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10811,6 +10999,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + acorn@8.14.1: resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} engines: {node: '>=0.4.0'} @@ -11674,6 +11867,10 @@ packages: resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==} engines: {node: '>=10.0.0'} + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + builtin-modules@4.0.0: resolution: {integrity: sha512-p1n8zyCkt1BVrKNFymOHjcDSAl7oq/gUvfgULv2EblgpPVQlQr9yHnWjg9IJ2MhfwPqiYqMMrr01OY7yQoK2yA==} engines: {node: '>=18.20'} @@ -13507,6 +13704,17 @@ packages: peerDependencies: eslint: '>=7.0.0' + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-config-turbo@1.13.4: + resolution: {integrity: sha512-+we4eWdZlmlEn7LnhXHCIPX/wtujbHCS7XjQM/TN09BHNEl2fZ8id4rHfdfUKIYTSKyy8U/nNyJ0DNoZj5Q8bw==} + peerDependencies: + eslint: '>6.6.0' + eslint-config-turbo@2.4.4: resolution: {integrity: sha512-4w/heWywWkFw09a5MY5lCvb9suJlhBSkzNtGTwM5+zRif4rksubaMYy1pD0++5rqoDVcQax25jCrtii9ptsNDw==} peerDependencies: @@ -13561,12 +13769,43 @@ packages: eslint-import-resolver-webpack: optional: true + eslint-module-utils@2.8.1: + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + eslint-plugin-es-x@7.8.0: resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' + eslint-plugin-import@2.29.1: + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint-plugin-import@2.31.0: resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} engines: {node: '>=4'} @@ -13600,6 +13839,25 @@ packages: jest: optional: true + eslint-plugin-jest@28.6.0: + resolution: {integrity: sha512-YG28E1/MIKwnz+e2H7VwYPzHUYU4aMa19w0yGcwXnnmJH6EfgHahTJ2un3IyraUxNfnz/KUhJAFXNNwWPo12tg==} + engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^6.0.0 || ^7.0.0 + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + + eslint-plugin-jsonc@2.16.0: + resolution: {integrity: sha512-Af/ZL5mgfb8FFNleH6KlO4/VdmDuTqmM+SPnWcdoWywTetv7kq+vQe99UyQb9XO3b0OWLVuTH7H0d/PXYCMdSg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + eslint-plugin-jsonc@2.19.1: resolution: {integrity: sha512-MmlAOaZK1+Lg7YoCZPGRjb88ZjT+ct/KTsvcsbZdBm+w8WMzGx+XEmexk0m40P1WV9G2rFV7X3klyRGRpFXEjA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -13642,27 +13900,53 @@ packages: peerDependencies: eslint: '>=8' + eslint-plugin-storybook@0.8.0: + resolution: {integrity: sha512-CZeVO5EzmPY7qghO2t64oaFM+8FTaD4uzOEjHKp516exyTKo+skKAL9GI3QALS2BXhyALJjNtwbmr1XinGE8bA==} + engines: {node: '>= 18'} + peerDependencies: + eslint: '>=6' + eslint-plugin-tailwindcss@3.18.0: resolution: {integrity: sha512-PQDU4ZMzFH0eb2DrfHPpbgo87Zgg2EXSMOj1NSfzdZm+aJzpuwGerfowMIaVehSREEa0idbf/eoNYAOHSJoDAQ==} engines: {node: '>=18.12.0'} peerDependencies: tailwindcss: ^3.4.0 + eslint-plugin-testing-library@6.5.0: + resolution: {integrity: sha512-Ls5TUfLm5/snocMAOlofSOJxNN0aKqwTlco7CrNtMjkTdQlkpSMaeTCDHCuXfzrI97xcx2rSCNeKeJjtpkNC1w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} + peerDependencies: + eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 + eslint-plugin-testing-library@7.1.1: resolution: {integrity: sha512-nszC833aZPwB6tik1nMkbFqmtgIXTT0sfJEYs0zMBKMlkQ4to2079yUV96SvmLh00ovSBJI4pgcBC1TiIP8mXg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0, pnpm: ^9.14.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 + eslint-plugin-tsdoc@0.3.0: + resolution: {integrity: sha512-0MuFdBrrJVBjT/gyhkP2BqpD0np1NxNLfQ38xXDlSs/KVVpKI2A6vN7jx2Rve/CyUsvOsMGwp9KKrinv7q9g3A==} + eslint-plugin-tsdoc@0.4.0: resolution: {integrity: sha512-MT/8b4aKLdDClnS8mP3R/JNjg29i0Oyqd/0ym6NnQf+gfKbJJ4ZcSh2Bs1H0YiUMTBwww5JwXGTWot/RwyJ7aQ==} + eslint-plugin-turbo@1.13.4: + resolution: {integrity: sha512-82GfMzrewI/DJB92Bbch239GWbGx4j1zvjk1lqb06lxIlMPnVwUHVwPbAnLfyLG3JuhLv9whxGkO/q1CL18JTg==} + peerDependencies: + eslint: '>6.6.0' + eslint-plugin-turbo@2.4.4: resolution: {integrity: sha512-myEnQTjr3FkI0j1Fu0Mqnv1z8n0JW5iFTOUNzHaEevjzl+1uzMSsFwks/x8i3rGmI3EYtC1BY8K2B2pS0Vfx6w==} peerDependencies: eslint: '>6.6.0' turbo: '>2.0.0' + eslint-plugin-unicorn@53.0.0: + resolution: {integrity: sha512-kuTcNo9IwwUCfyHGwQFOK/HjJAYzbODHN3wP0PgqbW+jbXqpNWxNVpVhj2tO9SixBwuAdmal8rVcWKBxwFnGuw==} + engines: {node: '>=18.18'} + peerDependencies: + eslint: '>=8.56.0' + eslint-plugin-unicorn@57.0.0: resolution: {integrity: sha512-zUYYa6zfNdTeG9BISWDlcLmz16c+2Ck2o5ZDHh0UzXJz3DEP7xjmlVDTzbyV0W+XksgZ0q37WEWzN2D2Ze+g9Q==} engines: {node: '>=18.18'} @@ -15208,6 +15492,10 @@ packages: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + is-builtin-module@4.0.0: resolution: {integrity: sha512-rWP3AMAalQSesXO8gleROyL2iKU73SX5Er66losQn9rWOWL4Gef0a/xOEOVqjWGMuR2vHG3FJ8UUmT700O8oFg==} engines: {node: '>=18.20'} @@ -15816,6 +16104,10 @@ packages: canvas: optional: true + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + jsesc@3.0.2: resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} engines: {node: '>=6'} @@ -17030,8 +17322,26 @@ packages: next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - next@15.2.2: - resolution: {integrity: sha512-dgp8Kcx5XZRjMw2KNwBtUzhngRaURPioxoNIVl5BOyJbhi9CUgEtKDO7fx5wh8Z8vOVX1nYZ9meawJoRrlASYA==} + next@14.2.15: + resolution: {integrity: sha512-h9ctmOokpoDphRvMGnwOJAedT6zKhwqyZML9mDtspgf4Rh3Pn7UTYKqePNoDvhsWBAO5GoPNYshnAUGIazVGmw==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + sass: + optional: true + + next@15.1.2: + resolution: {integrity: sha512-nLJDV7peNy+0oHlmY2JZjzMfJ8Aj0/dd3jCwSZS8ZiO5nkQfcZRqDrRN3U5rJtqVTQneIOGZzb6LCNrk7trMCQ==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -17272,21 +17582,18 @@ packages: resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} engines: {node: '>=6.5.0', npm: '>=3'} - nuqs@2.4.1: - resolution: {integrity: sha512-u6sngTspqDe3jWHtcmqHQg3dl35niizCZAsm5gy7PBlgG2rwl71Dp2QUv5hwBaWKI9qz0wqILZY86TsRxq66SQ==} + nuqs@2.1.2: + resolution: {integrity: sha512-WL9Qb6Pn8JPLCTE04l0CaRjeVrEdybEuLuc7IMS/H6HJnxjO2f63i1sd6HkU3ntEY6rc05M1PL8/ZRvdBC7pgw==} peerDependencies: - '@remix-run/react': '>=2' - next: '>=14.2.0' - react: '>=18.2.0 || ^19.0.0-0' - react-router: ^6 || ^7 - react-router-dom: ^6 || ^7 + '@remix-run/react': '>= 2' + next: '>= 14.2.0' + react: '>= 18.2.0' + react-router-dom: '>= 6' peerDependenciesMeta: '@remix-run/react': optional: true next: optional: true - react-router: - optional: true react-router-dom: optional: true @@ -18486,6 +18793,9 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + react-is@18.1.0: + resolution: {integrity: sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==} + react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} @@ -18784,6 +19094,10 @@ packages: regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + regjsparser@0.12.0: resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} hasBin: true @@ -19037,17 +19351,17 @@ packages: peerDependencies: '@solana/web3.js': ^1.44.3 - sass-loader@14.2.1: - resolution: {integrity: sha512-G0VcnMYU18a4N7VoNDegg2OuMjYtxnqzQWARVWCIVSZwJeiL9kg8QMsuIZOplsJgTzZLF6jGxI3AClj8I9nRdQ==} - engines: {node: '>= 18.12.0'} + sass-loader@13.3.3: + resolution: {integrity: sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==} + engines: {node: '>= 14.15.0'} peerDependencies: - '@rspack/core': 0.x || 1.x + fibers: '>= 3.1.0' node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 sass: ^1.3.0 sass-embedded: '*' webpack: ^5.0.0 peerDependenciesMeta: - '@rspack/core': + fibers: optional: true node-sass: optional: true @@ -19055,8 +19369,6 @@ packages: optional: true sass-embedded: optional: true - webpack: - optional: true sass-loader@16.0.5: resolution: {integrity: sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==} @@ -19735,6 +20047,19 @@ packages: react-dom: '>= 16.8.0' react-is: '>= 16.8.0' + styled-jsx@5.1.1: + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -19955,12 +20280,13 @@ packages: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + tdigest@0.1.2: resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} - telejson@7.2.0: - resolution: {integrity: sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==} - temp-dir@1.0.0: resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} engines: {node: '>=4'} @@ -20497,6 +20823,16 @@ packages: typescript-compare@0.0.2: resolution: {integrity: sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==} + typescript-eslint@7.18.0: + resolution: {integrity: sha512-PonBkP603E3tt05lDkbOMyaxJjvKqQrXsnow72sVeOFINDE/qNmnnd+f9b4N+U7W6MXnnYyrhtmF2t08QWwUbA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + typescript-eslint@8.26.1: resolution: {integrity: sha512-t/oIs9mYyrwZGRpDv3g+3K6nZ5uhKEMt2oNmAPwaY4/ye0+EH4nXIPYNtkYFS6QHm+1DFg34DbglYBz5P9Xysg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -22411,6 +22747,14 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/eslint-parser@7.26.10(@babel/core@7.25.8)(eslint@9.22.0(jiti@1.21.0))': + dependencies: + '@babel/core': 7.25.8 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 9.22.0(jiti@1.21.0) + eslint-visitor-keys: 2.1.0 + semver: 6.3.1 + '@babel/generator@7.26.10': dependencies: '@babel/parser': 7.26.10 @@ -23259,6 +23603,8 @@ snapshots: '@balena/dockerignore@1.0.2': {} + '@base2/pretty-print-object@1.0.1': {} + '@bcoe/v8-coverage@0.2.3': {} '@bonfida/sns-records@0.0.1(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))': @@ -24191,7 +24537,7 @@ snapshots: - supports-color - utf-8-validate - '@cprussin/jest-config@1.4.1(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(@opentelemetry/api@1.9.0)(@types/node@22.8.2)(babel-jest@29.7.0(@babel/core@7.25.8))(bufferutil@4.0.8)(eslint@9.13.0(jiti@1.21.0))(sass@1.80.7)(ts-node@10.9.2(@types/node@22.8.2)(typescript@5.6.3))(utf-8-validate@5.0.10)': + '@cprussin/jest-runner-prettier@1.0.0(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(prettier@3.5.3)': dependencies: create-lite-jest-runner: 1.1.2(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2))) emphasize: 5.0.0 @@ -24497,6 +24843,10 @@ snapshots: '@eslint-community/regexpp@4.12.1': {} + '@eslint/compat@1.2.7(eslint@9.22.0(jiti@1.21.0))': + optionalDependencies: + eslint: 9.22.0(jiti@1.21.0) + '@eslint/config-array@0.19.2': dependencies: '@eslint/object-schema': 2.1.6 @@ -27028,7 +27378,7 @@ snapshots: '@matterlabs/hardhat-zksync-solc': 1.2.6(encoding@0.1.13)(hardhat@2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.13.10)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3)) chai: 4.5.0 chalk: 4.1.2 - ethers: 6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ethers: 6.13.4(bufferutil@4.0.7)(utf-8-validate@6.0.3) fs-extra: 11.3.0 glob: 10.4.5 hardhat: 2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.13.10)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3) @@ -27153,7 +27503,7 @@ snapshots: chalk: 4.1.2 compare-versions: 6.1.1 ethereumjs-util: 7.1.5 - ethers: 6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ethers: 6.13.4(bufferutil@4.0.7)(utf-8-validate@6.0.3) fs-extra: 11.3.0 hardhat: 2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.13.10)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3) proper-lockfile: 4.1.2 @@ -27203,11 +27553,11 @@ snapshots: '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.13.10)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3)) '@openzeppelin/upgrades-core': 1.42.1 chai: 4.5.0 - ethers: 6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ethers: 6.13.4(bufferutil@4.0.7)(utf-8-validate@6.0.3) hardhat: 2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.13.10)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3) sinon: 18.0.1 sinon-chai: 3.7.0(chai@4.5.0)(sinon@18.0.1) - zksync-ethers: 6.16.1(ethers@6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3)) + zksync-ethers: 6.16.1(ethers@6.13.4(bufferutil@4.0.7)(utf-8-validate@6.0.3)) transitivePeerDependencies: - bufferutil - c-kzg @@ -27393,6 +27743,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@microsoft/tsdoc-config@0.17.0': + dependencies: + '@microsoft/tsdoc': 0.15.0 + ajv: 8.12.0 + jju: 1.4.0 + resolve: 1.22.10 + '@microsoft/tsdoc-config@0.17.1': dependencies: '@microsoft/tsdoc': 0.15.1 @@ -27400,6 +27757,8 @@ snapshots: jju: 1.4.0 resolve: 1.22.10 + '@microsoft/tsdoc@0.15.0': {} + '@microsoft/tsdoc@0.15.1': {} '@mobily/ts-belt@3.13.1': {} @@ -27647,12 +28006,18 @@ snapshots: transitivePeerDependencies: - encoding - '@next/env@15.2.2': {} + '@next/env@14.2.15': {} + + '@next/env@15.1.2': {} '@next/eslint-plugin-next@14.2.24': dependencies: glob: 10.3.10 + '@next/eslint-plugin-next@15.2.2': + dependencies: + fast-glob: 3.3.1 + '@next/swc-darwin-arm64@14.2.15': optional: true @@ -27704,9 +28069,9 @@ snapshots: '@next/swc-win32-x64-msvc@15.1.2': optional: true - '@next/third-parties@14.2.6(next@15.1.2(@babel/core@7.25.8)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.80.7))(react@19.0.0)': + '@next/third-parties@15.0.2(next@15.1.2(@babel/core@7.25.8)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0)': dependencies: - next: 15.1.2(@babel/core@7.25.8)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.80.7) + next: 15.1.2(@babel/core@7.25.8)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) react: 19.0.0 third-party-capital: 1.0.20 @@ -27750,6 +28115,10 @@ snapshots: jsbi: 3.2.5 sha.js: 2.4.11 + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + dependencies: + eslint-scope: 5.1.1 + '@noble/ciphers@1.2.1': {} '@noble/curves@1.2.0': @@ -27866,7 +28235,7 @@ snapshots: '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3))(hardhat@2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.13.10)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3))': dependencies: debug: 4.4.0(supports-color@8.1.1) - ethers: 6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ethers: 6.13.4(bufferutil@4.0.7)(utf-8-validate@6.0.3) hardhat: 2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.13.10)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3) lodash.isequal: 4.5.0 transitivePeerDependencies: @@ -32582,6 +32951,7 @@ snapshots: - '@rspack/core' - '@swc/core' - esbuild + - supports-color - uglify-js - webpack-cli @@ -32665,6 +33035,7 @@ snapshots: babel-loader: 9.2.1(@babel/core@7.26.10)(webpack@5.98.0(esbuild@0.25.1)) css-loader: 6.11.0(webpack@5.98.0(esbuild@0.25.1)) find-up: 5.0.0 + fs-extra: 11.3.0 image-size: 1.2.0 loader-utils: 3.3.1 next: 15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) @@ -32694,6 +33065,7 @@ snapshots: - '@types/webpack' - babel-plugin-macros - esbuild + - fibers - node-sass - sass - sass-embedded @@ -32717,6 +33089,7 @@ snapshots: '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.2)(webpack@5.98.0(esbuild@0.25.1)) '@types/semver': 7.5.8 find-up: 5.0.0 + fs-extra: 11.3.0 magic-string: 0.30.17 react: 19.0.0 react-docgen: 7.1.1 @@ -32777,6 +33150,7 @@ snapshots: '@storybook/test@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.3))': dependencies: + '@storybook/csf': 0.1.11 '@storybook/global': 5.0.0 '@storybook/instrumenter': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.3)) '@testing-library/dom': 10.4.0 @@ -32972,6 +33346,11 @@ snapshots: dependencies: tslib: 2.8.1 + '@swc/helpers@0.5.5': + dependencies: + '@swc/counter': 0.1.3 + tslib: 2.8.1 + '@szmarczak/http-timer@4.0.6': dependencies: defer-to-connect: 2.0.1 @@ -34091,6 +34470,8 @@ snapshots: '@types/doctrine@0.0.9': {} + '@types/escodegen@0.0.6': {} + '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 @@ -34105,6 +34486,8 @@ snapshots: dependencies: '@types/estree': 1.0.6 + '@types/estree@0.0.51': {} + '@types/estree@1.0.6': {} '@types/ethereum-protocol@1.0.5': @@ -34146,7 +34529,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.14.15 + '@types/node': 18.19.80 '@types/hast@2.3.10': dependencies: @@ -34536,6 +34919,11 @@ snapshots: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + '@typescript-eslint/scope-manager@6.21.0': dependencies: '@typescript-eslint/types': 6.21.0 @@ -34546,6 +34934,11 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 + '@typescript-eslint/scope-manager@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + '@typescript-eslint/scope-manager@8.26.1': dependencies: '@typescript-eslint/types': 8.26.1 @@ -34612,10 +35005,14 @@ snapshots: '@typescript-eslint/types@5.62.0': {} + '@typescript-eslint/types@5.62.0': {} + '@typescript-eslint/types@6.21.0': {} '@typescript-eslint/types@7.18.0': {} + '@typescript-eslint/types@7.18.0': {} + '@typescript-eslint/types@8.26.1': {} '@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5)': @@ -34646,6 +35043,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.8.2)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.4.0(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.7.1 + tsutils: 3.21.0(typescript@5.8.2) + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.8.2)': dependencies: '@typescript-eslint/types': 6.21.0 @@ -34676,6 +35087,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.8.2)': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.0(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 1.3.0(typescript@5.8.2) + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/typescript-estree@8.26.1(typescript@5.8.2)': dependencies: '@typescript-eslint/types': 8.26.1 @@ -34720,6 +35146,21 @@ snapshots: - supports-color - typescript + '@typescript-eslint/utils@5.62.0(eslint@9.22.0(jiti@1.21.0))(typescript@5.8.2)': + dependencies: + '@eslint-community/eslint-utils': 4.5.1(eslint@9.22.0(jiti@1.21.0)) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.2) + eslint: 9.22.0(jiti@1.21.0) + eslint-scope: 5.1.1 + semver: 7.7.1 + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/utils@6.21.0(eslint@8.56.0)(typescript@5.8.2)': dependencies: '@eslint-community/eslint-utils': 4.5.1(eslint@8.56.0) @@ -34761,6 +35202,11 @@ snapshots: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 + '@typescript-eslint/visitor-keys@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + '@typescript-eslint/visitor-keys@6.21.0': dependencies: '@typescript-eslint/types': 6.21.0 @@ -34771,6 +35217,11 @@ snapshots: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 + '@typescript-eslint/visitor-keys@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + eslint-visitor-keys: 3.4.3 + '@typescript-eslint/visitor-keys@8.26.1': dependencies: '@typescript-eslint/types': 8.26.1 @@ -36021,6 +36472,10 @@ snapshots: dependencies: acorn: 8.14.1 + acorn-jsx@5.3.2(acorn@7.4.1): + dependencies: + acorn: 7.4.1 + acorn-jsx@5.3.2(acorn@8.14.1): dependencies: acorn: 8.14.1 @@ -36031,6 +36486,8 @@ snapshots: acorn@7.1.1: {} + acorn@7.4.1: {} + acorn@8.14.1: {} add-stream@1.0.0: {} @@ -37094,6 +37551,8 @@ snapshots: buildcheck@0.0.6: optional: true + builtin-modules@3.3.0: {} + builtin-modules@4.0.0: {} builtin-status-codes@3.0.0: {} @@ -39523,6 +39982,11 @@ snapshots: - supports-color - typescript + eslint-plugin-tsdoc@0.3.0: + dependencies: + '@microsoft/tsdoc': 0.15.0 + '@microsoft/tsdoc-config': 0.17.0 + eslint-plugin-tsdoc@0.4.0: dependencies: '@microsoft/tsdoc': 0.15.1 @@ -41926,6 +42390,10 @@ snapshots: is-buffer@2.0.5: {} + is-builtin-module@3.2.1: + dependencies: + builtin-modules: 3.3.0 + is-builtin-module@4.0.0: dependencies: builtin-modules: 4.0.0 @@ -43054,7 +43522,7 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 20.14.15 + '@types/node': 18.19.80 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -43294,6 +43762,8 @@ snapshots: - supports-color - utf-8-validate + jsesc@0.5.0: {} + jsesc@3.0.2: {} jsesc@3.1.0: {} @@ -44931,7 +45401,7 @@ snapshots: '@next/env': 14.2.15 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001669 + caniuse-lite: 1.0.30001704 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 @@ -44948,12 +45418,12 @@ snapshots: '@next/swc-win32-ia32-msvc': 14.2.15 '@next/swc-win32-x64-msvc': 14.2.15 '@opentelemetry/api': 1.9.0 - sass: 1.80.7 + sass: 1.85.1 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - next@15.1.2(@babel/core@7.25.8)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@19.0.0))(react@19.0.0)(sass@1.80.7): + next@15.1.2(@babel/core@7.25.8)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1): dependencies: '@next/env': 15.1.2 '@swc/counter': 0.1.3 @@ -44974,7 +45444,7 @@ snapshots: '@next/swc-win32-arm64-msvc': 15.1.2 '@next/swc-win32-x64-msvc': 15.1.2 '@opentelemetry/api': 1.9.0 - sass: 1.80.7 + sass: 1.85.1 sharp: 0.33.5 transitivePeerDependencies: - '@babel/core' @@ -46396,7 +46866,7 @@ snapshots: '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 '@types/node': 20.14.15 - long: 5.2.3 + long: 5.3.1 protocols@2.0.2: {} @@ -46810,6 +47280,8 @@ snapshots: react-is@17.0.2: {} + react-is@18.1.0: {} + react-is@18.3.1: {} react-lifecycles-compat@3.0.4: {} @@ -47249,6 +47721,10 @@ snapshots: regjsgen@0.8.0: {} + regjsparser@0.10.0: + dependencies: + jsesc: 0.5.0 + regjsparser@0.12.0: dependencies: jsesc: 3.0.2 @@ -47573,6 +48049,7 @@ snapshots: sass-loader@14.2.1(sass@1.85.1)(webpack@5.98.0(esbuild@0.25.1)): dependencies: neo-async: 2.6.2 + webpack: 5.91.0(esbuild@0.24.0) optionalDependencies: sass: 1.85.1 webpack: 5.98.0(esbuild@0.25.1) @@ -48829,11 +49306,7 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 - tdigest@0.1.2: - dependencies: - bintrees: 1.0.2 - - telejson@7.2.0: + tar@7.4.3: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -48842,6 +49315,10 @@ snapshots: mkdirp: 3.0.1 yallist: 5.0.0 + tdigest@0.1.2: + dependencies: + bintrees: 1.0.2 + temp-dir@1.0.0: {} terser-webpack-plugin@5.3.14(esbuild@0.25.1)(webpack@5.98.0(esbuild@0.25.1)): @@ -51543,9 +52020,9 @@ snapshots: dependencies: ethers: 5.8.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) - zksync-ethers@6.16.1(ethers@6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3)): + zksync-ethers@6.16.1(ethers@6.13.4(bufferutil@4.0.7)(utf-8-validate@6.0.3)): dependencies: - ethers: 6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ethers: 6.13.4(bufferutil@4.0.7)(utf-8-validate@6.0.3) zksync-web3@0.13.4(ethers@5.8.0(bufferutil@4.0.7)(utf-8-validate@6.0.3)): dependencies: From e55be6db2e22d6199072efa2b786f4e8144e4ea2 Mon Sep 17 00:00:00 2001 From: Daniel Chew Date: Tue, 18 Mar 2025 14:39:19 +0900 Subject: [PATCH 03/18] feat: add wallet balance metrics and alerts; update price feed metrics --- apps/price_pusher/alerts.yml | 18 + apps/price_pusher/grafana-dashboard.json | 538 +++++++++++++++--- .../price-config.stable.sample.yaml | 2 +- apps/price_pusher/src/controller.ts | 46 +- apps/price_pusher/src/evm/command.ts | 8 +- apps/price_pusher/src/metrics.ts | 41 +- 6 files changed, 550 insertions(+), 103 deletions(-) diff --git a/apps/price_pusher/alerts.yml b/apps/price_pusher/alerts.yml index 651262ef83..a441e4a1a0 100644 --- a/apps/price_pusher/alerts.yml +++ b/apps/price_pusher/alerts.yml @@ -45,3 +45,21 @@ groups: annotations: summary: "High update duration" description: "Price updates are taking longer than 5 seconds on average" + + - alert: WalletBalanceLow + expr: pyth_wallet_balance < 0.1 + for: 5m + labels: + severity: warning + annotations: + summary: "Wallet balance is getting low" + description: "Wallet {{ $labels.wallet_address }} on network {{ $labels.network }} has balance below 0.1 native tokens" + + - alert: WalletBalanceCritical + expr: pyth_wallet_balance < 0.01 + for: 2m + labels: + severity: critical + annotations: + summary: "Wallet balance critically low" + description: "Wallet {{ $labels.wallet_address }} on network {{ $labels.network }} has balance below 0.01 native tokens. Transactions may fail soon!" diff --git a/apps/price_pusher/grafana-dashboard.json b/apps/price_pusher/grafana-dashboard.json index 0633b3e37f..608ffc5a86 100644 --- a/apps/price_pusher/grafana-dashboard.json +++ b/apps/price_pusher/grafana-dashboard.json @@ -20,7 +20,6 @@ "graphTooltip": 0, "id": 1, "links": [], - "liveNow": false, "panels": [ { "datasource": { @@ -30,37 +29,7 @@ "fieldConfig": { "defaults": { "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } + "mode": "thresholds" }, "mappings": [], "thresholds": { @@ -69,38 +38,103 @@ { "color": "green", "value": null - }, - { - "color": "red", - "value": 3600 } ] }, - "unit": "s" + "unit": "none" }, "overrides": [] }, "gridPos": { "h": 8, - "w": 12, + "w": 6, "x": 0, "y": 0 }, - "id": 1, + "id": 9, "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false }, - "tooltip": { - "mode": "single", - "sort": "none" + "showPercentChange": false, + "textMode": "value", + "wideLayout": true + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "pyth_price_feeds_total", + "instant": true, + "range": false, + "refId": "A" } + ], + "title": "Configured Price Feeds", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" }, - "title": "Time Since Last Update", - "type": "timeseries", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 6, + "y": 0 + }, + "id": 12, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "value", + "wideLayout": true + }, + "pluginVersion": "11.5.2", "targets": [ { "datasource": { @@ -108,12 +142,14 @@ "uid": "prometheus" }, "editorMode": "code", - "expr": "time() - pyth_price_last_published_time", - "legendFormat": "{{alias}}", - "range": true, + "expr": "count(pyth_price_last_published_time)", + "instant": true, + "range": false, "refId": "A" } - ] + ], + "title": "Active Price Feeds", + "type": "stat" }, { "datasource": { @@ -155,16 +191,19 @@ "graphMode": "area", "justifyMode": "auto", "orientation": "auto", + "percentChangeColorMode": "standard", "reduceOptions": { - "calcs": ["lastNotNull"], + "calcs": [ + "lastNotNull" + ], "fields": "", "values": false }, - "textMode": "auto" + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true }, - "pluginVersion": "10.0.0", - "title": "Time Since Last Update (Stat)", - "type": "stat", + "pluginVersion": "11.5.2", "targets": [ { "datasource": { @@ -173,11 +212,227 @@ }, "editorMode": "code", "expr": "time() - pyth_price_last_published_time", + "instant": true, "legendFormat": "{{alias}}", - "range": true, + "range": false, "refId": "A" } - ] + ], + "title": "Time Since Last Update (Stat)", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Time Since Update" + }, + "properties": [ + { + "id": "unit", + "value": "s" + }, + { + "id": "thresholds", + "value": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 600 + }, + { + "color": "red", + "value": 3600 + } + ] + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total Updates" + }, + "properties": [ + { + "id": "unit", + "value": "short" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 7, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [ + { + "desc": false, + "displayName": "Price ID" + } + ] + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "pyth_price_last_published_time", + "format": "table", + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "time() - pyth_price_last_published_time", + "format": "table", + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "pyth_price_updates_total", + "format": "table", + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "C" + } + ], + "title": "Price Feeds List", + "transformations": [ + { + "id": "joinByField", + "options": { + "byField": "price_id", + "mode": "outer" + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true, + "Value #A": true, + "__name__": true, + "__name__#B": true, + "__name__#C": true, + "alias 2": true, + "alias 3": true, + "alias#B": true, + "alias#C": true, + "app": true, + "app#B": true, + "app#C": true, + "instance": true, + "instance#B": true, + "instance#C": true, + "job": true, + "job#B": true, + "job#C": true, + "price_id": false, + "price_id#B": true, + "price_id#C": true + }, + "includeByName": {}, + "indexByName": { + "Time 1": 4, + "Time 2": 10, + "Time 3": 15, + "Value #A": 9, + "Value #B": 2, + "Value #C": 3, + "__name__ 1": 5, + "__name__ 2": 16, + "alias 1": 1, + "alias 2": 11, + "alias 3": 17, + "app 1": 6, + "app 2": 12, + "app 3": 18, + "instance 1": 7, + "instance 2": 13, + "instance 3": 19, + "job 1": 8, + "job 2": 14, + "job 3": 20, + "price_id": 0 + }, + "renameByName": { + "Value #B": "Time Since Update", + "Value #C": "Total Updates", + "alias": "Symbol", + "alias 1": "Symbol", + "price_id": "Price ID" + } + } + } + ], + "type": "table" }, { "datasource": { @@ -190,11 +445,13 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", @@ -203,6 +460,7 @@ "tooltip": false, "viz": false }, + "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, @@ -219,6 +477,7 @@ "mode": "off" } }, + "decimals": 0, "mappings": [], "thresholds": { "mode": "absolute", @@ -228,14 +487,15 @@ "value": null } ] - } + }, + "unit": "none" }, "overrides": [] }, "gridPos": { "h": 8, "w": 12, - "x": 0, + "x": 12, "y": 8 }, "id": 3, @@ -247,12 +507,12 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "single", "sort": "none" } }, - "title": "Price Updates (Last Hour)", - "type": "timeseries", + "pluginVersion": "11.5.2", "targets": [ { "datasource": { @@ -265,7 +525,83 @@ "range": true, "refId": "A" } - ] + ], + "title": "Price Updates (Last Hour)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 0.1 + }, + { + "color": "red", + "value": 0.01 + } + ] + }, + "unit": "locale" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 10, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "pyth_wallet_balance", + "instant": true, + "legendFormat": "{{wallet_address}}", + "range": false, + "refId": "A" + } + ], + "title": "Wallet Balance", + "type": "stat" }, { "datasource": { @@ -278,11 +614,13 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", @@ -291,6 +629,7 @@ "tooltip": false, "viz": false }, + "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, @@ -317,7 +656,7 @@ } ] }, - "unit": "s" + "unit": "locale" }, "overrides": [] }, @@ -325,9 +664,9 @@ "h": 8, "w": 12, "x": 12, - "y": 8 + "y": 16 }, - "id": 4, + "id": 11, "options": { "legend": { "calcs": [], @@ -336,12 +675,12 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "single", "sort": "none" } }, - "title": "Average Update Duration", - "type": "timeseries", + "pluginVersion": "11.5.2", "targets": [ { "datasource": { @@ -349,12 +688,14 @@ "uid": "prometheus" }, "editorMode": "code", - "expr": "rate(pyth_price_update_duration_seconds_sum[5m]) / rate(pyth_price_update_duration_seconds_count[5m])", - "legendFormat": "{{alias}}", + "expr": "pyth_wallet_balance", + "legendFormat": "{{wallet_address}} ({{network}})", "range": true, "refId": "A" } - ] + ], + "title": "Wallet Balance Over Time", + "type": "timeseries" }, { "datasource": { @@ -367,11 +708,13 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", @@ -380,6 +723,7 @@ "tooltip": false, "viz": false }, + "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, @@ -396,6 +740,7 @@ "mode": "off" } }, + "decimals": 0, "mappings": [], "thresholds": { "mode": "absolute", @@ -405,7 +750,8 @@ "value": null } ] - } + }, + "unit": "none" }, "overrides": [] }, @@ -413,9 +759,9 @@ "h": 8, "w": 12, "x": 0, - "y": 16 + "y": 24 }, - "id": 5, + "id": 6, "options": { "legend": { "calcs": [], @@ -424,12 +770,12 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "single", "sort": "none" } }, - "title": "Active Price Feeds", - "type": "timeseries", + "pluginVersion": "11.5.2", "targets": [ { "datasource": { @@ -437,12 +783,14 @@ "uid": "prometheus" }, "editorMode": "code", - "expr": "pyth_active_price_feeds", - "legendFormat": "Active Feeds", + "expr": "sum(increase(pyth_price_update_errors_total[5m]))", + "legendFormat": "Errors", "range": true, "refId": "A" } - ] + ], + "title": "Update Errors", + "type": "timeseries" }, { "datasource": { @@ -455,11 +803,13 @@ "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", @@ -468,6 +818,7 @@ "tooltip": false, "viz": false }, + "insertNulls": false, "lineInterpolation": "linear", "lineWidth": 1, "pointSize": 5, @@ -493,7 +844,8 @@ "value": null } ] - } + }, + "unit": "s" }, "overrides": [] }, @@ -501,9 +853,9 @@ "h": 8, "w": 12, "x": 12, - "y": 16 + "y": 24 }, - "id": 6, + "id": 4, "options": { "legend": { "calcs": [], @@ -512,12 +864,12 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "single", "sort": "none" } }, - "title": "Update Errors", - "type": "timeseries", + "pluginVersion": "11.5.2", "targets": [ { "datasource": { @@ -525,17 +877,19 @@ "uid": "prometheus" }, "editorMode": "code", - "expr": "sum(increase(pyth_price_update_errors_total[5m]))", - "legendFormat": "Errors", + "expr": "rate(pyth_price_update_duration_seconds_sum[5m]) / rate(pyth_price_update_duration_seconds_count[5m])", + "legendFormat": "{{alias}}", "range": true, "refId": "A" } - ] + ], + "title": "Average Update Duration", + "type": "timeseries" } ], + "preload": false, "refresh": "5s", - "schemaVersion": 38, - "style": "dark", + "schemaVersion": 40, "tags": [], "templating": { "list": [] @@ -548,6 +902,6 @@ "timezone": "", "title": "Pyth Price Pusher Dashboard", "uid": "pyth-price-pusher", - "version": 1, + "version": 39, "weekStart": "" } diff --git a/apps/price_pusher/price-config.stable.sample.yaml b/apps/price_pusher/price-config.stable.sample.yaml index 3f33e19d00..c63bb9400d 100644 --- a/apps/price_pusher/price-config.stable.sample.yaml +++ b/apps/price_pusher/price-config.stable.sample.yaml @@ -13,7 +13,7 @@ price_deviation: 0.5 confidence_ratio: 0.1 - alias: PYTH/USD - id: 2f95862b045670cd22bee3114c39763a4a08beeb663b145d283c31d7d1101c23 + id: 0bbf28e9a841a1cc788f6a361b17ca072d0ea3098a1e5df1c3922d06719579ff time_difference: 60 price_deviation: 0.5 confidence_ratio: 1 diff --git a/apps/price_pusher/src/controller.ts b/apps/price_pusher/src/controller.ts index 9e26b7e677..62f6ca26f4 100644 --- a/apps/price_pusher/src/controller.ts +++ b/apps/price_pusher/src/controller.ts @@ -4,10 +4,20 @@ import { IPriceListener, IPricePusher } from "./interface"; import { PriceConfig, shouldUpdate, UpdateCondition } from "./price-config"; import { Logger } from "pino"; import { PricePusherMetrics } from "./metrics"; +import { SuperWalletClient } from "./evm/super-wallet"; + +// Define the wallet balance info interface +interface WalletBalanceInfo { + client: SuperWalletClient; + address: string; + network: string; + updateInterval: DurationInSeconds; +} export class Controller { private pushingFrequency: DurationInSeconds; private metrics?: PricePusherMetrics; + private walletBalanceInfo?: WalletBalanceInfo; constructor( private priceConfigs: PriceConfig[], @@ -18,14 +28,36 @@ export class Controller { config: { pushingFrequency: DurationInSeconds; metrics?: PricePusherMetrics; + walletBalanceInfo?: WalletBalanceInfo; } ) { this.pushingFrequency = config.pushingFrequency; this.metrics = config.metrics; + this.walletBalanceInfo = config.walletBalanceInfo; - // Set the number of active price feeds if metrics are enabled + // Set the number of price feeds if metrics are enabled if (this.metrics) { - this.metrics.setActivePriceFeeds(this.priceConfigs.length); + this.metrics.setPriceFeedsTotal(this.priceConfigs.length); + } + } + + // Get wallet balance and update metrics + private async updateWalletBalance(): Promise { + if (!this.metrics || !this.walletBalanceInfo) return; + + try { + const { client, address, network } = this.walletBalanceInfo; + const balance = await client.getBalance({ address: address as `0x${string}` }); + + this.metrics.updateWalletBalance(address, network, balance); + this.logger.debug( + `Updated wallet balance: ${address} = ${balance.toString()}` + ); + } catch (error) { + this.logger.error( + { error }, + "Error fetching wallet balance for metrics" + ); } } @@ -34,6 +66,11 @@ export class Controller { await this.sourcePriceListener.start(); await this.targetPriceListener.start(); + // Update wallet balance initially if metrics are enabled + if (this.metrics && this.walletBalanceInfo) { + await this.updateWalletBalance(); + } + // wait for the listeners to get updated. There could be a restart // before this run and we need to respect the cooldown duration as // their might be a message sent before. @@ -46,6 +83,11 @@ export class Controller { const pricesToPush: PriceConfig[] = []; const pubTimesToPush: UnixTimestamp[] = []; + // Update wallet balance if metrics are enabled + if (this.metrics && this.walletBalanceInfo) { + await this.updateWalletBalance(); + } + for (const priceConfig of this.priceConfigs) { const priceId = priceConfig.id; const alias = priceConfig.alias; diff --git a/apps/price_pusher/src/evm/command.ts b/apps/price_pusher/src/evm/command.ts index 10c2878035..9db543a2a6 100644 --- a/apps/price_pusher/src/evm/command.ts +++ b/apps/price_pusher/src/evm/command.ts @@ -199,9 +199,15 @@ export default { { pushingFrequency, metrics, + walletBalanceInfo: metrics ? { + client, + address: client.account.address, + network: await client.getChainId().then(id => id.toString()), + updateInterval: pushingFrequency + } : undefined } ); - controller.start(); + await controller.start(); }, }; diff --git a/apps/price_pusher/src/metrics.ts b/apps/price_pusher/src/metrics.ts index 71b65f5746..e580c6c678 100644 --- a/apps/price_pusher/src/metrics.ts +++ b/apps/price_pusher/src/metrics.ts @@ -13,9 +13,11 @@ export class PricePusherMetrics { public lastPublishedTime: Gauge; public priceUpdatesTotal: Counter; public priceUpdateDuration: Histogram; - public activePriceFeeds: Gauge; + public priceFeedsTotal: Gauge; public priceUpdateErrors: Counter; public priceUpdateAttempts: Counter; + // Wallet metrics + public walletBalance: Gauge; constructor(logger: Logger) { this.logger = logger; @@ -48,9 +50,9 @@ export class PricePusherMetrics { registers: [this.registry], }); - this.activePriceFeeds = new Gauge({ - name: "pyth_active_price_feeds", - help: "Number of active price feeds being monitored", + this.priceFeedsTotal = new Gauge({ + name: "pyth_price_feeds_total", + help: "Total number of price feeds being monitored", registers: [this.registry], }); @@ -68,6 +70,14 @@ export class PricePusherMetrics { registers: [this.registry], }); + // Wallet balance metric + this.walletBalance = new Gauge({ + name: "pyth_wallet_balance", + help: "Current wallet balance of the price pusher in native token units", + labelNames: ["wallet_address", "network"], + registers: [this.registry], + }); + // Setup the metrics endpoint this.server.get("/metrics", async (req, res) => { res.set("Content-Type", this.registry.contentType); @@ -117,9 +127,9 @@ export class PricePusherMetrics { }); } - // Set the number of active price feeds - public setActivePriceFeeds(count: number): void { - this.activePriceFeeds.set(count); + // Set the number of price feeds + public setPriceFeedsTotal(count: number): void { + this.priceFeedsTotal.set(count); } // Create a timer for measuring price update duration @@ -130,4 +140,21 @@ export class PricePusherMetrics { }); return end; } + + // Update wallet balance + public updateWalletBalance( + walletAddress: string, + network: string, + balance: bigint | number + ): void { + // Convert to number for compatibility with prometheus + const balanceNum = typeof balance === 'bigint' ? Number(balance) / 1e18 : balance; + this.walletBalance.set( + { wallet_address: walletAddress, network }, + balanceNum + ); + this.logger.debug( + `Updated wallet balance metric: ${walletAddress} = ${balanceNum}` + ); + } } From b007d780303aaf8d2e69b96bf5adc8d06be096fd Mon Sep 17 00:00:00 2001 From: Daniel Chew Date: Tue, 18 Mar 2025 14:58:51 +0900 Subject: [PATCH 04/18] fix; revert pnpm lock --- apps/price_pusher/src/controller.ts | 23 +- apps/price_pusher/src/evm/command.ts | 16 +- apps/price_pusher/src/metrics.ts | 15 +- pnpm-lock.yaml | 1518 ++++++++++---------------- 4 files changed, 596 insertions(+), 976 deletions(-) diff --git a/apps/price_pusher/src/controller.ts b/apps/price_pusher/src/controller.ts index 62f6ca26f4..075cd998bc 100644 --- a/apps/price_pusher/src/controller.ts +++ b/apps/price_pusher/src/controller.ts @@ -29,7 +29,7 @@ export class Controller { pushingFrequency: DurationInSeconds; metrics?: PricePusherMetrics; walletBalanceInfo?: WalletBalanceInfo; - } + }, ) { this.pushingFrequency = config.pushingFrequency; this.metrics = config.metrics; @@ -47,17 +47,16 @@ export class Controller { try { const { client, address, network } = this.walletBalanceInfo; - const balance = await client.getBalance({ address: address as `0x${string}` }); + const balance = await client.getBalance({ + address: address as `0x${string}`, + }); this.metrics.updateWalletBalance(address, network, balance); this.logger.debug( - `Updated wallet balance: ${address} = ${balance.toString()}` + `Updated wallet balance: ${address} = ${balance.toString()}`, ); } catch (error) { - this.logger.error( - { error }, - "Error fetching wallet balance for metrics" - ); + this.logger.error({ error }, "Error fetching wallet balance for metrics"); } } @@ -102,7 +101,7 @@ export class Controller { this.metrics.updateLastPublishedTime( priceId, alias, - targetLatestPrice + targetLatestPrice, ); } @@ -151,14 +150,14 @@ export class Controller { config, timer: this.metrics!.startPriceUpdateTimer( config.id, - config.alias + config.alias, ), })) : []; await this.targetChainPricePusher.updatePriceFeed( priceIds, - pubTimesToPush + pubTimesToPush, ); // Record successful updates and end timers @@ -171,7 +170,7 @@ export class Controller { } catch (error) { this.logger.error( { error, priceIds }, - "Error pushing price updates to chain" + "Error pushing price updates to chain", ); // Record errors in metrics @@ -180,7 +179,7 @@ export class Controller { this.metrics.recordPriceUpdateError( config.id, config.alias, - error instanceof Error ? error.name : "unknown" + error instanceof Error ? error.name : "unknown", ); } } diff --git a/apps/price_pusher/src/evm/command.ts b/apps/price_pusher/src/evm/command.ts index 9db543a2a6..46f96cfb72 100644 --- a/apps/price_pusher/src/evm/command.ts +++ b/apps/price_pusher/src/evm/command.ts @@ -199,13 +199,15 @@ export default { { pushingFrequency, metrics, - walletBalanceInfo: metrics ? { - client, - address: client.account.address, - network: await client.getChainId().then(id => id.toString()), - updateInterval: pushingFrequency - } : undefined - } + walletBalanceInfo: metrics + ? { + client, + address: client.account.address, + network: await client.getChainId().then((id) => id.toString()), + updateInterval: pushingFrequency, + } + : undefined, + }, ); await controller.start(); diff --git a/apps/price_pusher/src/metrics.ts b/apps/price_pusher/src/metrics.ts index e580c6c678..56234acdcc 100644 --- a/apps/price_pusher/src/metrics.ts +++ b/apps/price_pusher/src/metrics.ts @@ -96,11 +96,11 @@ export class PricePusherMetrics { public updateLastPublishedTime( priceId: string, alias: string, - priceInfo: PriceInfo + priceInfo: PriceInfo, ): void { this.lastPublishedTime.set( { price_id: priceId, alias }, - priceInfo.publishTime + priceInfo.publishTime, ); } @@ -118,7 +118,7 @@ export class PricePusherMetrics { public recordPriceUpdateError( priceId: string, alias: string, - errorType: string + errorType: string, ): void { this.priceUpdateErrors.inc({ price_id: priceId, @@ -145,16 +145,17 @@ export class PricePusherMetrics { public updateWalletBalance( walletAddress: string, network: string, - balance: bigint | number + balance: bigint | number, ): void { // Convert to number for compatibility with prometheus - const balanceNum = typeof balance === 'bigint' ? Number(balance) / 1e18 : balance; + const balanceNum = + typeof balance === "bigint" ? Number(balance) / 1e18 : balance; this.walletBalance.set( { wallet_address: walletAddress, network }, - balanceNum + balanceNum, ); this.logger.debug( - `Updated wallet balance metric: ${walletAddress} = ${balanceNum}` + `Updated wallet balance metric: ${walletAddress} = ${balanceNum}`, ); } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8a60db9a9d..d7e36f8344 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,7 +26,7 @@ catalogs: version: 4.0.1 '@cprussin/jest-config': specifier: ^2.0.1 - version: 1.4.1 + version: 2.0.1 '@cprussin/prettier-config': specifier: ^2.2.1 version: 2.2.1 @@ -44,7 +44,7 @@ catalogs: version: 2.2.0 '@next/third-parties': specifier: ^15.2.2 - version: 15.0.2 + version: 15.2.2 '@phosphor-icons/react': specifier: ^2.1.7 version: 2.1.7 @@ -179,13 +179,13 @@ catalogs: version: 12.5.0 next: specifier: ^15.2.2 - version: 15.1.2 + version: 15.2.2 next-themes: specifier: ^0.4.6 version: 0.4.6 nuqs: specifier: ^2.4.1 - version: 2.1.2 + version: 2.4.1 pino: specifier: ^9.6.0 version: 9.6.0 @@ -327,7 +327,7 @@ importers: version: 2.2.0(react@19.0.0) '@next/third-parties': specifier: 'catalog:' - version: 15.2.2(next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0) + version: 15.2.2(next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0) '@pythnetwork/client': specifier: 'catalog:' version: 2.22.1(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) @@ -357,7 +357,7 @@ importers: version: 12.5.0(@emotion/is-prop-valid@1.3.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next: specifier: 'catalog:' - version: 15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) + version: 15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) next-themes: specifier: 'catalog:' version: 0.4.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -394,7 +394,7 @@ importers: version: 4.0.1(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2))(turbo@2.4.4)(typescript@5.8.2) '@cprussin/jest-config': specifier: 'catalog:' - version: 2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@5.0.10) + version: 2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@5.0.10) '@cprussin/prettier-config': specifier: 'catalog:' version: 2.2.1(prettier@3.5.3) @@ -469,7 +469,7 @@ importers: version: 0.482.0(react@19.0.0) next: specifier: 'catalog:' - version: 15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) + version: 15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) react: specifier: 'catalog:' version: 19.0.0 @@ -494,7 +494,7 @@ importers: version: 4.0.1(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2))(turbo@2.4.4)(typescript@5.8.2) '@cprussin/jest-config': specifier: 'catalog:' - version: 2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(esbuild@0.25.1)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@6.0.3) + version: 2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(esbuild@0.25.1)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@6.0.3) '@cprussin/prettier-config': specifier: 'catalog:' version: 2.2.1(prettier@3.5.3) @@ -639,13 +639,13 @@ importers: version: 12.5.0(@emotion/is-prop-valid@1.3.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) next: specifier: 'catalog:' - version: 15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) + version: 15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) next-themes: specifier: 'catalog:' version: 0.4.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0) nuqs: specifier: 'catalog:' - version: 2.4.1(next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0) + version: 2.4.1(next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0) react: specifier: 'catalog:' version: 19.0.0 @@ -676,7 +676,7 @@ importers: version: 4.0.1(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2))(turbo@2.4.4)(typescript@5.8.2) '@cprussin/jest-config': specifier: 'catalog:' - version: 2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@5.0.10) + version: 2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@5.0.10) '@cprussin/prettier-config': specifier: 'catalog:' version: 2.2.1(prettier@3.5.3) @@ -788,6 +788,9 @@ importers: aptos: specifier: ^1.8.5 version: 1.21.0 + express: + specifier: ^4.18.2 + version: 4.21.2 fuels: specifier: ^0.94.5 version: 0.94.9(encoding@0.1.13) @@ -819,6 +822,9 @@ importers: '@types/ethereum-protocol': specifier: ^1.0.2 version: 1.0.5 + '@types/express': + specifier: ^4.17.21 + version: 4.17.21 '@types/jest': specifier: ^27.4.1 version: 27.5.2 @@ -869,7 +875,7 @@ importers: version: 2.2.0(react@19.0.0) '@next/third-parties': specifier: 'catalog:' - version: 15.2.2(next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0) + version: 15.2.2(next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0) '@pythnetwork/hermes-client': specifier: workspace:* version: link:../hermes/client/js @@ -887,13 +893,13 @@ importers: version: 0.9.23(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-react': specifier: 'catalog:' - version: 0.15.35(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) + version: 0.15.35(@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.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) '@solana/wallet-adapter-react-ui': specifier: 'catalog:' - version: 0.9.35(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(react-dom@19.0.0(react@19.0.0))(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) + version: 0.9.35(@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-dom@19.0.0(react@19.0.0))(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) '@solana/wallet-adapter-wallets': specifier: 'catalog:' - version: 0.19.32(@babel/runtime@7.26.10)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.0.0(react@19.0.0))(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0)(tslib@2.8.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.2) + version: 0.19.32(@babel/runtime@7.26.10)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.0.0(react@19.0.0))(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0)(tslib@2.8.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.2) '@solana/web3.js': specifier: 'catalog:' version: 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) @@ -917,7 +923,7 @@ importers: version: 0.2.0 next: specifier: 'catalog:' - version: 15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) + version: 15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) pino: specifier: 'catalog:' version: 9.6.0 @@ -954,7 +960,7 @@ importers: version: 4.0.1(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2))(turbo@2.4.4)(typescript@5.8.2) '@cprussin/jest-config': specifier: 'catalog:' - version: 2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@5.0.10) + version: 2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@5.0.10) '@cprussin/prettier-config': specifier: 'catalog:' version: 2.2.1(prettier@3.5.3) @@ -1178,7 +1184,7 @@ importers: version: 4.0.1(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2))(turbo@2.4.4)(typescript@5.8.2) '@cprussin/jest-config': specifier: 'catalog:' - version: 2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@5.0.10) + version: 2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@5.0.10) '@cprussin/prettier-config': specifier: 'catalog:' version: 2.2.1(prettier@3.5.3) @@ -1461,13 +1467,13 @@ importers: version: 0.9.23(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-react': specifier: 'catalog:' - version: 0.15.35(@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.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) + version: 0.15.35(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) '@solana/wallet-adapter-react-ui': specifier: 'catalog:' - version: 0.9.35(@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-dom@19.0.0(react@19.0.0))(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) + version: 0.9.35(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(react-dom@19.0.0(react@19.0.0))(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) '@solana/wallet-adapter-wallets': specifier: 'catalog:' - version: 0.19.32(@babel/runtime@7.26.10)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.0.0(react@19.0.0))(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0)(tslib@2.8.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.2) + version: 0.19.32(@babel/runtime@7.26.10)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.0.0(react@19.0.0))(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0)(tslib@2.8.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.2) '@solana/web3.js': specifier: ^1.73.0 version: 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) @@ -1491,13 +1497,13 @@ importers: version: link:../../../../pythnet/message_buffer next: specifier: 'catalog:' - version: 15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) + version: 15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) next-seo: specifier: ^5.15.0 - version: 5.15.0(next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + version: 5.15.0(next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) nuqs: specifier: 'catalog:' - version: 2.4.1(next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0) + version: 2.4.1(next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0) react: specifier: 'catalog:' version: 19.0.0 @@ -1666,7 +1672,7 @@ importers: version: 4.0.1(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2))(turbo@2.4.4)(typescript@5.8.2) '@cprussin/jest-config': specifier: 'catalog:' - version: 2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(esbuild@0.25.1)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@6.0.3) + version: 2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(esbuild@0.25.1)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@6.0.3) '@cprussin/prettier-config': specifier: 'catalog:' version: 2.2.1(prettier@3.5.3) @@ -1724,7 +1730,7 @@ importers: version: 4.0.1(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2))(turbo@2.4.4)(typescript@5.8.2) '@cprussin/jest-config': specifier: 'catalog:' - version: 2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(esbuild@0.25.1)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@6.0.3) + version: 2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(esbuild@0.25.1)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@6.0.3) '@cprussin/prettier-config': specifier: 'catalog:' version: 2.2.1(prettier@3.5.3) @@ -1748,7 +1754,7 @@ importers: version: 8.6.7(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.3)) '@storybook/nextjs': specifier: 'catalog:' - version: 8.6.7(esbuild@0.25.1)(next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.3))(type-fest@4.37.0)(typescript@5.8.2)(webpack-hot-middleware@2.26.1)(webpack@5.98.0(esbuild@0.25.1)) + version: 8.6.7(esbuild@0.25.1)(next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.3))(type-fest@4.37.0)(typescript@5.8.2)(webpack-hot-middleware@2.26.1)(webpack@5.98.0(esbuild@0.25.1)) '@storybook/react': specifier: 'catalog:' version: 8.6.7(@storybook/test@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.3)))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.3))(typescript@5.8.2) @@ -1772,7 +1778,7 @@ importers: version: 29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)) next: specifier: 'catalog:' - version: 15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) + version: 15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) postcss: specifier: 'catalog:' version: 8.5.3 @@ -1814,7 +1820,7 @@ importers: version: 4.0.1(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2))(turbo@2.4.4)(typescript@5.8.2) '@cprussin/jest-config': specifier: 'catalog:' - version: 2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(esbuild@0.25.1)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@6.0.3) + version: 2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(esbuild@0.25.1)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@6.0.3) '@cprussin/prettier-config': specifier: 'catalog:' version: 2.2.1(prettier@3.5.3) @@ -1832,7 +1838,7 @@ importers: version: 29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)) next: specifier: 'catalog:' - version: 15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) + version: 15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) prettier: specifier: 'catalog:' version: 3.5.3 @@ -1847,7 +1853,7 @@ importers: version: 4.0.1(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2))(turbo@2.4.4)(typescript@5.8.2) '@cprussin/jest-config': specifier: 'catalog:' - version: 2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(esbuild@0.25.1)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@6.0.3) + version: 2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(esbuild@0.25.1)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@6.0.3) '@cprussin/prettier-config': specifier: 'catalog:' version: 2.2.1(prettier@3.5.3) @@ -1889,7 +1895,7 @@ importers: version: 4.10.1 '@next/third-parties': specifier: 'catalog:' - version: 15.2.2(next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0) + version: 15.2.2(next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0) '@pythnetwork/app-logger': specifier: workspace:* version: link:../app-logger @@ -1908,7 +1914,7 @@ importers: version: 4.0.1(@testing-library/dom@10.4.0)(@typescript-eslint/eslint-plugin@8.26.1(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(@typescript-eslint/parser@8.26.1(eslint@9.22.0(jiti@1.21.7))(typescript@5.8.2))(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2))(turbo@2.4.4)(typescript@5.8.2) '@cprussin/jest-config': specifier: 'catalog:' - version: 2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(esbuild@0.25.1)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@6.0.3) + version: 2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(esbuild@0.25.1)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@6.0.3) '@cprussin/prettier-config': specifier: 'catalog:' version: 2.2.1(prettier@3.5.3) @@ -1932,7 +1938,7 @@ importers: version: 29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)) next: specifier: 'catalog:' - version: 15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) + version: 15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) prettier: specifier: 'catalog:' version: 3.5.3 @@ -2701,7 +2707,7 @@ importers: dependencies: '@certusone/wormhole-sdk': specifier: ^0.9.12 - version: 0.9.24(bufferutil@4.0.9)(encoding@0.1.13)(google-protobuf@3.21.4)(typescript@5.8.2)(utf-8-validate@6.0.3) + version: 0.9.24(bufferutil@4.0.9)(encoding@0.1.13)(google-protobuf@3.21.4)(typescript@5.8.2)(utf-8-validate@5.0.10) '@mysten/sui': specifier: ^1.3.0 version: 1.24.0(typescript@5.8.2) @@ -2710,7 +2716,7 @@ importers: version: link:../../../contract_manager '@pythnetwork/price-service-client': specifier: ^1.4.0 - version: 1.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.3) + version: 1.9.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@pythnetwork/price-service-sdk': specifier: ^1.2.0 version: 1.8.0 @@ -2738,7 +2744,7 @@ importers: dependencies: '@certusone/wormhole-sdk': specifier: ^0.9.12 - version: 0.9.24(bufferutil@4.0.9)(encoding@0.1.13)(google-protobuf@3.21.4)(typescript@5.8.2)(utf-8-validate@6.0.3) + version: 0.9.24(bufferutil@4.0.9)(encoding@0.1.13)(google-protobuf@3.21.4)(typescript@5.8.2)(utf-8-validate@5.0.10) '@iota/iota-sdk': specifier: ^0.5.0 version: 0.5.0(typescript@5.8.2) @@ -2747,7 +2753,7 @@ importers: version: link:../../../contract_manager '@pythnetwork/price-service-client': specifier: ^1.4.0 - version: 1.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.3) + version: 1.9.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@pythnetwork/price-service-sdk': specifier: ^1.2.0 version: 1.8.0 @@ -3279,13 +3285,6 @@ packages: resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} engines: {node: '>=6.9.0'} - '@babel/eslint-parser@7.26.10': - resolution: {integrity: sha512-QsfQZr4AiLpKqn7fz+j7SN+f43z2DZCgGyYbNJ2vJOqKfG4E6MZer1+jqGZqKJaxq/gdO2DC/nUu45+pOL5p2Q==} - engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} - peerDependencies: - '@babel/core': ^7.11.0 - eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - '@babel/generator@7.26.10': resolution: {integrity: sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==} engines: {node: '>=6.9.0'} @@ -3958,9 +3957,6 @@ packages: '@balena/dockerignore@1.0.2': resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} - '@base2/pretty-print-object@1.0.1': - resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} - '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -4144,17 +4140,11 @@ packages: '@cosmology/lcd@0.13.5': resolution: {integrity: sha512-CI8KFsJcgp0RINF8wHpv3Y9yR4Fb9ZnGucyoUICjtX2XT4NVBK+fvZuRFj5TP34km8TpEOb+WV2T7IN/pZsD7Q==} - '@cprussin/eslint-config@3.0.0': - resolution: {integrity: sha512-SwI4V8WBUDDClYjUh5BOwEzByCmtichuR94tvbJSx0JQJDzH9uGrPMazGDzOdhYVchBFsV9pBjPXU4SNfqrcGw==} - '@cprussin/eslint-config@4.0.1': resolution: {integrity: sha512-CNY8kdJqRGvcGls0xuC2d+t1QARVVaQZ40sNJnLByITDwc5iNTkgMPyAQi4x0yGqYAu5z10OjBAYWCbyXmdY3g==} peerDependencies: eslint: ^9.22.0 - '@cprussin/jest-config@1.4.1': - resolution: {integrity: sha512-Ui+oLiRGg3rTnusQCZKN6N+8Tw0nD7AVweIXJBc+VDJyCNufe4K1mapequNphm9JnBrW12HFq4oevnHshcroEw==} - '@cprussin/jest-config@2.0.1': resolution: {integrity: sha512-p5rTSH4gst8dvbwPaibnSpp8Vj7NBbqY70AfYdI8kluYC4F+oGZqjwwBKxZ9WkWnm8NfijbVXc5DimlC7Dt6jA==} peerDependencies: @@ -4601,15 +4591,6 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/compat@1.2.7': - resolution: {integrity: sha512-xvv7hJE32yhegJ8xNAnb62ggiAwTYHBpUCWhRxEj/ksvgDJuSXfoDkBcRYaYNFiJ+jH0IE3K16hd+xXzhBgNbg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^9.10.0 - peerDependenciesMeta: - eslint: - optional: true - '@eslint/config-array@0.19.2': resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5771,9 +5752,6 @@ packages: '@microsoft/tsdoc-config@0.17.1': resolution: {integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==} - '@microsoft/tsdoc@0.15.0': - resolution: {integrity: sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==} - '@microsoft/tsdoc@0.15.1': resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} @@ -5866,11 +5844,8 @@ packages: '@near-js/wallet-account@1.1.1': resolution: {integrity: sha512-NnoJKtogBQ7Qz+AP+LdF70BP8Az6UXQori7OjPqJLMo73bn6lh5Ywvegwd1EB7ZEVe4BRt9+f9QkbU5M8ANfAw==} - '@next/env@14.2.15': - resolution: {integrity: sha512-S1qaj25Wru2dUpcIZMjxeMVSwkt8BK4dmWHHiBuRstcIyOsMapqT4A4jSB6onvqeygkSSmOkyny9VVx8JIGamQ==} - - '@next/env@15.1.2': - resolution: {integrity: sha512-Hm3jIGsoUl6RLB1vzY+dZeqb+/kWPZ+h34yiWxW0dV87l8Im/eMOwpOA+a0L78U0HM04syEjXuRlCozqpwuojQ==} + '@next/env@15.2.2': + resolution: {integrity: sha512-yWgopCfA9XDR8ZH3taB5nRKtKJ1Q5fYsTOuYkzIIoS8TJ0UAUKAGF73JnGszbjk2ufAQDj6mDdgsJAFx5CLtYQ==} '@next/eslint-plugin-next@14.2.24': resolution: {integrity: sha512-FDL3qs+5DML0AJz56DCVr+KnFYivxeAX73En8QbPw9GjJZ6zbfvqDy+HrarHFzbsIASn7y8y5ySJ/lllSruNVQ==} @@ -5878,114 +5853,54 @@ packages: '@next/eslint-plugin-next@15.2.2': resolution: {integrity: sha512-1+BzokFuFQIfLaRxUKf2u5In4xhPV7tUgKcK53ywvFl6+LXHWHpFkcV7VNeKlyQKUotwiq4fy/aDNF9EiUp4RQ==} - '@next/swc-darwin-arm64@14.2.15': - resolution: {integrity: sha512-Rvh7KU9hOUBnZ9TJ28n2Oa7dD9cvDBKua9IKx7cfQQ0GoYUwg9ig31O2oMwH3wm+pE3IkAQ67ZobPfEgurPZIA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@next/swc-darwin-arm64@15.1.2': - resolution: {integrity: sha512-b9TN7q+j5/7+rGLhFAVZiKJGIASuo8tWvInGfAd8wsULjB1uNGRCj1z1WZwwPWzVQbIKWFYqc+9L7W09qwt52w==} + '@next/swc-darwin-arm64@15.2.2': + resolution: {integrity: sha512-HNBRnz+bkZ+KfyOExpUxTMR0Ow8nkkcE6IlsdEa9W/rI7gefud19+Sn1xYKwB9pdCdxIP1lPru/ZfjfA+iT8pw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@14.2.15': - resolution: {integrity: sha512-5TGyjFcf8ampZP3e+FyCax5zFVHi+Oe7sZyaKOngsqyaNEpOgkKB3sqmymkZfowy3ufGA/tUgDPPxpQx931lHg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@next/swc-darwin-x64@15.1.2': - resolution: {integrity: sha512-caR62jNDUCU+qobStO6YJ05p9E+LR0EoXh1EEmyU69cYydsAy7drMcOlUlRtQihM6K6QfvNwJuLhsHcCzNpqtA==} + '@next/swc-darwin-x64@15.2.2': + resolution: {integrity: sha512-mJOUwp7al63tDpLpEFpKwwg5jwvtL1lhRW2fI1Aog0nYCPAhxbJsaZKdoVyPZCy8MYf/iQVNDuk/+i29iLCzIA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@14.2.15': - resolution: {integrity: sha512-3Bwv4oc08ONiQ3FiOLKT72Q+ndEMyLNsc/D3qnLMbtUYTQAmkx9E/JRu0DBpHxNddBmNT5hxz1mYBphJ3mfrrw==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-arm64-gnu@15.1.2': - resolution: {integrity: sha512-fHHXBusURjBmN6VBUtu6/5s7cCeEkuGAb/ZZiGHBLVBXMBy4D5QpM8P33Or8JD1nlOjm/ZT9sEE5HouQ0F+hUA==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-arm64-musl@14.2.15': - resolution: {integrity: sha512-k5xf/tg1FBv/M4CMd8S+JL3uV9BnnRmoe7F+GWC3DxkTCD9aewFRH1s5rJ1zkzDa+Do4zyN8qD0N8c84Hu96FQ==} + '@next/swc-linux-arm64-gnu@15.2.2': + resolution: {integrity: sha512-5ZZ0Zwy3SgMr7MfWtRE7cQWVssfOvxYfD9O7XHM7KM4nrf5EOeqwq67ZXDgo86LVmffgsu5tPO57EeFKRnrfSQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.1.2': - resolution: {integrity: sha512-9CF1Pnivij7+M3G74lxr+e9h6o2YNIe7QtExWq1KUK4hsOLTBv6FJikEwCaC3NeYTflzrm69E5UfwEAbV2U9/g==} + '@next/swc-linux-arm64-musl@15.2.2': + resolution: {integrity: sha512-cgKWBuFMLlJ4TWcFHl1KOaVVUAF8vy4qEvX5KsNd0Yj5mhu989QFCq1WjuaEbv/tO1ZpsQI6h/0YR8bLwEi+nA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@14.2.15': - resolution: {integrity: sha512-kE6q38hbrRbKEkkVn62reLXhThLRh6/TvgSP56GkFNhU22TbIrQDEMrO7j0IcQHcew2wfykq8lZyHFabz0oBrA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-linux-x64-gnu@15.1.2': - resolution: {integrity: sha512-tINV7WmcTUf4oM/eN3Yuu/f8jQ5C6AkueZPKeALs/qfdfX57eNv4Ij7rt0SA6iZ8+fMobVfcFVv664Op0caCCg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-linux-x64-musl@14.2.15': - resolution: {integrity: sha512-PZ5YE9ouy/IdO7QVJeIcyLn/Rc4ml9M2G4y3kCM9MNf1YKvFY4heg3pVa/jQbMro+tP6yc4G2o9LjAz1zxD7tQ==} + '@next/swc-linux-x64-gnu@15.2.2': + resolution: {integrity: sha512-c3kWSOSsVL8rcNBBfOq1+/j2PKs2nsMwJUV4icUxRgGBwUOfppeh7YhN5s79enBQFU+8xRgVatFkhHU1QW7yUA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.1.2': - resolution: {integrity: sha512-jf2IseC4WRsGkzeUw/cK3wci9pxR53GlLAt30+y+B+2qAQxMw6WAC3QrANIKxkcoPU3JFh/10uFfmoMDF9JXKg==} + '@next/swc-linux-x64-musl@15.2.2': + resolution: {integrity: sha512-PXTW9PLTxdNlVYgPJ0equojcq1kNu5NtwcNjRjHAB+/sdoKZ+X8FBu70fdJFadkxFIGekQTyRvPMFF+SOJaQjw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@14.2.15': - resolution: {integrity: sha512-2raR16703kBvYEQD9HNLyb0/394yfqzmIeyp2nDzcPV4yPjqNUG3ohX6jX00WryXz6s1FXpVhsCo3i+g4RUX+g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@next/swc-win32-arm64-msvc@15.1.2': - resolution: {integrity: sha512-wvg7MlfnaociP7k8lxLX4s2iBJm4BrNiNFhVUY+Yur5yhAJHfkS8qPPeDEUH8rQiY0PX3u/P7Q/wcg6Mv6GSAA==} + '@next/swc-win32-arm64-msvc@15.2.2': + resolution: {integrity: sha512-nG644Es5llSGEcTaXhnGWR/aThM/hIaz0jx4MDg4gWC8GfTCp8eDBWZ77CVuv2ha/uL9Ce+nPTfYkSLG67/sHg==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-ia32-msvc@14.2.15': - resolution: {integrity: sha512-fyTE8cklgkyR1p03kJa5zXEaZ9El+kDNM5A+66+8evQS5e/6v0Gk28LqA0Jet8gKSOyP+OTm/tJHzMlGdQerdQ==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@next/swc-win32-x64-msvc@14.2.15': - resolution: {integrity: sha512-SzqGbsLsP9OwKNUG9nekShTwhj6JSB9ZLMWQ8g1gG6hdE5gQLncbnbymrwy2yVmH9nikSLYRYxYMFu78Ggp7/g==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@next/swc-win32-x64-msvc@15.1.2': - resolution: {integrity: sha512-D3cNA8NoT3aWISWmo7HF5Eyko/0OdOO+VagkoJuiTk7pyX3P/b+n8XA/MYvyR+xSVcbKn68B1rY9fgqjNISqzQ==} + '@next/swc-win32-x64-msvc@15.2.2': + resolution: {integrity: sha512-52nWy65S/R6/kejz3jpvHAjZDPKIbEQu4x9jDBzmB9jJfuOy5rspjKu4u77+fI4M/WzLXrrQd57hlFGzz1ubcQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@next/third-parties@15.0.2': - resolution: {integrity: sha512-Ohlh0KKfag3Vrx+yuSMJ/fSoCVvRoVG9wRiz8jvYelmg+l0970d41VoGzF2UeKwh9s5qXVRDVqiN/mIeiJ4iLg==} - peerDependencies: - next: ^13.0.0 || ^14.0.0 || ^15.0.0 - react: ^18.2.0 || 19.0.0-rc-02c0e824-20241028 - '@next/third-parties@15.2.2': resolution: {integrity: sha512-MLytjU67N5HdIq0Ch8kSB7EGL9JWZaT8C4YzSzjWRTXbf67G3m9Om+ziKqItEnkUNWZeYRzdn1VsDCpcUaIUwg==} peerDependencies: @@ -5995,9 +5910,6 @@ packages: '@ngraveio/bc-ur@1.1.13': resolution: {integrity: sha512-j73akJMV4+vLR2yQ4AphPIT5HZmxVjn/LxpL7YHoINnXoH6ccc90Zzck6/n6a3bCXOVZwBxq+YHwbAKRV+P8Zg==} - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} - '@noble/ciphers@1.2.1': resolution: {integrity: sha512-rONPWMC7PeExE077uLE4oqWrZ1IvAfz3oH9LibVAcVCopJiA9R62uavnbEzdkVmJYI6M6Zgkbeb07+tWjlq2XA==} engines: {node: ^14.21.3 || >=16} @@ -9073,7 +8985,7 @@ packages: resolution: {integrity: sha512-YIp6ILreXGxfN0je3yGaphY1wrKYQTX2gGyCsEwLi8QSO3g0Up89snDLE2KJ4zgDbXLojxqjTuMwQ5G8KteAUg==} engines: {node: '>=18.0.0'} peerDependencies: - next: ^13.5.0 || ^14.0.0 + next: ^13.5.0 || ^14.0.0 || ^15.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta storybook: ^8.6.7 @@ -9298,9 +9210,6 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@swc/helpers@0.5.5': - resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} - '@szmarczak/http-timer@4.0.6': resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} @@ -9889,9 +9798,6 @@ packages: '@types/doctrine@0.0.9': resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} - '@types/escodegen@0.0.6': - resolution: {integrity: sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==} - '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -9901,9 +9807,6 @@ packages: '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - '@types/estree@0.0.51': - resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} - '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -10169,17 +10072,6 @@ packages: typescript: optional: true - '@typescript-eslint/eslint-plugin@7.18.0': - resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/eslint-plugin@8.26.1': resolution: {integrity: sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10218,16 +10110,6 @@ packages: typescript: optional: true - '@typescript-eslint/parser@7.18.0': - resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/parser@8.26.1': resolution: {integrity: sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10239,10 +10121,6 @@ packages: resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/scope-manager@5.62.0': - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/scope-manager@6.21.0': resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} engines: {node: ^16.0.0 || >=18.0.0} @@ -10251,10 +10129,6 @@ packages: resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@7.18.0': - resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} - engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@8.26.1': resolution: {integrity: sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10289,16 +10163,6 @@ packages: typescript: optional: true - '@typescript-eslint/type-utils@7.18.0': - resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/type-utils@8.26.1': resolution: {integrity: sha512-Kcj/TagJLwoY/5w9JGEFV0dclQdyqw9+VMndxOJKtoFSjfZhLXhYjzsQEeyza03rwHx2vFEGvrJWJBXKleRvZg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10310,10 +10174,6 @@ packages: resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/types@5.62.0': - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/types@6.21.0': resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} engines: {node: ^16.0.0 || >=18.0.0} @@ -10322,10 +10182,6 @@ packages: resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@7.18.0': - resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} - engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@8.26.1': resolution: {integrity: sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10339,15 +10195,6 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@5.62.0': - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/typescript-estree@6.21.0': resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -10366,15 +10213,6 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@7.18.0': - resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/typescript-estree@8.26.1': resolution: {integrity: sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10387,12 +10225,6 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@typescript-eslint/utils@5.62.0': - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@typescript-eslint/utils@6.21.0': resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -10405,12 +10237,6 @@ packages: peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/utils@7.18.0': - resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - '@typescript-eslint/utils@8.26.1': resolution: {integrity: sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10422,10 +10248,6 @@ packages: resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/visitor-keys@5.62.0': - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/visitor-keys@6.21.0': resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} engines: {node: ^16.0.0 || >=18.0.0} @@ -10434,10 +10256,6 @@ packages: resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@7.18.0': - resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} - engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@8.26.1': resolution: {integrity: sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10999,11 +10817,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.14.1: resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} engines: {node: '>=0.4.0'} @@ -11867,10 +11680,6 @@ packages: resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==} engines: {node: '>=10.0.0'} - builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - builtin-modules@4.0.0: resolution: {integrity: sha512-p1n8zyCkt1BVrKNFymOHjcDSAl7oq/gUvfgULv2EblgpPVQlQr9yHnWjg9IJ2MhfwPqiYqMMrr01OY7yQoK2yA==} engines: {node: '>=18.20'} @@ -13704,17 +13513,6 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - - eslint-config-turbo@1.13.4: - resolution: {integrity: sha512-+we4eWdZlmlEn7LnhXHCIPX/wtujbHCS7XjQM/TN09BHNEl2fZ8id4rHfdfUKIYTSKyy8U/nNyJ0DNoZj5Q8bw==} - peerDependencies: - eslint: '>6.6.0' - eslint-config-turbo@2.4.4: resolution: {integrity: sha512-4w/heWywWkFw09a5MY5lCvb9suJlhBSkzNtGTwM5+zRif4rksubaMYy1pD0++5rqoDVcQax25jCrtii9ptsNDw==} peerDependencies: @@ -13769,43 +13567,12 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-module-utils@2.8.1: - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - eslint-plugin-es-x@7.8.0: resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '>=8' - eslint-plugin-import@2.29.1: - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint-plugin-import@2.31.0: resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} engines: {node: '>=4'} @@ -13839,25 +13606,6 @@ packages: jest: optional: true - eslint-plugin-jest@28.6.0: - resolution: {integrity: sha512-YG28E1/MIKwnz+e2H7VwYPzHUYU4aMa19w0yGcwXnnmJH6EfgHahTJ2un3IyraUxNfnz/KUhJAFXNNwWPo12tg==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^6.0.0 || ^7.0.0 - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - jest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - jest: - optional: true - - eslint-plugin-jsonc@2.16.0: - resolution: {integrity: sha512-Af/ZL5mgfb8FFNleH6KlO4/VdmDuTqmM+SPnWcdoWywTetv7kq+vQe99UyQb9XO3b0OWLVuTH7H0d/PXYCMdSg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '>=6.0.0' - eslint-plugin-jsonc@2.19.1: resolution: {integrity: sha512-MmlAOaZK1+Lg7YoCZPGRjb88ZjT+ct/KTsvcsbZdBm+w8WMzGx+XEmexk0m40P1WV9G2rFV7X3klyRGRpFXEjA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -13900,53 +13648,27 @@ packages: peerDependencies: eslint: '>=8' - eslint-plugin-storybook@0.8.0: - resolution: {integrity: sha512-CZeVO5EzmPY7qghO2t64oaFM+8FTaD4uzOEjHKp516exyTKo+skKAL9GI3QALS2BXhyALJjNtwbmr1XinGE8bA==} - engines: {node: '>= 18'} - peerDependencies: - eslint: '>=6' - eslint-plugin-tailwindcss@3.18.0: resolution: {integrity: sha512-PQDU4ZMzFH0eb2DrfHPpbgo87Zgg2EXSMOj1NSfzdZm+aJzpuwGerfowMIaVehSREEa0idbf/eoNYAOHSJoDAQ==} engines: {node: '>=18.12.0'} peerDependencies: tailwindcss: ^3.4.0 - eslint-plugin-testing-library@6.5.0: - resolution: {integrity: sha512-Ls5TUfLm5/snocMAOlofSOJxNN0aKqwTlco7CrNtMjkTdQlkpSMaeTCDHCuXfzrI97xcx2rSCNeKeJjtpkNC1w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} - peerDependencies: - eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - eslint-plugin-testing-library@7.1.1: resolution: {integrity: sha512-nszC833aZPwB6tik1nMkbFqmtgIXTT0sfJEYs0zMBKMlkQ4to2079yUV96SvmLh00ovSBJI4pgcBC1TiIP8mXg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0, pnpm: ^9.14.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - eslint-plugin-tsdoc@0.3.0: - resolution: {integrity: sha512-0MuFdBrrJVBjT/gyhkP2BqpD0np1NxNLfQ38xXDlSs/KVVpKI2A6vN7jx2Rve/CyUsvOsMGwp9KKrinv7q9g3A==} - eslint-plugin-tsdoc@0.4.0: resolution: {integrity: sha512-MT/8b4aKLdDClnS8mP3R/JNjg29i0Oyqd/0ym6NnQf+gfKbJJ4ZcSh2Bs1H0YiUMTBwww5JwXGTWot/RwyJ7aQ==} - eslint-plugin-turbo@1.13.4: - resolution: {integrity: sha512-82GfMzrewI/DJB92Bbch239GWbGx4j1zvjk1lqb06lxIlMPnVwUHVwPbAnLfyLG3JuhLv9whxGkO/q1CL18JTg==} - peerDependencies: - eslint: '>6.6.0' - eslint-plugin-turbo@2.4.4: resolution: {integrity: sha512-myEnQTjr3FkI0j1Fu0Mqnv1z8n0JW5iFTOUNzHaEevjzl+1uzMSsFwks/x8i3rGmI3EYtC1BY8K2B2pS0Vfx6w==} peerDependencies: eslint: '>6.6.0' turbo: '>2.0.0' - eslint-plugin-unicorn@53.0.0: - resolution: {integrity: sha512-kuTcNo9IwwUCfyHGwQFOK/HjJAYzbODHN3wP0PgqbW+jbXqpNWxNVpVhj2tO9SixBwuAdmal8rVcWKBxwFnGuw==} - engines: {node: '>=18.18'} - peerDependencies: - eslint: '>=8.56.0' - eslint-plugin-unicorn@57.0.0: resolution: {integrity: sha512-zUYYa6zfNdTeG9BISWDlcLmz16c+2Ck2o5ZDHh0UzXJz3DEP7xjmlVDTzbyV0W+XksgZ0q37WEWzN2D2Ze+g9Q==} engines: {node: '>=18.18'} @@ -15492,10 +15214,6 @@ packages: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} - is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - is-builtin-module@4.0.0: resolution: {integrity: sha512-rWP3AMAalQSesXO8gleROyL2iKU73SX5Er66losQn9rWOWL4Gef0a/xOEOVqjWGMuR2vHG3FJ8UUmT700O8oFg==} engines: {node: '>=18.20'} @@ -16104,10 +15822,6 @@ packages: canvas: optional: true - jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - jsesc@3.0.2: resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} engines: {node: '>=6'} @@ -17322,26 +17036,8 @@ packages: next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - next@14.2.15: - resolution: {integrity: sha512-h9ctmOokpoDphRvMGnwOJAedT6zKhwqyZML9mDtspgf4Rh3Pn7UTYKqePNoDvhsWBAO5GoPNYshnAUGIazVGmw==} - engines: {node: '>=18.17.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - sass: - optional: true - - next@15.1.2: - resolution: {integrity: sha512-nLJDV7peNy+0oHlmY2JZjzMfJ8Aj0/dd3jCwSZS8ZiO5nkQfcZRqDrRN3U5rJtqVTQneIOGZzb6LCNrk7trMCQ==} + next@15.2.2: + resolution: {integrity: sha512-dgp8Kcx5XZRjMw2KNwBtUzhngRaURPioxoNIVl5BOyJbhi9CUgEtKDO7fx5wh8Z8vOVX1nYZ9meawJoRrlASYA==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: @@ -17582,18 +17278,21 @@ packages: resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} engines: {node: '>=6.5.0', npm: '>=3'} - nuqs@2.1.2: - resolution: {integrity: sha512-WL9Qb6Pn8JPLCTE04l0CaRjeVrEdybEuLuc7IMS/H6HJnxjO2f63i1sd6HkU3ntEY6rc05M1PL8/ZRvdBC7pgw==} + nuqs@2.4.1: + resolution: {integrity: sha512-u6sngTspqDe3jWHtcmqHQg3dl35niizCZAsm5gy7PBlgG2rwl71Dp2QUv5hwBaWKI9qz0wqILZY86TsRxq66SQ==} peerDependencies: - '@remix-run/react': '>= 2' - next: '>= 14.2.0' - react: '>= 18.2.0' - react-router-dom: '>= 6' + '@remix-run/react': '>=2' + next: '>=14.2.0' + react: '>=18.2.0 || ^19.0.0-0' + react-router: ^6 || ^7 + react-router-dom: ^6 || ^7 peerDependenciesMeta: '@remix-run/react': optional: true next: optional: true + react-router: + optional: true react-router-dom: optional: true @@ -18793,9 +18492,6 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-is@18.1.0: - resolution: {integrity: sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==} - react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} @@ -19094,10 +18790,6 @@ packages: regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - regjsparser@0.10.0: - resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} - hasBin: true - regjsparser@0.12.0: resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} hasBin: true @@ -19351,17 +19043,17 @@ packages: peerDependencies: '@solana/web3.js': ^1.44.3 - sass-loader@13.3.3: - resolution: {integrity: sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==} - engines: {node: '>= 14.15.0'} + sass-loader@14.2.1: + resolution: {integrity: sha512-G0VcnMYU18a4N7VoNDegg2OuMjYtxnqzQWARVWCIVSZwJeiL9kg8QMsuIZOplsJgTzZLF6jGxI3AClj8I9nRdQ==} + engines: {node: '>= 18.12.0'} peerDependencies: - fibers: '>= 3.1.0' + '@rspack/core': 0.x || 1.x node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 sass: ^1.3.0 sass-embedded: '*' webpack: ^5.0.0 peerDependenciesMeta: - fibers: + '@rspack/core': optional: true node-sass: optional: true @@ -19369,6 +19061,8 @@ packages: optional: true sass-embedded: optional: true + webpack: + optional: true sass-loader@16.0.5: resolution: {integrity: sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==} @@ -20047,19 +19741,6 @@ packages: react-dom: '>= 16.8.0' react-is: '>= 16.8.0' - styled-jsx@5.1.1: - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true - styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -20823,16 +20504,6 @@ packages: typescript-compare@0.0.2: resolution: {integrity: sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==} - typescript-eslint@7.18.0: - resolution: {integrity: sha512-PonBkP603E3tt05lDkbOMyaxJjvKqQrXsnow72sVeOFINDE/qNmnnd+f9b4N+U7W6MXnnYyrhtmF2t08QWwUbA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - typescript-eslint@8.26.1: resolution: {integrity: sha512-t/oIs9mYyrwZGRpDv3g+3K6nZ5uhKEMt2oNmAPwaY4/ye0+EH4nXIPYNtkYFS6QHm+1DFg34DbglYBz5P9Xysg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -22747,14 +22418,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/eslint-parser@7.26.10(@babel/core@7.25.8)(eslint@9.22.0(jiti@1.21.0))': - dependencies: - '@babel/core': 7.25.8 - '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 9.22.0(jiti@1.21.0) - eslint-visitor-keys: 2.1.0 - semver: 6.3.1 - '@babel/generator@7.26.10': dependencies: '@babel/parser': 7.26.10 @@ -23603,8 +23266,6 @@ snapshots: '@balena/dockerignore@1.0.2': {} - '@base2/pretty-print-object@1.0.1': {} - '@bcoe/v8-coverage@0.2.3': {} '@bonfida/sns-records@0.0.1(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))': @@ -23716,7 +23377,7 @@ snapshots: near-api-js: 1.1.0(encoding@0.1.13) optionalDependencies: '@injectivelabs/networks': 1.10.12(google-protobuf@3.21.4) - '@injectivelabs/sdk-ts': 1.10.72(@types/react@19.0.10)(bufferutil@4.0.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(utf-8-validate@5.0.10) + '@injectivelabs/sdk-ts': 1.10.72(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@injectivelabs/utils': 1.10.12(google-protobuf@3.21.4) transitivePeerDependencies: - '@types/react' @@ -23792,45 +23453,7 @@ snapshots: near-api-js: 1.1.0(encoding@0.1.13) optionalDependencies: '@injectivelabs/networks': 1.10.12(google-protobuf@3.21.4) - '@injectivelabs/sdk-ts': 1.10.72(@types/react@19.0.10)(bufferutil@4.0.9)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(utf-8-validate@5.0.10) - '@injectivelabs/utils': 1.10.12(google-protobuf@3.21.4) - transitivePeerDependencies: - - '@types/react' - - bufferutil - - debug - - encoding - - fastestsmallesttextencoderdecoder - - google-protobuf - - graphql-ws - - react - - react-dom - - subscriptions-transport-ws - - typescript - - utf-8-validate - - '@certusone/wormhole-sdk@0.9.24(bufferutil@4.0.9)(encoding@0.1.13)(google-protobuf@3.21.4)(typescript@5.8.2)(utf-8-validate@6.0.3)': - dependencies: - '@certusone/wormhole-sdk-proto-web': 0.0.6(google-protobuf@3.21.4) - '@certusone/wormhole-sdk-wasm': 0.0.1 - '@coral-xyz/borsh': 0.2.6(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@6.0.3)) - '@mysten/sui.js': 0.32.2(bufferutil@4.0.9)(utf-8-validate@6.0.3) - '@project-serum/anchor': 0.25.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@6.0.3) - '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@6.0.3))(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.2)(utf-8-validate@6.0.3) - '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@6.0.3) - '@terra-money/terra.js': 3.1.9 - '@xpla/xpla.js': 0.2.3 - algosdk: 2.11.0 - aptos: 1.5.0 - axios: 0.24.0 - bech32: 2.0.0 - binary-parser: 2.2.1 - bs58: 4.0.1 - elliptic: 6.6.1 - js-base64: 3.7.7 - near-api-js: 1.1.0(encoding@0.1.13) - optionalDependencies: - '@injectivelabs/networks': 1.10.12(google-protobuf@3.21.4) - '@injectivelabs/sdk-ts': 1.10.72(bufferutil@4.0.9)(utf-8-validate@6.0.3) + '@injectivelabs/sdk-ts': 1.10.72(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@injectivelabs/utils': 1.10.12(google-protobuf@3.21.4) transitivePeerDependencies: - '@types/react' @@ -24007,12 +23630,6 @@ snapshots: bn.js: 5.2.1 buffer-layout: 1.2.2 - '@coral-xyz/borsh@0.2.6(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@6.0.3))': - dependencies: - '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@6.0.3) - bn.js: 5.2.1 - buffer-layout: 1.2.2 - '@coral-xyz/borsh@0.27.0(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@6.0.3))': dependencies: '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@6.0.3) @@ -24192,17 +23809,6 @@ snapshots: - bufferutil - utf-8-validate - '@cosmjs/socket@0.30.1(bufferutil@4.0.9)(utf-8-validate@6.0.3)': - dependencies: - '@cosmjs/stream': 0.30.1 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@6.0.3)) - ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@6.0.3) - xstream: 11.14.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - optional: true - '@cosmjs/socket@0.32.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@cosmjs/stream': 0.32.4 @@ -24252,26 +23858,6 @@ snapshots: - debug - utf-8-validate - '@cosmjs/stargate@0.30.1(bufferutil@4.0.9)(utf-8-validate@6.0.3)': - dependencies: - '@confio/ics23': 0.6.8 - '@cosmjs/amino': 0.30.1 - '@cosmjs/encoding': 0.30.1 - '@cosmjs/math': 0.30.1 - '@cosmjs/proto-signing': 0.30.1 - '@cosmjs/stream': 0.30.1 - '@cosmjs/tendermint-rpc': 0.30.1(bufferutil@4.0.9)(utf-8-validate@6.0.3) - '@cosmjs/utils': 0.30.1 - cosmjs-types: 0.7.2 - long: 4.0.0 - protobufjs: 6.11.4 - xstream: 11.14.0 - transitivePeerDependencies: - - bufferutil - - debug - - utf-8-validate - optional: true - '@cosmjs/stargate@0.32.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@confio/ics23': 0.6.8 @@ -24349,24 +23935,6 @@ snapshots: - debug - utf-8-validate - '@cosmjs/tendermint-rpc@0.30.1(bufferutil@4.0.9)(utf-8-validate@6.0.3)': - dependencies: - '@cosmjs/crypto': 0.30.1 - '@cosmjs/encoding': 0.30.1 - '@cosmjs/json-rpc': 0.30.1 - '@cosmjs/math': 0.30.1 - '@cosmjs/socket': 0.30.1(bufferutil@4.0.9)(utf-8-validate@6.0.3) - '@cosmjs/stream': 0.30.1 - '@cosmjs/utils': 0.30.1 - axios: 0.21.4(debug@4.3.7) - readonly-date: 1.0.0 - xstream: 11.14.0 - transitivePeerDependencies: - - bufferutil - - debug - - utf-8-validate - optional: true - '@cosmjs/tendermint-rpc@0.32.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@cosmjs/crypto': 0.32.4 @@ -24485,7 +24053,7 @@ snapshots: - turbo - typescript - '@cprussin/jest-config@2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(esbuild@0.25.1)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@6.0.3)': + '@cprussin/jest-config@2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(esbuild@0.25.1)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@6.0.3)': dependencies: '@cprussin/jest-runner-prettier': 1.0.0(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(prettier@3.5.3) '@testing-library/jest-dom': 6.6.3 @@ -24496,7 +24064,7 @@ snapshots: ts-jest: 29.2.6(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.25.1)(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(typescript@5.8.2) typescript: 5.8.2 optionalDependencies: - next: 15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) + next: 15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) transitivePeerDependencies: - '@babel/core' - '@jest/test-result' @@ -24511,7 +24079,7 @@ snapshots: - supports-color - utf-8-validate - '@cprussin/jest-config@2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@5.0.10)': + '@cprussin/jest-config@2.0.1(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(bufferutil@4.0.9)(eslint@9.22.0(jiti@1.21.7))(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(prettier@3.5.3)(typescript@5.8.2)(utf-8-validate@5.0.10)': dependencies: '@cprussin/jest-runner-prettier': 1.0.0(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(prettier@3.5.3) '@testing-library/jest-dom': 6.6.3 @@ -24522,7 +24090,7 @@ snapshots: ts-jest: 29.2.6(@babel/core@7.26.10)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.10))(esbuild@0.25.1)(jest@29.7.0(@types/node@22.13.10)(ts-node@10.9.2(@types/node@22.13.10)(typescript@5.8.2)))(typescript@5.8.2) typescript: 5.8.2 optionalDependencies: - next: 15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) + next: 15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) transitivePeerDependencies: - '@babel/core' - '@jest/test-result' @@ -24843,10 +24411,6 @@ snapshots: '@eslint-community/regexpp@4.12.1': {} - '@eslint/compat@1.2.7(eslint@9.22.0(jiti@1.21.0))': - optionalDependencies: - eslint: 9.22.0(jiti@1.21.0) - '@eslint/config-array@0.19.2': dependencies: '@eslint/object-schema': 2.1.6 @@ -25291,33 +24855,6 @@ snapshots: - bufferutil - utf-8-validate - '@ethersproject/providers@5.7.2(bufferutil@4.0.9)(utf-8-validate@6.0.3)': - dependencies: - '@ethersproject/abstract-provider': 5.8.0 - '@ethersproject/abstract-signer': 5.8.0 - '@ethersproject/address': 5.8.0 - '@ethersproject/base64': 5.8.0 - '@ethersproject/basex': 5.8.0 - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/constants': 5.8.0 - '@ethersproject/hash': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/networks': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/random': 5.8.0 - '@ethersproject/rlp': 5.8.0 - '@ethersproject/sha2': 5.8.0 - '@ethersproject/strings': 5.8.0 - '@ethersproject/transactions': 5.8.0 - '@ethersproject/web': 5.8.0 - bech32: 1.1.4 - ws: 7.4.6(bufferutil@4.0.9)(utf-8-validate@6.0.3) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - optional: true - '@ethersproject/providers@5.8.0(bufferutil@4.0.7)(utf-8-validate@6.0.3)': dependencies: '@ethersproject/abstract-provider': 5.8.0 @@ -25580,6 +25117,17 @@ snapshots: '@ethersproject/properties': 5.8.0 '@ethersproject/strings': 5.8.0 + '@everstake/wallet-sdk-solana@2.0.8(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@solana-program/compute-budget': 0.6.1(@solana/web3.js@2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))) + '@solana-program/stake': 0.1.0(@solana/web3.js@2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))) + '@solana-program/system': 0.6.2(@solana/web3.js@2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))) + '@solana/web3.js': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + - ws + '@everstake/wallet-sdk-solana@2.0.8(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@solana-program/compute-budget': 0.6.1(@solana/web3.js@2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))) @@ -26434,12 +25982,12 @@ snapshots: - utf-8-validate optional: true - '@injectivelabs/sdk-ts@1.10.72(bufferutil@4.0.9)(utf-8-validate@6.0.3)': + '@injectivelabs/sdk-ts@1.10.72(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@apollo/client': 3.13.4(@types/react@19.0.10)(graphql@16.10.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@cosmjs/amino': 0.30.1 '@cosmjs/proto-signing': 0.30.1 - '@cosmjs/stargate': 0.30.1(bufferutil@4.0.9)(utf-8-validate@6.0.3) + '@cosmjs/stargate': 0.30.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@ethersproject/bytes': 5.8.0 '@injectivelabs/core-proto-ts': 0.0.14 '@injectivelabs/exceptions': 1.14.41(google-protobuf@3.21.4) @@ -26458,9 +26006,9 @@ snapshots: bech32: 2.0.0 bip39: 3.1.0 cosmjs-types: 0.7.2 - eth-crypto: 2.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.3) + eth-crypto: 2.7.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) ethereumjs-util: 7.1.5 - ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@6.0.3) + ethers: 5.8.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) google-protobuf: 3.21.4 graphql: 16.10.0 http-status-codes: 2.3.0 @@ -26689,7 +26237,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 20.14.15 + '@types/node': 18.19.80 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -26913,7 +26461,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.15 + '@types/node': 18.19.80 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -26931,7 +26479,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.14.15 + '@types/node': 18.19.80 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -26953,7 +26501,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.14.15 + '@types/node': 18.19.80 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -27378,7 +26926,7 @@ snapshots: '@matterlabs/hardhat-zksync-solc': 1.2.6(encoding@0.1.13)(hardhat@2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.13.10)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3)) chai: 4.5.0 chalk: 4.1.2 - ethers: 6.13.4(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ethers: 6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3) fs-extra: 11.3.0 glob: 10.4.5 hardhat: 2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.13.10)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3) @@ -27503,7 +27051,7 @@ snapshots: chalk: 4.1.2 compare-versions: 6.1.1 ethereumjs-util: 7.1.5 - ethers: 6.13.4(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ethers: 6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3) fs-extra: 11.3.0 hardhat: 2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.13.10)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3) proper-lockfile: 4.1.2 @@ -27553,11 +27101,11 @@ snapshots: '@nomicfoundation/hardhat-verify': 2.0.13(hardhat@2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.13.10)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3)) '@openzeppelin/upgrades-core': 1.42.1 chai: 4.5.0 - ethers: 6.13.4(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ethers: 6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3) hardhat: 2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.13.10)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3) sinon: 18.0.1 sinon-chai: 3.7.0(chai@4.5.0)(sinon@18.0.1) - zksync-ethers: 6.16.1(ethers@6.13.4(bufferutil@4.0.7)(utf-8-validate@6.0.3)) + zksync-ethers: 6.16.1(ethers@6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3)) transitivePeerDependencies: - bufferutil - c-kzg @@ -27743,13 +27291,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@microsoft/tsdoc-config@0.17.0': - dependencies: - '@microsoft/tsdoc': 0.15.0 - ajv: 8.12.0 - jju: 1.4.0 - resolve: 1.22.10 - '@microsoft/tsdoc-config@0.17.1': dependencies: '@microsoft/tsdoc': 0.15.1 @@ -27757,8 +27298,6 @@ snapshots: jju: 1.4.0 resolve: 1.22.10 - '@microsoft/tsdoc@0.15.0': {} - '@microsoft/tsdoc@0.15.1': {} '@mobily/ts-belt@3.13.1': {} @@ -27862,22 +27401,6 @@ snapshots: - bufferutil - utf-8-validate - '@mysten/sui.js@0.32.2(bufferutil@4.0.9)(utf-8-validate@6.0.3)': - dependencies: - '@mysten/bcs': 0.7.1 - '@noble/curves': 1.8.1 - '@noble/hashes': 1.7.1 - '@scure/bip32': 1.6.2 - '@scure/bip39': 1.5.4 - '@suchipi/femver': 1.0.0 - jayson: 4.1.3(bufferutil@4.0.9)(utf-8-validate@6.0.3) - rpc-websockets: 7.11.2 - superstruct: 1.0.4 - tweetnacl: 1.0.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - '@mysten/sui@1.24.0(typescript@5.8.2)': dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.10.0) @@ -28006,9 +27529,7 @@ snapshots: transitivePeerDependencies: - encoding - '@next/env@14.2.15': {} - - '@next/env@15.1.2': {} + '@next/env@15.2.2': {} '@next/eslint-plugin-next@14.2.24': dependencies: @@ -28018,63 +27539,6 @@ snapshots: dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@14.2.15': - optional: true - - '@next/swc-darwin-arm64@15.1.2': - optional: true - - '@next/swc-darwin-x64@14.2.15': - optional: true - - '@next/swc-darwin-x64@15.1.2': - optional: true - - '@next/swc-linux-arm64-gnu@14.2.15': - optional: true - - '@next/swc-linux-arm64-gnu@15.1.2': - optional: true - - '@next/swc-linux-arm64-musl@14.2.15': - optional: true - - '@next/swc-linux-arm64-musl@15.1.2': - optional: true - - '@next/swc-linux-x64-gnu@14.2.15': - optional: true - - '@next/swc-linux-x64-gnu@15.1.2': - optional: true - - '@next/swc-linux-x64-musl@14.2.15': - optional: true - - '@next/swc-linux-x64-musl@15.1.2': - optional: true - - '@next/swc-win32-arm64-msvc@14.2.15': - optional: true - - '@next/swc-win32-arm64-msvc@15.1.2': - optional: true - - '@next/swc-win32-ia32-msvc@14.2.15': - optional: true - - '@next/swc-win32-x64-msvc@14.2.15': - optional: true - - '@next/swc-win32-x64-msvc@15.1.2': - optional: true - - '@next/third-parties@15.0.2(next@15.1.2(@babel/core@7.25.8)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0)': - dependencies: - next: 15.1.2(@babel/core@7.25.8)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) - react: 19.0.0 - third-party-capital: 1.0.20 - '@next/swc-darwin-arm64@15.2.2': optional: true @@ -28099,9 +27563,9 @@ snapshots: '@next/swc-win32-x64-msvc@15.2.2': optional: true - '@next/third-parties@15.2.2(next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0)': + '@next/third-parties@15.2.2(next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0)': dependencies: - next: 15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) + next: 15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) react: 19.0.0 third-party-capital: 1.0.20 @@ -28115,10 +27579,6 @@ snapshots: jsbi: 3.2.5 sha.js: 2.4.11 - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - dependencies: - eslint-scope: 5.1.1 - '@noble/ciphers@1.2.1': {} '@noble/curves@1.2.0': @@ -28235,7 +27695,7 @@ snapshots: '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3))(hardhat@2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.13.10)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3))': dependencies: debug: 4.4.0(supports-color@8.1.1) - ethers: 6.13.4(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ethers: 6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3) hardhat: 2.22.19(bufferutil@4.0.7)(ts-node@10.9.2(@types/node@22.13.10)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@6.0.3) lodash.isequal: 4.5.0 transitivePeerDependencies: @@ -28903,28 +28363,6 @@ snapshots: - encoding - utf-8-validate - '@project-serum/anchor@0.25.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@6.0.3)': - dependencies: - '@project-serum/borsh': 0.2.5(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@6.0.3)) - '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@6.0.3) - base64-js: 1.5.1 - bn.js: 5.2.1 - bs58: 4.0.1 - buffer-layout: 1.2.2 - camelcase: 5.3.1 - cross-fetch: 3.2.0(encoding@0.1.13) - crypto-hash: 1.3.0 - eventemitter3: 4.0.7 - js-sha256: 0.9.0 - pako: 2.1.0 - snake-case: 3.0.4 - superstruct: 0.15.5 - toml: 3.0.0 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - '@project-serum/borsh@0.2.5(@solana/web3.js@1.98.0(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@6.0.3))': dependencies: '@solana/web3.js': 1.98.0(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@6.0.3) @@ -28937,12 +28375,6 @@ snapshots: bn.js: 5.2.1 buffer-layout: 1.2.2 - '@project-serum/borsh@0.2.5(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@6.0.3))': - dependencies: - '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@6.0.3) - bn.js: 5.2.1 - buffer-layout: 1.2.2 - '@project-serum/sol-wallet-adapter@0.2.6(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) @@ -29002,15 +28434,15 @@ snapshots: transitivePeerDependencies: - axios - '@pythnetwork/price-service-client@1.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.3)': + '@pythnetwork/price-service-client@1.9.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)': dependencies: '@pythnetwork/price-service-sdk': 1.8.0 '@types/ws': 8.18.0 axios: 1.8.3(debug@4.4.0) axios-retry: 3.9.1 - isomorphic-ws: 4.0.1(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.3)) + isomorphic-ws: 4.0.1(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) ts-log: 2.2.7 - ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.3) + ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - debug @@ -31137,31 +30569,60 @@ snapshots: - react - react-native + '@solana-program/compute-budget@0.6.1(@solana/web3.js@2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': + dependencies: + '@solana/web3.js': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana-program/compute-budget@0.6.1(@solana/web3.js@2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': dependencies: '@solana/web3.js': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana-program/compute-budget@0.7.0(@solana/kit@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': + dependencies: + '@solana/kit': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana-program/compute-budget@0.7.0(@solana/kit@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': dependencies: '@solana/kit': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana-program/stake@0.1.0(@solana/web3.js@2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': + dependencies: + '@solana/web3.js': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana-program/stake@0.1.0(@solana/web3.js@2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': dependencies: '@solana/web3.js': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana-program/system@0.6.2(@solana/web3.js@2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': + dependencies: + '@solana/web3.js': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana-program/system@0.6.2(@solana/web3.js@2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': dependencies: '@solana/web3.js': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana-program/system@0.7.0(@solana/kit@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': + dependencies: + '@solana/kit': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana-program/system@0.7.0(@solana/kit@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': dependencies: '@solana/kit': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana-program/token-2022@0.4.0(@solana/kit@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2))': + dependencies: + '@solana/kit': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/sysvars': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana-program/token-2022@0.4.0(@solana/kit@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2))': dependencies: '@solana/kit': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@solana/sysvars': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana-program/token@0.5.1(@solana/kit@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': + dependencies: + '@solana/kit': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana-program/token@0.5.1(@solana/kit@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': dependencies: '@solana/kit': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) @@ -31242,17 +30703,6 @@ snapshots: - encoding - utf-8-validate - '@solana/buffer-layout-utils@0.2.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@6.0.3)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@6.0.3) - bigint-buffer: 1.1.5 - bignumber.js: 9.1.2 - transitivePeerDependencies: - - bufferutil - - encoding - - utf-8-validate - '@solana/buffer-layout@4.0.1': dependencies: buffer: 6.0.3 @@ -31425,6 +30875,17 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/codecs@2.0.0-rc.1(typescript@5.8.2)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.8.2) + '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.8.2) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.8.2) + '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/options': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + typescript: 5.8.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/codecs@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)': dependencies: '@solana/codecs-core': 2.1.0(typescript@5.8.2) @@ -31512,6 +30973,31 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/kit@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@solana/accounts': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/addresses': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/codecs': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/errors': 2.1.0(typescript@5.8.2) + '@solana/functional': 2.1.0(typescript@5.8.2) + '@solana/instructions': 2.1.0(typescript@5.8.2) + '@solana/keys': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/programs': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/rpc': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/rpc-parsed-types': 2.1.0(typescript@5.8.2) + '@solana/rpc-spec-types': 2.1.0(typescript@5.8.2) + '@solana/rpc-subscriptions': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/rpc-types': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/signers': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/sysvars': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/transaction-confirmation': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/transaction-messages': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/transactions': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + typescript: 5.8.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - ws + '@solana/kit@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@solana/accounts': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) @@ -31698,6 +31184,15 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/rpc-subscriptions-channel-websocket@2.0.0(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@solana/errors': 2.0.0(typescript@5.8.2) + '@solana/functional': 2.0.0(typescript@5.8.2) + '@solana/rpc-subscriptions-spec': 2.0.0(typescript@5.8.2) + '@solana/subscribable': 2.0.0(typescript@5.8.2) + typescript: 5.8.2 + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/rpc-subscriptions-channel-websocket@2.0.0(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@solana/errors': 2.0.0(typescript@5.8.2) @@ -31707,6 +31202,15 @@ snapshots: typescript: 5.8.2 ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/rpc-subscriptions-channel-websocket@2.1.0(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@solana/errors': 2.1.0(typescript@5.8.2) + '@solana/functional': 2.1.0(typescript@5.8.2) + '@solana/rpc-subscriptions-spec': 2.1.0(typescript@5.8.2) + '@solana/subscribable': 2.1.0(typescript@5.8.2) + typescript: 5.8.2 + ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/rpc-subscriptions-channel-websocket@2.1.0(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@solana/errors': 2.1.0(typescript@5.8.2) @@ -31732,6 +31236,24 @@ snapshots: '@solana/subscribable': 2.1.0(typescript@5.8.2) typescript: 5.8.2 + '@solana/rpc-subscriptions@2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@solana/errors': 2.0.0(typescript@5.8.2) + '@solana/fast-stable-stringify': 2.0.0(typescript@5.8.2) + '@solana/functional': 2.0.0(typescript@5.8.2) + '@solana/promises': 2.0.0(typescript@5.8.2) + '@solana/rpc-spec-types': 2.0.0(typescript@5.8.2) + '@solana/rpc-subscriptions-api': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/rpc-subscriptions-channel-websocket': 2.0.0(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/rpc-subscriptions-spec': 2.0.0(typescript@5.8.2) + '@solana/rpc-transformers': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/rpc-types': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/subscribable': 2.0.0(typescript@5.8.2) + typescript: 5.8.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - ws + '@solana/rpc-subscriptions@2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@solana/errors': 2.0.0(typescript@5.8.2) @@ -31750,6 +31272,24 @@ snapshots: - fastestsmallesttextencoderdecoder - ws + '@solana/rpc-subscriptions@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@solana/errors': 2.1.0(typescript@5.8.2) + '@solana/fast-stable-stringify': 2.1.0(typescript@5.8.2) + '@solana/functional': 2.1.0(typescript@5.8.2) + '@solana/promises': 2.1.0(typescript@5.8.2) + '@solana/rpc-spec-types': 2.1.0(typescript@5.8.2) + '@solana/rpc-subscriptions-api': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/rpc-subscriptions-channel-websocket': 2.1.0(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/rpc-subscriptions-spec': 2.1.0(typescript@5.8.2) + '@solana/rpc-transformers': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/rpc-types': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/subscribable': 2.1.0(typescript@5.8.2) + typescript: 5.8.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - ws + '@solana/rpc-subscriptions@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@solana/errors': 2.1.0(typescript@5.8.2) @@ -31931,20 +31471,12 @@ snapshots: '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(typescript@5.8.2)': dependencies: - '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/codecs': 2.0.0-rc.1(typescript@5.8.2) '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) transitivePeerDependencies: - fastestsmallesttextencoderdecoder - typescript - '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@6.0.3))(typescript@5.8.2)': - dependencies: - '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) - '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@6.0.3) - transitivePeerDependencies: - - fastestsmallesttextencoderdecoder - - typescript - '@solana/spl-token@0.3.11(@solana/web3.js@1.98.0(bufferutil@4.0.7)(encoding@0.1.13)(utf-8-validate@6.0.3))(bufferutil@4.0.7)(encoding@0.1.13)(typescript@4.9.5)(utf-8-validate@6.0.3)': dependencies: '@solana/buffer-layout': 4.0.1 @@ -32001,20 +31533,6 @@ snapshots: - typescript - utf-8-validate - '@solana/spl-token@0.3.11(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@6.0.3))(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.2)(utf-8-validate@6.0.3)': - dependencies: - '@solana/buffer-layout': 4.0.1 - '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@6.0.3) - '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@6.0.3))(typescript@5.8.2) - '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@6.0.3) - buffer: 6.0.3 - transitivePeerDependencies: - - bufferutil - - encoding - - fastestsmallesttextencoderdecoder - - typescript - - utf-8-validate - '@solana/spl-token@0.4.6(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(utf-8-validate@5.0.10)': dependencies: '@solana/buffer-layout': 4.0.1 @@ -32064,6 +31582,23 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/transaction-confirmation@2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@solana/addresses': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/codecs-strings': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/errors': 2.0.0(typescript@5.8.2) + '@solana/keys': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/promises': 2.0.0(typescript@5.8.2) + '@solana/rpc': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/rpc-subscriptions': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/rpc-types': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/transaction-messages': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/transactions': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + typescript: 5.8.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - ws + '@solana/transaction-confirmation@2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@solana/addresses': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) @@ -32081,6 +31616,23 @@ snapshots: - fastestsmallesttextencoderdecoder - ws + '@solana/transaction-confirmation@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@solana/addresses': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/codecs-strings': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/errors': 2.1.0(typescript@5.8.2) + '@solana/keys': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/promises': 2.1.0(typescript@5.8.2) + '@solana/rpc': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/rpc-subscriptions': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/rpc-types': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/transaction-messages': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/transactions': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + typescript: 5.8.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - ws + '@solana/transaction-confirmation@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@solana/addresses': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) @@ -32181,7 +31733,7 @@ snapshots: '@solana/wallet-adapter-base-ui@0.1.2(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0)': dependencies: - '@solana/wallet-adapter-react': 0.15.35(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) + '@solana/wallet-adapter-react': 0.15.35(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) react: 19.0.0 transitivePeerDependencies: @@ -32324,7 +31876,7 @@ snapshots: dependencies: '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-base-ui': 0.1.2(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) - '@solana/wallet-adapter-react': 0.15.35(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) + '@solana/wallet-adapter-react': 0.15.35(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -32354,6 +31906,17 @@ snapshots: - bs58 - react-native + '@solana/wallet-adapter-react@0.15.35(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0)': + dependencies: + '@solana-mobile/wallet-adapter-mobile': 2.1.5(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0) + '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-standard-wallet-adapter-react': 1.1.4(@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@6.0.0)(react@19.0.0) + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) + react: 19.0.0 + transitivePeerDependencies: + - bs58 + - react-native + '@solana/wallet-adapter-safepal@0.5.18(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))': dependencies: '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) @@ -32421,6 +31984,26 @@ snapshots: - supports-color - utf-8-validate + '@solana/wallet-adapter-trezor@0.1.2(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(tslib@2.8.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@trezor/connect-web': 9.5.2(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(tslib@2.8.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + buffer: 6.0.3 + transitivePeerDependencies: + - '@solana/sysvars' + - bufferutil + - encoding + - expo-constants + - expo-localization + - fastestsmallesttextencoderdecoder + - react-native + - supports-color + - tslib + - typescript + - utf-8-validate + - ws + '@solana/wallet-adapter-trezor@0.1.2(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(tslib@2.8.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@solana/wallet-adapter-base': 0.9.23(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) @@ -32483,7 +32066,84 @@ snapshots: - utf-8-validate - zod - '@solana/wallet-adapter-wallets@0.19.32(@babel/runtime@7.26.10)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.0.0(react@19.0.0))(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0)(tslib@2.8.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.2)': + '@solana/wallet-adapter-wallets@0.19.32(@babel/runtime@7.26.10)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.0.0(react@19.0.0))(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0)(tslib@2.8.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.2)': + dependencies: + '@solana/wallet-adapter-alpha': 0.1.10(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-avana': 0.1.13(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-bitkeep': 0.3.20(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-bitpie': 0.5.18(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-clover': 0.4.19(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-coin98': 0.5.20(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-coinbase': 0.1.19(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-coinhub': 0.3.18(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-fractal': 0.1.8(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@solana/wallet-adapter-huobi': 0.1.15(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-hyperpay': 0.1.14(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-keystone': 0.1.15(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@solana/wallet-adapter-krystal': 0.1.12(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-ledger': 0.9.25(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-mathwallet': 0.9.18(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-neko': 0.2.12(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-nightly': 0.1.16(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-nufi': 0.1.17(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-onto': 0.1.7(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-particle': 0.1.12(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bs58@5.0.0) + '@solana/wallet-adapter-phantom': 0.9.24(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-safepal': 0.5.18(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-saifu': 0.1.15(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-salmon': 0.1.14(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-sky': 0.1.15(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-solflare': 0.6.28(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-solong': 0.9.18(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-spot': 0.1.15(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-tokenary': 0.1.12(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-tokenpocket': 0.4.19(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-torus': 0.11.28(@babel/runtime@7.26.10)(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@solana/wallet-adapter-trezor': 0.1.2(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(tslib@2.8.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-trust': 0.1.13(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-unsafe-burner': 0.1.7(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-walletconnect': 0.1.16(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(typescript@5.8.2)(utf-8-validate@5.0.10)(zod@3.24.2) + '@solana/wallet-adapter-xdefi': 0.1.7(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@babel/runtime' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@react-native-async-storage/async-storage' + - '@sentry/types' + - '@solana/sysvars' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - bs58 + - bufferutil + - db0 + - encoding + - expo-constants + - expo-localization + - fastestsmallesttextencoderdecoder + - ioredis + - react + - react-dom + - react-native + - supports-color + - tslib + - typescript + - uploadthing + - utf-8-validate + - ws + - zod + + '@solana/wallet-adapter-wallets@0.19.32(@babel/runtime@7.26.10)(@react-native-async-storage/async-storage@1.24.0(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2))(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-dom@19.0.0(react@19.0.0))(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(react@19.0.0)(tslib@2.8.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@3.24.2)': dependencies: '@solana/wallet-adapter-alpha': 0.1.10(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) '@solana/wallet-adapter-avana': 0.1.13(@solana/web3.js@1.98.0(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)) @@ -32755,7 +32415,7 @@ snapshots: bs58: 4.0.1 buffer: 6.0.3 fast-stable-stringify: 1.0.0 - jayson: 4.1.3(bufferutil@4.0.7)(utf-8-validate@6.0.3) + jayson: 4.1.3 node-fetch: 2.7.0(encoding@0.1.13) rpc-websockets: 9.1.1 superstruct: 2.0.2 @@ -32764,6 +32424,31 @@ snapshots: - encoding - utf-8-validate + '@solana/web3.js@2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@solana/accounts': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/addresses': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/codecs': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/errors': 2.0.0(typescript@5.8.2) + '@solana/functional': 2.0.0(typescript@5.8.2) + '@solana/instructions': 2.0.0(typescript@5.8.2) + '@solana/keys': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/programs': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/rpc': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/rpc-parsed-types': 2.0.0(typescript@5.8.2) + '@solana/rpc-spec-types': 2.0.0(typescript@5.8.2) + '@solana/rpc-subscriptions': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/rpc-types': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/signers': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/sysvars': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/transaction-confirmation': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/transaction-messages': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + '@solana/transactions': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) + typescript: 5.8.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - ws + '@solana/web3.js@2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@solana/accounts': 2.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2) @@ -32951,7 +32636,6 @@ snapshots: - '@rspack/core' - '@swc/core' - esbuild - - supports-color - uglify-js - webpack-cli @@ -33011,7 +32695,7 @@ snapshots: dependencies: storybook: 8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.3) - '@storybook/nextjs@8.6.7(esbuild@0.25.1)(next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.3))(type-fest@4.37.0)(typescript@5.8.2)(webpack-hot-middleware@2.26.1)(webpack@5.98.0(esbuild@0.25.1))': + '@storybook/nextjs@8.6.7(esbuild@0.25.1)(next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1)(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.3))(type-fest@4.37.0)(typescript@5.8.2)(webpack-hot-middleware@2.26.1)(webpack@5.98.0(esbuild@0.25.1))': dependencies: '@babel/core': 7.26.10 '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.10) @@ -33035,10 +32719,9 @@ snapshots: babel-loader: 9.2.1(@babel/core@7.26.10)(webpack@5.98.0(esbuild@0.25.1)) css-loader: 6.11.0(webpack@5.98.0(esbuild@0.25.1)) find-up: 5.0.0 - fs-extra: 11.3.0 image-size: 1.2.0 loader-utils: 3.3.1 - next: 15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) + next: 15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) node-polyfill-webpack-plugin: 2.0.1(webpack@5.98.0(esbuild@0.25.1)) pnp-webpack-plugin: 1.7.0(typescript@5.8.2) postcss: 8.5.3 @@ -33065,7 +32748,6 @@ snapshots: - '@types/webpack' - babel-plugin-macros - esbuild - - fibers - node-sass - sass - sass-embedded @@ -33089,7 +32771,6 @@ snapshots: '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.2)(webpack@5.98.0(esbuild@0.25.1)) '@types/semver': 7.5.8 find-up: 5.0.0 - fs-extra: 11.3.0 magic-string: 0.30.17 react: 19.0.0 react-docgen: 7.1.1 @@ -33150,7 +32831,6 @@ snapshots: '@storybook/test@8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.3))': dependencies: - '@storybook/csf': 0.1.11 '@storybook/global': 5.0.0 '@storybook/instrumenter': 8.6.7(storybook@8.6.7(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@6.0.3)) '@testing-library/dom': 10.4.0 @@ -33346,11 +33026,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@swc/helpers@0.5.5': - dependencies: - '@swc/counter': 0.1.3 - tslib: 2.8.1 - '@szmarczak/http-timer@4.0.6': dependencies: defer-to-connect: 2.0.1 @@ -33748,6 +33423,17 @@ snapshots: - expo-localization - react-native + '@trezor/blockchain-link-types@1.3.2(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@solana/kit': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@trezor/type-utils': 1.1.4 + '@trezor/utxo-lib': 2.3.2(tslib@2.8.1) + tslib: 2.8.1 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + - ws + '@trezor/blockchain-link-types@1.3.2(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@solana/kit': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) @@ -33770,6 +33456,35 @@ snapshots: - expo-localization - react-native + '@trezor/blockchain-link@2.4.2(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(tslib@2.8.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@everstake/wallet-sdk-solana': 2.0.8(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana-program/token': 0.5.1(@solana/kit@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))) + '@solana-program/token-2022': 0.4.0(@solana/kit@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)) + '@solana/kit': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@trezor/blockchain-link-types': 1.3.2(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@trezor/blockchain-link-utils': 1.3.2(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(tslib@2.8.1) + '@trezor/env-utils': 1.3.1(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(tslib@2.8.1) + '@trezor/utils': 9.3.2(tslib@2.8.1) + '@trezor/utxo-lib': 2.3.2(tslib@2.8.1) + '@trezor/websocket-client': 1.1.2(bufferutil@4.0.9)(tslib@2.8.1)(utf-8-validate@5.0.10) + '@types/web': 0.0.197 + events: 3.3.0 + ripple-lib: 1.10.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + socks-proxy-agent: 8.0.4 + tslib: 2.8.1 + transitivePeerDependencies: + - '@solana/sysvars' + - bufferutil + - expo-constants + - expo-localization + - fastestsmallesttextencoderdecoder + - react-native + - supports-color + - typescript + - utf-8-validate + - ws + '@trezor/blockchain-link@2.4.2(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(tslib@2.8.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@everstake/wallet-sdk-solana': 2.0.8(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) @@ -33818,6 +33533,25 @@ snapshots: - expo-localization - react-native + '@trezor/connect-web@9.5.2(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(tslib@2.8.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@trezor/connect': 9.5.2(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(tslib@2.8.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@trezor/connect-common': 0.3.2(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(tslib@2.8.1) + '@trezor/utils': 9.3.2(tslib@2.8.1) + tslib: 2.8.1 + transitivePeerDependencies: + - '@solana/sysvars' + - bufferutil + - encoding + - expo-constants + - expo-localization + - fastestsmallesttextencoderdecoder + - react-native + - supports-color + - typescript + - utf-8-validate + - ws + '@trezor/connect-web@9.5.2(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(tslib@2.8.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@trezor/connect': 9.5.2(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(tslib@2.8.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)) @@ -33837,6 +33571,50 @@ snapshots: - utf-8-validate - ws + '@trezor/connect@9.5.2(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(tslib@2.8.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@ethereumjs/common': 4.4.0 + '@ethereumjs/tx': 5.4.0 + '@fivebinaries/coin-selection': 3.0.0 + '@mobily/ts-belt': 3.13.1 + '@noble/hashes': 1.7.1 + '@scure/bip39': 1.5.4 + '@solana-program/compute-budget': 0.7.0(@solana/kit@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))) + '@solana-program/system': 0.7.0(@solana/kit@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))) + '@solana-program/token': 0.5.1(@solana/kit@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))) + '@solana-program/token-2022': 0.4.0(@solana/kit@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)) + '@solana/kit': 2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@trezor/blockchain-link': 2.4.2(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(tslib@2.8.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@trezor/blockchain-link-types': 1.3.2(fastestsmallesttextencoderdecoder@1.0.22)(tslib@2.8.1)(typescript@5.8.2)(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@trezor/blockchain-link-utils': 1.3.2(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(tslib@2.8.1) + '@trezor/connect-analytics': 1.3.1(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(tslib@2.8.1) + '@trezor/connect-common': 0.3.2(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(tslib@2.8.1) + '@trezor/crypto-utils': 1.1.1(tslib@2.8.1) + '@trezor/device-utils': 1.0.1 + '@trezor/protobuf': 1.3.2(tslib@2.8.1) + '@trezor/protocol': 1.2.4(tslib@2.8.1) + '@trezor/schema-utils': 1.3.1(tslib@2.8.1) + '@trezor/transport': 1.4.2(encoding@0.1.13)(tslib@2.8.1) + '@trezor/utils': 9.3.2(tslib@2.8.1) + '@trezor/utxo-lib': 2.3.2(tslib@2.8.1) + blakejs: 1.2.1 + bs58: 6.0.0 + bs58check: 4.0.0 + cross-fetch: 4.1.0(encoding@0.1.13) + tslib: 2.8.1 + transitivePeerDependencies: + - '@solana/sysvars' + - bufferutil + - encoding + - expo-constants + - expo-localization + - fastestsmallesttextencoderdecoder + - react-native + - supports-color + - typescript + - utf-8-validate + - ws + '@trezor/connect@9.5.2(@solana/sysvars@2.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.2))(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.78.0(@babel/core@7.26.10)(@babel/preset-env@7.26.9(@babel/core@7.26.10))(@types/react@19.0.10)(bufferutil@4.0.9)(react@19.0.0)(utf-8-validate@5.0.10))(tslib@2.8.1)(typescript@5.8.2)(utf-8-validate@5.0.10)(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@ethereumjs/common': 4.4.0 @@ -34403,7 +34181,7 @@ snapshots: '@types/bn.js@4.11.6': dependencies: - '@types/node': 20.14.15 + '@types/node': 18.19.80 '@types/bn.js@5.1.6': dependencies: @@ -34431,7 +34209,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 20.14.15 + '@types/node': 18.19.80 '@types/cors@2.8.12': optional: true @@ -34470,8 +34248,6 @@ snapshots: '@types/doctrine@0.0.9': {} - '@types/escodegen@0.0.6': {} - '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 @@ -34486,8 +34262,6 @@ snapshots: dependencies: '@types/estree': 1.0.6 - '@types/estree@0.0.51': {} - '@types/estree@1.0.6': {} '@types/ethereum-protocol@1.0.5': @@ -34577,7 +34351,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 20.14.15 + '@types/node': 18.19.80 '@types/lodash.values@4.3.9': dependencies: @@ -34642,7 +34416,7 @@ snapshots: '@types/pbkdf2@3.1.2': dependencies: - '@types/node': 20.14.15 + '@types/node': 18.19.80 '@types/pino@7.0.5': dependencies: @@ -34664,11 +34438,11 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 20.14.15 + '@types/node': 18.19.80 '@types/secp256k1@4.0.6': dependencies: - '@types/node': 20.14.15 + '@types/node': 18.19.80 '@types/seedrandom@3.0.1': {} @@ -34725,7 +34499,7 @@ snapshots: '@types/ws@7.4.7': dependencies: - '@types/node': 20.14.15 + '@types/node': 18.19.80 '@types/ws@8.18.0': dependencies: @@ -34919,11 +34693,6 @@ snapshots: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/scope-manager@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/scope-manager@6.21.0': dependencies: '@typescript-eslint/types': 6.21.0 @@ -34934,11 +34703,6 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/scope-manager@7.18.0': - dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/scope-manager@8.26.1': dependencies: '@typescript-eslint/types': 8.26.1 @@ -35005,14 +34769,10 @@ snapshots: '@typescript-eslint/types@5.62.0': {} - '@typescript-eslint/types@5.62.0': {} - '@typescript-eslint/types@6.21.0': {} '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/types@8.26.1': {} '@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5)': @@ -35043,20 +34803,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.8.2)': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.4.0(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.7.1 - tsutils: 3.21.0(typescript@5.8.2) - optionalDependencies: - typescript: 5.8.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.8.2)': dependencies: '@typescript-eslint/types': 6.21.0 @@ -35087,21 +34833,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.8.2)': - dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.1 - ts-api-utils: 1.3.0(typescript@5.8.2) - optionalDependencies: - typescript: 5.8.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@8.26.1(typescript@5.8.2)': dependencies: '@typescript-eslint/types': 8.26.1 @@ -35146,21 +34877,6 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@5.62.0(eslint@9.22.0(jiti@1.21.0))(typescript@5.8.2)': - dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.22.0(jiti@1.21.0)) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.2) - eslint: 9.22.0(jiti@1.21.0) - eslint-scope: 5.1.1 - semver: 7.7.1 - transitivePeerDependencies: - - supports-color - - typescript - '@typescript-eslint/utils@6.21.0(eslint@8.56.0)(typescript@5.8.2)': dependencies: '@eslint-community/eslint-utils': 4.5.1(eslint@8.56.0) @@ -35202,11 +34918,6 @@ snapshots: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@6.21.0': dependencies: '@typescript-eslint/types': 6.21.0 @@ -35217,11 +34928,6 @@ snapshots: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@7.18.0': - dependencies: - '@typescript-eslint/types': 7.18.0 - eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.26.1': dependencies: '@typescript-eslint/types': 8.26.1 @@ -36472,10 +36178,6 @@ snapshots: dependencies: acorn: 8.14.1 - acorn-jsx@5.3.2(acorn@7.4.1): - dependencies: - acorn: 7.4.1 - acorn-jsx@5.3.2(acorn@8.14.1): dependencies: acorn: 8.14.1 @@ -36486,8 +36188,6 @@ snapshots: acorn@7.1.1: {} - acorn@7.4.1: {} - acorn@8.14.1: {} add-stream@1.0.0: {} @@ -37551,8 +37251,6 @@ snapshots: buildcheck@0.0.6: optional: true - builtin-modules@3.3.0: {} - builtin-modules@4.0.0: {} builtin-status-codes@3.0.0: {} @@ -39982,11 +39680,6 @@ snapshots: - supports-color - typescript - eslint-plugin-tsdoc@0.3.0: - dependencies: - '@microsoft/tsdoc': 0.15.0 - '@microsoft/tsdoc-config': 0.17.0 - eslint-plugin-tsdoc@0.4.0: dependencies: '@microsoft/tsdoc': 0.15.1 @@ -40216,20 +39909,6 @@ snapshots: - bufferutil - utf-8-validate - eth-crypto@2.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.3): - dependencies: - '@babel/runtime': 7.26.0 - '@ethereumjs/tx': 3.5.2 - '@types/bn.js': 5.1.6 - eccrypto: 1.1.6(patch_hash=js5qlejycrl6lkbfhp4evg6xse) - ethereumjs-util: 7.1.5 - ethers: 5.7.2(bufferutil@4.0.9)(utf-8-validate@6.0.3) - secp256k1: 5.0.1 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - optional: true - eth-ens-namehash@2.0.8: dependencies: idna-uts46-hx: 2.3.1 @@ -40549,43 +40228,6 @@ snapshots: - bufferutil - utf-8-validate - ethers@5.7.2(bufferutil@4.0.9)(utf-8-validate@6.0.3): - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/base64': 5.7.0 - '@ethersproject/basex': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/contracts': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/hdnode': 5.7.0 - '@ethersproject/json-wallets': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/networks': 5.7.1 - '@ethersproject/pbkdf2': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/providers': 5.7.2(bufferutil@4.0.9)(utf-8-validate@6.0.3) - '@ethersproject/random': 5.7.0 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - '@ethersproject/solidity': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/units': 5.7.0 - '@ethersproject/wallet': 5.7.0 - '@ethersproject/web': 5.7.1 - '@ethersproject/wordlists': 5.7.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - optional: true - ethers@5.8.0(bufferutil@4.0.7)(utf-8-validate@6.0.3): dependencies: '@ethersproject/abi': 5.8.0 @@ -42390,10 +42032,6 @@ snapshots: is-buffer@2.0.5: {} - is-builtin-module@3.2.1: - dependencies: - builtin-modules: 3.3.0 - is-builtin-module@4.0.0: dependencies: builtin-modules: 4.0.0 @@ -42619,6 +42257,10 @@ snapshots: dependencies: ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@6.0.3) + isomorphic-ws@4.0.1(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + dependencies: + ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + isomorphic-ws@4.0.1(ws@8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.3)): dependencies: ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@6.0.3) @@ -42732,6 +42374,24 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 + jayson@4.1.3: + dependencies: + '@types/connect': 3.4.38 + '@types/node': 12.20.55 + '@types/ws': 7.4.7 + JSONStream: 1.3.5 + commander: 2.20.3 + delay: 5.0.0 + es6-promisify: 5.0.0 + eyes: 0.1.8 + isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.7)(utf-8-validate@6.0.3)) + json-stringify-safe: 5.0.1 + uuid: 8.3.2 + ws: 7.5.10(bufferutil@4.0.7)(utf-8-validate@6.0.3) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + jayson@4.1.3(bufferutil@4.0.7)(utf-8-validate@6.0.3): dependencies: '@types/connect': 3.4.38 @@ -42798,7 +42458,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.15 + '@types/node': 18.19.80 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.3 @@ -43303,7 +42963,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.15 + '@types/node': 18.19.80 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -43315,7 +42975,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.14.15 + '@types/node': 18.19.80 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -43361,7 +43021,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.14.15 + '@types/node': 18.19.80 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -43408,7 +43068,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.15 + '@types/node': 18.19.80 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -43436,7 +43096,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.15 + '@types/node': 18.19.80 chalk: 4.1.2 cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.2 @@ -43501,7 +43161,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.14.15 + '@types/node': 18.19.80 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -43762,8 +43422,6 @@ snapshots: - supports-color - utf-8-validate - jsesc@0.5.0: {} - jsesc@3.0.2: {} jsesc@3.1.0: {} @@ -45383,9 +45041,9 @@ snapshots: dependencies: ansi-regex: 2.1.1 - next-seo@5.15.0(next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next-seo@5.15.0(next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - next: 15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) + next: 15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -45396,36 +45054,9 @@ snapshots: next-tick@1.1.0: {} - next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1): + next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1): dependencies: - '@next/env': 14.2.15 - '@swc/helpers': 0.5.5 - busboy: 1.6.0 - caniuse-lite: 1.0.30001704 - graceful-fs: 4.2.11 - postcss: 8.4.31 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(@babel/core@7.25.8)(react@18.3.1) - optionalDependencies: - '@next/swc-darwin-arm64': 14.2.15 - '@next/swc-darwin-x64': 14.2.15 - '@next/swc-linux-arm64-gnu': 14.2.15 - '@next/swc-linux-arm64-musl': 14.2.15 - '@next/swc-linux-x64-gnu': 14.2.15 - '@next/swc-linux-x64-musl': 14.2.15 - '@next/swc-win32-arm64-msvc': 14.2.15 - '@next/swc-win32-ia32-msvc': 14.2.15 - '@next/swc-win32-x64-msvc': 14.2.15 - '@opentelemetry/api': 1.9.0 - sass: 1.85.1 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - - next@15.1.2(@babel/core@7.25.8)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1): - dependencies: - '@next/env': 15.1.2 + '@next/env': 15.2.2 '@swc/counter': 0.1.3 '@swc/helpers': 0.5.15 busboy: 1.6.0 @@ -45435,14 +45066,14 @@ snapshots: react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(@babel/core@7.26.10)(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.1.2 - '@next/swc-darwin-x64': 15.1.2 - '@next/swc-linux-arm64-gnu': 15.1.2 - '@next/swc-linux-arm64-musl': 15.1.2 - '@next/swc-linux-x64-gnu': 15.1.2 - '@next/swc-linux-x64-musl': 15.1.2 - '@next/swc-win32-arm64-msvc': 15.1.2 - '@next/swc-win32-x64-msvc': 15.1.2 + '@next/swc-darwin-arm64': 15.2.2 + '@next/swc-darwin-x64': 15.2.2 + '@next/swc-linux-arm64-gnu': 15.2.2 + '@next/swc-linux-arm64-musl': 15.2.2 + '@next/swc-linux-x64-gnu': 15.2.2 + '@next/swc-linux-x64-musl': 15.2.2 + '@next/swc-win32-arm64-msvc': 15.2.2 + '@next/swc-win32-x64-msvc': 15.2.2 '@opentelemetry/api': 1.9.0 sass: 1.85.1 sharp: 0.33.5 @@ -45694,12 +45325,12 @@ snapshots: bn.js: 4.11.6 strip-hex-prefix: 1.0.0 - nuqs@2.4.1(next@15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0): + nuqs@2.4.1(next@15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(react@19.0.0): dependencies: mitt: 3.0.1 react: 19.0.0 optionalDependencies: - next: 15.2.2(@babel/core@7.26.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) + next: 15.2.2(@babel/core@7.26.10)(@opentelemetry/api@1.9.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1) nwsapi@2.2.18: {} @@ -46850,7 +46481,7 @@ snapshots: '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 '@types/long': 4.0.2 - '@types/node': 20.14.15 + '@types/node': 18.19.80 long: 4.0.0 protobufjs@7.4.0: @@ -46865,7 +46496,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.14.15 + '@types/node': 18.19.80 long: 5.3.1 protocols@2.0.2: {} @@ -47280,8 +46911,6 @@ snapshots: react-is@17.0.2: {} - react-is@18.1.0: {} - react-is@18.3.1: {} react-lifecycles-compat@3.0.4: {} @@ -47721,10 +47350,6 @@ snapshots: regjsgen@0.8.0: {} - regjsparser@0.10.0: - dependencies: - jsesc: 0.5.0 - regjsparser@0.12.0: dependencies: jsesc: 3.0.2 @@ -48049,7 +47674,6 @@ snapshots: sass-loader@14.2.1(sass@1.85.1)(webpack@5.98.0(esbuild@0.25.1)): dependencies: neo-async: 2.6.2 - webpack: 5.91.0(esbuild@0.24.0) optionalDependencies: sass: 1.85.1 webpack: 5.98.0(esbuild@0.25.1) @@ -51756,12 +51380,6 @@ snapshots: bufferutil: 4.0.9 utf-8-validate: 5.0.10 - ws@7.4.6(bufferutil@4.0.9)(utf-8-validate@6.0.3): - optionalDependencies: - bufferutil: 4.0.9 - utf-8-validate: 6.0.3 - optional: true - ws@7.5.10(bufferutil@4.0.7)(utf-8-validate@6.0.3): optionalDependencies: bufferutil: 4.0.7 @@ -52020,9 +51638,9 @@ snapshots: dependencies: ethers: 5.8.0(bufferutil@4.0.7)(utf-8-validate@6.0.3) - zksync-ethers@6.16.1(ethers@6.13.4(bufferutil@4.0.7)(utf-8-validate@6.0.3)): + zksync-ethers@6.16.1(ethers@6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3)): dependencies: - ethers: 6.13.4(bufferutil@4.0.7)(utf-8-validate@6.0.3) + ethers: 6.13.5(bufferutil@4.0.7)(utf-8-validate@6.0.3) zksync-web3@0.13.4(ethers@5.8.0(bufferutil@4.0.7)(utf-8-validate@6.0.3)): dependencies: From 2da9377f7cd0cc3be019cd75a40f7da02402b2c3 Mon Sep 17 00:00:00 2001 From: Daniel Chew Date: Tue, 18 Mar 2025 15:14:52 +0900 Subject: [PATCH 05/18] feat: update README with new wallet balance metrics and monitoring instructions --- apps/price_pusher/README.md | 47 +++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/apps/price_pusher/README.md b/apps/price_pusher/README.md index 7923ce76a7..14e3b195f7 100644 --- a/apps/price_pusher/README.md +++ b/apps/price_pusher/README.md @@ -271,9 +271,10 @@ The following metrics are available: - **pyth_price_last_published_time**: The last published time of a price feed in unix timestamp - **pyth_price_updates_total**: Total number of price updates pushed to the chain - **pyth_price_update_duration_seconds**: Duration of price update operations in seconds -- **pyth_active_price_feeds**: Number of active price feeds being monitored +- **pyth_price_feeds_total**: Total number of price feeds being monitored - **pyth_price_update_errors_total**: Total number of errors encountered during price updates - **pyth_price_update_attempts_total**: Total number of price update attempts +- **pyth_wallet_balance**: Current wallet balance of the price pusher in native token units ### Configuration @@ -290,7 +291,21 @@ node lib/index.js evm --config config.evm.mainnet.json --metrics-port 9091 ### Running Locally with Docker -You can run a local Prometheus instance to test the metrics: +You can run the monitoring stack (Prometheus and Grafana) using the provided docker-compose configuration: + +1. Use the sample docker-compose file for metrics: + +```bash +docker-compose -f docker-compose.metrics.sample.yaml up +``` + +This will start: +- Prometheus server on port 9090 with the alerts configured in alerts.yml +- Grafana server on port 3000 with default credentials (admin/admin) + +The docker-compose.metrics.sample.yaml file also includes commented examples of price_pusher services for different blockchains that you can uncomment and customize for your specific needs. + +Alternatively, if you prefer to set up the monitoring stack manually: 1. Create a `prometheus.yml` file: @@ -309,6 +324,7 @@ scrape_configs: ```bash docker run -d --name prometheus -p 9090:9090 \ -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \ + -v $(pwd)/alerts.yml:/etc/prometheus/alerts.yml \ prom/prometheus ``` @@ -347,3 +363,30 @@ time() - pyth_price_last_published_time > 3600 ``` rate(pyth_price_update_duration_seconds_sum[5m]) / rate(pyth_price_update_duration_seconds_count[5m]) ``` + +5. Monitor wallet balances: + +``` +pyth_wallet_balance +``` + +6. Detect low wallet balances (below 0.1 tokens): + +``` +pyth_wallet_balance < 0.1 +``` + +### Alerting + +The price pusher includes pre-configured Prometheus alerting rules in the `alerts.yml` file. These rules monitor various aspects of the price pusher's operation, including: + +- Price feeds not being updated for an extended period (>1 hour) +- High error rates in price updates +- No recent price updates across all feeds +- Service availability +- High update durations +- Low wallet balances with two severity levels: + - Warning: Balance below 0.1 native tokens + - Critical: Balance below 0.01 native tokens (transactions may fail soon) + +When using the docker-compose setup, these alerts are automatically loaded into Prometheus and can be viewed in the Alerting section of Grafana after setting up the Prometheus data source. From d1a180e8d170390cc6141656db49a36836f22220 Mon Sep 17 00:00:00 2001 From: Daniel Chew Date: Tue, 18 Mar 2025 16:30:51 +0900 Subject: [PATCH 06/18] chore: add grafana-dashboard.json to .gitignore --- apps/price_pusher/.gitignore | 1 + apps/price_pusher/grafana-dashboard.json | 907 ----------------------- 2 files changed, 1 insertion(+), 907 deletions(-) delete mode 100644 apps/price_pusher/grafana-dashboard.json diff --git a/apps/price_pusher/.gitignore b/apps/price_pusher/.gitignore index b45f6b6575..f145b8dae1 100644 --- a/apps/price_pusher/.gitignore +++ b/apps/price_pusher/.gitignore @@ -2,3 +2,4 @@ docker-compose.yaml price-config.yaml lib mnemonic +grafana-dashboard.json diff --git a/apps/price_pusher/grafana-dashboard.json b/apps/price_pusher/grafana-dashboard.json deleted file mode 100644 index 608ffc5a86..0000000000 --- a/apps/price_pusher/grafana-dashboard.json +++ /dev/null @@ -1,907 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": 1, - "links": [], - "panels": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 6, - "x": 0, - "y": 0 - }, - "id": 9, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "value", - "wideLayout": true - }, - "pluginVersion": "11.5.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "pyth_price_feeds_total", - "instant": true, - "range": false, - "refId": "A" - } - ], - "title": "Configured Price Feeds", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 6, - "x": 6, - "y": 0 - }, - "id": 12, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "value", - "wideLayout": true - }, - "pluginVersion": "11.5.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "count(pyth_price_last_published_time)", - "instant": true, - "range": false, - "refId": "A" - } - ], - "title": "Active Price Feeds", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 3600 - } - ] - }, - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.5.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "time() - pyth_price_last_published_time", - "instant": true, - "legendFormat": "{{alias}}", - "range": false, - "refId": "A" - } - ], - "title": "Time Since Last Update (Stat)", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": { - "align": "auto", - "cellOptions": { - "type": "auto" - }, - "inspect": false - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Time Since Update" - }, - "properties": [ - { - "id": "unit", - "value": "s" - }, - { - "id": "thresholds", - "value": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "yellow", - "value": 600 - }, - { - "color": "red", - "value": 3600 - } - ] - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total Updates" - }, - "properties": [ - { - "id": "unit", - "value": "short" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 7, - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true, - "sortBy": [ - { - "desc": false, - "displayName": "Price ID" - } - ] - }, - "pluginVersion": "11.5.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "pyth_price_last_published_time", - "format": "table", - "instant": true, - "legendFormat": "__auto", - "range": false, - "refId": "A" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "time() - pyth_price_last_published_time", - "format": "table", - "instant": true, - "legendFormat": "__auto", - "range": false, - "refId": "B" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "pyth_price_updates_total", - "format": "table", - "instant": true, - "legendFormat": "__auto", - "range": false, - "refId": "C" - } - ], - "title": "Price Feeds List", - "transformations": [ - { - "id": "joinByField", - "options": { - "byField": "price_id", - "mode": "outer" - } - }, - { - "id": "organize", - "options": { - "excludeByName": { - "Time": true, - "Value #A": true, - "__name__": true, - "__name__#B": true, - "__name__#C": true, - "alias 2": true, - "alias 3": true, - "alias#B": true, - "alias#C": true, - "app": true, - "app#B": true, - "app#C": true, - "instance": true, - "instance#B": true, - "instance#C": true, - "job": true, - "job#B": true, - "job#C": true, - "price_id": false, - "price_id#B": true, - "price_id#C": true - }, - "includeByName": {}, - "indexByName": { - "Time 1": 4, - "Time 2": 10, - "Time 3": 15, - "Value #A": 9, - "Value #B": 2, - "Value #C": 3, - "__name__ 1": 5, - "__name__ 2": 16, - "alias 1": 1, - "alias 2": 11, - "alias 3": 17, - "app 1": 6, - "app 2": 12, - "app 3": 18, - "instance 1": 7, - "instance 2": 13, - "instance 3": 19, - "job 1": 8, - "job 2": 14, - "job 3": 20, - "price_id": 0 - }, - "renameByName": { - "Value #B": "Time Since Update", - "Value #C": "Total Updates", - "alias": "Symbol", - "alias 1": "Symbol", - "price_id": "Price ID" - } - } - } - ], - "type": "table" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 0, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "11.5.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(increase(pyth_price_updates_total[1h]))", - "legendFormat": "Updates", - "range": true, - "refId": "A" - } - ], - "title": "Price Updates (Last Hour)", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "yellow", - "value": 0.1 - }, - { - "color": "red", - "value": 0.01 - } - ] - }, - "unit": "locale" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 10, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "11.5.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "pyth_wallet_balance", - "instant": true, - "legendFormat": "{{wallet_address}}", - "range": false, - "refId": "A" - } - ], - "title": "Wallet Balance", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "locale" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 11, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "11.5.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "pyth_wallet_balance", - "legendFormat": "{{wallet_address}} ({{network}})", - "range": true, - "refId": "A" - } - ], - "title": "Wallet Balance Over Time", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 0, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 6, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "11.5.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(increase(pyth_price_update_errors_total[5m]))", - "legendFormat": "Errors", - "range": true, - "refId": "A" - } - ], - "title": "Update Errors", - "type": "timeseries" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "s" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 - }, - "id": 4, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "11.5.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "rate(pyth_price_update_duration_seconds_sum[5m]) / rate(pyth_price_update_duration_seconds_count[5m])", - "legendFormat": "{{alias}}", - "range": true, - "refId": "A" - } - ], - "title": "Average Update Duration", - "type": "timeseries" - } - ], - "preload": false, - "refresh": "5s", - "schemaVersion": 40, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": {}, - "timezone": "", - "title": "Pyth Price Pusher Dashboard", - "uid": "pyth-price-pusher", - "version": 39, - "weekStart": "" -} From cef1a9f9d98d6445edcf133a782f31969c87d403 Mon Sep 17 00:00:00 2001 From: Daniel Chew Date: Tue, 18 Mar 2025 16:35:38 +0900 Subject: [PATCH 07/18] chore: remove commented-out example services from docker-compose.metrics.sample.yaml --- .../docker-compose.metrics.sample.yaml | 36 ------------------- 1 file changed, 36 deletions(-) diff --git a/apps/price_pusher/docker-compose.metrics.sample.yaml b/apps/price_pusher/docker-compose.metrics.sample.yaml index df3b051a06..6d4b37dd53 100644 --- a/apps/price_pusher/docker-compose.metrics.sample.yaml +++ b/apps/price_pusher/docker-compose.metrics.sample.yaml @@ -33,42 +33,6 @@ services: networks: - monitoring - # Example price_pusher service for Ethereum - # price_pusher_ethereum: - # image: your-price-pusher-image:latest - # container_name: price_pusher_ethereum - # volumes: - # - ./config.evm.mainnet.json:/app/config.json - # - ./mnemonic:/app/mnemonic - # command: > - # node lib/index.js evm - # --config /app/config.json - # --mnemonic-file /app/mnemonic - # --metrics-port 9091 - # ports: - # - "9091:9091" - # networks: - # - monitoring - # restart: unless-stopped - - # Example price_pusher service for Solana - # price_pusher_solana: - # image: your-price-pusher-image:latest - # container_name: price_pusher_solana - # volumes: - # - ./config.solana.mainnet.json:/app/config.json - # - ./mnemonic:/app/mnemonic - # command: > - # node lib/index.js solana - # --config /app/config.json - # --mnemonic-file /app/mnemonic - # --metrics-port 9092 - # ports: - # - "9092:9092" - # networks: - # - monitoring - # restart: unless-stopped - networks: monitoring: driver: bridge From a478455bd7e76b9fdb7fbb9d6a042500052c8e5f Mon Sep 17 00:00:00 2001 From: Daniel Chew Date: Tue, 18 Mar 2025 16:55:34 +0900 Subject: [PATCH 08/18] remove unused code --- apps/price_pusher/prometheus.yml | 44 -------------------------------- 1 file changed, 44 deletions(-) diff --git a/apps/price_pusher/prometheus.yml b/apps/price_pusher/prometheus.yml index 07e706e386..06376ef73f 100644 --- a/apps/price_pusher/prometheus.yml +++ b/apps/price_pusher/prometheus.yml @@ -11,29 +11,6 @@ scrape_configs: target_label: instance replacement: "price_pusher" - # Add more price_pusher instances for different chains - # - job_name: 'price_pusher_ethereum' - # static_configs: - # - targets: ['localhost:9091'] - # relabel_configs: - # - source_labels: [__address__] - # target_label: instance - # replacement: 'ethereum' - # - source_labels: [__address__] - # target_label: chain - # replacement: 'ethereum' - - # - job_name: 'price_pusher_solana' - # static_configs: - # - targets: ['localhost:9092'] - # relabel_configs: - # - source_labels: [__address__] - # target_label: instance - # replacement: 'solana' - # - source_labels: [__address__] - # target_label: chain - # replacement: 'solana' - alerting: alertmanagers: - static_configs: @@ -43,24 +20,3 @@ alerting: # Alert rules rule_files: - "alerts.yml" -# Sample alerts.yml content: -# groups: -# - name: price_pusher_alerts -# rules: -# - alert: PriceFeedNotUpdated -# expr: time() - pyth_price_last_published_time > 3600 -# for: 5m -# labels: -# severity: warning -# annotations: -# summary: "Price feed not updated" -# description: "Price feed {{ $labels.alias }} has not been updated for more than 1 hour" -# -# - alert: HighErrorRate -# expr: sum(increase(pyth_price_update_errors_total[15m])) > 5 -# for: 5m -# labels: -# severity: warning -# annotations: -# summary: "High error rate in price updates" -# description: "There have been more than 5 errors in the last 15 minutes" From 0b5f5976bff45bd98192dd44c1feb4c26a153092 Mon Sep 17 00:00:00 2001 From: Daniel Chew Date: Wed, 19 Mar 2025 14:38:37 +0900 Subject: [PATCH 09/18] address readme comments --- apps/price_pusher/README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/price_pusher/README.md b/apps/price_pusher/README.md index 14e3b195f7..ec9a42ece1 100644 --- a/apps/price_pusher/README.md +++ b/apps/price_pusher/README.md @@ -268,13 +268,13 @@ The price_pusher now supports Prometheus metrics to monitor the health and perfo The following metrics are available: -- **pyth_price_last_published_time**: The last published time of a price feed in unix timestamp -- **pyth_price_updates_total**: Total number of price updates pushed to the chain -- **pyth_price_update_duration_seconds**: Duration of price update operations in seconds -- **pyth_price_feeds_total**: Total number of price feeds being monitored -- **pyth_price_update_errors_total**: Total number of errors encountered during price updates -- **pyth_price_update_attempts_total**: Total number of price update attempts -- **pyth_wallet_balance**: Current wallet balance of the price pusher in native token units +- **pyth_price_last_published_time** (Gauge): The last published time of a price feed in unix timestamp +- **pyth_price_updates_total** (Counter): Total number of price updates pushed to the chain +- **pyth_price_update_duration_seconds** (Histogram): Duration of price update operations in seconds +- **pyth_price_feeds_total** (Gauge): Total number of price feeds being monitored +- **pyth_price_update_errors_total** (Counter): Total number of errors encountered during price updates +- **pyth_price_update_attempts_total** (Counter): Total number of price update attempts +- **pyth_wallet_balance** (Gauge): Current wallet balance of the price pusher in native token units ### Configuration @@ -286,7 +286,7 @@ Metrics are enabled by default and can be configured using the following command Example: ```bash -node lib/index.js evm --config config.evm.mainnet.json --metrics-port 9091 +pnpm run dev evm --config config.evm.mainnet.json --metrics-port 9091 ``` ### Running Locally with Docker From 8ad268efde83979cc12b80836039e8eeb7239283 Mon Sep 17 00:00:00 2001 From: Daniel Chew Date: Wed, 19 Mar 2025 15:04:36 +0900 Subject: [PATCH 10/18] chore: update sample configuration files and README for Grafana and Prometheus --- apps/price_pusher/.gitignore | 1 - apps/price_pusher/README.md | 12 +- .../{alerts.yml => alerts.sample.yml} | 0 apps/price_pusher/dashboard.sample.yml | 11 + apps/price_pusher/datasource.sample.yml | 8 + .../docker-compose.metrics.sample.yaml | 7 +- .../grafana-dashboard.sample.json | 907 ++++++++++++++++++ .../{prometheus.yml => prometheus.sample.yml} | 2 +- 8 files changed, 938 insertions(+), 10 deletions(-) rename apps/price_pusher/{alerts.yml => alerts.sample.yml} (100%) create mode 100644 apps/price_pusher/dashboard.sample.yml create mode 100644 apps/price_pusher/datasource.sample.yml create mode 100644 apps/price_pusher/grafana-dashboard.sample.json rename apps/price_pusher/{prometheus.yml => prometheus.sample.yml} (94%) diff --git a/apps/price_pusher/.gitignore b/apps/price_pusher/.gitignore index f145b8dae1..b45f6b6575 100644 --- a/apps/price_pusher/.gitignore +++ b/apps/price_pusher/.gitignore @@ -2,4 +2,3 @@ docker-compose.yaml price-config.yaml lib mnemonic -grafana-dashboard.json diff --git a/apps/price_pusher/README.md b/apps/price_pusher/README.md index ec9a42ece1..4e554886ff 100644 --- a/apps/price_pusher/README.md +++ b/apps/price_pusher/README.md @@ -300,14 +300,14 @@ docker-compose -f docker-compose.metrics.sample.yaml up ``` This will start: -- Prometheus server on port 9090 with the alerts configured in alerts.yml +- Prometheus server on port 9090 with the alerts configured in alerts.sample.yml - Grafana server on port 3000 with default credentials (admin/admin) -The docker-compose.metrics.sample.yaml file also includes commented examples of price_pusher services for different blockchains that you can uncomment and customize for your specific needs. +The docker-compose.metrics.sample.yaml file includes a pre-configured Grafana dashboard that displays all the metrics mentioned above. You can check this dashboard to see charts for wallet balance, price update statistics, errors, and other key metrics. The dashboard is automatically provisioned when you start the stack with docker-compose. Alternatively, if you prefer to set up the monitoring stack manually: -1. Create a `prometheus.yml` file: +1. Create a `prometheus.sample.yml` file: ```yaml global: @@ -323,8 +323,8 @@ scrape_configs: ```bash docker run -d --name prometheus -p 9090:9090 \ - -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \ - -v $(pwd)/alerts.yml:/etc/prometheus/alerts.yml \ + -v $(pwd)/prometheus.sample.yml:/etc/prometheus/prometheus.yml \ + -v $(pwd)/alerts.sample.yml:/etc/prometheus/alerts.yml \ prom/prometheus ``` @@ -378,7 +378,7 @@ pyth_wallet_balance < 0.1 ### Alerting -The price pusher includes pre-configured Prometheus alerting rules in the `alerts.yml` file. These rules monitor various aspects of the price pusher's operation, including: +The price pusher includes pre-configured Prometheus alerting rules in the `alerts.sample.yml` file. These rules monitor various aspects of the price pusher's operation, including: - Price feeds not being updated for an extended period (>1 hour) - High error rates in price updates diff --git a/apps/price_pusher/alerts.yml b/apps/price_pusher/alerts.sample.yml similarity index 100% rename from apps/price_pusher/alerts.yml rename to apps/price_pusher/alerts.sample.yml diff --git a/apps/price_pusher/dashboard.sample.yml b/apps/price_pusher/dashboard.sample.yml new file mode 100644 index 0000000000..4326578291 --- /dev/null +++ b/apps/price_pusher/dashboard.sample.yml @@ -0,0 +1,11 @@ +apiVersion: 1 + +providers: + - name: 'Pyth Price Pusher' + orgId: 1 + folder: '' + type: file + disableDeletion: false + editable: true + options: + path: /var/lib/grafana/dashboards diff --git a/apps/price_pusher/datasource.sample.yml b/apps/price_pusher/datasource.sample.yml new file mode 100644 index 0000000000..86fd3465e1 --- /dev/null +++ b/apps/price_pusher/datasource.sample.yml @@ -0,0 +1,8 @@ +apiVersion: 1 + +datasources: + - name: Prometheus + type: prometheus + access: proxy + url: http://prometheus:9090 + isDefault: true diff --git a/apps/price_pusher/docker-compose.metrics.sample.yaml b/apps/price_pusher/docker-compose.metrics.sample.yaml index 6d4b37dd53..b210b9e8e3 100644 --- a/apps/price_pusher/docker-compose.metrics.sample.yaml +++ b/apps/price_pusher/docker-compose.metrics.sample.yaml @@ -7,8 +7,8 @@ services: ports: - "9090:9090" volumes: - - ./prometheus.yml:/etc/prometheus/prometheus.yml - - ./alerts.yml:/etc/prometheus/alerts.yml + - ./prometheus.sample.yml:/etc/prometheus/prometheus.yml + - ./alerts.sample.yml:/etc/prometheus/alerts.yml command: - "--config.file=/etc/prometheus/prometheus.yml" - "--storage.tsdb.path=/prometheus" @@ -24,6 +24,9 @@ services: - "3000:3000" volumes: - grafana-storage:/var/lib/grafana + - ./grafana-dashboard.sample.json:/var/lib/grafana/dashboards/pyth-price-pusher-dashboard.json + - ./dashboard.sample.yml:/etc/grafana/provisioning/dashboards/dashboard.yml + - ./datasource.sample.yml:/etc/grafana/provisioning/datasources/datasource.yml environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=admin diff --git a/apps/price_pusher/grafana-dashboard.sample.json b/apps/price_pusher/grafana-dashboard.sample.json new file mode 100644 index 0000000000..bbe5ded708 --- /dev/null +++ b/apps/price_pusher/grafana-dashboard.sample.json @@ -0,0 +1,907 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 1, + "links": [], + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 0, + "y": 0 + }, + "id": 9, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "value", + "wideLayout": true + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "pyth_price_feeds_total", + "instant": true, + "range": false, + "refId": "A" + } + ], + "title": "Configured Price Feeds", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 6, + "y": 0 + }, + "id": 12, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "value", + "wideLayout": true + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "count(pyth_price_last_published_time)", + "instant": true, + "range": false, + "refId": "A" + } + ], + "title": "Active Price Feeds", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 3600 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 2, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "time() - pyth_price_last_published_time", + "instant": true, + "legendFormat": "{{alias}}", + "range": false, + "refId": "A" + } + ], + "title": "Time Since Last Update (Stat)", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Time Since Update" + }, + "properties": [ + { + "id": "unit", + "value": "s" + }, + { + "id": "thresholds", + "value": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 600 + }, + { + "color": "red", + "value": 3600 + } + ] + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total Updates" + }, + "properties": [ + { + "id": "unit", + "value": "short" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 7, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [ + { + "desc": false, + "displayName": "Price ID" + } + ] + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "pyth_price_last_published_time", + "format": "table", + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "time() - pyth_price_last_published_time", + "format": "table", + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "pyth_price_updates_total", + "format": "table", + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "C" + } + ], + "title": "Price Feeds List", + "transformations": [ + { + "id": "joinByField", + "options": { + "byField": "price_id", + "mode": "outer" + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true, + "Value #A": true, + "__name__": true, + "__name__#B": true, + "__name__#C": true, + "alias 2": true, + "alias 3": true, + "alias#B": true, + "alias#C": true, + "app": true, + "app#B": true, + "app#C": true, + "instance": true, + "instance#B": true, + "instance#C": true, + "job": true, + "job#B": true, + "job#C": true, + "price_id": false, + "price_id#B": true, + "price_id#C": true + }, + "includeByName": {}, + "indexByName": { + "Time 1": 4, + "Time 2": 10, + "Time 3": 15, + "Value #A": 9, + "Value #B": 2, + "Value #C": 3, + "__name__ 1": 5, + "__name__ 2": 16, + "alias 1": 1, + "alias 2": 11, + "alias 3": 17, + "app 1": 6, + "app 2": 12, + "app 3": 18, + "instance 1": 7, + "instance 2": 13, + "instance 3": 19, + "job 1": 8, + "job 2": 14, + "job 3": 20, + "price_id": 0 + }, + "renameByName": { + "Value #B": "Time Since Update", + "Value #C": "Total Updates", + "alias": "Symbol", + "alias 1": "Symbol", + "price_id": "Price ID" + } + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 8 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "sum(increase(pyth_price_updates_total[1h]))", + "legendFormat": "Updates", + "range": true, + "refId": "A" + } + ], + "title": "Price Updates (Last Hour)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 0.1 + }, + { + "color": "red", + "value": 0.01 + } + ] + }, + "unit": "locale" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 10, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "pyth_wallet_balance", + "instant": true, + "legendFormat": "{{wallet_address}}", + "range": false, + "refId": "A" + } + ], + "title": "Wallet Balance", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "locale" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 16 + }, + "id": 11, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "pyth_wallet_balance", + "legendFormat": "{{wallet_address}} ({{network}})", + "range": true, + "refId": "A" + } + ], + "title": "Wallet Balance Over Time", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 24 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "sum(increase(pyth_price_update_errors_total[5m]))", + "legendFormat": "Errors", + "range": true, + "refId": "A" + } + ], + "title": "Update Errors", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 24 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "rate(pyth_price_update_duration_seconds_sum[5m]) / rate(pyth_price_update_duration_seconds_count[5m])", + "legendFormat": "{{alias}}", + "range": true, + "refId": "A" + } + ], + "title": "Average Update Duration", + "type": "timeseries" + } + ], + "preload": false, + "refresh": "5s", + "schemaVersion": 40, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Pyth Price Pusher Dashboard", + "uid": "pyth-price-pusher", + "version": 39, + "weekStart": "" + } diff --git a/apps/price_pusher/prometheus.yml b/apps/price_pusher/prometheus.sample.yml similarity index 94% rename from apps/price_pusher/prometheus.yml rename to apps/price_pusher/prometheus.sample.yml index 06376ef73f..1d5886bc99 100644 --- a/apps/price_pusher/prometheus.yml +++ b/apps/price_pusher/prometheus.sample.yml @@ -19,4 +19,4 @@ alerting: # Alert rules rule_files: - - "alerts.yml" + - "alerts.sample.yml" From 1f7d0730506345685e764bc2bdf022e1c8a12a93 Mon Sep 17 00:00:00 2001 From: Daniel Chew Date: Wed, 19 Mar 2025 15:12:36 +0900 Subject: [PATCH 11/18] refactor: simplify metrics handling and enhance README dashboard description --- apps/price_pusher/README.md | 19 +- .../grafana-dashboard.sample.json | 1610 ++++++++--------- apps/price_pusher/src/controller.ts | 16 +- apps/price_pusher/src/metrics.ts | 20 +- 4 files changed, 779 insertions(+), 886 deletions(-) diff --git a/apps/price_pusher/README.md b/apps/price_pusher/README.md index 4e554886ff..469d2b2a85 100644 --- a/apps/price_pusher/README.md +++ b/apps/price_pusher/README.md @@ -303,7 +303,7 @@ This will start: - Prometheus server on port 9090 with the alerts configured in alerts.sample.yml - Grafana server on port 3000 with default credentials (admin/admin) -The docker-compose.metrics.sample.yaml file includes a pre-configured Grafana dashboard that displays all the metrics mentioned above. You can check this dashboard to see charts for wallet balance, price update statistics, errors, and other key metrics. The dashboard is automatically provisioned when you start the stack with docker-compose. +The docker-compose.metrics.sample.yaml file includes a pre-configured Grafana dashboard (see the [Dashboard](#dashboard) section below) that displays all the metrics mentioned above. This dashboard provides monitoring of your price pusher operations with panels for configured feeds, active feeds, wallet balance, update statistics, and error tracking. The dashboard is automatically provisioned when you start the stack with docker-compose. Alternatively, if you prefer to set up the monitoring stack manually: @@ -376,6 +376,23 @@ pyth_wallet_balance pyth_wallet_balance < 0.1 ``` +### Dashboard + +The docker-compose setup includes a pre-configured Grafana dashboard (`grafana-dashboard.sample.json`) that provides monitoring of your price pusher operations. Based on the screenshot, the dashboard includes the following panels: + +- **Configured Price Feeds**: Shows the number of price feeds configured in your price-config file. +- **Active Price Feeds**: Displays the number of price feeds currently being actively monitored. +- **Time Since Last Update**: Shows how long it's been since the last successful price update was published on-chain. +- **Price Feeds List**: A table listing all configured price feeds with their details. +- **Price Updates (Last Hour)**: Graph showing the number of price updates over the last hour with timeline. +- **Wallet Balance**: Current balance of your wallet in native token units. +- **Wallet Balance Over Time**: Graph tracking your wallet balance over time to monitor consumption. +- **Update Errors**: Tracks errors encountered during price update operations. + +When you first start the monitoring stack, the dashboard may show "No data" in the panels until the price pusher has been running for some time and has collected sufficient metrics. + +This dashboard is automatically provisioned when you start the docker-compose stack and provides visibility into the health and performance of your price pusher deployment. + ### Alerting The price pusher includes pre-configured Prometheus alerting rules in the `alerts.sample.yml` file. These rules monitor various aspects of the price pusher's operation, including: diff --git a/apps/price_pusher/grafana-dashboard.sample.json b/apps/price_pusher/grafana-dashboard.sample.json index bbe5ded708..3b54843cd8 100644 --- a/apps/price_pusher/grafana-dashboard.sample.json +++ b/apps/price_pusher/grafana-dashboard.sample.json @@ -1,907 +1,813 @@ { - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": { - "type": "grafana", - "uid": "-- Grafana --" - }, - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "fiscalYearStartMonth": 0, - "graphTooltip": 0, - "id": 1, - "links": [], - "panels": [ + "annotations": { + "list": [ { + "builtIn": 1, "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 1, + "links": [], + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 6, - "x": 0, - "y": 0 - }, - "id": 9, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] }, - "showPercentChange": false, - "textMode": "value", - "wideLayout": true + "unit": "none" }, - "pluginVersion": "11.5.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "pyth_price_feeds_total", - "instant": true, - "range": false, - "refId": "A" - } - ], - "title": "Configured Price Feeds", - "type": "stat" + "overrides": [] }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 6, - "x": 6, - "y": 0 - }, - "id": 12, - "options": { - "colorMode": "value", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false + "gridPos": { + "h": 8, + "w": 6, + "x": 0, + "y": 0 + }, + "id": 9, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "value", + "wideLayout": true + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" }, - "showPercentChange": false, - "textMode": "value", - "wideLayout": true - }, - "pluginVersion": "11.5.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "count(pyth_price_last_published_time)", - "instant": true, - "range": false, - "refId": "A" - } - ], - "title": "Active Price Feeds", - "type": "stat" + "editorMode": "code", + "expr": "pyth_price_feeds_total", + "instant": true, + "range": false, + "refId": "A" + } + ], + "title": "Configured Price Feeds", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "red", - "value": 3600 - } - ] - }, - "unit": "s" + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 2, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true + "unit": "none" }, - "pluginVersion": "11.5.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "time() - pyth_price_last_published_time", - "instant": true, - "legendFormat": "{{alias}}", - "range": false, - "refId": "A" - } - ], - "title": "Time Since Last Update (Stat)", - "type": "stat" + "overrides": [] }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": { - "align": "auto", - "cellOptions": { - "type": "auto" - }, - "inspect": false - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } + "gridPos": { + "h": 8, + "w": 6, + "x": 6, + "y": 0 + }, + "id": 12, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "value", + "wideLayout": true + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Time Since Update" - }, - "properties": [ - { - "id": "unit", - "value": "s" - }, - { - "id": "thresholds", - "value": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "yellow", - "value": 600 - }, - { - "color": "red", - "value": 3600 - } - ] - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Total Updates" + "editorMode": "code", + "expr": "count(pyth_price_last_published_time)", + "instant": true, + "range": false, + "refId": "A" + } + ], + "title": "Active Price Feeds", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null }, - "properties": [ - { - "id": "unit", - "value": "short" - } - ] - } - ] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 8 - }, - "id": 7, - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": "", - "reducer": [ - "sum" - ], - "show": false + { + "color": "red", + "value": 3600 + } + ] }, - "showHeader": true, - "sortBy": [ - { - "desc": false, - "displayName": "Price ID" - } - ] + "unit": "s" }, - "pluginVersion": "11.5.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "pyth_price_last_published_time", - "format": "table", - "instant": true, - "legendFormat": "__auto", - "range": false, - "refId": "A" + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 2, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "time() - pyth_price_last_published_time", - "format": "table", - "instant": true, - "legendFormat": "__auto", - "range": false, - "refId": "B" + "editorMode": "code", + "expr": "time() - pyth_price_last_published_time", + "instant": true, + "legendFormat": "{{alias}}", + "range": false, + "refId": "A" + } + ], + "title": "Time Since Last Update (Stat)", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" }, - "editorMode": "code", - "expr": "pyth_price_updates_total", - "format": "table", - "instant": true, - "legendFormat": "__auto", - "range": false, - "refId": "C" - } - ], - "title": "Price Feeds List", - "transformations": [ - { - "id": "joinByField", - "options": { - "byField": "price_id", - "mode": "outer" - } + "inspect": false }, - { - "id": "organize", - "options": { - "excludeByName": { - "Time": true, - "Value #A": true, - "__name__": true, - "__name__#B": true, - "__name__#C": true, - "alias 2": true, - "alias 3": true, - "alias#B": true, - "alias#C": true, - "app": true, - "app#B": true, - "app#C": true, - "instance": true, - "instance#B": true, - "instance#C": true, - "job": true, - "job#B": true, - "job#C": true, - "price_id": false, - "price_id#B": true, - "price_id#C": true - }, - "includeByName": {}, - "indexByName": { - "Time 1": 4, - "Time 2": 10, - "Time 3": 15, - "Value #A": 9, - "Value #B": 2, - "Value #C": 3, - "__name__ 1": 5, - "__name__ 2": 16, - "alias 1": 1, - "alias 2": 11, - "alias 3": 17, - "app 1": 6, - "app 2": 12, - "app 3": 18, - "instance 1": 7, - "instance 2": 13, - "instance 3": 19, - "job 1": 8, - "job 2": 14, - "job 3": 20, - "price_id": 0 - }, - "renameByName": { - "Value #B": "Time Since Update", - "Value #C": "Total Updates", - "alias": "Symbol", - "alias 1": "Symbol", - "price_id": "Price ID" + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null } - } + ] } - ], - "type": "table" - }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Time Since Update" + }, + "properties": [ + { + "id": "unit", + "value": "s" }, - "thresholdsStyle": { - "mode": "off" - } - }, - "decimals": 0, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null + { + "id": "thresholds", + "value": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 600 + }, + { + "color": "red", + "value": 3600 + } + ] } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 8 - }, - "id": 3, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + } + ] }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" + { + "matcher": { + "id": "byName", + "options": "Total Updates" + }, + "properties": [ + { + "id": "unit", + "value": "short" + } + ] } - }, - "pluginVersion": "11.5.2", - "targets": [ + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 7, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [ { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(increase(pyth_price_updates_total[1h]))", - "legendFormat": "Updates", - "range": true, - "refId": "A" + "desc": false, + "displayName": "Price ID" } - ], - "title": "Price Updates (Last Hour)", - "type": "timeseries" + ] }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "yellow", - "value": 0.1 - }, - { - "color": "red", - "value": 0.01 - } - ] - }, - "unit": "locale" + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" }, - "overrides": [] + "editorMode": "code", + "expr": "pyth_price_last_published_time", + "format": "table", + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "A" }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 16 + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "time() - pyth_price_last_published_time", + "format": "table", + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "B" }, - "id": 10, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true + "editorMode": "code", + "expr": "pyth_price_updates_total", + "format": "table", + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "C" + } + ], + "title": "Price Feeds List", + "transformations": [ + { + "id": "joinByField", + "options": { + "byField": "price_id", + "mode": "outer" + } }, - "pluginVersion": "11.5.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "pyth_wallet_balance", - "instant": true, - "legendFormat": "{{wallet_address}}", - "range": false, - "refId": "A" + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true, + "Value #A": true, + "__name__": true, + "__name__#B": true, + "__name__#C": true, + "alias 2": true, + "alias 3": true, + "alias#B": true, + "alias#C": true, + "app": true, + "app#B": true, + "app#C": true, + "instance": true, + "instance#B": true, + "instance#C": true, + "job": true, + "job#B": true, + "job#C": true, + "price_id": false, + "price_id#B": true, + "price_id#C": true + }, + "includeByName": {}, + "indexByName": { + "Time 1": 4, + "Time 2": 10, + "Time 3": 15, + "Value #A": 9, + "Value #B": 2, + "Value #C": 3, + "__name__ 1": 5, + "__name__ 2": 16, + "alias 1": 1, + "alias 2": 11, + "alias 3": 17, + "app 1": 6, + "app 2": 12, + "app 3": 18, + "instance 1": 7, + "instance 2": 13, + "instance 3": 19, + "job 1": 8, + "job 2": 14, + "job 3": 20, + "price_id": 0 + }, + "renameByName": { + "Value #B": "Time Since Update", + "Value #C": "Total Updates", + "alias": "Symbol", + "alias 1": "Symbol", + "price_id": "Price ID" + } } - ], - "title": "Wallet Balance", - "type": "stat" + } + ], + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "locale" + ] }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 16 + "unit": "none" }, - "id": 11, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 8 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "11.5.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "pyth_wallet_balance", - "legendFormat": "{{wallet_address}} ({{network}})", - "range": true, - "refId": "A" - } - ], - "title": "Wallet Balance Over Time", - "type": "timeseries" + "editorMode": "code", + "expr": "sum(increase(pyth_price_updates_total[1h]))", + "legendFormat": "Updates", + "range": true, + "refId": "A" + } + ], + "title": "Price Updates (Last Hour)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" + { + "color": "yellow", + "value": 0.1 }, - "thresholdsStyle": { - "mode": "off" + { + "color": "red", + "value": 0.01 } - }, - "decimals": 0, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" + ] }, - "overrides": [] + "unit": "locale" }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 24 - }, - "id": 6, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 10, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "11.5.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "sum(increase(pyth_price_update_errors_total[5m]))", - "legendFormat": "Errors", - "range": true, - "refId": "A" - } - ], - "title": "Update Errors", - "type": "timeseries" + "editorMode": "code", + "expr": "pyth_wallet_balance", + "instant": true, + "legendFormat": "{{wallet_address}}", + "range": false, + "refId": "A" + } + ], + "title": "Wallet Balance", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" }, - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "barWidthFactor": 0.6, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "s" + ] }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 24 + "unit": "locale" }, - "id": 4, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom", - "showLegend": true + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 16 + }, + "id": 11, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" }, - "tooltip": { - "hideZeros": false, - "mode": "single", - "sort": "none" - } - }, - "pluginVersion": "11.5.2", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "prometheus" - }, - "editorMode": "code", - "expr": "rate(pyth_price_update_duration_seconds_sum[5m]) / rate(pyth_price_update_duration_seconds_count[5m])", - "legendFormat": "{{alias}}", - "range": true, - "refId": "A" - } - ], - "title": "Average Update Duration", - "type": "timeseries" - } - ], - "preload": false, - "refresh": "5s", - "schemaVersion": 40, - "tags": [], - "templating": { - "list": [] - }, - "time": { - "from": "now-1h", - "to": "now" + "editorMode": "code", + "expr": "pyth_wallet_balance", + "legendFormat": "{{wallet_address}} ({{network}})", + "range": true, + "refId": "A" + } + ], + "title": "Wallet Balance Over Time", + "type": "timeseries" }, - "timepicker": {}, - "timezone": "", - "title": "Pyth Price Pusher Dashboard", - "uid": "pyth-price-pusher", - "version": 39, - "weekStart": "" - } + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 24 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "sum(increase(pyth_price_update_errors_total[5m]))", + "legendFormat": "Errors", + "range": true, + "refId": "A" + } + ], + "title": "Update Errors", + "type": "timeseries" + } + ], + "preload": false, + "refresh": "5s", + "schemaVersion": 40, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Pyth Price Pusher Dashboard", + "uid": "pyth-price-pusher", + "version": 41, + "weekStart": "" +} diff --git a/apps/price_pusher/src/controller.ts b/apps/price_pusher/src/controller.ts index 075cd998bc..a56154321a 100644 --- a/apps/price_pusher/src/controller.ts +++ b/apps/price_pusher/src/controller.ts @@ -144,27 +144,15 @@ export class Controller { const priceIds = pricesToPush.map((priceConfig) => priceConfig.id); try { - // Start timers for each price update if metrics are enabled - const timers = this.metrics - ? pricesToPush.map((config) => ({ - config, - timer: this.metrics!.startPriceUpdateTimer( - config.id, - config.alias, - ), - })) - : []; - await this.targetChainPricePusher.updatePriceFeed( priceIds, pubTimesToPush, ); - // Record successful updates and end timers + // Record successful updates if (this.metrics) { - for (const { config, timer } of timers) { + for (const config of pricesToPush) { this.metrics.recordPriceUpdate(config.id, config.alias); - timer(); // End the timer } } } catch (error) { diff --git a/apps/price_pusher/src/metrics.ts b/apps/price_pusher/src/metrics.ts index 56234acdcc..5ec75e3775 100644 --- a/apps/price_pusher/src/metrics.ts +++ b/apps/price_pusher/src/metrics.ts @@ -1,4 +1,4 @@ -import { Registry, Counter, Gauge, Histogram } from "prom-client"; +import { Registry, Counter, Gauge } from "prom-client"; import express from "express"; import { PriceInfo } from "./interface"; import { Logger } from "pino"; @@ -12,7 +12,6 @@ export class PricePusherMetrics { // Metrics for price feed updates public lastPublishedTime: Gauge; public priceUpdatesTotal: Counter; - public priceUpdateDuration: Histogram; public priceFeedsTotal: Gauge; public priceUpdateErrors: Counter; public priceUpdateAttempts: Counter; @@ -42,14 +41,6 @@ export class PricePusherMetrics { registers: [this.registry], }); - this.priceUpdateDuration = new Histogram({ - name: "pyth_price_update_duration_seconds", - help: "Duration of price update operations in seconds", - labelNames: ["price_id", "alias"], - buckets: [0.1, 0.5, 1, 2, 5, 10], - registers: [this.registry], - }); - this.priceFeedsTotal = new Gauge({ name: "pyth_price_feeds_total", help: "Total number of price feeds being monitored", @@ -132,15 +123,6 @@ export class PricePusherMetrics { this.priceFeedsTotal.set(count); } - // Create a timer for measuring price update duration - public startPriceUpdateTimer(priceId: string, alias: string): () => void { - const end = this.priceUpdateDuration.startTimer({ - price_id: priceId, - alias, - }); - return end; - } - // Update wallet balance public updateWalletBalance( walletAddress: string, From 62cb38c6b75c5a82bea830c092864e2d92b9d9db Mon Sep 17 00:00:00 2001 From: Daniel Chew Date: Wed, 19 Mar 2025 16:05:25 +0900 Subject: [PATCH 12/18] feat: add update conditions tracking and update related metrics in README and dashboard --- apps/price_pusher/README.md | 10 +- .../grafana-dashboard.sample.json | 126 +++++++++++++++++- apps/price_pusher/src/controller.ts | 12 +- apps/price_pusher/src/metrics.ts | 26 ++-- 4 files changed, 151 insertions(+), 23 deletions(-) diff --git a/apps/price_pusher/README.md b/apps/price_pusher/README.md index 469d2b2a85..eb60fdace2 100644 --- a/apps/price_pusher/README.md +++ b/apps/price_pusher/README.md @@ -270,10 +270,9 @@ The following metrics are available: - **pyth_price_last_published_time** (Gauge): The last published time of a price feed in unix timestamp - **pyth_price_updates_total** (Counter): Total number of price updates pushed to the chain -- **pyth_price_update_duration_seconds** (Histogram): Duration of price update operations in seconds - **pyth_price_feeds_total** (Gauge): Total number of price feeds being monitored - **pyth_price_update_errors_total** (Counter): Total number of errors encountered during price updates -- **pyth_price_update_attempts_total** (Counter): Total number of price update attempts +- **pyth_update_conditions_total** (Counter): Count of update condition checks by status (YES/NO/EARLY) - **pyth_wallet_balance** (Gauge): Current wallet balance of the price pusher in native token units ### Configuration @@ -358,10 +357,10 @@ sum(increase(pyth_price_updates_total[1h])) time() - pyth_price_last_published_time > 3600 ``` -4. Average update duration: +4. Distribution of update conditions: ``` -rate(pyth_price_update_duration_seconds_sum[5m]) / rate(pyth_price_update_duration_seconds_count[5m]) +sum by (condition) (increase(pyth_update_conditions_total[$__range])) ``` 5. Monitor wallet balances: @@ -378,13 +377,14 @@ pyth_wallet_balance < 0.1 ### Dashboard -The docker-compose setup includes a pre-configured Grafana dashboard (`grafana-dashboard.sample.json`) that provides monitoring of your price pusher operations. Based on the screenshot, the dashboard includes the following panels: +The docker-compose setup includes a pre-configured Grafana dashboard (`grafana-dashboard.sample.json`) that provides monitoring of your price pusher operations. The dashboard includes the following panels: - **Configured Price Feeds**: Shows the number of price feeds configured in your price-config file. - **Active Price Feeds**: Displays the number of price feeds currently being actively monitored. - **Time Since Last Update**: Shows how long it's been since the last successful price update was published on-chain. - **Price Feeds List**: A table listing all configured price feeds with their details. - **Price Updates (Last Hour)**: Graph showing the number of price updates over the last hour with timeline. +- **Update Conditions Distribution**: Pie chart showing the distribution of update conditions (YES/NO/EARLY) over the selected time range. - **Wallet Balance**: Current balance of your wallet in native token units. - **Wallet Balance Over Time**: Graph tracking your wallet balance over time to monitor consumption. - **Update Errors**: Tracks errors encountered during price update operations. diff --git a/apps/price_pusher/grafana-dashboard.sample.json b/apps/price_pusher/grafana-dashboard.sample.json index 3b54843cd8..3676524974 100644 --- a/apps/price_pusher/grafana-dashboard.sample.json +++ b/apps/price_pusher/grafana-dashboard.sample.json @@ -529,6 +529,126 @@ "title": "Price Updates (Last Hour)", "type": "timeseries" }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [] + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "YES" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "NO" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "EARLY" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 0, + "y": 16 + }, + "id": 13, + "options": { + "displayLabels": [ + "percent", + "name" + ], + "legend": { + "displayMode": "list", + "placement": "right", + "showLegend": true, + "values": [ + "value", + "percent" + ] + }, + "pieType": "pie", + "reduceOptions": { + "calcs": [ + "sum" + ], + "fields": "", + "values": false + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "editorMode": "code", + "expr": "sum by (condition) (increase(pyth_update_conditions_total[$__range]))", + "instant": false, + "legendFormat": "{{condition}}", + "range": true, + "refId": "A" + } + ], + "title": "Update Conditions Distribution (Current Range)", + "type": "piechart" + }, { "datasource": { "type": "prometheus", @@ -563,8 +683,8 @@ }, "gridPos": { "h": 8, - "w": 12, - "x": 0, + "w": 6, + "x": 6, "y": 16 }, "id": 10, @@ -808,6 +928,6 @@ "timezone": "", "title": "Pyth Price Pusher Dashboard", "uid": "pyth-price-pusher", - "version": 41, + "version": 44, "weekStart": "" } diff --git a/apps/price_pusher/src/controller.ts b/apps/price_pusher/src/controller.ts index a56154321a..08fc5f2e24 100644 --- a/apps/price_pusher/src/controller.ts +++ b/apps/price_pusher/src/controller.ts @@ -9,7 +9,7 @@ import { SuperWalletClient } from "./evm/super-wallet"; // Define the wallet balance info interface interface WalletBalanceInfo { client: SuperWalletClient; - address: string; + address: `0x${string}`; network: string; updateInterval: DurationInSeconds; } @@ -36,9 +36,7 @@ export class Controller { this.walletBalanceInfo = config.walletBalanceInfo; // Set the number of price feeds if metrics are enabled - if (this.metrics) { - this.metrics.setPriceFeedsTotal(this.priceConfigs.length); - } + this.metrics?.setPriceFeedsTotal(this.priceConfigs.length); } // Get wallet balance and update metrics @@ -48,7 +46,7 @@ export class Controller { try { const { client, address, network } = this.walletBalanceInfo; const balance = await client.getBalance({ - address: address as `0x${string}`, + address: address, }); this.metrics.updateWalletBalance(address, network, balance); @@ -112,9 +110,9 @@ export class Controller { this.logger, ); - // Record price update attempt in metrics + // Record update condition in metrics if (this.metrics) { - this.metrics.recordPriceUpdateAttempt(priceId, alias); + this.metrics.recordUpdateCondition(priceId, alias, priceShouldUpdate); } if (priceShouldUpdate == UpdateCondition.YES) { diff --git a/apps/price_pusher/src/metrics.ts b/apps/price_pusher/src/metrics.ts index 5ec75e3775..d6233afce6 100644 --- a/apps/price_pusher/src/metrics.ts +++ b/apps/price_pusher/src/metrics.ts @@ -2,6 +2,7 @@ import { Registry, Counter, Gauge } from "prom-client"; import express from "express"; import { PriceInfo } from "./interface"; import { Logger } from "pino"; +import { UpdateCondition } from "./price-config"; // Define the metrics we want to track export class PricePusherMetrics { @@ -14,7 +15,7 @@ export class PricePusherMetrics { public priceUpdatesTotal: Counter; public priceFeedsTotal: Gauge; public priceUpdateErrors: Counter; - public priceUpdateAttempts: Counter; + public updateConditionsTotal: Counter; // Wallet metrics public walletBalance: Gauge; @@ -54,10 +55,10 @@ export class PricePusherMetrics { registers: [this.registry], }); - this.priceUpdateAttempts = new Counter({ - name: "pyth_price_update_attempts_total", - help: "Total number of price update attempts", - labelNames: ["price_id", "alias"], + this.updateConditionsTotal = new Counter({ + name: "pyth_update_conditions_total", + help: "Total number of price update condition checks by status (YES/NO/EARLY)", + labelNames: ["price_id", "alias", "condition"], registers: [this.registry], }); @@ -100,9 +101,18 @@ export class PricePusherMetrics { this.priceUpdatesTotal.inc({ price_id: priceId, alias }); } - // Record a price update attempt - public recordPriceUpdateAttempt(priceId: string, alias: string): void { - this.priceUpdateAttempts.inc({ price_id: priceId, alias }); + // Record update condition status (YES/NO/EARLY) + public recordUpdateCondition( + priceId: string, + alias: string, + condition: UpdateCondition, + ): void { + const conditionLabel = UpdateCondition[condition]; + this.updateConditionsTotal.inc({ + price_id: priceId, + alias, + condition: conditionLabel, + }); } // Record a price update error From 7cf625935296b7c33c7fc3312caf41540bbe520a Mon Sep 17 00:00:00 2001 From: Daniel Chew Date: Wed, 19 Mar 2025 17:06:41 +0900 Subject: [PATCH 13/18] feat: implement EVM balance tracker and integrate with metrics --- .../grafana-dashboard.sample.json | 10 +- apps/price_pusher/src/balance-tracker/evm.ts | 51 ++++++++++ .../price_pusher/src/balance-tracker/index.ts | 46 +++++++++ .../src/balance-tracker/interface.ts | 97 +++++++++++++++++++ apps/price_pusher/src/controller.ts | 41 -------- apps/price_pusher/src/evm/command.ts | 24 +++-- 6 files changed, 218 insertions(+), 51 deletions(-) create mode 100644 apps/price_pusher/src/balance-tracker/evm.ts create mode 100644 apps/price_pusher/src/balance-tracker/index.ts create mode 100644 apps/price_pusher/src/balance-tracker/interface.ts diff --git a/apps/price_pusher/grafana-dashboard.sample.json b/apps/price_pusher/grafana-dashboard.sample.json index 3676524974..ac49074386 100644 --- a/apps/price_pusher/grafana-dashboard.sample.json +++ b/apps/price_pusher/grafana-dashboard.sample.json @@ -396,9 +396,15 @@ "job#C": true, "price_id": false, "price_id#B": true, - "price_id#C": true + "price_id#C": true, + "Value #C": false + }, + "includeByName": { + "alias 1": true, + "price_id": true, + "Value #B": true, + "Value #C": true }, - "includeByName": {}, "indexByName": { "Time 1": 4, "Time 2": 10, diff --git a/apps/price_pusher/src/balance-tracker/evm.ts b/apps/price_pusher/src/balance-tracker/evm.ts new file mode 100644 index 0000000000..e003023b96 --- /dev/null +++ b/apps/price_pusher/src/balance-tracker/evm.ts @@ -0,0 +1,51 @@ +import { SuperWalletClient } from "../evm/super-wallet"; +import { BaseBalanceTracker, BaseBalanceTrackerConfig } from "./interface"; + +/** + * EVM-specific configuration for balance tracker + */ +export interface EvmBalanceTrackerConfig extends BaseBalanceTrackerConfig { + /** EVM wallet client */ + client: SuperWalletClient; + /** EVM address with 0x prefix */ + address: `0x${string}`; +} + +/** + * EVM-specific implementation of the balance tracker + */ +export class EvmBalanceTracker extends BaseBalanceTracker { + private client: SuperWalletClient; + private evmAddress: `0x${string}`; + + constructor(config: EvmBalanceTrackerConfig) { + super({ + ...config, + logger: config.logger.child({ module: "EvmBalanceTracker" }), + }); + + this.client = config.client; + this.evmAddress = config.address; + } + + /** + * EVM-specific implementation of balance update + */ + protected async updateBalance(): Promise { + try { + const balance = await this.client.getBalance({ + address: this.evmAddress, + }); + + this.metrics.updateWalletBalance(this.address, this.network, balance); + this.logger.debug( + `Updated EVM wallet balance: ${this.address} = ${balance.toString()}`, + ); + } catch (error) { + this.logger.error( + { error }, + "Error fetching EVM wallet balance for metrics", + ); + } + } +} diff --git a/apps/price_pusher/src/balance-tracker/index.ts b/apps/price_pusher/src/balance-tracker/index.ts new file mode 100644 index 0000000000..e150c0cc80 --- /dev/null +++ b/apps/price_pusher/src/balance-tracker/index.ts @@ -0,0 +1,46 @@ +// Export the interfaces +export * from "./interface"; + +// Export chain-specific implementations +export * from "./evm"; +// export * from "./aptos"; + +// Factory function to create the appropriate balance tracker based on the chain +import { PricePusherMetrics } from "../metrics"; +import { Logger } from "pino"; +import { DurationInSeconds } from "../utils"; +import { IBalanceTracker } from "./interface"; +import { EvmBalanceTracker } from "./evm"; +import { SuperWalletClient } from "../evm/super-wallet"; + +/** + * Parameters for creating an EVM balance tracker + */ +export interface CreateEvmBalanceTrackerParams { + client: SuperWalletClient; + address: `0x${string}`; + network: string; + updateInterval: DurationInSeconds; + metrics: PricePusherMetrics; + logger: Logger; +} + +/** + * Factory function to create a balance tracker for EVM chains + */ +export function createEvmBalanceTracker( + params: CreateEvmBalanceTrackerParams, +): IBalanceTracker { + return new EvmBalanceTracker({ + client: params.client, + address: params.address, + network: params.network, + updateInterval: params.updateInterval, + metrics: params.metrics, + logger: params.logger, + }); +} + +// Additional factory functions for other chains would follow the same pattern: +// export function createSuiBalanceTracker(params: CreateSuiBalanceTrackerParams): IBalanceTracker { ... } +// export function createSolanaBalanceTracker(params: CreateSolanaBalanceTrackerParams): IBalanceTracker { ... } diff --git a/apps/price_pusher/src/balance-tracker/interface.ts b/apps/price_pusher/src/balance-tracker/interface.ts new file mode 100644 index 0000000000..dca9bbc506 --- /dev/null +++ b/apps/price_pusher/src/balance-tracker/interface.ts @@ -0,0 +1,97 @@ +import { Logger } from "pino"; +import { PricePusherMetrics } from "../metrics"; +import { DurationInSeconds } from "../utils"; + +/** + * Common configuration properties for all balance trackers + */ +export interface BaseBalanceTrackerConfig { + /** Address of the wallet to track */ + address: string; + /** Name/ID of the network/chain */ + network: string; + /** How often to update the balance */ + updateInterval: DurationInSeconds; + /** Metrics instance to report balance updates */ + metrics: PricePusherMetrics; + /** Logger instance */ + logger: Logger; +} + +/** + * Interface for all balance trackers to implement + * Each chain will have its own implementation of this interface + */ +export interface IBalanceTracker { + /** + * Start tracking the wallet balance + */ + start(): Promise; + + /** + * Stop tracking the wallet balance + */ + stop(): void; +} + +/** + * Abstract base class that implements common functionality for all balance trackers + */ +export abstract class BaseBalanceTracker implements IBalanceTracker { + protected address: string; + protected network: string; + protected updateInterval: DurationInSeconds; + protected metrics: PricePusherMetrics; + protected logger: Logger; + protected isRunning: boolean = false; + + constructor(config: BaseBalanceTrackerConfig) { + this.address = config.address; + this.network = config.network; + this.updateInterval = config.updateInterval; + this.metrics = config.metrics; + this.logger = config.logger; + } + + public async start(): Promise { + if (this.isRunning) { + return; + } + + this.isRunning = true; + + // Initial balance update + await this.updateBalance(); + + // Start the update loop + this.startUpdateLoop(); + } + + private async startUpdateLoop(): Promise { + // We're using dynamic import to avoid circular dependencies + const { sleep } = await import("../utils"); + + // Run in a loop to regularly update the balance + for (;;) { + // Wait first, since we already did the initial update in start() + await sleep(this.updateInterval * 1000); + + // Only continue if we're still running + if (!this.isRunning) { + break; + } + + await this.updateBalance(); + } + } + + /** + * Chain-specific balance update implementation + * Each chain will implement this method differently + */ + protected abstract updateBalance(): Promise; + + public stop(): void { + this.isRunning = false; + } +} diff --git a/apps/price_pusher/src/controller.ts b/apps/price_pusher/src/controller.ts index 08fc5f2e24..f12849fd72 100644 --- a/apps/price_pusher/src/controller.ts +++ b/apps/price_pusher/src/controller.ts @@ -4,20 +4,10 @@ import { IPriceListener, IPricePusher } from "./interface"; import { PriceConfig, shouldUpdate, UpdateCondition } from "./price-config"; import { Logger } from "pino"; import { PricePusherMetrics } from "./metrics"; -import { SuperWalletClient } from "./evm/super-wallet"; - -// Define the wallet balance info interface -interface WalletBalanceInfo { - client: SuperWalletClient; - address: `0x${string}`; - network: string; - updateInterval: DurationInSeconds; -} export class Controller { private pushingFrequency: DurationInSeconds; private metrics?: PricePusherMetrics; - private walletBalanceInfo?: WalletBalanceInfo; constructor( private priceConfigs: PriceConfig[], @@ -28,46 +18,20 @@ export class Controller { config: { pushingFrequency: DurationInSeconds; metrics?: PricePusherMetrics; - walletBalanceInfo?: WalletBalanceInfo; }, ) { this.pushingFrequency = config.pushingFrequency; this.metrics = config.metrics; - this.walletBalanceInfo = config.walletBalanceInfo; // Set the number of price feeds if metrics are enabled this.metrics?.setPriceFeedsTotal(this.priceConfigs.length); } - // Get wallet balance and update metrics - private async updateWalletBalance(): Promise { - if (!this.metrics || !this.walletBalanceInfo) return; - - try { - const { client, address, network } = this.walletBalanceInfo; - const balance = await client.getBalance({ - address: address, - }); - - this.metrics.updateWalletBalance(address, network, balance); - this.logger.debug( - `Updated wallet balance: ${address} = ${balance.toString()}`, - ); - } catch (error) { - this.logger.error({ error }, "Error fetching wallet balance for metrics"); - } - } - async start() { // start the listeners await this.sourcePriceListener.start(); await this.targetPriceListener.start(); - // Update wallet balance initially if metrics are enabled - if (this.metrics && this.walletBalanceInfo) { - await this.updateWalletBalance(); - } - // wait for the listeners to get updated. There could be a restart // before this run and we need to respect the cooldown duration as // their might be a message sent before. @@ -80,11 +44,6 @@ export class Controller { const pricesToPush: PriceConfig[] = []; const pubTimesToPush: UnixTimestamp[] = []; - // Update wallet balance if metrics are enabled - if (this.metrics && this.walletBalanceInfo) { - await this.updateWalletBalance(); - } - for (const priceConfig of this.priceConfigs) { const priceId = priceConfig.id; const alias = priceConfig.alias; diff --git a/apps/price_pusher/src/evm/command.ts b/apps/price_pusher/src/evm/command.ts index 46f96cfb72..14ad68b448 100644 --- a/apps/price_pusher/src/evm/command.ts +++ b/apps/price_pusher/src/evm/command.ts @@ -12,6 +12,7 @@ import { createClient } from "./super-wallet"; import { createPythContract } from "./pyth-contract"; import { isWsEndpoint, filterInvalidPriceItems } from "../utils"; import { PricePusherMetrics } from "../metrics"; +import { createEvmBalanceTracker } from "../balance-tracker"; export default { command: "evm", @@ -199,17 +200,24 @@ export default { { pushingFrequency, metrics, - walletBalanceInfo: metrics - ? { - client, - address: client.account.address, - network: await client.getChainId().then((id) => id.toString()), - updateInterval: pushingFrequency, - } - : undefined, }, ); + // Create and start the balance tracker if metrics are enabled + if (metrics) { + const balanceTracker = createEvmBalanceTracker({ + client, + address: client.account.address, + network: await client.getChainId().then((id) => id.toString()), + updateInterval: pushingFrequency, + metrics, + logger, + }); + + // Start the balance tracker + await balanceTracker.start(); + } + await controller.start(); }, }; From 08ea7dbb65fc6fd531fc5670fd0213ca62488a94 Mon Sep 17 00:00:00 2001 From: Daniel Chew Date: Wed, 19 Mar 2025 17:13:37 +0900 Subject: [PATCH 14/18] refactor: update Grafana dashboard expressions and simplify error tracking metrics --- apps/price_pusher/grafana-dashboard.sample.json | 6 +++--- apps/price_pusher/src/controller.ts | 6 +----- apps/price_pusher/src/metrics.ts | 9 ++------- 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/apps/price_pusher/grafana-dashboard.sample.json b/apps/price_pusher/grafana-dashboard.sample.json index ac49074386..c300364b56 100644 --- a/apps/price_pusher/grafana-dashboard.sample.json +++ b/apps/price_pusher/grafana-dashboard.sample.json @@ -526,13 +526,13 @@ "uid": "prometheus" }, "editorMode": "code", - "expr": "sum(increase(pyth_price_updates_total[1h]))", + "expr": "sum(increase(pyth_price_updates_total[$__range]))", "legendFormat": "Updates", "range": true, "refId": "A" } ], - "title": "Price Updates (Last Hour)", + "title": "Price Updates (Current Range)", "type": "timeseries" }, { @@ -909,7 +909,7 @@ "uid": "prometheus" }, "editorMode": "code", - "expr": "sum(increase(pyth_price_update_errors_total[5m]))", + "expr": "sum(increase(pyth_price_update_errors_total[$__range]))", "legendFormat": "Errors", "range": true, "refId": "A" diff --git a/apps/price_pusher/src/controller.ts b/apps/price_pusher/src/controller.ts index f12849fd72..29079987b2 100644 --- a/apps/price_pusher/src/controller.ts +++ b/apps/price_pusher/src/controller.ts @@ -121,11 +121,7 @@ export class Controller { // Record errors in metrics if (this.metrics) { for (const config of pricesToPush) { - this.metrics.recordPriceUpdateError( - config.id, - config.alias, - error instanceof Error ? error.name : "unknown", - ); + this.metrics.recordPriceUpdateError(config.id, config.alias); } } } diff --git a/apps/price_pusher/src/metrics.ts b/apps/price_pusher/src/metrics.ts index d6233afce6..d445c03c27 100644 --- a/apps/price_pusher/src/metrics.ts +++ b/apps/price_pusher/src/metrics.ts @@ -51,7 +51,7 @@ export class PricePusherMetrics { this.priceUpdateErrors = new Counter({ name: "pyth_price_update_errors_total", help: "Total number of errors encountered during price updates", - labelNames: ["price_id", "alias", "error_type"], + labelNames: ["price_id", "alias"], registers: [this.registry], }); @@ -116,15 +116,10 @@ export class PricePusherMetrics { } // Record a price update error - public recordPriceUpdateError( - priceId: string, - alias: string, - errorType: string, - ): void { + public recordPriceUpdateError(priceId: string, alias: string): void { this.priceUpdateErrors.inc({ price_id: priceId, alias, - error_type: errorType, }); } From 48bfa09f52c48c65d93a676e80e0e65fff56ba4b Mon Sep 17 00:00:00 2001 From: Daniel Chew Date: Wed, 19 Mar 2025 17:44:53 +0900 Subject: [PATCH 15/18] feat: update metrics tracking for price updates and errors, enhancing Grafana dashboard descriptions --- apps/price_pusher/README.md | 4 +- .../grafana-dashboard.sample.json | 32 ++++++--- apps/price_pusher/src/controller.ts | 32 ++++++++- apps/price_pusher/src/metrics.ts | 67 ++++++++++--------- 4 files changed, 92 insertions(+), 43 deletions(-) diff --git a/apps/price_pusher/README.md b/apps/price_pusher/README.md index eb60fdace2..ccb7bbf6cd 100644 --- a/apps/price_pusher/README.md +++ b/apps/price_pusher/README.md @@ -383,11 +383,11 @@ The docker-compose setup includes a pre-configured Grafana dashboard (`grafana-d - **Active Price Feeds**: Displays the number of price feeds currently being actively monitored. - **Time Since Last Update**: Shows how long it's been since the last successful price update was published on-chain. - **Price Feeds List**: A table listing all configured price feeds with their details. -- **Price Updates (Last Hour)**: Graph showing the number of price updates over the last hour with timeline. +- **Successful Updates (Current Range)**: Graph showing the number of successful price updates over the current range with timeline. - **Update Conditions Distribution**: Pie chart showing the distribution of update conditions (YES/NO/EARLY) over the selected time range. - **Wallet Balance**: Current balance of your wallet in native token units. - **Wallet Balance Over Time**: Graph tracking your wallet balance over time to monitor consumption. -- **Update Errors**: Tracks errors encountered during price update operations. +- **Failed Updates (Current Range)**: Graph showing the number of failed price updates over the current range with timeline. When you first start the monitoring stack, the dashboard may show "No data" in the panels until the price pusher has been running for some time and has collected sufficient metrics. diff --git a/apps/price_pusher/grafana-dashboard.sample.json b/apps/price_pusher/grafana-dashboard.sample.json index c300364b56..3c6bcc6a8a 100644 --- a/apps/price_pusher/grafana-dashboard.sample.json +++ b/apps/price_pusher/grafana-dashboard.sample.json @@ -355,7 +355,7 @@ "uid": "prometheus" }, "editorMode": "code", - "expr": "pyth_price_updates_total", + "expr": "pyth_price_update_attempts_total{status=\"success\"}", "format": "table", "instant": true, "legendFormat": "__auto", @@ -496,7 +496,23 @@ }, "unit": "none" }, - "overrides": [] + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Updates" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + } + ] }, "gridPos": { "h": 8, @@ -526,13 +542,13 @@ "uid": "prometheus" }, "editorMode": "code", - "expr": "sum(increase(pyth_price_updates_total[$__range]))", + "expr": "sum(increase(pyth_price_update_attempts_total{status=\"success\"}[$__range]))", "legendFormat": "Updates", "range": true, "refId": "A" } ], - "title": "Price Updates (Current Range)", + "title": "Successful Updates (Current Range)", "type": "timeseries" }, { @@ -645,9 +661,9 @@ "uid": "prometheus" }, "editorMode": "code", - "expr": "sum by (condition) (increase(pyth_update_conditions_total[$__range]))", + "expr": "sum by (trigger) (increase(pyth_price_update_attempts_total[$__range]))", "instant": false, - "legendFormat": "{{condition}}", + "legendFormat": "{{trigger}}", "range": true, "refId": "A" } @@ -909,13 +925,13 @@ "uid": "prometheus" }, "editorMode": "code", - "expr": "sum(increase(pyth_price_update_errors_total[$__range]))", + "expr": "sum(increase(pyth_price_update_attempts_total{status=\"error\"}[$__range]))", "legendFormat": "Errors", "range": true, "refId": "A" } ], - "title": "Update Errors", + "title": "Failed Updates (Current Range)", "type": "timeseries" } ], diff --git a/apps/price_pusher/src/controller.ts b/apps/price_pusher/src/controller.ts index 29079987b2..787c19b036 100644 --- a/apps/price_pusher/src/controller.ts +++ b/apps/price_pusher/src/controller.ts @@ -109,7 +109,21 @@ export class Controller { // Record successful updates if (this.metrics) { for (const config of pricesToPush) { - this.metrics.recordPriceUpdate(config.id, config.alias); + const triggerValue = + shouldUpdate( + config, + this.sourcePriceListener.getLatestPriceInfo(config.id), + this.targetPriceListener.getLatestPriceInfo(config.id), + this.logger, + ) === UpdateCondition.YES + ? "yes" + : "early"; + + this.metrics.recordPriceUpdate( + config.id, + config.alias, + triggerValue, + ); } } } catch (error) { @@ -121,7 +135,21 @@ export class Controller { // Record errors in metrics if (this.metrics) { for (const config of pricesToPush) { - this.metrics.recordPriceUpdateError(config.id, config.alias); + const triggerValue = + shouldUpdate( + config, + this.sourcePriceListener.getLatestPriceInfo(config.id), + this.targetPriceListener.getLatestPriceInfo(config.id), + this.logger, + ) === UpdateCondition.YES + ? "yes" + : "early"; + + this.metrics.recordPriceUpdateError( + config.id, + config.alias, + triggerValue, + ); } } } diff --git a/apps/price_pusher/src/metrics.ts b/apps/price_pusher/src/metrics.ts index d445c03c27..0090f717dd 100644 --- a/apps/price_pusher/src/metrics.ts +++ b/apps/price_pusher/src/metrics.ts @@ -12,10 +12,8 @@ export class PricePusherMetrics { // Metrics for price feed updates public lastPublishedTime: Gauge; - public priceUpdatesTotal: Counter; + public priceUpdateAttempts: Counter; public priceFeedsTotal: Gauge; - public priceUpdateErrors: Counter; - public updateConditionsTotal: Counter; // Wallet metrics public walletBalance: Gauge; @@ -35,10 +33,10 @@ export class PricePusherMetrics { registers: [this.registry], }); - this.priceUpdatesTotal = new Counter({ - name: "pyth_price_updates_total", - help: "Total number of price updates pushed to the chain", - labelNames: ["price_id", "alias"], + this.priceUpdateAttempts = new Counter({ + name: "pyth_price_update_attempts_total", + help: "Total number of price update attempts with their trigger condition and status", + labelNames: ["price_id", "alias", "trigger", "status"], registers: [this.registry], }); @@ -48,20 +46,6 @@ export class PricePusherMetrics { registers: [this.registry], }); - this.priceUpdateErrors = new Counter({ - name: "pyth_price_update_errors_total", - help: "Total number of errors encountered during price updates", - labelNames: ["price_id", "alias"], - registers: [this.registry], - }); - - this.updateConditionsTotal = new Counter({ - name: "pyth_update_conditions_total", - help: "Total number of price update condition checks by status (YES/NO/EARLY)", - labelNames: ["price_id", "alias", "condition"], - registers: [this.registry], - }); - // Wallet balance metric this.walletBalance = new Gauge({ name: "pyth_wallet_balance", @@ -97,8 +81,17 @@ export class PricePusherMetrics { } // Record a successful price update - public recordPriceUpdate(priceId: string, alias: string): void { - this.priceUpdatesTotal.inc({ price_id: priceId, alias }); + public recordPriceUpdate( + priceId: string, + alias: string, + trigger: string = "yes", + ): void { + this.priceUpdateAttempts.inc({ + price_id: priceId, + alias, + trigger: trigger.toLowerCase(), + status: "success", + }); } // Record update condition status (YES/NO/EARLY) @@ -107,19 +100,31 @@ export class PricePusherMetrics { alias: string, condition: UpdateCondition, ): void { - const conditionLabel = UpdateCondition[condition]; - this.updateConditionsTotal.inc({ - price_id: priceId, - alias, - condition: conditionLabel, - }); + const triggerLabel = UpdateCondition[condition].toLowerCase(); + // Only record as 'skipped' when the condition is NO + if (condition === UpdateCondition.NO) { + this.priceUpdateAttempts.inc({ + price_id: priceId, + alias, + trigger: triggerLabel, + status: "skipped", + }); + } + // YES and EARLY don't increment the counter here - they'll be counted + // when recordPriceUpdate or recordPriceUpdateError is called } // Record a price update error - public recordPriceUpdateError(priceId: string, alias: string): void { - this.priceUpdateErrors.inc({ + public recordPriceUpdateError( + priceId: string, + alias: string, + trigger: string = "yes", + ): void { + this.priceUpdateAttempts.inc({ price_id: priceId, alias, + trigger: trigger.toLowerCase(), + status: "error", }); } From 8ca483b6a5116c089a11d83525aad8d34fbebad6 Mon Sep 17 00:00:00 2001 From: Daniel Chew Date: Wed, 19 Mar 2025 22:33:06 +0900 Subject: [PATCH 16/18] feat: enhance README and alerts configuration with updated metrics and error tracking --- apps/price_pusher/README.md | 48 +++++------------------------ apps/price_pusher/alerts.sample.yml | 13 ++------ 2 files changed, 9 insertions(+), 52 deletions(-) diff --git a/apps/price_pusher/README.md b/apps/price_pusher/README.md index ccb7bbf6cd..857f4cf4a4 100644 --- a/apps/price_pusher/README.md +++ b/apps/price_pusher/README.md @@ -268,12 +268,10 @@ The price_pusher now supports Prometheus metrics to monitor the health and perfo The following metrics are available: -- **pyth_price_last_published_time** (Gauge): The last published time of a price feed in unix timestamp -- **pyth_price_updates_total** (Counter): Total number of price updates pushed to the chain +- **pyth_price_last_published_time** (Gauge): The last published time of a price feed in unix timestamp, labeled by price_id and alias +- **pyth_price_update_attempts_total** (Counter): Total number of price update attempts with their trigger condition and status, labeled by price_id, alias, trigger, and status - **pyth_price_feeds_total** (Gauge): Total number of price feeds being monitored -- **pyth_price_update_errors_total** (Counter): Total number of errors encountered during price updates -- **pyth_update_conditions_total** (Counter): Count of update condition checks by status (YES/NO/EARLY) -- **pyth_wallet_balance** (Gauge): Current wallet balance of the price pusher in native token units +- **pyth_wallet_balance** (Gauge): Current wallet balance of the price pusher in native token units, labeled by wallet_address and network ### Configuration @@ -304,37 +302,6 @@ This will start: The docker-compose.metrics.sample.yaml file includes a pre-configured Grafana dashboard (see the [Dashboard](#dashboard) section below) that displays all the metrics mentioned above. This dashboard provides monitoring of your price pusher operations with panels for configured feeds, active feeds, wallet balance, update statistics, and error tracking. The dashboard is automatically provisioned when you start the stack with docker-compose. -Alternatively, if you prefer to set up the monitoring stack manually: - -1. Create a `prometheus.sample.yml` file: - -```yaml -global: - scrape_interval: 15s - -scrape_configs: - - job_name: "price_pusher" - static_configs: - - targets: ["localhost:9090"] -``` - -2. Run Prometheus with Docker: - -```bash -docker run -d --name prometheus -p 9090:9090 \ - -v $(pwd)/prometheus.sample.yml:/etc/prometheus/prometheus.yml \ - -v $(pwd)/alerts.sample.yml:/etc/prometheus/alerts.yml \ - prom/prometheus -``` - -3. Run Grafana with Docker: - -```bash -docker run -d --name grafana -p 3000:3000 grafana/grafana -``` - -4. Access Grafana at http://localhost:3000 (default credentials: admin/admin) and add Prometheus as a data source (URL: http://host.docker.internal:9090). - ### Example Grafana Queries Here are some example Grafana queries to monitor your price feeds: @@ -348,7 +315,7 @@ pyth_price_last_published_time 2. Number of price updates in the last hour: ``` -sum(increase(pyth_price_updates_total[1h])) +sum(increase(pyth_price_update_attempts_total{status="success"}[1h])) ``` 3. Price feeds not updated in the last hour: @@ -398,10 +365,9 @@ This dashboard is automatically provisioned when you start the docker-compose st The price pusher includes pre-configured Prometheus alerting rules in the `alerts.sample.yml` file. These rules monitor various aspects of the price pusher's operation, including: - Price feeds not being updated for an extended period (>1 hour) -- High error rates in price updates -- No recent price updates across all feeds -- Service availability -- High update durations +- High error rates in price update attempts +- No successful price updates across all feeds in the last 30 minutes +- Service availability monitoring - Low wallet balances with two severity levels: - Warning: Balance below 0.1 native tokens - Critical: Balance below 0.01 native tokens (transactions may fail soon) diff --git a/apps/price_pusher/alerts.sample.yml b/apps/price_pusher/alerts.sample.yml index a441e4a1a0..f8ba08e9bb 100644 --- a/apps/price_pusher/alerts.sample.yml +++ b/apps/price_pusher/alerts.sample.yml @@ -11,7 +11,7 @@ groups: description: "Price feed {{ $labels.alias }} has not been updated for more than 1 hour" - alert: HighErrorRate - expr: sum(increase(pyth_price_update_errors_total[15m])) > 5 + expr: sum(increase(pyth_price_update_attempts_total{status="error"}[15m])) > 5 for: 5m labels: severity: warning @@ -20,7 +20,7 @@ groups: description: "There have been more than 5 errors in the last 15 minutes" - alert: NoRecentPriceUpdates - expr: sum(increase(pyth_price_updates_total[30m])) == 0 + expr: sum(increase(pyth_price_update_attempts_total{status="success"}[30m])) == 0 for: 5m labels: severity: critical @@ -37,15 +37,6 @@ groups: summary: "Price pusher service is down" description: "The price pusher service {{ $labels.instance }} is down" - - alert: HighUpdateDuration - expr: rate(pyth_price_update_duration_seconds_sum[5m]) / rate(pyth_price_update_duration_seconds_count[5m]) > 5 - for: 5m - labels: - severity: warning - annotations: - summary: "High update duration" - description: "Price updates are taking longer than 5 seconds on average" - - alert: WalletBalanceLow expr: pyth_wallet_balance < 0.1 for: 5m From 9210f30a169fc7593250cab13d7d7172f5186a1d Mon Sep 17 00:00:00 2001 From: Daniel Chew Date: Wed, 19 Mar 2025 22:51:04 +0900 Subject: [PATCH 17/18] refactor: reorganize balance tracker files and consolidate interfaces into a single location --- .../index.ts => balance-tracker.ts} | 16 +-- .../src/balance-tracker/interface.ts | 97 ------------------- .../evm.ts => evm/balance-tracker.ts} | 4 +- apps/price_pusher/src/interface.ts | 96 ++++++++++++++++++ 4 files changed, 102 insertions(+), 111 deletions(-) rename apps/price_pusher/src/{balance-tracker/index.ts => balance-tracker.ts} (71%) delete mode 100644 apps/price_pusher/src/balance-tracker/interface.ts rename apps/price_pusher/src/{balance-tracker/evm.ts => evm/balance-tracker.ts} (90%) diff --git a/apps/price_pusher/src/balance-tracker/index.ts b/apps/price_pusher/src/balance-tracker.ts similarity index 71% rename from apps/price_pusher/src/balance-tracker/index.ts rename to apps/price_pusher/src/balance-tracker.ts index e150c0cc80..f11b9f0290 100644 --- a/apps/price_pusher/src/balance-tracker/index.ts +++ b/apps/price_pusher/src/balance-tracker.ts @@ -1,17 +1,9 @@ -// Export the interfaces -export * from "./interface"; - -// Export chain-specific implementations -export * from "./evm"; -// export * from "./aptos"; - -// Factory function to create the appropriate balance tracker based on the chain -import { PricePusherMetrics } from "../metrics"; +import { PricePusherMetrics } from "./metrics"; import { Logger } from "pino"; -import { DurationInSeconds } from "../utils"; +import { DurationInSeconds } from "./utils"; import { IBalanceTracker } from "./interface"; -import { EvmBalanceTracker } from "./evm"; -import { SuperWalletClient } from "../evm/super-wallet"; +import { EvmBalanceTracker } from "./evm/balance-tracker"; +import { SuperWalletClient } from "./evm/super-wallet"; /** * Parameters for creating an EVM balance tracker diff --git a/apps/price_pusher/src/balance-tracker/interface.ts b/apps/price_pusher/src/balance-tracker/interface.ts deleted file mode 100644 index dca9bbc506..0000000000 --- a/apps/price_pusher/src/balance-tracker/interface.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { Logger } from "pino"; -import { PricePusherMetrics } from "../metrics"; -import { DurationInSeconds } from "../utils"; - -/** - * Common configuration properties for all balance trackers - */ -export interface BaseBalanceTrackerConfig { - /** Address of the wallet to track */ - address: string; - /** Name/ID of the network/chain */ - network: string; - /** How often to update the balance */ - updateInterval: DurationInSeconds; - /** Metrics instance to report balance updates */ - metrics: PricePusherMetrics; - /** Logger instance */ - logger: Logger; -} - -/** - * Interface for all balance trackers to implement - * Each chain will have its own implementation of this interface - */ -export interface IBalanceTracker { - /** - * Start tracking the wallet balance - */ - start(): Promise; - - /** - * Stop tracking the wallet balance - */ - stop(): void; -} - -/** - * Abstract base class that implements common functionality for all balance trackers - */ -export abstract class BaseBalanceTracker implements IBalanceTracker { - protected address: string; - protected network: string; - protected updateInterval: DurationInSeconds; - protected metrics: PricePusherMetrics; - protected logger: Logger; - protected isRunning: boolean = false; - - constructor(config: BaseBalanceTrackerConfig) { - this.address = config.address; - this.network = config.network; - this.updateInterval = config.updateInterval; - this.metrics = config.metrics; - this.logger = config.logger; - } - - public async start(): Promise { - if (this.isRunning) { - return; - } - - this.isRunning = true; - - // Initial balance update - await this.updateBalance(); - - // Start the update loop - this.startUpdateLoop(); - } - - private async startUpdateLoop(): Promise { - // We're using dynamic import to avoid circular dependencies - const { sleep } = await import("../utils"); - - // Run in a loop to regularly update the balance - for (;;) { - // Wait first, since we already did the initial update in start() - await sleep(this.updateInterval * 1000); - - // Only continue if we're still running - if (!this.isRunning) { - break; - } - - await this.updateBalance(); - } - } - - /** - * Chain-specific balance update implementation - * Each chain will implement this method differently - */ - protected abstract updateBalance(): Promise; - - public stop(): void { - this.isRunning = false; - } -} diff --git a/apps/price_pusher/src/balance-tracker/evm.ts b/apps/price_pusher/src/evm/balance-tracker.ts similarity index 90% rename from apps/price_pusher/src/balance-tracker/evm.ts rename to apps/price_pusher/src/evm/balance-tracker.ts index e003023b96..2170c4c7f4 100644 --- a/apps/price_pusher/src/balance-tracker/evm.ts +++ b/apps/price_pusher/src/evm/balance-tracker.ts @@ -1,5 +1,5 @@ -import { SuperWalletClient } from "../evm/super-wallet"; -import { BaseBalanceTracker, BaseBalanceTrackerConfig } from "./interface"; +import { SuperWalletClient } from "./super-wallet"; +import { BaseBalanceTracker, BaseBalanceTrackerConfig } from "../interface"; /** * EVM-specific configuration for balance tracker diff --git a/apps/price_pusher/src/interface.ts b/apps/price_pusher/src/interface.ts index cb945b2c33..95c29fd348 100644 --- a/apps/price_pusher/src/interface.ts +++ b/apps/price_pusher/src/interface.ts @@ -1,5 +1,7 @@ import { HexString, UnixTimestamp } from "@pythnetwork/hermes-client"; import { DurationInSeconds } from "./utils"; +import { Logger } from "pino"; +import { PricePusherMetrics } from "./metrics"; export type PriceItem = { id: HexString; @@ -82,3 +84,97 @@ export interface IPricePusher { pubTimesToPush: UnixTimestamp[], ): Promise; } + +/** + * Common configuration properties for all balance trackers + */ +export interface BaseBalanceTrackerConfig { + /** Address of the wallet to track */ + address: string; + /** Name/ID of the network/chain */ + network: string; + /** How often to update the balance */ + updateInterval: DurationInSeconds; + /** Metrics instance to report balance updates */ + metrics: PricePusherMetrics; + /** Logger instance */ + logger: Logger; +} + +/** + * Interface for all balance trackers to implement + * Each chain will have its own implementation of this interface + */ +export interface IBalanceTracker { + /** + * Start tracking the wallet balance + */ + start(): Promise; + + /** + * Stop tracking the wallet balance + */ + stop(): void; +} + +/** + * Abstract base class that implements common functionality for all balance trackers + */ +export abstract class BaseBalanceTracker implements IBalanceTracker { + protected address: string; + protected network: string; + protected updateInterval: DurationInSeconds; + protected metrics: PricePusherMetrics; + protected logger: Logger; + protected isRunning: boolean = false; + + constructor(config: BaseBalanceTrackerConfig) { + this.address = config.address; + this.network = config.network; + this.updateInterval = config.updateInterval; + this.metrics = config.metrics; + this.logger = config.logger; + } + + public async start(): Promise { + if (this.isRunning) { + return; + } + + this.isRunning = true; + + // Initial balance update + await this.updateBalance(); + + // Start the update loop + this.startUpdateLoop(); + } + + private async startUpdateLoop(): Promise { + // We're using dynamic import to avoid circular dependencies + const { sleep } = await import("./utils"); + + // Run in a loop to regularly update the balance + for (;;) { + // Wait first, since we already did the initial update in start() + await sleep(this.updateInterval * 1000); + + // Only continue if we're still running + if (!this.isRunning) { + break; + } + + await this.updateBalance(); + } + } + + /** + * Chain-specific balance update implementation + * Each chain will implement this method differently + */ + protected abstract updateBalance(): Promise; + + public stop(): void { + this.isRunning = false; + } +} From 19ebf181dd353f66d12629a66cdfca5919ff1d26 Mon Sep 17 00:00:00 2001 From: Daniel Chew Date: Wed, 19 Mar 2025 22:57:13 +0900 Subject: [PATCH 18/18] chore: bump version to 9.1.2 in price pusher package --- apps/price_pusher/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/price_pusher/package.json b/apps/price_pusher/package.json index 9a28847a10..fc76bc44d1 100644 --- a/apps/price_pusher/package.json +++ b/apps/price_pusher/package.json @@ -1,6 +1,6 @@ { "name": "@pythnetwork/price-pusher", - "version": "9.1.1", + "version": "9.1.2", "description": "Pyth Price Pusher", "homepage": "https://pyth.network", "main": "lib/index.js",