Merge branch 'master' into simon/node-alias-search-numbers
This commit is contained in:
		
						commit
						686cfb6d2f
					
				@ -288,21 +288,36 @@ class ChannelsApi {
 | 
			
		||||
 | 
			
		||||
      const channels: any[] = []
 | 
			
		||||
      for (const row of allChannels) {
 | 
			
		||||
        const activeChannelsStats: any = await nodesApi.$getActiveChannelsStats(row.public_key);
 | 
			
		||||
        channels.push({
 | 
			
		||||
          status: row.status,
 | 
			
		||||
          closing_reason: row.closing_reason,
 | 
			
		||||
          capacity: row.capacity ?? 0,
 | 
			
		||||
          short_id: row.short_id,
 | 
			
		||||
          id: row.id,
 | 
			
		||||
          fee_rate: row.node1_fee_rate ?? row.node2_fee_rate ?? 0,
 | 
			
		||||
          node: {
 | 
			
		||||
            alias: row.alias.length > 0 ? row.alias : row.public_key.slice(0, 20),
 | 
			
		||||
            public_key: row.public_key,
 | 
			
		||||
            channels: activeChannelsStats.active_channel_count ?? 0,
 | 
			
		||||
            capacity: activeChannelsStats.capacity ?? 0,
 | 
			
		||||
          }
 | 
			
		||||
        });
 | 
			
		||||
        let channel;
 | 
			
		||||
        if (index >= 0) {
 | 
			
		||||
          const activeChannelsStats: any = await nodesApi.$getActiveChannelsStats(row.public_key);
 | 
			
		||||
          channel = {
 | 
			
		||||
            status: row.status,
 | 
			
		||||
            closing_reason: row.closing_reason,
 | 
			
		||||
            capacity: row.capacity ?? 0,
 | 
			
		||||
            short_id: row.short_id,
 | 
			
		||||
            id: row.id,
 | 
			
		||||
            fee_rate: row.node1_fee_rate ?? row.node2_fee_rate ?? 0,
 | 
			
		||||
            node: {
 | 
			
		||||
              alias: row.alias.length > 0 ? row.alias : row.public_key.slice(0, 20),
 | 
			
		||||
              public_key: row.public_key,
 | 
			
		||||
              channels: activeChannelsStats.active_channel_count ?? 0,
 | 
			
		||||
              capacity: activeChannelsStats.capacity ?? 0,
 | 
			
		||||
            }
 | 
			
		||||
          };
 | 
			
		||||
        } else if (index === -1) {
 | 
			
		||||
          channel = {
 | 
			
		||||
            capacity: row.capacity ?? 0,
 | 
			
		||||
            short_id: row.short_id,
 | 
			
		||||
            id: row.id,
 | 
			
		||||
            node: {
 | 
			
		||||
              alias: row.alias.length > 0 ? row.alias : row.public_key.slice(0, 20),
 | 
			
		||||
              public_key: row.public_key,
 | 
			
		||||
            }
 | 
			
		||||
          };
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        channels.push(channel);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      return channels;
 | 
			
		||||
 | 
			
		||||
@ -47,8 +47,17 @@ class ChannelsRoutes {
 | 
			
		||||
        res.status(400).send('Missing parameter: public_key');
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      const index = parseInt(typeof req.query.index === 'string' ? req.query.index : '0', 10) || 0;
 | 
			
		||||
      const status: string = typeof req.query.status === 'string' ? req.query.status : '';
 | 
			
		||||
 | 
			
		||||
      if (index < -1) {
 | 
			
		||||
        res.status(400).send('Invalid index');
 | 
			
		||||
      }
 | 
			
		||||
      if (['open', 'active', 'closed'].includes(status) === false) {
 | 
			
		||||
        res.status(400).send('Invalid status');
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      const channels = await channelsApi.$getChannelsForNode(req.query.public_key, index, 10, status);
 | 
			
		||||
      const channelsCount = await channelsApi.$getChannelsCountForNode(req.query.public_key, status);
 | 
			
		||||
      res.header('Pragma', 'public');
 | 
			
		||||
 | 
			
		||||
@ -7,6 +7,7 @@ import { ILightningApi } from '../../../api/lightning/lightning-api.interface';
 | 
			
		||||
import { isIP } from 'net';
 | 
			
		||||
import { Common } from '../../../api/common';
 | 
			
		||||
import channelsApi from '../../../api/explorer/channels.api';
 | 
			
		||||
import nodesApi from '../../../api/explorer/nodes.api';
 | 
			
		||||
 | 
			
		||||
const fsPromises = promises;
 | 
			
		||||
 | 
			
		||||
@ -32,7 +33,26 @@ class LightningStatsImporter {
 | 
			
		||||
    let clearnetTorNodes = 0;
 | 
			
		||||
    let unannouncedNodes = 0;
 | 
			
		||||
 | 
			
		||||
    const [nodesInDbRaw]: any[] = await DB.query(`SELECT public_key FROM nodes`);
 | 
			
		||||
    const nodesInDb = {};
 | 
			
		||||
    for (const node of nodesInDbRaw) {
 | 
			
		||||
      nodesInDb[node.public_key] = node;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (const node of networkGraph.nodes) {
 | 
			
		||||
      // If we don't know about this node, insert it in db
 | 
			
		||||
      if (isHistorical === true && !nodesInDb[node.pub_key]) {
 | 
			
		||||
        await nodesApi.$saveNode({
 | 
			
		||||
          last_update: node.last_update,
 | 
			
		||||
          pub_key: node.pub_key,
 | 
			
		||||
          alias: node.alias,
 | 
			
		||||
          addresses: node.addresses,
 | 
			
		||||
          color: node.color,
 | 
			
		||||
          features: node.features,
 | 
			
		||||
        });
 | 
			
		||||
        nodesInDb[node.pub_key] = node;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      let hasOnion = false;
 | 
			
		||||
      let hasClearnet = false;
 | 
			
		||||
      let isUnnanounced = true;
 | 
			
		||||
@ -69,7 +89,7 @@ class LightningStatsImporter {
 | 
			
		||||
    const baseFees: number[] = [];
 | 
			
		||||
    const alreadyCountedChannels = {};
 | 
			
		||||
    
 | 
			
		||||
    const [channelsInDbRaw]: any[] = await DB.query(`SELECT short_id, created FROM channels`);
 | 
			
		||||
    const [channelsInDbRaw]: any[] = await DB.query(`SELECT short_id FROM channels`);
 | 
			
		||||
    const channelsInDb = {};
 | 
			
		||||
    for (const channel of channelsInDbRaw) {
 | 
			
		||||
      channelsInDb[channel.short_id] = channel;
 | 
			
		||||
@ -84,29 +104,19 @@ class LightningStatsImporter {
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Channel is already in db, check if we need to update 'created' field
 | 
			
		||||
      if (isHistorical === true) {
 | 
			
		||||
        //@ts-ignore
 | 
			
		||||
        if (channelsInDb[short_id] && channel.timestamp < channel.created) {
 | 
			
		||||
          await DB.query(`
 | 
			
		||||
            UPDATE channels SET created = FROM_UNIXTIME(?) WHERE channels.short_id = ?`,
 | 
			
		||||
            //@ts-ignore
 | 
			
		||||
            [channel.timestamp, short_id]
 | 
			
		||||
          );
 | 
			
		||||
        } else if (!channelsInDb[short_id]) {
 | 
			
		||||
          await channelsApi.$saveChannel({
 | 
			
		||||
            channel_id: short_id,
 | 
			
		||||
            chan_point: `${tx.txid}:${short_id.split('x')[2]}`,
 | 
			
		||||
            //@ts-ignore
 | 
			
		||||
            last_update: channel.timestamp,
 | 
			
		||||
            node1_pub: channel.node1_pub,
 | 
			
		||||
            node2_pub: channel.node2_pub,
 | 
			
		||||
            capacity: (tx.value * 100000000).toString(),
 | 
			
		||||
            node1_policy: null,
 | 
			
		||||
            node2_policy: null,
 | 
			
		||||
          }, 0);
 | 
			
		||||
          channelsInDb[channel.channel_id] = channel;
 | 
			
		||||
        }
 | 
			
		||||
      // If we don't know about this channel, insert it in db
 | 
			
		||||
      if (isHistorical === true && !channelsInDb[short_id]) {
 | 
			
		||||
        await channelsApi.$saveChannel({
 | 
			
		||||
          channel_id: short_id,
 | 
			
		||||
          chan_point: `${tx.txid}:${short_id.split('x')[2]}`,
 | 
			
		||||
          last_update: channel.last_update,
 | 
			
		||||
          node1_pub: channel.node1_pub,
 | 
			
		||||
          node2_pub: channel.node2_pub,
 | 
			
		||||
          capacity: (tx.value * 100000000).toString(),
 | 
			
		||||
          node1_policy: null,
 | 
			
		||||
          node2_policy: null,
 | 
			
		||||
        }, 0);
 | 
			
		||||
        channelsInDb[channel.channel_id] = channel;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (!nodeStats[channel.node1_pub]) {
 | 
			
		||||
@ -281,6 +291,7 @@ class LightningStatsImporter {
 | 
			
		||||
   * Import topology files LN historical data into the database
 | 
			
		||||
   */
 | 
			
		||||
  async $importHistoricalLightningStats(): Promise<void> {
 | 
			
		||||
    logger.debug('Run the historical importer');
 | 
			
		||||
    try {
 | 
			
		||||
      let fileList: string[] = [];
 | 
			
		||||
      try {
 | 
			
		||||
@ -294,7 +305,7 @@ class LightningStatsImporter {
 | 
			
		||||
      fileList.sort().reverse();
 | 
			
		||||
 | 
			
		||||
      const [rows]: any[] = await DB.query(`
 | 
			
		||||
        SELECT UNIX_TIMESTAMP(added) AS added, node_count
 | 
			
		||||
        SELECT UNIX_TIMESTAMP(added) AS added
 | 
			
		||||
        FROM lightning_stats
 | 
			
		||||
        ORDER BY added DESC
 | 
			
		||||
      `);
 | 
			
		||||
@ -391,12 +402,16 @@ class LightningStatsImporter {
 | 
			
		||||
        });
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      let rgb = node.rgb_color ?? '#000000';
 | 
			
		||||
      if (rgb.indexOf('#') === -1) {
 | 
			
		||||
        rgb = `#${rgb}`;
 | 
			
		||||
      }
 | 
			
		||||
      newGraph.nodes.push({
 | 
			
		||||
        last_update: node.timestamp ?? 0,
 | 
			
		||||
        pub_key: node.id ?? null,
 | 
			
		||||
        alias: node.alias ?? null,
 | 
			
		||||
        alias: node.alias ?? node.id.slice(0, 20),
 | 
			
		||||
        addresses: addresses,
 | 
			
		||||
        color: node.rgb_color ?? null,
 | 
			
		||||
        color: rgb,
 | 
			
		||||
        features: {},
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -105,10 +105,10 @@ export class TransactionsListComponent implements OnInit, OnChanges {
 | 
			
		||||
      }, 10);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this.transactions.forEach((tx, i) => {
 | 
			
		||||
    this.transactions.forEach((tx) => {
 | 
			
		||||
      tx['@voutLimit'] = true;
 | 
			
		||||
      tx['@vinLimit'] = true;
 | 
			
		||||
      if (this.outspends[i]) {
 | 
			
		||||
      if (tx['addressValue'] !== undefined) {
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -119,7 +119,7 @@
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
  <div *ngIf="!error">
 | 
			
		||||
    <div class="row">
 | 
			
		||||
    <div class="row" *ngIf="node.as_number">
 | 
			
		||||
      <div class="col-sm">
 | 
			
		||||
        <app-nodes-channels-map [style]="'nodepage'" [publicKey]="node.public_key" [hasLocation]="!!node.as_number"></app-nodes-channels-map>
 | 
			
		||||
      </div>
 | 
			
		||||
@ -127,6 +127,9 @@
 | 
			
		||||
        <app-node-statistics-chart [publicKey]="node.public_key"></app-node-statistics-chart>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <div *ngIf="!node.as_number">
 | 
			
		||||
      <app-node-statistics-chart [publicKey]="node.public_key"></app-node-statistics-chart>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <h2 i18n="lightning.active-channels-map">Active channels map</h2>
 | 
			
		||||
    <app-node-channels style="display:block;margin-bottom: 40px" [publicKey]="node.public_key"></app-node-channels>
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user