From 44531e550d74b725f2e76fa0a637487653b257f2 Mon Sep 17 00:00:00 2001 From: TaprootFreak <142087526+TaprootFreak@users.noreply.github.com> Date: Fri, 15 May 2026 19:11:05 +0200 Subject: [PATCH] Remove daily CoinGecko quota probe (now owned by pricing-proxy) (#68) The pricing-proxy ships with its own quota monitor (DFXswiss/pricing-proxy PR #7 + #9): it probes /api/v3/key every 30 min and alerts via the dedicated @dfx_pricing_proxy_bot at 80 % (warning) and 95 % (critical) of the monthly credit, with a recovery message on healthy. That makes this service's daily probe redundant. Drop the cron, its state field and its two constants; the unused CoingeckoKeyInfo interface goes with them. The FX-staleness watchdog and the cache plumbing are untouched. Update the README to drop the 'daily Pro quota probe' clause from the CoinGecko section. --- README.md | 5 ++-- src/monitoringV2/price.service.ts | 45 ------------------------------- 2 files changed, 2 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 7c2f0d9..bd2ac33 100644 --- a/README.md +++ b/README.md @@ -71,9 +71,8 @@ Swagger documentation available at: `http://localhost:3001/swagger` ## CoinGecko The monitoring service needs a CoinGecko-compatible endpoint for USD/EUR -and USD/CHF FX rates (drives EUR-denominated price conversions and the -staleness watchdog) and the daily Pro quota probe. Configuration is two -env vars: +and USD/CHF FX rates — they drive EUR-denominated price conversions and +the staleness watchdog. Configuration is two env vars: | Var | Required | Purpose | |---|---|---| diff --git a/src/monitoringV2/price.service.ts b/src/monitoringV2/price.service.ts index 3b606f3..20bee81 100644 --- a/src/monitoringV2/price.service.ts +++ b/src/monitoringV2/price.service.ts @@ -39,17 +39,8 @@ interface CoingeckoEndpoint { headers: Record; } -interface CoingeckoKeyInfo { - plan?: string; - monthly_call_credit?: number; - current_total_monthly_calls?: number; - current_remaining_monthly_calls?: number; -} - const STALENESS_ALERT_THRESHOLD_MS = 60 * 60 * 1000; const STALENESS_ALERT_REPEAT_MS = 6 * 60 * 60 * 1000; -const QUOTA_REMAINING_ALERT_THRESHOLD = 25_000; -const QUOTA_ALERT_REPEAT_MS = 24 * 60 * 60 * 1000; @Injectable() export class PriceService { @@ -63,7 +54,6 @@ export class PriceService { // suppress the alert indefinitely. private fxLastSuccessMs: number = Date.now(); private fxStalenessAlertedAt: number | null = null; - private quotaAlertedAt: number | null = null; constructor( private readonly providerService: ProviderService, @@ -307,41 +297,6 @@ export class PriceService { ); } - /** - * Daily probe of /api/v3/key through the pricing proxy. Emits a critical - * alert when the monthly remaining call credit drops below - * QUOTA_REMAINING_ALERT_THRESHOLD. - */ - @Cron(CronExpression.EVERY_DAY_AT_NOON) - async checkCoingeckoQuota(): Promise { - try { - const { baseUrl, headers } = this.resolveCoingeckoEndpoint(); - const response = await axios.get(`${baseUrl}/api/v3/key`, { - headers, - timeout: 10000, - }); - const { current_remaining_monthly_calls: remaining, monthly_call_credit: credit } = response.data; - if (typeof remaining !== 'number' || typeof credit !== 'number' || credit <= 0) return; - - const pct = Math.round((remaining / credit) * 100); - this.logger.log(`CoinGecko quota: ${remaining} of ${credit} calls remaining (${pct}%)`); - - if (remaining >= QUOTA_REMAINING_ALERT_THRESHOLD) { - this.quotaAlertedAt = null; - return; - } - if (this.quotaAlertedAt && Date.now() - this.quotaAlertedAt < QUOTA_ALERT_REPEAT_MS) return; - - this.quotaAlertedAt = Date.now(); - await this.telegramService.sendCriticalAlert( - `CoinGecko monthly quota almost exhausted: ${remaining.toLocaleString()} of ` + - `${credit.toLocaleString()} calls remaining (${pct}%).` - ); - } catch (error) { - this.logger.warn(`CoinGecko quota probe failed: ${error.message ?? error}`); - } - } - // Cache management methods private getFromCache(addresses: string[]): { [key: string]: string } {