Merge branch 'master' into nymkappa/bugfix/update-log-indexer
This commit is contained in:
		
						commit
						c888d59368
					
				| @ -4,7 +4,7 @@ import logger from '../logger'; | |||||||
| import { Common } from './common'; | import { Common } from './common'; | ||||||
| 
 | 
 | ||||||
| class DatabaseMigration { | class DatabaseMigration { | ||||||
|   private static currentVersion = 27; |   private static currentVersion = 28; | ||||||
|   private queryTimeout = 120000; |   private queryTimeout = 120000; | ||||||
|   private statisticsAddedIndexed = false; |   private statisticsAddedIndexed = false; | ||||||
|   private uniqueLogs: string[] = []; |   private uniqueLogs: string[] = []; | ||||||
| @ -274,6 +274,12 @@ class DatabaseMigration { | |||||||
|         await this.$executeQuery('ALTER TABLE `lightning_stats` ADD med_base_fee_mtokens bigint(20) unsigned NOT NULL DEFAULT "0"'); |         await this.$executeQuery('ALTER TABLE `lightning_stats` ADD med_base_fee_mtokens bigint(20) unsigned NOT NULL DEFAULT "0"'); | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|  |       if (databaseSchemaVersion < 28 && isBitcoin === true) { | ||||||
|  |         await this.$executeQuery(`TRUNCATE lightning_stats`); | ||||||
|  |         await this.$executeQuery(`TRUNCATE node_stats`); | ||||||
|  |         await this.$executeQuery(`ALTER TABLE lightning_stats MODIFY added DATE`); | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|     } catch (e) { |     } catch (e) { | ||||||
|       throw e; |       throw e; | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -44,7 +44,9 @@ class NodeSyncService { | |||||||
|       await this.$lookUpCreationDateFromChain(); |       await this.$lookUpCreationDateFromChain(); | ||||||
|       await this.$updateNodeFirstSeen(); |       await this.$updateNodeFirstSeen(); | ||||||
|       await this.$scanForClosedChannels(); |       await this.$scanForClosedChannels(); | ||||||
|       await this.$runClosedChannelsForensics(); |       if (config.MEMPOOL.BACKEND === 'esplora') { | ||||||
|  |         await this.$runClosedChannelsForensics(); | ||||||
|  |       } | ||||||
| 
 | 
 | ||||||
|     } catch (e) { |     } catch (e) { | ||||||
|       logger.err('$updateNodes() error: ' + (e instanceof Error ? e.message : e)); |       logger.err('$updateNodes() error: ' + (e instanceof Error ? e.message : e)); | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ import channelsApi from '../../api/explorer/channels.api'; | |||||||
| import * as net from 'net'; | import * as net from 'net'; | ||||||
| 
 | 
 | ||||||
| class LightningStatsUpdater { | class LightningStatsUpdater { | ||||||
|   constructor() {} |   hardCodedStartTime = '2018-01-12'; | ||||||
| 
 | 
 | ||||||
|   public async $startService() { |   public async $startService() { | ||||||
|     logger.info('Starting Lightning Stats service'); |     logger.info('Starting Lightning Stats service'); | ||||||
| @ -28,17 +28,26 @@ class LightningStatsUpdater { | |||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const now = new Date(); |     await this.$populateHistoricalStatistics(); | ||||||
|     const nextHourInterval = new Date(now.getFullYear(), now.getMonth(), now.getDate(), Math.floor(now.getHours() / 1) + 1, 0, 0, 0); |     await this.$populateHistoricalNodeStatistics(); | ||||||
|     const difference = nextHourInterval.getTime() - now.getTime(); |  | ||||||
| 
 | 
 | ||||||
|     setTimeout(() => { |     setTimeout(() => { | ||||||
|       setInterval(async () => { |       this.$runTasks(); | ||||||
|         await this.$runTasks(); |     }, this.timeUntilMidnight()); | ||||||
|       }, 1000 * 60 * 60); |   } | ||||||
|     }, difference); |  | ||||||
| 
 | 
 | ||||||
|     await this.$runTasks(); |   private timeUntilMidnight(): number { | ||||||
|  |     const date = new Date(); | ||||||
|  |     this.setDateMidnight(date); | ||||||
|  |     date.setUTCHours(24); | ||||||
|  |     return date.getTime() - new Date().getTime(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   private setDateMidnight(date: Date): void { | ||||||
|  |     date.setUTCHours(0); | ||||||
|  |     date.setUTCMinutes(0); | ||||||
|  |     date.setUTCSeconds(0); | ||||||
|  |     date.setUTCMilliseconds(0); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   private async $lightningIsSynced(): Promise<boolean> { |   private async $lightningIsSynced(): Promise<boolean> { | ||||||
| @ -46,161 +55,17 @@ class LightningStatsUpdater { | |||||||
|     return nodeInfo.is_synced_to_chain && nodeInfo.is_synced_to_graph; |     return nodeInfo.is_synced_to_chain && nodeInfo.is_synced_to_graph; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   private async $runTasks() { |   private async $runTasks(): Promise<void> { | ||||||
|     await this.$populateHistoricalData(); |  | ||||||
|     await this.$logLightningStatsDaily(); |     await this.$logLightningStatsDaily(); | ||||||
|     await this.$logNodeStatsDaily(); |     await this.$logNodeStatsDaily(); | ||||||
|   } |  | ||||||
| 
 | 
 | ||||||
|   private async $logNodeStatsDaily() { |     setTimeout(() => { | ||||||
|     const currentDate = new Date().toISOString().split('T')[0]; |       this.$runTasks(); | ||||||
|     try { |     }, this.timeUntilMidnight()); | ||||||
|       const [state]: any = await DB.query(`SELECT string FROM state WHERE name = 'last_node_stats'`); |  | ||||||
|       // Only store once per day
 |  | ||||||
|       if (state[0].string === currentDate) { |  | ||||||
|         return; |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       logger.info(`Running daily node stats update...`); |  | ||||||
| 
 |  | ||||||
|       const query = `SELECT nodes.public_key, c1.channels_count_left, c2.channels_count_right, c1.channels_capacity_left, c2.channels_capacity_right FROM nodes LEFT JOIN (SELECT node1_public_key, COUNT(id) AS channels_count_left, SUM(capacity) AS channels_capacity_left FROM channels WHERE channels.status < 2 GROUP BY node1_public_key) c1 ON c1.node1_public_key = nodes.public_key LEFT JOIN (SELECT node2_public_key, COUNT(id) AS channels_count_right, SUM(capacity) AS channels_capacity_right FROM channels WHERE channels.status < 2 GROUP BY node2_public_key) c2 ON c2.node2_public_key = nodes.public_key`; |  | ||||||
|       const [nodes]: any = await DB.query(query); |  | ||||||
| 
 |  | ||||||
|       // First run we won't have any nodes yet
 |  | ||||||
|       if (nodes.length < 10) { |  | ||||||
|         return; |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       for (const node of nodes) { |  | ||||||
|         await DB.query( |  | ||||||
|           `INSERT INTO node_stats(public_key, added, capacity, channels) VALUES (?, NOW(), ?, ?)`, |  | ||||||
|           [node.public_key, (parseInt(node.channels_capacity_left || 0, 10)) + (parseInt(node.channels_capacity_right || 0, 10)), |  | ||||||
|             node.channels_count_left + node.channels_count_right]); |  | ||||||
|       } |  | ||||||
|       await DB.query(`UPDATE state SET string = ? WHERE name = 'last_node_stats'`, [currentDate]); |  | ||||||
|       logger.info('Daily node stats has updated.'); |  | ||||||
|     } catch (e) { |  | ||||||
|       logger.err('$logNodeStatsDaily() error: ' + (e instanceof Error ? e.message : e)); |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   // We only run this on first launch
 |  | ||||||
|   private async $populateHistoricalData() { |  | ||||||
|     const startTime = '2018-01-13'; |  | ||||||
|     try { |  | ||||||
|       const [rows]: any = await DB.query(`SELECT COUNT(*) FROM lightning_stats`); |  | ||||||
|       // Only store once per day
 |  | ||||||
|       if (rows[0]['COUNT(*)'] > 0) { |  | ||||||
|         return; |  | ||||||
|       } |  | ||||||
|       logger.info(`Running historical stats population...`); |  | ||||||
| 
 |  | ||||||
|       const [channels]: any = await DB.query(`SELECT capacity, created, closing_date FROM channels ORDER BY created ASC`); |  | ||||||
| 
 |  | ||||||
|       let date: Date = new Date(startTime); |  | ||||||
|       const currentDate = new Date(); |  | ||||||
| 
 |  | ||||||
|       while (date < currentDate) { |  | ||||||
|         let totalCapacity = 0; |  | ||||||
|         let channelsCount = 0; |  | ||||||
|         for (const channel of channels) { |  | ||||||
|           if (new Date(channel.created) > date) { |  | ||||||
|             break; |  | ||||||
|           } |  | ||||||
|           if (channel.closing_date !== null && new Date(channel.closing_date) < date) { |  | ||||||
|             continue; |  | ||||||
|           } |  | ||||||
|           totalCapacity += channel.capacity; |  | ||||||
|           channelsCount++; |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         const query = `INSERT INTO lightning_stats(
 |  | ||||||
|           added, |  | ||||||
|           channel_count, |  | ||||||
|           node_count, |  | ||||||
|           total_capacity, |  | ||||||
|           tor_nodes, |  | ||||||
|           clearnet_nodes, |  | ||||||
|           unannounced_nodes |  | ||||||
|         ) |  | ||||||
|         VALUES (FROM_UNIXTIME(?), ?, ?, ?, ?, ?, ?)`;
 |  | ||||||
| 
 |  | ||||||
|         await DB.query(query, [ |  | ||||||
|           date.getTime() / 1000, |  | ||||||
|           channelsCount, |  | ||||||
|           0, |  | ||||||
|           totalCapacity, |  | ||||||
|           0, |  | ||||||
|           0, |  | ||||||
|           0 |  | ||||||
|         ]); |  | ||||||
| 
 |  | ||||||
|         // Add one day and continue
 |  | ||||||
|         date.setDate(date.getDate() + 1); |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       const [nodes]: any = await DB.query(`SELECT first_seen, sockets FROM nodes ORDER BY first_seen ASC`); |  | ||||||
|       date = new Date(startTime); |  | ||||||
| 
 |  | ||||||
|       while (date < currentDate) { |  | ||||||
|         let nodeCount = 0; |  | ||||||
|         let clearnetNodes = 0; |  | ||||||
|         let torNodes = 0; |  | ||||||
|         let unannouncedNodes = 0; |  | ||||||
|         for (const node of nodes) { |  | ||||||
|           if (new Date(node.first_seen) > date) { |  | ||||||
|             break; |  | ||||||
|           } |  | ||||||
|           nodeCount++; |  | ||||||
| 
 |  | ||||||
|           const sockets = node.sockets.split(','); |  | ||||||
|           let isUnnanounced = true; |  | ||||||
|           for (const socket of sockets) { |  | ||||||
|             const hasOnion = socket.indexOf('.onion') !== -1; |  | ||||||
|             if (hasOnion) { |  | ||||||
|               torNodes++; |  | ||||||
|               isUnnanounced = false; |  | ||||||
|             } |  | ||||||
|             const hasClearnet = [4, 6].includes(net.isIP(socket.split(':')[0])); |  | ||||||
|             if (hasClearnet) { |  | ||||||
|               clearnetNodes++; |  | ||||||
|               isUnnanounced = false; |  | ||||||
|             } |  | ||||||
|           } |  | ||||||
|           if (isUnnanounced) { |  | ||||||
|             unannouncedNodes++; |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         const query = `UPDATE lightning_stats SET node_count = ?, tor_nodes = ?, clearnet_nodes = ?, unannounced_nodes = ? WHERE added = FROM_UNIXTIME(?)`; |  | ||||||
| 
 |  | ||||||
|         await DB.query(query, [ |  | ||||||
|           nodeCount, |  | ||||||
|           torNodes, |  | ||||||
|           clearnetNodes, |  | ||||||
|           unannouncedNodes, |  | ||||||
|           date.getTime() / 1000, |  | ||||||
|         ]); |  | ||||||
| 
 |  | ||||||
|         // Add one day and continue
 |  | ||||||
|         date.setDate(date.getDate() + 1); |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       logger.info('Historical stats populated.'); |  | ||||||
|     } catch (e) { |  | ||||||
|       logger.err('$populateHistoricalData() error: ' + (e instanceof Error ? e.message : e)); |  | ||||||
|     } |  | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   private async $logLightningStatsDaily() { |   private async $logLightningStatsDaily() { | ||||||
|     const currentDate = new Date().toISOString().split('T')[0]; |  | ||||||
|     try { |     try { | ||||||
|       const [state]: any = await DB.query(`SELECT string FROM state WHERE name = 'last_node_stats'`); |  | ||||||
|       // Only store once per day
 |  | ||||||
|       if (state[0].string === currentDate) { |  | ||||||
|         return; |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       logger.info(`Running lightning daily stats log...`);   |       logger.info(`Running lightning daily stats log...`);   | ||||||
| 
 | 
 | ||||||
|       const networkGraph = await lightningApi.$getNetworkGraph(); |       const networkGraph = await lightningApi.$getNetworkGraph(); | ||||||
| @ -250,7 +115,7 @@ class LightningStatsUpdater { | |||||||
|           med_fee_rate, |           med_fee_rate, | ||||||
|           med_base_fee_mtokens |           med_base_fee_mtokens | ||||||
|         ) |         ) | ||||||
|         VALUES (NOW(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`;
 |         VALUES (NOW() - INTERVAL 1 DAY, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`;
 | ||||||
| 
 | 
 | ||||||
|       await DB.query(query, [ |       await DB.query(query, [ | ||||||
|         networkGraph.channels.length, |         networkGraph.channels.length, | ||||||
| @ -271,6 +136,184 @@ class LightningStatsUpdater { | |||||||
|       logger.err('$logLightningStatsDaily() error: ' + (e instanceof Error ? e.message : e)); |       logger.err('$logLightningStatsDaily() error: ' + (e instanceof Error ? e.message : e)); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   private async $logNodeStatsDaily() { | ||||||
|  |     try { | ||||||
|  |       logger.info(`Running daily node stats update...`); | ||||||
|  | 
 | ||||||
|  |       const query = `SELECT nodes.public_key, c1.channels_count_left, c2.channels_count_right, c1.channels_capacity_left, c2.channels_capacity_right FROM nodes LEFT JOIN (SELECT node1_public_key, COUNT(id) AS channels_count_left, SUM(capacity) AS channels_capacity_left FROM channels WHERE channels.status < 2 GROUP BY node1_public_key) c1 ON c1.node1_public_key = nodes.public_key LEFT JOIN (SELECT node2_public_key, COUNT(id) AS channels_count_right, SUM(capacity) AS channels_capacity_right FROM channels WHERE channels.status < 2 GROUP BY node2_public_key) c2 ON c2.node2_public_key = nodes.public_key`; | ||||||
|  |       const [nodes]: any = await DB.query(query); | ||||||
|  | 
 | ||||||
|  |       for (const node of nodes) { | ||||||
|  |         await DB.query( | ||||||
|  |           `INSERT INTO node_stats(public_key, added, capacity, channels) VALUES (?, NOW() - INTERVAL 1 DAY, ?, ?)`, | ||||||
|  |           [node.public_key, (parseInt(node.channels_capacity_left || 0, 10)) + (parseInt(node.channels_capacity_right || 0, 10)), | ||||||
|  |             node.channels_count_left + node.channels_count_right]); | ||||||
|  |       } | ||||||
|  |       logger.info('Daily node stats has updated.'); | ||||||
|  |     } catch (e) { | ||||||
|  |       logger.err('$logNodeStatsDaily() error: ' + (e instanceof Error ? e.message : e)); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // We only run this on first launch
 | ||||||
|  |   private async $populateHistoricalStatistics() { | ||||||
|  |     try { | ||||||
|  |       const [rows]: any = await DB.query(`SELECT COUNT(*) FROM lightning_stats`); | ||||||
|  |       // Only run if table is empty
 | ||||||
|  |       if (rows[0]['COUNT(*)'] > 0) { | ||||||
|  |         return; | ||||||
|  |       } | ||||||
|  |       logger.info(`Running historical stats population...`); | ||||||
|  | 
 | ||||||
|  |       const [channels]: any = await DB.query(`SELECT capacity, created, closing_date FROM channels ORDER BY created ASC`); | ||||||
|  |       const [nodes]: any = await DB.query(`SELECT first_seen, sockets FROM nodes ORDER BY first_seen ASC`); | ||||||
|  | 
 | ||||||
|  |       const date: Date = new Date(this.hardCodedStartTime); | ||||||
|  |       const currentDate = new Date(); | ||||||
|  |       this.setDateMidnight(currentDate); | ||||||
|  | 
 | ||||||
|  |       while (date < currentDate) { | ||||||
|  |         let totalCapacity = 0; | ||||||
|  |         let channelsCount = 0; | ||||||
|  | 
 | ||||||
|  |         for (const channel of channels) { | ||||||
|  |           if (new Date(channel.created) > date) { | ||||||
|  |             break; | ||||||
|  |           } | ||||||
|  |           if (channel.closing_date === null || new Date(channel.closing_date) > date) { | ||||||
|  |             totalCapacity += channel.capacity; | ||||||
|  |             channelsCount++; | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         let nodeCount = 0; | ||||||
|  |         let clearnetNodes = 0; | ||||||
|  |         let torNodes = 0; | ||||||
|  |         let unannouncedNodes = 0; | ||||||
|  | 
 | ||||||
|  |         for (const node of nodes) { | ||||||
|  |           if (new Date(node.first_seen) > date) { | ||||||
|  |             break; | ||||||
|  |           } | ||||||
|  |           nodeCount++; | ||||||
|  | 
 | ||||||
|  |           const sockets = node.sockets.split(','); | ||||||
|  |           let isUnnanounced = true; | ||||||
|  |           for (const socket of sockets) { | ||||||
|  |             const hasOnion = socket.indexOf('.onion') !== -1; | ||||||
|  |             if (hasOnion) { | ||||||
|  |               torNodes++; | ||||||
|  |               isUnnanounced = false; | ||||||
|  |             } | ||||||
|  |             const hasClearnet = [4, 6].includes(net.isIP(socket.split(':')[0])); | ||||||
|  |             if (hasClearnet) { | ||||||
|  |               clearnetNodes++; | ||||||
|  |               isUnnanounced = false; | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |           if (isUnnanounced) { | ||||||
|  |             unannouncedNodes++; | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         const query = `INSERT INTO lightning_stats(
 | ||||||
|  |           added, | ||||||
|  |           channel_count, | ||||||
|  |           node_count, | ||||||
|  |           total_capacity, | ||||||
|  |           tor_nodes, | ||||||
|  |           clearnet_nodes, | ||||||
|  |           unannounced_nodes | ||||||
|  |         ) | ||||||
|  |         VALUES (FROM_UNIXTIME(?), ?, ?, ?, ?, ?, ?)`;
 | ||||||
|  | 
 | ||||||
|  |         await DB.query(query, [ | ||||||
|  |           date.getTime() / 1000, | ||||||
|  |           channelsCount, | ||||||
|  |           nodeCount, | ||||||
|  |           totalCapacity, | ||||||
|  |           torNodes, | ||||||
|  |           clearnetNodes, | ||||||
|  |           unannouncedNodes, | ||||||
|  |         ]); | ||||||
|  | 
 | ||||||
|  |         date.setUTCDate(date.getUTCDate() + 1); | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       logger.info('Historical stats populated.'); | ||||||
|  |     } catch (e) { | ||||||
|  |       logger.err('$populateHistoricalData() error: ' + (e instanceof Error ? e.message : e)); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   private async $populateHistoricalNodeStatistics() { | ||||||
|  |     try { | ||||||
|  |       const [rows]: any = await DB.query(`SELECT COUNT(*) FROM node_stats`); | ||||||
|  |       // Only run if table is empty
 | ||||||
|  |       if (rows[0]['COUNT(*)'] > 0) { | ||||||
|  |         return; | ||||||
|  |       } | ||||||
|  |       logger.info(`Running historical node stats population...`); | ||||||
|  | 
 | ||||||
|  |       const [nodes]: any = await DB.query(`SELECT public_key, first_seen, alias FROM nodes ORDER BY first_seen ASC`); | ||||||
|  | 
 | ||||||
|  |       for (const node of nodes) { | ||||||
|  |         const [channels]: any = await DB.query(`SELECT capacity, created, closing_date FROM channels WHERE node1_public_key = ? OR node2_public_key = ? ORDER BY created ASC`, [node.public_key, node.public_key]); | ||||||
|  |          | ||||||
|  |         const date: Date = new Date(this.hardCodedStartTime); | ||||||
|  |         const currentDate = new Date(); | ||||||
|  |         this.setDateMidnight(currentDate); | ||||||
|  | 
 | ||||||
|  |         let lastTotalCapacity = 0; | ||||||
|  |         let lastChannelsCount = 0; | ||||||
|  | 
 | ||||||
|  |         while (date < currentDate) { | ||||||
|  |           let totalCapacity = 0; | ||||||
|  |           let channelsCount = 0; | ||||||
|  |           for (const channel of channels) { | ||||||
|  |             if (new Date(channel.created) > date) { | ||||||
|  |               break; | ||||||
|  |             } | ||||||
|  |             if (channel.closing_date !== null && new Date(channel.closing_date) < date) { | ||||||
|  |               date.setUTCDate(date.getUTCDate() + 1); | ||||||
|  |               continue; | ||||||
|  |             } | ||||||
|  |             totalCapacity += channel.capacity; | ||||||
|  |             channelsCount++; | ||||||
|  |           } | ||||||
|  | 
 | ||||||
|  |           if (lastTotalCapacity === totalCapacity && lastChannelsCount === channelsCount) { | ||||||
|  |             date.setUTCDate(date.getUTCDate() + 1); | ||||||
|  |             continue; | ||||||
|  |           } | ||||||
|  | 
 | ||||||
|  |           lastTotalCapacity = totalCapacity; | ||||||
|  |           lastChannelsCount = channelsCount; | ||||||
|  |    | ||||||
|  |           const query = `INSERT INTO node_stats(
 | ||||||
|  |             public_key, | ||||||
|  |             added, | ||||||
|  |             capacity, | ||||||
|  |             channels | ||||||
|  |           ) | ||||||
|  |           VALUES (?, FROM_UNIXTIME(?), ?, ?)`;
 | ||||||
|  | 
 | ||||||
|  |           await DB.query(query, [ | ||||||
|  |             node.public_key, | ||||||
|  |             date.getTime() / 1000, | ||||||
|  |             totalCapacity, | ||||||
|  |             channelsCount, | ||||||
|  |           ]); | ||||||
|  |           date.setUTCDate(date.getUTCDate() + 1); | ||||||
|  |         } | ||||||
|  |         logger.debug('Updated node_stats for: ' + node.alias); | ||||||
|  |       } | ||||||
|  |       logger.info('Historical stats populated.'); | ||||||
|  |     } catch (e) { | ||||||
|  |       logger.err('$populateHistoricalNodeData() error: ' + (e instanceof Error ? e.message : e)); | ||||||
|  |     } | ||||||
|  |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export default new LightningStatsUpdater(); | export default new LightningStatsUpdater(); | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| 
 | 
 | ||||||
|   <div class="intro"> |   <div class="intro"> | ||||||
|     <span style="margin-left: auto; margin-right: -20px; margin-bottom: -20px">™</span> |     <span style="margin-left: auto; margin-right: -20px; margin-bottom: -20px">™</span> | ||||||
|     <img class="logo" src="./resources/mempool-logo-bigger.png" /> |     <img class="logo" src="/resources/mempool-logo-bigger.png" /> | ||||||
|     <div class="version"> |     <div class="version"> | ||||||
|       v{{ packetJsonVersion }} [<a href="https://github.com/mempool/mempool/commit/{{ frontendGitCommitHash }}">{{ frontendGitCommitHash }}</a>] |       v{{ packetJsonVersion }} [<a href="https://github.com/mempool/mempool/commit/{{ frontendGitCommitHash }}">{{ frontendGitCommitHash }}</a>] | ||||||
|     </div> |     </div> | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
|   <nav class="navbar navbar-expand-md navbar-dark bg-dark"> |   <nav class="navbar navbar-expand-md navbar-dark bg-dark"> | ||||||
|   <a class="navbar-brand" [routerLink]="['/' | relativeUrl]" style="position: relative;"> |   <a class="navbar-brand" [routerLink]="['/' | relativeUrl]" style="position: relative;"> | ||||||
|     <ng-container *ngIf="{ val: connectionState$ | async } as connectionState"> |     <ng-container *ngIf="{ val: connectionState$ | async } as connectionState"> | ||||||
|       <img src="./resources/bisq/bisq-markets-logo.png" height="35" width="140" class="logo" [ngStyle]="{'opacity': connectionState.val === 2 ? 1 : 0.5 }"> |       <img src="/resources/bisq/bisq-markets-logo.png" height="35" width="140" class="logo" [ngStyle]="{'opacity': connectionState.val === 2 ? 1 : 0.5 }"> | ||||||
|       <div class="connection-badge"> |       <div class="connection-badge"> | ||||||
|         <div class="badge badge-warning" *ngIf="connectionState.val === 0" i18n="master-page.offline">Offline</div> |         <div class="badge badge-warning" *ngIf="connectionState.val === 0" i18n="master-page.offline">Offline</div> | ||||||
|         <div class="badge badge-warning" *ngIf="connectionState.val === 1" i18n="master-page.reconnecting">Reconnecting...</div> |         <div class="badge badge-warning" *ngIf="connectionState.val === 1" i18n="master-page.reconnecting">Reconnecting...</div> | ||||||
| @ -12,16 +12,16 @@ | |||||||
| 
 | 
 | ||||||
|   <div ngbDropdown (window:resize)="onResize($event)" class="dropdown-container" *ngIf="env.TESTNET_ENABLED || env.SIGNET_ENABLED || env.LIQUID_ENABLED || env.BISQ_ENABLED || env.LIQUID_TESTNET_ENABLED"> |   <div ngbDropdown (window:resize)="onResize($event)" class="dropdown-container" *ngIf="env.TESTNET_ENABLED || env.SIGNET_ENABLED || env.LIQUID_ENABLED || env.BISQ_ENABLED || env.LIQUID_TESTNET_ENABLED"> | ||||||
|     <button ngbDropdownToggle type="button" class="btn btn-secondary dropdown-toggle-split" aria-haspopup="true"> |     <button ngbDropdownToggle type="button" class="btn btn-secondary dropdown-toggle-split" aria-haspopup="true"> | ||||||
|       <img src="./resources/bisq-logo.png" style="width: 25px; height: 25px;" class="mr-1"> |       <img src="/resources/bisq-logo.png" style="width: 25px; height: 25px;" class="mr-1"> | ||||||
|     </button> |     </button> | ||||||
|     <div ngbDropdownMenu [ngClass]="{'dropdown-menu-right' : isMobile}"> |     <div ngbDropdownMenu [ngClass]="{'dropdown-menu-right' : isMobile}"> | ||||||
|       <a [href]="env.MEMPOOL_WEBSITE_URL + urlLanguage" ngbDropdownItem class="mainnet"><img src="./resources/bitcoin-logo.png" style="width: 30px;" class="mr-1"> Mainnet</a> |       <a [href]="env.MEMPOOL_WEBSITE_URL + urlLanguage" ngbDropdownItem class="mainnet"><img src="/resources/bitcoin-logo.png" style="width: 30px;" class="mr-1"> Mainnet</a> | ||||||
|       <a [href]="env.MEMPOOL_WEBSITE_URL + urlLanguage + '/signet'" ngbDropdownItem *ngIf="env.SIGNET_ENABLED" class="signet"><img src="./resources/signet-logo.png" style="width: 30px;" class="mr-1"> Signet</a> |       <a [href]="env.MEMPOOL_WEBSITE_URL + urlLanguage + '/signet'" ngbDropdownItem *ngIf="env.SIGNET_ENABLED" class="signet"><img src="/resources/signet-logo.png" style="width: 30px;" class="mr-1"> Signet</a> | ||||||
|       <a [href]="env.MEMPOOL_WEBSITE_URL + urlLanguage + '/testnet'" ngbDropdownItem *ngIf="env.TESTNET_ENABLED" class="testnet"><img src="./resources/testnet-logo.png" style="width: 30px;" class="mr-1"> Testnet</a> |       <a [href]="env.MEMPOOL_WEBSITE_URL + urlLanguage + '/testnet'" ngbDropdownItem *ngIf="env.TESTNET_ENABLED" class="testnet"><img src="/resources/testnet-logo.png" style="width: 30px;" class="mr-1"> Testnet</a> | ||||||
|       <h6 class="dropdown-header" i18n="master-page.layer2-networks-header">Layer 2 Networks</h6> |       <h6 class="dropdown-header" i18n="master-page.layer2-networks-header">Layer 2 Networks</h6> | ||||||
|       <a ngbDropdownItem class="mainnet active" routerLink="/"><img src="./resources/bisq-logo.png" style="width: 30px;" class="mr-1"> Bisq</a> |       <a ngbDropdownItem class="mainnet active" routerLink="/"><img src="/resources/bisq-logo.png" style="width: 30px;" class="mr-1"> Bisq</a> | ||||||
|       <a [href]="env.LIQUID_WEBSITE_URL + urlLanguage" ngbDropdownItem *ngIf="env.LIQUID_ENABLED" class="liquid"><img src="./resources/liquid-logo.png" style="width: 30px;" class="mr-1"> Liquid</a> |       <a [href]="env.LIQUID_WEBSITE_URL + urlLanguage" ngbDropdownItem *ngIf="env.LIQUID_ENABLED" class="liquid"><img src="/resources/liquid-logo.png" style="width: 30px;" class="mr-1"> Liquid</a> | ||||||
|       <a [href]="env.LIQUID_WEBSITE_URL + urlLanguage + '/testnet'" ngbDropdownItem *ngIf="env.LIQUID_TESTNET_ENABLED" class="liquidtestnet"><img src="./resources/liquidtestnet-logo.png" style="width: 30px;" class="mr-1"> Liquid Testnet</a> |       <a [href]="env.LIQUID_WEBSITE_URL + urlLanguage + '/testnet'" ngbDropdownItem *ngIf="env.LIQUID_TESTNET_ENABLED" class="liquidtestnet"><img src="/resources/liquidtestnet-logo.png" style="width: 30px;" class="mr-1"> Liquid Testnet</a> | ||||||
|     </div> |     </div> | ||||||
|   </div> |   </div> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -31,7 +31,7 @@ | |||||||
|             <div class="tooltip-custom"> |             <div class="tooltip-custom"> | ||||||
|               <a class="clear-link" [routerLink]="['/mining/pool' | relativeUrl, block.extras.pool.slug]"> |               <a class="clear-link" [routerLink]="['/mining/pool' | relativeUrl, block.extras.pool.slug]"> | ||||||
|                 <img width="22" height="22" src="{{ block.extras.pool['logo'] }}" |                 <img width="22" height="22" src="{{ block.extras.pool['logo'] }}" | ||||||
|                   onError="this.src = './resources/mining-pools/default.svg'" [alt]="'Logo of ' + block.extras.pool.name + ' mining pool'"> |                   onError="this.src = '/resources/mining-pools/default.svg'" [alt]="'Logo of ' + block.extras.pool.name + ' mining pool'"> | ||||||
|                 <span class="pool-name">{{ block.extras.pool.name }}</span> |                 <span class="pool-name">{{ block.extras.pool.name }}</span> | ||||||
|               </a> |               </a> | ||||||
|               <span *ngIf="!widget" class="tooltiptext badge badge-secondary scriptmessage">{{ block.extras.coinbaseRaw | hex2ascii }}</span> |               <span *ngIf="!widget" class="tooltiptext badge badge-secondary scriptmessage">{{ block.extras.coinbaseRaw | hex2ascii }}</span> | ||||||
|  | |||||||
| @ -64,7 +64,7 @@ export class BlocksList implements OnInit { | |||||||
|                 if (this.indexingAvailable) { |                 if (this.indexingAvailable) { | ||||||
|                   for (const block of blocks) { |                   for (const block of blocks) { | ||||||
|                     // @ts-ignore: Need to add an extra field for the template
 |                     // @ts-ignore: Need to add an extra field for the template
 | ||||||
|                     block.extras.pool.logo = `./resources/mining-pools/` + |                     block.extras.pool.logo = `/resources/mining-pools/` + | ||||||
|                       block.extras.pool.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg'; |                       block.extras.pool.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg'; | ||||||
|                   } |                   } | ||||||
|                 } |                 } | ||||||
| @ -97,7 +97,7 @@ export class BlocksList implements OnInit { | |||||||
|           this.blocksCount = Math.max(this.blocksCount, blocks[1][0].height) + 1; |           this.blocksCount = Math.max(this.blocksCount, blocks[1][0].height) + 1; | ||||||
|           if (this.stateService.env.MINING_DASHBOARD) { |           if (this.stateService.env.MINING_DASHBOARD) { | ||||||
|             // @ts-ignore: Need to add an extra field for the template
 |             // @ts-ignore: Need to add an extra field for the template
 | ||||||
|             blocks[1][0].extras.pool.logo = `./resources/mining-pools/` + |             blocks[1][0].extras.pool.logo = `/resources/mining-pools/` + | ||||||
|               blocks[1][0].extras.pool.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg'; |               blocks[1][0].extras.pool.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg'; | ||||||
|           } |           } | ||||||
|           acc.unshift(blocks[1][0]); |           acc.unshift(blocks[1][0]); | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| <span #buttonWrapper [attr.data-tlite]="copiedMessage" style="position: relative;"> | <span #buttonWrapper [attr.data-tlite]="copiedMessage" style="position: relative;"> | ||||||
|   <button #btn class="btn btn-sm btn-link pt-0" [style]="{'line-height': size === 'small' ? '0.2' : '0.8'}" [attr.data-clipboard-text]="text">  |   <button #btn class="btn btn-sm btn-link pt-0" [style]="{'line-height': size === 'small' ? '0.2' : '0.8'}" [attr.data-clipboard-text]="text">  | ||||||
|     <img src="./resources/clippy.svg" [width]="size === 'small' ? 10 : 13"> |     <img src="/resources/clippy.svg" [width]="size === 'small' ? 10 : 13"> | ||||||
|   </button> |   </button> | ||||||
| </span> | </span> | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ | |||||||
|   <nav class="navbar navbar-expand-md navbar-dark bg-dark"> |   <nav class="navbar navbar-expand-md navbar-dark bg-dark"> | ||||||
|   <a class="navbar-brand" [routerLink]="['/' | relativeUrl]" style="position: relative;"> |   <a class="navbar-brand" [routerLink]="['/' | relativeUrl]" style="position: relative;"> | ||||||
|     <ng-container *ngIf="{ val: connectionState$ | async } as connectionState"> |     <ng-container *ngIf="{ val: connectionState$ | async } as connectionState"> | ||||||
|       <img src="./resources/liquid/liquid-network-logo.png" height="35" width="140" class="logo" [ngStyle]="{'opacity': connectionState.val === 2 ? 1 : 0.5 }"> |       <img src="/resources/liquid/liquid-network-logo.png" height="35" width="140" class="logo" [ngStyle]="{'opacity': connectionState.val === 2 ? 1 : 0.5 }"> | ||||||
|       <div class="connection-badge"> |       <div class="connection-badge"> | ||||||
|         <div class="badge badge-warning" *ngIf="connectionState.val === 0" i18n="master-page.offline">Offline</div> |         <div class="badge badge-warning" *ngIf="connectionState.val === 0" i18n="master-page.offline">Offline</div> | ||||||
|         <div class="badge badge-warning" *ngIf="connectionState.val === 1" i18n="master-page.reconnecting">Reconnecting...</div> |         <div class="badge badge-warning" *ngIf="connectionState.val === 1" i18n="master-page.reconnecting">Reconnecting...</div> | ||||||
| @ -13,16 +13,16 @@ | |||||||
| 
 | 
 | ||||||
|   <div ngbDropdown (window:resize)="onResize($event)" class="dropdown-container" *ngIf="env.TESTNET_ENABLED || env.SIGNET_ENABLED || env.LIQUID_ENABLED || env.BISQ_ENABLED || env.LIQUID_TESTNET_ENABLED"> |   <div ngbDropdown (window:resize)="onResize($event)" class="dropdown-container" *ngIf="env.TESTNET_ENABLED || env.SIGNET_ENABLED || env.LIQUID_ENABLED || env.BISQ_ENABLED || env.LIQUID_TESTNET_ENABLED"> | ||||||
|     <button ngbDropdownToggle type="button" class="btn btn-secondary dropdown-toggle-split" aria-haspopup="true"> |     <button ngbDropdownToggle type="button" class="btn btn-secondary dropdown-toggle-split" aria-haspopup="true"> | ||||||
|       <img src="./resources/{{ network.val === '' ? 'liquid' : network.val }}-logo.png" style="width: 25px; height: 25px;" class="mr-1"> |       <img src="/resources/{{ network.val === '' ? 'liquid' : network.val }}-logo.png" style="width: 25px; height: 25px;" class="mr-1"> | ||||||
|     </button> |     </button> | ||||||
|     <div ngbDropdownMenu [ngClass]="{'dropdown-menu-right' : isMobile}"> |     <div ngbDropdownMenu [ngClass]="{'dropdown-menu-right' : isMobile}"> | ||||||
|       <a [href]="env.MEMPOOL_WEBSITE_URL + urlLanguage" ngbDropdownItem class="mainnet"><img src="./resources/bitcoin-logo.png" style="width: 30px;" class="mr-1"> Mainnet</a> |       <a [href]="env.MEMPOOL_WEBSITE_URL + urlLanguage" ngbDropdownItem class="mainnet"><img src="/resources/bitcoin-logo.png" style="width: 30px;" class="mr-1"> Mainnet</a> | ||||||
|       <a [href]="env.MEMPOOL_WEBSITE_URL + urlLanguage + '/signet'" ngbDropdownItem *ngIf="env.SIGNET_ENABLED" class="signet"><img src="./resources/signet-logo.png" style="width: 30px;" class="mr-1"> Signet</a> |       <a [href]="env.MEMPOOL_WEBSITE_URL + urlLanguage + '/signet'" ngbDropdownItem *ngIf="env.SIGNET_ENABLED" class="signet"><img src="/resources/signet-logo.png" style="width: 30px;" class="mr-1"> Signet</a> | ||||||
|       <a [href]="env.MEMPOOL_WEBSITE_URL + urlLanguage + '/testnet'" ngbDropdownItem *ngIf="env.TESTNET_ENABLED" class="testnet"><img src="./resources/testnet-logo.png" style="width: 30px;" class="mr-1"> Testnet</a> |       <a [href]="env.MEMPOOL_WEBSITE_URL + urlLanguage + '/testnet'" ngbDropdownItem *ngIf="env.TESTNET_ENABLED" class="testnet"><img src="/resources/testnet-logo.png" style="width: 30px;" class="mr-1"> Testnet</a> | ||||||
|       <h6 class="dropdown-header" i18n="master-page.layer2-networks-header">Layer 2 Networks</h6> |       <h6 class="dropdown-header" i18n="master-page.layer2-networks-header">Layer 2 Networks</h6> | ||||||
|       <a [href]="env.BISQ_WEBSITE_URL + urlLanguage" ngbDropdownItem class="mainnet"><img src="./resources/bisq-logo.png" style="width: 30px;" class="mr-1"> Bisq</a> |       <a [href]="env.BISQ_WEBSITE_URL + urlLanguage" ngbDropdownItem class="mainnet"><img src="/resources/bisq-logo.png" style="width: 30px;" class="mr-1"> Bisq</a> | ||||||
|       <a ngbDropdownItem class="liquid mr-1" [class.active]="network.val === 'liquid'" routerLink="/"><img src="./resources/liquid-logo.png" style="width: 30px;"> Liquid</a> |       <a ngbDropdownItem class="liquid mr-1" [class.active]="network.val === 'liquid'" routerLink="/"><img src="/resources/liquid-logo.png" style="width: 30px;"> Liquid</a> | ||||||
|       <a ngbDropdownItem *ngIf="env.LIQUID_TESTNET_ENABLED" class="liquidtestnet" [class.active]="network.val === 'liquidtestnet'" routerLink="/testnet"><img src="./resources/liquidtestnet-logo.png" style="width: 30px;" class="mr-1"> Liquid Testnet</a> |       <a ngbDropdownItem *ngIf="env.LIQUID_TESTNET_ENABLED" class="liquidtestnet" [class.active]="network.val === 'liquidtestnet'" routerLink="/testnet"><img src="/resources/liquidtestnet-logo.png" style="width: 30px;" class="mr-1"> Liquid Testnet</a> | ||||||
|     </div> |     </div> | ||||||
|   </div> |   </div> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -3,7 +3,7 @@ | |||||||
|   <nav class="navbar navbar-expand-md navbar-dark bg-dark"> |   <nav class="navbar navbar-expand-md navbar-dark bg-dark"> | ||||||
|   <a class="navbar-brand" [routerLink]="['/' | relativeUrl]" style="position: relative;"> |   <a class="navbar-brand" [routerLink]="['/' | relativeUrl]" style="position: relative;"> | ||||||
|     <ng-container *ngIf="{ val: connectionState$ | async } as connectionState"> |     <ng-container *ngIf="{ val: connectionState$ | async } as connectionState"> | ||||||
|       <img *ngIf="!officialMempoolSpace" src="./resources/mempool-logo.png" height="35" width="140" class="logo" [ngStyle]="{'opacity': connectionState.val === 2 ? 1 : 0.5 }" alt="The Mempool Open Source Project logo"> |       <img *ngIf="!officialMempoolSpace" src="/resources/mempool-logo.png" height="35" width="140" class="logo" [ngStyle]="{'opacity': connectionState.val === 2 ? 1 : 0.5 }" alt="The Mempool Open Source Project logo"> | ||||||
|       <app-svg-images *ngIf="officialMempoolSpace" name="officialMempoolSpace" style="width: 140px; height: 35px" width="500" height="126" viewBox="0 0 500 126"></app-svg-images> |       <app-svg-images *ngIf="officialMempoolSpace" name="officialMempoolSpace" style="width: 140px; height: 35px" width="500" height="126" viewBox="0 0 500 126"></app-svg-images> | ||||||
|       <div class="connection-badge"> |       <div class="connection-badge"> | ||||||
|         <div class="badge badge-warning" *ngIf="connectionState.val === 0" i18n="master-page.offline">Offline</div> |         <div class="badge badge-warning" *ngIf="connectionState.val === 0" i18n="master-page.offline">Offline</div> | ||||||
| @ -14,16 +14,16 @@ | |||||||
| 
 | 
 | ||||||
|   <div (window:resize)="onResize($event)" ngbDropdown class="dropdown-container" *ngIf="env.TESTNET_ENABLED || env.SIGNET_ENABLED || env.LIQUID_ENABLED || env.BISQ_ENABLED || env.LIQUID_TESTNET_ENABLED"> |   <div (window:resize)="onResize($event)" ngbDropdown class="dropdown-container" *ngIf="env.TESTNET_ENABLED || env.SIGNET_ENABLED || env.LIQUID_ENABLED || env.BISQ_ENABLED || env.LIQUID_TESTNET_ENABLED"> | ||||||
|     <button ngbDropdownToggle type="button" class="btn btn-secondary dropdown-toggle-split" aria-haspopup="true"> |     <button ngbDropdownToggle type="button" class="btn btn-secondary dropdown-toggle-split" aria-haspopup="true"> | ||||||
|       <img src="./resources/{{ network.val === '' ? 'bitcoin' : network.val }}-logo.png" style="width: 25px; height: 25px;" class="mr-1" [alt]="(network.val === '' ? 'bitcoin' : network.val) + ' logo'"> |       <img src="/resources/{{ network.val === '' ? 'bitcoin' : network.val }}-logo.png" style="width: 25px; height: 25px;" class="mr-1" [alt]="(network.val === '' ? 'bitcoin' : network.val) + ' logo'"> | ||||||
|     </button> |     </button> | ||||||
|     <div ngbDropdownMenu [ngClass]="{'dropdown-menu-right' : isMobile}"> |     <div ngbDropdownMenu [ngClass]="{'dropdown-menu-right' : isMobile}"> | ||||||
|       <a ngbDropdownItem class="mainnet" routerLink="/"><img src="./resources/bitcoin-logo.png" style="width: 30px;" class="mainnet mr-1" alt="bitcoin logo"> Mainnet</a> |       <a ngbDropdownItem class="mainnet" routerLink="/"><img src="/resources/bitcoin-logo.png" style="width: 30px;" class="mainnet mr-1" alt="bitcoin logo"> Mainnet</a> | ||||||
|       <a ngbDropdownItem *ngIf="env.SIGNET_ENABLED" class="signet" [class.active]="network.val === 'signet'" routerLink="/signet"><img src="./resources/signet-logo.png" style="width: 30px;" class="signet mr-1" alt="logo"> Signet</a> |       <a ngbDropdownItem *ngIf="env.SIGNET_ENABLED" class="signet" [class.active]="network.val === 'signet'" routerLink="/signet"><img src="/resources/signet-logo.png" style="width: 30px;" class="signet mr-1" alt="logo"> Signet</a> | ||||||
|       <a ngbDropdownItem *ngIf="env.TESTNET_ENABLED" class="testnet" [class.active]="network.val === 'testnet'" routerLink="/testnet"><img src="./resources/testnet-logo.png" style="width: 30px;" class="mr-1" alt="testnet logo"> Testnet</a> |       <a ngbDropdownItem *ngIf="env.TESTNET_ENABLED" class="testnet" [class.active]="network.val === 'testnet'" routerLink="/testnet"><img src="/resources/testnet-logo.png" style="width: 30px;" class="mr-1" alt="testnet logo"> Testnet</a> | ||||||
|       <h6 *ngIf="env.LIQUID_ENABLED || env.BISQ_ENABLED" class="dropdown-header" i18n="master-page.layer2-networks-header">Layer 2 Networks</h6> |       <h6 *ngIf="env.LIQUID_ENABLED || env.BISQ_ENABLED" class="dropdown-header" i18n="master-page.layer2-networks-header">Layer 2 Networks</h6> | ||||||
|       <a [href]="env.BISQ_WEBSITE_URL + urlLanguage" ngbDropdownItem *ngIf="env.BISQ_ENABLED" class="bisq"><img src="./resources/bisq-logo.png" style="width: 30px;" class="mr-1" alt="bisq logo"> Bisq</a> |       <a [href]="env.BISQ_WEBSITE_URL + urlLanguage" ngbDropdownItem *ngIf="env.BISQ_ENABLED" class="bisq"><img src="/resources/bisq-logo.png" style="width: 30px;" class="mr-1" alt="bisq logo"> Bisq</a> | ||||||
|       <a [href]="env.LIQUID_WEBSITE_URL + urlLanguage" ngbDropdownItem *ngIf="env.LIQUID_ENABLED" class="liquid" [class.active]="network.val === 'liquid'"><img src="./resources/liquid-logo.png" style="width: 30px;" class="mr-1" alt="liquid mainnet logo"> Liquid</a> |       <a [href]="env.LIQUID_WEBSITE_URL + urlLanguage" ngbDropdownItem *ngIf="env.LIQUID_ENABLED" class="liquid" [class.active]="network.val === 'liquid'"><img src="/resources/liquid-logo.png" style="width: 30px;" class="mr-1" alt="liquid mainnet logo"> Liquid</a> | ||||||
|       <a [href]="env.LIQUID_WEBSITE_URL + urlLanguage + '/testnet'" ngbDropdownItem *ngIf="env.LIQUID_TESTNET_ENABLED" class="liquidtestnet" [class.active]="network.val === 'liquid'"><img src="./resources/liquidtestnet-logo.png" style="width: 30px;" class="mr-1" alt="liquid testnet logo"> Liquid Testnet</a> |       <a [href]="env.LIQUID_WEBSITE_URL + urlLanguage + '/testnet'" ngbDropdownItem *ngIf="env.LIQUID_TESTNET_ENABLED" class="liquidtestnet" [class.active]="network.val === 'liquid'"><img src="/resources/liquidtestnet-logo.png" style="width: 30px;" class="mr-1" alt="liquid testnet logo"> Liquid Testnet</a> | ||||||
|     </div> |     </div> | ||||||
|   </div> |   </div> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -99,7 +99,7 @@ | |||||||
|         <tr *ngFor="let pool of miningStats.pools"> |         <tr *ngFor="let pool of miningStats.pools"> | ||||||
|           <td class="d-none d-md-block">{{ pool.rank }}</td> |           <td class="d-none d-md-block">{{ pool.rank }}</td> | ||||||
|           <td class="text-right"> |           <td class="text-right"> | ||||||
|             <img width="25" height="25" src="{{ pool.logo }}" [alt]="pool.name + ' mining pool logo'" onError="this.src = './resources/mining-pools/default.svg'"> |             <img width="25" height="25" src="{{ pool.logo }}" [alt]="pool.name + ' mining pool logo'" onError="this.src = '/resources/mining-pools/default.svg'"> | ||||||
|           </td> |           </td> | ||||||
|           <td class=""><a [routerLink]="[('/mining/pool/' + pool.slug) | relativeUrl]">{{ pool.name }}</a></td> |           <td class=""><a [routerLink]="[('/mining/pool/' + pool.slug) | relativeUrl]">{{ pool.name }}</a></td> | ||||||
|           <td class="" *ngIf="this.miningWindowPreference === '24h' && !isLoading">{{ pool.lastEstimatedHashrate }} {{ |           <td class="" *ngIf="this.miningWindowPreference === '24h' && !isLoading">{{ pool.lastEstimatedHashrate }} {{ | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ | |||||||
|   <div *ngIf="poolStats$ | async as poolStats; else loadingMain"> |   <div *ngIf="poolStats$ | async as poolStats; else loadingMain"> | ||||||
|     <div style="display:flex" class="mb-3"> |     <div style="display:flex" class="mb-3"> | ||||||
|       <img width="50" height="50" src="{{ poolStats['logo'] }}" [alt]="poolStats.pool.name + ' mining pool logo'" |       <img width="50" height="50" src="{{ poolStats['logo'] }}" [alt]="poolStats.pool.name + ' mining pool logo'" | ||||||
|         onError="this.src = './resources/mining-pools/default.svg'" class="mr-3"> |         onError="this.src = '/resources/mining-pools/default.svg'" class="mr-3"> | ||||||
|       <h1 class="m-0 pt-1 pt-md-0">{{ poolStats.pool.name }}</h1> |       <h1 class="m-0 pt-1 pt-md-0">{{ poolStats.pool.name }}</h1> | ||||||
|     </div> |     </div> | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -81,7 +81,7 @@ export class PoolComponent implements OnInit { | |||||||
|           } |           } | ||||||
| 
 | 
 | ||||||
|           return Object.assign({ |           return Object.assign({ | ||||||
|             logo: `./resources/mining-pools/` + poolStats.pool.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg' |             logo: `/resources/mining-pools/` + poolStats.pool.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg' | ||||||
|           }, poolStats); |           }, poolStats); | ||||||
|         }) |         }) | ||||||
|       ); |       ); | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| <div class="container-xl"> | <div class="container-xl"> | ||||||
|   <div class="text-center"> |   <div class="text-center"> | ||||||
|     <br> |     <br> | ||||||
|     <img [src]="officialMempoolSpace ? './resources/mempool-space-logo-bigger.png' : './resources/mempool-logo-bigger.png'" style="width: 250px;height:63px;"> |     <img [src]="officialMempoolSpace ? '/resources/mempool-space-logo-bigger.png' : '/resources/mempool-logo-bigger.png'" style="width: 250px;height:63px;"> | ||||||
|     <br><br> |     <br><br> | ||||||
| 
 | 
 | ||||||
|     <h2>Privacy Policy</h2> |     <h2>Privacy Policy</h2> | ||||||
|  | |||||||
| @ -82,7 +82,7 @@ | |||||||
| 
 | 
 | ||||||
|          <div class="qr-wrapper"> |          <div class="qr-wrapper"> | ||||||
|             <a [href]="bypassSecurityTrustUrl('bitcoin:' + donationObj.addresses.BTC + '?amount=' + donationObj.amount)" target="_blank"> |             <a [href]="bypassSecurityTrustUrl('bitcoin:' + donationObj.addresses.BTC + '?amount=' + donationObj.amount)" target="_blank"> | ||||||
|                <app-qrcode imageUrl="./resources/bitcoin-logo.png" [size]="200" [data]="'bitcoin:' + donationObj.addresses.BTC + '?amount=' + donationObj.amount"></app-qrcode> |                <app-qrcode imageUrl="/resources/bitcoin-logo.png" [size]="200" [data]="'bitcoin:' + donationObj.addresses.BTC + '?amount=' + donationObj.amount"></app-qrcode> | ||||||
|             </a> |             </a> | ||||||
|          </div> |          </div> | ||||||
|           |           | ||||||
| @ -100,7 +100,7 @@ | |||||||
| 
 | 
 | ||||||
|          <div class="qr-wrapper"> |          <div class="qr-wrapper"> | ||||||
|             <a [href]="bypassSecurityTrustUrl('lightning:' + donationObj.addresses.BTC_LightningLike)" target="_blank"> |             <a [href]="bypassSecurityTrustUrl('lightning:' + donationObj.addresses.BTC_LightningLike)" target="_blank"> | ||||||
|                <app-qrcode imageUrl="./resources/bitcoin-logo.png" [size]="200" [data]="donationObj.addresses.BTC_LightningLike.toUpperCase()"></app-qrcode> |                <app-qrcode imageUrl="/resources/bitcoin-logo.png" [size]="200" [data]="donationObj.addresses.BTC_LightningLike.toUpperCase()"></app-qrcode> | ||||||
|             </a> |             </a> | ||||||
|          </div> |          </div> | ||||||
| 
 | 
 | ||||||
| @ -125,7 +125,7 @@ | |||||||
| 
 | 
 | ||||||
|          <div class="qr-wrapper"> |          <div class="qr-wrapper"> | ||||||
|             <a [href]="bypassSecurityTrustUrl('liquidnetwork:' + donationObj.addresses.LBTC + '?amount=' + donationObj.amount + '&assetid=6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d')" target="_blank"> |             <a [href]="bypassSecurityTrustUrl('liquidnetwork:' + donationObj.addresses.LBTC + '?amount=' + donationObj.amount + '&assetid=6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d')" target="_blank"> | ||||||
|                <app-qrcode imageUrl="./resources/liquid-bitcoin.png" [size]="200" [data]="'liquidnetwork:' + donationObj.addresses.LBTC + '?amount=' + donationObj.amount + '&assetid=6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d'"></app-qrcode> |                <app-qrcode imageUrl="/resources/liquid-bitcoin.png" [size]="200" [data]="'liquidnetwork:' + donationObj.addresses.LBTC + '?amount=' + donationObj.amount + '&assetid=6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d'"></app-qrcode> | ||||||
|             </a> |             </a> | ||||||
|          </div> |          </div> | ||||||
|          <br> |          <br> | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| <div class="container-xl"> | <div class="container-xl"> | ||||||
|   <div class="text-center"> |   <div class="text-center"> | ||||||
|     <br /> |     <br /> | ||||||
|     <img [src]="officialMempoolSpace ? './resources/mempool-space-logo-bigger.png' : './resources/mempool-logo-bigger.png'" style="width: 250px;height:63px;"> |     <img [src]="officialMempoolSpace ? '/resources/mempool-space-logo-bigger.png' : '/resources/mempool-logo-bigger.png'" style="width: 250px;height:63px;"> | ||||||
|     <br /><br /> |     <br /><br /> | ||||||
| 
 | 
 | ||||||
|     <h2>Terms of Service</h2> |     <h2>Terms of Service</h2> | ||||||
|  | |||||||
| @ -69,27 +69,27 @@ | |||||||
| 
 | 
 | ||||||
|           <div> |           <div> | ||||||
| 
 | 
 | ||||||
|             <img src="./resources/mempool-logo-bigger.png" style="width: 300px; max-width: 80%"> |             <img src="/resources/mempool-logo-bigger.png" style="width: 300px; max-width: 80%"> | ||||||
|             <br><br> |             <br><br> | ||||||
|             <p>The mempool Logo</p> |             <p>The mempool Logo</p> | ||||||
|             <br><br> |             <br><br> | ||||||
| 
 | 
 | ||||||
|             <img src="./resources/mempool-space-logo-bigger.png" style="width: 300px; max-width: 80%"> |             <img src="/resources/mempool-space-logo-bigger.png" style="width: 300px; max-width: 80%"> | ||||||
|             <br><br> |             <br><br> | ||||||
|             <p>The mempool.space Vertical Logo</p> |             <p>The mempool.space Vertical Logo</p> | ||||||
|             <br><br> |             <br><br> | ||||||
| 
 | 
 | ||||||
|             <img src="./resources/mempool-space-logo-horizontal.png" style="width: 450px; max-width: 80%"> |             <img src="/resources/mempool-space-logo-horizontal.png" style="width: 450px; max-width: 80%"> | ||||||
|             <br><br> |             <br><br> | ||||||
|             <p>The mempool.space Horizontal Logo</p> |             <p>The mempool.space Horizontal Logo</p> | ||||||
|             <br><br> |             <br><br> | ||||||
| 
 | 
 | ||||||
|             <img src="./resources/mempool-tube.png" style="width: 100px"> |             <img src="/resources/mempool-tube.png" style="width: 100px"> | ||||||
|             <br><br> |             <br><br> | ||||||
|             <p>The mempool Square Logo</p> |             <p>The mempool Square Logo</p> | ||||||
|             <br><br> |             <br><br> | ||||||
| 
 | 
 | ||||||
|             <img src="./resources/mempool-blocks.png" style="width: 500px; max-width: 80%"> |             <img src="/resources/mempool-blocks.png" style="width: 500px; max-width: 80%"> | ||||||
|             <br><br> |             <br><br> | ||||||
|             <p>The mempool Blocks Logo</p> |             <p>The mempool Blocks Logo</p> | ||||||
|             <br><br> |             <br><br> | ||||||
|  | |||||||
| @ -28,7 +28,7 @@ const WALLY_OK = 0, | |||||||
|   ASSET_TAG_LEN = 32, |   ASSET_TAG_LEN = 32, | ||||||
|   BLINDING_FACTOR_LEN = 32; |   BLINDING_FACTOR_LEN = 32; | ||||||
| 
 | 
 | ||||||
| const WASM_URL = `./resources/wallycore/wallycore.js`; | const WASM_URL = `/resources/wallycore/wallycore.js`; | ||||||
| 
 | 
 | ||||||
| let load_promise, Module; | let load_promise, Module; | ||||||
| export function load() { | export function load() { | ||||||
|  | |||||||
| @ -97,7 +97,7 @@ | |||||||
|                 <td *ngIf="stateService.env.MINING_DASHBOARD" class="table-cell-mined pl-lg-4"> |                 <td *ngIf="stateService.env.MINING_DASHBOARD" class="table-cell-mined pl-lg-4"> | ||||||
|                   <a class="clear-link" [routerLink]="[('/mining/pool/' + block.extras.pool.slug) | relativeUrl]"> |                   <a class="clear-link" [routerLink]="[('/mining/pool/' + block.extras.pool.slug) | relativeUrl]"> | ||||||
|                     <img width="22" height="22" src="{{ block.extras.pool['logo'] }}" |                     <img width="22" height="22" src="{{ block.extras.pool['logo'] }}" | ||||||
|                       onError="this.src = './resources/mining-pools/default.svg'"> |                       onError="this.src = '/resources/mining-pools/default.svg'"> | ||||||
|                     <span class="pool-name">{{ block.extras.pool.name }}</span> |                     <span class="pool-name">{{ block.extras.pool.name }}</span> | ||||||
|                   </a> |                   </a> | ||||||
|                 </td> |                 </td> | ||||||
|  | |||||||
| @ -151,7 +151,7 @@ export class DashboardComponent implements OnInit { | |||||||
|           if (this.stateService.env.MINING_DASHBOARD === true) { |           if (this.stateService.env.MINING_DASHBOARD === true) { | ||||||
|             for (const block of acc) { |             for (const block of acc) { | ||||||
|               // @ts-ignore: Need to add an extra field for the template
 |               // @ts-ignore: Need to add an extra field for the template
 | ||||||
|               block.extras.pool.logo = `./resources/mining-pools/` + |               block.extras.pool.logo = `/resources/mining-pools/` + | ||||||
|                 block.extras.pool.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg'; |                 block.extras.pool.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg'; | ||||||
|             } |             } | ||||||
|           } |           } | ||||||
|  | |||||||
| @ -18,7 +18,7 @@ export class AudioService { | |||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
|     this.isPlaying = true; |     this.isPlaying = true; | ||||||
|     this.audio.src = '../../../resources/sounds/' + name + '.mp3'; |     this.audio.src = '/resources/sounds/' + name + '.mp3'; | ||||||
|     this.audio.load(); |     this.audio.load(); | ||||||
|     this.audio.volume = 0.65; // 65% volume
 |     this.audio.volume = 0.65; // 65% volume
 | ||||||
|     this.audio.play().catch((e) => { |     this.audio.play().catch((e) => { | ||||||
|  | |||||||
| @ -96,7 +96,7 @@ export class MiningService { | |||||||
|         share: parseFloat((poolStat.blockCount / stats.blockCount * 100).toFixed(2)), |         share: parseFloat((poolStat.blockCount / stats.blockCount * 100).toFixed(2)), | ||||||
|         lastEstimatedHashrate: (poolStat.blockCount / stats.blockCount * stats.lastEstimatedHashrate / hashrateDivider).toFixed(2), |         lastEstimatedHashrate: (poolStat.blockCount / stats.blockCount * stats.lastEstimatedHashrate / hashrateDivider).toFixed(2), | ||||||
|         emptyBlockRatio: (poolStat.emptyBlocks / poolStat.blockCount * 100).toFixed(2), |         emptyBlockRatio: (poolStat.emptyBlocks / poolStat.blockCount * 100).toFixed(2), | ||||||
|         logo: `./resources/mining-pools/` + poolStat.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg', |         logo: `/resources/mining-pools/` + poolStat.name.toLowerCase().replace(' ', '').replace('.', '') + '.svg', | ||||||
|         ...poolStat |         ...poolStat | ||||||
|       }; |       }; | ||||||
|     }); |     }); | ||||||
|  | |||||||
| @ -334,6 +334,7 @@ DEBIAN_PKG+=(autotools-dev autoconf automake pkg-config bsdmainutils) | |||||||
| DEBIAN_PKG+=(libevent-dev libdb-dev libssl-dev libtool autotools-dev) | DEBIAN_PKG+=(libevent-dev libdb-dev libssl-dev libtool autotools-dev) | ||||||
| DEBIAN_PKG+=(libboost-system-dev libboost-filesystem-dev libboost-chrono-dev libboost-test-dev libboost-thread-dev) | DEBIAN_PKG+=(libboost-system-dev libboost-filesystem-dev libboost-chrono-dev libboost-test-dev libboost-thread-dev) | ||||||
| DEBIAN_PKG+=(nodejs npm mariadb-server nginx-core python3-certbot-nginx rsync ufw) | DEBIAN_PKG+=(nodejs npm mariadb-server nginx-core python3-certbot-nginx rsync ufw) | ||||||
|  | DEBIAN_PKG+=(geoipupdate) | ||||||
| 
 | 
 | ||||||
| # packages needed for mempool ecosystem | # packages needed for mempool ecosystem | ||||||
| FREEBSD_PKG=() | FREEBSD_PKG=() | ||||||
| @ -341,6 +342,7 @@ FREEBSD_PKG+=(zsh sudo git screen curl wget calc neovim) | |||||||
| FREEBSD_PKG+=(openssh-portable py39-pip rust llvm90 jq base64 libzmq4) | FREEBSD_PKG+=(openssh-portable py39-pip rust llvm90 jq base64 libzmq4) | ||||||
| FREEBSD_PKG+=(boost-libs autoconf automake gmake gcc libevent libtool pkgconf) | FREEBSD_PKG+=(boost-libs autoconf automake gmake gcc libevent libtool pkgconf) | ||||||
| FREEBSD_PKG+=(nginx rsync py39-certbot-nginx mariadb105-server keybase) | FREEBSD_PKG+=(nginx rsync py39-certbot-nginx mariadb105-server keybase) | ||||||
|  | FREEBSD_PKG+=(geoipupdate) | ||||||
| 
 | 
 | ||||||
| ############################# | ############################# | ||||||
| ##### utility functions ##### | ##### utility functions ##### | ||||||
|  | |||||||
| @ -5,7 +5,7 @@ location /api/v1/lightning { | |||||||
| location @mempool-api-v1-lightning { | location @mempool-api-v1-lightning { | ||||||
| 	proxy_pass $mempoolMainnetLightning; | 	proxy_pass $mempoolMainnetLightning; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
|  | |||||||
| @ -48,7 +48,7 @@ location @mempool-api-v1-websocket { | |||||||
| 	proxy_pass $mempoolMainnet; | 	proxy_pass $mempoolMainnet; | ||||||
| 	proxy_http_version 1.1; | 	proxy_http_version 1.1; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header Upgrade $http_upgrade; | 	proxy_set_header Upgrade $http_upgrade; | ||||||
| @ -59,7 +59,7 @@ location @mempool-api-v1-websocket { | |||||||
| location @mempool-api-v1-cache-forever { | location @mempool-api-v1-cache-forever { | ||||||
| 	proxy_pass $mempoolMainnet; | 	proxy_pass $mempoolMainnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -76,7 +76,7 @@ location @mempool-api-v1-cache-forever { | |||||||
| location @mempool-api-v1-cache-warm { | location @mempool-api-v1-cache-warm { | ||||||
| 	proxy_pass $mempoolMainnet; | 	proxy_pass $mempoolMainnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -91,7 +91,7 @@ location @mempool-api-v1-cache-warm { | |||||||
| location @mempool-api-v1-cache-normal { | location @mempool-api-v1-cache-normal { | ||||||
| 	proxy_pass $mempoolMainnet; | 	proxy_pass $mempoolMainnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -106,7 +106,7 @@ location @mempool-api-v1-cache-normal { | |||||||
| location @mempool-api-v1-cache-disabled { | location @mempool-api-v1-cache-disabled { | ||||||
| 	proxy_pass $mempoolMainnet; | 	proxy_pass $mempoolMainnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -120,7 +120,7 @@ location @mempool-api-v1-cache-disabled { | |||||||
| location @esplora-api-cache-disabled { | location @esplora-api-cache-disabled { | ||||||
| 	proxy_pass $esploraMainnet; | 	proxy_pass $esploraMainnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -134,7 +134,7 @@ location @esplora-api-cache-disabled { | |||||||
| location @esplora-api-cache-forever { | location @esplora-api-cache-forever { | ||||||
| 	proxy_pass $esploraMainnet; | 	proxy_pass $esploraMainnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
|  | |||||||
| @ -49,7 +49,7 @@ location @mempool-liquid-api-v1-websocket { | |||||||
| 	proxy_pass $mempoolMainnet; | 	proxy_pass $mempoolMainnet; | ||||||
| 	proxy_http_version 1.1; | 	proxy_http_version 1.1; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header Upgrade $http_upgrade; | 	proxy_set_header Upgrade $http_upgrade; | ||||||
| @ -60,7 +60,7 @@ location @mempool-liquid-api-v1-websocket { | |||||||
| location @mempool-liquid-api-v1-cache-forever { | location @mempool-liquid-api-v1-cache-forever { | ||||||
| 	proxy_pass $mempoolMainnet; | 	proxy_pass $mempoolMainnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -77,7 +77,7 @@ location @mempool-liquid-api-v1-cache-forever { | |||||||
| location @mempool-liquid-api-v1-cache-warm { | location @mempool-liquid-api-v1-cache-warm { | ||||||
| 	proxy_pass $mempoolMainnet; | 	proxy_pass $mempoolMainnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -92,7 +92,7 @@ location @mempool-liquid-api-v1-cache-warm { | |||||||
| location @mempool-liquid-api-v1-cache-normal { | location @mempool-liquid-api-v1-cache-normal { | ||||||
| 	proxy_pass $mempoolMainnet; | 	proxy_pass $mempoolMainnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -107,7 +107,7 @@ location @mempool-liquid-api-v1-cache-normal { | |||||||
| location @mempool-liquid-api-v1-cache-disabled { | location @mempool-liquid-api-v1-cache-disabled { | ||||||
| 	proxy_pass $mempoolMainnet; | 	proxy_pass $mempoolMainnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -121,7 +121,7 @@ location @mempool-liquid-api-v1-cache-disabled { | |||||||
| location @esplora-liquid-api-cache-disabled { | location @esplora-liquid-api-cache-disabled { | ||||||
| 	proxy_pass $esploraMainnet; | 	proxy_pass $esploraMainnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -135,7 +135,7 @@ location @esplora-liquid-api-cache-disabled { | |||||||
| location @esplora-liquid-api-cache-forever { | location @esplora-liquid-api-cache-forever { | ||||||
| 	proxy_pass $esploraMainnet; | 	proxy_pass $esploraMainnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
|  | |||||||
| @ -53,7 +53,7 @@ location @mempool-liquidtestnet-api-v1-websocket { | |||||||
| 	proxy_pass $mempoolTestnet; | 	proxy_pass $mempoolTestnet; | ||||||
| 	proxy_http_version 1.1; | 	proxy_http_version 1.1; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header Upgrade $http_upgrade; | 	proxy_set_header Upgrade $http_upgrade; | ||||||
| @ -64,7 +64,7 @@ location @mempool-liquidtestnet-api-v1-websocket { | |||||||
| location @mempool-liquidtestnet-api-v1-cache-forever { | location @mempool-liquidtestnet-api-v1-cache-forever { | ||||||
| 	proxy_pass $mempoolTestnet; | 	proxy_pass $mempoolTestnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -81,7 +81,7 @@ location @mempool-liquidtestnet-api-v1-cache-forever { | |||||||
| location @mempool-liquidtestnet-api-v1-cache-warm { | location @mempool-liquidtestnet-api-v1-cache-warm { | ||||||
| 	proxy_pass $mempoolTestnet; | 	proxy_pass $mempoolTestnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -96,7 +96,7 @@ location @mempool-liquidtestnet-api-v1-cache-warm { | |||||||
| location @mempool-liquidtestnet-api-v1-cache-normal { | location @mempool-liquidtestnet-api-v1-cache-normal { | ||||||
| 	proxy_pass $mempoolTestnet; | 	proxy_pass $mempoolTestnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -111,7 +111,7 @@ location @mempool-liquidtestnet-api-v1-cache-normal { | |||||||
| location @mempool-liquidtestnet-api-v1-cache-disabled { | location @mempool-liquidtestnet-api-v1-cache-disabled { | ||||||
| 	proxy_pass $mempoolTestnet; | 	proxy_pass $mempoolTestnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -125,7 +125,7 @@ location @mempool-liquidtestnet-api-v1-cache-disabled { | |||||||
| location @esplora-liquidtestnet-api-cache-disabled { | location @esplora-liquidtestnet-api-cache-disabled { | ||||||
| 	proxy_pass $esploraTestnet; | 	proxy_pass $esploraTestnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -139,7 +139,7 @@ location @esplora-liquidtestnet-api-cache-disabled { | |||||||
| location @esplora-liquidtestnet-api-cache-forever { | location @esplora-liquidtestnet-api-cache-forever { | ||||||
| 	proxy_pass $esploraTestnet; | 	proxy_pass $esploraTestnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ location /signet/api/v1/lightning { | |||||||
| location @mempool-signet-api-v1-lightning { | location @mempool-signet-api-v1-lightning { | ||||||
| 	proxy_pass $mempoolSignetLightning; | 	proxy_pass $mempoolSignetLightning; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
|  | |||||||
| @ -53,7 +53,7 @@ location @mempool-signet-api-v1-websocket { | |||||||
| 	proxy_pass $mempoolSignet; | 	proxy_pass $mempoolSignet; | ||||||
| 	proxy_http_version 1.1; | 	proxy_http_version 1.1; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header Upgrade $http_upgrade; | 	proxy_set_header Upgrade $http_upgrade; | ||||||
| @ -64,7 +64,7 @@ location @mempool-signet-api-v1-websocket { | |||||||
| location @mempool-signet-api-v1-cache-forever { | location @mempool-signet-api-v1-cache-forever { | ||||||
| 	proxy_pass $mempoolSignet; | 	proxy_pass $mempoolSignet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -81,7 +81,7 @@ location @mempool-signet-api-v1-cache-forever { | |||||||
| location @mempool-signet-api-v1-cache-warm { | location @mempool-signet-api-v1-cache-warm { | ||||||
| 	proxy_pass $mempoolSignet; | 	proxy_pass $mempoolSignet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -96,7 +96,7 @@ location @mempool-signet-api-v1-cache-warm { | |||||||
| location @mempool-signet-api-v1-cache-normal { | location @mempool-signet-api-v1-cache-normal { | ||||||
| 	proxy_pass $mempoolSignet; | 	proxy_pass $mempoolSignet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -111,7 +111,7 @@ location @mempool-signet-api-v1-cache-normal { | |||||||
| location @mempool-signet-api-v1-cache-disabled { | location @mempool-signet-api-v1-cache-disabled { | ||||||
| 	proxy_pass $mempoolSignet; | 	proxy_pass $mempoolSignet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -125,7 +125,7 @@ location @mempool-signet-api-v1-cache-disabled { | |||||||
| location @esplora-signet-api-cache-disabled { | location @esplora-signet-api-cache-disabled { | ||||||
| 	proxy_pass $esploraSignet; | 	proxy_pass $esploraSignet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -139,7 +139,7 @@ location @esplora-signet-api-cache-disabled { | |||||||
| location @esplora-signet-api-cache-forever { | location @esplora-signet-api-cache-forever { | ||||||
| 	proxy_pass $esploraSignet; | 	proxy_pass $esploraSignet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ location /testnet/api/v1/lightning { | |||||||
| location @mempool-testnet-api-v1-lightning { | location @mempool-testnet-api-v1-lightning { | ||||||
| 	proxy_pass $mempoolSignetLightning; | 	proxy_pass $mempoolSignetLightning; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
|  | |||||||
| @ -53,7 +53,7 @@ location @mempool-testnet-api-v1-websocket { | |||||||
| 	proxy_pass $mempoolTestnet; | 	proxy_pass $mempoolTestnet; | ||||||
| 	proxy_http_version 1.1; | 	proxy_http_version 1.1; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header Upgrade $http_upgrade; | 	proxy_set_header Upgrade $http_upgrade; | ||||||
| @ -64,7 +64,7 @@ location @mempool-testnet-api-v1-websocket { | |||||||
| location @mempool-testnet-api-v1-cache-forever { | location @mempool-testnet-api-v1-cache-forever { | ||||||
| 	proxy_pass $mempoolTestnet; | 	proxy_pass $mempoolTestnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -81,7 +81,7 @@ location @mempool-testnet-api-v1-cache-forever { | |||||||
| location @mempool-testnet-api-v1-cache-warm { | location @mempool-testnet-api-v1-cache-warm { | ||||||
| 	proxy_pass $mempoolTestnet; | 	proxy_pass $mempoolTestnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -96,7 +96,7 @@ location @mempool-testnet-api-v1-cache-warm { | |||||||
| location @mempool-testnet-api-v1-cache-normal { | location @mempool-testnet-api-v1-cache-normal { | ||||||
| 	proxy_pass $mempoolTestnet; | 	proxy_pass $mempoolTestnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -111,7 +111,7 @@ location @mempool-testnet-api-v1-cache-normal { | |||||||
| location @mempool-testnet-api-v1-cache-disabled { | location @mempool-testnet-api-v1-cache-disabled { | ||||||
| 	proxy_pass $mempoolTestnet; | 	proxy_pass $mempoolTestnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -125,7 +125,7 @@ location @mempool-testnet-api-v1-cache-disabled { | |||||||
| location @esplora-testnet-api-cache-disabled { | location @esplora-testnet-api-cache-disabled { | ||||||
| 	proxy_pass $esploraTestnet; | 	proxy_pass $esploraTestnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -139,7 +139,7 @@ location @esplora-testnet-api-cache-disabled { | |||||||
| location @esplora-testnet-api-cache-forever { | location @esplora-testnet-api-cache-forever { | ||||||
| 	proxy_pass $esploraTestnet; | 	proxy_pass $esploraTestnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
|  | |||||||
| @ -78,7 +78,7 @@ location @mempool-bisq-websocket { | |||||||
| location @mempool-bisq { | location @mempool-bisq { | ||||||
| 	proxy_pass $mempoolBisq; | 	proxy_pass $mempoolBisq; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
| @ -89,7 +89,7 @@ location @mempool-bisq { | |||||||
| location @esplora-api-cache-disabled { | location @esplora-api-cache-disabled { | ||||||
| 	proxy_pass $esploraMainnet; | 	proxy_pass $esploraMainnet; | ||||||
| 
 | 
 | ||||||
| 	proxy_set_header Host $http_host; | 	proxy_set_header Host $host; | ||||||
| 	proxy_set_header X-Real-IP $remote_addr; | 	proxy_set_header X-Real-IP $remote_addr; | ||||||
| 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | 	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||||
| 	proxy_set_header X-Forwarded-Proto $scheme; | 	proxy_set_header X-Forwarded-Proto $scheme; | ||||||
|  | |||||||
| @ -49,7 +49,7 @@ add_header Vary Cookie; | |||||||
| # cache redirect for 10 minutes | # cache redirect for 10 minutes | ||||||
| location = / { | location = / { | ||||||
| 	if ($lang != '') { | 	if ($lang != '') { | ||||||
| 		return 302 $scheme://$host/$lang$uri; | 		return 302 $scheme://$host/$lang/; | ||||||
| 	} | 	} | ||||||
| 	try_files /en-US/index.html =404; | 	try_files /en-US/index.html =404; | ||||||
| 	expires 10m; | 	expires 10m; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user