| 
									
										
										
										
											2022-10-03 22:07:59 +00:00
										 |  |  | import { Inject, Injectable, PLATFORM_ID, LOCALE_ID } from '@angular/core'; | 
					
						
							| 
									
										
										
										
											2024-05-04 00:18:33 +00:00
										 |  |  | import { ReplaySubject, BehaviorSubject, Subject, fromEvent, Observable } from 'rxjs'; | 
					
						
							| 
									
										
										
										
											2022-12-27 05:36:58 -06:00
										 |  |  | import { Transaction } from '../interfaces/electrs.interface'; | 
					
						
							| 
									
										
										
										
											2024-05-04 00:18:33 +00:00
										 |  |  | import { AccelerationDelta, HealthCheckHost, IBackendInfo, MempoolBlock, MempoolBlockUpdate, MempoolInfo, Recommendedfees, ReplacedTransaction, ReplacementInfo, isMempoolState } from '../interfaces/websocket.interface'; | 
					
						
							| 
									
										
										
										
											2024-05-30 16:37:50 +00:00
										 |  |  | import { Acceleration, AccelerationPosition, BlockExtended, CpfpInfo, DifficultyAdjustment, MempoolPosition, OptimizedMempoolStats, RbfTree, TransactionStripped } from '../interfaces/node-api.interface'; | 
					
						
							| 
									
										
										
										
											2020-05-09 20:37:50 +07:00
										 |  |  | import { Router, NavigationStart } from '@angular/router'; | 
					
						
							| 
									
										
										
										
											2020-11-07 04:30:52 +07:00
										 |  |  | import { isPlatformBrowser } from '@angular/common'; | 
					
						
							| 
									
										
										
										
											2023-07-11 16:35:00 +09:00
										 |  |  | import { filter, map, scan, shareReplay } from 'rxjs/operators'; | 
					
						
							| 
									
										
										
										
											2022-09-29 22:37:49 +00:00
										 |  |  | import { StorageService } from './storage.service'; | 
					
						
							| 
									
										
										
										
											2023-07-24 11:35:46 +09:00
										 |  |  | import { hasTouchScreen } from '../shared/pipes/bytes-pipe/utils'; | 
					
						
							| 
									
										
										
										
											2024-02-08 17:44:32 +00:00
										 |  |  | import { ActiveFilter } from '../shared/filters.utils'; | 
					
						
							| 
									
										
										
										
											2020-02-16 22:15:07 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-19 15:19:34 -04:00
										 |  |  | export interface MarkBlockState { | 
					
						
							| 
									
										
										
										
											2020-03-22 17:44:36 +07:00
										 |  |  |   blockHeight?: number; | 
					
						
							| 
									
										
										
										
											2023-06-19 15:19:34 -04:00
										 |  |  |   txid?: string; | 
					
						
							| 
									
										
										
										
											2020-03-22 17:44:36 +07:00
										 |  |  |   mempoolBlockIndex?: number; | 
					
						
							|  |  |  |   txFeePerVSize?: number; | 
					
						
							| 
									
										
										
										
											2023-04-21 08:40:21 +09:00
										 |  |  |   mempoolPosition?: MempoolPosition; | 
					
						
							| 
									
										
										
										
											2024-05-30 16:37:50 +00:00
										 |  |  |   accelerationPositions?: AccelerationPosition[]; | 
					
						
							| 
									
										
										
										
											2020-03-22 17:44:36 +07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-05 18:57:06 +07:00
										 |  |  | export interface ILoadingIndicators { [name: string]: number; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-25 20:18:37 +00:00
										 |  |  | export interface Customization { | 
					
						
							|  |  |  |   theme: string; | 
					
						
							|  |  |  |   enterprise?: string; | 
					
						
							| 
									
										
										
										
											2024-04-25 20:39:57 +00:00
										 |  |  |   branding: { | 
					
						
							|  |  |  |     name: string; | 
					
						
							|  |  |  |     site_id?: number; | 
					
						
							|  |  |  |     title: string; | 
					
						
							| 
									
										
										
										
											2024-05-07 22:42:06 +00:00
										 |  |  |     img?: string; | 
					
						
							|  |  |  |     header_img?: string; | 
					
						
							|  |  |  |     footer_img?: string; | 
					
						
							| 
									
										
										
										
											2024-04-25 20:39:57 +00:00
										 |  |  |     rounded_corner: boolean; | 
					
						
							|  |  |  |   }, | 
					
						
							| 
									
										
										
										
											2024-04-25 20:18:37 +00:00
										 |  |  |   dashboard: { | 
					
						
							|  |  |  |     widgets: { | 
					
						
							|  |  |  |       component: string; | 
					
						
							| 
									
										
										
										
											2024-05-01 23:40:39 +00:00
										 |  |  |       mobileOrder?: number; | 
					
						
							| 
									
										
										
										
											2024-04-25 20:18:37 +00:00
										 |  |  |       props: { [key: string]: any }; | 
					
						
							|  |  |  |     }[]; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-23 02:30:46 +07:00
										 |  |  | export interface Env { | 
					
						
							| 
									
										
										
										
											2024-06-15 00:22:33 +02:00
										 |  |  |   MAINNET_ENABLED: boolean; | 
					
						
							| 
									
										
										
										
											2020-11-23 02:30:46 +07:00
										 |  |  |   TESTNET_ENABLED: boolean; | 
					
						
							| 
									
										
										
										
											2024-05-06 15:40:32 +00:00
										 |  |  |   TESTNET4_ENABLED: boolean; | 
					
						
							| 
									
										
										
										
											2021-02-20 23:12:22 +07:00
										 |  |  |   SIGNET_ENABLED: boolean; | 
					
						
							| 
									
										
										
										
											2020-11-23 02:30:46 +07:00
										 |  |  |   LIQUID_ENABLED: boolean; | 
					
						
							| 
									
										
										
										
											2021-12-27 22:54:45 +04:00
										 |  |  |   LIQUID_TESTNET_ENABLED: boolean; | 
					
						
							| 
									
										
										
										
											2021-01-11 21:11:09 +07:00
										 |  |  |   ITEMS_PER_PAGE: number; | 
					
						
							| 
									
										
										
										
											2020-11-23 02:30:46 +07:00
										 |  |  |   KEEP_BLOCKS_AMOUNT: number; | 
					
						
							| 
									
										
										
										
											2021-02-18 13:34:05 +07:00
										 |  |  |   OFFICIAL_MEMPOOL_SPACE: boolean; | 
					
						
							| 
									
										
										
										
											2021-07-27 17:10:38 +03:00
										 |  |  |   BASE_MODULE: string; | 
					
						
							| 
									
										
										
										
											2024-06-16 10:50:31 +02:00
										 |  |  |   ROOT_NETWORK: string; | 
					
						
							| 
									
										
										
										
											2020-11-27 23:01:47 +09:00
										 |  |  |   NGINX_PROTOCOL?: string; | 
					
						
							|  |  |  |   NGINX_HOSTNAME?: string; | 
					
						
							|  |  |  |   NGINX_PORT?: string; | 
					
						
							| 
									
										
										
										
											2021-07-31 17:30:35 +03:00
										 |  |  |   BLOCK_WEIGHT_UNITS: number; | 
					
						
							| 
									
										
										
										
											2021-07-31 17:56:10 +03:00
										 |  |  |   MEMPOOL_BLOCKS_AMOUNT: number; | 
					
						
							| 
									
										
										
										
											2021-04-12 22:17:13 +04:00
										 |  |  |   GIT_COMMIT_HASH: string; | 
					
						
							|  |  |  |   PACKAGE_JSON_VERSION: string; | 
					
						
							| 
									
										
										
										
											2022-01-07 20:17:14 +04:00
										 |  |  |   MEMPOOL_WEBSITE_URL: string; | 
					
						
							|  |  |  |   LIQUID_WEBSITE_URL: string; | 
					
						
							| 
									
										
										
										
											2022-02-15 16:02:30 +09:00
										 |  |  |   MINING_DASHBOARD: boolean; | 
					
						
							| 
									
										
										
										
											2022-04-27 02:52:23 +04:00
										 |  |  |   LIGHTNING: boolean; | 
					
						
							| 
									
										
										
										
											2023-02-12 21:43:12 -06:00
										 |  |  |   AUDIT: boolean; | 
					
						
							| 
									
										
										
										
											2022-12-01 19:48:57 +09:00
										 |  |  |   MAINNET_BLOCK_AUDIT_START_HEIGHT: number; | 
					
						
							|  |  |  |   TESTNET_BLOCK_AUDIT_START_HEIGHT: number; | 
					
						
							|  |  |  |   SIGNET_BLOCK_AUDIT_START_HEIGHT: number; | 
					
						
							| 
									
										
										
										
											2023-03-01 17:26:53 +09:00
										 |  |  |   HISTORICAL_PRICE: boolean; | 
					
						
							| 
									
										
										
										
											2023-08-03 15:18:04 +09:00
										 |  |  |   ACCELERATOR: boolean; | 
					
						
							| 
									
										
										
										
											2024-04-02 08:19:35 +00:00
										 |  |  |   PUBLIC_ACCELERATIONS: boolean; | 
					
						
							| 
									
										
										
										
											2024-03-07 10:36:33 +01:00
										 |  |  |   ADDITIONAL_CURRENCIES: boolean; | 
					
						
							| 
									
										
										
										
											2023-08-21 08:57:27 +02:00
										 |  |  |   GIT_COMMIT_HASH_MEMPOOL_SPACE?: string; | 
					
						
							| 
									
										
										
										
											2023-08-21 11:19:54 +02:00
										 |  |  |   PACKAGE_JSON_VERSION_MEMPOOL_SPACE?: string; | 
					
						
							| 
									
										
										
										
											2024-07-09 12:16:01 +00:00
										 |  |  |   SERVICES_API?: string; | 
					
						
							| 
									
										
										
										
											2024-04-25 20:18:37 +00:00
										 |  |  |   customize?: Customization; | 
					
						
							| 
									
										
										
										
											2020-11-23 02:30:46 +07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const defaultEnv: Env = { | 
					
						
							| 
									
										
										
										
											2024-06-15 00:22:33 +02:00
										 |  |  |   'MAINNET_ENABLED': true, | 
					
						
							| 
									
										
										
										
											2020-11-23 02:30:46 +07:00
										 |  |  |   'TESTNET_ENABLED': false, | 
					
						
							| 
									
										
										
										
											2024-05-06 15:40:32 +00:00
										 |  |  |   'TESTNET4_ENABLED': false, | 
					
						
							| 
									
										
										
										
											2021-02-20 23:12:22 +07:00
										 |  |  |   'SIGNET_ENABLED': false, | 
					
						
							| 
									
										
										
										
											2020-11-23 02:30:46 +07:00
										 |  |  |   'LIQUID_ENABLED': false, | 
					
						
							| 
									
										
										
										
											2021-12-27 22:54:45 +04:00
										 |  |  |   'LIQUID_TESTNET_ENABLED': false, | 
					
						
							| 
									
										
										
										
											2021-07-27 17:10:38 +03:00
										 |  |  |   'BASE_MODULE': 'mempool', | 
					
						
							| 
									
										
										
										
											2024-06-16 10:50:31 +02:00
										 |  |  |   'ROOT_NETWORK': '', | 
					
						
							| 
									
										
										
										
											2021-01-11 21:11:09 +07:00
										 |  |  |   'ITEMS_PER_PAGE': 10, | 
					
						
							| 
									
										
										
										
											2020-11-23 02:30:46 +07:00
										 |  |  |   'KEEP_BLOCKS_AMOUNT': 8, | 
					
						
							| 
									
										
										
										
											2021-02-18 13:34:05 +07:00
										 |  |  |   'OFFICIAL_MEMPOOL_SPACE': false, | 
					
						
							| 
									
										
										
										
											2020-11-27 23:01:47 +09:00
										 |  |  |   'NGINX_PROTOCOL': 'http', | 
					
						
							|  |  |  |   'NGINX_HOSTNAME': '127.0.0.1', | 
					
						
							| 
									
										
										
										
											2021-01-11 21:06:47 +07:00
										 |  |  |   'NGINX_PORT': '80', | 
					
						
							| 
									
										
										
										
											2021-07-31 17:30:35 +03:00
										 |  |  |   'BLOCK_WEIGHT_UNITS': 4000000, | 
					
						
							| 
									
										
										
										
											2021-07-31 17:56:10 +03:00
										 |  |  |   'MEMPOOL_BLOCKS_AMOUNT': 8, | 
					
						
							| 
									
										
										
										
											2021-04-12 22:17:13 +04:00
										 |  |  |   'GIT_COMMIT_HASH': '', | 
					
						
							|  |  |  |   'PACKAGE_JSON_VERSION': '', | 
					
						
							| 
									
										
										
										
											2022-01-07 20:17:14 +04:00
										 |  |  |   'MEMPOOL_WEBSITE_URL': 'https://mempool.space', | 
					
						
							|  |  |  |   'LIQUID_WEBSITE_URL': 'https://liquid.network', | 
					
						
							| 
									
										
										
										
											2022-04-27 02:52:23 +04:00
										 |  |  |   'MINING_DASHBOARD': true, | 
					
						
							|  |  |  |   'LIGHTNING': false, | 
					
						
							| 
									
										
										
										
											2023-02-12 21:43:12 -06:00
										 |  |  |   'AUDIT': false, | 
					
						
							| 
									
										
										
										
											2022-12-01 19:48:57 +09:00
										 |  |  |   'MAINNET_BLOCK_AUDIT_START_HEIGHT': 0, | 
					
						
							|  |  |  |   'TESTNET_BLOCK_AUDIT_START_HEIGHT': 0, | 
					
						
							|  |  |  |   'SIGNET_BLOCK_AUDIT_START_HEIGHT': 0, | 
					
						
							| 
									
										
										
										
											2023-03-01 17:26:53 +09:00
										 |  |  |   'HISTORICAL_PRICE': true, | 
					
						
							| 
									
										
										
										
											2023-08-03 15:18:04 +09:00
										 |  |  |   'ACCELERATOR': false, | 
					
						
							| 
									
										
										
										
											2024-04-02 08:19:35 +00:00
										 |  |  |   'PUBLIC_ACCELERATIONS': false, | 
					
						
							| 
									
										
										
										
											2024-03-07 10:36:33 +01:00
										 |  |  |   'ADDITIONAL_CURRENCIES': false, | 
					
						
							| 
									
										
										
										
											2024-07-09 12:16:01 +00:00
										 |  |  |   'SERVICES_API': 'https://mempool.space/api/v1/services', | 
					
						
							| 
									
										
										
										
											2020-11-23 02:30:46 +07:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-16 22:15:07 +07:00
										 |  |  | @Injectable({ | 
					
						
							|  |  |  |   providedIn: 'root' | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | export class StateService { | 
					
						
							| 
									
										
										
										
											2024-04-16 16:01:52 +09:00
										 |  |  |   referrer: string = ''; | 
					
						
							| 
									
										
										
										
											2020-11-07 04:30:52 +07:00
										 |  |  |   isBrowser: boolean = isPlatformBrowser(this.platformId); | 
					
						
							| 
									
										
										
										
											2024-03-09 17:33:38 +09:00
										 |  |  |   isMempoolSpaceBuild = window['isMempoolSpaceBuild'] ?? false; | 
					
						
							| 
									
										
										
										
											2024-04-01 03:49:56 +00:00
										 |  |  |   backend: 'esplora' | 'electrum' | 'none' = 'esplora'; | 
					
						
							| 
									
										
										
										
											2020-05-09 20:37:50 +07:00
										 |  |  |   network = ''; | 
					
						
							| 
									
										
										
										
											2024-05-12 16:44:07 +00:00
										 |  |  |   lightningNetworks = ['', 'mainnet', 'bitcoin', 'testnet', 'signet']; | 
					
						
							| 
									
										
										
										
											2022-08-11 17:19:12 +00:00
										 |  |  |   lightning = false; | 
					
						
							| 
									
										
										
										
											2021-07-31 17:30:35 +03:00
										 |  |  |   blockVSize: number; | 
					
						
							| 
									
										
										
										
											2020-11-23 02:30:46 +07:00
										 |  |  |   env: Env; | 
					
						
							| 
									
										
										
										
											2022-01-19 17:11:35 +01:00
										 |  |  |   latestBlockHeight = -1; | 
					
						
							| 
									
										
										
										
											2023-07-08 01:07:06 -04:00
										 |  |  |   blocks: BlockExtended[] = []; | 
					
						
							| 
									
										
										
										
											2024-04-11 08:09:28 +00:00
										 |  |  |   mempoolSequence: number; | 
					
						
							| 
									
										
										
										
											2020-05-09 20:37:50 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-01 03:49:56 +00:00
										 |  |  |   backend$ = new BehaviorSubject<'esplora' | 'electrum' | 'none'>('esplora'); | 
					
						
							| 
									
										
										
										
											2020-05-09 20:37:50 +07:00
										 |  |  |   networkChanged$ = new ReplaySubject<string>(1); | 
					
						
							| 
									
										
										
										
											2022-08-11 17:19:12 +00:00
										 |  |  |   lightningChanged$ = new ReplaySubject<boolean>(1); | 
					
						
							| 
									
										
										
										
											2023-07-11 16:35:00 +09:00
										 |  |  |   blocksSubject$ = new BehaviorSubject<BlockExtended[]>([]); | 
					
						
							|  |  |  |   blocks$: Observable<BlockExtended[]>; | 
					
						
							| 
									
										
										
										
											2024-03-15 05:44:20 +00:00
										 |  |  |   transactions$ = new BehaviorSubject<TransactionStripped[]>(null); | 
					
						
							| 
									
										
										
										
											2020-02-16 22:15:07 +07:00
										 |  |  |   conversions$ = new ReplaySubject<any>(1); | 
					
						
							| 
									
										
										
										
											2020-07-14 21:26:02 +07:00
										 |  |  |   bsqPrice$ = new ReplaySubject<number>(1); | 
					
						
							| 
									
										
										
										
											2020-08-12 13:33:58 +07:00
										 |  |  |   mempoolInfo$ = new ReplaySubject<MempoolInfo>(1); | 
					
						
							| 
									
										
										
										
											2020-07-24 14:11:49 +07:00
										 |  |  |   mempoolBlocks$ = new ReplaySubject<MempoolBlock[]>(1); | 
					
						
							| 
									
										
										
										
											2024-05-02 23:48:10 +00:00
										 |  |  |   mempoolBlockUpdate$ = new Subject<MempoolBlockUpdate>(); | 
					
						
							| 
									
										
										
										
											2023-03-15 11:43:18 +09:00
										 |  |  |   liveMempoolBlockTransactions$: Observable<{ [txid: string]: TransactionStripped}>; | 
					
						
							| 
									
										
										
										
											2024-05-04 00:18:33 +00:00
										 |  |  |   accelerations$ = new Subject<AccelerationDelta>(); | 
					
						
							|  |  |  |   liveAccelerations$: Observable<Acceleration[]>; | 
					
						
							| 
									
										
										
										
											2023-07-08 01:07:06 -04:00
										 |  |  |   txConfirmed$ = new Subject<[string, BlockExtended]>(); | 
					
						
							| 
									
										
										
										
											2022-03-08 14:49:25 +01:00
										 |  |  |   txReplaced$ = new Subject<ReplacedTransaction>(); | 
					
						
							| 
									
										
										
										
											2022-12-17 09:39:06 -06:00
										 |  |  |   txRbfInfo$ = new Subject<RbfTree>(); | 
					
						
							|  |  |  |   rbfLatest$ = new Subject<RbfTree[]>(); | 
					
						
							| 
									
										
										
										
											2023-07-14 16:08:57 +09:00
										 |  |  |   rbfLatestSummary$ = new Subject<ReplacementInfo[]>(); | 
					
						
							| 
									
										
										
										
											2022-03-07 19:45:09 +01:00
										 |  |  |   utxoSpent$ = new Subject<object>(); | 
					
						
							| 
									
										
										
										
											2022-03-12 14:55:42 +01:00
										 |  |  |   difficultyAdjustment$ = new ReplaySubject<DifficultyAdjustment>(1); | 
					
						
							| 
									
										
										
										
											2020-02-23 19:16:50 +07:00
										 |  |  |   mempoolTransactions$ = new Subject<Transaction>(); | 
					
						
							| 
									
										
										
										
											2024-06-24 02:06:22 +00:00
										 |  |  |   mempoolTxPosition$ = new BehaviorSubject<{ txid: string, position: MempoolPosition, cpfp: CpfpInfo | null, accelerationPositions?: AccelerationPosition[] }>(null); | 
					
						
							| 
									
										
										
										
											2023-08-25 00:57:47 +09:00
										 |  |  |   mempoolRemovedTransactions$ = new Subject<Transaction>(); | 
					
						
							| 
									
										
										
										
											2024-02-16 02:30:51 +00:00
										 |  |  |   multiAddressTransactions$ = new Subject<{ [address: string]: { mempool: Transaction[], confirmed: Transaction[], removed: Transaction[] }}>(); | 
					
						
							| 
									
										
										
										
											2020-02-23 19:16:50 +07:00
										 |  |  |   blockTransactions$ = new Subject<Transaction>(); | 
					
						
							| 
									
										
										
										
											2020-07-22 19:21:40 +07:00
										 |  |  |   isLoadingWebSocket$ = new ReplaySubject<boolean>(1); | 
					
						
							| 
									
										
										
										
											2023-07-24 16:22:35 +09:00
										 |  |  |   isLoadingMempool$ = new BehaviorSubject<boolean>(true); | 
					
						
							| 
									
										
										
										
											2020-08-12 13:33:58 +07:00
										 |  |  |   vbytesPerSecond$ = new ReplaySubject<number>(1); | 
					
						
							| 
									
										
										
										
											2021-07-24 19:26:48 -03:00
										 |  |  |   previousRetarget$ = new ReplaySubject<number>(1); | 
					
						
							| 
									
										
										
										
											2021-04-12 22:17:13 +04:00
										 |  |  |   backendInfo$ = new ReplaySubject<IBackendInfo>(1); | 
					
						
							| 
									
										
										
										
											2023-08-20 22:53:33 +02:00
										 |  |  |   servicesBackendInfo$ = new ReplaySubject<IBackendInfo>(1); | 
					
						
							| 
									
										
										
										
											2021-01-05 18:57:06 +07:00
										 |  |  |   loadingIndicators$ = new ReplaySubject<ILoadingIndicators>(1); | 
					
						
							| 
									
										
										
										
											2022-05-27 12:52:40 +02:00
										 |  |  |   recommendedFees$ = new ReplaySubject<Recommendedfees>(1); | 
					
						
							| 
									
										
										
										
											2022-12-27 05:28:57 -06:00
										 |  |  |   chainTip$ = new ReplaySubject<number>(-1); | 
					
						
							| 
									
										
										
										
											2024-03-03 20:31:02 +00:00
										 |  |  |   serverHealth$ = new Subject<HealthCheckHost[]>(); | 
					
						
							| 
									
										
										
										
											2020-02-23 19:16:50 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-17 00:26:57 +07:00
										 |  |  |   live2Chart$ = new Subject<OptimizedMempoolStats>(); | 
					
						
							| 
									
										
										
										
											2020-02-16 22:15:07 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-24 15:52:36 +02:00
										 |  |  |   viewAmountMode$: BehaviorSubject<'btc' | 'sats' | 'fiat'>; | 
					
						
							| 
									
										
										
										
											2020-03-09 17:53:54 +07:00
										 |  |  |   connectionState$ = new BehaviorSubject<0 | 1 | 2>(2); | 
					
						
							| 
									
										
										
										
											2020-11-07 04:30:52 +07:00
										 |  |  |   isTabHidden$: Observable<boolean>; | 
					
						
							| 
									
										
										
										
											2020-03-22 17:44:36 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-27 05:28:57 -06:00
										 |  |  |   markBlock$ = new BehaviorSubject<MarkBlockState>({}); | 
					
						
							| 
									
										
										
										
											2020-05-13 13:03:57 +07:00
										 |  |  |   keyNavigation$ = new Subject<KeyboardEvent>(); | 
					
						
							| 
									
										
										
										
											2023-07-12 10:11:04 +09:00
										 |  |  |   searchText$ = new BehaviorSubject<string>(''); | 
					
						
							| 
									
										
										
										
											2020-05-09 20:37:50 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-19 15:20:21 +09:00
										 |  |  |   blockScrolling$: Subject<boolean> = new Subject<boolean>(); | 
					
						
							| 
									
										
										
										
											2023-06-09 19:03:47 -04:00
										 |  |  |   resetScroll$: Subject<boolean> = new Subject<boolean>(); | 
					
						
							| 
									
										
										
										
											2022-09-29 22:37:49 +00:00
										 |  |  |   timeLtr: BehaviorSubject<boolean>; | 
					
						
							| 
									
										
										
										
											2022-10-11 17:01:23 +00:00
										 |  |  |   hideFlow: BehaviorSubject<boolean>; | 
					
						
							| 
									
										
										
										
											2022-12-29 07:38:57 -06:00
										 |  |  |   hideAudit: BehaviorSubject<boolean>; | 
					
						
							| 
									
										
										
										
											2023-01-03 11:56:54 -06:00
										 |  |  |   fiatCurrency$: BehaviorSubject<string>; | 
					
						
							| 
									
										
										
										
											2023-06-15 15:15:20 -04:00
										 |  |  |   rateUnits$: BehaviorSubject<string>; | 
					
						
							| 
									
										
										
										
											2024-04-24 15:52:36 +02:00
										 |  |  |   blockDisplayMode$: BehaviorSubject<string>; | 
					
						
							| 
									
										
										
										
											2021-12-19 15:20:21 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-24 10:18:00 +09:00
										 |  |  |   searchFocus$: Subject<boolean> = new Subject<boolean>(); | 
					
						
							| 
									
										
										
										
											2023-08-23 19:59:54 +09:00
										 |  |  |   menuOpen$: BehaviorSubject<boolean> = new BehaviorSubject(false); | 
					
						
							| 
									
										
										
										
											2023-07-24 10:18:00 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-04 11:22:57 +00:00
										 |  |  |   activeGoggles$: BehaviorSubject<ActiveFilter> = new BehaviorSubject({ mode: 'and', filters: [], gradient: 'age' }); | 
					
						
							| 
									
										
										
										
											2023-12-21 16:23:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-09 20:37:50 +07:00
										 |  |  |   constructor( | 
					
						
							| 
									
										
										
										
											2020-11-07 04:30:52 +07:00
										 |  |  |     @Inject(PLATFORM_ID) private platformId: any, | 
					
						
							| 
									
										
										
										
											2022-10-03 22:07:59 +00:00
										 |  |  |     @Inject(LOCALE_ID) private locale: string, | 
					
						
							| 
									
										
										
										
											2020-05-09 20:37:50 +07:00
										 |  |  |     private router: Router, | 
					
						
							| 
									
										
										
										
											2022-09-29 22:37:49 +00:00
										 |  |  |     private storageService: StorageService, | 
					
						
							| 
									
										
										
										
											2020-05-09 20:37:50 +07:00
										 |  |  |   ) { | 
					
						
							| 
									
										
										
										
											2024-04-16 16:01:52 +09:00
										 |  |  |     this.referrer = window.document.referrer; | 
					
						
							| 
									
										
										
										
											2024-04-06 12:27:43 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-27 17:10:38 +03:00
										 |  |  |     const browserWindow = window || {}; | 
					
						
							|  |  |  |     // @ts-ignore
 | 
					
						
							|  |  |  |     const browserWindowEnv = browserWindow.__env || {}; | 
					
						
							|  |  |  |     this.env = Object.assign(defaultEnv, browserWindowEnv); | 
					
						
							| 
									
										
										
										
											2020-11-07 04:30:52 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-16 17:28:00 +01:00
										 |  |  |     if (defaultEnv.BASE_MODULE !== 'mempool') { | 
					
						
							|  |  |  |       this.env.MINING_DASHBOARD = false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-07 04:30:52 +07:00
										 |  |  |     if (this.isBrowser) { | 
					
						
							|  |  |  |       this.setNetworkBasedonUrl(window.location.pathname); | 
					
						
							| 
									
										
										
										
											2022-08-11 17:19:12 +00:00
										 |  |  |       this.setLightningBasedonUrl(window.location.pathname); | 
					
						
							| 
									
										
										
										
											2020-11-07 04:30:52 +07:00
										 |  |  |       this.isTabHidden$ = fromEvent(document, 'visibilitychange').pipe(map(() => this.isHidden()), shareReplay()); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       this.setNetworkBasedonUrl('/'); | 
					
						
							| 
									
										
										
										
											2022-08-11 17:19:12 +00:00
										 |  |  |       this.setLightningBasedonUrl('/'); | 
					
						
							| 
									
										
										
										
											2020-11-07 04:30:52 +07:00
										 |  |  |       this.isTabHidden$ = new BehaviorSubject(false); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-11-23 02:30:46 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-27 17:10:38 +03:00
										 |  |  |     this.router.events.subscribe((event) => { | 
					
						
							|  |  |  |       if (event instanceof NavigationStart) { | 
					
						
							|  |  |  |         this.setNetworkBasedonUrl(event.url); | 
					
						
							| 
									
										
										
										
											2022-08-11 17:19:12 +00:00
										 |  |  |         this.setLightningBasedonUrl(event.url); | 
					
						
							| 
									
										
										
										
											2021-07-27 17:10:38 +03:00
										 |  |  |       } | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2020-11-23 02:30:46 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-16 16:01:52 +09:00
										 |  |  |     if (this.referrer === 'https://cash.app/' && window.innerWidth < 850 && window.location.pathname.startsWith('/tx/')) { | 
					
						
							| 
									
										
										
										
											2024-04-13 09:24:52 +00:00
										 |  |  |       this.router.navigate(['/tracker/' + window.location.pathname.slice(4)]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-02 23:48:10 +00:00
										 |  |  |     this.liveMempoolBlockTransactions$ = this.mempoolBlockUpdate$.pipe(scan((transactions: { [txid: string]: TransactionStripped }, change: MempoolBlockUpdate): { [txid: string]: TransactionStripped } => { | 
					
						
							|  |  |  |       if (isMempoolState(change)) { | 
					
						
							|  |  |  |         const txMap = {}; | 
					
						
							| 
									
										
										
										
											2023-03-15 11:43:18 +09:00
										 |  |  |         change.transactions.forEach(tx => { | 
					
						
							|  |  |  |           txMap[tx.txid] = tx; | 
					
						
							| 
									
										
										
										
											2024-05-02 23:48:10 +00:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2023-03-15 11:43:18 +09:00
										 |  |  |         return txMap; | 
					
						
							|  |  |  |       } else { | 
					
						
							| 
									
										
										
										
											2024-05-02 23:48:10 +00:00
										 |  |  |         change.added.forEach(tx => { | 
					
						
							|  |  |  |           transactions[tx.txid] = tx; | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |         change.removed.forEach(txid => { | 
					
						
							| 
									
										
										
										
											2023-03-15 11:43:18 +09:00
										 |  |  |           delete transactions[txid]; | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2024-05-02 23:48:10 +00:00
										 |  |  |         change.changed.forEach(tx => { | 
					
						
							|  |  |  |           if (transactions[tx.txid]) { | 
					
						
							|  |  |  |             transactions[tx.txid].rate = tx.rate; | 
					
						
							|  |  |  |             transactions[tx.txid].acc = tx.acc; | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2023-03-15 11:43:18 +09:00
										 |  |  |         }); | 
					
						
							|  |  |  |         return transactions; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }, {})); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-04 00:18:33 +00:00
										 |  |  |     // Emits the full list of pending accelerations each time it changes
 | 
					
						
							|  |  |  |     this.liveAccelerations$ = this.accelerations$.pipe( | 
					
						
							|  |  |  |       scan((accelerations: { [txid: string]: Acceleration }, delta: AccelerationDelta) => { | 
					
						
							|  |  |  |         if (delta.reset) { | 
					
						
							|  |  |  |           accelerations = {}; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |           for (const txid of delta.removed) { | 
					
						
							|  |  |  |             delete accelerations[txid]; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         for (const acc of delta.added) { | 
					
						
							|  |  |  |           accelerations[acc.txid] = acc; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return accelerations; | 
					
						
							|  |  |  |       }, {}), | 
					
						
							|  |  |  |       map((accMap) => Object.values(accMap).sort((a,b) => b.added - a.added)) | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-11 10:50:25 +09:00
										 |  |  |     this.networkChanged$.subscribe((network) => { | 
					
						
							| 
									
										
										
										
											2024-03-15 05:44:20 +00:00
										 |  |  |       this.transactions$ = new BehaviorSubject<TransactionStripped[]>(null); | 
					
						
							| 
									
										
										
										
											2023-07-13 11:03:44 +09:00
										 |  |  |       this.blocksSubject$.next([]); | 
					
						
							| 
									
										
										
										
											2023-07-11 10:50:25 +09:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-31 17:30:35 +03:00
										 |  |  |     this.blockVSize = this.env.BLOCK_WEIGHT_UNITS / 4; | 
					
						
							| 
									
										
										
										
											2022-09-29 22:37:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-11 16:35:00 +09:00
										 |  |  |     this.blocks$ = this.blocksSubject$.pipe(filter(blocks => blocks != null && blocks.length > 0)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-03 22:07:59 +00:00
										 |  |  |     const savedTimePreference = this.storageService.getValue('time-preference-ltr'); | 
					
						
							|  |  |  |     const rtlLanguage = (this.locale.startsWith('ar') || this.locale.startsWith('fa') || this.locale.startsWith('he')); | 
					
						
							|  |  |  |     // default time direction is right-to-left, unless locale is a RTL language
 | 
					
						
							|  |  |  |     this.timeLtr = new BehaviorSubject<boolean>(savedTimePreference === 'true' || (savedTimePreference == null && rtlLanguage)); | 
					
						
							| 
									
										
										
										
											2022-09-29 22:37:49 +00:00
										 |  |  |     this.timeLtr.subscribe((ltr) => { | 
					
						
							|  |  |  |       this.storageService.setValue('time-preference-ltr', ltr ? 'true' : 'false'); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2022-10-11 17:01:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const savedFlowPreference = this.storageService.getValue('flow-preference'); | 
					
						
							|  |  |  |     this.hideFlow = new BehaviorSubject<boolean>(savedFlowPreference === 'hide'); | 
					
						
							|  |  |  |     this.hideFlow.subscribe((hide) => { | 
					
						
							|  |  |  |       if (hide) { | 
					
						
							|  |  |  |         this.storageService.setValue('flow-preference', hide ? 'hide' : 'show'); | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         this.storageService.removeItem('flow-preference'); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2022-12-29 07:38:57 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const savedAuditPreference = this.storageService.getValue('audit-preference'); | 
					
						
							|  |  |  |     this.hideAudit = new BehaviorSubject<boolean>(savedAuditPreference === 'hide'); | 
					
						
							|  |  |  |     this.hideAudit.subscribe((hide) => { | 
					
						
							|  |  |  |       this.storageService.setValue('audit-preference', hide ? 'hide' : 'show'); | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2023-01-03 11:56:54 -06:00
										 |  |  |      | 
					
						
							|  |  |  |     const fiatPreference = this.storageService.getValue('fiat-preference'); | 
					
						
							|  |  |  |     this.fiatCurrency$ = new BehaviorSubject<string>(fiatPreference || 'USD'); | 
					
						
							| 
									
										
										
										
											2023-06-15 15:15:20 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const rateUnitPreference = this.storageService.getValue('rate-unit-preference'); | 
					
						
							|  |  |  |     this.rateUnits$ = new BehaviorSubject<string>(rateUnitPreference || 'vb'); | 
					
						
							| 
									
										
										
										
											2024-04-01 03:49:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-21 14:54:50 +02:00
										 |  |  |     const blockDisplayModePreference = this.storageService.getValue('block-display-mode-preference'); | 
					
						
							| 
									
										
										
										
											2024-04-29 11:54:28 +02:00
										 |  |  |     this.blockDisplayMode$ = new BehaviorSubject<string>(blockDisplayModePreference || 'fees'); | 
					
						
							| 
									
										
										
										
											2024-04-21 14:54:50 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-24 15:52:36 +02:00
										 |  |  |     const viewAmountModePreference = this.storageService.getValue('view-amount-mode') as 'btc' | 'sats' | 'fiat'; | 
					
						
							|  |  |  |     this.viewAmountMode$ = new BehaviorSubject<'btc' | 'sats' | 'fiat'>(viewAmountModePreference || 'btc'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-01 03:49:56 +00:00
										 |  |  |     this.backend$.subscribe(backend => { | 
					
						
							|  |  |  |       this.backend = backend; | 
					
						
							|  |  |  |     }); | 
					
						
							| 
									
										
										
										
											2020-05-09 20:37:50 +07:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2020-05-10 12:31:57 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   setNetworkBasedonUrl(url: string) { | 
					
						
							| 
									
										
										
										
											2021-12-27 22:54:45 +04:00
										 |  |  |     if (this.env.BASE_MODULE !== 'mempool' && this.env.BASE_MODULE !== 'liquid') { | 
					
						
							| 
									
										
										
										
											2021-07-27 17:10:38 +03:00
										 |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-08-27 20:59:36 +00:00
										 |  |  |     // horrible network regex breakdown:
 | 
					
						
							|  |  |  |     // /^\/                                         starts with a forward slash...
 | 
					
						
							|  |  |  |     // (?:[a-z]{2}(?:-[A-Z]{2})?\/)?                optional locale prefix (non-capturing)
 | 
					
						
							|  |  |  |     // (?:preview\/)?                               optional "preview" prefix (non-capturing)
 | 
					
						
							| 
									
										
										
										
											2024-04-03 16:09:30 +09:00
										 |  |  |     // (testnet|signet)/                            network string (captured as networkMatches[1])
 | 
					
						
							| 
									
										
										
										
											2022-09-29 13:45:03 +04:00
										 |  |  |     // ($|\/)                                       network string must end or end with a slash
 | 
					
						
							| 
									
										
										
										
											2024-06-21 19:32:25 +09:00
										 |  |  |     let networkMatches: object = url.match(/^\/(?:[a-z]{2}(?:-[A-Z]{2})?\/)?(?:preview\/)?(testnet4?|signet)($|\/)/); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!networkMatches && this.env.ROOT_NETWORK) { | 
					
						
							|  |  |  |       networkMatches = { 1: this.env.ROOT_NETWORK }; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-01 04:17:34 +07:00
										 |  |  |     switch (networkMatches && networkMatches[1]) { | 
					
						
							| 
									
										
										
										
											2021-02-20 23:12:22 +07:00
										 |  |  |       case 'signet': | 
					
						
							|  |  |  |         if (this.network !== 'signet') { | 
					
						
							|  |  |  |           this.network = 'signet'; | 
					
						
							|  |  |  |           this.networkChanged$.next('signet'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return; | 
					
						
							| 
									
										
										
										
											2020-05-10 12:31:57 +07:00
										 |  |  |       case 'testnet': | 
					
						
							| 
									
										
										
										
											2024-04-03 16:09:30 +09:00
										 |  |  |         if (this.network !== 'testnet' && this.network !== 'liquidtestnet') { | 
					
						
							| 
									
										
										
										
											2021-12-27 22:54:45 +04:00
										 |  |  |           if (this.env.BASE_MODULE === 'liquid') { | 
					
						
							|  |  |  |             this.network = 'liquidtestnet'; | 
					
						
							|  |  |  |             this.networkChanged$.next('liquidtestnet'); | 
					
						
							|  |  |  |           } else { | 
					
						
							|  |  |  |             this.network = 'testnet'; | 
					
						
							|  |  |  |             this.networkChanged$.next('testnet'); | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2020-05-10 12:31:57 +07:00
										 |  |  |         } | 
					
						
							|  |  |  |         return; | 
					
						
							| 
									
										
										
										
											2024-05-06 15:40:32 +00:00
										 |  |  |       case 'testnet4': | 
					
						
							|  |  |  |         if (this.network !== 'testnet4') { | 
					
						
							|  |  |  |           this.network = 'testnet4'; | 
					
						
							|  |  |  |           this.networkChanged$.next('testnet4'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return; | 
					
						
							| 
									
										
										
										
											2020-05-10 12:31:57 +07:00
										 |  |  |       default: | 
					
						
							| 
									
										
										
										
											2021-12-30 03:07:08 +04:00
										 |  |  |         if (this.env.BASE_MODULE !== 'mempool') { | 
					
						
							|  |  |  |           if (this.network !== this.env.BASE_MODULE) { | 
					
						
							|  |  |  |             this.network = this.env.BASE_MODULE; | 
					
						
							|  |  |  |             this.networkChanged$.next(this.env.BASE_MODULE); | 
					
						
							| 
									
										
										
										
											2021-12-27 22:54:45 +04:00
										 |  |  |           } | 
					
						
							| 
									
										
										
										
											2021-12-30 03:07:08 +04:00
										 |  |  |         } else if (this.network !== '') { | 
					
						
							| 
									
										
										
										
											2024-06-21 19:32:25 +09:00
										 |  |  |           this.network = ''; | 
					
						
							|  |  |  |           this.networkChanged$.next(''); | 
					
						
							| 
									
										
										
										
											2020-05-10 12:31:57 +07:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2020-06-11 01:38:59 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-11 17:19:12 +00:00
										 |  |  |   setLightningBasedonUrl(url: string) { | 
					
						
							|  |  |  |     if (this.env.BASE_MODULE !== 'mempool') { | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     const networkMatches = url.match(/\/lightning\//); | 
					
						
							|  |  |  |     this.lightning = !!networkMatches; | 
					
						
							|  |  |  |     this.lightningChanged$.next(this.lightning); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-12 16:44:07 +00:00
										 |  |  |   networkSupportsLightning() { | 
					
						
							|  |  |  |     return this.env.LIGHTNING && this.lightningNetworks.includes(this.network); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-11 01:38:59 +07:00
										 |  |  |   getHiddenProp(){ | 
					
						
							|  |  |  |     const prefixes = ['webkit', 'moz', 'ms', 'o']; | 
					
						
							|  |  |  |     if ('hidden' in document) { return 'hidden'; } | 
					
						
							|  |  |  |     for (const prefix of prefixes) { | 
					
						
							|  |  |  |       if ((prefix + 'Hidden') in document) { | 
					
						
							|  |  |  |         return prefix + 'Hidden'; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return null; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   isHidden() { | 
					
						
							|  |  |  |     const prop = this.getHiddenProp(); | 
					
						
							|  |  |  |     if (!prop) { return false; } | 
					
						
							|  |  |  |     return document[prop]; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2021-12-19 15:20:21 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |   setBlockScrollingInProgress(value: boolean) { | 
					
						
							|  |  |  |     this.blockScrolling$.next(value); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-01-04 04:42:19 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   isLiquid() { | 
					
						
							|  |  |  |     return this.network === 'liquid' || this.network === 'liquidtestnet'; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-11-07 20:05:33 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-04 11:43:31 +09:00
										 |  |  |   isMainnet(): boolean { | 
					
						
							|  |  |  |     return this.env.ROOT_NETWORK === '' && this.network === ''; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-06 15:41:57 +09:00
										 |  |  |   isAnyTestnet(): boolean { | 
					
						
							| 
									
										
										
										
											2024-05-06 15:40:32 +00:00
										 |  |  |     return ['testnet', 'testnet4', 'signet', 'liquidtestnet'].includes(this.network); | 
					
						
							| 
									
										
										
										
											2023-08-06 15:41:57 +09:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-27 05:28:57 -06:00
										 |  |  |   resetChainTip() { | 
					
						
							|  |  |  |     this.latestBlockHeight = -1; | 
					
						
							|  |  |  |     this.chainTip$.next(-1); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   updateChainTip(height) { | 
					
						
							|  |  |  |     if (height > this.latestBlockHeight) { | 
					
						
							|  |  |  |       this.latestBlockHeight = height; | 
					
						
							|  |  |  |       this.chainTip$.next(height); | 
					
						
							| 
									
										
										
										
											2022-11-07 20:05:33 -06:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2023-07-08 01:07:06 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   resetBlocks(blocks: BlockExtended[]): void { | 
					
						
							|  |  |  |     this.blocks = blocks.reverse(); | 
					
						
							| 
									
										
										
										
											2023-07-11 16:35:00 +09:00
										 |  |  |     this.blocksSubject$.next(blocks); | 
					
						
							| 
									
										
										
										
											2023-07-08 01:07:06 -04:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   addBlock(block: BlockExtended): void { | 
					
						
							|  |  |  |     this.blocks.unshift(block); | 
					
						
							|  |  |  |     this.blocks = this.blocks.slice(0, this.env.KEEP_BLOCKS_AMOUNT); | 
					
						
							| 
									
										
										
										
											2023-07-11 16:35:00 +09:00
										 |  |  |     this.blocksSubject$.next(this.blocks); | 
					
						
							| 
									
										
										
										
											2023-07-08 01:07:06 -04:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2023-07-24 11:35:46 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |   focusSearchInputDesktop() { | 
					
						
							|  |  |  |     if (!hasTouchScreen()) { | 
					
						
							|  |  |  |       this.searchFocus$.next(true); | 
					
						
							|  |  |  |     }     | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2020-02-16 22:15:07 +07:00
										 |  |  | } |