Merge branch 'master' into nymkappa/bugfix/update-log
This commit is contained in:
		
						commit
						6cd3c312dd
					
				@ -2,7 +2,7 @@ import { IEsploraApi } from './esplora-api.interface';
 | 
			
		||||
 | 
			
		||||
export interface AbstractBitcoinApi {
 | 
			
		||||
  $getRawMempool(): Promise<IEsploraApi.Transaction['txid'][]>;
 | 
			
		||||
  $getRawTransaction(txId: string, skipConversion?: boolean, addPrevout?: boolean): Promise<IEsploraApi.Transaction>;
 | 
			
		||||
  $getRawTransaction(txId: string, skipConversion?: boolean, addPrevout?: boolean, lazyPrevouts?: boolean): Promise<IEsploraApi.Transaction>;
 | 
			
		||||
  $getBlockHeightTip(): Promise<number>;
 | 
			
		||||
  $getTxIdsForBlock(hash: string): Promise<string[]>;
 | 
			
		||||
  $getBlockHash(height: number): Promise<string>;
 | 
			
		||||
 | 
			
		||||
@ -31,7 +31,8 @@ class BitcoinApi implements AbstractBitcoinApi {
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  $getRawTransaction(txId: string, skipConversion = false, addPrevout = false): Promise<IEsploraApi.Transaction> {
 | 
			
		||||
 | 
			
		||||
  $getRawTransaction(txId: string, skipConversion = false, addPrevout = false, lazyPrevouts = false): Promise<IEsploraApi.Transaction> {
 | 
			
		||||
    // If the transaction is in the mempool we already converted and fetched the fee. Only prevouts are missing
 | 
			
		||||
    const txInMempool = mempool.getMempool()[txId];
 | 
			
		||||
    if (txInMempool && addPrevout) {
 | 
			
		||||
@ -46,7 +47,7 @@ class BitcoinApi implements AbstractBitcoinApi {
 | 
			
		||||
          });
 | 
			
		||||
          return transaction;
 | 
			
		||||
        }
 | 
			
		||||
        return this.$convertTransaction(transaction, addPrevout);
 | 
			
		||||
        return this.$convertTransaction(transaction, addPrevout, lazyPrevouts);
 | 
			
		||||
      })
 | 
			
