Merge branch 'master' into nymkappa/accel-count-dashboard
This commit is contained in:
		
						commit
						934b3c5379
					
				| @ -1,6 +1,7 @@ | |||||||
| import { Application, NextFunction, Request, Response } from 'express'; | import { Application, NextFunction, Request, Response } from 'express'; | ||||||
| import logger from '../../logger'; | import logger from '../../logger'; | ||||||
| import bitcoinClient from './bitcoin-client'; | import bitcoinClient from './bitcoin-client'; | ||||||
|  | import config from '../../config'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Define a set of routes used by the accelerator server |  * Define a set of routes used by the accelerator server | ||||||
| @ -11,15 +12,15 @@ class BitcoinBackendRoutes { | |||||||
| 
 | 
 | ||||||
|   public initRoutes(app: Application) { |   public initRoutes(app: Application) { | ||||||
|     app |     app | ||||||
|       .get('/api/internal/bitcoin-core/' + 'get-mempool-entry', this.disableCache, this.$getMempoolEntry) |       .get(config.MEMPOOL.API_URL_PREFIX + 'internal/bitcoin-core/' + 'get-mempool-entry', this.disableCache, this.$getMempoolEntry) | ||||||
|       .post('/api/internal/bitcoin-core/' + 'decode-raw-transaction', this.disableCache, this.$decodeRawTransaction) |       .post(config.MEMPOOL.API_URL_PREFIX + 'internal/bitcoin-core/' + 'decode-raw-transaction', this.disableCache, this.$decodeRawTransaction) | ||||||
|       .get('/api/internal/bitcoin-core/' + 'get-raw-transaction', this.disableCache, this.$getRawTransaction) |       .get(config.MEMPOOL.API_URL_PREFIX + 'internal/bitcoin-core/' + 'get-raw-transaction', this.disableCache, this.$getRawTransaction) | ||||||
|       .post('/api/internal/bitcoin-core/' + 'send-raw-transaction', this.disableCache, this.$sendRawTransaction) |       .post(config.MEMPOOL.API_URL_PREFIX + 'internal/bitcoin-core/' + 'send-raw-transaction', this.disableCache, this.$sendRawTransaction) | ||||||
|       .post('/api/internal/bitcoin-core/' + 'test-mempool-accept', this.disableCache, this.$testMempoolAccept) |       .post(config.MEMPOOL.API_URL_PREFIX + 'internal/bitcoin-core/' + 'test-mempool-accept', this.disableCache, this.$testMempoolAccept) | ||||||
|       .get('/api/internal/bitcoin-core/' + 'get-mempool-ancestors', this.disableCache, this.$getMempoolAncestors) |       .get(config.MEMPOOL.API_URL_PREFIX + 'internal/bitcoin-core/' + 'get-mempool-ancestors', this.disableCache, this.$getMempoolAncestors) | ||||||
|       .get('/api/internal/bitcoin-core/' + 'get-block', this.disableCache, this.$getBlock) |       .get(config.MEMPOOL.API_URL_PREFIX + 'internal/bitcoin-core/' + 'get-block', this.disableCache, this.$getBlock) | ||||||
|       .get('/api/internal/bitcoin-core/' + 'get-block-hash', this.disableCache, this.$getBlockHash) |       .get(config.MEMPOOL.API_URL_PREFIX + 'internal/bitcoin-core/' + 'get-block-hash', this.disableCache, this.$getBlockHash) | ||||||
|       .get('/api/internal/bitcoin-core/' + 'get-block-count', this.disableCache, this.$getBlockCount) |       .get(config.MEMPOOL.API_URL_PREFIX + 'internal/bitcoin-core/' + 'get-block-count', this.disableCache, this.$getBlockCount) | ||||||
|     ; |     ; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -412,8 +412,16 @@ class Blocks { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     try { |     try { | ||||||
|  |       const blockchainInfo = await bitcoinClient.getBlockchainInfo(); | ||||||
|  |       const currentBlockHeight = blockchainInfo.blocks; | ||||||
|  |       let indexingBlockAmount = Math.min(config.MEMPOOL.INDEXING_BLOCKS_AMOUNT, currentBlockHeight); | ||||||
|  |       if (indexingBlockAmount <= -1) { | ||||||
|  |         indexingBlockAmount = currentBlockHeight + 1; | ||||||
|  |       } | ||||||
|  |       const lastBlockToIndex = Math.max(0, currentBlockHeight - indexingBlockAmount + 1); | ||||||
|  | 
 | ||||||
|       // Get all indexed block hash
 |       // Get all indexed block hash
 | ||||||
|       const indexedBlocks = await blocksRepository.$getIndexedBlocks(); |       const indexedBlocks = (await blocksRepository.$getIndexedBlocks()).filter(block => block.height >= lastBlockToIndex); | ||||||
|       const indexedBlockSummariesHashesArray = await BlocksSummariesRepository.$getIndexedSummariesId(); |       const indexedBlockSummariesHashesArray = await BlocksSummariesRepository.$getIndexedSummariesId(); | ||||||
| 
 | 
 | ||||||
|       const indexedBlockSummariesHashes = {}; // Use a map for faster seek during the indexing loop
 |       const indexedBlockSummariesHashes = {}; // Use a map for faster seek during the indexing loop
 | ||||||
|  | |||||||
| @ -10,6 +10,7 @@ import bitcoinClient from './bitcoin/bitcoin-client'; | |||||||
| import bitcoinSecondClient from './bitcoin/bitcoin-second-client'; | import bitcoinSecondClient from './bitcoin/bitcoin-second-client'; | ||||||
| import rbfCache from './rbf-cache'; | import rbfCache from './rbf-cache'; | ||||||
| import { Acceleration } from './services/acceleration'; | import { Acceleration } from './services/acceleration'; | ||||||
|  | import accelerationApi from './services/acceleration'; | ||||||
| import redisCache from './redis-cache'; | import redisCache from './redis-cache'; | ||||||
| import blocks from './blocks'; | import blocks from './blocks'; | ||||||
| 
 | 
 | ||||||
| @ -207,7 +208,7 @@ class Mempool { | |||||||
|     return txTimes; |     return txTimes; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   public async $updateMempool(transactions: string[], accelerations: Acceleration[] | null, minFeeMempool: string[], minFeeTip: number, pollRate: number): Promise<void> { |   public async $updateMempool(transactions: string[], accelerations: Record<string, Acceleration> | null, minFeeMempool: string[], minFeeTip: number, pollRate: number): Promise<void> { | ||||||
|     logger.debug(`Updating mempool...`); |     logger.debug(`Updating mempool...`); | ||||||
| 
 | 
 | ||||||
|     // warn if this run stalls the main loop for more than 2 minutes
 |     // warn if this run stalls the main loop for more than 2 minutes
 | ||||||
| @ -354,7 +355,7 @@ class Mempool { | |||||||
|     const newTransactionsStripped = newTransactions.map((tx) => Common.stripTransaction(tx)); |     const newTransactionsStripped = newTransactions.map((tx) => Common.stripTransaction(tx)); | ||||||
|     this.latestTransactions = newTransactionsStripped.concat(this.latestTransactions).slice(0, 6); |     this.latestTransactions = newTransactionsStripped.concat(this.latestTransactions).slice(0, 6); | ||||||
| 
 | 
 | ||||||
|     const accelerationDelta = accelerations != null ? await this.$updateAccelerations(accelerations) : []; |     const accelerationDelta = accelerations != null ? await this.updateAccelerations(accelerations) : []; | ||||||
|     if (accelerationDelta.length) { |     if (accelerationDelta.length) { | ||||||
|       hasChange = true; |       hasChange = true; | ||||||
|     } |     } | ||||||
| @ -399,58 +400,11 @@ class Mempool { | |||||||
|     return this.accelerations; |     return this.accelerations; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   public $updateAccelerations(newAccelerations: Acceleration[]): string[] { |   public updateAccelerations(newAccelerationMap: Record<string, Acceleration>): string[] { | ||||||
|     try { |     try { | ||||||
|       const changed: string[] = []; |       const accelerationDelta = accelerationApi.getAccelerationDelta(this.accelerations, newAccelerationMap); | ||||||
| 
 |  | ||||||
|       const newAccelerationMap: { [txid: string]: Acceleration } = {}; |  | ||||||
|       for (const acceleration of newAccelerations) { |  | ||||||
|         // skip transactions we don't know about
 |  | ||||||
|         if (!this.mempoolCache[acceleration.txid]) { |  | ||||||
|           continue; |  | ||||||
|         } |  | ||||||
|         newAccelerationMap[acceleration.txid] = acceleration; |  | ||||||
|         if (this.accelerations[acceleration.txid] == null) { |  | ||||||
|           // new acceleration
 |  | ||||||
|           changed.push(acceleration.txid); |  | ||||||
|         } else { |  | ||||||
|           if (this.accelerations[acceleration.txid].feeDelta !== acceleration.feeDelta) { |  | ||||||
|             // feeDelta changed
 |  | ||||||
|             changed.push(acceleration.txid); |  | ||||||
|           } else if (this.accelerations[acceleration.txid].pools?.length) { |  | ||||||
|             let poolsChanged = false; |  | ||||||
|             const pools = new Set(); |  | ||||||
|             this.accelerations[acceleration.txid].pools.forEach(pool => { |  | ||||||
|               pools.add(pool); |  | ||||||
|             }); |  | ||||||
|             acceleration.pools.forEach(pool => { |  | ||||||
|               if (!pools.has(pool)) { |  | ||||||
|                 poolsChanged = true; |  | ||||||
|               } else { |  | ||||||
|                 pools.delete(pool); |  | ||||||
|               } |  | ||||||
|             }); |  | ||||||
|             if (pools.size > 0) { |  | ||||||
|               poolsChanged = true; |  | ||||||
|             } |  | ||||||
|             if (poolsChanged) { |  | ||||||
|               // pools changed
 |  | ||||||
|               changed.push(acceleration.txid); |  | ||||||
|             } |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       for (const oldTxid of Object.keys(this.accelerations)) { |  | ||||||
|         if (!newAccelerationMap[oldTxid]) { |  | ||||||
|           // removed
 |  | ||||||
|           changed.push(oldTxid); |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       this.accelerations = newAccelerationMap; |       this.accelerations = newAccelerationMap; | ||||||
| 
 |       return accelerationDelta; | ||||||
|       return changed; |  | ||||||
|     } catch (e: any) { |     } catch (e: any) { | ||||||
|       logger.debug(`Failed to update accelerations: ` + (e instanceof Error ? e.message : e)); |       logger.debug(`Failed to update accelerations: ` + (e instanceof Error ? e.message : e)); | ||||||
|       return []; |       return []; | ||||||
|  | |||||||
| @ -459,7 +459,7 @@ class MiningRoutes { | |||||||
|         handleError(req, res, 400, 'Acceleration data is not available.'); |         handleError(req, res, 400, 'Acceleration data is not available.'); | ||||||
|         return; |         return; | ||||||
|       } |       } | ||||||
|       res.status(200).send(accelerationApi.accelerations || []); |       res.status(200).send(Object.values(accelerationApi.getAccelerations() || {})); | ||||||
|     } catch (e) { |     } catch (e) { | ||||||
|       handleError(req, res, 500, e instanceof Error ? e.message : e); |       handleError(req, res, 500, e instanceof Error ? e.message : e); | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -136,9 +136,13 @@ class Mining { | |||||||
|     poolsStatistics['blockCount'] = blockCount; |     poolsStatistics['blockCount'] = blockCount; | ||||||
| 
 | 
 | ||||||
|     const totalBlock24h: number = await BlocksRepository.$blockCount(null, '24h'); |     const totalBlock24h: number = await BlocksRepository.$blockCount(null, '24h'); | ||||||
|  |     const totalBlock3d: number = await BlocksRepository.$blockCount(null, '3d'); | ||||||
|  |     const totalBlock1w: number = await BlocksRepository.$blockCount(null, '1w'); | ||||||
| 
 | 
 | ||||||
|     try { |     try { | ||||||
|       poolsStatistics['lastEstimatedHashrate'] = await bitcoinClient.getNetworkHashPs(totalBlock24h); |       poolsStatistics['lastEstimatedHashrate'] = await bitcoinClient.getNetworkHashPs(totalBlock24h); | ||||||
|  |       poolsStatistics['lastEstimatedHashrate3d'] = await bitcoinClient.getNetworkHashPs(totalBlock3d); | ||||||
|  |       poolsStatistics['lastEstimatedHashrate1w'] = await bitcoinClient.getNetworkHashPs(totalBlock1w); | ||||||
|     } catch (e) { |     } catch (e) { | ||||||
|       poolsStatistics['lastEstimatedHashrate'] = 0; |       poolsStatistics['lastEstimatedHashrate'] = 0; | ||||||
|       logger.debug('Bitcoin Core is not available, using zeroed value for current hashrate', logger.tags.mining); |       logger.debug('Bitcoin Core is not available, using zeroed value for current hashrate', logger.tags.mining); | ||||||
|  | |||||||
| @ -1,7 +1,10 @@ | |||||||
|  | import { WebSocket } from 'ws'; | ||||||
| import config from '../../config'; | import config from '../../config'; | ||||||
| import logger from '../../logger'; | import logger from '../../logger'; | ||||||
| import { BlockExtended } from '../../mempool.interfaces'; | import { BlockExtended } from '../../mempool.interfaces'; | ||||||
| import axios from 'axios'; | import axios from 'axios'; | ||||||
|  | import mempool from '../mempool'; | ||||||
|  | import websocketHandler from '../websocket-handler'; | ||||||
| 
 | 
 | ||||||
| type MyAccelerationStatus = 'requested' | 'accelerating' | 'done'; | type MyAccelerationStatus = 'requested' | 'accelerating' | 'done'; | ||||||
| 
 | 
 | ||||||
| @ -37,14 +40,20 @@ export interface AccelerationHistory { | |||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| class AccelerationApi { | class AccelerationApi { | ||||||
|  |   private ws: WebSocket | null = null; | ||||||
|  |   private useWebsocket: boolean = config.MEMPOOL.OFFICIAL && config.MEMPOOL_SERVICES.ACCELERATIONS; | ||||||
|  |   private startedWebsocketLoop: boolean = false; | ||||||
|  |   private websocketConnected: boolean = false; | ||||||
|   private onDemandPollingEnabled = !config.MEMPOOL_SERVICES.ACCELERATIONS; |   private onDemandPollingEnabled = !config.MEMPOOL_SERVICES.ACCELERATIONS; | ||||||
|   private apiPath = config.MEMPOOL.OFFICIAL ? (config.MEMPOOL_SERVICES.API + '/accelerator/accelerations') : (config.EXTERNAL_DATA_SERVER.MEMPOOL_API + '/accelerations'); |   private apiPath = config.MEMPOOL.OFFICIAL ? (config.MEMPOOL_SERVICES.API + '/accelerator/accelerations') : (config.EXTERNAL_DATA_SERVER.MEMPOOL_API + '/accelerations'); | ||||||
|   private _accelerations: Acceleration[] | null = null; |   private _accelerations: Record<string, Acceleration> = {}; | ||||||
|   private lastPoll = 0; |   private lastPoll = 0; | ||||||
|   private forcePoll = false; |   private forcePoll = false; | ||||||
|   private myAccelerations: Record<string, { status: MyAccelerationStatus, added: number, acceleration?: Acceleration }> = {}; |   private myAccelerations: Record<string, { status: MyAccelerationStatus, added: number, acceleration?: Acceleration }> = {}; | ||||||
| 
 | 
 | ||||||
|   public get accelerations(): Acceleration[] | null { |   public constructor() {} | ||||||
|  | 
 | ||||||
|  |   public getAccelerations(): Record<string, Acceleration> { | ||||||
|     return this._accelerations; |     return this._accelerations; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
| @ -72,11 +81,18 @@ class AccelerationApi { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   public async $updateAccelerations(): Promise<Acceleration[] | null> { |   public async $updateAccelerations(): Promise<Record<string, Acceleration> | null> { | ||||||
|  |     if (this.useWebsocket && this.websocketConnected) { | ||||||
|  |       return this._accelerations; | ||||||
|  |     } | ||||||
|     if (!this.onDemandPollingEnabled) { |     if (!this.onDemandPollingEnabled) { | ||||||
|       const accelerations = await this.$fetchAccelerations(); |       const accelerations = await this.$fetchAccelerations(); | ||||||
|       if (accelerations) { |       if (accelerations) { | ||||||
|         this._accelerations = accelerations; |         const latestAccelerations = {}; | ||||||
|  |         for (const acc of accelerations) { | ||||||
|  |           latestAccelerations[acc.txid] = acc; | ||||||
|  |         } | ||||||
|  |         this._accelerations = latestAccelerations; | ||||||
|         return this._accelerations; |         return this._accelerations; | ||||||
|       } |       } | ||||||
|     } else { |     } else { | ||||||
| @ -85,7 +101,7 @@ class AccelerationApi { | |||||||
|     return null; |     return null; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   private async $updateAccelerationsOnDemand(): Promise<Acceleration[] | null> { |   private async $updateAccelerationsOnDemand(): Promise<Record<string, Acceleration> | null> { | ||||||
|     const shouldUpdate = this.forcePoll |     const shouldUpdate = this.forcePoll | ||||||
|       || this.countMyAccelerationsWithStatus('requested') > 0 |       || this.countMyAccelerationsWithStatus('requested') > 0 | ||||||
|       || (this.countMyAccelerationsWithStatus('accelerating') > 0 && this.lastPoll < (Date.now() - (10 * 60 * 1000))); |       || (this.countMyAccelerationsWithStatus('accelerating') > 0 && this.lastPoll < (Date.now() - (10 * 60 * 1000))); | ||||||
| @ -120,7 +136,11 @@ class AccelerationApi { | |||||||
|       } |       } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     this._accelerations = Object.values(this.myAccelerations).map(({ acceleration }) => acceleration).filter(acc => acc) as Acceleration[]; |     const latestAccelerations = {}; | ||||||
|  |     for (const acc of Object.values(this.myAccelerations).map(({ acceleration }) => acceleration).filter(acc => acc) as Acceleration[]) { | ||||||
|  |       latestAccelerations[acc.txid] = acc; | ||||||
|  |     } | ||||||
|  |     this._accelerations = latestAccelerations; | ||||||
|     return this._accelerations; |     return this._accelerations; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
| @ -152,6 +172,110 @@ class AccelerationApi { | |||||||
|     } |     } | ||||||
|     return anyAccelerated; |     return anyAccelerated; | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   // get a list of accelerations that have changed between two sets of accelerations
 | ||||||
|  |   public getAccelerationDelta(oldAccelerationMap: Record<string, Acceleration>, newAccelerationMap: Record<string, Acceleration>): string[] { | ||||||
|  |     const changed: string[] = []; | ||||||
|  |     const mempoolCache = mempool.getMempool(); | ||||||
|  | 
 | ||||||
|  |     for (const acceleration of Object.values(newAccelerationMap)) { | ||||||
|  |       // skip transactions we don't know about
 | ||||||
|  |       if (!mempoolCache[acceleration.txid]) { | ||||||
|  |         continue; | ||||||
|  |       } | ||||||
|  |       if (oldAccelerationMap[acceleration.txid] == null) { | ||||||
|  |         // new acceleration
 | ||||||
|  |         changed.push(acceleration.txid); | ||||||
|  |       } else { | ||||||
|  |         if (oldAccelerationMap[acceleration.txid].feeDelta !== acceleration.feeDelta) { | ||||||
|  |           // feeDelta changed
 | ||||||
|  |           changed.push(acceleration.txid); | ||||||
|  |         } else if (oldAccelerationMap[acceleration.txid].pools?.length) { | ||||||
|  |           let poolsChanged = false; | ||||||
|  |           const pools = new Set(); | ||||||
|  |             oldAccelerationMap[acceleration.txid].pools.forEach(pool => { | ||||||
|  |             pools.add(pool); | ||||||
|  |           }); | ||||||
|  |           acceleration.pools.forEach(pool => { | ||||||
|  |             if (!pools.has(pool)) { | ||||||
|  |               poolsChanged = true; | ||||||
|  |             } else { | ||||||
|  |               pools.delete(pool); | ||||||
|  |             } | ||||||
|  |           }); | ||||||
|  |           if (pools.size > 0) { | ||||||
|  |             poolsChanged = true; | ||||||
|  |           } | ||||||
|  |           if (poolsChanged) { | ||||||
|  |             // pools changed
 | ||||||
|  |             changed.push(acceleration.txid); | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     for (const oldTxid of Object.keys(oldAccelerationMap)) { | ||||||
|  |       if (!newAccelerationMap[oldTxid]) { | ||||||
|  |         // removed
 | ||||||
|  |         changed.push(oldTxid); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return changed; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   private handleWebsocketMessage(msg: any): void { | ||||||
|  |     if (msg?.accelerations !== null) { | ||||||
|  |       const latestAccelerations = {}; | ||||||
|  |       for (const acc of msg?.accelerations || []) { | ||||||
|  |         latestAccelerations[acc.txid] = acc; | ||||||
|  |       } | ||||||
|  |       this._accelerations = latestAccelerations; | ||||||
|  |       websocketHandler.handleAccelerationsChanged(this._accelerations); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   public async connectWebsocket(): Promise<void> { | ||||||
|  |     if (this.startedWebsocketLoop) { | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |     while (this.useWebsocket) { | ||||||
|  |       this.startedWebsocketLoop = true; | ||||||
|  |       if (!this.ws) { | ||||||
|  |         this.ws = new WebSocket(`${config.MEMPOOL_SERVICES.API.replace('https://', 'ws://').replace('http://', 'ws://')}/accelerator/ws`); | ||||||
|  |         this.websocketConnected = true; | ||||||
|  | 
 | ||||||
|  |         this.ws.on('open', () => { | ||||||
|  |           logger.info('Acceleration websocket opened'); | ||||||
|  |           this.ws?.send(JSON.stringify({ | ||||||
|  |             'watch-accelerations': true | ||||||
|  |           })); | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         this.ws.on('error', (error) => { | ||||||
|  |           logger.err('Acceleration websocket error: ' + error); | ||||||
|  |           this.ws = null; | ||||||
|  |           this.websocketConnected = false; | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         this.ws.on('close', () => { | ||||||
|  |           logger.info('Acceleration websocket closed'); | ||||||
|  |           this.ws = null; | ||||||
|  |           this.websocketConnected = false; | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         this.ws.on('message', (data, isBinary) => { | ||||||
|  |           try { | ||||||
|  |             const parsedMsg = JSON.parse((isBinary ? data : data.toString()) as string); | ||||||
|  |             this.handleWebsocketMessage(parsedMsg); | ||||||
|  |           } catch (e) { | ||||||
|  |             logger.warn('Failed to parse acceleration websocket message: ' + (e instanceof Error ? e.message : e)); | ||||||
|  |           } | ||||||
|  |         }); | ||||||
|  |       } | ||||||
|  |       await new Promise(resolve => setTimeout(resolve, 5000)); | ||||||
|  |     } | ||||||
|  |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export default new AccelerationApi(); | export default new AccelerationApi(); | ||||||
| @ -22,6 +22,7 @@ import BlocksSummariesRepository from '../repositories/BlocksSummariesRepository | |||||||
| import Audit from './audit'; | import Audit from './audit'; | ||||||
| import priceUpdater from '../tasks/price-updater'; | import priceUpdater from '../tasks/price-updater'; | ||||||
| import { ApiPrice } from '../repositories/PricesRepository'; | import { ApiPrice } from '../repositories/PricesRepository'; | ||||||
|  | import { Acceleration } from './services/acceleration'; | ||||||
| import accelerationApi from './services/acceleration'; | import accelerationApi from './services/acceleration'; | ||||||
| import mempool from './mempool'; | import mempool from './mempool'; | ||||||
| import statistics from './statistics/statistics'; | import statistics from './statistics/statistics'; | ||||||
| @ -60,6 +61,8 @@ class WebsocketHandler { | |||||||
|   private lastRbfSummary: ReplacementInfo[] | null = null; |   private lastRbfSummary: ReplacementInfo[] | null = null; | ||||||
|   private mempoolSequence: number = 0; |   private mempoolSequence: number = 0; | ||||||
| 
 | 
 | ||||||
|  |   private accelerations: Record<string, Acceleration> = {}; | ||||||
|  | 
 | ||||||
|   constructor() { } |   constructor() { } | ||||||
| 
 | 
 | ||||||
|   addWebsocketServer(wss: WebSocket.Server) { |   addWebsocketServer(wss: WebSocket.Server) { | ||||||
| @ -495,6 +498,42 @@ class WebsocketHandler { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   handleAccelerationsChanged(accelerations: Record<string, Acceleration>): void { | ||||||
|  |     if (!this.webSocketServers.length) { | ||||||
|  |       throw new Error('No WebSocket.Server has been set'); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     const websocketAccelerationDelta = accelerationApi.getAccelerationDelta(this.accelerations, accelerations); | ||||||
|  |     this.accelerations = accelerations; | ||||||
|  | 
 | ||||||
|  |     if (!websocketAccelerationDelta.length) { | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // pre-compute acceleration delta
 | ||||||
|  |     const accelerationUpdate = { | ||||||
|  |       added: websocketAccelerationDelta.map(txid => accelerations[txid]).filter(acc => acc != null), | ||||||
|  |       removed: websocketAccelerationDelta.filter(txid => !accelerations[txid]), | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     try { | ||||||
|  |       const response = JSON.stringify({ | ||||||
|  |         accelerations: accelerationUpdate, | ||||||
|  |       }); | ||||||
|  | 
 | ||||||
|  |       for (const server of this.webSocketServers) { | ||||||
|  |         server.clients.forEach((client) => { | ||||||
|  |           if (client.readyState !== WebSocket.OPEN) { | ||||||
|  |             return; | ||||||
|  |           } | ||||||
|  |           client.send(response); | ||||||
|  |         }); | ||||||
|  |       } | ||||||
|  |     } catch (e) { | ||||||
|  |       logger.debug(`Error sending acceleration update to websocket clients: ${e}`); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   handleReorg(): void { |   handleReorg(): void { | ||||||
|     if (!this.webSocketServers.length) { |     if (!this.webSocketServers.length) { | ||||||
|       throw new Error('No WebSocket.Server have been set'); |       throw new Error('No WebSocket.Server have been set'); | ||||||
| @ -571,7 +610,7 @@ class WebsocketHandler { | |||||||
|     const vBytesPerSecond = memPool.getVBytesPerSecond(); |     const vBytesPerSecond = memPool.getVBytesPerSecond(); | ||||||
|     const rbfTransactions = Common.findRbfTransactions(newTransactions, recentlyDeletedTransactions.flat()); |     const rbfTransactions = Common.findRbfTransactions(newTransactions, recentlyDeletedTransactions.flat()); | ||||||
|     const da = difficultyAdjustment.getDifficultyAdjustment(); |     const da = difficultyAdjustment.getDifficultyAdjustment(); | ||||||
|     const accelerations = memPool.getAccelerations(); |     const accelerations = accelerationApi.getAccelerations(); | ||||||
|     memPool.handleRbfTransactions(rbfTransactions); |     memPool.handleRbfTransactions(rbfTransactions); | ||||||
|     const rbfChanges = rbfCache.getRbfChanges(); |     const rbfChanges = rbfCache.getRbfChanges(); | ||||||
|     let rbfReplacements; |     let rbfReplacements; | ||||||
| @ -679,10 +718,13 @@ class WebsocketHandler { | |||||||
|     const addressCache = this.makeAddressCache(newTransactions); |     const addressCache = this.makeAddressCache(newTransactions); | ||||||
|     const removedAddressCache = this.makeAddressCache(deletedTransactions); |     const removedAddressCache = this.makeAddressCache(deletedTransactions); | ||||||
| 
 | 
 | ||||||
|  |     const websocketAccelerationDelta = accelerationApi.getAccelerationDelta(this.accelerations, accelerations); | ||||||
|  |     this.accelerations = accelerations; | ||||||
|  | 
 | ||||||
|     // pre-compute acceleration delta
 |     // pre-compute acceleration delta
 | ||||||
|     const accelerationUpdate = { |     const accelerationUpdate = { | ||||||
|       added: accelerationDelta.map(txid => accelerations[txid]).filter(acc => acc != null), |       added: websocketAccelerationDelta.map(txid => accelerations[txid]).filter(acc => acc != null), | ||||||
|       removed: accelerationDelta.filter(txid => !accelerations[txid]), |       removed: websocketAccelerationDelta.filter(txid => !accelerations[txid]), | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     // TODO - Fix indentation after PR is merged
 |     // TODO - Fix indentation after PR is merged
 | ||||||
|  | |||||||
| @ -233,11 +233,11 @@ class Server { | |||||||
|       const newMempool = await bitcoinApi.$getRawMempool(); |       const newMempool = await bitcoinApi.$getRawMempool(); | ||||||
|       const minFeeMempool = memPool.limitGBT ? await bitcoinSecondClient.getRawMemPool() : null; |       const minFeeMempool = memPool.limitGBT ? await bitcoinSecondClient.getRawMemPool() : null; | ||||||
|       const minFeeTip = memPool.limitGBT ? await bitcoinSecondClient.getBlockCount() : -1; |       const minFeeTip = memPool.limitGBT ? await bitcoinSecondClient.getBlockCount() : -1; | ||||||
|       const newAccelerations = await accelerationApi.$updateAccelerations(); |       const latestAccelerations = await accelerationApi.$updateAccelerations(); | ||||||
|       const numHandledBlocks = await blocks.$updateBlocks(); |       const numHandledBlocks = await blocks.$updateBlocks(); | ||||||
|       const pollRate = config.MEMPOOL.POLL_RATE_MS * (indexer.indexerIsRunning() ? 10 : 1); |       const pollRate = config.MEMPOOL.POLL_RATE_MS * (indexer.indexerIsRunning() ? 10 : 1); | ||||||
|       if (numHandledBlocks === 0) { |       if (numHandledBlocks === 0) { | ||||||
|         await memPool.$updateMempool(newMempool, newAccelerations, minFeeMempool, minFeeTip, pollRate); |         await memPool.$updateMempool(newMempool, latestAccelerations, minFeeMempool, minFeeTip, pollRate); | ||||||
|       } |       } | ||||||
|       indexer.$run(); |       indexer.$run(); | ||||||
|       if (config.WALLETS.ENABLED) { |       if (config.WALLETS.ENABLED) { | ||||||
| @ -318,6 +318,8 @@ class Server { | |||||||
|       priceUpdater.setRatesChangedCallback(websocketHandler.handleNewConversionRates.bind(websocketHandler)); |       priceUpdater.setRatesChangedCallback(websocketHandler.handleNewConversionRates.bind(websocketHandler)); | ||||||
|     } |     } | ||||||
|     loadingIndicators.setProgressChangedCallback(websocketHandler.handleLoadingChanged.bind(websocketHandler)); |     loadingIndicators.setProgressChangedCallback(websocketHandler.handleLoadingChanged.bind(websocketHandler)); | ||||||
|  | 
 | ||||||
|  |     accelerationApi.connectWebsocket(); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   setUpHttpApiRoutes(): void { |   setUpHttpApiRoutes(): void { | ||||||
|  | |||||||
| @ -501,7 +501,7 @@ class BlocksRepository { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     query += ` ORDER BY height DESC
 |     query += ` ORDER BY height DESC
 | ||||||
|       LIMIT 10`;
 |       LIMIT 100`;
 | ||||||
| 
 | 
 | ||||||
|     try { |     try { | ||||||
|       const [rows]: any[] = await DB.query(query, params); |       const [rows]: any[] = await DB.query(query, params); | ||||||
|  | |||||||
| @ -1,15 +1,15 @@ | |||||||
| import { NgModule } from '@angular/core'; | import { NgModule } from '@angular/core'; | ||||||
| import { Routes, RouterModule } from '@angular/router'; | import { Routes, RouterModule } from '@angular/router'; | ||||||
| import { AppPreloadingStrategy } from './app.preloading-strategy' | import { AppPreloadingStrategy } from '@app/app.preloading-strategy' | ||||||
| import { BlockViewComponent } from './components/block-view/block-view.component'; | import { BlockViewComponent } from '@components/block-view/block-view.component'; | ||||||
| import { EightBlocksComponent } from './components/eight-blocks/eight-blocks.component'; | import { EightBlocksComponent } from '@components/eight-blocks/eight-blocks.component'; | ||||||
| import { MempoolBlockViewComponent } from './components/mempool-block-view/mempool-block-view.component'; | import { MempoolBlockViewComponent } from '@components/mempool-block-view/mempool-block-view.component'; | ||||||
| import { ClockComponent } from './components/clock/clock.component'; | import { ClockComponent } from '@components/clock/clock.component'; | ||||||
| import { StatusViewComponent } from './components/status-view/status-view.component'; | import { StatusViewComponent } from '@components/status-view/status-view.component'; | ||||||
| import { AddressGroupComponent } from './components/address-group/address-group.component'; | import { AddressGroupComponent } from '@components/address-group/address-group.component'; | ||||||
| import { TrackerComponent } from './components/tracker/tracker.component'; | import { TrackerComponent } from '@components/tracker/tracker.component'; | ||||||
| import { AccelerateCheckout } from './components/accelerate-checkout/accelerate-checkout.component'; | import { AccelerateCheckout } from '@components/accelerate-checkout/accelerate-checkout.component'; | ||||||
| import { TrackerGuard } from './route-guards'; | import { TrackerGuard } from '@app/route-guards'; | ||||||
| 
 | 
 | ||||||
| const browserWindow = window || {}; | const browserWindow = window || {}; | ||||||
| // @ts-ignore
 | // @ts-ignore
 | ||||||
| @ -22,12 +22,12 @@ let routes: Routes = [ | |||||||
|       { |       { | ||||||
|         path: '', |         path: '', | ||||||
|         pathMatch: 'full', |         pathMatch: 'full', | ||||||
|         loadChildren: () => import('./bitcoin-graphs.module').then(m => m.BitcoinGraphsModule), |         loadChildren: () => import('@app/bitcoin-graphs.module').then(m => m.BitcoinGraphsModule), | ||||||
|         data: { preload: true }, |         data: { preload: true }, | ||||||
|       }, |       }, | ||||||
|       { |       { | ||||||
|         path: '', |         path: '', | ||||||
|         loadChildren: () => import('./master-page.module').then(m => m.MasterPageModule), |         loadChildren: () => import('@app/master-page.module').then(m => m.MasterPageModule), | ||||||
|         data: { preload: true }, |         data: { preload: true }, | ||||||
|       }, |       }, | ||||||
|       { |       { | ||||||
| @ -45,7 +45,7 @@ let routes: Routes = [ | |||||||
|       }, |       }, | ||||||
|       { |       { | ||||||
|         path: '', |         path: '', | ||||||
|         loadChildren: () => import('./bitcoin-graphs.module').then(m => m.BitcoinGraphsModule), |         loadChildren: () => import('@app/bitcoin-graphs.module').then(m => m.BitcoinGraphsModule), | ||||||
|         data: { preload: true }, |         data: { preload: true }, | ||||||
|       }, |       }, | ||||||
|       { |       { | ||||||
| @ -60,12 +60,12 @@ let routes: Routes = [ | |||||||
|       { |       { | ||||||
|         path: '', |         path: '', | ||||||
|         pathMatch: 'full', |         pathMatch: 'full', | ||||||
|         loadChildren: () => import('./bitcoin-graphs.module').then(m => m.BitcoinGraphsModule), |         loadChildren: () => import('@app/bitcoin-graphs.module').then(m => m.BitcoinGraphsModule), | ||||||
|         data: { preload: true }, |         data: { preload: true }, | ||||||
|       }, |       }, | ||||||
|       { |       { | ||||||
|         path: '', |         path: '', | ||||||
|         loadChildren: () => import('./master-page.module').then(m => m.MasterPageModule), |         loadChildren: () => import('@app/master-page.module').then(m => m.MasterPageModule), | ||||||
|         data: { preload: true }, |         data: { preload: true }, | ||||||
|       }, |       }, | ||||||
|       { |       { | ||||||
| @ -83,7 +83,7 @@ let routes: Routes = [ | |||||||
|       }, |       }, | ||||||
|       { |       { | ||||||
|         path: '', |         path: '', | ||||||
|         loadChildren: () => import('./bitcoin-graphs.module').then(m => m.BitcoinGraphsModule), |         loadChildren: () => import('@app/bitcoin-graphs.module').then(m => m.BitcoinGraphsModule), | ||||||
|         data: { preload: true }, |         data: { preload: true }, | ||||||
|       }, |       }, | ||||||
|       { |       { | ||||||
| @ -103,12 +103,12 @@ let routes: Routes = [ | |||||||
|       { |       { | ||||||
|         path: '', |         path: '', | ||||||
|         pathMatch: 'full', |         pathMatch: 'full', | ||||||
|         loadChildren: () => import('./bitcoin-graphs.module').then(m => m.BitcoinGraphsModule), |         loadChildren: () => import('@app/bitcoin-graphs.module').then(m => m.BitcoinGraphsModule), | ||||||
|         data: { preload: true }, |         data: { preload: true }, | ||||||
|       }, |       }, | ||||||
|       { |       { | ||||||
|         path: '', |         path: '', | ||||||
|         loadChildren: () => import('./master-page.module').then(m => m.MasterPageModule), |         loadChildren: () => import('@app/master-page.module').then(m => m.MasterPageModule), | ||||||
|         data: { preload: true }, |         data: { preload: true }, | ||||||
|       }, |       }, | ||||||
|       { |       { | ||||||
| @ -126,7 +126,7 @@ let routes: Routes = [ | |||||||
|       }, |       }, | ||||||
|       { |       { | ||||||
|         path: '', |         path: '', | ||||||
|         loadChildren: () => import('./bitcoin-graphs.module').then(m => m.BitcoinGraphsModule), |         loadChildren: () => import('@app/bitcoin-graphs.module').then(m => m.BitcoinGraphsModule), | ||||||
|         data: { preload: true }, |         data: { preload: true }, | ||||||
|       }, |       }, | ||||||
|       { |       { | ||||||
| @ -138,18 +138,18 @@ let routes: Routes = [ | |||||||
|   { |   { | ||||||
|     path: '', |     path: '', | ||||||
|     pathMatch: 'full', |     pathMatch: 'full', | ||||||
|     loadChildren: () => import('./bitcoin-graphs.module').then(m => m.BitcoinGraphsModule), |     loadChildren: () => import('@app/bitcoin-graphs.module').then(m => m.BitcoinGraphsModule), | ||||||
|     data: { preload: true }, |     data: { preload: true }, | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|     path: 'tx', |     path: 'tx', | ||||||
|     canMatch: [TrackerGuard], |     canMatch: [TrackerGuard], | ||||||
|     runGuardsAndResolvers: 'always', |     runGuardsAndResolvers: 'always', | ||||||
|     loadChildren: () => import('./components/tracker/tracker.module').then(m => m.TrackerModule), |     loadChildren: () => import('@components/tracker/tracker.module').then(m => m.TrackerModule), | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|     path: '', |     path: '', | ||||||
|     loadChildren: () => import('./master-page.module').then(m => m.MasterPageModule), |     loadChildren: () => import('@app/master-page.module').then(m => m.MasterPageModule), | ||||||
|     data: { preload: true }, |     data: { preload: true }, | ||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
| @ -165,19 +165,19 @@ let routes: Routes = [ | |||||||
|     children: [ |     children: [ | ||||||
|       { |       { | ||||||
|         path: '', |         path: '', | ||||||
|         loadChildren: () => import('./previews.module').then(m => m.PreviewsModule) |         loadChildren: () => import('@app/previews.module').then(m => m.PreviewsModule) | ||||||
|       }, |       }, | ||||||
|       { |       { | ||||||
|         path: 'testnet', |         path: 'testnet', | ||||||
|         loadChildren: () => import('./previews.module').then(m => m.PreviewsModule) |         loadChildren: () => import('@app/previews.module').then(m => m.PreviewsModule) | ||||||
|       }, |       }, | ||||||
|       { |       { | ||||||
|         path: 'testnet4', |         path: 'testnet4', | ||||||
|         loadChildren: () => import('./previews.module').then(m => m.PreviewsModule) |         loadChildren: () => import('@app/previews.module').then(m => m.PreviewsModule) | ||||||
|       }, |       }, | ||||||
|       { |       { | ||||||
|         path: 'signet', |         path: 'signet', | ||||||
|         loadChildren: () => import('./previews.module').then(m => m.PreviewsModule) |         loadChildren: () => import('@app/previews.module').then(m => m.PreviewsModule) | ||||||
|       }, |       }, | ||||||
|     ], |     ], | ||||||
|   }, |   }, | ||||||
| @ -212,7 +212,7 @@ let routes: Routes = [ | |||||||
|   }, |   }, | ||||||
|   { |   { | ||||||
|     path: '', |     path: '', | ||||||
|     loadChildren: () => import('./bitcoin-graphs.module').then(m => m.BitcoinGraphsModule), |     loadChildren: () => import('@app/bitcoin-graphs.module').then(m => m.BitcoinGraphsModule), | ||||||
|     data: { preload: true }, |     data: { preload: true }, | ||||||
|   }, |   }, | ||||||
| ]; | ]; | ||||||
| @ -225,12 +225,12 @@ if (browserWindowEnv && browserWindowEnv.BASE_MODULE === 'liquid') { | |||||||
|         { |         { | ||||||
|           path: '', |           path: '', | ||||||
|           pathMatch: 'full', |           pathMatch: 'full', | ||||||
|           loadChildren: () => import('./liquid/liquid-graphs.module').then(m => m.LiquidGraphsModule), |           loadChildren: () => import('@app/liquid/liquid-graphs.module').then(m => m.LiquidGraphsModule), | ||||||
|           data: { preload: true }, |           data: { preload: true }, | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|           path: '', |           path: '', | ||||||
|           loadChildren: () => import ('./liquid/liquid-master-page.module').then(m => m.LiquidMasterPageModule), |           loadChildren: () => import ('@app/liquid/liquid-master-page.module').then(m => m.LiquidMasterPageModule), | ||||||
|           data: { preload: true }, |           data: { preload: true }, | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
| @ -248,7 +248,7 @@ if (browserWindowEnv && browserWindowEnv.BASE_MODULE === 'liquid') { | |||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|           path: '', |           path: '', | ||||||
|           loadChildren: () => import('./liquid/liquid-graphs.module').then(m => m.LiquidGraphsModule), |           loadChildren: () => import('@app/liquid/liquid-graphs.module').then(m => m.LiquidGraphsModule), | ||||||
|           data: { preload: true }, |           data: { preload: true }, | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
| @ -260,12 +260,12 @@ if (browserWindowEnv && browserWindowEnv.BASE_MODULE === 'liquid') { | |||||||
|     { |     { | ||||||
|       path: '', |       path: '', | ||||||
|       pathMatch: 'full', |       pathMatch: 'full', | ||||||
|       loadChildren: () => import('./liquid/liquid-graphs.module').then(m => m.LiquidGraphsModule), |       loadChildren: () => import('@app/liquid/liquid-graphs.module').then(m => m.LiquidGraphsModule), | ||||||
|       data: { preload: true }, |       data: { preload: true }, | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       path: '', |       path: '', | ||||||
|       loadChildren: () => import ('./liquid/liquid-master-page.module').then(m => m.LiquidMasterPageModule), |       loadChildren: () => import ('@app/liquid/liquid-master-page.module').then(m => m.LiquidMasterPageModule), | ||||||
|       data: { preload: true }, |       data: { preload: true }, | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
| @ -281,11 +281,11 @@ if (browserWindowEnv && browserWindowEnv.BASE_MODULE === 'liquid') { | |||||||
|       children: [ |       children: [ | ||||||
|         { |         { | ||||||
|           path: '', |           path: '', | ||||||
|           loadChildren: () => import('./previews.module').then(m => m.PreviewsModule) |           loadChildren: () => import('@app/previews.module').then(m => m.PreviewsModule) | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|           path: 'testnet', |           path: 'testnet', | ||||||
|           loadChildren: () => import('./previews.module').then(m => m.PreviewsModule) |           loadChildren: () => import('@app/previews.module').then(m => m.PreviewsModule) | ||||||
|         }, |         }, | ||||||
|       ], |       ], | ||||||
|     }, |     }, | ||||||
| @ -296,7 +296,7 @@ if (browserWindowEnv && browserWindowEnv.BASE_MODULE === 'liquid') { | |||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       path: '', |       path: '', | ||||||
|       loadChildren: () => import('./liquid/liquid-graphs.module').then(m => m.LiquidGraphsModule), |       loadChildren: () => import('@app/liquid/liquid-graphs.module').then(m => m.LiquidGraphsModule), | ||||||
|       data: { preload: true }, |       data: { preload: true }, | ||||||
|     }, |     }, | ||||||
|   ]; |   ]; | ||||||
|  | |||||||
| @ -2,11 +2,11 @@ import { HTTP_INTERCEPTORS } from '@angular/common/http'; | |||||||
| import { NgModule } from '@angular/core'; | import { NgModule } from '@angular/core'; | ||||||
| import { ServerModule } from '@angular/platform-server'; | import { ServerModule } from '@angular/platform-server'; | ||||||
| 
 | 
 | ||||||
| import { ZONE_SERVICE } from './injection-tokens'; | import { ZONE_SERVICE } from '@app/injection-tokens'; | ||||||
| import { AppModule } from './app.module'; | import { AppModule } from './app.module'; | ||||||
| import { AppComponent } from './components/app/app.component'; | import { AppComponent } from '@components/app/app.component'; | ||||||
| import { HttpCacheInterceptor } from './services/http-cache.interceptor'; | import { HttpCacheInterceptor } from '@app/services/http-cache.interceptor'; | ||||||
| import { ZoneService } from './services/zone.service'; | import { ZoneService } from '@app/services/zone.service'; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @NgModule({ | @NgModule({ | ||||||
|  | |||||||
| @ -2,33 +2,33 @@ import { BrowserModule } from '@angular/platform-browser'; | |||||||
| import { ModuleWithProviders, NgModule } from '@angular/core'; | import { ModuleWithProviders, NgModule } from '@angular/core'; | ||||||
| import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; | import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; | ||||||
| import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; | import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; | ||||||
| import { ZONE_SERVICE } from './injection-tokens'; | import { ZONE_SERVICE } from '@app/injection-tokens'; | ||||||
| import { AppRoutingModule } from './app-routing.module'; | import { AppRoutingModule } from './app-routing.module'; | ||||||
| import { AppComponent } from './components/app/app.component'; | import { AppComponent } from '@components/app/app.component'; | ||||||
| import { ElectrsApiService } from './services/electrs-api.service'; | import { ElectrsApiService } from '@app/services/electrs-api.service'; | ||||||
| import { OrdApiService } from './services/ord-api.service'; | import { OrdApiService } from '@app/services/ord-api.service'; | ||||||
| import { StateService } from './services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { CacheService } from './services/cache.service'; | import { CacheService } from '@app/services/cache.service'; | ||||||
| import { PriceService } from './services/price.service'; | import { PriceService } from '@app/services/price.service'; | ||||||
| import { EnterpriseService } from './services/enterprise.service'; | import { EnterpriseService } from '@app/services/enterprise.service'; | ||||||
| import { WebsocketService } from './services/websocket.service'; | import { WebsocketService } from '@app/services/websocket.service'; | ||||||
| import { AudioService } from './services/audio.service'; | import { AudioService } from '@app/services/audio.service'; | ||||||
| import { PreloadService } from './services/preload.service'; | import { PreloadService } from '@app/services/preload.service'; | ||||||
| import { SeoService } from './services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { OpenGraphService } from './services/opengraph.service'; | import { OpenGraphService } from '@app/services/opengraph.service'; | ||||||
| import { ZoneService } from './services/zone-shim.service'; | import { ZoneService } from '@app/services/zone-shim.service'; | ||||||
| import { SharedModule } from './shared/shared.module'; | import { SharedModule } from '@app/shared/shared.module'; | ||||||
| import { StorageService } from './services/storage.service'; | import { StorageService } from '@app/services/storage.service'; | ||||||
| import { HttpCacheInterceptor } from './services/http-cache.interceptor'; | import { HttpCacheInterceptor } from '@app/services/http-cache.interceptor'; | ||||||
| import { LanguageService } from './services/language.service'; | import { LanguageService } from '@app/services/language.service'; | ||||||
| import { ThemeService } from './services/theme.service'; | import { ThemeService } from '@app/services/theme.service'; | ||||||
| import { TimeService } from './services/time.service'; | import { TimeService } from '@app/services/time.service'; | ||||||
| import { FiatShortenerPipe } from './shared/pipes/fiat-shortener.pipe'; | import { FiatShortenerPipe } from '@app/shared/pipes/fiat-shortener.pipe'; | ||||||
| import { FiatCurrencyPipe } from './shared/pipes/fiat-currency.pipe'; | import { FiatCurrencyPipe } from '@app/shared/pipes/fiat-currency.pipe'; | ||||||
| import { ShortenStringPipe } from './shared/pipes/shorten-string-pipe/shorten-string.pipe'; | import { ShortenStringPipe } from '@app/shared/pipes/shorten-string-pipe/shorten-string.pipe'; | ||||||
| import { CapAddressPipe } from './shared/pipes/cap-address-pipe/cap-address-pipe'; | import { CapAddressPipe } from '@app/shared/pipes/cap-address-pipe/cap-address-pipe'; | ||||||
| import { AppPreloadingStrategy } from './app.preloading-strategy'; | import { AppPreloadingStrategy } from '@app/app.preloading-strategy'; | ||||||
| import { ServicesApiServices } from './services/services-api.service'; | import { ServicesApiServices } from '@app/services/services-api.service'; | ||||||
| import { DatePipe } from '@angular/common'; | import { DatePipe } from '@angular/common'; | ||||||
| 
 | 
 | ||||||
| const providers = [ | const providers = [ | ||||||
|  | |||||||
| @ -1,13 +1,13 @@ | |||||||
| import { NgModule } from '@angular/core'; | import { NgModule } from '@angular/core'; | ||||||
| import { CommonModule } from '@angular/common'; | import { CommonModule } from '@angular/common'; | ||||||
| import { Routes, RouterModule } from '@angular/router'; | import { Routes, RouterModule } from '@angular/router'; | ||||||
| import { MasterPageComponent } from './components/master-page/master-page.component'; | import { MasterPageComponent } from '@components/master-page/master-page.component'; | ||||||
| 
 | 
 | ||||||
| const routes: Routes = [ | const routes: Routes = [ | ||||||
|   { |   { | ||||||
|     path: '', |     path: '', | ||||||
|     component: MasterPageComponent, |     component: MasterPageComponent, | ||||||
|     loadChildren: () => import('./graphs/graphs.module').then(m => m.GraphsModule), |     loadChildren: () => import('@app/graphs/graphs.module').then(m => m.GraphsModule), | ||||||
|     data: { preload: true }, |     data: { preload: true }, | ||||||
|   } |   } | ||||||
| ]; | ]; | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| import { Transaction, Vin } from './interfaces/electrs.interface'; | import { Transaction, Vin } from '@interfaces/electrs.interface'; | ||||||
| import { Hash } from './shared/sha256'; | import { Hash } from '@app/shared/sha256'; | ||||||
| 
 | 
 | ||||||
| const P2SH_P2WPKH_COST = 21 * 4; // the WU cost for the non-witness part of P2SH-P2WPKH
 | const P2SH_P2WPKH_COST = 21 * 4; // the WU cost for the non-witness part of P2SH-P2WPKH
 | ||||||
| const P2SH_P2WSH_COST  = 35 * 4; // the WU cost for the non-witness part of P2SH-P2WSH
 | const P2SH_P2WSH_COST  = 35 * 4; // the WU cost for the non-witness part of P2SH-P2WSH
 | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| import { Component, Input } from '@angular/core'; | import { Component, Input } from '@angular/core'; | ||||||
| import { EnterpriseService } from '../../services/enterprise.service'; | import { EnterpriseService } from '@app/services/enterprise.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-about-sponsors', |   selector: 'app-about-sponsors', | ||||||
|  | |||||||
| @ -1,16 +1,16 @@ | |||||||
| import { ChangeDetectionStrategy, Component, ElementRef, Inject, LOCALE_ID, OnInit, ViewChild } from '@angular/core'; | import { ChangeDetectionStrategy, Component, ElementRef, Inject, LOCALE_ID, OnInit, ViewChild } from '@angular/core'; | ||||||
| import { WebsocketService } from '../../services/websocket.service'; | import { WebsocketService } from '@app/services/websocket.service'; | ||||||
| import { SeoService } from '../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { OpenGraphService } from '../../services/opengraph.service'; | import { OpenGraphService } from '@app/services/opengraph.service'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { Observable } from 'rxjs'; | import { Observable } from 'rxjs'; | ||||||
| import { ApiService } from '../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { IBackendInfo } from '../../interfaces/websocket.interface'; | import { IBackendInfo } from '@interfaces/websocket.interface'; | ||||||
| import { Router, ActivatedRoute } from '@angular/router'; | import { Router, ActivatedRoute } from '@angular/router'; | ||||||
| import { map, share, tap } from 'rxjs/operators'; | import { map, share, tap } from 'rxjs/operators'; | ||||||
| import { ITranslators } from '../../interfaces/node-api.interface'; | import { ITranslators } from '@interfaces/node-api.interface'; | ||||||
| import { DOCUMENT } from '@angular/common'; | import { DOCUMENT } from '@angular/common'; | ||||||
| import { EnterpriseService } from '../../services/enterprise.service'; | import { EnterpriseService } from '@app/services/enterprise.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-about', |   selector: 'app-about', | ||||||
|  | |||||||
| @ -1,9 +1,9 @@ | |||||||
| import { NgModule } from '@angular/core'; | import { NgModule } from '@angular/core'; | ||||||
| import { CommonModule } from '@angular/common'; | import { CommonModule } from '@angular/common'; | ||||||
| import { Routes, RouterModule } from '@angular/router'; | import { Routes, RouterModule } from '@angular/router'; | ||||||
| import { AboutComponent } from './about.component'; | import { AboutComponent } from '@components/about/about.component'; | ||||||
| import { AboutSponsorsComponent } from './about-sponsors.component'; | import { AboutSponsorsComponent } from '@components/about/about-sponsors.component'; | ||||||
| import { SharedModule } from '../../shared/shared.module'; | import { SharedModule } from '@app/shared/shared.module'; | ||||||
| 
 | 
 | ||||||
| const routes: Routes = [ | const routes: Routes = [ | ||||||
|   { |   { | ||||||
|  | |||||||
| @ -1,16 +1,16 @@ | |||||||
| /* eslint-disable no-console */ | /* eslint-disable no-console */ | ||||||
| import { Component, OnInit, OnDestroy, Output, EventEmitter, Input, ChangeDetectorRef, SimpleChanges, HostListener } from '@angular/core'; | import { Component, OnInit, OnDestroy, Output, EventEmitter, Input, ChangeDetectorRef, SimpleChanges, HostListener } from '@angular/core'; | ||||||
| import { Subscription, tap, of, catchError, Observable, switchMap } from 'rxjs'; | import { Subscription, tap, of, catchError, Observable, switchMap } from 'rxjs'; | ||||||
| import { ServicesApiServices } from '../../services/services-api.service'; | import { ServicesApiServices } from '@app/services/services-api.service'; | ||||||
| import { md5, insecureRandomUUID } from '../../shared/common.utils'; | import { md5, insecureRandomUUID } from '@app/shared/common.utils'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { AudioService } from '../../services/audio.service'; | import { AudioService } from '@app/services/audio.service'; | ||||||
| import { ETA, EtaService } from '../../services/eta.service'; | import { ETA, EtaService } from '@app/services/eta.service'; | ||||||
| import { Transaction } from '../../interfaces/electrs.interface'; | import { Transaction } from '@interfaces/electrs.interface'; | ||||||
| import { MiningStats } from '../../services/mining.service'; | import { MiningStats } from '@app/services/mining.service'; | ||||||
| import { IAuth, AuthServiceMempool } from '../../services/auth.service'; | import { IAuth, AuthServiceMempool } from '@app/services/auth.service'; | ||||||
| import { EnterpriseService } from '../../services/enterprise.service'; | import { EnterpriseService } from '@app/services/enterprise.service'; | ||||||
| import { ApiService } from '../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { isDevMode } from '@angular/core'; | import { isDevMode } from '@angular/core'; | ||||||
| 
 | 
 | ||||||
| export type PaymentMethod = 'balance' | 'bitcoin' | 'cashapp' | 'applePay' | 'googlePay'; | export type PaymentMethod = 'balance' | 'bitcoin' | 'cashapp' | 'applePay' | 'googlePay'; | ||||||
| @ -84,13 +84,7 @@ export class AccelerateCheckout implements OnInit, OnDestroy { | |||||||
|   timePaid: number = 0; // time acceleration requested
 |   timePaid: number = 0; // time acceleration requested
 | ||||||
|   math = Math; |   math = Math; | ||||||
|   isMobile: boolean = window.innerWidth <= 767.98; |   isMobile: boolean = window.innerWidth <= 767.98; | ||||||
|   isProdDomain = ['mempool.space', |   isProdDomain = false; | ||||||
|     'mempool-staging.va1.mempool.space', |  | ||||||
|     'mempool-staging.fmt.mempool.space', |  | ||||||
|     'mempool-staging.fra.mempool.space', |  | ||||||
|     'mempool-staging.tk7.mempool.space', |  | ||||||
|     'mempool-staging.sg1.mempool.space' |  | ||||||
|    ].indexOf(document.location.hostname) > -1; |  | ||||||
| 
 | 
 | ||||||
|   private _step: CheckoutStep = 'summary'; |   private _step: CheckoutStep = 'summary'; | ||||||
|   simpleMode: boolean = true; |   simpleMode: boolean = true; | ||||||
| @ -143,6 +137,7 @@ export class AccelerateCheckout implements OnInit, OnDestroy { | |||||||
|     private authService: AuthServiceMempool, |     private authService: AuthServiceMempool, | ||||||
|     private enterpriseService: EnterpriseService, |     private enterpriseService: EnterpriseService, | ||||||
|   ) { |   ) { | ||||||
|  |     this.isProdDomain = this.stateService.env.PROD_DOMAINS.indexOf(document.location.hostname) > -1; | ||||||
|     this.accelerationUUID = insecureRandomUUID(); |     this.accelerationUUID = insecureRandomUUID(); | ||||||
| 
 | 
 | ||||||
|     // Check if Apple Pay available
 |     // Check if Apple Pay available
 | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| import { Component, Input, Output, OnChanges, EventEmitter, HostListener, OnInit, ViewChild, ElementRef, AfterViewInit, OnDestroy, ChangeDetectorRef } from '@angular/core'; | import { Component, Input, Output, OnChanges, EventEmitter, HostListener, OnInit, ViewChild, ElementRef, AfterViewInit, OnDestroy, ChangeDetectorRef } from '@angular/core'; | ||||||
| import { Transaction } from '../../interfaces/electrs.interface'; | import { Transaction } from '@interfaces/electrs.interface'; | ||||||
| import { AccelerationEstimate, RateOption } from './accelerate-checkout.component'; | import { AccelerationEstimate, RateOption } from '@components/accelerate-checkout/accelerate-checkout.component'; | ||||||
| 
 | 
 | ||||||
| interface GraphBar { | interface GraphBar { | ||||||
|   rate: number; |   rate: number; | ||||||
|  | |||||||
| @ -1,8 +1,8 @@ | |||||||
| import { Component, Input, OnInit, OnChanges, HostListener } from '@angular/core'; | import { Component, Input, OnInit, OnChanges, HostListener } from '@angular/core'; | ||||||
| import { ETA } from '../../services/eta.service'; | import { ETA } from '@app/services/eta.service'; | ||||||
| import { Transaction } from '../../interfaces/electrs.interface'; | import { Transaction } from '@interfaces/electrs.interface'; | ||||||
| import { Acceleration, SinglePoolStats } from '../../interfaces/node-api.interface'; | import { Acceleration, SinglePoolStats } from '@interfaces/node-api.interface'; | ||||||
| import { MiningService } from '../../services/mining.service'; | import { MiningService } from '@app/services/mining.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-acceleration-timeline', |   selector: 'app-acceleration-timeline', | ||||||
|  | |||||||
| @ -1,17 +1,17 @@ | |||||||
| import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, Input, LOCALE_ID, NgZone, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core'; | import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, Input, LOCALE_ID, NgZone, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core'; | ||||||
| import { echarts, EChartsOption } from '../../../graphs/echarts'; | import { echarts, EChartsOption } from '@app/graphs/echarts'; | ||||||
| import { Observable, Subject, Subscription, combineLatest, fromEvent, merge, share } from 'rxjs'; | import { Observable, Subject, Subscription, combineLatest, fromEvent, merge, share } from 'rxjs'; | ||||||
| import { startWith, switchMap, tap } from 'rxjs/operators'; | import { startWith, switchMap, tap } from 'rxjs/operators'; | ||||||
| import { SeoService } from '../../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { formatNumber } from '@angular/common'; | import { formatNumber } from '@angular/common'; | ||||||
| import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | ||||||
| import { download, formatterXAxis, formatterXAxisLabel, formatterXAxisTimeCategory } from '../../../shared/graphs.utils'; | import { download, formatterXAxis, formatterXAxisLabel, formatterXAxisTimeCategory } from '@app/shared/graphs.utils'; | ||||||
| import { StorageService } from '../../../services/storage.service'; | import { StorageService } from '@app/services/storage.service'; | ||||||
| import { MiningService } from '../../../services/mining.service'; | import { MiningService } from '@app/services/mining.service'; | ||||||
| import { ActivatedRoute } from '@angular/router'; | import { ActivatedRoute, Router } from '@angular/router'; | ||||||
| import { Acceleration } from '../../../interfaces/node-api.interface'; | import { Acceleration } from '@interfaces/node-api.interface'; | ||||||
| import { ServicesApiServices } from '../../../services/services-api.service'; | import { ServicesApiServices } from '@app/services/services-api.service'; | ||||||
| import { StateService } from '../../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-acceleration-fees-graph', |   selector: 'app-acceleration-fees-graph', | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| import { ChangeDetectionStrategy, Component, Input, OnChanges, OnInit } from '@angular/core'; | import { ChangeDetectionStrategy, Component, Input, OnChanges, OnInit } from '@angular/core'; | ||||||
| import { Observable } from 'rxjs'; | import { Observable } from 'rxjs'; | ||||||
| import { ServicesApiServices } from '../../../services/services-api.service'; | import { ServicesApiServices } from '@app/services/services-api.service'; | ||||||
| 
 | 
 | ||||||
| export type AccelerationStats = { | export type AccelerationStats = { | ||||||
|   totalRequested: number; |   totalRequested: number; | ||||||
|  | |||||||
| @ -1,12 +1,12 @@ | |||||||
| import { Component, OnInit, ChangeDetectionStrategy, Input, ChangeDetectorRef, OnDestroy, Inject, LOCALE_ID } from '@angular/core'; | import { Component, OnInit, ChangeDetectionStrategy, Input, ChangeDetectorRef, OnDestroy, Inject, LOCALE_ID } from '@angular/core'; | ||||||
| import { BehaviorSubject, Observable, Subscription, catchError, combineLatest, filter, of, switchMap, tap, throttleTime, timer } from 'rxjs'; | import { BehaviorSubject, Observable, Subscription, catchError, combineLatest, filter, of, switchMap, tap, throttleTime, timer } from 'rxjs'; | ||||||
| import { Acceleration, BlockExtended, SinglePoolStats } from '../../../interfaces/node-api.interface'; | import { Acceleration, BlockExtended, SinglePoolStats } from '@interfaces/node-api.interface'; | ||||||
| import { StateService } from '../../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { WebsocketService } from '../../../services/websocket.service'; | import { WebsocketService } from '@app/services/websocket.service'; | ||||||
| import { ServicesApiServices } from '../../../services/services-api.service'; | import { ServicesApiServices } from '@app/services/services-api.service'; | ||||||
| import { SeoService } from '../../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { ActivatedRoute, Router } from '@angular/router'; | import { ActivatedRoute, Router } from '@angular/router'; | ||||||
| import { MiningService } from '../../../services/mining.service'; | import { MiningService } from '@app/services/mining.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-accelerations-list', |   selector: 'app-accelerations-list', | ||||||
|  | |||||||
| @ -1,18 +1,18 @@ | |||||||
| import { ChangeDetectionStrategy, Component, HostListener, Inject, OnDestroy, OnInit, PLATFORM_ID } from '@angular/core'; | import { ChangeDetectionStrategy, Component, HostListener, Inject, OnDestroy, OnInit, PLATFORM_ID } from '@angular/core'; | ||||||
| import { SeoService } from '../../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { OpenGraphService } from '../../../services/opengraph.service'; | import { OpenGraphService } from '@app/services/opengraph.service'; | ||||||
| import { WebsocketService } from '../../../services/websocket.service'; | import { WebsocketService } from '@app/services/websocket.service'; | ||||||
| import { Acceleration, BlockExtended } from '../../../interfaces/node-api.interface'; | import { Acceleration, BlockExtended } from '@interfaces/node-api.interface'; | ||||||
| import { StateService } from '../../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { Observable, Subscription, catchError, combineLatest, distinctUntilChanged, map, of, share, switchMap, tap } from 'rxjs'; | import { Observable, Subscription, catchError, combineLatest, distinctUntilChanged, map, of, share, switchMap, tap } from 'rxjs'; | ||||||
| import { Color } from '../../block-overview-graph/sprite-types'; | import { Color } from '@components/block-overview-graph/sprite-types'; | ||||||
| import { hexToColor } from '../../block-overview-graph/utils'; | import { hexToColor } from '@components/block-overview-graph/utils'; | ||||||
| import TxView from '../../block-overview-graph/tx-view'; | import TxView from '@components/block-overview-graph/tx-view'; | ||||||
| import { feeLevels, defaultMempoolFeeColors, contrastMempoolFeeColors } from '../../../app.constants'; | import { feeLevels, defaultMempoolFeeColors, contrastMempoolFeeColors } from '@app/app.constants'; | ||||||
| import { ServicesApiServices } from '../../../services/services-api.service'; | import { ServicesApiServices } from '@app/services/services-api.service'; | ||||||
| import { detectWebGL } from '../../../shared/graphs.utils'; | import { detectWebGL } from '@app/shared/graphs.utils'; | ||||||
| import { AudioService } from '../../../services/audio.service'; | import { AudioService } from '@app/services/audio.service'; | ||||||
| import { ThemeService } from '../../../services/theme.service'; | import { ThemeService } from '@app/services/theme.service'; | ||||||
| 
 | 
 | ||||||
| const acceleratedColor: Color = hexToColor('8F5FF6'); | const acceleratedColor: Color = hexToColor('8F5FF6'); | ||||||
| const normalColors = defaultMempoolFeeColors.map(hex => hexToColor(hex + '5F')); | const normalColors = defaultMempoolFeeColors.map(hex => hexToColor(hex + '5F')); | ||||||
|  | |||||||
| @ -1,8 +1,8 @@ | |||||||
| import { Component, ChangeDetectionStrategy, Input, Output, OnChanges, SimpleChanges, EventEmitter, ChangeDetectorRef } from '@angular/core'; | import { Component, ChangeDetectionStrategy, Input, Output, OnChanges, SimpleChanges, EventEmitter, ChangeDetectorRef } from '@angular/core'; | ||||||
| import { Transaction } from '../../../interfaces/electrs.interface'; | import { Transaction } from '@interfaces/electrs.interface'; | ||||||
| import { Acceleration, SinglePoolStats } from '../../../interfaces/node-api.interface'; | import { Acceleration, SinglePoolStats } from '@interfaces/node-api.interface'; | ||||||
| import { EChartsOption, PieSeriesOption } from '../../../graphs/echarts'; | import { EChartsOption, PieSeriesOption } from '@app/graphs/echarts'; | ||||||
| import { MiningStats } from '../../../services/mining.service'; | import { MiningStats } from '@app/services/mining.service'; | ||||||
| 
 | 
 | ||||||
| function lighten(color, p): { r, g, b } { | function lighten(color, p): { r, g, b } { | ||||||
|   return { |   return { | ||||||
| @ -76,15 +76,21 @@ export class ActiveAccelerationBox implements OnChanges { | |||||||
|     acceleratingPools.forEach((poolId, index) => { |     acceleratingPools.forEach((poolId, index) => { | ||||||
|       const pool = pools[poolId]; |       const pool = pools[poolId]; | ||||||
|       const poolShare = ((pool.lastEstimatedHashrate / this.miningStats.lastEstimatedHashrate) * 100).toFixed(1); |       const poolShare = ((pool.lastEstimatedHashrate / this.miningStats.lastEstimatedHashrate) * 100).toFixed(1); | ||||||
|  |       let color = 'white'; | ||||||
|  |       if (index >= firstSignificantPool) { | ||||||
|  |         if (numSignificantPools > 1) { | ||||||
|  |           color = toRGB(lighten({ r: 147, g: 57, b: 244 }, 1 - (index - firstSignificantPool) / Math.max((numSignificantPools - 1), 1))); | ||||||
|  |         } else { | ||||||
|  |           color = toRGB({ r: 147, g: 57, b: 244 }); | ||||||
|  |         } | ||||||
|  |       } | ||||||
|       data.push(getDataItem( |       data.push(getDataItem( | ||||||
|         pool.lastEstimatedHashrate, |         pool.lastEstimatedHashrate, | ||||||
|         index >= firstSignificantPool |         color, | ||||||
|           ? toRGB(lighten({ r: 147, g: 57, b: 244 }, 1 - (index - firstSignificantPool) / (numSignificantPools - 1))) |  | ||||||
|           : 'white', |  | ||||||
|         `<b style="color: white">${pool.name} (${poolShare}%)</b>`, |         `<b style="color: white">${pool.name} (${poolShare}%)</b>`, | ||||||
|         true, |         true, | ||||||
|       ) as PieSeriesOption); |       ) as PieSeriesOption); | ||||||
|     }) |     }); | ||||||
|     this.acceleratedByPercentage = ((totalAcceleratedHashrate / this.miningStats.lastEstimatedHashrate) * 100).toFixed(1) + '%'; |     this.acceleratedByPercentage = ((totalAcceleratedHashrate / this.miningStats.lastEstimatedHashrate) * 100).toFixed(1) + '%'; | ||||||
|     const notAcceleratedByPercentage = ((1 - (totalAcceleratedHashrate / this.miningStats.lastEstimatedHashrate)) * 100).toFixed(1) + '%'; |     const notAcceleratedByPercentage = ((1 - (totalAcceleratedHashrate / this.miningStats.lastEstimatedHashrate)) * 100).toFixed(1) + '%'; | ||||||
|     data.push(getDataItem( |     data.push(getDataItem( | ||||||
|  | |||||||
| @ -1,9 +1,9 @@ | |||||||
| import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; | import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; | ||||||
| import { Observable, of } from 'rxjs'; | import { Observable, of } from 'rxjs'; | ||||||
| import { switchMap } from 'rxjs/operators'; | import { switchMap } from 'rxjs/operators'; | ||||||
| import { Acceleration } from '../../../interfaces/node-api.interface'; | import { Acceleration } from '@interfaces/node-api.interface'; | ||||||
| import { StateService } from '../../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { WebsocketService } from '../../../services/websocket.service'; | import { WebsocketService } from '@app/services/websocket.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-pending-stats', |   selector: 'app-pending-stats', | ||||||
|  | |||||||
| @ -1,16 +1,16 @@ | |||||||
| import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, Input, LOCALE_ID, NgZone, OnChanges, OnDestroy, SimpleChanges } from '@angular/core'; | import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, Input, LOCALE_ID, NgZone, OnChanges, OnDestroy, SimpleChanges } from '@angular/core'; | ||||||
| import { echarts, EChartsOption } from '../../graphs/echarts'; | import { echarts, EChartsOption } from '@app/graphs/echarts'; | ||||||
| import { BehaviorSubject, Observable, Subscription, combineLatest, of } from 'rxjs'; | import { BehaviorSubject, Observable, Subscription, combineLatest, of } from 'rxjs'; | ||||||
| import { catchError, map, switchMap, tap } from 'rxjs/operators'; | import { catchError, map, switchMap, tap } from 'rxjs/operators'; | ||||||
| import { AddressTxSummary, ChainStats } from '../../interfaces/electrs.interface'; | import { AddressTxSummary, ChainStats } from '@interfaces/electrs.interface'; | ||||||
| import { ElectrsApiService } from '../../services/electrs-api.service'; | import { ElectrsApiService } from '@app/services/electrs-api.service'; | ||||||
| import { AmountShortenerPipe } from '../../shared/pipes/amount-shortener.pipe'; | import { AmountShortenerPipe } from '@app/shared/pipes/amount-shortener.pipe'; | ||||||
| import { Router } from '@angular/router'; | import { Router } from '@angular/router'; | ||||||
| import { RelativeUrlPipe } from '../../shared/pipes/relative-url/relative-url.pipe'; | import { RelativeUrlPipe } from '@app/shared/pipes/relative-url/relative-url.pipe'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { PriceService } from '../../services/price.service'; | import { PriceService } from '@app/services/price.service'; | ||||||
| import { FiatCurrencyPipe } from '../../shared/pipes/fiat-currency.pipe'; | import { FiatCurrencyPipe } from '@app/shared/pipes/fiat-currency.pipe'; | ||||||
| import { FiatShortenerPipe } from '../../shared/pipes/fiat-shortener.pipe'; | import { FiatShortenerPipe } from '@app/shared/pipes/fiat-shortener.pipe'; | ||||||
| 
 | 
 | ||||||
| const periodSeconds = { | const periodSeconds = { | ||||||
|   '1d': (60 * 60 * 24), |   '1d': (60 * 60 * 24), | ||||||
|  | |||||||
| @ -1,15 +1,15 @@ | |||||||
| import { Component, OnInit, OnDestroy, ChangeDetectorRef, HostListener } from '@angular/core'; | import { Component, OnInit, OnDestroy, ChangeDetectorRef, HostListener } from '@angular/core'; | ||||||
| import { ActivatedRoute, ParamMap } from '@angular/router'; | import { ActivatedRoute, ParamMap } from '@angular/router'; | ||||||
| import { ElectrsApiService } from '../../services/electrs-api.service'; | import { ElectrsApiService } from '@app/services/electrs-api.service'; | ||||||
| import { switchMap, catchError } from 'rxjs/operators'; | import { switchMap, catchError } from 'rxjs/operators'; | ||||||
| import { Address, Transaction } from '../../interfaces/electrs.interface'; | import { Address, Transaction } from '@interfaces/electrs.interface'; | ||||||
| import { WebsocketService } from '../../services/websocket.service'; | import { WebsocketService } from '@app/services/websocket.service'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { AudioService } from '../../services/audio.service'; | import { AudioService } from '@app/services/audio.service'; | ||||||
| import { ApiService } from '../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { of, Subscription, forkJoin } from 'rxjs'; | import { of, Subscription, forkJoin } from 'rxjs'; | ||||||
| import { SeoService } from '../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { AddressInformation } from '../../interfaces/node-api.interface'; | import { AddressInformation } from '@interfaces/node-api.interface'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-address-group', |   selector: 'app-address-group', | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| import { Component, ChangeDetectionStrategy, Input, OnChanges } from '@angular/core'; | import { Component, ChangeDetectionStrategy, Input, OnChanges } from '@angular/core'; | ||||||
| import { Vin, Vout } from '../../interfaces/electrs.interface'; | import { Vin, Vout } from '@interfaces/electrs.interface'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { AddressType, AddressTypeInfo } from '../../shared/address-utils'; | import { AddressType, AddressTypeInfo } from '@app/shared/address-utils'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-address-labels', |   selector: 'app-address-labels', | ||||||
|  | |||||||
| @ -1,9 +1,9 @@ | |||||||
| import { Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core'; | import { Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges } from '@angular/core'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { Address, AddressTxSummary } from '../../interfaces/electrs.interface'; | import { Address, AddressTxSummary } from '@interfaces/electrs.interface'; | ||||||
| import { ElectrsApiService } from '../../services/electrs-api.service'; | import { ElectrsApiService } from '@app/services/electrs-api.service'; | ||||||
| import { Observable, Subscription, catchError, map, of, switchMap, zip } from 'rxjs'; | import { Observable, Subscription, catchError, map, of, switchMap, zip } from 'rxjs'; | ||||||
| import { PriceService } from '../../services/price.service'; | import { PriceService } from '@app/services/price.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-address-transactions-widget', |   selector: 'app-address-transactions-widget', | ||||||
|  | |||||||
| @ -1,16 +1,16 @@ | |||||||
| import { Component, OnInit, OnDestroy } from '@angular/core'; | import { Component, OnInit, OnDestroy } from '@angular/core'; | ||||||
| import { ActivatedRoute, ParamMap } from '@angular/router'; | import { ActivatedRoute, ParamMap } from '@angular/router'; | ||||||
| import { ElectrsApiService } from '../../services/electrs-api.service'; | import { ElectrsApiService } from '@app/services/electrs-api.service'; | ||||||
| import { switchMap, filter, catchError, map, tap } from 'rxjs/operators'; | import { switchMap, filter, catchError, map, tap } from 'rxjs/operators'; | ||||||
| import { Address, Transaction } from '../../interfaces/electrs.interface'; | import { Address, Transaction } from '@interfaces/electrs.interface'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { OpenGraphService } from '../../services/opengraph.service'; | import { OpenGraphService } from '@app/services/opengraph.service'; | ||||||
| import { AudioService } from '../../services/audio.service'; | import { AudioService } from '@app/services/audio.service'; | ||||||
| import { ApiService } from '../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { of, merge, Subscription, Observable } from 'rxjs'; | import { of, merge, Subscription, Observable } from 'rxjs'; | ||||||
| import { SeoService } from '../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { seoDescriptionNetwork } from '../../shared/common.utils'; | import { seoDescriptionNetwork } from '@app/shared/common.utils'; | ||||||
| import { AddressInformation } from '../../interfaces/node-api.interface'; | import { AddressInformation } from '@interfaces/node-api.interface'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-address-preview', |   selector: 'app-address-preview', | ||||||
|  | |||||||
| @ -1,17 +1,17 @@ | |||||||
| import { Component, OnInit, OnDestroy, HostListener } from '@angular/core'; | import { Component, OnInit, OnDestroy, HostListener } from '@angular/core'; | ||||||
| import { ActivatedRoute, ParamMap } from '@angular/router'; | import { ActivatedRoute, ParamMap } from '@angular/router'; | ||||||
| import { ElectrsApiService } from '../../services/electrs-api.service'; | import { ElectrsApiService } from '@app/services/electrs-api.service'; | ||||||
| import { switchMap, filter, catchError, map, tap } from 'rxjs/operators'; | import { switchMap, filter, catchError, map, tap } from 'rxjs/operators'; | ||||||
| import { Address, ChainStats, Transaction, Utxo, Vin } from '../../interfaces/electrs.interface'; | import { Address, ChainStats, Transaction, Utxo, Vin } from '@interfaces/electrs.interface'; | ||||||
| import { WebsocketService } from '../../services/websocket.service'; | import { WebsocketService } from '@app/services/websocket.service'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { AudioService } from '../../services/audio.service'; | import { AudioService } from '@app/services/audio.service'; | ||||||
| import { ApiService } from '../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { of, merge, Subscription, Observable, forkJoin } from 'rxjs'; | import { of, merge, Subscription, Observable, forkJoin } from 'rxjs'; | ||||||
| import { SeoService } from '../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { seoDescriptionNetwork } from '../../shared/common.utils'; | import { seoDescriptionNetwork } from '@app/shared/common.utils'; | ||||||
| import { AddressInformation } from '../../interfaces/node-api.interface'; | import { AddressInformation } from '@interfaces/node-api.interface'; | ||||||
| import { AddressTypeInfo } from '../../shared/address-utils'; | import { AddressTypeInfo } from '@app/shared/address-utils'; | ||||||
| 
 | 
 | ||||||
| class AddressStats implements ChainStats { | class AddressStats implements ChainStats { | ||||||
|   address: string; |   address: string; | ||||||
|  | |||||||
| @ -1,12 +1,12 @@ | |||||||
| import { ChangeDetectionStrategy, Component, Inject, Input, LOCALE_ID, NgZone, OnChanges } from '@angular/core'; | import { ChangeDetectionStrategy, Component, Inject, Input, LOCALE_ID, NgZone, OnChanges } from '@angular/core'; | ||||||
| import { Router } from '@angular/router'; | import { Router } from '@angular/router'; | ||||||
| import { EChartsOption, TreemapSeriesOption } from '../../graphs/echarts'; | import { EChartsOption, TreemapSeriesOption } from '@app/graphs/echarts'; | ||||||
| import { lerpColor } from '../../shared/graphs.utils'; | import { lerpColor } from '@app/shared/graphs.utils'; | ||||||
| import { AmountShortenerPipe } from '../../shared/pipes/amount-shortener.pipe'; | import { AmountShortenerPipe } from '@app/shared/pipes/amount-shortener.pipe'; | ||||||
| import { LightningApiService } from '../../lightning/lightning-api.service'; | import { LightningApiService } from '@app/lightning/lightning-api.service'; | ||||||
| import { RelativeUrlPipe } from '../../shared/pipes/relative-url/relative-url.pipe'; | import { RelativeUrlPipe } from '@app/shared/pipes/relative-url/relative-url.pipe'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { Address } from '../../interfaces/electrs.interface'; | import { Address } from '@interfaces/electrs.interface'; | ||||||
| import { formatNumber } from '@angular/common'; | import { formatNumber } from '@angular/common'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; | import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; | ||||||
| import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | ||||||
| import { StorageService } from '../../services/storage.service'; | import { StorageService } from '@app/services/storage.service'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-amount-selector', |   selector: 'app-amount-selector', | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| import { Component, OnInit, OnDestroy, Input, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core'; | import { Component, OnInit, OnDestroy, Input, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { Observable, Subscription } from 'rxjs'; | import { Observable, Subscription } from 'rxjs'; | ||||||
| import { Price } from '../../services/price.service'; | import { Price } from '@app/services/price.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-amount', |   selector: 'app-amount', | ||||||
|  | |||||||
| @ -1,11 +1,11 @@ | |||||||
| import { Location } from '@angular/common'; | import { Location } from '@angular/common'; | ||||||
| import { Component, HostListener, OnInit, Inject, LOCALE_ID, HostBinding } from '@angular/core'; | import { Component, HostListener, OnInit, Inject, LOCALE_ID, HostBinding } from '@angular/core'; | ||||||
| import { Router, NavigationEnd } from '@angular/router'; | import { Router, NavigationEnd } from '@angular/router'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { OpenGraphService } from '../../services/opengraph.service'; | import { OpenGraphService } from '@app/services/opengraph.service'; | ||||||
| import { NgbTooltipConfig } from '@ng-bootstrap/ng-bootstrap'; | import { NgbTooltipConfig } from '@ng-bootstrap/ng-bootstrap'; | ||||||
| import { ThemeService } from '../../services/theme.service'; | import { ThemeService } from '@app/services/theme.service'; | ||||||
| import { SeoService } from '../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-root', |   selector: 'app-root', | ||||||
|  | |||||||
| @ -1,10 +1,10 @@ | |||||||
| import { ChangeDetectionStrategy, Component, Inject, Input, LOCALE_ID, OnInit } from '@angular/core'; | import { ChangeDetectionStrategy, Component, Inject, Input, LOCALE_ID, OnInit } from '@angular/core'; | ||||||
| import { combineLatest, Observable } from 'rxjs'; | import { combineLatest, Observable } from 'rxjs'; | ||||||
| import { map } from 'rxjs/operators'; | import { map } from 'rxjs/operators'; | ||||||
| import { moveDec } from '../../bitcoin.utils'; | import { moveDec } from '@app/bitcoin.utils'; | ||||||
| import { AssetsService } from '../../services/assets.service'; | import { AssetsService } from '@app/services/assets.service'; | ||||||
| import { ElectrsApiService } from '../../services/electrs-api.service'; | import { ElectrsApiService } from '@app/services/electrs-api.service'; | ||||||
| import { environment } from '../../../environments/environment'; | import { environment } from '@environments/environment'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-asset-circulation', |   selector: 'app-asset-circulation', | ||||||
|  | |||||||
| @ -1,17 +1,17 @@ | |||||||
| import { Component, OnInit, OnDestroy } from '@angular/core'; | import { Component, OnInit, OnDestroy } from '@angular/core'; | ||||||
| import { ActivatedRoute, ParamMap } from '@angular/router'; | import { ActivatedRoute, ParamMap } from '@angular/router'; | ||||||
| import { ElectrsApiService } from '../../services/electrs-api.service'; | import { ElectrsApiService } from '@app/services/electrs-api.service'; | ||||||
| import { switchMap, filter, catchError, take } from 'rxjs/operators'; | import { switchMap, filter, catchError, take } from 'rxjs/operators'; | ||||||
| import { Asset, Transaction } from '../../interfaces/electrs.interface'; | import { Asset, Transaction } from '@interfaces/electrs.interface'; | ||||||
| import { WebsocketService } from '../../services/websocket.service'; | import { WebsocketService } from '@app/services/websocket.service'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { AudioService } from '../../services/audio.service'; | import { AudioService } from '@app/services/audio.service'; | ||||||
| import { ApiService } from '../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { of, merge, Subscription, combineLatest } from 'rxjs'; | import { of, merge, Subscription, combineLatest } from 'rxjs'; | ||||||
| import { SeoService } from '../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { environment } from '../../../environments/environment'; | import { environment } from '@environments/environment'; | ||||||
| import { AssetsService } from '../../services/assets.service'; | import { AssetsService } from '@app/services/assets.service'; | ||||||
| import { moveDec } from '../../bitcoin.utils'; | import { moveDec } from '@app/bitcoin.utils'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-asset', |   selector: 'app-asset', | ||||||
|  | |||||||
| @ -2,8 +2,8 @@ import { Component, OnInit } from '@angular/core'; | |||||||
| import { ActivatedRoute, ParamMap } from '@angular/router'; | import { ActivatedRoute, ParamMap } from '@angular/router'; | ||||||
| import { combineLatest, Observable } from 'rxjs'; | import { combineLatest, Observable } from 'rxjs'; | ||||||
| import { map, switchMap } from 'rxjs/operators'; | import { map, switchMap } from 'rxjs/operators'; | ||||||
| import { ApiService } from '../../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { AssetsService } from '../../../services/assets.service'; | import { AssetsService } from '@app/services/assets.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-asset-group', |   selector: 'app-asset-group', | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| import { Component, OnInit } from '@angular/core'; | import { Component, OnInit } from '@angular/core'; | ||||||
| import { Observable } from 'rxjs'; | import { Observable } from 'rxjs'; | ||||||
| import { ApiService } from '../../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { StateService } from '../../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-assets-featured', |   selector: 'app-assets-featured', | ||||||
|  | |||||||
| @ -4,12 +4,12 @@ import { Router } from '@angular/router'; | |||||||
| import { NgbTypeahead } from '@ng-bootstrap/ng-bootstrap'; | import { NgbTypeahead } from '@ng-bootstrap/ng-bootstrap'; | ||||||
| import { merge, Observable, of, Subject } from 'rxjs'; | import { merge, Observable, of, Subject } from 'rxjs'; | ||||||
| import { distinctUntilChanged, filter, map, switchMap } from 'rxjs/operators'; | import { distinctUntilChanged, filter, map, switchMap } from 'rxjs/operators'; | ||||||
| import { AssetExtended } from '../../../interfaces/electrs.interface'; | import { AssetExtended } from '@interfaces/electrs.interface'; | ||||||
| import { AssetsService } from '../../../services/assets.service'; | import { AssetsService } from '@app/services/assets.service'; | ||||||
| import { SeoService } from '../../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { StateService } from '../../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { RelativeUrlPipe } from '../../../shared/pipes/relative-url/relative-url.pipe'; | import { RelativeUrlPipe } from '@app/shared/pipes/relative-url/relative-url.pipe'; | ||||||
| import { environment } from '../../../../environments/environment'; | import { environment } from '@environments/environment'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-assets-nav', |   selector: 'app-assets-nav', | ||||||
|  | |||||||
| @ -1,13 +1,13 @@ | |||||||
| import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core'; | import { Component, OnInit, ChangeDetectionStrategy } from '@angular/core'; | ||||||
| import { AssetsService } from '../../services/assets.service'; | import { AssetsService } from '@app/services/assets.service'; | ||||||
| import { environment } from '../../../environments/environment'; | import { environment } from '@environments/environment'; | ||||||
| import { UntypedFormGroup } from '@angular/forms'; | import { UntypedFormGroup } from '@angular/forms'; | ||||||
| import { filter, map, switchMap, take } from 'rxjs/operators'; | import { filter, map, switchMap, take } from 'rxjs/operators'; | ||||||
| import { ActivatedRoute, Router } from '@angular/router'; | import { ActivatedRoute, Router } from '@angular/router'; | ||||||
| import { combineLatest, Observable } from 'rxjs'; | import { combineLatest, Observable } from 'rxjs'; | ||||||
| import { AssetExtended } from '../../interfaces/electrs.interface'; | import { AssetExtended } from '@interfaces/electrs.interface'; | ||||||
| import { SeoService } from '../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-assets', |   selector: 'app-assets', | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; | import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { Address, AddressTxSummary } from '../../interfaces/electrs.interface'; | import { Address, AddressTxSummary } from '@interfaces/electrs.interface'; | ||||||
| import { ElectrsApiService } from '../../services/electrs-api.service'; | import { ElectrsApiService } from '@app/services/electrs-api.service'; | ||||||
| import { Observable, catchError, of } from 'rxjs'; | import { Observable, catchError, of } from 'rxjs'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|  | |||||||
| @ -4,7 +4,7 @@ import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; | |||||||
| import { ActivatedRoute } from '@angular/router'; | import { ActivatedRoute } from '@angular/router'; | ||||||
| import { Subscription, of, timer } from 'rxjs'; | import { Subscription, of, timer } from 'rxjs'; | ||||||
| import { filter, repeat, retry, switchMap, take, tap } from 'rxjs/operators'; | import { filter, repeat, retry, switchMap, take, tap } from 'rxjs/operators'; | ||||||
| import { ServicesApiServices } from '../../services/services-api.service'; | import { ServicesApiServices } from '@app/services/services-api.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-bitcoin-invoice', |   selector: 'app-bitcoin-invoice', | ||||||
|  | |||||||
| @ -1,17 +1,17 @@ | |||||||
| import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, Input, LOCALE_ID, NgZone, OnInit } from '@angular/core'; | import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, Input, LOCALE_ID, NgZone, OnInit } from '@angular/core'; | ||||||
| import { echarts, EChartsOption } from '../../graphs/echarts'; | import { echarts, EChartsOption } from '@app/graphs/echarts'; | ||||||
| import { Observable, combineLatest, of } from 'rxjs'; | import { Observable, combineLatest, of } from 'rxjs'; | ||||||
| import { map, share, startWith, switchMap, tap } from 'rxjs/operators'; | import { map, share, startWith, switchMap, tap } from 'rxjs/operators'; | ||||||
| import { ApiService } from '../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { SeoService } from '../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { formatNumber } from '@angular/common'; | import { formatNumber } from '@angular/common'; | ||||||
| import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | ||||||
| import { download, formatterXAxis, formatterXAxisLabel, formatterXAxisTimeCategory } from '../../shared/graphs.utils'; | import { download, formatterXAxis, formatterXAxisLabel, formatterXAxisTimeCategory } from '@app/shared/graphs.utils'; | ||||||
| import { StorageService } from '../../services/storage.service'; | import { StorageService } from '@app/services/storage.service'; | ||||||
| import { MiningService } from '../../services/mining.service'; | import { MiningService } from '@app/services/mining.service'; | ||||||
| import { selectPowerOfTen } from '../../bitcoin.utils'; | import { selectPowerOfTen } from '@app/bitcoin.utils'; | ||||||
| import { RelativeUrlPipe } from '../../shared/pipes/relative-url/relative-url.pipe'; | import { RelativeUrlPipe } from '@app/shared/pipes/relative-url/relative-url.pipe'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { ActivatedRoute, Router } from '@angular/router'; | import { ActivatedRoute, Router } from '@angular/router'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|  | |||||||
| @ -1,18 +1,18 @@ | |||||||
| import { ChangeDetectionStrategy, Component, Inject, Input, LOCALE_ID, OnInit } from '@angular/core'; | import { ChangeDetectionStrategy, Component, Inject, Input, LOCALE_ID, OnInit } from '@angular/core'; | ||||||
| import { echarts, EChartsOption } from '../../graphs/echarts'; | import { echarts, EChartsOption } from '@app/graphs/echarts'; | ||||||
| import { Observable } from 'rxjs'; | import { Observable } from 'rxjs'; | ||||||
| import { map, share, startWith, switchMap, tap } from 'rxjs/operators'; | import { map, share, startWith, switchMap, tap } from 'rxjs/operators'; | ||||||
| import { ApiService } from '../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { SeoService } from '../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { formatNumber } from '@angular/common'; | import { formatNumber } from '@angular/common'; | ||||||
| import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | ||||||
| import { download, formatterXAxis } from '../../shared/graphs.utils'; | import { download, formatterXAxis } from '@app/shared/graphs.utils'; | ||||||
| import { StorageService } from '../../services/storage.service'; | import { StorageService } from '@app/services/storage.service'; | ||||||
| import { MiningService } from '../../services/mining.service'; | import { MiningService } from '@app/services/mining.service'; | ||||||
| import { ActivatedRoute } from '@angular/router'; | import { ActivatedRoute } from '@angular/router'; | ||||||
| import { FiatShortenerPipe } from '../../shared/pipes/fiat-shortener.pipe'; | import { FiatShortenerPipe } from '@app/shared/pipes/fiat-shortener.pipe'; | ||||||
| import { FiatCurrencyPipe } from '../../shared/pipes/fiat-currency.pipe'; | import { FiatCurrencyPipe } from '@app/shared/pipes/fiat-currency.pipe'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-block-fees-graph', |   selector: 'app-block-fees-graph', | ||||||
|  | |||||||
| @ -1,19 +1,19 @@ | |||||||
| import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostListener, Inject, Input, LOCALE_ID, NgZone, OnInit } from '@angular/core'; | import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostListener, Inject, Input, LOCALE_ID, NgZone, OnInit } from '@angular/core'; | ||||||
| import { EChartsOption } from '../../graphs/echarts'; | import { EChartsOption } from '@app/graphs/echarts'; | ||||||
| import { Observable } from 'rxjs'; | import { Observable } from 'rxjs'; | ||||||
| import { catchError, map, share, startWith, switchMap, tap } from 'rxjs/operators'; | import { catchError, map, share, startWith, switchMap, tap } from 'rxjs/operators'; | ||||||
| import { ApiService } from '../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { SeoService } from '../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { formatNumber } from '@angular/common'; | import { formatNumber } from '@angular/common'; | ||||||
| import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | ||||||
| import { download, formatterXAxis } from '../../shared/graphs.utils'; | import { download, formatterXAxis } from '@app/shared/graphs.utils'; | ||||||
| import { ActivatedRoute, Router } from '@angular/router'; | import { ActivatedRoute, Router } from '@angular/router'; | ||||||
| import { FiatShortenerPipe } from '../../shared/pipes/fiat-shortener.pipe'; | import { FiatShortenerPipe } from '@app/shared/pipes/fiat-shortener.pipe'; | ||||||
| import { FiatCurrencyPipe } from '../../shared/pipes/fiat-currency.pipe'; | import { FiatCurrencyPipe } from '@app/shared/pipes/fiat-currency.pipe'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { MiningService } from '../../services/mining.service'; | import { MiningService } from '@app/services/mining.service'; | ||||||
| import { StorageService } from '../../services/storage.service'; | import { StorageService } from '@app/services/storage.service'; | ||||||
| import { RelativeUrlPipe } from '../../shared/pipes/relative-url/relative-url.pipe'; | import { RelativeUrlPipe } from '@app/shared/pipes/relative-url/relative-url.pipe'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-block-fees-subsidy-graph', |   selector: 'app-block-fees-subsidy-graph', | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| import { Component, EventEmitter, Output, HostListener, Input, ChangeDetectorRef, OnChanges, SimpleChanges, OnInit, OnDestroy } from '@angular/core'; | import { Component, EventEmitter, Output, HostListener, Input, ChangeDetectorRef, OnChanges, SimpleChanges, OnInit, OnDestroy } from '@angular/core'; | ||||||
| import { ActiveFilter, FilterGroups, FilterMode, GradientMode, TransactionFilters } from '../../shared/filters.utils'; | import { ActiveFilter, FilterGroups, FilterMode, GradientMode, TransactionFilters } from '@app/shared/filters.utils'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { Subscription } from 'rxjs'; | import { Subscription } from 'rxjs'; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,16 +1,16 @@ | |||||||
| import { ChangeDetectionStrategy, Component, Inject, Input, LOCALE_ID, NgZone, OnInit } from '@angular/core'; | import { ChangeDetectionStrategy, Component, Inject, Input, LOCALE_ID, NgZone, OnInit } from '@angular/core'; | ||||||
| import { EChartsOption } from '../../graphs/echarts'; | import { EChartsOption } from '@app/graphs/echarts'; | ||||||
| import { Observable } from 'rxjs'; | import { Observable } from 'rxjs'; | ||||||
| import { map, share, startWith, switchMap, tap } from 'rxjs/operators'; | import { map, share, startWith, switchMap, tap } from 'rxjs/operators'; | ||||||
| import { ApiService } from '../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { SeoService } from '../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { formatNumber } from '@angular/common'; | import { formatNumber } from '@angular/common'; | ||||||
| import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | ||||||
| import { download, formatterXAxis, formatterXAxisLabel, formatterXAxisTimeCategory } from '../../shared/graphs.utils'; | import { download, formatterXAxis, formatterXAxisLabel, formatterXAxisTimeCategory } from '@app/shared/graphs.utils'; | ||||||
| import { StorageService } from '../../services/storage.service'; | import { StorageService } from '@app/services/storage.service'; | ||||||
| import { ActivatedRoute, Router } from '@angular/router'; | import { ActivatedRoute, Router } from '@angular/router'; | ||||||
| import { RelativeUrlPipe } from '../../shared/pipes/relative-url/relative-url.pipe'; | import { RelativeUrlPipe } from '@app/shared/pipes/relative-url/relative-url.pipe'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-block-health-graph', |   selector: 'app-block-health-graph', | ||||||
|  | |||||||
| @ -1,17 +1,17 @@ | |||||||
| import { Component, ElementRef, ViewChild, HostListener, Input, Output, EventEmitter, NgZone, AfterViewInit, OnDestroy, OnChanges } from '@angular/core'; | import { Component, ElementRef, ViewChild, HostListener, Input, Output, EventEmitter, NgZone, AfterViewInit, OnDestroy, OnChanges } from '@angular/core'; | ||||||
| import { TransactionStripped } from '../../interfaces/node-api.interface'; | import { TransactionStripped } from '@interfaces/node-api.interface'; | ||||||
| import { FastVertexArray } from './fast-vertex-array'; | import { FastVertexArray } from '@components/block-overview-graph/fast-vertex-array'; | ||||||
| import BlockScene from './block-scene'; | import BlockScene from '@components/block-overview-graph/block-scene'; | ||||||
| import TxSprite from './tx-sprite'; | import TxSprite from '@components/block-overview-graph/tx-sprite'; | ||||||
| import TxView from './tx-view'; | import TxView from '@components/block-overview-graph/tx-view'; | ||||||
| import { Color, Position } from './sprite-types'; | import { Color, Position } from '@components/block-overview-graph/sprite-types'; | ||||||
| import { Price } from '../../services/price.service'; | import { Price } from '@app/services/price.service'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { ThemeService } from '../../services/theme.service'; | import { ThemeService } from '@app/services/theme.service'; | ||||||
| import { Subscription } from 'rxjs'; | import { Subscription } from 'rxjs'; | ||||||
| import { defaultColorFunction, setOpacity, defaultAuditColors, defaultColors, ageColorFunction, contrastColorFunction, contrastAuditColors, contrastColors } from './utils'; | import { defaultColorFunction, setOpacity, defaultAuditColors, defaultColors, ageColorFunction, contrastColorFunction, contrastAuditColors, contrastColors } from '@components/block-overview-graph/utils'; | ||||||
| import { ActiveFilter, FilterMode, toFlags } from '../../shared/filters.utils'; | import { ActiveFilter, FilterMode, toFlags } from '@app/shared/filters.utils'; | ||||||
| import { detectWebGL } from '../../shared/graphs.utils'; | import { detectWebGL } from '@app/shared/graphs.utils'; | ||||||
| 
 | 
 | ||||||
| const unmatchedOpacity = 0.2; | const unmatchedOpacity = 0.2; | ||||||
| const unmatchedAuditColors = { | const unmatchedAuditColors = { | ||||||
|  | |||||||
| @ -1,9 +1,9 @@ | |||||||
| import { FastVertexArray } from './fast-vertex-array'; | import { FastVertexArray } from '@components/block-overview-graph/fast-vertex-array'; | ||||||
| import TxView from './tx-view'; | import TxView from '@components/block-overview-graph/tx-view'; | ||||||
| import { TransactionStripped } from '../../interfaces/node-api.interface'; | import { TransactionStripped } from '@interfaces/node-api.interface'; | ||||||
| import { Color, Position, Square, ViewUpdateParams } from './sprite-types'; | import { Color, Position, Square, ViewUpdateParams } from '@components/block-overview-graph/sprite-types'; | ||||||
| import { defaultColorFunction, contrastColorFunction } from './utils'; | import { defaultColorFunction, contrastColorFunction } from '@components/block-overview-graph/utils'; | ||||||
| import { ThemeService } from '../../services/theme.service'; | import { ThemeService } from '@app/services/theme.service'; | ||||||
| 
 | 
 | ||||||
| export default class BlockScene { | export default class BlockScene { | ||||||
|   scene: { count: number, offset: { x: number, y: number}}; |   scene: { count: number, offset: { x: number, y: number}}; | ||||||
|  | |||||||
| @ -8,7 +8,7 @@ | |||||||
|   or compacting into a smaller Float32Array when there's space to do so. |   or compacting into a smaller Float32Array when there's space to do so. | ||||||
| */ | */ | ||||||
| 
 | 
 | ||||||
| import TxSprite from './tx-sprite'; | import TxSprite from '@components/block-overview-graph/tx-sprite'; | ||||||
| 
 | 
 | ||||||
| export class FastVertexArray { | export class FastVertexArray { | ||||||
|   length: number; |   length: number; | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| import { FastVertexArray } from './fast-vertex-array'; | import { FastVertexArray } from '@components/block-overview-graph/fast-vertex-array'; | ||||||
| import { InterpolatedAttribute, Attributes, OptionalAttributes, SpriteUpdateParams, Update } from './sprite-types'; | import { InterpolatedAttribute, Attributes, OptionalAttributes, SpriteUpdateParams, Update } from '@components/block-overview-graph/sprite-types'; | ||||||
| 
 | 
 | ||||||
| const attribKeys = ['a', 'b', 't', 'v']; | const attribKeys = ['a', 'b', 't', 'v']; | ||||||
| const updateKeys = ['x', 'y', 's', 'r', 'g', 'b', 'a']; | const updateKeys = ['x', 'y', 's', 'r', 'g', 'b', 'a']; | ||||||
|  | |||||||
| @ -1,10 +1,10 @@ | |||||||
| import TxSprite from './tx-sprite'; | import TxSprite from '@components/block-overview-graph/tx-sprite'; | ||||||
| import { FastVertexArray } from './fast-vertex-array'; | import { FastVertexArray } from '@components/block-overview-graph/fast-vertex-array'; | ||||||
| import { SpriteUpdateParams, Square, Color, ViewUpdateParams } from './sprite-types'; | import { SpriteUpdateParams, Square, Color, ViewUpdateParams } from '@components/block-overview-graph/sprite-types'; | ||||||
| import { hexToColor } from './utils'; | import { hexToColor } from '@components/block-overview-graph/utils'; | ||||||
| import BlockScene from './block-scene'; | import BlockScene from '@components/block-overview-graph/block-scene'; | ||||||
| import { TransactionStripped } from '../../interfaces/node-api.interface'; | import { TransactionStripped } from '@interfaces/node-api.interface'; | ||||||
| import { TransactionFlags } from '../../shared/filters.utils'; | import { TransactionFlags } from '@app/shared/filters.utils'; | ||||||
| 
 | 
 | ||||||
| const hoverTransitionTime = 300; | const hoverTransitionTime = 300; | ||||||
| const defaultHoverColor = hexToColor('1bd8f4'); | const defaultHoverColor = hexToColor('1bd8f4'); | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| import { feeLevels, defaultMempoolFeeColors, contrastMempoolFeeColors } from '../../app.constants'; | import { feeLevels, defaultMempoolFeeColors, contrastMempoolFeeColors } from '@app/app.constants'; | ||||||
| import { Color } from './sprite-types'; | import { Color } from '@components/block-overview-graph/sprite-types'; | ||||||
| import TxView from './tx-view'; | import TxView from '@components/block-overview-graph/tx-view'; | ||||||
| 
 | 
 | ||||||
| export function hexToColor(hex: string): Color { | export function hexToColor(hex: string): Color { | ||||||
|   return { |   return { | ||||||
|  | |||||||
| @ -1,9 +1,9 @@ | |||||||
| import { Component, ElementRef, ViewChild, Input, OnChanges, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core'; | import { Component, ElementRef, ViewChild, Input, OnChanges, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core'; | ||||||
| import { Position } from '../../components/block-overview-graph/sprite-types.js'; | import { Position } from '@components/block-overview-graph/sprite-types.js'; | ||||||
| import { Price } from '../../services/price.service'; | import { Price } from '@app/services/price.service'; | ||||||
| import { TransactionStripped } from '../../interfaces/node-api.interface.js'; | import { TransactionStripped } from '@interfaces/node-api.interface.js'; | ||||||
| import { Filter, FilterMode, TransactionFlags, toFilters } from '../../shared/filters.utils'; | import { Filter, FilterMode, TransactionFlags, toFilters } from '@app/shared/filters.utils'; | ||||||
| import { Block } from '../../interfaces/electrs.interface.js'; | import { Block } from '@interfaces/electrs.interface.js'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-block-overview-tooltip', |   selector: 'app-block-overview-tooltip', | ||||||
|  | |||||||
| @ -1,18 +1,18 @@ | |||||||
| import { ChangeDetectionStrategy, Component, Inject, Input, LOCALE_ID, OnInit } from '@angular/core'; | import { ChangeDetectionStrategy, Component, Inject, Input, LOCALE_ID, OnInit } from '@angular/core'; | ||||||
| import { echarts, EChartsOption } from '../../graphs/echarts'; | import { echarts, EChartsOption } from '@app/graphs/echarts'; | ||||||
| import { Observable } from 'rxjs'; | import { Observable } from 'rxjs'; | ||||||
| import { map, share, startWith, switchMap, tap } from 'rxjs/operators'; | import { map, share, startWith, switchMap, tap } from 'rxjs/operators'; | ||||||
| import { ApiService } from '../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { SeoService } from '../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { formatNumber } from '@angular/common'; | import { formatNumber } from '@angular/common'; | ||||||
| import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | ||||||
| import { download, formatterXAxis } from '../../shared/graphs.utils'; | import { download, formatterXAxis } from '@app/shared/graphs.utils'; | ||||||
| import { MiningService } from '../../services/mining.service'; | import { MiningService } from '@app/services/mining.service'; | ||||||
| import { StorageService } from '../../services/storage.service'; | import { StorageService } from '@app/services/storage.service'; | ||||||
| import { ActivatedRoute } from '@angular/router'; | import { ActivatedRoute } from '@angular/router'; | ||||||
| import { FiatShortenerPipe } from '../../shared/pipes/fiat-shortener.pipe'; | import { FiatShortenerPipe } from '@app/shared/pipes/fiat-shortener.pipe'; | ||||||
| import { FiatCurrencyPipe } from '../../shared/pipes/fiat-currency.pipe'; | import { FiatCurrencyPipe } from '@app/shared/pipes/fiat-currency.pipe'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-block-rewards-graph', |   selector: 'app-block-rewards-graph', | ||||||
|  | |||||||
| @ -1,16 +1,16 @@ | |||||||
| import { ChangeDetectionStrategy, Component, Inject, Input, LOCALE_ID, OnInit, HostBinding } from '@angular/core'; | import { ChangeDetectionStrategy, Component, Inject, Input, LOCALE_ID, OnInit, HostBinding } from '@angular/core'; | ||||||
| import { EChartsOption} from '../../graphs/echarts'; | import { EChartsOption} from '@app/graphs/echarts'; | ||||||
| import { Observable } from 'rxjs'; | import { Observable } from 'rxjs'; | ||||||
| import { map, share, startWith, switchMap, tap } from 'rxjs/operators'; | import { map, share, startWith, switchMap, tap } from 'rxjs/operators'; | ||||||
| import { ApiService } from '../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { SeoService } from '../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { formatNumber } from '@angular/common'; | import { formatNumber } from '@angular/common'; | ||||||
| import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | ||||||
| import { StorageService } from '../../services/storage.service'; | import { StorageService } from '@app/services/storage.service'; | ||||||
| import { MiningService } from '../../services/mining.service'; | import { MiningService } from '@app/services/mining.service'; | ||||||
| import { ActivatedRoute } from '@angular/router'; | import { ActivatedRoute } from '@angular/router'; | ||||||
| import { download, formatterXAxis } from '../../shared/graphs.utils'; | import { download, formatterXAxis } from '@app/shared/graphs.utils'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-block-sizes-weights-graph', |   selector: 'app-block-sizes-weights-graph', | ||||||
|  | |||||||
| @ -1,15 +1,15 @@ | |||||||
| import { Component, OnInit, OnDestroy, ViewChild, HostListener } from '@angular/core'; | import { Component, OnInit, OnDestroy, ViewChild, HostListener } from '@angular/core'; | ||||||
| import { ActivatedRoute, ParamMap, Router } from '@angular/router'; | import { ActivatedRoute, ParamMap, Router } from '@angular/router'; | ||||||
| import { ElectrsApiService } from '../../services/electrs-api.service'; | import { ElectrsApiService } from '@app/services/electrs-api.service'; | ||||||
| import { switchMap, tap, catchError, shareReplay, filter } from 'rxjs/operators'; | import { switchMap, tap, catchError, shareReplay, filter } from 'rxjs/operators'; | ||||||
| import { of, Subscription } from 'rxjs'; | import { of, Subscription } from 'rxjs'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { SeoService } from '../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { BlockExtended, TransactionStripped } from '../../interfaces/node-api.interface'; | import { BlockExtended, TransactionStripped } from '@interfaces/node-api.interface'; | ||||||
| import { ApiService } from '../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { seoDescriptionNetwork } from '../../shared/common.utils'; | import { seoDescriptionNetwork } from '@app/shared/common.utils'; | ||||||
| import { BlockOverviewGraphComponent } from '../block-overview-graph/block-overview-graph.component'; | import { BlockOverviewGraphComponent } from '@components/block-overview-graph/block-overview-graph.component'; | ||||||
| import { RelativeUrlPipe } from '../../shared/pipes/relative-url/relative-url.pipe'; | import { RelativeUrlPipe } from '@app/shared/pipes/relative-url/relative-url.pipe'; | ||||||
| 
 | 
 | ||||||
| function bestFitResolution(min, max, n): number { | function bestFitResolution(min, max, n): number { | ||||||
|   const target = (min + max) / 2; |   const target = (min + max) / 2; | ||||||
|  | |||||||
| @ -1,16 +1,16 @@ | |||||||
| import { Component, OnInit, OnDestroy, ViewChild, ElementRef } from '@angular/core'; | import { Component, OnInit, OnDestroy, ViewChild, ElementRef } from '@angular/core'; | ||||||
| import { ActivatedRoute, ParamMap } from '@angular/router'; | import { ActivatedRoute, ParamMap } from '@angular/router'; | ||||||
| import { ElectrsApiService } from '../../services/electrs-api.service'; | import { ElectrsApiService } from '@app/services/electrs-api.service'; | ||||||
| import { switchMap, tap, throttleTime, catchError, shareReplay, startWith, pairwise, filter } from 'rxjs/operators'; | import { switchMap, tap, throttleTime, catchError, shareReplay, startWith, pairwise, filter } from 'rxjs/operators'; | ||||||
| import { of, Subscription, asyncScheduler, forkJoin } from 'rxjs'; | import { of, Subscription, asyncScheduler, forkJoin } from 'rxjs'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { SeoService } from '../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { OpenGraphService } from '../../services/opengraph.service'; | import { OpenGraphService } from '@app/services/opengraph.service'; | ||||||
| import { BlockExtended, TransactionStripped } from '../../interfaces/node-api.interface'; | import { BlockExtended, TransactionStripped } from '@interfaces/node-api.interface'; | ||||||
| import { ApiService } from '../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { seoDescriptionNetwork } from '../../shared/common.utils'; | import { seoDescriptionNetwork } from '@app/shared/common.utils'; | ||||||
| import { BlockOverviewGraphComponent } from '../../components/block-overview-graph/block-overview-graph.component'; | import { BlockOverviewGraphComponent } from '@components/block-overview-graph/block-overview-graph.component'; | ||||||
| import { ServicesApiServices } from '../../services/services-api.service'; | import { ServicesApiServices } from '@app/services/services-api.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-block-preview', |   selector: 'app-block-preview', | ||||||
|  | |||||||
| @ -1,10 +1,10 @@ | |||||||
| import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core'; | import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { Transaction, Vout } from '../../interfaces/electrs.interface'; | import { Transaction, Vout } from '@interfaces/electrs.interface'; | ||||||
| import { Observable, Subscription, catchError, combineLatest, map, of, startWith, switchMap, tap } from 'rxjs'; | import { Observable, Subscription, catchError, combineLatest, map, of, startWith, switchMap, tap } from 'rxjs'; | ||||||
| import { ActivatedRoute, Router } from '@angular/router'; | import { ActivatedRoute, Router } from '@angular/router'; | ||||||
| import { ElectrsApiService } from '../../services/electrs-api.service'; | import { ElectrsApiService } from '@app/services/electrs-api.service'; | ||||||
| import { PreloadService } from '../../services/preload.service'; | import { PreloadService } from '@app/services/preload.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-block-transactions', |   selector: 'app-block-transactions', | ||||||
|  | |||||||
| @ -1,23 +1,23 @@ | |||||||
| import { Component, OnInit, OnDestroy, ViewChildren, QueryList, ChangeDetectorRef } from '@angular/core'; | import { Component, OnInit, OnDestroy, ViewChildren, QueryList, ChangeDetectorRef } from '@angular/core'; | ||||||
| import { Location } from '@angular/common'; | import { Location } from '@angular/common'; | ||||||
| import { ActivatedRoute, ParamMap, Router } from '@angular/router'; | import { ActivatedRoute, ParamMap, Router } from '@angular/router'; | ||||||
| import { ElectrsApiService } from '../../services/electrs-api.service'; | import { ElectrsApiService } from '@app/services/electrs-api.service'; | ||||||
| import { switchMap, tap, throttleTime, catchError, map, shareReplay, startWith, filter } from 'rxjs/operators'; | import { switchMap, tap, throttleTime, catchError, map, shareReplay, startWith, filter } from 'rxjs/operators'; | ||||||
| import { Observable, of, Subscription, asyncScheduler, EMPTY, combineLatest, forkJoin } from 'rxjs'; | import { Observable, of, Subscription, asyncScheduler, EMPTY, combineLatest, forkJoin } from 'rxjs'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { SeoService } from '../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { WebsocketService } from '../../services/websocket.service'; | import { WebsocketService } from '@app/services/websocket.service'; | ||||||
| import { RelativeUrlPipe } from '../../shared/pipes/relative-url/relative-url.pipe'; | import { RelativeUrlPipe } from '@app/shared/pipes/relative-url/relative-url.pipe'; | ||||||
| import { Acceleration, BlockAudit, BlockExtended, TransactionStripped } from '../../interfaces/node-api.interface'; | import { Acceleration, BlockAudit, BlockExtended, TransactionStripped } from '@interfaces/node-api.interface'; | ||||||
| import { ApiService } from '../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { BlockOverviewGraphComponent } from '../../components/block-overview-graph/block-overview-graph.component'; | import { BlockOverviewGraphComponent } from '@components/block-overview-graph/block-overview-graph.component'; | ||||||
| import { detectWebGL } from '../../shared/graphs.utils'; | import { detectWebGL } from '@app/shared/graphs.utils'; | ||||||
| import { seoDescriptionNetwork } from '../../shared/common.utils'; | import { seoDescriptionNetwork } from '@app/shared/common.utils'; | ||||||
| import { PriceService, Price } from '../../services/price.service'; | import { PriceService, Price } from '@app/services/price.service'; | ||||||
| import { CacheService } from '../../services/cache.service'; | import { CacheService } from '@app/services/cache.service'; | ||||||
| import { ServicesApiServices } from '../../services/services-api.service'; | import { ServicesApiServices } from '@app/services/services-api.service'; | ||||||
| import { PreloadService } from '../../services/preload.service'; | import { PreloadService } from '@app/services/preload.service'; | ||||||
| import { identifyPrioritizedTransactions } from '../../shared/transaction.utils'; | import { identifyPrioritizedTransactions } from '@app/shared/transaction.utils'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-block', |   selector: 'app-block', | ||||||
|  | |||||||
| @ -1,9 +1,9 @@ | |||||||
| import { NgModule } from '@angular/core'; | import { NgModule } from '@angular/core'; | ||||||
| import { CommonModule } from '@angular/common'; | import { CommonModule } from '@angular/common'; | ||||||
| import { Routes, RouterModule } from '@angular/router'; | import { Routes, RouterModule } from '@angular/router'; | ||||||
| import { BlockComponent } from './block.component'; | import { BlockComponent } from '@components/block/block.component'; | ||||||
| import { BlockTransactionsComponent } from './block-transactions.component'; | import { BlockTransactionsComponent } from '@components/block/block-transactions.component'; | ||||||
| import { SharedModule } from '../../shared/shared.module'; | import { SharedModule } from '@app/shared/shared.module'; | ||||||
| 
 | 
 | ||||||
| const routes: Routes = [ | const routes: Routes = [ | ||||||
|   { |   { | ||||||
|  | |||||||
| @ -1,10 +1,10 @@ | |||||||
| import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, ChangeDetectorRef, Input, OnChanges, SimpleChanges } from '@angular/core'; | import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, ChangeDetectorRef, Input, OnChanges, SimpleChanges } from '@angular/core'; | ||||||
| import { Observable, Subscription, delay, filter, tap } from 'rxjs'; | import { Observable, Subscription, delay, filter, tap } from 'rxjs'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { specialBlocks } from '../../app.constants'; | import { specialBlocks } from '@app/app.constants'; | ||||||
| import { BlockExtended } from '../../interfaces/node-api.interface'; | import { BlockExtended } from '@interfaces/node-api.interface'; | ||||||
| import { Location } from '@angular/common'; | import { Location } from '@angular/common'; | ||||||
| import { CacheService } from '../../services/cache.service'; | import { CacheService } from '@app/services/cache.service'; | ||||||
| 
 | 
 | ||||||
| interface BlockchainBlock extends BlockExtended { | interface BlockchainBlock extends BlockExtended { | ||||||
|   placeholder?: boolean; |   placeholder?: boolean; | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, Input, Output, EventEmitter, ChangeDetectorRef, OnChanges, SimpleChanges } from '@angular/core'; | import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, Input, Output, EventEmitter, ChangeDetectorRef, OnChanges, SimpleChanges } from '@angular/core'; | ||||||
| import { firstValueFrom, Subscription } from 'rxjs'; | import { firstValueFrom, Subscription } from 'rxjs'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { StorageService } from '../../services/storage.service'; | import { StorageService } from '@app/services/storage.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-blockchain', |   selector: 'app-blockchain', | ||||||
|  | |||||||
| @ -2,13 +2,13 @@ import { Component, OnInit, ChangeDetectionStrategy, Input, ChangeDetectorRef, I | |||||||
| import { ActivatedRoute, Router } from '@angular/router'; | import { ActivatedRoute, Router } from '@angular/router'; | ||||||
| import { BehaviorSubject, combineLatest, Observable, timer, of, Subscription } from 'rxjs'; | import { BehaviorSubject, combineLatest, Observable, timer, of, Subscription } from 'rxjs'; | ||||||
| import { debounceTime, delayWhen, filter, map, retryWhen, scan, skip, switchMap, tap, throttleTime } from 'rxjs/operators'; | import { debounceTime, delayWhen, filter, map, retryWhen, scan, skip, switchMap, tap, throttleTime } from 'rxjs/operators'; | ||||||
| import { BlockExtended } from '../../interfaces/node-api.interface'; | import { BlockExtended } from '@interfaces/node-api.interface'; | ||||||
| import { ApiService } from '../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { WebsocketService } from '../../services/websocket.service'; | import { WebsocketService } from '@app/services/websocket.service'; | ||||||
| import { SeoService } from '../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { OpenGraphService } from '../../services/opengraph.service'; | import { OpenGraphService } from '@app/services/opengraph.service'; | ||||||
| import { seoDescriptionNetwork } from '../../shared/common.utils'; | import { seoDescriptionNetwork } from '@app/shared/common.utils'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-blocks-list', |   selector: 'app-blocks-list', | ||||||
|  | |||||||
| @ -2,8 +2,8 @@ import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; | |||||||
| import { FormBuilder, FormGroup } from '@angular/forms'; | import { FormBuilder, FormGroup } from '@angular/forms'; | ||||||
| import { combineLatest, Observable } from 'rxjs'; | import { combineLatest, Observable } from 'rxjs'; | ||||||
| import { map, switchMap } from 'rxjs/operators'; | import { map, switchMap } from 'rxjs/operators'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { WebsocketService } from '../../services/websocket.service'; | import { WebsocketService } from '@app/services/websocket.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-calculator', |   selector: 'app-calculator', | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; | import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnChanges, OnDestroy, OnInit } from '@angular/core'; | ||||||
| import { Subscription, tap, timer } from 'rxjs'; | import { Subscription, tap, timer } from 'rxjs'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-clock-face', |   selector: 'app-clock-face', | ||||||
|  | |||||||
| @ -1,11 +1,11 @@ | |||||||
| import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostListener, Input, OnInit } from '@angular/core'; | import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostListener, Input, OnInit } from '@angular/core'; | ||||||
| import { Observable, Subscription, of, switchMap, tap } from 'rxjs'; | import { Observable, Subscription, of, switchMap, tap } from 'rxjs'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { BlockExtended } from '../../interfaces/node-api.interface'; | import { BlockExtended } from '@interfaces/node-api.interface'; | ||||||
| import { WebsocketService } from '../../services/websocket.service'; | import { WebsocketService } from '@app/services/websocket.service'; | ||||||
| import { MempoolInfo, Recommendedfees } from '../../interfaces/websocket.interface'; | import { MempoolInfo, Recommendedfees } from '@interfaces/websocket.interface'; | ||||||
| import { ActivatedRoute, ParamMap, Router } from '@angular/router'; | import { ActivatedRoute, ParamMap, Router } from '@angular/router'; | ||||||
| import { RelativeUrlPipe } from '../../shared/pipes/relative-url/relative-url.pipe'; | import { RelativeUrlPipe } from '@app/shared/pipes/relative-url/relative-url.pipe'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-clock', |   selector: 'app-clock', | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, Input, OnChanges, ChangeDetectorRef } from '@angular/core'; | import { Component, OnInit, OnDestroy, ChangeDetectionStrategy, Input, OnChanges, ChangeDetectorRef } from '@angular/core'; | ||||||
| import { firstValueFrom, Subscription } from 'rxjs'; | import { firstValueFrom, Subscription } from 'rxjs'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-clockchain', |   selector: 'app-clockchain', | ||||||
|  | |||||||
| @ -1,16 +1,16 @@ | |||||||
| import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, HostListener, Inject, OnDestroy, OnInit, PLATFORM_ID } from '@angular/core'; | import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, HostListener, Inject, OnDestroy, OnInit, PLATFORM_ID } from '@angular/core'; | ||||||
| import { combineLatest, merge, Observable, of, Subject, Subscription } from 'rxjs'; | import { combineLatest, merge, Observable, of, Subject, Subscription } from 'rxjs'; | ||||||
| import { catchError, filter, map, scan, share, shareReplay, startWith, switchMap, tap } from 'rxjs/operators'; | import { catchError, filter, map, scan, share, shareReplay, startWith, switchMap, tap } from 'rxjs/operators'; | ||||||
| import { BlockExtended, OptimizedMempoolStats, TransactionStripped } from '../../interfaces/node-api.interface'; | import { BlockExtended, OptimizedMempoolStats, TransactionStripped } from '@interfaces/node-api.interface'; | ||||||
| import { MempoolInfo, ReplacementInfo } from '../../interfaces/websocket.interface'; | import { MempoolInfo, ReplacementInfo } from '@interfaces/websocket.interface'; | ||||||
| import { ApiService } from '../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { WebsocketService } from '../../services/websocket.service'; | import { WebsocketService } from '@app/services/websocket.service'; | ||||||
| import { SeoService } from '../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { ActiveFilter, FilterMode, GradientMode, toFlags } from '../../shared/filters.utils'; | import { ActiveFilter, FilterMode, GradientMode, toFlags } from '@app/shared/filters.utils'; | ||||||
| import { detectWebGL } from '../../shared/graphs.utils'; | import { detectWebGL } from '@app/shared/graphs.utils'; | ||||||
| import { Address, AddressTxSummary } from '../../interfaces/electrs.interface'; | import { Address, AddressTxSummary } from '@interfaces/electrs.interface'; | ||||||
| import { ElectrsApiService } from '../../services/electrs-api.service'; | import { ElectrsApiService } from '@app/services/electrs-api.service'; | ||||||
| 
 | 
 | ||||||
| interface MempoolBlocksData { | interface MempoolBlocksData { | ||||||
|   blocks: number; |   blocks: number; | ||||||
| @ -73,7 +73,7 @@ export class CustomDashboardComponent implements OnInit, OnDestroy, AfterViewIni | |||||||
|     { index: 0, name: $localize`:@@dfc3c34e182ea73c5d784ff7c8135f087992dac1:All`, mode: 'and', filters: [], gradient: 'age' }, |     { index: 0, name: $localize`:@@dfc3c34e182ea73c5d784ff7c8135f087992dac1:All`, mode: 'and', filters: [], gradient: 'age' }, | ||||||
|     { index: 1, name: $localize`Consolidation`, mode: 'and', filters: ['consolidation'], gradient: 'fee' }, |     { index: 1, name: $localize`Consolidation`, mode: 'and', filters: ['consolidation'], gradient: 'fee' }, | ||||||
|     { index: 2, name: $localize`Coinjoin`, mode: 'and', filters: ['coinjoin'], gradient: 'fee' }, |     { index: 2, name: $localize`Coinjoin`, mode: 'and', filters: ['coinjoin'], gradient: 'fee' }, | ||||||
|     { index: 3, name: $localize`Data`, mode: 'or', filters: ['inscription', 'fake_pubkey', 'op_return'], gradient: 'fee' }, |     { index: 3, name: $localize`Data`, mode: 'or', filters: ['inscription', 'fake_pubkey', 'fake_scripthash', 'op_return'], gradient: 'fee' }, | ||||||
|   ]; |   ]; | ||||||
|   goggleFlags = 0n; |   goggleFlags = 0n; | ||||||
|   goggleMode: FilterMode = 'and'; |   goggleMode: FilterMode = 'and'; | ||||||
|  | |||||||
| @ -1,10 +1,10 @@ | |||||||
| import { Component, Inject, LOCALE_ID, OnInit } from '@angular/core'; | import { Component, Inject, LOCALE_ID, OnInit } from '@angular/core'; | ||||||
| import { Observable } from 'rxjs'; | import { Observable } from 'rxjs'; | ||||||
| import { map } from 'rxjs/operators'; | import { map } from 'rxjs/operators'; | ||||||
| import { ApiService } from '../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { formatNumber } from '@angular/common'; | import { formatNumber } from '@angular/common'; | ||||||
| import { selectPowerOfTen } from '../../bitcoin.utils'; | import { selectPowerOfTen } from '@app/bitcoin.utils'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-difficulty-adjustments-table', |   selector: 'app-difficulty-adjustments-table', | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; | import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; | ||||||
| import { combineLatest, Observable } from 'rxjs'; | import { combineLatest, Observable } from 'rxjs'; | ||||||
| import { map } from 'rxjs/operators'; | import { map } from 'rxjs/operators'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| 
 | 
 | ||||||
| interface EpochProgress { | interface EpochProgress { | ||||||
|   base: string; |   base: string; | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostListener, ElementRef, ViewChild, Inject, Input, LOCALE_ID, OnInit } from '@angular/core'; | import { ChangeDetectionStrategy, ChangeDetectorRef, Component, HostListener, ElementRef, ViewChild, Inject, Input, LOCALE_ID, OnInit } from '@angular/core'; | ||||||
| import { combineLatest, Observable } from 'rxjs'; | import { combineLatest, Observable } from 'rxjs'; | ||||||
| import { map } from 'rxjs/operators'; | import { map } from 'rxjs/operators'; | ||||||
| import { StateService } from '../..//services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| 
 | 
 | ||||||
| interface EpochProgress { | interface EpochProgress { | ||||||
|   base: string; |   base: string; | ||||||
|  | |||||||
| @ -2,15 +2,15 @@ import { Component, OnInit, OnDestroy, ViewChildren, QueryList } from '@angular/ | |||||||
| import { ActivatedRoute, Router } from '@angular/router'; | import { ActivatedRoute, Router } from '@angular/router'; | ||||||
| import { catchError, startWith } from 'rxjs/operators'; | import { catchError, startWith } from 'rxjs/operators'; | ||||||
| import { Subject, Subscription, of } from 'rxjs'; | import { Subject, Subscription, of } from 'rxjs'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { WebsocketService } from '../../services/websocket.service'; | import { WebsocketService } from '@app/services/websocket.service'; | ||||||
| import { RelativeUrlPipe } from '../../shared/pipes/relative-url/relative-url.pipe'; | import { RelativeUrlPipe } from '@app/shared/pipes/relative-url/relative-url.pipe'; | ||||||
| import { BlockExtended, TransactionStripped } from '../../interfaces/node-api.interface'; | import { BlockExtended, TransactionStripped } from '@interfaces/node-api.interface'; | ||||||
| import { ApiService } from '../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { BlockOverviewGraphComponent } from '../block-overview-graph/block-overview-graph.component'; | import { BlockOverviewGraphComponent } from '@components/block-overview-graph/block-overview-graph.component'; | ||||||
| import { detectWebGL } from '../../shared/graphs.utils'; | import { detectWebGL } from '@app/shared/graphs.utils'; | ||||||
| import { animate, style, transition, trigger } from '@angular/animations'; | import { animate, style, transition, trigger } from '@angular/animations'; | ||||||
| import { BytesPipe } from '../../shared/pipes/bytes-pipe/bytes.pipe'; | import { BytesPipe } from '@app/shared/pipes/bytes-pipe/bytes.pipe'; | ||||||
| 
 | 
 | ||||||
| function bestFitResolution(min, max, n): number { | function bestFitResolution(min, max, n): number { | ||||||
|   const target = (min + max) / 2; |   const target = (min + max) / 2; | ||||||
|  | |||||||
| @ -1,12 +1,12 @@ | |||||||
| import { Component, OnDestroy, OnInit, ChangeDetectorRef } from "@angular/core"; | import { Component, OnDestroy, OnInit, ChangeDetectorRef } from '@angular/core'; | ||||||
| import { FormBuilder, FormGroup, Validators, ValidatorFn, AbstractControl, ValidationErrors } from "@angular/forms"; | import { FormBuilder, FormGroup, Validators, ValidatorFn, AbstractControl, ValidationErrors } from '@angular/forms'; | ||||||
| import { Subscription } from "rxjs"; | import { Subscription } from 'rxjs'; | ||||||
| import { ServicesApiServices } from "../../services/services-api.service"; | import { ServicesApiServices } from '@app/services/services-api.service'; | ||||||
| import { getRegex } from "../../shared/regex.utils"; | import { getRegex } from '@app/shared/regex.utils'; | ||||||
| import { StateService } from "../../services/state.service"; | import { StateService } from '@app/services/state.service'; | ||||||
| import { WebsocketService } from "../../services/websocket.service"; | import { WebsocketService } from '@app/services/websocket.service'; | ||||||
| import { AudioService } from "../../services/audio.service"; | import { AudioService } from '@app/services/audio.service'; | ||||||
| import { HttpErrorResponse } from "@angular/common/http"; | import { HttpErrorResponse } from '@angular/common/http'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-faucet', |   selector: 'app-faucet', | ||||||
|  | |||||||
| @ -1,9 +1,9 @@ | |||||||
| import { HostListener, OnChanges, OnDestroy } from '@angular/core'; | import { HostListener, OnChanges, OnDestroy } from '@angular/core'; | ||||||
| import { Component, Input, OnInit, ChangeDetectionStrategy } from '@angular/core'; | import { Component, Input, OnInit, ChangeDetectionStrategy } from '@angular/core'; | ||||||
| import { TransactionStripped } from '../../interfaces/node-api.interface'; | import { TransactionStripped } from '@interfaces/node-api.interface'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { VbytesPipe } from '../../shared/pipes/bytes-pipe/vbytes.pipe'; | import { VbytesPipe } from '@app/shared/pipes/bytes-pipe/vbytes.pipe'; | ||||||
| import { selectPowerOfTen } from '../../bitcoin.utils'; | import { selectPowerOfTen } from '@app/bitcoin.utils'; | ||||||
| import { Subscription } from 'rxjs'; | import { Subscription } from 'rxjs'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|  | |||||||
| @ -1,10 +1,10 @@ | |||||||
| import { Component, OnInit, ChangeDetectionStrategy, OnDestroy, ChangeDetectorRef } from '@angular/core'; | import { Component, OnInit, ChangeDetectionStrategy, OnDestroy, ChangeDetectorRef } from '@angular/core'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { Observable, combineLatest, Subscription } from 'rxjs'; | import { Observable, combineLatest, Subscription } from 'rxjs'; | ||||||
| import { Recommendedfees } from '../../interfaces/websocket.interface'; | import { Recommendedfees } from '@interfaces/websocket.interface'; | ||||||
| import { feeLevels } from '../../app.constants'; | import { feeLevels } from '@app/app.constants'; | ||||||
| import { map, startWith, tap } from 'rxjs/operators'; | import { map, startWith, tap } from 'rxjs/operators'; | ||||||
| import { ThemeService } from '../../services/theme.service'; | import { ThemeService } from '@app/services/theme.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-fees-box', |   selector: 'app-fees-box', | ||||||
|  | |||||||
| @ -1,8 +1,8 @@ | |||||||
| import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; | import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; | ||||||
| import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | ||||||
| import { StorageService } from '../../services/storage.service'; | import { StorageService } from '@app/services/storage.service'; | ||||||
| import { fiatCurrencies } from '../../app.constants'; | import { fiatCurrencies } from '@app/app.constants'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-fiat-selector', |   selector: 'app-fiat-selector', | ||||||
|  | |||||||
| @ -1,8 +1,8 @@ | |||||||
| import { Component, OnInit, ChangeDetectionStrategy, Input } from '@angular/core'; | import { Component, OnInit, ChangeDetectionStrategy, Input } from '@angular/core'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { Observable, combineLatest } from 'rxjs'; | import { Observable, combineLatest } from 'rxjs'; | ||||||
| import { map } from 'rxjs/operators'; | import { map } from 'rxjs/operators'; | ||||||
| import { MempoolInfo } from '../../interfaces/websocket.interface'; | import { MempoolInfo } from '@interfaces/websocket.interface'; | ||||||
| 
 | 
 | ||||||
| interface MempoolBlocksData { | interface MempoolBlocksData { | ||||||
|   blocks: number; |   blocks: number; | ||||||
|  | |||||||
| @ -1,6 +1,8 @@ | |||||||
| import { Component, OnInit } from '@angular/core'; | import { Component, OnInit } from '@angular/core'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { WebsocketService } from '../../services/websocket.service'; | import { WebsocketService } from '@app/services/websocket.service'; | ||||||
|  | import { Router, ActivatedRoute } from '@angular/router'; | ||||||
|  | import { handleDemoRedirect } from '../../shared/common.utils'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-graphs', |   selector: 'app-graphs', | ||||||
| @ -13,7 +15,9 @@ export class GraphsComponent implements OnInit { | |||||||
| 
 | 
 | ||||||
|   constructor( |   constructor( | ||||||
|     public stateService: StateService, |     public stateService: StateService, | ||||||
|     private websocketService: WebsocketService |     private websocketService: WebsocketService, | ||||||
|  |     private router: Router, | ||||||
|  |     private route: ActivatedRoute | ||||||
|   ) { } |   ) { } | ||||||
| 
 | 
 | ||||||
|   ngOnInit(): void { |   ngOnInit(): void { | ||||||
| @ -22,5 +26,7 @@ export class GraphsComponent implements OnInit { | |||||||
|     if (this.stateService.env.ACCELERATOR === true && (this.stateService.env.MINING_DASHBOARD === true || this.stateService.env.LIGHTNING === true)) { |     if (this.stateService.env.ACCELERATOR === true && (this.stateService.env.MINING_DASHBOARD === true || this.stateService.env.LIGHTNING === true)) { | ||||||
|       this.flexWrap = true; |       this.flexWrap = true; | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     handleDemoRedirect(this.route, this.router); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,18 +1,18 @@ | |||||||
| import { ChangeDetectionStrategy, Component, Inject, Input, LOCALE_ID, OnInit, HostBinding } from '@angular/core'; | import { ChangeDetectionStrategy, Component, Inject, Input, LOCALE_ID, OnInit, HostBinding } from '@angular/core'; | ||||||
| import { echarts, EChartsOption } from '../../graphs/echarts'; | import { echarts, EChartsOption } from '@app/graphs/echarts'; | ||||||
| import { combineLatest, fromEvent, merge, Observable, of } from 'rxjs'; | import { combineLatest, fromEvent, merge, Observable, of } from 'rxjs'; | ||||||
| import { map, mergeMap, share, startWith, switchMap, tap } from 'rxjs/operators'; | import { map, mergeMap, share, startWith, switchMap, tap } from 'rxjs/operators'; | ||||||
| import { ApiService } from '../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { SeoService } from '../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { formatNumber } from '@angular/common'; | import { formatNumber } from '@angular/common'; | ||||||
| import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | ||||||
| import { selectPowerOfTen } from '../../bitcoin.utils'; | import { selectPowerOfTen } from '@app/bitcoin.utils'; | ||||||
| import { StorageService } from '../../services/storage.service'; | import { StorageService } from '@app/services/storage.service'; | ||||||
| import { MiningService } from '../../services/mining.service'; | import { MiningService } from '@app/services/mining.service'; | ||||||
| import { download } from '../../shared/graphs.utils'; | import { download } from '@app/shared/graphs.utils'; | ||||||
| import { ActivatedRoute } from '@angular/router'; | import { ActivatedRoute } from '@angular/router'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { seoDescriptionNetwork } from '../../shared/common.utils'; | import { seoDescriptionNetwork } from '@app/shared/common.utils'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-hashrate-chart', |   selector: 'app-hashrate-chart', | ||||||
|  | |||||||
| @ -1,16 +1,16 @@ | |||||||
| import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, Input, LOCALE_ID, OnInit, HostBinding } from '@angular/core'; | import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, Input, LOCALE_ID, OnInit, HostBinding } from '@angular/core'; | ||||||
| import { EChartsOption } from '../../graphs/echarts'; | import { EChartsOption } from '@app/graphs/echarts'; | ||||||
| import { Observable } from 'rxjs'; | import { Observable } from 'rxjs'; | ||||||
| import { delay, map, retryWhen, share, startWith, switchMap, tap } from 'rxjs/operators'; | import { delay, map, retryWhen, share, startWith, switchMap, tap } from 'rxjs/operators'; | ||||||
| import { ApiService } from '../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { SeoService } from '../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | ||||||
| import { chartColors, poolsColor } from '../../app.constants'; | import { chartColors, poolsColor } from '@app/app.constants'; | ||||||
| import { StorageService } from '../../services/storage.service'; | import { StorageService } from '@app/services/storage.service'; | ||||||
| import { MiningService } from '../../services/mining.service'; | import { MiningService } from '@app/services/mining.service'; | ||||||
| import { download } from '../../shared/graphs.utils'; | import { download } from '@app/shared/graphs.utils'; | ||||||
| import { ActivatedRoute } from '@angular/router'; | import { ActivatedRoute } from '@angular/router'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| 
 | 
 | ||||||
| interface Hashrate { | interface Hashrate { | ||||||
|   timestamp: number; |   timestamp: number; | ||||||
|  | |||||||
| @ -1,10 +1,10 @@ | |||||||
| import { Component, Input, Inject, LOCALE_ID, ChangeDetectionStrategy, OnInit, OnDestroy } from '@angular/core'; | import { Component, Input, Inject, LOCALE_ID, ChangeDetectionStrategy, OnInit, OnDestroy } from '@angular/core'; | ||||||
| import { EChartsOption } from '../../graphs/echarts'; | import { EChartsOption } from '@app/graphs/echarts'; | ||||||
| import { OnChanges } from '@angular/core'; | import { OnChanges } from '@angular/core'; | ||||||
| import { StorageService } from '../../services/storage.service'; | import { StorageService } from '@app/services/storage.service'; | ||||||
| import { download, formatterXAxis, formatterXAxisLabel } from '../../shared/graphs.utils'; | import { download, formatterXAxis, formatterXAxisLabel } from '@app/shared/graphs.utils'; | ||||||
| import { formatNumber } from '@angular/common'; | import { formatNumber } from '@angular/common'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { Subscription } from 'rxjs'; | import { Subscription } from 'rxjs'; | ||||||
| 
 | 
 | ||||||
| const OUTLIERS_MEDIAN_MULTIPLIER = 4; | const OUTLIERS_MEDIAN_MULTIPLIER = 4; | ||||||
|  | |||||||
| @ -1,8 +1,8 @@ | |||||||
| import { DOCUMENT } from '@angular/common'; | import { DOCUMENT } from '@angular/common'; | ||||||
| import { ChangeDetectionStrategy, Component, Inject, OnInit } from '@angular/core'; | import { ChangeDetectionStrategy, Component, Inject, OnInit } from '@angular/core'; | ||||||
| import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; | ||||||
| import { languages } from '../../app.constants'; | import { languages } from '@app/app.constants'; | ||||||
| import { LanguageService } from '../../services/language.service'; | import { LanguageService } from '@app/services/language.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-language-selector', |   selector: 'app-language-selector', | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| import { Component, Inject, LOCALE_ID, ChangeDetectionStrategy, Input, OnChanges, OnInit } from '@angular/core'; | import { Component, Inject, LOCALE_ID, ChangeDetectionStrategy, Input, OnChanges, OnInit } from '@angular/core'; | ||||||
| import { formatDate, formatNumber } from '@angular/common'; | import { formatDate, formatNumber } from '@angular/common'; | ||||||
| import { EChartsOption } from '../../graphs/echarts'; | import { EChartsOption } from '@app/graphs/echarts'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-lbtc-pegs-graph', |   selector: 'app-lbtc-pegs-graph', | ||||||
|  | |||||||
| @ -1,9 +1,9 @@ | |||||||
| import { Component, OnInit } from '@angular/core'; | import { Component, OnInit } from '@angular/core'; | ||||||
| import { Env, StateService } from '../../services/state.service'; | import { Env, StateService } from '@app/services/state.service'; | ||||||
| import { merge, Observable, of} from 'rxjs'; | import { merge, Observable, of} from 'rxjs'; | ||||||
| import { LanguageService } from '../../services/language.service'; | import { LanguageService } from '@app/services/language.service'; | ||||||
| import { EnterpriseService } from '../../services/enterprise.service'; | import { EnterpriseService } from '@app/services/enterprise.service'; | ||||||
| import { NavigationService } from '../../services/navigation.service'; | import { NavigationService } from '@app/services/navigation.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-liquid-master-page', |   selector: 'app-liquid-master-page', | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; | import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; | ||||||
| import { Observable, map, of } from 'rxjs'; | import { Observable, map, of } from 'rxjs'; | ||||||
| import { FederationUtxo } from '../../../interfaces/node-api.interface'; | import { FederationUtxo } from '@interfaces/node-api.interface'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-expired-utxos-stats', |   selector: 'app-expired-utxos-stats', | ||||||
|  | |||||||
| @ -1,10 +1,10 @@ | |||||||
| import { Component, OnInit, ChangeDetectionStrategy, Input } from '@angular/core'; | import { Component, OnInit, ChangeDetectionStrategy, Input } from '@angular/core'; | ||||||
| import { Observable, Subject, combineLatest, of, timer } from 'rxjs'; | import { Observable, Subject, combineLatest, of, timer } from 'rxjs'; | ||||||
| import { delayWhen, filter, map, share, shareReplay, switchMap, takeUntil, tap, throttleTime } from 'rxjs/operators'; | import { delayWhen, filter, map, share, shareReplay, switchMap, takeUntil, tap, throttleTime } from 'rxjs/operators'; | ||||||
| import { ApiService } from '../../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { Env, StateService } from '../../../services/state.service'; | import { Env, StateService } from '@app/services/state.service'; | ||||||
| import { AuditStatus, CurrentPegs, FederationAddress } from '../../../interfaces/node-api.interface'; | import { AuditStatus, CurrentPegs, FederationAddress } from '@interfaces/node-api.interface'; | ||||||
| import { WebsocketService } from '../../../services/websocket.service'; | import { WebsocketService } from '@app/services/websocket.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-federation-addresses-list', |   selector: 'app-federation-addresses-list', | ||||||
|  | |||||||
| @ -2,10 +2,10 @@ import { Component, OnInit, ChangeDetectionStrategy, Input } from '@angular/core | |||||||
| import { ActivatedRoute, Router } from '@angular/router'; | import { ActivatedRoute, Router } from '@angular/router'; | ||||||
| import { BehaviorSubject, Observable, Subject, combineLatest, of, timer } from 'rxjs'; | import { BehaviorSubject, Observable, Subject, combineLatest, of, timer } from 'rxjs'; | ||||||
| import { delayWhen, filter, map, share, shareReplay, switchMap, takeUntil, tap, throttleTime } from 'rxjs/operators'; | import { delayWhen, filter, map, share, shareReplay, switchMap, takeUntil, tap, throttleTime } from 'rxjs/operators'; | ||||||
| import { ApiService } from '../../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { Env, StateService } from '../../../services/state.service'; | import { Env, StateService } from '@app/services/state.service'; | ||||||
| import { AuditStatus, CurrentPegs, FederationUtxo } from '../../../interfaces/node-api.interface'; | import { AuditStatus, CurrentPegs, FederationUtxo } from '@interfaces/node-api.interface'; | ||||||
| import { WebsocketService } from '../../../services/websocket.service'; | import { WebsocketService } from '@app/services/websocket.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-federation-utxos-list', |   selector: 'app-federation-utxos-list', | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| import { Component, OnInit } from '@angular/core'; | import { Component, OnInit } from '@angular/core'; | ||||||
| import { SeoService } from '../../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-federation-wallet', |   selector: 'app-federation-wallet', | ||||||
|  | |||||||
| @ -2,11 +2,11 @@ import { ActivatedRoute, Router } from '@angular/router'; | |||||||
| import { Component, OnInit, ChangeDetectionStrategy, Input, Inject, LOCALE_ID, ChangeDetectorRef } from '@angular/core'; | import { Component, OnInit, ChangeDetectionStrategy, Input, Inject, LOCALE_ID, ChangeDetectorRef } from '@angular/core'; | ||||||
| import { BehaviorSubject, Observable, Subject, Subscription, combineLatest, of, timer } from 'rxjs'; | import { BehaviorSubject, Observable, Subject, Subscription, combineLatest, of, timer } from 'rxjs'; | ||||||
| import { delayWhen, filter, map, share, shareReplay, switchMap, take, takeUntil, tap, throttleTime } from 'rxjs/operators'; | import { delayWhen, filter, map, share, shareReplay, switchMap, take, takeUntil, tap, throttleTime } from 'rxjs/operators'; | ||||||
| import { ApiService } from '../../../services/api.service'; | import { ApiService } from '@app/services/api.service'; | ||||||
| import { Env, StateService } from '../../../services/state.service'; | import { Env, StateService } from '@app/services/state.service'; | ||||||
| import { AuditStatus, CurrentPegs, RecentPeg } from '../../../interfaces/node-api.interface'; | import { AuditStatus, CurrentPegs, RecentPeg } from '@interfaces/node-api.interface'; | ||||||
| import { WebsocketService } from '../../../services/websocket.service'; | import { WebsocketService } from '@app/services/websocket.service'; | ||||||
| import { SeoService } from '../../../services/seo.service'; | import { SeoService } from '@app/services/seo.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-recent-pegs-list', |   selector: 'app-recent-pegs-list', | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; | import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; | ||||||
| import { Observable } from 'rxjs'; | import { Observable } from 'rxjs'; | ||||||
| import { PegsVolume } from '../../../interfaces/node-api.interface'; | import { PegsVolume } from '@interfaces/node-api.interface'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-recent-pegs-stats', |   selector: 'app-recent-pegs-stats', | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| import { Component, ChangeDetectionStrategy, Input, OnChanges, OnInit, HostListener } from '@angular/core'; | import { Component, ChangeDetectionStrategy, Input, OnChanges, OnInit, HostListener } from '@angular/core'; | ||||||
| import { EChartsOption } from '../../../graphs/echarts'; | import { EChartsOption } from '@app/graphs/echarts'; | ||||||
| import { CurrentPegs } from '../../../interfaces/node-api.interface'; | import { CurrentPegs } from '@interfaces/node-api.interface'; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; | import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; | ||||||
| import { Observable } from 'rxjs'; | import { Observable } from 'rxjs'; | ||||||
| import { Env, StateService } from '../../../services/state.service'; | import { Env, StateService } from '@app/services/state.service'; | ||||||
| import { CurrentPegs } from '../../../interfaces/node-api.interface'; | import { CurrentPegs } from '@interfaces/node-api.interface'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-reserves-supply-stats', |   selector: 'app-reserves-supply-stats', | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| .sticky-loading { | .sticky-loading { | ||||||
|   position: absolute; |   position: absolute; | ||||||
|   right: 10px; |   right: 10px; | ||||||
|   z-index: 99; |   z-index: 1000; | ||||||
|   font-size: 14px; |   font-size: 14px; | ||||||
|   @media (width >= 992px) { |   @media (width >= 992px) { | ||||||
|     left: 32px; |     left: 32px; | ||||||
|  | |||||||
| @ -1,8 +1,8 @@ | |||||||
| import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; | import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; | ||||||
| import { Observable } from 'rxjs'; | import { Observable } from 'rxjs'; | ||||||
| import { map } from 'rxjs/operators'; | import { map } from 'rxjs/operators'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { WebsocketService } from '../../services/websocket.service'; | import { WebsocketService } from '@app/services/websocket.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-loading-indicator', |   selector: 'app-loading-indicator', | ||||||
|  | |||||||
| @ -1,8 +1,8 @@ | |||||||
| import { Component, OnInit } from '@angular/core'; | import { Component, OnInit } from '@angular/core'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { Observable, Subscription, merge, of } from 'rxjs'; | import { Observable, Subscription, merge, of } from 'rxjs'; | ||||||
| import { LanguageService } from '../../services/language.service'; | import { LanguageService } from '@app/services/language.service'; | ||||||
| import { EnterpriseService } from '../../services/enterprise.service'; | import { EnterpriseService } from '@app/services/enterprise.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-master-page-preview', |   selector: 'app-master-page-preview', | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| import { Component, OnInit } from '@angular/core'; | import { Component, OnInit } from '@angular/core'; | ||||||
| import { StateService } from '../../services/state.service'; | import { StateService } from '@app/services/state.service'; | ||||||
| import { Observable, merge, of } from 'rxjs'; | import { Observable, merge, of } from 'rxjs'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|  | |||||||
| @ -1,12 +1,12 @@ | |||||||
| import { Component, OnInit, OnDestroy, Input, ViewChild } from '@angular/core'; | import { Component, OnInit, OnDestroy, Input, ViewChild } from '@angular/core'; | ||||||
| import { Router } from '@angular/router'; | import { Router } from '@angular/router'; | ||||||
| import { Env, StateService } from '../../services/state.service'; | import { Env, StateService } from '@app/services/state.service'; | ||||||
| import { Observable, merge, of, Subscription } from 'rxjs'; | import { Observable, merge, of, Subscription } from 'rxjs'; | ||||||
| import { LanguageService } from '../../services/language.service'; | import { LanguageService } from '@app/services/language.service'; | ||||||
| import { EnterpriseService } from '../../services/enterprise.service'; | import { EnterpriseService } from '@app/services/enterprise.service'; | ||||||
| import { NavigationService } from '../../services/navigation.service'; | import { NavigationService } from '@app/services/navigation.service'; | ||||||
| import { MenuComponent } from '../menu/menu.component'; | import { MenuComponent } from '@components/menu/menu.component'; | ||||||
| import { StorageService } from '../../services/storage.service'; | import { StorageService } from '@app/services/storage.service'; | ||||||
| 
 | 
 | ||||||
| @Component({ | @Component({ | ||||||
|   selector: 'app-master-page', |   selector: 'app-master-page', | ||||||
|  | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user