diff --git a/backend/src/api/database-migration.ts b/backend/src/api/database-migration.ts index b84efdd7c..9a5eb310a 100644 --- a/backend/src/api/database-migration.ts +++ b/backend/src/api/database-migration.ts @@ -847,6 +847,7 @@ class DatabaseMigration { lasttimeupdate int(11) unsigned NOT NULL, pegtxid varchar(65) NOT NULL, pegindex int(11) NOT NULL, + pegblocktime int(11) unsigned NOT NULL, PRIMARY KEY (txid, txindex), FOREIGN KEY (bitcoinaddress) REFERENCES federation_addresses (bitcoinaddress) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;`; diff --git a/backend/src/api/liquid/elements-parser.ts b/backend/src/api/liquid/elements-parser.ts index 4ee2187b4..37006c6bf 100644 --- a/backend/src/api/liquid/elements-parser.ts +++ b/backend/src/api/liquid/elements-parser.ts @@ -96,8 +96,8 @@ class ElementsParser { logger.debug(`Saved new Federation address ${bitcoinaddress} to federation addresses.`); // Add the UTXO to the federation txos table - const query_utxos = `INSERT IGNORE INTO federation_txos (txid, txindex, bitcoinaddress, amount, blocknumber, blocktime, unspent, lastblockupdate, lasttimeupdate, pegtxid, pegindex) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`; - const params_utxos: (string | number)[] = [bitcointxid, bitcoinindex, bitcoinaddress, amount, bitcoinblock, bitcoinBlockTime, 1, bitcoinblock - 1, 0, txid, txindex]; + const query_utxos = `INSERT IGNORE INTO federation_txos (txid, txindex, bitcoinaddress, amount, blocknumber, blocktime, unspent, lastblockupdate, lasttimeupdate, pegtxid, pegindex, pegblocktime) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`; + const params_utxos: (string | number)[] = [bitcointxid, bitcoinindex, bitcoinaddress, amount, bitcoinblock, bitcoinBlockTime, 1, bitcoinblock - 1, 0, txid, txindex, blockTime]; await DB.query(query_utxos, params_utxos); const [minBlockUpdate] = await DB.query(`SELECT MIN(lastblockupdate) AS lastblockupdate FROM federation_txos WHERE unspent = 1`) await this.$saveLastBlockAuditToDatabase(minBlockUpdate[0]['lastblockupdate']); @@ -148,7 +148,7 @@ class ElementsParser { while (auditProgress.lastBlockAudit <= auditProgress.confirmedTip) { // First, get the current UTXOs that need to be scanned in the block const utxos = await this.$getFederationUtxosToScan(auditProgress.lastBlockAudit); - logger.debug(`Found ${utxos.length} Federation UTXOs to scan in block ${auditProgress.lastBlockAudit} / ${auditProgress.confirmedTip}`); + logger.debug(`Found ${utxos.length} Federation UTXOs to scan in Bitcoin block height #${auditProgress.lastBlockAudit} / #${auditProgress.confirmedTip}`); // The fast way: check if these UTXOs are still unspent as of the current block with gettxout let spentAsTip: any[]; @@ -228,8 +228,8 @@ class ElementsParser { // Check that the UTXO was not already added in the DB by previous scans const [rows_check] = await DB.query(`SELECT txid FROM federation_txos WHERE txid = ? AND txindex = ?`, [tx.txid, output.n]) as any[]; if (rows_check.length === 0) { - const query_utxos = `INSERT INTO federation_txos (txid, txindex, bitcoinaddress, amount, blocknumber, blocktime, unspent, lastblockupdate, lasttimeupdate, pegtxid, pegindex) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`; - const params_utxos: (string | number)[] = [tx.txid, output.n, output.scriptPubKey.address, output.value * 100000000, block.height, block.time, 1, block.height, 0, '', 0]; + const query_utxos = `INSERT INTO federation_txos (txid, txindex, bitcoinaddress, amount, blocknumber, blocktime, unspent, lastblockupdate, lasttimeupdate, pegtxid, pegindex, pegblocktime) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`; + const params_utxos: (string | number)[] = [tx.txid, output.n, output.scriptPubKey.address, output.value * 100000000, block.height, block.time, 1, block.height, 0, '', 0, 0]; await DB.query(query_utxos, params_utxos); // Add the UTXO to the utxo array spentAsTip.push({ @@ -348,7 +348,7 @@ class ElementsParser { // Get all of the UTXOs held by the federation, most recent first public async $getFederationUtxos(): Promise { - const query = `SELECT txid, txindex, bitcoinaddress, amount, blocknumber, blocktime, pegtxid, pegindex FROM federation_txos WHERE unspent = 1 ORDER BY blocktime DESC;`; + const query = `SELECT txid, txindex, bitcoinaddress, amount, blocknumber, blocktime, pegtxid, pegindex, pegblocktime FROM federation_txos WHERE unspent = 1 ORDER BY blocktime DESC;`; const [rows] = await DB.query(query); return rows; } 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 1e6fa1107..cf7bf5e27 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 @@ -3,7 +3,7 @@
-
Liquid Federation Addresses
+
Liquid Federation Wallet
{{ federationAddresses.length }} addresses
@@ -19,7 +19,7 @@
-
Liquid Federation Addresses
+
Liquid Federation Wallet
diff --git a/frontend/src/app/components/liquid-reserves-audit/federation-utxos-list/federation-utxos-list.component.html b/frontend/src/app/components/liquid-reserves-audit/federation-utxos-list/federation-utxos-list.component.html index 72f9fda50..30d8e3a82 100644 --- a/frontend/src/app/components/liquid-reserves-audit/federation-utxos-list/federation-utxos-list.component.html +++ b/frontend/src/app/components/liquid-reserves-audit/federation-utxos-list/federation-utxos-list.component.html @@ -1,13 +1,4 @@
- -
-
- - -
-
@@ -22,7 +13,7 @@ Related Peg-In Date - + @@ -55,7 +46,7 @@ - + @@ -106,7 +97,7 @@ - diff --git a/frontend/src/app/components/liquid-reserves-audit/federation-utxos-list/federation-utxos-list.component.ts b/frontend/src/app/components/liquid-reserves-audit/federation-utxos-list/federation-utxos-list.component.ts index 479daf78f..30f401abf 100644 --- a/frontend/src/app/components/liquid-reserves-audit/federation-utxos-list/federation-utxos-list.component.ts +++ b/frontend/src/app/components/liquid-reserves-audit/federation-utxos-list/federation-utxos-list.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit, ChangeDetectionStrategy, Input } from '@angular/core'; -import { BehaviorSubject, Observable, Subject, combineLatest, of, timer } from 'rxjs'; +import { Observable, Subject, combineLatest, of, timer } from 'rxjs'; import { delayWhen, filter, map, share, shareReplay, switchMap, takeUntil, tap, throttleTime } from 'rxjs/operators'; import { ApiService } from '../../../services/api.service'; import { Env, StateService } from '../../../services/state.service'; @@ -22,12 +22,8 @@ export class FederationUtxosListComponent implements OnInit { pageSize = 15; maxSize = window.innerWidth <= 767.98 ? 3 : 5; skeletonLines: number[] = []; - changeAddress: string = "bc1qxvay4an52gcghxq5lavact7r6qe9l4laedsazz8fj2ee2cy47tlqff4aj4"; auditStatus$: Observable; auditUpdated$: Observable; - showChangeUtxosToggleSubject: BehaviorSubject = new BehaviorSubject(false); - showChangeUtxosToggle$: Observable = this.showChangeUtxosToggleSubject.asObservable(); - filteredFederationUtxos$: Observable; lastReservesBlockUpdate: number = 0; currentPeg$: Observable; lastPegBlockUpdate: number = 0; @@ -99,17 +95,6 @@ export class FederationUtxosListComponent implements OnInit { share() ); } - - if (this.federationUtxos$) { - this.filteredFederationUtxos$ = combineLatest([ - this.federationUtxos$, - this.showChangeUtxosToggle$ - ]).pipe( - switchMap(([federationUtxos, showChangeUtxosToggle]) => showChangeUtxosToggle ? of(federationUtxos) : of(federationUtxos.filter(utxo => utxo.bitcoinaddress !== this.changeAddress))), - share() - ); - } - } ngOnDestroy(): void { @@ -121,7 +106,4 @@ export class FederationUtxosListComponent implements OnInit { this.page = page; } - onShowChangeUtxosToggleChange(e): void { - this.showChangeUtxosToggleSubject.next(e.target.checked); - } } diff --git a/frontend/src/app/components/liquid-reserves-audit/federation-utxos-stats/federation-utxos-stats.component.html b/frontend/src/app/components/liquid-reserves-audit/federation-utxos-stats/federation-utxos-stats.component.html deleted file mode 100644 index 7f84cfe4b..000000000 --- a/frontend/src/app/components/liquid-reserves-audit/federation-utxos-stats/federation-utxos-stats.component.html +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/frontend/src/app/components/liquid-reserves-audit/federation-utxos-stats/federation-utxos-stats.component.ts b/frontend/src/app/components/liquid-reserves-audit/federation-utxos-stats/federation-utxos-stats.component.ts deleted file mode 100644 index 6c114ed32..000000000 --- a/frontend/src/app/components/liquid-reserves-audit/federation-utxos-stats/federation-utxos-stats.component.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; -@Component({ - selector: 'app-federation-utxos-stats', - templateUrl: './federation-utxos-stats.component.html', - styleUrls: ['./federation-utxos-stats.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, -}) -export class FederationUtxosStatsComponent implements OnInit { - constructor() { } - - ngOnInit(): void { - - } - -} diff --git a/frontend/src/app/components/liquid-reserves-audit/recent-pegs-list/recent-pegs-list.component.html b/frontend/src/app/components/liquid-reserves-audit/recent-pegs-list/recent-pegs-list.component.html new file mode 100644 index 000000000..0343d74c4 --- /dev/null +++ b/frontend/src/app/components/liquid-reserves-audit/recent-pegs-list/recent-pegs-list.component.html @@ -0,0 +1,125 @@ +
+
+ +
+

Recent Peg-In / Out's

+
+ +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TransactionAmountBTC Funding / RedeemDate
+ + + + + + + + + + + + {{ peg.amount > 0 ? '+' : '-' }} + + +
+ + + + + + + + + + + + {{ peg.amount > 0 ? '+' : '-' }} + + + + + + + + ‎{{ peg.blocktime * 1000 | date:'yyyy-MM-dd HH:mm' }} +
()
+
+ + + + + +
+ + + + + + + +
+ + + + + +
+
+
+
+ +
+
+ +
+ + + BTC Redeem in progress... + \ No newline at end of file diff --git a/frontend/src/app/components/liquid-reserves-audit/recent-pegs-list/recent-pegs-list.component.scss b/frontend/src/app/components/liquid-reserves-audit/recent-pegs-list/recent-pegs-list.component.scss new file mode 100644 index 000000000..eccc42957 --- /dev/null +++ b/frontend/src/app/components/liquid-reserves-audit/recent-pegs-list/recent-pegs-list.component.scss @@ -0,0 +1,101 @@ +.spinner-border { + height: 25px; + width: 25px; + margin-top: 13px; +} + +tr, td, th { + border: 0px; + padding-top: 0.65rem !important; + padding-bottom: 0.6rem !important; + padding-right: 2rem !important; + .widget { + padding-right: 1rem !important; + } +} + +.clear-link { + color: white; +} + +.disabled { + pointer-events: none; + opacity: 0.5; +} + +.progress { + background-color: #2d3348; +} + +.transaction { + width: 25%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 160px; +} +.transaction.widget { + width: 40%; + +} + +.address { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 160px; + @media (max-width: 527px) { + display: none; + } +} + +.amount { + width: 12%; +} +.amount.widget { + width: 30%; +} + +.output { + width: 25%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 160px; + @media (max-width: 840px) { + display: none; + } +} + +.timestamp { + width: 18%; + @media (max-width: 650px) { + display: none; + } + @media (max-width: 1000px) { + .relative-time { + display: none; + } + } +} +.timestamp.widget { + width: 100%; + @media (min-width: 768px) AND (max-width: 1050px) { + display: none; + } + @media (max-width: 767px) { + display: block; + } + + @media (max-width: 500px) { + display: none; + } +} + +.credit { + color: #7CB342; +} + +.debit { + color: #D81B60; +} diff --git a/frontend/src/app/components/liquid-reserves-audit/recent-pegs-list/recent-pegs-list.component.ts b/frontend/src/app/components/liquid-reserves-audit/recent-pegs-list/recent-pegs-list.component.ts new file mode 100644 index 000000000..0c42477a9 --- /dev/null +++ b/frontend/src/app/components/liquid-reserves-audit/recent-pegs-list/recent-pegs-list.component.ts @@ -0,0 +1,127 @@ +import { Component, OnInit, ChangeDetectionStrategy, Input } from '@angular/core'; +import { Observable, Subject, combineLatest, of, timer } from 'rxjs'; +import { delayWhen, filter, map, share, shareReplay, switchMap, takeUntil, tap, throttleTime } from 'rxjs/operators'; +import { ApiService } from '../../../services/api.service'; +import { Env, StateService } from '../../../services/state.service'; +import { AuditStatus, CurrentPegs, FederationUtxo, RecentPeg } from '../../../interfaces/node-api.interface'; +import { WebsocketService } from '../../../services/websocket.service'; + +@Component({ + selector: 'app-recent-pegs-list', + templateUrl: './recent-pegs-list.component.html', + styleUrls: ['./recent-pegs-list.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class RecentPegsListComponent implements OnInit { + @Input() widget: boolean = false; + @Input() recentPegIns$: Observable; + + env: Env; + isLoading = true; + page = 1; + pageSize = 15; + maxSize = window.innerWidth <= 767.98 ? 3 : 5; + skeletonLines: number[] = []; + auditStatus$: Observable; + auditUpdated$: Observable; + federationUtxos$: Observable; + recentPegs$: Observable; + lastReservesBlockUpdate: number = 0; + currentPeg$: Observable; + lastPegBlockUpdate: number = 0; + lastPegAmount: string = ''; + isLoad: boolean = true; + + private destroy$ = new Subject(); + + constructor( + private apiService: ApiService, + public stateService: StateService, + private websocketService: WebsocketService, + ) { + } + + ngOnInit(): void { + this.isLoading = !this.widget; + this.env = this.stateService.env; + this.skeletonLines = this.widget === true ? [...Array(6).keys()] : [...Array(15).keys()]; + + if (!this.widget) { + this.websocketService.want(['blocks']); + this.auditStatus$ = this.stateService.blocks$.pipe( + takeUntil(this.destroy$), + throttleTime(40000), + delayWhen(_ => this.isLoad ? timer(0) : timer(2000)), + tap(() => this.isLoad = false), + switchMap(() => this.apiService.federationAuditSynced$()), + shareReplay(1) + ); + + this.currentPeg$ = this.auditStatus$.pipe( + filter(auditStatus => auditStatus.isAuditSynced === true), + switchMap(_ => + this.apiService.liquidPegs$().pipe( + filter((currentPegs) => currentPegs.lastBlockUpdate >= this.lastPegBlockUpdate), + tap((currentPegs) => { + this.lastPegBlockUpdate = currentPegs.lastBlockUpdate; + }) + ) + ), + share() + ); + + this.auditUpdated$ = combineLatest([ + this.auditStatus$, + this.currentPeg$ + ]).pipe( + filter(([auditStatus, _]) => auditStatus.isAuditSynced === true), + map(([auditStatus, currentPeg]) => ({ + lastBlockAudit: auditStatus.lastBlockAudit, + currentPegAmount: currentPeg.amount + })), + switchMap(({ lastBlockAudit, currentPegAmount }) => { + const blockAuditCheck = lastBlockAudit > this.lastReservesBlockUpdate; + const amountCheck = currentPegAmount !== this.lastPegAmount; + this.lastReservesBlockUpdate = lastBlockAudit; + this.lastPegAmount = currentPegAmount; + return of(blockAuditCheck || amountCheck); + }), + share() + ); + + this.federationUtxos$ = this.auditUpdated$.pipe( + filter(auditUpdated => auditUpdated === true), + throttleTime(40000), + switchMap(_ => this.apiService.federationUtxos$()), + tap(_ => this.isLoading = false), + share() + ); + + this.recentPegIns$ = this.federationUtxos$.pipe( + map(federationUtxos => federationUtxos.filter(utxo => utxo.pegtxid).map(utxo => { + return { + txid: utxo.pegtxid, + txindex: utxo.pegindex, + amount: utxo.amount, + bitcointxid: utxo.txid, + bitcoinindex: utxo.txindex, + blocktime: utxo.pegblocktime, + } + })), + share() + ); + } + + this.recentPegs$ = this.recentPegIns$; + } + + ngOnDestroy(): void { + this.destroy$.next(1); + this.destroy$.complete(); + } + + pageChange(page: number): void { + this.page = page; + } + +} diff --git a/frontend/src/app/components/liquid-reserves-audit/recent-pegs-stats/recent-pegs-stats.component.html b/frontend/src/app/components/liquid-reserves-audit/recent-pegs-stats/recent-pegs-stats.component.html new file mode 100644 index 000000000..ddf51f9f6 --- /dev/null +++ b/frontend/src/app/components/liquid-reserves-audit/recent-pegs-stats/recent-pegs-stats.component.html @@ -0,0 +1,7 @@ + diff --git a/frontend/src/app/components/liquid-reserves-audit/federation-utxos-stats/federation-utxos-stats.component.scss b/frontend/src/app/components/liquid-reserves-audit/recent-pegs-stats/recent-pegs-stats.component.scss similarity index 100% rename from frontend/src/app/components/liquid-reserves-audit/federation-utxos-stats/federation-utxos-stats.component.scss rename to frontend/src/app/components/liquid-reserves-audit/recent-pegs-stats/recent-pegs-stats.component.scss diff --git a/frontend/src/app/components/liquid-reserves-audit/recent-pegs-stats/recent-pegs-stats.component.ts b/frontend/src/app/components/liquid-reserves-audit/recent-pegs-stats/recent-pegs-stats.component.ts new file mode 100644 index 000000000..3fbebf715 --- /dev/null +++ b/frontend/src/app/components/liquid-reserves-audit/recent-pegs-stats/recent-pegs-stats.component.ts @@ -0,0 +1,15 @@ +import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; +@Component({ + selector: 'app-recent-pegs-stats', + templateUrl: './recent-pegs-stats.component.html', + styleUrls: ['./recent-pegs-stats.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class RecentPegsStatsComponent implements OnInit { + constructor() { } + + ngOnInit(): void { + + } + +} 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 d42300511..f7858a713 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 @@ -25,8 +25,8 @@
- - + +
@@ -71,8 +71,8 @@
- - + +
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 86dda7ebc..faa00b3d0 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 @@ -4,7 +4,7 @@ import { WebsocketService } from '../../../services/websocket.service'; import { StateService } from '../../../services/state.service'; import { Observable, Subject, combineLatest, delayWhen, filter, interval, map, of, share, shareReplay, startWith, switchMap, takeUntil, tap, throttleTime, timer } from 'rxjs'; import { ApiService } from '../../../services/api.service'; -import { AuditStatus, CurrentPegs, FederationAddress, FederationUtxo } from '../../../interfaces/node-api.interface'; +import { AuditStatus, CurrentPegs, FederationAddress, FederationUtxo, RecentPeg } from '../../../interfaces/node-api.interface'; @Component({ selector: 'app-reserves-audit-dashboard', @@ -18,6 +18,7 @@ export class ReservesAuditDashboardComponent implements OnInit { currentPeg$: Observable; currentReserves$: Observable; federationUtxos$: Observable; + recentPegIns$: Observable; federationAddresses$: Observable; federationAddressesOneMonthAgo$: Observable; liquidPegsMonth$: Observable; @@ -72,7 +73,7 @@ export class ReservesAuditDashboardComponent implements OnInit { map(([auditStatus, currentPeg]) => ({ lastBlockAudit: auditStatus.lastBlockAudit, currentPegAmount: currentPeg.amount - })), + })), switchMap(({ lastBlockAudit, currentPegAmount }) => { const blockAuditCheck = lastBlockAudit > this.lastReservesBlockUpdate; const amountCheck = currentPegAmount !== this.lastPegAmount; @@ -103,6 +104,20 @@ export class ReservesAuditDashboardComponent implements OnInit { share() ); + this.recentPegIns$ = this.federationUtxos$.pipe( + map(federationUtxos => federationUtxos.filter(utxo => utxo.pegtxid).map(utxo => { + return { + txid: utxo.pegtxid, + txindex: utxo.pegindex, + amount: utxo.amount, + bitcointxid: utxo.txid, + bitcoinindex: utxo.txindex, + blocktime: utxo.pegblocktime, + } + })), + share() + ); + this.federationAddresses$ = this.auditUpdated$.pipe( filter(auditUpdated => auditUpdated === true), throttleTime(40000), diff --git a/frontend/src/app/interfaces/node-api.interface.ts b/frontend/src/app/interfaces/node-api.interface.ts index 0b93b0d1a..6606cae4c 100644 --- a/frontend/src/app/interfaces/node-api.interface.ts +++ b/frontend/src/app/interfaces/node-api.interface.ts @@ -96,6 +96,16 @@ export interface FederationUtxo { blocktime: number; pegtxid: string; pegindex: number; + pegblocktime: number; +} + +export interface RecentPeg { + txid: string; + txindex: number; // input #0 for peg-ins + amount: number; + bitcointxid: string; + bitcoinindex: number; + blocktime: number; } export interface AuditStatus { diff --git a/frontend/src/app/liquid/liquid-master-page.module.ts b/frontend/src/app/liquid/liquid-master-page.module.ts index 94a1fb943..0134365bc 100644 --- a/frontend/src/app/liquid/liquid-master-page.module.ts +++ b/frontend/src/app/liquid/liquid-master-page.module.ts @@ -17,7 +17,8 @@ import { AssetComponent } from '../components/asset/asset.component'; import { AssetsNavComponent } from '../components/assets/assets-nav/assets-nav.component'; import { ReservesAuditDashboardComponent } from '../components/liquid-reserves-audit/reserves-audit-dashboard/reserves-audit-dashboard.component'; import { ReservesSupplyStatsComponent } from '../components/liquid-reserves-audit/reserves-supply-stats/reserves-supply-stats.component'; -import { FederationUtxosStatsComponent } from '../components/liquid-reserves-audit/federation-utxos-stats/federation-utxos-stats.component'; +import { RecentPegsStatsComponent } from '../components/liquid-reserves-audit/recent-pegs-stats/recent-pegs-stats.component'; +import { RecentPegsListComponent } from '../components/liquid-reserves-audit/recent-pegs-list/recent-pegs-list.component'; import { FederationWalletComponent } from '../components/liquid-reserves-audit/federation-wallet/federation-wallet.component'; import { FederationUtxosListComponent } from '../components/liquid-reserves-audit/federation-utxos-list/federation-utxos-list.component'; import { FederationAddressesStatsComponent } from '../components/liquid-reserves-audit/federation-addresses-stats/federation-addresses-stats.component'; @@ -109,6 +110,11 @@ const routes: Routes = [ } ] }, + { + path: 'audit/pegs', + data: { networks: ['liquid'] }, + component: RecentPegsListComponent, + }, { path: 'assets', data: { networks: ['liquid'] }, @@ -176,7 +182,8 @@ export class LiquidRoutingModule { } LiquidMasterPageComponent, ReservesAuditDashboardComponent, ReservesSupplyStatsComponent, - FederationUtxosStatsComponent, + RecentPegsStatsComponent, + RecentPegsListComponent, FederationWalletComponent, FederationUtxosListComponent, FederationAddressesStatsComponent,