		||||
      .catch((e: Error) => {
 | 
			
		||||
        if (e.message.startsWith('The genesis block coinbase')) {
 | 
			
		||||
@ -126,7 +127,7 @@ class BitcoinApi implements AbstractBitcoinApi {
 | 
			
		||||
    const outSpends: IEsploraApi.Outspend[] = [];
 | 
			
		||||
    const tx = await this.$getRawTransaction(txId, true, false);
 | 
			
		||||
    for (let i = 0; i < tx.vout.length; i++) {
 | 
			
		||||
      if (tx.status && tx.status.block_height == 0) {
 | 
			
		||||
      if (tx.status && tx.status.block_height === 0) {
 | 
			
		||||
        outSpends.push({
 | 
			
		||||
          spent: false
 | 
			
		||||
        });
 | 
			
		||||
@ -145,7 +146,7 @@ class BitcoinApi implements AbstractBitcoinApi {
 | 
			
		||||
    return this.bitcoindClient.getNetworkHashPs(120, blockHeight);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  protected async $convertTransaction(transaction: IBitcoinApi.Transaction, addPrevout: boolean): Promise<IEsploraApi.Transaction> {
 | 
			
		||||
  protected async $convertTransaction(transaction: IBitcoinApi.Transaction, addPrevout: boolean, lazyPrevouts = false): Promise<IEsploraApi.Transaction> {
 | 
			
		||||
    let esploraTransaction: IEsploraApi.Transaction = {
 | 
			
		||||
      txid: transaction.txid,
 | 
			
		||||
      version: transaction.version,
 | 
			
		||||
@ -192,12 +193,9 @@ class BitcoinApi implements AbstractBitcoinApi {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (addPrevout) {
 | 
			
		||||
      if (transaction.confirmations) {
 | 
			
		||||
        esploraTransaction = await this.$calculateFeeFromInputs(esploraTransaction);
 | 
			
		||||
      } else {
 | 
			
		||||
      esploraTransaction = await this.$calculateFeeFromInputs(esploraTransaction, false, lazyPrevouts);
 | 
			
		||||
    } else if (!transaction.confirmations) {
 | 
			
		||||
      esploraTransaction = await this.$appendMempoolFeeData(esploraTransaction);
 | 
			
		||||
        esploraTransaction = await this.$calculateFeeFromInputs(esploraTransaction);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return esploraTransaction;
 | 
			
		||||
@ -271,20 +269,30 @@ class BitcoinApi implements AbstractBitcoinApi {
 | 
			
		||||
    return this.bitcoindClient.getRawMemPool(true);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private async $calculateFeeFromInputs(transaction: IEsploraApi.Transaction): Promise<IEsploraApi.Transaction> {
 | 
			
		||||
 | 
			
		||||
  private async $calculateFeeFromInputs(transaction: IEsploraApi.Transaction, addPrevout: boolean, lazyPrevouts: boolean): Promise<IEsploraApi.Transaction> {
 | 
			
		||||
    if (transaction.vin[0].is_coinbase) {
 | 
			
		||||
      transaction.fee = 0;
 | 
			
		||||
      return transaction;
 | 
			
		||||
    }
 | 
			
		||||
    let totalIn = 0;
 | 
			
		||||
    for (const vin of transaction.vin) {
 | 
			
		||||
      const innerTx = await this.$getRawTransaction(vin.txid, false, false);
 | 
			
		||||
      vin.prevout = innerTx.vout[vin.vout];
 | 
			
		||||
      this.addInnerScriptsToVin(vin);
 | 
			
		||||
      totalIn += innerTx.vout[vin.vout].value;
 | 
			
		||||
 | 
			
		||||
    for (let i = 0; i < transaction.vin.length; i++) {
 | 
			
		||||
      if (lazyPrevouts && i > 12) {
 | 
			
		||||
        transaction.vin[i].lazy = true;
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
      const innerTx = await this.$getRawTransaction(transaction.vin[i].txid, false, false);
 | 
			
		||||
      transaction.vin[i].prevout = innerTx.vout[transaction.vin[i].vout];
 | 
			
		||||
      this.addInnerScriptsToVin(transaction.vin[i]);
 | 
			
		||||
      totalIn += innerTx.vout[transaction.vin[i].vout].value;
 | 
			
		||||
    }
 | 
			
		||||
    if (lazyPrevouts && transaction.vin.length > 12) {
 | 
			
		||||
      transaction.fee = -1;
 | 
			
		||||
    } else {
 | 
			
		||||
      const totalOut = transaction.vout.reduce((p, output) => p + output.value, 0);
 | 
			
		||||
      transaction.fee = parseFloat((totalIn - totalOut).toFixed(8));
 | 
			
		||||
    }
 | 
			
		||||
    return transaction;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -33,6 +33,8 @@ export namespace IEsploraApi {
 | 
			
		||||
    // Elements
 | 
			
		||||
    is_pegin?: boolean;
 | 
			
		||||
    issuance?: Issuance;
 | 
			
		||||
    // Custom
 | 
			
		||||
    lazy?: boolean;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  interface Issuance {
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ import logger from '../logger';
 | 
			
		||||
import { Common } from './common';
 | 
			
		||||
 | 
			
		||||
class DatabaseMigration {
 | 
			
		||||
  private static currentVersion = 17;
 | 
			
		||||
  private static currentVersion = 18;
 | 
			
		||||
  private queryTimeout = 120000;
 | 
			
		||||
  private statisticsAddedIndexed = false;
 | 
			
		||||
 | 
			
		||||
@ -180,6 +180,10 @@ class DatabaseMigration {
 | 
			
		||||
      if (databaseSchemaVersion < 17 && isBitcoin === true) {
 | 
			
		||||
        await this.$executeQuery('ALTER TABLE `pools` ADD `slug` CHAR(50) NULL');
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (databaseSchemaVersion < 18 && isBitcoin === true) {
 | 
			
		||||
        await this.$executeQuery('ALTER TABLE `blocks` ADD INDEX `hash` (`hash`);');
 | 
			
		||||
      }
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      throw e;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -21,8 +21,8 @@ class TransactionUtils {
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public async $getTransactionExtended(txId: string, addPrevouts = false): Promise<TransactionExtended> {
 | 
			
		||||
    const transaction: IEsploraApi.Transaction = await bitcoinApi.$getRawTransaction(txId, false, addPrevouts);
 | 
			
		||||
  public async $getTransactionExtended(txId: string, addPrevouts = false, lazyPrevouts = false): Promise<TransactionExtended> {
 | 
			
		||||
    const transaction: IEsploraApi.Transaction = await bitcoinApi.$getRawTransaction(txId, false, addPrevouts, lazyPrevouts);
 | 
			
		||||
    return this.extendTransaction(transaction);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -645,7 +645,7 @@ class Routes {
 | 
			
		||||
      res.header('Pragma', 'public');
 | 
			
		||||
      res.header('Cache-control', 'public');
 | 
			
		||||
      res.header('X-total-count', blockCount.toString());
 | 
			
		||||
      res.setHeader('Expires', new Date(Date.now() + 1000 * 300).toUTCString());
 | 
			
		||||
      res.setHeader('Expires', new Date(Date.now() + 1000 * 60).toUTCString());
 | 
			
		||||
      res.json(blockFees);
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      res.status(500).send(e instanceof Error ? e.message : e);
 | 
			
		||||
@ -659,7 +659,7 @@ class Routes {
 | 
			
		||||
      res.header('Pragma', 'public');
 | 
			
		||||
      res.header('Cache-control', 'public');
 | 
			
		||||
      res.header('X-total-count', blockCount.toString());
 | 
			
		||||
      res.setHeader('Expires', new Date(Date.now() + 1000 * 300).toUTCString());
 | 
			
		||||
      res.setHeader('Expires', new Date(Date.now() + 1000 * 60).toUTCString());
 | 
			
		||||
      res.json(blockRewards);
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      res.status(500).send(e instanceof Error ? e.message : e);
 | 
			
		||||
@ -672,7 +672,7 @@ class Routes {
 | 
			
		||||
      const oldestIndexedBlockTimestamp = await BlocksRepository.$oldestBlockTimestamp();
 | 
			
		||||
      res.header('Pragma', 'public');
 | 
			
		||||
      res.header('Cache-control', 'public');
 | 
			
		||||
      res.setHeader('Expires', new Date(Date.now() + 1000 * 300).toUTCString());
 | 
			
		||||
      res.setHeader('Expires', new Date(Date.now() + 1000 * 60).toUTCString());
 | 
			
		||||
      res.json({
 | 
			
		||||
        oldestIndexedBlockTimestamp: oldestIndexedBlockTimestamp,
 | 
			
		||||
        blockFeeRates: blockFeeRates,
 | 
			
		||||
@ -690,7 +690,7 @@ class Routes {
 | 
			
		||||
      res.header('Pragma', 'public');
 | 
			
		||||
      res.header('Cache-control', 'public');
 | 
			
		||||
      res.header('X-total-count', blockCount.toString());
 | 
			
		||||
      res.setHeader('Expires', new Date(Date.now() + 1000 * 300).toUTCString());
 | 
			
		||||
      res.setHeader('Expires', new Date(Date.now() + 1000 * 60).toUTCString());
 | 
			
		||||
      res.json({
 | 
			
		||||
        sizes: blockSizes,
 | 
			
		||||
        weights: blockWeights
 | 
			
		||||
@ -703,6 +703,7 @@ class Routes {
 | 
			
		||||
  public async getBlock(req: Request, res: Response) {
 | 
			
		||||
    try {
 | 
			
		||||
      const block = await blocks.$getBlock(req.params.hash);
 | 
			
		||||
      res.setHeader('Expires', new Date(Date.now() + 1000 * 600).toUTCString());
 | 
			
		||||
      res.json(block);
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      res.status(500).send(e instanceof Error ? e.message : e);
 | 
			
		||||
@ -722,6 +723,7 @@ class Routes {
 | 
			
		||||
  public async getBlocksExtras(req: Request, res: Response) {
 | 
			
		||||
    try {
 | 
			
		||||
      const height = req.params.height === undefined ? undefined : parseInt(req.params.height, 10);
 | 
			
		||||
      res.setHeader('Expires', new Date(Date.now() + 1000 * 60).toUTCString());
 | 
			
		||||
      res.json(await blocks.$getBlocksExtras(height, 15));
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      res.status(500).send(e instanceof Error ? e.message : e);
 | 
			
		||||
@ -776,9 +778,9 @@ class Routes {
 | 
			
		||||
      const endIndex = Math.min(startingIndex + 10, txIds.length);
 | 
			
		||||
      for (let i = startingIndex; i < endIndex; i++) {
 | 
			
		||||
        try {
 | 
			
		||||
          const transaction = await transactionUtils.$getTransactionExtended(txIds[i], true);
 | 
			
		||||
          const transaction = await transactionUtils.$getTransactionExtended(txIds[i], true, true);
 | 
			
		||||
          transactions.push(transaction);
 | 
			
		||||
          loadingIndicators.setProgress('blocktxs-' + req.params.hash, (i + 1) / endIndex * 100);
 | 
			
		||||
          loadingIndicators.setProgress('blocktxs-' + req.params.hash, (i - startingIndex + 1) / (endIndex - startingIndex) * 100);
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
          logger.debug('getBlockTransactions error: ' + (e instanceof Error ? e.message : e));
 | 
			
		||||
        }
 | 
			
		||||
@ -1001,6 +1003,7 @@ class Routes {
 | 
			
		||||
  public async $getRewardStats(req: Request, res: Response) {
 | 
			
		||||
    try {
 | 
			
		||||
      const response = await mining.$getRewardStats(parseInt(req.params.blockCount, 10));
 | 
			
		||||
      res.setHeader('Expires', new Date(Date.now() + 1000 * 60).toUTCString());
 | 
			
		||||
      res.json(response);
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      res.status(500).end();
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										18
									
								
								frontend/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										18
									
								
								frontend/package-lock.json
									
									
									
										generated
									
									
									
								
							@ -70,7 +70,7 @@
 | 
			
		||||
      },
 | 
			
		||||
      "optionalDependencies": {
 | 
			
		||||
        "@cypress/schematic": "^1.3.0",
 | 
			
		||||
        "cypress": "^9.5.2",
 | 
			
		||||
        "cypress": "^9.6.1",
 | 
			
		||||
        "cypress-fail-on-console-error": "^2.1.3",
 | 
			
		||||
        "cypress-wait-until": "^1.7.1",
 | 
			
		||||
        "mock-socket": "^9.0.3",
 | 
			
		||||
@ -6996,9 +6996,9 @@
 | 
			
		||||
      "devOptional": true
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/cypress": {
 | 
			
		||||
      "version": "9.5.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/cypress/-/cypress-9.5.2.tgz",
 | 
			
		||||
      "integrity": "sha512-gYiQYvJozMzDOriUV1rCt6CeRM/pRK4nhwGJj3nJQyX2BoUdTCVwp30xDMKc771HiNVhBtgj5o5/iBdVDVXQUg==",
 | 
			
		||||
      "version": "9.6.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/cypress/-/cypress-9.6.1.tgz",
 | 
			
		||||
      "integrity": "sha512-ECzmV7pJSkk+NuAhEw6C3D+RIRATkSb2VAHXDY6qGZbca/F9mv5pPsj2LO6Ty6oIFVBTrwCyL9agl28MtJMe2g==",
 | 
			
		||||
      "hasInstallScript": true,
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
@ -7034,7 +7034,7 @@
 | 
			
		||||
        "listr2": "^3.8.3",
 | 
			
		||||
        "lodash": "^4.17.21",
 | 
			
		||||
        "log-symbols": "^4.0.0",
 | 
			
		||||
        "minimist": "^1.2.5",
 | 
			
		||||
        "minimist": "^1.2.6",
 | 
			
		||||
        "ospath": "^1.2.2",
 | 
			
		||||
        "pretty-bytes": "^5.6.0",
 | 
			
		||||
        "proxy-from-env": "1.0.0",
 | 
			
		||||
@ -22641,9 +22641,9 @@
 | 
			
		||||
      "devOptional": true
 | 
			
		||||
    },
 | 
			
		||||
    "cypress": {
 | 
			
		||||
      "version": "9.5.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/cypress/-/cypress-9.5.2.tgz",
 | 
			
		||||
      "integrity": "sha512-gYiQYvJozMzDOriUV1rCt6CeRM/pRK4nhwGJj3nJQyX2BoUdTCVwp30xDMKc771HiNVhBtgj5o5/iBdVDVXQUg==",
 | 
			
		||||
      "version": "9.6.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/cypress/-/cypress-9.6.1.tgz",
 | 
			
		||||
      "integrity": "sha512-ECzmV7pJSkk+NuAhEw6C3D+RIRATkSb2VAHXDY6qGZbca/F9mv5pPsj2LO6Ty6oIFVBTrwCyL9agl28MtJMe2g==",
 | 
			
		||||
      "optional": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "@cypress/request": "^2.88.10",
 | 
			
		||||
@ -22678,7 +22678,7 @@
 | 
			
		||||
        "listr2": "^3.8.3",
 | 
			
		||||
        "lodash": "^4.17.21",
 | 
			
		||||
        "log-symbols": "^4.0.0",
 | 
			
		||||
        "minimist": "^1.2.5",
 | 
			
		||||
        "minimist": "^1.2.6",
 | 
			
		||||
        "ospath": "^1.2.2",
 | 
			
		||||
        "pretty-bytes": "^5.6.0",
 | 
			
		||||
        "proxy-from-env": "1.0.0",
 | 
			
		||||
 | 
			
		||||
@ -122,7 +122,7 @@
 | 
			
		||||
  },
 | 
			
		||||
  "optionalDependencies": {
 | 
			
		||||
    "@cypress/schematic": "^1.3.0",
 | 
			
		||||
    "cypress": "^9.5.2",
 | 
			
		||||
    "cypress": "^9.6.1",
 | 
			
		||||
    "cypress-fail-on-console-error": "^2.1.3",
 | 
			
		||||
    "cypress-wait-until": "^1.7.1",
 | 
			
		||||
    "mock-socket": "^9.0.3",
 | 
			
		||||
 | 
			
		||||
@ -1,43 +1,36 @@
 | 
			
		||||
import { NgModule } from '@angular/core';
 | 
			
		||||
import { Routes, RouterModule } from '@angular/router';
 | 
			
		||||
import { Routes, RouterModule, PreloadAllModules } from '@angular/router';
 | 
			
		||||
import { StartComponent } from './components/start/start.component';
 | 
			
		||||
import { TransactionComponent } from './components/transaction/transaction.component';
 | 
			
		||||
import { BlockComponent } from './components/block/block.component';
 | 
			
		||||
import { AddressComponent } from './components/address/address.component';
 | 
			
		||||
import { MasterPageComponent } from './components/master-page/master-page.component';
 | 
			
		||||
import { AboutComponent } from './components/about/about.component';
 | 
			
		||||
import { TelevisionComponent } from './components/television/television.component';
 | 
			
		||||
import { StatisticsComponent } from './components/statistics/statistics.component';
 | 
			
		||||
import { MempoolBlockComponent } from './components/mempool-block/mempool-block.component';
 | 
			
		||||
import { AssetComponent } from './components/asset/asset.component';
 | 
			
		||||
import { AssetsNavComponent } from './components/assets/assets-nav/assets-nav.component';
 | 
			
		||||
import { StatusViewComponent } from './components/status-view/status-view.component';
 | 
			
		||||
import { DashboardComponent } from './dashboard/dashboard.component';
 | 
			
		||||
import { LatestBlocksComponent } from './components/latest-blocks/latest-blocks.component';
 | 
			
		||||
import { TermsOfServiceComponent } from './components/terms-of-service/terms-of-service.component';
 | 
			
		||||
import { PrivacyPolicyComponent } from './components/privacy-policy/privacy-policy.component';
 | 
			
		||||
import { TrademarkPolicyComponent } from './components/trademark-policy/trademark-policy.component';
 | 
			
		||||
import { BisqMasterPageComponent } from './components/bisq-master-page/bisq-master-page.component';
 | 
			
		||||
import { SponsorComponent } from './components/sponsor/sponsor.component';
 | 
			
		||||
import { LiquidMasterPageComponent } from './components/liquid-master-page/liquid-master-page.component';
 | 
			
		||||
import { PushTransactionComponent } from './components/push-transaction/push-transaction.component';
 | 
			
		||||
import { PoolRankingComponent } from './components/pool-ranking/pool-ranking.component';
 | 
			
		||||
import { BlocksList } from './components/blocks-list/blocks-list.component';
 | 
			
		||||
import { LiquidMasterPageComponent } from './components/liquid-master-page/liquid-master-page.component';
 | 
			
		||||
import { AssetGroupComponent } from './components/assets/asset-group/asset-group.component';
 | 
			
		||||
import { AssetsFeaturedComponent } from './components/assets/assets-featured/assets-featured.component';
 | 
			
		||||
import { AssetsComponent } from './components/assets/assets.component';
 | 
			
		||||
import { PoolComponent } from './components/pool/pool.component';
 | 
			
		||||
import { MiningDashboardComponent } from './components/mining-dashboard/mining-dashboard.component';
 | 
			
		||||
import { HashrateChartComponent } from './components/hashrate-chart/hashrate-chart.component';
 | 
			
		||||
import { HashrateChartPoolsComponent } from './components/hashrates-chart-pools/hashrate-chart-pools.component';
 | 
			
		||||
import { MiningStartComponent } from './components/mining-start/mining-start.component';
 | 
			
		||||
import { GraphsComponent } from './components/graphs/graphs.component';
 | 
			
		||||
import { BlocksList } from './components/blocks-list/blocks-list.component';
 | 
			
		||||
import { BlockFeesGraphComponent } from './components/block-fees-graph/block-fees-graph.component';
 | 
			
		||||
import { BlockRewardsGraphComponent } from './components/block-rewards-graph/block-rewards-graph.component';
 | 
			
		||||
import { BlockFeeRatesGraphComponent } from './components/block-fee-rates-graph/block-fee-rates-graph.component';
 | 
			
		||||
import { BlockSizesWeightsGraphComponent } from './components/block-sizes-weights-graph/block-sizes-weights-graph.component';
 | 
			
		||||
import { AssetComponent } from './components/asset/asset.component';
 | 
			
		||||
import { AssetsNavComponent } from './components/assets/assets-nav/assets-nav.component';
 | 
			
		||||
 | 
			
		||||
let routes: Routes = [
 | 
			
		||||
  { 
 | 
			
		||||
    path: 'testnet',
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
        path: '',
 | 
			
		||||
        pathMatch: 'full',
 | 
			
		||||
        loadChildren: () => import('./graphs/graphs.module').then(m => m.GraphsModule)
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: '',
 | 
			
		||||
        component: MasterPageComponent,
 | 
			
		||||
@ -46,109 +39,17 @@ let routes: Routes = [
 | 
			
		||||
            path: 'tx/push',
 | 
			
		||||
            component: PushTransactionComponent,
 | 
			
		||||
          },
 | 
			
		||||
      {
 | 
			
		||||
        path: '',
 | 
			
		||||
        component: StartComponent,
 | 
			
		||||
        children: [
 | 
			
		||||
          {
 | 
			
		||||
            path: '',
 | 
			
		||||
            component: DashboardComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'tx/:id',
 | 
			
		||||
            component: TransactionComponent
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'block/:id',
 | 
			
		||||
            component: BlockComponent
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'mempool-block/:id',
 | 
			
		||||
            component: MempoolBlockComponent
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'mining',
 | 
			
		||||
            component: MiningDashboardComponent,
 | 
			
		||||
          },
 | 
			
		||||
        ],
 | 
			
		||||
      },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'blocks',
 | 
			
		||||
            component: LatestBlocksComponent,
 | 
			
		||||
          },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'mining',
 | 
			
		||||
        component: MiningStartComponent,
 | 
			
		||||
        children: [
 | 
			
		||||
          {
 | 
			
		||||
            path: 'blocks',
 | 
			
		||||
            component: BlocksList,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'pool',
 | 
			
		||||
            children: [
 | 
			
		||||
              {
 | 
			
		||||
                path: ':slug',
 | 
			
		||||
                component: PoolComponent,
 | 
			
		||||
              },
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'graphs',
 | 
			
		||||
        component: GraphsComponent,
 | 
			
		||||
        children: [
 | 
			
		||||
          {
 | 
			
		||||
            path: '',
 | 
			
		||||
            pathMatch: 'full',
 | 
			
		||||
            redirectTo: 'mempool',
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'mempool',
 | 
			
		||||
            component: StatisticsComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'mining/hashrate-difficulty',
 | 
			
		||||
            component: HashrateChartComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'mining/pools-dominance',
 | 
			
		||||
            component: HashrateChartPoolsComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'mining/pools',
 | 
			
		||||
            component: PoolRankingComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'mining/block-fees',
 | 
			
		||||
            component: BlockFeesGraphComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'mining/block-rewards',
 | 
			
		||||
            component: BlockRewardsGraphComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'mining/block-fee-rates',
 | 
			
		||||
            component: BlockFeeRatesGraphComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'mining/block-sizes-weights',
 | 
			
		||||
            component: BlockSizesWeightsGraphComponent,
 | 
			
		||||
          },
 | 
			
		||||
        ],
 | 
			
		||||
      },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'about',
 | 
			
		||||
            component: AboutComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
        path: 'docs',
 | 
			
		||||
        loadChildren: () => import('./docs/docs.module').then(m => m.DocsModule)
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'api',
 | 
			
		||||
        loadChildren: () => import('./docs/docs.module').then(m => m.DocsModule)
 | 
			
		||||
            path: 'mining/blocks',
 | 
			
		||||
            component: BlocksList,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'terms-of-service',
 | 
			
		||||
@ -167,115 +68,25 @@ let routes: Routes = [
 | 
			
		||||
            children: [],
 | 
			
		||||
            component: AddressComponent
 | 
			
		||||
          },
 | 
			
		||||
    ],
 | 
			
		||||
  },
 | 
			
		||||
          {
 | 
			
		||||
    path: 'testnet',
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
        path: '',
 | 
			
		||||
        component: MasterPageComponent,
 | 
			
		||||
        children: [
 | 
			
		||||
          {
 | 
			
		||||
            path: 'tx/push',
 | 
			
		||||
            component: PushTransactionComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: '',
 | 
			
		||||
            path: 'tx',
 | 
			
		||||
            component: StartComponent,
 | 
			
		||||
            children: [
 | 
			
		||||
              {
 | 
			
		||||
                path: '',
 | 
			
		||||
                component: DashboardComponent
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'tx/:id',
 | 
			
		||||
                path: ':id',
 | 
			
		||||
                component: TransactionComponent
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'block/:id',
 | 
			
		||||
                component: BlockComponent
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'mempool-block/:id',
 | 
			
		||||
                component: MempoolBlockComponent
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'mining',
 | 
			
		||||
                component: MiningDashboardComponent,
 | 
			
		||||
              },
 | 
			
		||||
            ],
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'blocks',
 | 
			
		||||
            component: LatestBlocksComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'mining',
 | 
			
		||||
            component: MiningStartComponent,
 | 
			
		||||
            path: 'block',
 | 
			
		||||
            component: StartComponent,
 | 
			
		||||
              children: [
 | 
			
		||||
              {
 | 
			
		||||
                path: 'blocks',
 | 
			
		||||
                component: BlocksList,
 | 
			
		||||
                path: ':id',
 | 
			
		||||
                component: BlockComponent
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'pool',
 | 
			
		||||
                children: [
 | 
			
		||||
                  {
 | 
			
		||||
                    path: ':slug',
 | 
			
		||||
                    component: PoolComponent,
 | 
			
		||||
                  },
 | 
			
		||||
                ]
 | 
			
		||||
              },
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'graphs',
 | 
			
		||||
            component: GraphsComponent,
 | 
			
		||||
            children: [
 | 
			
		||||
              {
 | 
			
		||||
                path: '',
 | 
			
		||||
                pathMatch: 'full',
 | 
			
		||||
                redirectTo: 'mempool',
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'mempool',
 | 
			
		||||
                component: StatisticsComponent,
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'mining/hashrate-difficulty',
 | 
			
		||||
                component: HashrateChartComponent,
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'mining/pools-dominance',
 | 
			
		||||
                component: HashrateChartPoolsComponent,
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'mining/pools',
 | 
			
		||||
                component: PoolRankingComponent,
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'mining/block-fees',
 | 
			
		||||
                component: BlockFeesGraphComponent,
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'mining/block-rewards',
 | 
			
		||||
                component: BlockRewardsGraphComponent,
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'mining/block-fee-rates',
 | 
			
		||||
                component: BlockFeeRatesGraphComponent,
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'mining/block-sizes-weights',
 | 
			
		||||
                component: BlockSizesWeightsGraphComponent,
 | 
			
		||||
              },
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'address/:id',
 | 
			
		||||
            children: [],
 | 
			
		||||
            component: AddressComponent
 | 
			
		||||
            ],
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'docs',
 | 
			
		||||
@ -287,14 +98,14 @@ let routes: Routes = [
 | 
			
		||||
          },
 | 
			
		||||
        ],
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'tv',
 | 
			
		||||
        component: TelevisionComponent
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'status',
 | 
			
		||||
        component: StatusViewComponent
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: '',
 | 
			
		||||
        loadChildren: () => import('./graphs/graphs.module').then(m => m.GraphsModule)
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: '**',
 | 
			
		||||
        redirectTo: '/testnet'
 | 
			
		||||
@ -304,6 +115,11 @@ let routes: Routes = [
 | 
			
		||||
  {
 | 
			
		||||
    path: 'signet',
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
        path: '',
 | 
			
		||||
        pathMatch: 'full',
 | 
			
		||||
        loadChildren: () => import('./graphs/graphs.module').then(m => m.GraphsModule)
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: '',
 | 
			
		||||
        component: MasterPageComponent,
 | 
			
		||||
@ -312,103 +128,55 @@ let routes: Routes = [
 | 
			
		||||
            path: 'tx/push',
 | 
			
		||||
            component: PushTransactionComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: '',
 | 
			
		||||
            component: StartComponent,
 | 
			
		||||
            children: [
 | 
			
		||||
              {
 | 
			
		||||
                path: '',
 | 
			
		||||
                component: DashboardComponent
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'tx/:id',
 | 
			
		||||
                component: TransactionComponent
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'block/:id',
 | 
			
		||||
                component: BlockComponent
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'mempool-block/:id',
 | 
			
		||||
                component: MempoolBlockComponent
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'mining',
 | 
			
		||||
                component: MiningDashboardComponent,
 | 
			
		||||
              },
 | 
			
		||||
            ],
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'blocks',
 | 
			
		||||
            component: LatestBlocksComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'mining',
 | 
			
		||||
            component: MiningStartComponent,
 | 
			
		||||
            children: [
 | 
			
		||||
            path: 'about',
 | 
			
		||||
            component: AboutComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
                path: 'blocks',
 | 
			
		||||
            path: 'mining/blocks',
 | 
			
		||||
            component: BlocksList,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
                path: 'pool',
 | 
			
		||||
                children: [
 | 
			
		||||
                  {
 | 
			
		||||
                    path: ':slug',
 | 
			
		||||
                    component: PoolComponent,
 | 
			
		||||
                  },
 | 
			
		||||
                ]
 | 
			
		||||
              },
 | 
			
		||||
            ]
 | 
			
		||||
            path: 'terms-of-service',
 | 
			
		||||
            component: TermsOfServiceComponent
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'graphs',
 | 
			
		||||
            component: GraphsComponent,
 | 
			
		||||
            children: [
 | 
			
		||||
              {
 | 
			
		||||
                path: '',
 | 
			
		||||
                pathMatch: 'full',
 | 
			
		||||
                redirectTo: 'mempool',
 | 
			
		||||
            path: 'privacy-policy',
 | 
			
		||||
            component: PrivacyPolicyComponent
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
                path: 'mempool',
 | 
			
		||||
                component: StatisticsComponent,
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'mining/hashrate-difficulty',
 | 
			
		||||
                component: HashrateChartComponent,
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'mining/pools-dominance',
 | 
			
		||||
                component: HashrateChartPoolsComponent,
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'mining/pools',
 | 
			
		||||
                component: PoolRankingComponent,
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'mining/block-fees',
 | 
			
		||||
                component: BlockFeesGraphComponent,
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'mining/block-rewards',
 | 
			
		||||
                component: BlockRewardsGraphComponent,
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'mining/block-fee-rates',
 | 
			
		||||
                component: BlockFeeRatesGraphComponent,
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'mining/block-sizes-weights',
 | 
			
		||||
                component: BlockSizesWeightsGraphComponent,
 | 
			
		||||
              },
 | 
			
		||||
            ]
 | 
			
		||||
            path: 'trademark-policy',
 | 
			
		||||
            component: TrademarkPolicyComponent
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'address/:id',
 | 
			
		||||
            children: [],
 | 
			
		||||
            component: AddressComponent
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'tx',
 | 
			
		||||
            component: StartComponent,
 | 
			
		||||
            children: [
 | 
			
		||||
              {
 | 
			
		||||
                path: ':id',
 | 
			
		||||
                component: TransactionComponent
 | 
			
		||||
              },
 | 
			
		||||
            ],
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'block',
 | 
			
		||||
            component: StartComponent,
 | 
			
		||||
              children: [
 | 
			
		||||
              {
 | 
			
		||||
                path: ':id',
 | 
			
		||||
                component: BlockComponent
 | 
			
		||||
              },
 | 
			
		||||
            ],
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'docs',
 | 
			
		||||
            loadChildren: () => import('./docs/docs.module').then(m => m.DocsModule)
 | 
			
		||||
@ -419,14 +187,14 @@ let routes: Routes = [
 | 
			
		||||
          },
 | 
			
		||||
        ],
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'tv',
 | 
			
		||||
        component: TelevisionComponent
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'status',
 | 
			
		||||
        component: StatusViewComponent
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: '',
 | 
			
		||||
        loadChildren: () => import('./graphs/graphs.module').then(m => m.GraphsModule)
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: '**',
 | 
			
		||||
        redirectTo: '/signet'
 | 
			
		||||
@ -434,8 +202,76 @@ let routes: Routes = [
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    path: 'tv',
 | 
			
		||||
    component: TelevisionComponent,
 | 
			
		||||
    path: '',
 | 
			
		||||
    pathMatch: 'full',
 | 
			
		||||
    loadChildren: () => import('./graphs/graphs.module').then(m => m.GraphsModule)
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    path: '',
 | 
			
		||||
    component: MasterPageComponent,
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
        path: 'tx/push',
 | 
			
		||||
        component: PushTransactionComponent,
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'blocks',
 | 
			
		||||
        component: LatestBlocksComponent,
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'about',
 | 
			
		||||
        component: AboutComponent,
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'mining/blocks',
 | 
			
		||||
        component: BlocksList,
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'terms-of-service',
 | 
			
		||||
        component: TermsOfServiceComponent
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'privacy-policy',
 | 
			
		||||
        component: PrivacyPolicyComponent
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'trademark-policy',
 | 
			
		||||
        component: TrademarkPolicyComponent
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'address/:id',
 | 
			
		||||
        children: [],
 | 
			
		||||
        component: AddressComponent
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'tx',
 | 
			
		||||
        component: StartComponent,
 | 
			
		||||
        children: [
 | 
			
		||||
          {
 | 
			
		||||
            path: ':id',
 | 
			
		||||
            component: TransactionComponent
 | 
			
		||||
          },
 | 
			
		||||
        ],
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'block',
 | 
			
		||||
        component: StartComponent,
 | 
			
		||||
          children: [
 | 
			
		||||
          {
 | 
			
		||||
            path: ':id',
 | 
			
		||||
            component: BlockComponent
 | 
			
		||||
          },
 | 
			
		||||
        ],
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'docs',
 | 
			
		||||
        loadChildren: () => import('./docs/docs.module').then(m => m.DocsModule)
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'api',
 | 
			
		||||
        loadChildren: () => import('./docs/docs.module').then(m => m.DocsModule)
 | 
			
		||||
      },
 | 
			
		||||
    ],
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    path: 'status',
 | 
			
		||||
@ -445,6 +281,10 @@ let routes: Routes = [
 | 
			
		||||
    path: 'sponsor',
 | 
			
		||||
    component: SponsorComponent,
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    path: '',
 | 
			
		||||
    loadChildren: () => import('./graphs/graphs.module').then(m => m.GraphsModule)
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    path: '**',
 | 
			
		||||
    redirectTo: ''
 | 
			
		||||
@ -464,59 +304,180 @@ if (browserWindowEnv && browserWindowEnv.BASE_MODULE === 'bisq') {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if (browserWindowEnv && browserWindowEnv.BASE_MODULE === 'liquid') {
 | 
			
		||||
  routes = [{
 | 
			
		||||
  routes = [
 | 
			
		||||
    {
 | 
			
		||||
      path: 'testnet',
 | 
			
		||||
      children: [
 | 
			
		||||
        {
 | 
			
		||||
          path: '',
 | 
			
		||||
          pathMatch: 'full',
 | 
			
		||||
          loadChildren: () => import('./graphs/graphs.module').then(m => m.GraphsModule)
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          path: '',
 | 
			
		||||
          component: LiquidMasterPageComponent,
 | 
			
		||||
          children: [
 | 
			
		||||
      {
 | 
			
		||||
        path: '',
 | 
			
		||||
        component: StartComponent,
 | 
			
		||||
        children: [
 | 
			
		||||
          {
 | 
			
		||||
            path: '',
 | 
			
		||||
            component: DashboardComponent
 | 
			
		||||
          },
 | 
			
		||||
            {
 | 
			
		||||
              path: 'tx/push',
 | 
			
		||||
              component: PushTransactionComponent,
 | 
			
		||||
            },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'tx/:id',
 | 
			
		||||
            component: TransactionComponent
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'block/:id',
 | 
			
		||||
            component: BlockComponent
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'mempool-block/:id',
 | 
			
		||||
            component: MempoolBlockComponent
 | 
			
		||||
          },
 | 
			
		||||
        ],
 | 
			
		||||
      },
 | 
			
		||||
            {
 | 
			
		||||
              path: 'blocks',
 | 
			
		||||
              component: LatestBlocksComponent,
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
        path: 'graphs',
 | 
			
		||||
        component: GraphsComponent,
 | 
			
		||||
        children: [
 | 
			
		||||
          {
 | 
			
		||||
            path: '',
 | 
			
		||||
            pathMatch: 'full',
 | 
			
		||||
            redirectTo: 'mempool',
 | 
			
		||||
              path: 'about',
 | 
			
		||||
              component: AboutComponent,
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
            path: 'mempool',
 | 
			
		||||
            component: StatisticsComponent,
 | 
			
		||||
              path: 'mining/blocks',
 | 
			
		||||
              component: BlocksList,
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              path: 'terms-of-service',
 | 
			
		||||
              component: TermsOfServiceComponent
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              path: 'privacy-policy',
 | 
			
		||||
              component: PrivacyPolicyComponent
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              path: 'trademark-policy',
 | 
			
		||||
              component: TrademarkPolicyComponent
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              path: 'address/:id',
 | 
			
		||||
              children: [],
 | 
			
		||||
              component: AddressComponent
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              path: 'tx',
 | 
			
		||||
              component: StartComponent,
 | 
			
		||||
              children: [
 | 
			
		||||
                {
 | 
			
		||||
                  path: ':id',
 | 
			
		||||
                  component: TransactionComponent
 | 
			
		||||
                },
 | 
			
		||||
              ],
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              path: 'block',
 | 
			
		||||
              component: StartComponent,
 | 
			
		||||
                children: [
 | 
			
		||||
                {
 | 
			
		||||
                  path: ':id',
 | 
			
		||||
                  component: BlockComponent
 | 
			
		||||
                },
 | 
			
		||||
              ],
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              path: 'assets',
 | 
			
		||||
              component: AssetsNavComponent,
 | 
			
		||||
              children: [
 | 
			
		||||
                {
 | 
			
		||||
                  path: 'all',
 | 
			
		||||
                  component: AssetsComponent,
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                  path: 'asset/:id',
 | 
			
		||||
                  component: AssetComponent
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                  path: 'group/:id',
 | 
			
		||||
                  component: AssetGroupComponent
 | 
			
		||||
                },
 | 
			
		||||
                {
 | 
			
		||||
                  path: '**',
 | 
			
		||||
                  redirectTo: 'all'
 | 
			
		||||
                }
 | 
			
		||||
              ]
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              path: 'docs',
 | 
			
		||||
              loadChildren: () => import('./docs/docs.module').then(m => m.DocsModule)
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
              path: 'api',
 | 
			
		||||
              loadChildren: () => import('./docs/docs.module').then(m => m.DocsModule)
 | 
			
		||||
            },
 | 
			
		||||
          ],
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          path: 'status',
 | 
			
		||||
          component: StatusViewComponent
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          path: '',
 | 
			
		||||
          loadChildren: () => import('./graphs/graphs.module').then(m => m.GraphsModule)
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          path: '**',
 | 
			
		||||
          redirectTo: '/signet'
 | 
			
		||||
        },
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: '',
 | 
			
		||||
      pathMatch: 'full',
 | 
			
		||||
      loadChildren: () => import('./graphs/graphs.module').then(m => m.GraphsModule)
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: '',
 | 
			
		||||
      component: LiquidMasterPageComponent,
 | 
			
		||||
      children: [
 | 
			
		||||
        {
 | 
			
		||||
          path: 'tx/push',
 | 
			
		||||
          component: PushTransactionComponent,
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          path: 'blocks',
 | 
			
		||||
          component: LatestBlocksComponent,
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          path: 'about',
 | 
			
		||||
          component: AboutComponent,
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          path: 'mining/blocks',
 | 
			
		||||
          component: BlocksList,
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          path: 'terms-of-service',
 | 
			
		||||
          component: TermsOfServiceComponent
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          path: 'privacy-policy',
 | 
			
		||||
          component: PrivacyPolicyComponent
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          path: 'trademark-policy',
 | 
			
		||||
          component: TrademarkPolicyComponent
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          path: 'address/:id',
 | 
			
		||||
          children: [],
 | 
			
		||||
          component: AddressComponent
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          path: 'tx',
 | 
			
		||||
          component: StartComponent,
 | 
			
		||||
          children: [
 | 
			
		||||
            {
 | 
			
		||||
              path: ':id',
 | 
			
		||||
              component: TransactionComponent
 | 
			
		||||
            },
 | 
			
		||||
          ],
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          path: 'block',
 | 
			
		||||
          component: StartComponent,
 | 
			
		||||
            children: [
 | 
			
		||||
            {
 | 
			
		||||
              path: ':id',
 | 
			
		||||
              component: BlockComponent
 | 
			
		||||
            },
 | 
			
		||||
          ],
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          path: 'assets',
 | 
			
		||||
          component: AssetsNavComponent,
 | 
			
		||||
@ -551,157 +512,33 @@ if (browserWindowEnv && browserWindowEnv.BASE_MODULE === 'liquid') {
 | 
			
		||||
          path: 'api',
 | 
			
		||||
          loadChildren: () => import('./docs/docs.module').then(m => m.DocsModule)
 | 
			
		||||
        },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'about',
 | 
			
		||||
        component: AboutComponent,
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'terms-of-service',
 | 
			
		||||
        component: TermsOfServiceComponent
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'privacy-policy',
 | 
			
		||||
        component: PrivacyPolicyComponent
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'trademark-policy',
 | 
			
		||||
        component: TrademarkPolicyComponent
 | 
			
		||||
      },
 | 
			
		||||
      ],
 | 
			
		||||
    },
 | 
			
		||||
  {
 | 
			
		||||
    path: 'testnet',
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
        path: '',
 | 
			
		||||
        component: LiquidMasterPageComponent,
 | 
			
		||||
        children: [
 | 
			
		||||
          {
 | 
			
		||||
            path: '',
 | 
			
		||||
            component: StartComponent,
 | 
			
		||||
            children: [
 | 
			
		||||
              {
 | 
			
		||||
                path: '',
 | 
			
		||||
                component: DashboardComponent
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'tx/push',
 | 
			
		||||
                component: PushTransactionComponent,
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'tx/:id',
 | 
			
		||||
                component: TransactionComponent
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'block/:id',
 | 
			
		||||
                component: BlockComponent
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'mempool-block/:id',
 | 
			
		||||
                component: MempoolBlockComponent
 | 
			
		||||
              },
 | 
			
		||||
            ],
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'blocks',
 | 
			
		||||
            component: LatestBlocksComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'graphs',
 | 
			
		||||
            component: GraphsComponent,
 | 
			
		||||
            children: [
 | 
			
		||||
              {
 | 
			
		||||
                path: '',
 | 
			
		||||
                pathMatch: 'full',
 | 
			
		||||
                redirectTo: 'mempool',
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'mempool',
 | 
			
		||||
                component: StatisticsComponent,
 | 
			
		||||
              }
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'address/:id',
 | 
			
		||||
            component: AddressComponent
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'assets',
 | 
			
		||||
            component: AssetsNavComponent,
 | 
			
		||||
            children: [
 | 
			
		||||
              {
 | 
			
		||||
                path: 'all',
 | 
			
		||||
                component: AssetsComponent,
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'asset/:id',
 | 
			
		||||
                component: AssetComponent
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: 'group/:id',
 | 
			
		||||
                component: AssetGroupComponent
 | 
			
		||||
              },
 | 
			
		||||
              {
 | 
			
		||||
                path: '**',
 | 
			
		||||
                redirectTo: 'all'
 | 
			
		||||
              }
 | 
			
		||||
            ]
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'docs',
 | 
			
		||||
            loadChildren: () => import('./docs/docs.module').then(m => m.DocsModule)
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'api',
 | 
			
		||||
            loadChildren: () => import('./docs/docs.module').then(m => m.DocsModule)
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'about',
 | 
			
		||||
            component: AboutComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'terms-of-service',
 | 
			
		||||
            component: TermsOfServiceComponent
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'privacy-policy',
 | 
			
		||||
            component: PrivacyPolicyComponent
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'trademark-policy',
 | 
			
		||||
            component: TrademarkPolicyComponent
 | 
			
		||||
          },
 | 
			
		||||
        ],
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'tv',
 | 
			
		||||
        component: TelevisionComponent
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'status',
 | 
			
		||||
        component: StatusViewComponent
 | 
			
		||||
      },
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    path: 'tv',
 | 
			
		||||
    component: TelevisionComponent
 | 
			
		||||
  },
 | 
			
		||||
    {
 | 
			
		||||
      path: 'status',
 | 
			
		||||
      component: StatusViewComponent
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: 'sponsor',
 | 
			
		||||
      component: SponsorComponent,
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: '',
 | 
			
		||||
      loadChildren: () => import('./graphs/graphs.module').then(m => m.GraphsModule)
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      path: '**',
 | 
			
		||||
    redirectTo: '/testnet'
 | 
			
		||||
  }];
 | 
			
		||||
      redirectTo: ''
 | 
			
		||||
    },
 | 
			
		||||
  ];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@NgModule({
 | 
			
		||||
  imports: [RouterModule.forRoot(routes, {
 | 
			
		||||
    initialNavigation: 'enabled',
 | 
			
		||||
    scrollPositionRestoration: 'enabled',
 | 
			
		||||
    anchorScrolling: 'enabled'
 | 
			
		||||
    anchorScrolling: 'enabled',
 | 
			
		||||
    preloadingStrategy: PreloadAllModules
 | 
			
		||||
  })],
 | 
			
		||||
})
 | 
			
		||||
export class AppRoutingModule { }
 | 
			
		||||
 | 
			
		||||
@ -2,141 +2,23 @@ import { BrowserModule, BrowserTransferStateModule } from '@angular/platform-bro
 | 
			
		||||
import { NgModule } from '@angular/core';
 | 
			
		||||
import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
 | 
			
		||||
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
 | 
			
		||||
import { InfiniteScrollModule } from 'ngx-infinite-scroll';
 | 
			
		||||
import { NgxEchartsModule } from 'ngx-echarts';
 | 
			
		||||
 | 
			
		||||
import { AppRoutingModule } from './app-routing.module';
 | 
			
		||||
import { AppComponent } from './components/app/app.component';
 | 
			
		||||
 | 
			
		||||
import { StartComponent } from './components/start/start.component';
 | 
			
		||||
import { ElectrsApiService } from './services/electrs-api.service';
 | 
			
		||||
import { TransactionComponent } from './components/transaction/transaction.component';
 | 
			
		||||
import { TransactionsListComponent } from './components/transactions-list/transactions-list.component';
 | 
			
		||||
import { StateService } from './services/state.service';
 | 
			
		||||
import { BlockComponent } from './components/block/block.component';
 | 
			
		||||
import { AddressComponent } from './components/address/address.component';
 | 
			
		||||
import { SearchFormComponent } from './components/search-form/search-form.component';
 | 
			
		||||
import { LatestBlocksComponent } from './components/latest-blocks/latest-blocks.component';
 | 
			
		||||
import { WebsocketService } from './services/websocket.service';
 | 
			
		||||
import { AddressLabelsComponent } from './components/address-labels/address-labels.component';
 | 
			
		||||
import { MasterPageComponent } from './components/master-page/master-page.component';
 | 
			
		||||
import { BisqMasterPageComponent } from './components/bisq-master-page/bisq-master-page.component';
 | 
			
		||||
import { LiquidMasterPageComponent } from './components/liquid-master-page/liquid-master-page.component';
 | 
			
		||||
import { AboutComponent } from './components/about/about.component';
 | 
			
		||||
import { TelevisionComponent } from './components/television/television.component';
 | 
			
		||||
import { StatisticsComponent } from './components/statistics/statistics.component';
 | 
			
		||||
import { FooterComponent } from './components/footer/footer.component';
 | 
			
		||||
import { AudioService } from './services/audio.service';
 | 
			
		||||
import { MempoolBlockComponent } from './components/mempool-block/mempool-block.component';
 | 
			
		||||
import { FeeDistributionGraphComponent } from './components/fee-distribution-graph/fee-distribution-graph.component';
 | 
			
		||||
import { IncomingTransactionsGraphComponent } from './components/incoming-transactions-graph/incoming-transactions-graph.component';
 | 
			
		||||
import { TimeSpanComponent } from './components/time-span/time-span.component';
 | 
			
		||||
import { SeoService } from './services/seo.service';
 | 
			
		||||
import { MempoolGraphComponent } from './components/mempool-graph/mempool-graph.component';
 | 
			
		||||
import { PoolRankingComponent } from './components/pool-ranking/pool-ranking.component';
 | 
			
		||||
import { PoolComponent } from './components/pool/pool.component';
 | 
			
		||||
import { LbtcPegsGraphComponent } from './components/lbtc-pegs-graph/lbtc-pegs-graph.component';
 | 
			
		||||
import { AssetComponent } from './components/asset/asset.component';
 | 
			
		||||
import { AssetsComponent } from './components/assets/assets.component';
 | 
			
		||||
import { AssetsNavComponent } from './components/assets/assets-nav/assets-nav.component';
 | 
			
		||||
import { StatusViewComponent } from './components/status-view/status-view.component';
 | 
			
		||||
import { SharedModule } from './shared/shared.module';
 | 
			
		||||
import { NgbTypeaheadModule } from '@ng-bootstrap/ng-bootstrap';
 | 
			
		||||
import { FeesBoxComponent } from './components/fees-box/fees-box.component';
 | 
			
		||||
import { DashboardComponent } from './dashboard/dashboard.component';
 | 
			
		||||
import { DifficultyComponent } from './components/difficulty/difficulty.component';
 | 
			
		||||
import { FontAwesomeModule, FaIconLibrary } from '@fortawesome/angular-fontawesome';
 | 
			
		||||
import { faFilter, faAngleDown, faAngleUp, faAngleRight, faAngleLeft, faBolt, faChartArea, faCogs, faCubes, faHammer, faDatabase, faExchangeAlt, faInfoCircle,
 | 
			
		||||
  faLink, faList, faSearch, faCaretUp, faCaretDown, faTachometerAlt, faThList, faTint, faTv, faAngleDoubleDown, faSortUp, faAngleDoubleUp, faChevronDown,
 | 
			
		||||
  faFileAlt, faRedoAlt, faArrowAltCircleRight, faExternalLinkAlt, faBook, faListUl, faDownload } from '@fortawesome/free-solid-svg-icons';
 | 
			
		||||
import { TermsOfServiceComponent } from './components/terms-of-service/terms-of-service.component';
 | 
			
		||||
import { PrivacyPolicyComponent } from './components/privacy-policy/privacy-policy.component';
 | 
			
		||||
import { TrademarkPolicyComponent } from './components/trademark-policy/trademark-policy.component';
 | 
			
		||||
import { StorageService } from './services/storage.service';
 | 
			
		||||
import { HttpCacheInterceptor } from './services/http-cache.interceptor';
 | 
			
		||||
import { LanguageService } from './services/language.service';
 | 
			
		||||
import { SponsorComponent } from './components/sponsor/sponsor.component';
 | 
			
		||||
import { PushTransactionComponent } from './components/push-transaction/push-transaction.component';
 | 
			
		||||
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
 | 
			
		||||
import { AssetsFeaturedComponent } from './components/assets/assets-featured/assets-featured.component';
 | 
			
		||||
import { AssetGroupComponent } from './components/assets/asset-group/asset-group.component';
 | 
			
		||||
import { AssetCirculationComponent } from './components/asset-circulation/asset-circulation.component';
 | 
			
		||||
import { MiningDashboardComponent } from './components/mining-dashboard/mining-dashboard.component';
 | 
			
		||||
import { HashrateChartComponent } from './components/hashrate-chart/hashrate-chart.component';
 | 
			
		||||
import { HashrateChartPoolsComponent } from './components/hashrates-chart-pools/hashrate-chart-pools.component';
 | 
			
		||||
import { MiningStartComponent } from './components/mining-start/mining-start.component';
 | 
			
		||||
import { AmountShortenerPipe } from './shared/pipes/amount-shortener.pipe';
 | 
			
		||||
import { ShortenStringPipe } from './shared/pipes/shorten-string-pipe/shorten-string.pipe';
 | 
			
		||||
import { CapAddressPipe } from './shared/pipes/cap-address-pipe/cap-address-pipe';
 | 
			
		||||
import { GraphsComponent } from './components/graphs/graphs.component';
 | 
			
		||||
import { DifficultyAdjustmentsTable } from './components/difficulty-adjustments-table/difficulty-adjustments-table.components';
 | 
			
		||||
import { BlocksList } from './components/blocks-list/blocks-list.component';
 | 
			
		||||
import { RewardStatsComponent } from './components/reward-stats/reward-stats.component';
 | 
			
		||||
import { DataCyDirective } from './data-cy.directive';
 | 
			
		||||
import { BlockFeesGraphComponent } from './components/block-fees-graph/block-fees-graph.component';
 | 
			
		||||
import { BlockRewardsGraphComponent } from './components/block-rewards-graph/block-rewards-graph.component';
 | 
			
		||||
import { BlockFeeRatesGraphComponent } from './components/block-fee-rates-graph/block-fee-rates-graph.component';
 | 
			
		||||
import { LoadingIndicatorComponent } from './components/loading-indicator/loading-indicator.component';
 | 
			
		||||
import { IndexingProgressComponent } from './components/indexing-progress/indexing-progress.component';
 | 
			
		||||
import { BlockSizesWeightsGraphComponent } from './components/block-sizes-weights-graph/block-sizes-weights-graph.component';
 | 
			
		||||
 | 
			
		||||
@NgModule({
 | 
			
		||||
  declarations: [
 | 
			
		||||
    AppComponent,
 | 
			
		||||
    AboutComponent,
 | 
			
		||||
    MasterPageComponent,
 | 
			
		||||
    BisqMasterPageComponent,
 | 
			
		||||
    LiquidMasterPageComponent,
 | 
			
		||||
    TelevisionComponent,
 | 
			
		||||
    StartComponent,
 | 
			
		||||
    StatisticsComponent,
 | 
			
		||||
    TransactionComponent,
 | 
			
		||||
    BlockComponent,
 | 
			
		||||
    TransactionsListComponent,
 | 
			
		||||
    AddressComponent,
 | 
			
		||||
    LatestBlocksComponent,
 | 
			
		||||
    SearchFormComponent,
 | 
			
		||||
    TimeSpanComponent,
 | 
			
		||||
    AddressLabelsComponent,
 | 
			
		||||
    FooterComponent,
 | 
			
		||||
    MempoolBlockComponent,
 | 
			
		||||
    FeeDistributionGraphComponent,
 | 
			
		||||
    IncomingTransactionsGraphComponent,
 | 
			
		||||
    MempoolGraphComponent,
 | 
			
		||||
    PoolRankingComponent,
 | 
			
		||||
    PoolComponent,
 | 
			
		||||
    LbtcPegsGraphComponent,
 | 
			
		||||
    AssetComponent,
 | 
			
		||||
    AssetsComponent,
 | 
			
		||||
    StatusViewComponent,
 | 
			
		||||
    FeesBoxComponent,
 | 
			
		||||
    DashboardComponent,
 | 
			
		||||
    DifficultyComponent,
 | 
			
		||||
    TermsOfServiceComponent,
 | 
			
		||||
    PrivacyPolicyComponent,
 | 
			
		||||
    TrademarkPolicyComponent,
 | 
			
		||||
    SponsorComponent,
 | 
			
		||||
    PushTransactionComponent,
 | 
			
		||||
    AssetsNavComponent,
 | 
			
		||||
    AssetsFeaturedComponent,
 | 
			
		||||
    AssetGroupComponent,
 | 
			
		||||
    AssetCirculationComponent,
 | 
			
		||||
    MiningDashboardComponent,
 | 
			
		||||
    HashrateChartComponent,
 | 
			
		||||
    HashrateChartPoolsComponent,
 | 
			
		||||
    MiningStartComponent,
 | 
			
		||||
    AmountShortenerPipe,
 | 
			
		||||
    GraphsComponent,
 | 
			
		||||
    DifficultyAdjustmentsTable,
 | 
			
		||||
    BlocksList,
 | 
			
		||||
    DataCyDirective,
 | 
			
		||||
    RewardStatsComponent,
 | 
			
		||||
    BlockFeesGraphComponent,
 | 
			
		||||
    BlockRewardsGraphComponent,
 | 
			
		||||
    BlockFeeRatesGraphComponent,
 | 
			
		||||
    LoadingIndicatorComponent,
 | 
			
		||||
    IndexingProgressComponent,
 | 
			
		||||
    BlockSizesWeightsGraphComponent
 | 
			
		||||
  ],
 | 
			
		||||
  imports: [
 | 
			
		||||
    BrowserModule.withServerTransition({ appId: 'serverApp' }),
 | 
			
		||||
@ -144,14 +26,7 @@ import { BlockSizesWeightsGraphComponent } from './components/block-sizes-weight
 | 
			
		||||
    AppRoutingModule,
 | 
			
		||||
    HttpClientModule,
 | 
			
		||||
    BrowserAnimationsModule,
 | 
			
		||||
    InfiniteScrollModule,
 | 
			
		||||
    NgbTypeaheadModule,
 | 
			
		||||
    NgbModule,
 | 
			
		||||
    FontAwesomeModule,
 | 
			
		||||
    SharedModule,
 | 
			
		||||
    NgxEchartsModule.forRoot({
 | 
			
		||||
      echarts: () => import('echarts')
 | 
			
		||||
    })
 | 
			
		||||
  ],
 | 
			
		||||
  providers: [
 | 
			
		||||
    ElectrsApiService,
 | 
			
		||||
@ -167,41 +42,4 @@ import { BlockSizesWeightsGraphComponent } from './components/block-sizes-weight
 | 
			
		||||
  ],
 | 
			
		||||
  bootstrap: [AppComponent]
 | 
			
		||||
})
 | 
			
		||||
export class AppModule {
 | 
			
		||||
  constructor(library: FaIconLibrary) {
 | 
			
		||||
    library.addIcons(faInfoCircle);
 | 
			
		||||
    library.addIcons(faChartArea);
 | 
			
		||||
    library.addIcons(faTv);
 | 
			
		||||
    library.addIcons(faTachometerAlt);
 | 
			
		||||
    library.addIcons(faCubes);
 | 
			
		||||
    library.addIcons(faHammer);
 | 
			
		||||
    library.addIcons(faCogs);
 | 
			
		||||
    library.addIcons(faThList);
 | 
			
		||||
    library.addIcons(faList);
 | 
			
		||||
    library.addIcons(faTachometerAlt);
 | 
			
		||||
    library.addIcons(faDatabase);
 | 
			
		||||
    library.addIcons(faSearch);
 | 
			
		||||
    library.addIcons(faLink);
 | 
			
		||||
    library.addIcons(faBolt);
 | 
			
		||||
    library.addIcons(faTint);
 | 
			
		||||
    library.addIcons(faFilter);
 | 
			
		||||
    library.addIcons(faAngleDown);
 | 
			
		||||
    library.addIcons(faAngleUp);
 | 
			
		||||
    library.addIcons(faExchangeAlt);
 | 
			
		||||
    library.addIcons(faAngleDoubleUp);
 | 
			
		||||
    library.addIcons(faAngleDoubleDown);
 | 
			
		||||
    library.addIcons(faChevronDown);
 | 
			
		||||
    library.addIcons(faFileAlt);
 | 
			
		||||
    library.addIcons(faRedoAlt);
 | 
			
		||||
    library.addIcons(faArrowAltCircleRight);
 | 
			
		||||
    library.addIcons(faExternalLinkAlt);
 | 
			
		||||
    library.addIcons(faSortUp);
 | 
			
		||||
    library.addIcons(faCaretUp);
 | 
			
		||||
    library.addIcons(faCaretDown);
 | 
			
		||||
    library.addIcons(faAngleRight);
 | 
			
		||||
    library.addIcons(faAngleLeft);
 | 
			
		||||
    library.addIcons(faBook);
 | 
			
		||||
    library.addIcons(faListUl);
 | 
			
		||||
    library.addIcons(faDownload);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
export class AppModule { }
 | 
			
		||||
 | 
			
		||||
@ -24,6 +24,7 @@ import { BisqAddressComponent } from './bisq-address/bisq-address.component';
 | 
			
		||||
import { BisqStatsComponent } from './bisq-stats/bisq-stats.component';
 | 
			
		||||
import { BsqAmountComponent } from './bsq-amount/bsq-amount.component';
 | 
			
		||||
import { BisqTradesComponent } from './bisq-trades/bisq-trades.component';
 | 
			
		||||
import { CommonModule } from '@angular/common';
 | 
			
		||||
 | 
			
		||||
@NgModule({
 | 
			
		||||
  declarations: [
 | 
			
		||||
@ -46,6 +47,7 @@ import { BisqTradesComponent } from './bisq-trades/bisq-trades.component';
 | 
			
		||||
    BisqMainDashboardComponent,
 | 
			
		||||
  ],
 | 
			
		||||
  imports: [
 | 
			
		||||
    CommonModule,
 | 
			
		||||
    BisqRoutingModule,
 | 
			
		||||
    SharedModule,
 | 
			
		||||
    NgbPaginationModule,
 | 
			
		||||
 | 
			
		||||
@ -66,9 +66,14 @@
 | 
			
		||||
 | 
			
		||||
    <div class="text-center">
 | 
			
		||||
      <ng-template [ngIf]="isLoadingTransactions">
 | 
			
		||||
        <div class="header-bg box" style="padding: 10px; margin-bottom: 10px;">
 | 
			
		||||
          <span class="skeleton-loader"></span>
 | 
			
		||||
 | 
			
		||||
        <ng-container *ngIf="addressLoadingStatus$ as addressLoadingStatus">
 | 
			
		||||
          <div class="header-bg box" style="padding: 12px; margin-bottom: 10px;">
 | 
			
		||||
            <div class="progress progress-dark">
 | 
			
		||||
              <div class="progress-bar progress-light" role="progressbar" [ngStyle]="{'width': addressLoadingStatus + '%' }"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </ng-container>
 | 
			
		||||
 | 
			
		||||
        <div class="header-bg box">
 | 
			
		||||
          <div class="row" style="height: 107px;">
 | 
			
		||||
@ -81,13 +86,6 @@
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <ng-container *ngIf="addressLoadingStatus$ | async as addressLoadingStatus">
 | 
			
		||||
          <br>
 | 
			
		||||
          <div class="progress progress-dark">
 | 
			
		||||
            <div class="progress-bar progress-darklight" role="progressbar" [ngStyle]="{'width': addressLoadingStatus + '%' }"></div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </ng-container>
 | 
			
		||||
 | 
			
		||||
      </ng-template>
 | 
			
		||||
 | 
			
		||||
      <ng-template [ngIf]="retryLoadMore">
 | 
			
		||||
@ -155,3 +153,9 @@
 | 
			
		||||
<ng-template #confidentialTd>
 | 
			
		||||
  <td i18n="shared.confidential">Confidential</td>
 | 
			
		||||
</ng-template>
 | 
			
		||||
 | 
			
		||||
<ng-template #headerLoader>
 | 
			
		||||
  <div class="header-bg box" style="padding: 10px; margin-bottom: 10px;">
 | 
			
		||||
    <span class="skeleton-loader"></span>
 | 
			
		||||
  </div>
 | 
			
		||||
</ng-template>
 | 
			
		||||
 | 
			
		||||
@ -200,9 +200,13 @@
 | 
			
		||||
    <ng-template [ngIf]="isLoadingTransactions">
 | 
			
		||||
      <div class="text-center mb-4" class="tx-skeleton">
 | 
			
		||||
 | 
			
		||||
        <ng-container *ngIf="(txsLoadingStatus$ | async) as txsLoadingStatus; else headerLoader">
 | 
			
		||||
          <div class="header-bg box">
 | 
			
		||||
          <span class="skeleton-loader"></span>
 | 
			
		||||
            <div class="progress progress-dark" style="margin: 4px; height: 14px;">
 | 
			
		||||
              <div class="progress-bar progress-light" role="progressbar" [ngStyle]="{'width': txsLoadingStatus + '%' }"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </ng-container>
 | 
			
		||||
 | 
			
		||||
        <div class="header-bg box">
 | 
			
		||||
          <div class="row">
 | 
			
		||||
@ -215,14 +219,6 @@
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
 | 
			
		||||
        <ng-container *ngIf="(txsLoadingStatus$ | async) as txsLoadingStatus">
 | 
			
		||||
          <br>
 | 
			
		||||
          <div class="progress progress-dark">
 | 
			
		||||
            <div class="progress-bar progress-darklight" role="progressbar" [ngStyle]="{'width': txsLoadingStatus + '%' }"></div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </ng-container>
 | 
			
		||||
 | 
			
		||||
      </div>
 | 
			
		||||
    </ng-template>
 | 
			
		||||
    <ngb-pagination class="pagination-container float-right" [collectionSize]="block.tx_count" [rotate]="true" [pageSize]="itemsPerPage" [(page)]="page" (pageChange)="pageChange(page, blockTxTitle)" [maxSize]="paginationMaxSize" [boundaryLinks]="true" [ellipses]="false"></ngb-pagination>
 | 
			
		||||
@ -281,6 +277,12 @@
 | 
			
		||||
    </div>
 | 
			
		||||
  </ng-template>
 | 
			
		||||
 | 
			
		||||
  <ng-template #headerLoader>
 | 
			
		||||
    <div class="header-bg box">
 | 
			
		||||
      <span class="skeleton-loader"></span>
 | 
			
		||||
    </div>
 | 
			
		||||
  </ng-template>
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
<br>
 | 
			
		||||
 | 
			
		||||
@ -38,7 +38,7 @@
 | 
			
		||||
        <a class="nav-link" [routerLink]="['/blocks' | relativeUrl]" (click)="collapse()"><fa-icon [icon]="['fas', 'cubes']" [fixedWidth]="true" i18n-title="master-page.blocks" title="Blocks"></fa-icon></a>
 | 
			
		||||
      </li>
 | 
			
		||||
      <li class="nav-item" routerLinkActive="active" id="btn-graphs">
 | 
			
		||||
        <a class="nav-link" [routerLink]="['/graphs/mempool' | relativeUrl]" (click)="collapse()"><fa-icon [icon]="['fas', 'chart-area']" [fixedWidth]="true" i18n-title="master-page.graphs" title="Graphs"></fa-icon></a>
 | 
			
		||||
        <a class="nav-link" [routerLink]="['/graphs' | relativeUrl]" (click)="collapse()"><fa-icon [icon]="['fas', 'chart-area']" [fixedWidth]="true" i18n-title="master-page.graphs" title="Graphs"></fa-icon></a>
 | 
			
		||||
      </li>
 | 
			
		||||
      <li class="nav-item d-none d-lg-block" routerLinkActive="active" id="btn-tv">
 | 
			
		||||
        <a class="nav-link" [routerLink]="['/tv' | relativeUrl]" (click)="collapse()"><fa-icon [icon]="['fas', 'tv']" [fixedWidth]="true" i18n-title="master-page.tvview" title="TV view"></fa-icon></a>
 | 
			
		||||
 | 
			
		||||
@ -1 +0,0 @@
 | 
			
		||||
<router-outlet></router-outlet>
 | 
			
		||||
@ -1,14 +0,0 @@
 | 
			
		||||
import { Component, OnInit } from '@angular/core';
 | 
			
		||||
 | 
			
		||||
@Component({
 | 
			
		||||
  selector: 'app-mining-start',
 | 
			
		||||
  templateUrl: './mining-start.component.html',
 | 
			
		||||
})
 | 
			
		||||
export class MiningStartComponent implements OnInit {
 | 
			
		||||
 | 
			
		||||
  constructor() { }
 | 
			
		||||
 | 
			
		||||
  ngOnInit(): void {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -8,7 +8,7 @@
 | 
			
		||||
          <app-amount [satoshis]="rewardStats.totalReward" digitsInfo="1.2-2" [noFiat]="true"></app-amount>
 | 
			
		||||
        </div>
 | 
			
		||||
        <span class="fiat">
 | 
			
		||||
          <app-fiat [value]="rewardStats.totalReward"></app-fiat>
 | 
			
		||||
          <app-fiat [value]="rewardStats.totalReward" digitsInfo="1.0-0" ></app-fiat>
 | 
			
		||||
        </span>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
@ -26,7 +26,7 @@
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div class="item">
 | 
			
		||||
      <h5 class="card-title" i18n="mining.average-fee">Reward Per Tx</h5>
 | 
			
		||||
      <h5 class="card-title" i18n="mining.average-fee">Average Fee</h5>
 | 
			
		||||
      <div class="card-text" i18n-ngbTooltip="mining.average-fee"
 | 
			
		||||
        ngbTooltip="Fee paid on average for each transaction in the past 144 blocks" placement="bottom">
 | 
			
		||||
        <div class="fee-text">{{ rewardStats.feePerTx | amountShortener: 2 }}
 | 
			
		||||
 | 
			
		||||
@ -125,7 +125,7 @@ export class TransactionComponent implements OnInit, OnDestroy {
 | 
			
		||||
        }),
 | 
			
		||||
        switchMap(() => {
 | 
			
		||||
          let transactionObservable$: Observable<Transaction>;
 | 
			
		||||
          if (history.state.data) {
 | 
			
		||||
          if (history.state.data && history.state.data.fee !== -1) {
 | 
			
		||||
            transactionObservable$ = of(history.state.data);
 | 
			
		||||
          } else {
 | 
			
		||||
            transactionObservable$ = this.electrsApiService
 | 
			
		||||
 | 
			
		||||
@ -60,8 +60,11 @@
 | 
			
		||||
                    </ng-container>
 | 
			
		||||
                    <ng-container *ngSwitchDefault>
 | 
			
		||||
                      <ng-template [ngIf]="!vin.prevout" [ngIfElse]="defaultAddress">
 | 
			
		||||
                        <span *ngIf="vin.lazy; else defaultNoPrevout" class="skeleton-loader"></span>
 | 
			
		||||
                        <ng-template #defaultNoPrevout>
 | 
			
		||||
                          <span>{{ vin.issuance ? 'Issuance' : 'UNKNOWN' }}</span>
 | 
			
		||||
                        </ng-template>
 | 
			
		||||
                      </ng-template>
 | 
			
		||||
                      <ng-template #defaultAddress>
 | 
			
		||||
                        <a [routerLink]="['/address/' | relativeUrl, vin.prevout.scriptpubkey_address]" title="{{ vin.prevout.scriptpubkey_address }}">
 | 
			
		||||
                          <span class="d-block d-lg-none">{{ vin.prevout.scriptpubkey_address | shortenString : 16 }}</span>
 | 
			
		||||
@ -87,6 +90,7 @@
 | 
			
		||||
                    </ng-template>
 | 
			
		||||
                  </ng-template>
 | 
			
		||||
                  <ng-template #defaultOutput>
 | 
			
		||||
                    <span *ngIf="vin.lazy" class="skeleton-loader"></span>
 | 
			
		||||
                    <app-amount *ngIf="vin.prevout" [satoshis]="vin.prevout.value"></app-amount>
 | 
			
		||||
                  </ng-template>
 | 
			
		||||
                </td>
 | 
			
		||||
@ -141,7 +145,7 @@
 | 
			
		||||
            </ng-template>
 | 
			
		||||
            <tr *ngIf="tx.vin.length > 12 && tx['@vinLimit']">
 | 
			
		||||
              <td colspan="3" class="text-center">
 | 
			
		||||
                <button class="btn btn-sm btn-primary mt-2" (click)="tx['@vinLimit'] = false;"><span i18n="show-all">Show all</span> ({{ tx.vin.length - 10 }})</button>
 | 
			
		||||
                <button class="btn btn-sm btn-primary mt-2" (click)="loadMoreInputs(tx);"><span i18n="show-all">Show all</span> ({{ tx.vin.length - 10 }})</button>
 | 
			
		||||
              </td>
 | 
			
		||||
            </tr>
 | 
			
		||||
          </tbody>
 | 
			
		||||
@ -261,9 +265,10 @@
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div class="summary">
 | 
			
		||||
      <div class="float-left mt-2-5" *ngIf="!transactionPage && !tx.vin[0].is_coinbase">
 | 
			
		||||
      <div class="float-left mt-2-5" *ngIf="!transactionPage && !tx.vin[0].is_coinbase && tx.fee !== -1">
 | 
			
		||||
        {{ tx.fee / (tx.weight / 4) | feeRounding }} <span class="symbol" i18n="shared.sat-vbyte|sat/vB">sat/vB</span> <span class="d-none d-sm-inline-block"> – {{ tx.fee | number }} <span class="symbol" i18n="shared.sat|sat">sat</span> <span class="fiat"><app-fiat [value]="tx.fee"></app-fiat></span></span>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div class="float-left mt-2-5 grey-info-text" *ngIf="tx.fee === -1" i18n="transactions-list.load-to-reveal-fee-info">Show all inputs to reveal fee data</div>
 | 
			
		||||
 | 
			
		||||
      <div class="float-right">
 | 
			
		||||
        <ng-container *ngIf="showConfirmations && latestBlock$ | async as latestBlock">
 | 
			
		||||
 | 
			
		||||
@ -140,3 +140,9 @@ h2 {
 | 
			
		||||
.addr-right {
 | 
			
		||||
	font-family: monospace;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.grey-info-text {
 | 
			
		||||
	color:#6c757d;
 | 
			
		||||
	font-style: italic;
 | 
			
		||||
	font-size: 12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -175,6 +175,17 @@ export class TransactionsListComponent implements OnInit, OnChanges {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  loadMoreInputs(tx: Transaction) {
 | 
			
		||||
    tx['@vinLimit'] = false;
 | 
			
		||||
 | 
			
		||||
    this.electrsApiService.getTransaction$(tx.txid)
 | 
			
		||||
      .subscribe((newTx) => {
 | 
			
		||||
        tx.vin = newTx.vin;
 | 
			
		||||
        tx.fee = newTx.fee;
 | 
			
		||||
        this.ref.markForCheck();
 | 
			
		||||
      });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ngOnDestroy() {
 | 
			
		||||
    this.outspendsSubscription.unsubscribe();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -73,15 +73,15 @@
 | 
			
		||||
                </ng-template>
 | 
			
		||||
              </div>
 | 
			
		||||
              <ng-container *ngIf="network.val === 'bisq' && item.codeExample.hasOwnProperty('bisq');else liquid_code_example" #bisq_code_example>
 | 
			
		||||
                <app-code-template [hostname]="hostname" [baseNetworkUrl]="baseNetworkUrl" [method]="item.httpRequestMethod" [code]="item.codeExample.bisq" [network]="network.val" ></app-code-template>
 | 
			
		||||
                <app-code-template [hostname]="hostname" [baseNetworkUrl]="baseNetworkUrl" [method]="item.httpRequestMethod" [code]="item.codeExample.bisq" [network]="network.val" [showCodeExample]="item.showJsExamples"></app-code-template>
 | 
			
		||||
              </ng-container>
 | 
			
		||||
              <ng-template #liquid_code_example>
 | 
			
		||||
                <ng-container *ngIf="network.val === 'liquid' && item.codeExample.hasOwnProperty('liquid');else default_code_example">
 | 
			
		||||
                  <app-code-template [hostname]="hostname" [baseNetworkUrl]="baseNetworkUrl" [method]="item.httpRequestMethod" [code]="item.codeExample.liquid" [network]="network.val" ></app-code-template>
 | 
			
		||||
                  <app-code-template [hostname]="hostname" [baseNetworkUrl]="baseNetworkUrl" [method]="item.httpRequestMethod" [code]="item.codeExample.liquid" [network]="network.val" [showCodeExample]="item.showJsExamples"></app-code-template>
 | 
			
		||||
                </ng-container>
 | 
			
		||||
              </ng-template>
 | 
			
		||||
              <ng-template #default_code_example>
 | 
			
		||||
                <app-code-template [hostname]="hostname" [baseNetworkUrl]="baseNetworkUrl" [method]="item.httpRequestMethod" [code]="item.codeExample.default" [network]="network.val" ></app-code-template>
 | 
			
		||||
                <app-code-template [hostname]="hostname" [baseNetworkUrl]="baseNetworkUrl" [method]="item.httpRequestMethod" [code]="item.codeExample.default" [network]="network.val" [showCodeExample]="item.showJsExamples"></app-code-template>
 | 
			
		||||
              </ng-template>
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
@ -101,7 +101,7 @@
 | 
			
		||||
            <div class="subtitle" i18n>Description</div>
 | 
			
		||||
            <div i18n="api-docs.websocket.websocket">Default push: <code>{{ '{' }} action: 'want', data: ['blocks', ...] {{ '}' }}</code> to express what you want pushed. Available: <code>blocks</code>, <code>mempool-blocks</code>, <code>live-2h-chart</code>, and <code>stats</code>.<br><br>Push transactions related to address: <code>{{ '{' }} 'track-address': '3PbJ...bF9B' {{ '}' }}</code> to receive all new transactions containing that address as input or output. Returns an array of transactions. <code>address-transactions</code> for new mempool transactions, and <code>block-transactions</code> for new block confirmed transactions.</div>
 | 
			
		||||
          </div>
 | 
			
		||||
          <app-code-template [method]="'websocket'" [hostname]="hostname" [code]="wsDocs" [network]="network.val" ></app-code-template>
 | 
			
		||||
          <app-code-template [method]="'websocket'" [hostname]="hostname" [code]="wsDocs" [network]="network.val" [showCodeExample]="wsDocs.showJsExamples"></app-code-template>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
@ -7,7 +7,7 @@
 | 
			
		||||
        <pre><code [innerText]="wrapCurlTemplate(code)"></code></pre>
 | 
			
		||||
      </ng-template>
 | 
			
		||||
    </li>
 | 
			
		||||
    <li ngbNavItem *ngIf="network !== 'liquidtestnet'">
 | 
			
		||||
    <li ngbNavItem *ngIf="showCodeExample[network]">
 | 
			
		||||
      <a ngbNavLink (click)="adjustContainerHeight( $event )" >CommonJS</a>
 | 
			
		||||
      <ng-template ngbNavContent>
 | 
			
		||||
        <div class="subtitle"><ng-container i18n="API Docs code example">Code Example</ng-container> <app-clipboard [text]="wrapCommonJS(code)"></app-clipboard></div>
 | 
			
		||||
@ -17,8 +17,8 @@
 | 
			
		||||
        <pre><code [innerText]="wrapCommonJS(code)"></code></pre>
 | 
			
		||||
      </ng-template>
 | 
			
		||||
    </li>
 | 
			
		||||
    <li ngbNavItem>
 | 
			
		||||
      <a ngbNavLink (click)="adjustContainerHeight( $event )" *ngIf="network !== 'liquidtestnet'">ES Module</a>
 | 
			
		||||
    <li ngbNavItem *ngIf="showCodeExample[network]">
 | 
			
		||||
      <a ngbNavLink (click)="adjustContainerHeight( $event )">ES Module</a>
 | 
			
		||||
      <ng-template ngbNavContent>
 | 
			
		||||
        <div class="subtitle"><ng-container i18n="API Docs install lib">Install Package</ng-container> <app-clipboard [text]="wrapImportTemplate()"></app-clipboard></div>
 | 
			
		||||
        <div class="links">
 | 
			
		||||
 | 
			
		||||
@ -12,6 +12,7 @@ export class CodeTemplateComponent implements OnInit {
 | 
			
		||||
  @Input() hostname: string;
 | 
			
		||||
  @Input() baseNetworkUrl: string;
 | 
			
		||||
  @Input() method: 'GET' | 'POST' | 'websocket' = 'GET';
 | 
			
		||||
  @Input() showCodeExample: any;
 | 
			
		||||
  env: Env;
 | 
			
		||||
 | 
			
		||||
  constructor(
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										58
									
								
								frontend/src/app/graphs/graphs.module.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								frontend/src/app/graphs/graphs.module.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,58 @@
 | 
			
		||||
import { NgModule } from '@angular/core';
 | 
			
		||||
import { NgxEchartsModule } from 'ngx-echarts';
 | 
			
		||||
import { GraphsRoutingModule } from './graphs.routing.module';
 | 
			
		||||
import { SharedModule } from '../shared/shared.module';
 | 
			
		||||
 | 
			
		||||
import { BlockFeesGraphComponent } from '../components/block-fees-graph/block-fees-graph.component';
 | 
			
		||||
import { BlockRewardsGraphComponent } from '../components/block-rewards-graph/block-rewards-graph.component';
 | 
			
		||||
import { BlockFeeRatesGraphComponent } from '../components/block-fee-rates-graph/block-fee-rates-graph.component';
 | 
			
		||||
import { BlockSizesWeightsGraphComponent } from '../components/block-sizes-weights-graph/block-sizes-weights-graph.component';
 | 
			
		||||
import { FeeDistributionGraphComponent } from '../components/fee-distribution-graph/fee-distribution-graph.component';
 | 
			
		||||
import { IncomingTransactionsGraphComponent } from '../components/incoming-transactions-graph/incoming-transactions-graph.component';
 | 
			
		||||
import { MempoolGraphComponent } from '../components/mempool-graph/mempool-graph.component';
 | 
			
		||||
import { LbtcPegsGraphComponent } from '../components/lbtc-pegs-graph/lbtc-pegs-graph.component';
 | 
			
		||||
import { GraphsComponent } from '../components/graphs/graphs.component';
 | 
			
		||||
import { StatisticsComponent } from '../components/statistics/statistics.component';
 | 
			
		||||
import { MempoolBlockComponent } from '../components/mempool-block/mempool-block.component';
 | 
			
		||||
import { PoolRankingComponent } from '../components/pool-ranking/pool-ranking.component';
 | 
			
		||||
import { PoolComponent } from '../components/pool/pool.component';
 | 
			
		||||
import { TelevisionComponent } from '../components/television/television.component';
 | 
			
		||||
import { DashboardComponent } from '../dashboard/dashboard.component';
 | 
			
		||||
import { MiningDashboardComponent } from '../components/mining-dashboard/mining-dashboard.component';
 | 
			
		||||
import { HashrateChartComponent } from '../components/hashrate-chart/hashrate-chart.component';
 | 
			
		||||
import { HashrateChartPoolsComponent } from '../components/hashrates-chart-pools/hashrate-chart-pools.component';
 | 
			
		||||
import { CommonModule } from '@angular/common';
 | 
			
		||||
 | 
			
		||||
@NgModule({
 | 
			
		||||
  declarations: [
 | 
			
		||||
    DashboardComponent,
 | 
			
		||||
    MempoolBlockComponent,
 | 
			
		||||
 | 
			
		||||
    MiningDashboardComponent,
 | 
			
		||||
    PoolComponent,
 | 
			
		||||
    PoolRankingComponent,
 | 
			
		||||
    TelevisionComponent,
 | 
			
		||||
 | 
			
		||||
    StatisticsComponent,
 | 
			
		||||
    GraphsComponent,
 | 
			
		||||
    BlockFeesGraphComponent,
 | 
			
		||||
    BlockRewardsGraphComponent,
 | 
			
		||||
    BlockFeeRatesGraphComponent,
 | 
			
		||||
    BlockSizesWeightsGraphComponent,
 | 
			
		||||
    FeeDistributionGraphComponent,
 | 
			
		||||
    IncomingTransactionsGraphComponent,
 | 
			
		||||
    MempoolGraphComponent,
 | 
			
		||||
    LbtcPegsGraphComponent,
 | 
			
		||||
    HashrateChartComponent,
 | 
			
		||||
    HashrateChartPoolsComponent,
 | 
			
		||||
  ],
 | 
			
		||||
  imports: [
 | 
			
		||||
    CommonModule,
 | 
			
		||||
    SharedModule,
 | 
			
		||||
    GraphsRoutingModule,
 | 
			
		||||
    NgxEchartsModule.forRoot({
 | 
			
		||||
      echarts: () => import('echarts')
 | 
			
		||||
    })
 | 
			
		||||
  ]
 | 
			
		||||
})
 | 
			
		||||
export class GraphsModule { }
 | 
			
		||||
							
								
								
									
										116
									
								
								frontend/src/app/graphs/graphs.routing.module.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								frontend/src/app/graphs/graphs.routing.module.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,116 @@
 | 
			
		||||
import { NgModule } from '@angular/core';
 | 
			
		||||
import { RouterModule, Routes } from '@angular/router';
 | 
			
		||||
import { BlockFeeRatesGraphComponent } from '../components/block-fee-rates-graph/block-fee-rates-graph.component';
 | 
			
		||||
import { BlockFeesGraphComponent } from '../components/block-fees-graph/block-fees-graph.component';
 | 
			
		||||
import { BlockRewardsGraphComponent } from '../components/block-rewards-graph/block-rewards-graph.component';
 | 
			
		||||
import { BlockSizesWeightsGraphComponent } from '../components/block-sizes-weights-graph/block-sizes-weights-graph.component';
 | 
			
		||||
import { GraphsComponent } from '../components/graphs/graphs.component';
 | 
			
		||||
import { HashrateChartComponent } from '../components/hashrate-chart/hashrate-chart.component';
 | 
			
		||||
import { HashrateChartPoolsComponent } from '../components/hashrates-chart-pools/hashrate-chart-pools.component';
 | 
			
		||||
import { LiquidMasterPageComponent } from '../components/liquid-master-page/liquid-master-page.component';
 | 
			
		||||
import { MasterPageComponent } from '../components/master-page/master-page.component';
 | 
			
		||||
import { MempoolBlockComponent } from '../components/mempool-block/mempool-block.component';
 | 
			
		||||
import { MiningDashboardComponent } from '../components/mining-dashboard/mining-dashboard.component';
 | 
			
		||||
import { PoolRankingComponent } from '../components/pool-ranking/pool-ranking.component';
 | 
			
		||||
import { PoolComponent } from '../components/pool/pool.component';
 | 
			
		||||
import { StartComponent } from '../components/start/start.component';
 | 
			
		||||
import { StatisticsComponent } from '../components/statistics/statistics.component';
 | 
			
		||||
import { TelevisionComponent } from '../components/television/television.component';
 | 
			
		||||
import { DashboardComponent } from '../dashboard/dashboard.component';
 | 
			
		||||
 | 
			
		||||
const browserWindow = window || {};
 | 
			
		||||
// @ts-ignore
 | 
			
		||||
const browserWindowEnv = browserWindow.__env || {};
 | 
			
		||||
const isLiquid = browserWindowEnv && browserWindowEnv.BASE_MODULE === 'liquid';
 | 
			
		||||
 | 
			
		||||
const routes: Routes = [
 | 
			
		||||
  {
 | 
			
		||||
    path: '',
 | 
			
		||||
    component: isLiquid ? LiquidMasterPageComponent : MasterPageComponent,
 | 
			
		||||
    children: [
 | 
			
		||||
      {
 | 
			
		||||
        path: 'mining/pool/:slug',
 | 
			
		||||
        component: PoolComponent,
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'mining',
 | 
			
		||||
        component: StartComponent,
 | 
			
		||||
        children: [
 | 
			
		||||
          {
 | 
			
		||||
            path: '',
 | 
			
		||||
            component: MiningDashboardComponent,
 | 
			
		||||
          },
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'mempool-block/:id',
 | 
			
		||||
        component: StartComponent,
 | 
			
		||||
        children: [
 | 
			
		||||
          {
 | 
			
		||||
            path: '',
 | 
			
		||||
            component: MempoolBlockComponent,
 | 
			
		||||
          },
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: 'graphs',
 | 
			
		||||
        component: GraphsComponent,
 | 
			
		||||
        children: [
 | 
			
		||||
          {
 | 
			
		||||
            path: 'mempool',
 | 
			
		||||
            component: StatisticsComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'mining/hashrate-difficulty',
 | 
			
		||||
            component: HashrateChartComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'mining/pools-dominance',
 | 
			
		||||
            component: HashrateChartPoolsComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'mining/pools',
 | 
			
		||||
            component: PoolRankingComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'mining/block-fees',
 | 
			
		||||
            component: BlockFeesGraphComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'mining/block-rewards',
 | 
			
		||||
            component: BlockRewardsGraphComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'mining/block-fee-rates',
 | 
			
		||||
            component: BlockFeeRatesGraphComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: 'mining/block-sizes-weights',
 | 
			
		||||
            component: BlockSizesWeightsGraphComponent,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            path: '',
 | 
			
		||||
            redirectTo: 'mempool',
 | 
			
		||||
          },
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        path: '',
 | 
			
		||||
        component: StartComponent,
 | 
			
		||||
        children: [{
 | 
			
		||||
          path: '',
 | 
			
		||||
          component: DashboardComponent,
 | 
			
		||||
        }]
 | 
			
		||||
      },
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    path: 'tv',
 | 
			
		||||
    component: TelevisionComponent
 | 
			
		||||
  },
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
@NgModule({
 | 
			
		||||
  imports: [RouterModule.forChild(routes)],
 | 
			
		||||
})
 | 
			
		||||
export class GraphsRoutingModule { }
 | 
			
		||||
@ -54,6 +54,8 @@ export interface Vin {
 | 
			
		||||
  // Elements
 | 
			
		||||
  is_pegin?: boolean;
 | 
			
		||||
  issuance?: Issuance;
 | 
			
		||||
  // Custom
 | 
			
		||||
  lazy?: boolean;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface Issuance {
 | 
			
		||||
 | 
			
		||||
@ -78,23 +78,23 @@ export class ApiService {
 | 
			
		||||
      amount: amount,
 | 
			
		||||
      orderId: orderId,
 | 
			
		||||
    };
 | 
			
		||||
    return this.httpClient.post<any>(this.apiBaseUrl + this.apiBasePath + '/api/v1/donations', params);
 | 
			
		||||
    return this.httpClient.post<any>(this.apiBaseUrl + '/api/v1/donations', params);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getDonation$(): Observable<any[]> {
 | 
			
		||||
    return this.httpClient.get<any[]>(this.apiBaseUrl + this.apiBasePath + '/api/v1/donations');
 | 
			
		||||
    return this.httpClient.get<any[]>(this.apiBaseUrl + '/api/v1/donations');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getTranslators$(): Observable<ITranslators> {
 | 
			
		||||
    return this.httpClient.get<ITranslators>(this.apiBaseUrl + this.apiBasePath + '/api/v1/translators');
 | 
			
		||||
    return this.httpClient.get<ITranslators>(this.apiBaseUrl + '/api/v1/translators');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getContributor$(): Observable<any[]> {
 | 
			
		||||
    return this.httpClient.get<any[]>(this.apiBaseUrl + this.apiBasePath + '/api/v1/contributors');
 | 
			
		||||
    return this.httpClient.get<any[]>(this.apiBaseUrl + '/api/v1/contributors');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  checkDonation$(orderId: string): Observable<any[]> {
 | 
			
		||||
    return this.httpClient.get<any[]>(this.apiBaseUrl + this.apiBasePath + '/api/v1/donations/check?order_id=' + orderId);
 | 
			
		||||
    return this.httpClient.get<any[]>(this.apiBaseUrl + '/api/v1/donations/check?order_id=' + orderId);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getInitData$(): Observable<WebsocketResponse> {
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,16 @@
 | 
			
		||||
import { NgModule } from '@angular/core';
 | 
			
		||||
import { CommonModule } from '@angular/common';
 | 
			
		||||
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
 | 
			
		||||
import { NgbTypeaheadModule } from '@ng-bootstrap/ng-bootstrap';
 | 
			
		||||
import { FontAwesomeModule, FaIconLibrary } from '@fortawesome/angular-fontawesome';
 | 
			
		||||
import { faFilter, faAngleDown, faAngleUp, faAngleRight, faAngleLeft, faBolt, faChartArea, faCogs, faCubes, faHammer, faDatabase, faExchangeAlt, faInfoCircle,
 | 
			
		||||
  faLink, faList, faSearch, faCaretUp, faCaretDown, faTachometerAlt, faThList, faTint, faTv, faAngleDoubleDown, faSortUp, faAngleDoubleUp, faChevronDown,
 | 
			
		||||
  faFileAlt, faRedoAlt, faArrowAltCircleRight, faExternalLinkAlt, faBook, faListUl, faDownload } from '@fortawesome/free-solid-svg-icons';
 | 
			
		||||
import { InfiniteScrollModule } from 'ngx-infinite-scroll';
 | 
			
		||||
import { MasterPageComponent } from '../components/master-page/master-page.component';
 | 
			
		||||
import { BisqMasterPageComponent } from '../components/bisq-master-page/bisq-master-page.component';
 | 
			
		||||
import { LiquidMasterPageComponent } from '../components/liquid-master-page/liquid-master-page.component';
 | 
			
		||||
import { AboutComponent } from '../components/about/about.component';
 | 
			
		||||
import { VbytesPipe } from './pipes/bytes-pipe/vbytes.pipe';
 | 
			
		||||
import { ShortenStringPipe } from './pipes/shorten-string-pipe/shorten-string.pipe';
 | 
			
		||||
import { CeilPipe } from './pipes/math-ceil/math-ceil.pipe';
 | 
			
		||||
@ -31,6 +42,38 @@ import { AmountComponent } from '../components/amount/amount.component';
 | 
			
		||||
import { RouterModule } from '@angular/router';
 | 
			
		||||
import { CapAddressPipe } from './pipes/cap-address-pipe/cap-address-pipe';
 | 
			
		||||
 | 
			
		||||
import { StartComponent } from '../components/start/start.component';
 | 
			
		||||
import { TransactionComponent } from '../components/transaction/transaction.component';
 | 
			
		||||
import { TransactionsListComponent } from '../components/transactions-list/transactions-list.component';
 | 
			
		||||
import { BlockComponent } from '../components/block/block.component';
 | 
			
		||||
import { AddressComponent } from '../components/address/address.component';
 | 
			
		||||
import { SearchFormComponent } from '../components/search-form/search-form.component';
 | 
			
		||||
import { LatestBlocksComponent } from '../components/latest-blocks/latest-blocks.component';
 | 
			
		||||
import { AddressLabelsComponent } from '../components/address-labels/address-labels.component';
 | 
			
		||||
import { FooterComponent } from '../components/footer/footer.component';
 | 
			
		||||
import { TimeSpanComponent } from '../components/time-span/time-span.component';
 | 
			
		||||
import { AssetComponent } from '../components/asset/asset.component';
 | 
			
		||||
import { AssetsComponent } from '../components/assets/assets.component';
 | 
			
		||||
import { AssetsNavComponent } from '../components/assets/assets-nav/assets-nav.component';
 | 
			
		||||
import { StatusViewComponent } from '../components/status-view/status-view.component';
 | 
			
		||||
import { FeesBoxComponent } from '../components/fees-box/fees-box.component';
 | 
			
		||||
import { DifficultyComponent } from '../components/difficulty/difficulty.component';
 | 
			
		||||
import { TermsOfServiceComponent } from '../components/terms-of-service/terms-of-service.component';
 | 
			
		||||
import { PrivacyPolicyComponent } from '../components/privacy-policy/privacy-policy.component';
 | 
			
		||||
import { TrademarkPolicyComponent } from '../components/trademark-policy/trademark-policy.component';
 | 
			
		||||
import { SponsorComponent } from '../components/sponsor/sponsor.component';
 | 
			
		||||
import { PushTransactionComponent } from '../components/push-transaction/push-transaction.component';
 | 
			
		||||
import { AssetsFeaturedComponent } from '../components/assets/assets-featured/assets-featured.component';
 | 
			
		||||
import { AssetGroupComponent } from '../components/assets/asset-group/asset-group.component';
 | 
			
		||||
import { AssetCirculationComponent } from '../components/asset-circulation/asset-circulation.component';
 | 
			
		||||
import { AmountShortenerPipe } from '../shared/pipes/amount-shortener.pipe';
 | 
			
		||||
import { DifficultyAdjustmentsTable } from '../components/difficulty-adjustments-table/difficulty-adjustments-table.components';
 | 
			
		||||
import { BlocksList } from '../components/blocks-list/blocks-list.component';
 | 
			
		||||
import { RewardStatsComponent } from '../components/reward-stats/reward-stats.component';
 | 
			
		||||
import { DataCyDirective } from '../data-cy.directive';
 | 
			
		||||
import { LoadingIndicatorComponent } from '../components/loading-indicator/loading-indicator.component';
 | 
			
		||||
import { IndexingProgressComponent } from '../components/indexing-progress/indexing-progress.component';
 | 
			
		||||
 | 
			
		||||
@NgModule({
 | 
			
		||||
  declarations: [
 | 
			
		||||
    ClipboardComponent,
 | 
			
		||||
@ -60,6 +103,42 @@ import { CapAddressPipe } from './pipes/cap-address-pipe/cap-address-pipe';
 | 
			
		||||
    MempoolBlocksComponent,
 | 
			
		||||
    BlockchainBlocksComponent,
 | 
			
		||||
    AmountComponent,
 | 
			
		||||
 | 
			
		||||
    AboutComponent,
 | 
			
		||||
    MasterPageComponent,
 | 
			
		||||
    BisqMasterPageComponent,
 | 
			
		||||
    LiquidMasterPageComponent,
 | 
			
		||||
    StartComponent,
 | 
			
		||||
    TransactionComponent,
 | 
			
		||||
    BlockComponent,
 | 
			
		||||
    TransactionsListComponent,
 | 
			
		||||
    AddressComponent,
 | 
			
		||||
    LatestBlocksComponent,
 | 
			
		||||
    SearchFormComponent,
 | 
			
		||||
    TimeSpanComponent,
 | 
			
		||||
    AddressLabelsComponent,
 | 
			
		||||
    FooterComponent,
 | 
			
		||||
    AssetComponent,
 | 
			
		||||
    AssetsComponent,
 | 
			
		||||
    StatusViewComponent,
 | 
			
		||||
    FeesBoxComponent,
 | 
			
		||||
    DifficultyComponent,
 | 
			
		||||
    TermsOfServiceComponent,
 | 
			
		||||
    PrivacyPolicyComponent,
 | 
			
		||||
    TrademarkPolicyComponent,
 | 
			
		||||
    SponsorComponent,
 | 
			
		||||
    PushTransactionComponent,
 | 
			
		||||
    AssetsNavComponent,
 | 
			
		||||
    AssetsFeaturedComponent,
 | 
			
		||||
    AssetGroupComponent,
 | 
			
		||||
    AssetCirculationComponent,
 | 
			
		||||
    AmountShortenerPipe,
 | 
			
		||||
    DifficultyAdjustmentsTable,
 | 
			
		||||
    BlocksList,
 | 
			
		||||
    DataCyDirective,
 | 
			
		||||
    RewardStatsComponent,
 | 
			
		||||
    LoadingIndicatorComponent,
 | 
			
		||||
    IndexingProgressComponent,
 | 
			
		||||
  ],
 | 
			
		||||
  imports: [
 | 
			
		||||
    CommonModule,
 | 
			
		||||
@ -71,17 +150,26 @@ import { CapAddressPipe } from './pipes/cap-address-pipe/cap-address-pipe';
 | 
			
		||||
    NgbPaginationModule,
 | 
			
		||||
    NgbDropdownModule,
 | 
			
		||||
    NgbAccordionModule,
 | 
			
		||||
    InfiniteScrollModule,
 | 
			
		||||
    NgbTypeaheadModule,
 | 
			
		||||
    NgbModule,
 | 
			
		||||
    FontAwesomeModule,
 | 
			
		||||
  ],
 | 
			
		||||
  providers: [
 | 
			
		||||
    VbytesPipe,
 | 
			
		||||
    RelativeUrlPipe,
 | 
			
		||||
    NoSanitizePipe,
 | 
			
		||||
    ShortenStringPipe,
 | 
			
		||||
    CapAddressPipe,
 | 
			
		||||
  ],
 | 
			
		||||
  exports: [
 | 
			
		||||
    RouterModule,
 | 
			
		||||
    InfiniteScrollModule,
 | 
			
		||||
    NgbTypeaheadModule,
 | 
			
		||||
    NgbModule,
 | 
			
		||||
    FontAwesomeModule,
 | 
			
		||||
    NgbAccordionModule,
 | 
			
		||||
    NgbNavModule,
 | 
			
		||||
    CommonModule,
 | 
			
		||||
    ReactiveFormsModule,
 | 
			
		||||
    NgbTooltipModule,
 | 
			
		||||
    NgbButtonsModule,
 | 
			
		||||
@ -114,6 +202,75 @@ import { CapAddressPipe } from './pipes/cap-address-pipe/cap-address-pipe';
 | 
			
		||||
    MempoolBlocksComponent,
 | 
			
		||||
    BlockchainBlocksComponent,
 | 
			
		||||
    AmountComponent,
 | 
			
		||||
 | 
			
		||||
    StartComponent,
 | 
			
		||||
    TransactionComponent,
 | 
			
		||||
    BlockComponent,
 | 
			
		||||
    TransactionsListComponent,
 | 
			
		||||
    AddressComponent,
 | 
			
		||||
    LatestBlocksComponent,
 | 
			
		||||
    SearchFormComponent,
 | 
			
		||||
    TimeSpanComponent,
 | 
			
		||||
    AddressLabelsComponent,
 | 
			
		||||
    FooterComponent,
 | 
			
		||||
    AssetComponent,
 | 
			
		||||
    AssetsComponent,
 | 
			
		||||
    StatusViewComponent,
 | 
			
		||||
    FeesBoxComponent,
 | 
			
		||||
    DifficultyComponent,
 | 
			
		||||
    TermsOfServiceComponent,
 | 
			
		||||
    PrivacyPolicyComponent,
 | 
			
		||||
    TrademarkPolicyComponent,
 | 
			
		||||
    SponsorComponent,
 | 
			
		||||
    PushTransactionComponent,
 | 
			
		||||
    AssetsNavComponent,
 | 
			
		||||
    AssetsFeaturedComponent,
 | 
			
		||||
    AssetGroupComponent,
 | 
			
		||||
    AssetCirculationComponent,
 | 
			
		||||
    AmountShortenerPipe,
 | 
			
		||||
    DifficultyAdjustmentsTable,
 | 
			
		||||
    BlocksList,
 | 
			
		||||
    DataCyDirective,
 | 
			
		||||
    RewardStatsComponent,
 | 
			
		||||
    LoadingIndicatorComponent,
 | 
			
		||||
    IndexingProgressComponent,
 | 
			
		||||
  ]
 | 
			
		||||
})
 | 
			
		||||
export class SharedModule {}
 | 
			
		||||
export class SharedModule {
 | 
			
		||||
  constructor(library: FaIconLibrary) {
 | 
			
		||||
    library.addIcons(faInfoCircle);
 | 
			
		||||
    library.addIcons(faChartArea);
 | 
			
		||||
    library.addIcons(faTv);
 | 
			
		||||
    library.addIcons(faTachometerAlt);
 | 
			
		||||
    library.addIcons(faCubes);
 | 
			
		||||
    library.addIcons(faHammer);
 | 
			
		||||
    library.addIcons(faCogs);
 | 
			
		||||
    library.addIcons(faThList);
 | 
			
		||||
    library.addIcons(faList);
 | 
			
		||||
    library.addIcons(faTachometerAlt);
 | 
			
		||||
    library.addIcons(faDatabase);
 | 
			
		||||
    library.addIcons(faSearch);
 | 
			
		||||
    library.addIcons(faLink);
 | 
			
		||||
    library.addIcons(faBolt);
 | 
			
		||||
    library.addIcons(faTint);
 | 
			
		||||
    library.addIcons(faFilter);
 | 
			
		||||
    library.addIcons(faAngleDown);
 | 
			
		||||
    library.addIcons(faAngleUp);
 | 
			
		||||
    library.addIcons(faExchangeAlt);
 | 
			
		||||
    library.addIcons(faAngleDoubleUp);
 | 
			
		||||
    library.addIcons(faAngleDoubleDown);
 | 
			
		||||
    library.addIcons(faChevronDown);
 | 
			
		||||
    library.addIcons(faFileAlt);
 | 
			
		||||
    library.addIcons(faRedoAlt);
 | 
			
		||||
    library.addIcons(faArrowAltCircleRight);
 | 
			
		||||
    library.addIcons(faExternalLinkAlt);
 | 
			
		||||
    library.addIcons(faSortUp);
 | 
			
		||||
    library.addIcons(faCaretUp);
 | 
			
		||||
    library.addIcons(faCaretDown);
 | 
			
		||||
    library.addIcons(faAngleRight);
 | 
			
		||||
    library.addIcons(faAngleLeft);
 | 
			
		||||
    library.addIcons(faBook);
 | 
			
		||||
    library.addIcons(faListUl);
 | 
			
		||||
    library.addIcons(faDownload);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -251,7 +251,7 @@
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/address/address.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">3,5</context>
 | 
			
		||||
          <context context-type="linenumber">3</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">shared.address</note>
 | 
			
		||||
      </trans-unit>
 | 
			
		||||
@ -263,7 +263,7 @@
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/address/address.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">31,32</context>
 | 
			
		||||
          <context context-type="linenumber">31</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">address.total-received</note>
 | 
			
		||||
      </trans-unit>
 | 
			
		||||
@ -279,7 +279,7 @@
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/address/address.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">35,36</context>
 | 
			
		||||
          <context context-type="linenumber">35</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">address.total-sent</note>
 | 
			
		||||
      </trans-unit>
 | 
			
		||||
@ -291,7 +291,7 @@
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/address/address.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">40,41</context>
 | 
			
		||||
          <context context-type="linenumber">40</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">address.balance</note>
 | 
			
		||||
      </trans-unit>
 | 
			
		||||
@ -956,7 +956,7 @@
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">239,241</context>
 | 
			
		||||
          <context context-type="linenumber">245,247</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
      </trans-unit>
 | 
			
		||||
      <trans-unit id="8fe73a4787b8068b2ba61f54ab7e0f9af2ea1fc9" datatype="html">
 | 
			
		||||
@ -1008,7 +1008,7 @@
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">266,267</context>
 | 
			
		||||
          <context context-type="linenumber">272,273</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">Transaction singular confirmation count</note>
 | 
			
		||||
        <note priority="1" from="meaning">shared.confirmation-count.singular</note>
 | 
			
		||||
@ -1036,7 +1036,7 @@
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">267,268</context>
 | 
			
		||||
          <context context-type="linenumber">273,274</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">Transaction plural confirmation count</note>
 | 
			
		||||
        <note priority="1" from="meaning">shared.confirmation-count.plural</note>
 | 
			
		||||
@ -1434,24 +1434,23 @@
 | 
			
		||||
        <source>Unconfidential</source>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/address/address.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">23,24</context>
 | 
			
		||||
          <context context-type="linenumber">23</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">address.unconfidential</note>
 | 
			
		||||
      </trans-unit>
 | 
			
		||||
      <trans-unit id="714e34125b3343df73f19ec800b43be95217d5d4" datatype="html">
 | 
			
		||||
        <source><x id="INTERPOLATION" equiv-text="of {{ txCount | number }} transaction</ng-template>"/> of <x id="INTERPOLATION_1" equiv-text="{{ txCount | number }}"/> transaction</source>
 | 
			
		||||
        <source><x id="INTERPOLATION" equiv-text="{{ (transactions?.length | number) || '?' }}"/> of <x id="INTERPOLATION_1" equiv-text="{{ txCount | number }}"/> transaction</source>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/address/address.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">60,61</context>
 | 
			
		||||
          <context context-type="linenumber">60</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">X of X Address Transaction</note>
 | 
			
		||||
      </trans-unit>
 | 
			
		||||
      <trans-unit id="0f6ada0cfb60aefd8f77f8a22349850ce186d666" datatype="html">
 | 
			
		||||
        <source><x id="INTERPOLATION" equiv-text="of {{ txCount | number }} transactions</ng-template>
 | 
			
		||||
      </h2>"/> of <x id="INTERPOLATION_1" equiv-text="{{ txCount | number }}"/> transactions</source>
 | 
			
		||||
        <source><x id="INTERPOLATION" equiv-text="{{ (transactions?.length | number) || '?' }}"/> of <x id="INTERPOLATION_1" equiv-text="{{ txCount | number }}"/> transactions</source>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/address/address.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">61,62</context>
 | 
			
		||||
          <context context-type="linenumber">61</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">X of X Address Transactions (Plural)</note>
 | 
			
		||||
      </trans-unit>
 | 
			
		||||
@ -1459,15 +1458,15 @@
 | 
			
		||||
        <source>Error loading address data.</source>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/address/address.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">132,134</context>
 | 
			
		||||
          <context context-type="linenumber">130</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">address.error.loading-address-data</note>
 | 
			
		||||
      </trans-unit>
 | 
			
		||||
      <trans-unit id="49cef95661d86f4341788ce40068d58801adc6e6" datatype="html">
 | 
			
		||||
        <source><x id="START_ITALIC_TEXT" ctype="x-i" equiv-text="There many transactions on this address, more than your backend can handle. See more on <a href="/docs/faq#a"/>There many transactions on this address, more than your backend can handle. See more on <x id="START_LINK" ctype="x-a" equiv-text="<a href="/docs/faq#address-lookup-issues">"/>setting up a stronger backend<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>.<x id="CLOSE_ITALIC_TEXT" ctype="x-i" equiv-text="</i>"/><x id="LINE_BREAK" ctype="lb"/><x id="LINE_BREAK" ctype="lb"/> Consider viewing this address on the official Mempool website instead: </source>
 | 
			
		||||
        <source><x id="START_ITALIC_TEXT" ctype="x-i" equiv-text="<i>"/>There many transactions on this address, more than your backend can handle. See more on <x id="START_LINK" ctype="x-a" equiv-text="<a href="/docs/faq#address-lookup-issues">"/>setting up a stronger backend<x id="CLOSE_LINK" ctype="x-a" equiv-text="</a>"/>.<x id="CLOSE_ITALIC_TEXT" ctype="x-i" equiv-text="</i>"/><x id="LINE_BREAK" ctype="lb" equiv-text="<br>"/><x id="LINE_BREAK" ctype="lb" equiv-text="<br>"/> Consider viewing this address on the official Mempool website instead: </source>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/address/address.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">137,140</context>
 | 
			
		||||
          <context context-type="linenumber">135,138</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">Electrum server limit exceeded error</note>
 | 
			
		||||
      </trans-unit>
 | 
			
		||||
@ -1475,7 +1474,7 @@
 | 
			
		||||
        <source>Confidential</source>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/address/address.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">156,158</context>
 | 
			
		||||
          <context context-type="linenumber">154</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/amount/amount.component.html</context>
 | 
			
		||||
@ -1491,7 +1490,7 @@
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">274,276</context>
 | 
			
		||||
          <context context-type="linenumber">280,282</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context>
 | 
			
		||||
@ -2110,7 +2109,7 @@
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">259</context>
 | 
			
		||||
          <context context-type="linenumber">265</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/dashboard/dashboard.component.html</context>
 | 
			
		||||
@ -2262,7 +2261,7 @@
 | 
			
		||||
        <source>Error loading block data.</source>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/block/block.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">278,288</context>
 | 
			
		||||
          <context context-type="linenumber">274,280</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">block.error.loading-block-data</note>
 | 
			
		||||
      </trans-unit>
 | 
			
		||||
@ -2891,11 +2890,11 @@
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">141,144</context>
 | 
			
		||||
          <context context-type="linenumber">144,147</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">249,251</context>
 | 
			
		||||
          <context context-type="linenumber">255,257</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">show-all</note>
 | 
			
		||||
      </trans-unit>
 | 
			
		||||
@ -3098,10 +3097,6 @@
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/reward-stats/reward-stats.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">16,18</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/reward-stats/reward-stats.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">29,31</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/reward-stats/reward-stats.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">53,56</context>
 | 
			
		||||
@ -3133,6 +3128,14 @@
 | 
			
		||||
        <note priority="1" from="description">sat/vB</note>
 | 
			
		||||
        <note priority="1" from="meaning">shared.sat-vbyte</note>
 | 
			
		||||
      </trans-unit>
 | 
			
		||||
      <trans-unit id="f9bc2ce34cf7fc23c09b4cea1d92cc75ef4d6e71" datatype="html">
 | 
			
		||||
        <source>Average Fee</source>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/reward-stats/reward-stats.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">29,31</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">mining.average-fee</note>
 | 
			
		||||
      </trans-unit>
 | 
			
		||||
      <trans-unit id="8be96dc461529381c812f64962c62f4228d01470" datatype="html">
 | 
			
		||||
        <source>Fee paid on average for each transaction in the past 144 blocks</source>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
@ -3442,7 +3445,7 @@
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">270,273</context>
 | 
			
		||||
          <context context-type="linenumber">276,279</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">Transaction unconfirmed state</note>
 | 
			
		||||
        <note priority="1" from="meaning">transaction.unconfirmed</note>
 | 
			
		||||
@ -3559,7 +3562,7 @@
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">259,260</context>
 | 
			
		||||
          <context context-type="linenumber">265,266</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">sat</note>
 | 
			
		||||
        <note priority="1" from="meaning">shared.sat</note>
 | 
			
		||||
@ -3601,7 +3604,7 @@
 | 
			
		||||
        <source>ScriptSig (ASM)</source>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">97,99</context>
 | 
			
		||||
          <context context-type="linenumber">100,102</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">ScriptSig (ASM)</note>
 | 
			
		||||
        <note priority="1" from="meaning">transactions-list.scriptsig.asm</note>
 | 
			
		||||
@ -3610,7 +3613,7 @@
 | 
			
		||||
        <source>ScriptSig (HEX)</source>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">101,104</context>
 | 
			
		||||
          <context context-type="linenumber">104,107</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">ScriptSig (HEX)</note>
 | 
			
		||||
        <note priority="1" from="meaning">transactions-list.scriptsig.hex</note>
 | 
			
		||||
@ -3619,7 +3622,7 @@
 | 
			
		||||
        <source>Witness</source>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">106,108</context>
 | 
			
		||||
          <context context-type="linenumber">109,111</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">transactions-list.witness</note>
 | 
			
		||||
      </trans-unit>
 | 
			
		||||
@ -3627,7 +3630,7 @@
 | 
			
		||||
        <source>P2SH redeem script</source>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">110,111</context>
 | 
			
		||||
          <context context-type="linenumber">113,114</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">transactions-list.p2sh-redeem-script</note>
 | 
			
		||||
      </trans-unit>
 | 
			
		||||
@ -3635,7 +3638,7 @@
 | 
			
		||||
        <source>P2TR tapscript</source>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">114,116</context>
 | 
			
		||||
          <context context-type="linenumber">117,119</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">transactions-list.p2tr-tapscript</note>
 | 
			
		||||
      </trans-unit>
 | 
			
		||||
@ -3643,7 +3646,7 @@
 | 
			
		||||
        <source>P2WSH witness script</source>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">116,118</context>
 | 
			
		||||
          <context context-type="linenumber">119,121</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">transactions-list.p2wsh-witness-script</note>
 | 
			
		||||
      </trans-unit>
 | 
			
		||||
@ -3651,7 +3654,7 @@
 | 
			
		||||
        <source>nSequence</source>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">121,123</context>
 | 
			
		||||
          <context context-type="linenumber">124,126</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">transactions-list.nsequence</note>
 | 
			
		||||
      </trans-unit>
 | 
			
		||||
@ -3659,7 +3662,7 @@
 | 
			
		||||
        <source>Previous output script</source>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">126,127</context>
 | 
			
		||||
          <context context-type="linenumber">129,130</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">transactions-list.previous-output-script</note>
 | 
			
		||||
      </trans-unit>
 | 
			
		||||
@ -3667,7 +3670,7 @@
 | 
			
		||||
        <source>Previous output type</source>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">130,131</context>
 | 
			
		||||
          <context context-type="linenumber">133,134</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">transactions-list.previous-output-type</note>
 | 
			
		||||
      </trans-unit>
 | 
			
		||||
@ -3675,7 +3678,7 @@
 | 
			
		||||
        <source>Peg-out to <x id="START_TAG_NG_CONTAINER" ctype="x-ng_container" equiv-text="<ng-container *ngTemplateOutlet="pegOutLink">"/><x id="CLOSE_TAG_NG_CONTAINER" ctype="x-ng_container" equiv-text="</ng-contain"/></source>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">166,167</context>
 | 
			
		||||
          <context context-type="linenumber">172,173</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">transactions-list.peg-out-to</note>
 | 
			
		||||
      </trans-unit>
 | 
			
		||||
@ -3683,7 +3686,7 @@
 | 
			
		||||
        <source>ScriptPubKey (ASM)</source>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">227,229</context>
 | 
			
		||||
          <context context-type="linenumber">233,235</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">ScriptPubKey (ASM)</note>
 | 
			
		||||
        <note priority="1" from="meaning">transactions-list.scriptpubkey.asm</note>
 | 
			
		||||
@ -3692,7 +3695,7 @@
 | 
			
		||||
        <source>ScriptPubKey (HEX)</source>
 | 
			
		||||
        <context-group purpose="location">
 | 
			
		||||
          <context context-type="sourcefile">src/app/components/transactions-list/transactions-list.component.html</context>
 | 
			
		||||
          <context context-type="linenumber">231,234</context>
 | 
			
		||||
          <context context-type="linenumber">237,240</context>
 | 
			
		||||
        </context-group>
 | 
			
		||||
        <note priority="1" from="description">ScriptPubKey (HEX)</note>
 | 
			
		||||
        <note priority="1" from="meaning">transactions-list.scriptpubkey.hex</note>
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -655,6 +655,10 @@ h1, h2, h3 {
 | 
			
		||||
  background-color: #24273e;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.progress-light {
 | 
			
		||||
  background-color: #2e324e;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.mt-2-5, .my-2-5 {
 | 
			
		||||
  margin-top: 0.75rem !important;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -330,7 +330,7 @@ DEBIAN_PKG+=(nodejs npm mariadb-server nginx-core python-certbot-nginx rsync ufw
 | 
			
		||||
# packages needed for mempool ecosystem
 | 
			
		||||
FREEBSD_PKG=()
 | 
			
		||||
FREEBSD_PKG+=(zsh sudo git screen curl wget calc neovim)
 | 
			
		||||
FREEBSD_PKG+=(openssh-portable py38-pip rust llvm90 jq)
 | 
			
		||||
FREEBSD_PKG+=(openssh-portable py38-pip rust llvm90 jq base64)
 | 
			
		||||
FREEBSD_PKG+=(boost-libs autoconf automake gmake gcc libevent libtool pkgconf)
 | 
			
		||||
FREEBSD_PKG+=(nginx rsync py38-certbot-nginx mariadb105-server keybase)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user