Merge branch 'master' into nymkappa/feature/hashrate-resolution
This commit is contained in:
		
						commit
						a33d6dc0b9
					
				
							
								
								
									
										42
									
								
								backend/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										42
									
								
								backend/package-lock.json
									
									
									
										generated
									
									
									
								
							@ -17,9 +17,9 @@
 | 
			
		||||
        "express": "^4.18.0",
 | 
			
		||||
        "mysql2": "2.3.3",
 | 
			
		||||
        "node-worker-threads-pool": "^1.5.1",
 | 
			
		||||
        "socks-proxy-agent": "^6.2.0",
 | 
			
		||||
        "typescript": "~4.7.2",
 | 
			
		||||
        "ws": "~8.7.0"
 | 
			
		||||
        "socks-proxy-agent": "~7.0.0",
 | 
			
		||||
        "typescript": "~4.7.4",
 | 
			
		||||
        "ws": "~8.8.0"
 | 
			
		||||
      },
 | 
			
		||||
      "devDependencies": {
 | 
			
		||||
        "@types/compression": "^1.7.2",
 | 
			
		||||
@ -2734,9 +2734,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/socks-proxy-agent": {
 | 
			
		||||
      "version": "6.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz",
 | 
			
		||||
      "integrity": "sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ==",
 | 
			
		||||
      "version": "7.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz",
 | 
			
		||||
      "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "agent-base": "^6.0.2",
 | 
			
		||||
        "debug": "^4.3.3",
 | 
			
		||||
@ -2950,9 +2950,9 @@
 | 
			
		||||
      "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g=="
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/typescript": {
 | 
			
		||||
      "version": "4.7.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.2.tgz",
 | 
			
		||||
      "integrity": "sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A==",
 | 
			
		||||
      "version": "4.7.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz",
 | 
			
		||||
      "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==",
 | 
			
		||||
      "bin": {
 | 
			
		||||
        "tsc": "bin/tsc",
 | 
			
		||||
        "tsserver": "bin/tsserver"
 | 
			
		||||
@ -3052,9 +3052,9 @@
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/ws": {
 | 
			
		||||
      "version": "8.7.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz",
 | 
			
		||||
      "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==",
 | 
			
		||||
      "version": "8.8.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz",
 | 
			
		||||
      "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==",
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">=10.0.0"
 | 
			
		||||
      },
 | 
			
		||||
@ -5098,9 +5098,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "socks-proxy-agent": {
 | 
			
		||||
      "version": "6.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz",
 | 
			
		||||
      "integrity": "sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ==",
 | 
			
		||||
      "version": "7.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz",
 | 
			
		||||
      "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "agent-base": "^6.0.2",
 | 
			
		||||
        "debug": "^4.3.3",
 | 
			
		||||
@ -5256,9 +5256,9 @@
 | 
			
		||||
      "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g=="
 | 
			
		||||
    },
 | 
			
		||||
    "typescript": {
 | 
			
		||||
      "version": "4.7.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.2.tgz",
 | 
			
		||||
      "integrity": "sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A=="
 | 
			
		||||
      "version": "4.7.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz",
 | 
			
		||||
      "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ=="
 | 
			
		||||
    },
 | 
			
		||||
    "unpipe": {
 | 
			
		||||
      "version": "1.0.0",
 | 
			
		||||
@ -5333,9 +5333,9 @@
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "ws": {
 | 
			
		||||
      "version": "8.7.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz",
 | 
			
		||||
      "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==",
 | 
			
		||||
      "version": "8.8.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz",
 | 
			
		||||
      "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==",
 | 
			
		||||
      "requires": {}
 | 
			
		||||
    },
 | 
			
		||||
    "yallist": {
 | 
			
		||||
 | 
			
		||||
@ -37,9 +37,9 @@
 | 
			
		||||
    "express": "^4.18.0",
 | 
			
		||||
    "mysql2": "2.3.3",
 | 
			
		||||
    "node-worker-threads-pool": "^1.5.1",
 | 
			
		||||
    "socks-proxy-agent": "^6.2.0",
 | 
			
		||||
    "typescript": "~4.7.2",
 | 
			
		||||
    "ws": "~8.7.0"
 | 
			
		||||
    "socks-proxy-agent": "~7.0.0",
 | 
			
		||||
    "typescript": "~4.7.4",
 | 
			
		||||
    "ws": "~8.8.0"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@types/compression": "^1.7.2",
 | 
			
		||||
 | 
			
		||||
@ -295,7 +295,8 @@ class Blocks {
 | 
			
		||||
      }
 | 
			
		||||
      logger.notice(`Blocks summaries indexing completed: indexed ${newlyIndexed} blocks`);
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      logger.err(`Blocks summaries indexing failed. Reason: ${(e instanceof Error ? e.message : e)}`);
 | 
			
		||||
      logger.err(`Blocks summaries indexing failed. Trying again in 10 seconds. Reason: ${(e instanceof Error ? e.message : e)}`);
 | 
			
		||||
      throw e;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -367,18 +368,12 @@ class Blocks {
 | 
			
		||||
      logger.notice(`Block indexing completed: indexed ${newlyIndexed} blocks`);
 | 
			
		||||
      loadingIndicators.setProgress('block-indexing', 100);
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      logger.err('Block indexing failed. Trying again later. Reason: ' + (e instanceof Error ? e.message : e));
 | 
			
		||||
      logger.err('Block indexing failed. Trying again in 10 seconds. Reason: ' + (e instanceof Error ? e.message : e));
 | 
			
		||||
      loadingIndicators.setProgress('block-indexing', 100);
 | 
			
		||||
      return false;
 | 
			
		||||
      throw e;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const chainValid = await BlocksRepository.$validateChain();
 | 
			
		||||
    if (!chainValid) {
 | 
			
		||||
      indexer.reindex();
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
    return await BlocksRepository.$validateChain();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public async $updateBlocks() {
 | 
			
		||||
 | 
			
		||||
@ -7,6 +7,7 @@ import logger from '../logger';
 | 
			
		||||
import { Common } from './common';
 | 
			
		||||
import loadingIndicators from './loading-indicators';
 | 
			
		||||
import { escape } from 'mysql2';
 | 
			
		||||
import indexer from '../indexer';
 | 
			
		||||
import DifficultyAdjustmentsRepository from '../repositories/DifficultyAdjustmentsRepository';
 | 
			
		||||
import config from '../config';
 | 
			
		||||
 | 
			
		||||
@ -264,6 +265,7 @@ class Mining {
 | 
			
		||||
      loadingIndicators.setProgress('weekly-hashrate-indexing', 100);
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      loadingIndicators.setProgress('weekly-hashrate-indexing', 100);
 | 
			
		||||
      logger.err(`Weekly mining pools hashrates indexing failed. Trying again in 10 seconds. Reason: ${(e instanceof Error ? e.message : e)}`);
 | 
			
		||||
      throw e;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
@ -376,6 +378,7 @@ class Mining {
 | 
			
		||||
      loadingIndicators.setProgress('daily-hashrate-indexing', 100);
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      loadingIndicators.setProgress('daily-hashrate-indexing', 100);
 | 
			
		||||
      logger.err(`Daily network hashrate indexing failed. Trying again in 10 seconds. Reason: ${(e instanceof Error ? e.message : e)}`);
 | 
			
		||||
      throw e;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -39,6 +39,8 @@ class Indexer {
 | 
			
		||||
      const chainValid = await blocks.$generateBlockDatabase();
 | 
			
		||||
      if (chainValid === false) {
 | 
			
		||||
        // Chain of block hash was invalid, so we need to reindex. Stop here and continue at the next iteration
 | 
			
		||||
        logger.warn(`The chain of block hash is invalid, re-indexing invalid data in 10 seconds.`);
 | 
			
		||||
        setTimeout(() => this.reindex(), 10000);
 | 
			
		||||
        this.indexerRunning = false;
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
@ -49,8 +51,9 @@ class Indexer {
 | 
			
		||||
      await mining.$generatePoolHashrateHistory();
 | 
			
		||||
      await blocks.$generateBlocksSummariesDatabase();
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      this.reindex();
 | 
			
		||||
      logger.err(`Indexer failed, trying again later. Reason: ` + (e instanceof Error ? e.message : e));
 | 
			
		||||
      this.indexerRunning = false;
 | 
			
		||||
      logger.err(`Indexer failed, trying again in 10 seconds. Reason: ` + (e instanceof Error ? e.message : e));
 | 
			
		||||
      setTimeout(() => this.reindex(), 10000);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this.indexerRunning = false;
 | 
			
		||||
@ -62,6 +65,7 @@ class Indexer {
 | 
			
		||||
      await HashratesRepository.$setLatestRun('last_weekly_hashrates_indexing', 0);
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      logger.err(`Cannot reset hashrate indexing timestamps. Reason: ` + (e instanceof Error ? e.message : e));
 | 
			
		||||
      throw e;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										1153
									
								
								frontend/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1153
									
								
								frontend/package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -89,7 +89,7 @@
 | 
			
		||||
    "domino": "^2.1.6",
 | 
			
		||||
    "echarts": "~5.3.2",
 | 
			
		||||
    "express": "^4.17.1",
 | 
			
		||||
    "lightweight-charts": "^3.3.0",
 | 
			
		||||
    "lightweight-charts": "~3.8.0",
 | 
			
		||||
    "ngx-bootrap-multiselect": "^2.0.0",
 | 
			
		||||
    "ngx-echarts": "8.0.1",
 | 
			
		||||
    "ngx-infinite-scroll": "^10.0.1",
 | 
			
		||||
@ -112,24 +112,24 @@
 | 
			
		||||
    "@typescript-eslint/parser": "^5.30.5",
 | 
			
		||||
    "codelyzer": "~6.0.2",
 | 
			
		||||
    "eslint": "^8.19.0",
 | 
			
		||||
    "http-proxy-middleware": "^1.0.5",
 | 
			
		||||
    "http-proxy-middleware": "~2.0.6",
 | 
			
		||||
    "jasmine-core": "~4.1.0",
 | 
			
		||||
    "jasmine-spec-reporter": "~7.0.0",
 | 
			
		||||
    "karma": "~6.3.19",
 | 
			
		||||
    "karma-chrome-launcher": "~3.1.0",
 | 
			
		||||
    "karma-coverage": "~2.0.3",
 | 
			
		||||
    "karma-jasmine": "~5.0.0",
 | 
			
		||||
    "karma-jasmine-html-reporter": "^1.5.0",
 | 
			
		||||
    "ts-node": "~8.3.0",
 | 
			
		||||
    "karma-coverage": "~2.2.0",
 | 
			
		||||
    "karma-jasmine": "~5.1.0",
 | 
			
		||||
    "karma-jasmine-html-reporter": "~2.0.0",
 | 
			
		||||
    "ts-node": "~10.8.1",
 | 
			
		||||
    "tslint": "~6.1.0",
 | 
			
		||||
    "typescript": "~4.6.4"
 | 
			
		||||
  },
 | 
			
		||||
  "optionalDependencies": {
 | 
			
		||||
    "@cypress/schematic": "^1.3.0",
 | 
			
		||||
    "@cypress/schematic": "~2.0.0",
 | 
			
		||||
    "cypress": "^10.0.2",
 | 
			
		||||
    "cypress-fail-on-console-error": "^2.1.3",
 | 
			
		||||
    "cypress-fail-on-console-error": "~2.1.4",
 | 
			
		||||
    "cypress-wait-until": "^1.7.1",
 | 
			
		||||
    "mock-socket": "^9.0.3",
 | 
			
		||||
    "start-server-and-test": "^1.12.6"
 | 
			
		||||
    "mock-socket": "~9.1.4",
 | 
			
		||||
    "start-server-and-test": "~1.14.0"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -50,7 +50,7 @@
 | 
			
		||||
            <tbody>
 | 
			
		||||
              <tr>
 | 
			
		||||
                <td class="td-width" i18n="block.hash">Hash</td>
 | 
			
		||||
                <td><a [routerLink]="['/block/' | relativeUrl, block.id]" title="{{ block.id }}">{{ block.id | shortenString : 13 }}</a> <app-clipboard class="d-none d-sm-inline-block" [text]="block.id"></app-clipboard></td>
 | 
			
		||||
                <td>‎<a [routerLink]="['/block/' | relativeUrl, block.id]" title="{{ block.id }}">{{ block.id | shortenString : 13 }}</a> <app-clipboard class="d-none d-sm-inline-block" [text]="block.id"></app-clipboard></td>
 | 
			
		||||
              </tr>
 | 
			
		||||
              <tr>
 | 
			
		||||
                <td i18n="block.timestamp">Timestamp</td>
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
<div *ngIf="stateService.env.MINING_DASHBOARD" class="mb-3 d-flex menu" style="padding: 0px 35px;">
 | 
			
		||||
<div *ngIf="stateService.env.MINING_DASHBOARD" class="mb-3 d-inline-flex menu" style="padding: 0px 35px;">
 | 
			
		||||
  <a routerLinkActive="active" class="btn btn-primary w-50 mr-1"
 | 
			
		||||
    [routerLink]="['/graphs/mempool' | relativeUrl]">Mempool</a>
 | 
			
		||||
  <div ngbDropdown class="w-50">
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
<div class="container-xl">
 | 
			
		||||
  <h1 i18n="shared.broadcast-transaction|Broadcast Transaction">Broadcast Transaction</h1>
 | 
			
		||||
  <h1 class="text-left" i18n="shared.broadcast-transaction|Broadcast Transaction">Broadcast Transaction</h1>
 | 
			
		||||
 | 
			
		||||
  <form [formGroup]="pushTxForm" (submit)="pushTxForm.valid && postTx()" novalidate>
 | 
			
		||||
    <div class="mb-3">
 | 
			
		||||
 | 
			
		||||
@ -66,9 +66,9 @@
 | 
			
		||||
                        </ng-template>
 | 
			
		||||
                      </ng-template>
 | 
			
		||||
                      <ng-template #defaultAddress>
 | 
			
		||||
                        <a *ngIf="vin.prevout.scriptpubkey_address; else vinScriptPubkeyType" [routerLink]="['/address/' | relativeUrl, vin.prevout.scriptpubkey_address]" title="{{ vin.prevout.scriptpubkey_address }}">
 | 
			
		||||
                        <a class="shortable-address" *ngIf="vin.prevout.scriptpubkey_address; else vinScriptPubkeyType" [routerLink]="['/address/' | relativeUrl, vin.prevout.scriptpubkey_address]" title="{{ vin.prevout.scriptpubkey_address }}">
 | 
			
		||||
                          <span class="d-block d-lg-none">{{ vin.prevout.scriptpubkey_address | shortenString : 16 }}</span>
 | 
			
		||||
                          <span class="d-none d-lg-flex justify-content-start">
 | 
			
		||||
                          <span class="d-none d-lg-inline-flex justify-content-start">
 | 
			
		||||
                            <span class="addr-left flex-grow-1" [style]="vin.prevout.scriptpubkey_address.length > 40 ? 'max-width: 235px' : ''">{{ vin.prevout.scriptpubkey_address }}</span>
 | 
			
		||||
                            <span *ngIf="vin.prevout.scriptpubkey_address.length > 40" class="addr-right">{{ vin.prevout.scriptpubkey_address | capAddress: 40: 10 }}</span>
 | 
			
		||||
                          </span>
 | 
			
		||||
@ -164,9 +164,9 @@
 | 
			
		||||
                'highlight': vout.scriptpubkey_address === this.address && this.address !== ''
 | 
			
		||||
              }">
 | 
			
		||||
                <td>
 | 
			
		||||
                  <a *ngIf="vout.scriptpubkey_address; else scriptpubkey_type" [routerLink]="['/address/' | relativeUrl, vout.scriptpubkey_address]" title="{{ vout.scriptpubkey_address }}">
 | 
			
		||||
                  <a class="shortable-address" *ngIf="vout.scriptpubkey_address; else scriptpubkey_type" [routerLink]="['/address/' | relativeUrl, vout.scriptpubkey_address]" title="{{ vout.scriptpubkey_address }}">
 | 
			
		||||
                    <span class="d-block d-lg-none">{{ vout.scriptpubkey_address | shortenString : 16 }}</span>
 | 
			
		||||
                    <span class="d-none d-lg-flex justify-content-start">
 | 
			
		||||
                    <span class="d-none d-lg-inline-flex justify-content-start">
 | 
			
		||||
                      <span class="addr-left flex-grow-1" [style]="vout.scriptpubkey_address.length > 40 ? 'max-width: 235px' : ''">{{ vout.scriptpubkey_address }}</span>
 | 
			
		||||
                      <span *ngIf="vout.scriptpubkey_address.length > 40" class="addr-right">{{ vout.scriptpubkey_address | capAddress: 40: 10 }}</span>
 | 
			
		||||
                    </span>
 | 
			
		||||
 | 
			
		||||
@ -852,6 +852,40 @@ th {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .fee-progress-bar {
 | 
			
		||||
    @extend .fee-progress-bar;
 | 
			
		||||
    &.priority {
 | 
			
		||||
      @media (767px < width < 992px), (width < 576px) {
 | 
			
		||||
        width: 100%;
 | 
			
		||||
      }
 | 
			
		||||
      width: 75%;
 | 
			
		||||
      border-radius: 10px 0px 0px 10px !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .fees-wrapper-tooltip-chart {
 | 
			
		||||
    @extend .fees-wrapper-tooltip-chart;
 | 
			
		||||
    .title {
 | 
			
		||||
      direction: rtl;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .btn-link {
 | 
			
		||||
    padding: 0.1rem 0.5rem 0.25rem 0 !important;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .shortable-address {
 | 
			
		||||
    direction: ltr;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .lastest-blocks-table {
 | 
			
		||||
    @extend .lastest-blocks-table;
 | 
			
		||||
    .table-cell-mined {
 | 
			
		||||
      @extend .table-cell-mined;
 | 
			
		||||
      text-align: right !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  .mempool-graph {
 | 
			
		||||
    @extend .mempool-graph;
 | 
			
		||||
    direction: ltr;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user