diff --git a/backend/src/api/liquid/elements-parser.ts b/backend/src/api/liquid/elements-parser.ts index 8c3d519ab..88d2e1332 100644 --- a/backend/src/api/liquid/elements-parser.ts +++ b/backend/src/api/liquid/elements-parser.ts @@ -398,31 +398,16 @@ class ElementsParser { return rows; } - // Get all of the federation addresses one month ago, most balances first - public async $getFederationAddressesOneMonthAgo(): Promise { - const query = ` - SELECT COUNT(*) AS addresses_count_one_month FROM ( - SELECT bitcoinaddress, SUM(amount) AS balance - FROM federation_txos - WHERE - (blocktime < UNIX_TIMESTAMP(TIMESTAMPADD(DAY, -30, CURRENT_TIMESTAMP()))) - AND - ((unspent = 1) OR (unspent = 0 AND lasttimeupdate > UNIX_TIMESTAMP(TIMESTAMPADD(DAY, -30, CURRENT_TIMESTAMP())))) - GROUP BY bitcoinaddress - ) AS result;`; + // Get the total number of federation addresses + public async $getFederationAddressesNumber(): Promise { + const query = `SELECT COUNT(DISTINCT bitcoinaddress) AS address_count FROM federation_txos WHERE unspent = 1;`; const [rows] = await DB.query(query); return rows[0]; } - // Get all of the UTXOs held by the federation one month ago, most recent first - public async $getFederationUtxosOneMonthAgo(): Promise { - const query = ` - SELECT COUNT(*) AS utxos_count_one_month FROM federation_txos - WHERE - (blocktime < UNIX_TIMESTAMP(TIMESTAMPADD(DAY, -30, CURRENT_TIMESTAMP()))) - AND - ((unspent = 1) OR (unspent = 0 AND lasttimeupdate > UNIX_TIMESTAMP(TIMESTAMPADD(DAY, -30, CURRENT_TIMESTAMP())))) - ORDER BY blocktime DESC;`; + // Get the total number of federation utxos + public async $getFederationUtxosNumber(): Promise { + const query = `SELECT COUNT(*) AS utxo_count FROM federation_txos WHERE unspent = 1;`; const [rows] = await DB.query(query); return rows[0]; } diff --git a/backend/src/api/liquid/liquid.routes.ts b/backend/src/api/liquid/liquid.routes.ts index b87348d1b..04af59c85 100644 --- a/backend/src/api/liquid/liquid.routes.ts +++ b/backend/src/api/liquid/liquid.routes.ts @@ -22,9 +22,9 @@ class LiquidRoutes { .get(config.MEMPOOL.API_URL_PREFIX + 'liquid/reserves/month', this.$getFederationReservesByMonth) .get(config.MEMPOOL.API_URL_PREFIX + 'liquid/pegouts', this.$getPegOuts) .get(config.MEMPOOL.API_URL_PREFIX + 'liquid/reserves/addresses', this.$getFederationAddresses) - .get(config.MEMPOOL.API_URL_PREFIX + 'liquid/reserves/addresses/previous-month', this.$getFederationAddressesOneMonthAgo) + .get(config.MEMPOOL.API_URL_PREFIX + 'liquid/reserves/addresses/total', this.$getFederationAddressesNumber) .get(config.MEMPOOL.API_URL_PREFIX + 'liquid/reserves/utxos', this.$getFederationUtxos) - .get(config.MEMPOOL.API_URL_PREFIX + 'liquid/reserves/utxos/previous-month', this.$getFederationUtxosOneMonthAgo) + .get(config.MEMPOOL.API_URL_PREFIX + 'liquid/reserves/utxos/total', this.$getFederationUtxosNumber) .get(config.MEMPOOL.API_URL_PREFIX + 'liquid/reserves/status', this.$getFederationAuditStatus) ; } @@ -142,12 +142,12 @@ class LiquidRoutes { } } - private async $getFederationAddressesOneMonthAgo(req: Request, res: Response) { + private async $getFederationAddressesNumber(req: Request, res: Response) { try { - const federationAddresses = await elementsParser.$getFederationAddressesOneMonthAgo(); + const federationAddresses = await elementsParser.$getFederationAddressesNumber(); res.header('Pragma', 'public'); res.header('Cache-control', 'public'); - res.setHeader('Expires', new Date(Date.now() + 1000 * 60 * 60 * 24).toUTCString()); + res.setHeader('Expires', new Date(Date.now() + 1000 * 30).toUTCString()); res.json(federationAddresses); } catch (e) { res.status(500).send(e instanceof Error ? e.message : e); @@ -166,12 +166,12 @@ class LiquidRoutes { } } - private async $getFederationUtxosOneMonthAgo(req: Request, res: Response) { + private async $getFederationUtxosNumber(req: Request, res: Response) { try { - const federationUtxos = await elementsParser.$getFederationUtxosOneMonthAgo(); + const federationUtxos = await elementsParser.$getFederationUtxosNumber(); res.header('Pragma', 'public'); res.header('Cache-control', 'public'); - res.setHeader('Expires', new Date(Date.now() + 1000 * 60 * 60 * 24).toUTCString()); + res.setHeader('Expires', new Date(Date.now() + 1000 * 30).toUTCString()); res.json(federationUtxos); } catch (e) { res.status(500).send(e instanceof Error ? e.message : e); diff --git a/frontend/src/app/components/liquid-reserves-audit/federation-addresses-stats/federation-addresses-stats.component.html b/frontend/src/app/components/liquid-reserves-audit/federation-addresses-stats/federation-addresses-stats.component.html index dace541b7..9240cf228 100644 --- a/frontend/src/app/components/liquid-reserves-audit/federation-addresses-stats/federation-addresses-stats.component.html +++ b/frontend/src/app/components/liquid-reserves-audit/federation-addresses-stats/federation-addresses-stats.component.html @@ -1,18 +1,15 @@ -
- -
-
- -
Liquid Federation Wallet 
-
-
-
{{ federationAddresses.length }} addresses
- - - -
+
+
+
+ +
Liquid Federation Wallet 
+
+
+
{{ federationWalletStats.address_count }} addresses
+
{{ federationWalletStats.utxo_count }} UTXOs
+
@@ -30,5 +27,5 @@ -
+
diff --git a/frontend/src/app/components/liquid-reserves-audit/federation-addresses-stats/federation-addresses-stats.component.scss b/frontend/src/app/components/liquid-reserves-audit/federation-addresses-stats/federation-addresses-stats.component.scss index b516f12f1..4ddce6501 100644 --- a/frontend/src/app/components/liquid-reserves-audit/federation-addresses-stats/federation-addresses-stats.component.scss +++ b/frontend/src/app/components/liquid-reserves-audit/federation-addresses-stats/federation-addresses-stats.component.scss @@ -22,6 +22,7 @@ } .card-text { + padding-top: 9px; font-size: 22px; span { font-size: 11px; @@ -49,10 +50,6 @@ } } -.loading-container{ - min-height: 76px; -} - .card-text { .skeleton-loader { width: 100%; diff --git a/frontend/src/app/components/liquid-reserves-audit/federation-addresses-stats/federation-addresses-stats.component.ts b/frontend/src/app/components/liquid-reserves-audit/federation-addresses-stats/federation-addresses-stats.component.ts index 081b22a4f..43fdda48f 100644 --- a/frontend/src/app/components/liquid-reserves-audit/federation-addresses-stats/federation-addresses-stats.component.ts +++ b/frontend/src/app/components/liquid-reserves-audit/federation-addresses-stats/federation-addresses-stats.component.ts @@ -1,6 +1,5 @@ import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; -import { Observable } from 'rxjs'; -import { FederationAddress } from '../../../interfaces/node-api.interface'; +import { Observable, combineLatest, map } from 'rxjs'; @Component({ selector: 'app-federation-addresses-stats', @@ -9,12 +8,21 @@ import { FederationAddress } from '../../../interfaces/node-api.interface'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class FederationAddressesStatsComponent implements OnInit { - @Input() federationAddresses$: Observable; - @Input() federationAddressesOneMonthAgo$: Observable; + @Input() federationAddressesNumber$: Observable; + @Input() federationUtxosNumber$: Observable; + federationWalletStats$: Observable; constructor() { } ngOnInit(): void { + this.federationWalletStats$ = combineLatest([ + this.federationAddressesNumber$, + this.federationUtxosNumber$ + ]).pipe( + map(([address_count, utxo_count]) => { + return { address_count, utxo_count} + }) + ) } } diff --git a/frontend/src/app/components/liquid-reserves-audit/reserves-audit-dashboard/reserves-audit-dashboard.component.html b/frontend/src/app/components/liquid-reserves-audit/reserves-audit-dashboard/reserves-audit-dashboard.component.html index 2c8c76291..39bade669 100644 --- a/frontend/src/app/components/liquid-reserves-audit/reserves-audit-dashboard/reserves-audit-dashboard.component.html +++ b/frontend/src/app/components/liquid-reserves-audit/reserves-audit-dashboard/reserves-audit-dashboard.component.html @@ -34,7 +34,7 @@
- +
diff --git a/frontend/src/app/components/liquid-reserves-audit/reserves-audit-dashboard/reserves-audit-dashboard.component.ts b/frontend/src/app/components/liquid-reserves-audit/reserves-audit-dashboard/reserves-audit-dashboard.component.ts index 46379f962..7ffaeb05a 100644 --- a/frontend/src/app/components/liquid-reserves-audit/reserves-audit-dashboard/reserves-audit-dashboard.component.ts +++ b/frontend/src/app/components/liquid-reserves-audit/reserves-audit-dashboard/reserves-audit-dashboard.component.ts @@ -22,7 +22,8 @@ export class ReservesAuditDashboardComponent implements OnInit { recentPegOuts$: Observable; pegsVolume$: Observable; federationAddresses$: Observable; - federationAddressesOneMonthAgo$: Observable; + federationAddressesNumber$: Observable; + federationUtxosNumber$: Observable; liquidPegsMonth$: Observable; liquidReservesMonth$: Observable; pegRatioGraphHeight: number = 320; @@ -143,11 +144,21 @@ export class ReservesAuditDashboardComponent implements OnInit { share() ); - this.federationAddressesOneMonthAgo$ = interval(60 * 60 * 1000) - .pipe( - startWith(0), - switchMap(() => this.apiService.federationAddressesOneMonthAgo$()) - ); + this.federationAddressesNumber$ = this.auditUpdated$.pipe( + filter(auditUpdated => auditUpdated === true), + throttleTime(40000), + switchMap(_ => this.apiService.federationAddressesNumber$()), + map(count => count.address_count), + share() + ); + + this.federationUtxosNumber$ = this.auditUpdated$.pipe( + filter(auditUpdated => auditUpdated === true), + throttleTime(40000), + switchMap(_ => this.apiService.federationUtxosNumber$()), + map(count => count.utxo_count), + share() + ); this.liquidPegsMonth$ = interval(60 * 60 * 1000) .pipe( diff --git a/frontend/src/app/services/api.service.ts b/frontend/src/app/services/api.service.ts index 074aa898c..7eb1f0b96 100644 --- a/frontend/src/app/services/api.service.ts +++ b/frontend/src/app/services/api.service.ts @@ -204,12 +204,12 @@ export class ApiService { return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/liquid/pegouts'); } - federationAddressesOneMonthAgo$(): Observable { - return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/liquid/reserves/addresses/previous-month'); + federationAddressesNumber$(): Observable { + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/liquid/reserves/addresses/total'); } - federationUtxosOneMonthAgo$(): Observable { - return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/liquid/reserves/utxos/previous-month'); + federationUtxosNumber$(): Observable { + return this.httpClient.get(this.apiBaseUrl + this.apiBasePath + '/api/v1/liquid/reserves/utxos/total'); } listFeaturedAssets$(): Observable {