Use bitcoin RPC getblock because esplora returns int for difficulty - Fix some css in mining dashboard
This commit is contained in:
		
							parent
							
								
									bec3f214b5
								
							
						
					
					
						commit
						0730053d5d
					
				@ -70,7 +70,7 @@ class BitcoinApi implements AbstractBitcoinApi {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return this.bitcoindClient.getBlock(hash)
 | 
			
		||||
      .then((block: IBitcoinApi.Block) => this.convertBlock(block));
 | 
			
		||||
      .then((block: IBitcoinApi.Block) => BitcoinApi.convertBlock(block));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  $getAddress(address: string): Promise<IEsploraApi.Address> {
 | 
			
		||||
@ -186,7 +186,7 @@ class BitcoinApi implements AbstractBitcoinApi {
 | 
			
		||||
    return esploraTransaction;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private convertBlock(block: IBitcoinApi.Block): IEsploraApi.Block {
 | 
			
		||||
  static convertBlock(block: IBitcoinApi.Block): IEsploraApi.Block {
 | 
			
		||||
    return {
 | 
			
		||||
      id: block.hash,
 | 
			
		||||
      height: block.height,
 | 
			
		||||
 | 
			
		||||
@ -11,6 +11,7 @@ import { IEsploraApi } from './bitcoin/esplora-api.interface';
 | 
			
		||||
import poolsRepository from '../repositories/PoolsRepository';
 | 
			
		||||
import blocksRepository from '../repositories/BlocksRepository';
 | 
			
		||||
import loadingIndicators from './loading-indicators';
 | 
			
		||||
import BitcoinApi from './bitcoin/bitcoin-api';
 | 
			
		||||
 | 
			
		||||
class Blocks {
 | 
			
		||||
  private blocks: BlockExtended[] = [];
 | 
			
		||||
@ -103,8 +104,8 @@ class Blocks {
 | 
			
		||||
   * @param transactions
 | 
			
		||||
   * @returns BlockExtended
 | 
			
		||||
   */
 | 
			
		||||
   private async $getBlockExtended(block: IEsploraApi.Block, transactions: TransactionExtended[]): Promise<BlockExtended> {
 | 
			
		||||
    const blockExtended: BlockExtended = Object.assign({extras: {}}, block);
 | 
			
		||||
  private async $getBlockExtended(block: IEsploraApi.Block, transactions: TransactionExtended[]): Promise<BlockExtended> {
 | 
			
		||||
    const blockExtended: BlockExtended = Object.assign({ extras: {} }, block);
 | 
			
		||||
    blockExtended.extras.reward = transactions[0].vout.reduce((acc, curr) => acc + curr.value, 0);
 | 
			
		||||
    blockExtended.extras.coinbaseTx = transactionUtils.stripCoinbaseTransaction(transactions[0]);
 | 
			
		||||
 | 
			
		||||
@ -112,19 +113,19 @@ class Blocks {
 | 
			
		||||
    blockExtended.extras.coinbaseRaw = coinbaseRaw.hex;
 | 
			
		||||
 | 
			
		||||
    if (block.height === 0) {
 | 
			
		||||
       blockExtended.extras.medianFee = 0; // 50th percentiles
 | 
			
		||||
       blockExtended.extras.feeRange = [0, 0, 0, 0, 0, 0, 0];
 | 
			
		||||
       blockExtended.extras.totalFees = 0;
 | 
			
		||||
       blockExtended.extras.avgFee = 0;
 | 
			
		||||
       blockExtended.extras.avgFeeRate = 0;
 | 
			
		||||
     } else {
 | 
			
		||||
      blockExtended.extras.medianFee = 0; // 50th percentiles
 | 
			
		||||
      blockExtended.extras.feeRange = [0, 0, 0, 0, 0, 0, 0];
 | 
			
		||||
      blockExtended.extras.totalFees = 0;
 | 
			
		||||
      blockExtended.extras.avgFee = 0;
 | 
			
		||||
      blockExtended.extras.avgFeeRate = 0;
 | 
			
		||||
    } else {
 | 
			
		||||
      const stats = await bitcoinClient.getBlockStats(block.id);
 | 
			
		||||
      blockExtended.extras.medianFee = stats.feerate_percentiles[2]; // 50th percentiles
 | 
			
		||||
       blockExtended.extras.feeRange = [stats.minfeerate, stats.feerate_percentiles, stats.maxfeerate].flat();
 | 
			
		||||
       blockExtended.extras.totalFees = stats.totalfee;
 | 
			
		||||
       blockExtended.extras.avgFee = stats.avgfee;
 | 
			
		||||
       blockExtended.extras.avgFeeRate = stats.avgfeerate;
 | 
			
		||||
     }
 | 
			
		||||
      blockExtended.extras.feeRange = [stats.minfeerate, stats.feerate_percentiles, stats.maxfeerate].flat();
 | 
			
		||||
      blockExtended.extras.totalFees = stats.totalfee;
 | 
			
		||||
      blockExtended.extras.avgFee = stats.avgfee;
 | 
			
		||||
      blockExtended.extras.avgFeeRate = stats.avgfeerate;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (Common.indexingEnabled()) {
 | 
			
		||||
      let pool: PoolTag;
 | 
			
		||||
@ -239,7 +240,7 @@ class Blocks {
 | 
			
		||||
            indexedThisRun = 0;
 | 
			
		||||
          }
 | 
			
		||||
          const blockHash = await bitcoinApi.$getBlockHash(blockHeight);
 | 
			
		||||
          const block = await bitcoinApi.$getBlock(blockHash);
 | 
			
		||||
          const block = BitcoinApi.convertBlock(await bitcoinClient.getBlock(blockHash));
 | 
			
		||||
          const transactions = await this.$getTransactionsExtended(blockHash, block.height, true, true);
 | 
			
		||||
          const blockExtended = await this.$getBlockExtended(block, transactions);
 | 
			
		||||
          await blocksRepository.$saveBlockInDatabase(blockExtended);
 | 
			
		||||
@ -276,7 +277,7 @@ class Blocks {
 | 
			
		||||
      if (blockchainInfo.blocks === blockchainInfo.headers) {
 | 
			
		||||
        const heightDiff = blockHeightTip % 2016;
 | 
			
		||||
        const blockHash = await bitcoinApi.$getBlockHash(blockHeightTip - heightDiff);
 | 
			
		||||
        const block = await bitcoinApi.$getBlock(blockHash);
 | 
			
		||||
        const block = BitcoinApi.convertBlock(await bitcoinClient.getBlock(blockHash));
 | 
			
		||||
        this.lastDifficultyAdjustmentTime = block.timestamp;
 | 
			
		||||
        this.currentDifficulty = block.difficulty;
 | 
			
		||||
 | 
			
		||||
@ -300,7 +301,7 @@ class Blocks {
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      const blockHash = await bitcoinApi.$getBlockHash(this.currentBlockHeight);
 | 
			
		||||
      const block = await bitcoinApi.$getBlock(blockHash);
 | 
			
		||||
      const block = BitcoinApi.convertBlock(await bitcoinClient.getBlock(blockHash));
 | 
			
		||||
      const txIds: string[] = await bitcoinApi.$getTxIdsForBlock(blockHash);
 | 
			
		||||
      const transactions = await this.$getTransactionsExtended(blockHash, block.height, false);
 | 
			
		||||
      const blockExtended: BlockExtended = await this.$getBlockExtended(block, transactions);
 | 
			
		||||
@ -332,14 +333,14 @@ class Blocks {
 | 
			
		||||
  /**
 | 
			
		||||
   * Index a block if it's missing from the database. Returns the block after indexing
 | 
			
		||||
   */
 | 
			
		||||
   public async $indexBlock(height: number): Promise<BlockExtended> {
 | 
			
		||||
  public async $indexBlock(height: number): Promise<BlockExtended> {
 | 
			
		||||
    const dbBlock = await blocksRepository.$getBlockByHeight(height);
 | 
			
		||||
    if (dbBlock != null) {
 | 
			
		||||
      return this.prepareBlock(dbBlock);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const blockHash = await bitcoinApi.$getBlockHash(height);
 | 
			
		||||
    const block = await bitcoinApi.$getBlock(blockHash);
 | 
			
		||||
    const block = BitcoinApi.convertBlock(await bitcoinClient.getBlock(blockHash));
 | 
			
		||||
    const transactions = await this.$getTransactionsExtended(blockHash, block.height, true);
 | 
			
		||||
    const blockExtended = await this.$getBlockExtended(block, transactions);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -5,30 +5,32 @@
 | 
			
		||||
    <!-- Temporary stuff here - Will be moved to a component once we have more useful data to show -->
 | 
			
		||||
    <div class="col">
 | 
			
		||||
      <div class="main-title">Reward stats</div>
 | 
			
		||||
      <div class="card" style="height: 123px">
 | 
			
		||||
        <div class="card-body more-padding">
 | 
			
		||||
          <div class="fee-estimation-container" *ngIf="$rewardStats | async as rewardStats; else loadingReward">
 | 
			
		||||
            <div class="item">
 | 
			
		||||
              <h5 class="card-title mb-1" i18n="mining.rewards">Miners Reward</h5>
 | 
			
		||||
              <div class="card-text">
 | 
			
		||||
                <app-amount [satoshis]="rewardStats.totalReward" digitsInfo="1.2-2" [noFiat]="true"></app-amount>
 | 
			
		||||
                <div class="symbol">in the last 8 blocks</div>
 | 
			
		||||
      <div class="card-wrapper">
 | 
			
		||||
        <div class="card" style="height: 123px">
 | 
			
		||||
          <div class="card-body more-padding">
 | 
			
		||||
            <div class="reward-container" *ngIf="$rewardStats | async as rewardStats; else loadingReward">
 | 
			
		||||
              <div class="item">
 | 
			
		||||
                <h5 class="card-title" i18n="mining.rewards">Miners Reward</h5>
 | 
			
		||||
                <div class="card-text">
 | 
			
		||||
                  <app-amount [satoshis]="rewardStats.totalReward" digitsInfo="1.2-2" [noFiat]="true"></app-amount>
 | 
			
		||||
                  <div class="symbol">in the last 8 blocks</div>
 | 
			
		||||
                </div>
 | 
			
		||||
              </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="item">
 | 
			
		||||
              <h5 class="card-title mb-1" i18n="mining.rewards-per-tx">Reward Per Tx</h5>
 | 
			
		||||
              <div class="card-text">
 | 
			
		||||
                {{ rewardStats.rewardPerTx | amountShortener }}
 | 
			
		||||
                <span class="symbol">sats/tx</span>
 | 
			
		||||
                <div class="symbol">in the last 8 blocks</div>
 | 
			
		||||
              <div class="item">
 | 
			
		||||
                <h5 class="card-title" i18n="mining.rewards-per-tx">Reward Per Tx</h5>
 | 
			
		||||
                <div class="card-text">
 | 
			
		||||
                  {{ rewardStats.rewardPerTx | amountShortener }}
 | 
			
		||||
                  <span class="symbol">sats/tx</span>
 | 
			
		||||
                  <div class="symbol">in the last 8 blocks</div>
 | 
			
		||||
                </div>
 | 
			
		||||
              </div>
 | 
			
		||||
            </div>
 | 
			
		||||
            <div class="item">
 | 
			
		||||
              <h5 class="card-title mb-1" i18n="mining.average-fee">Average Fee</h5>
 | 
			
		||||
              <div class="card-text">
 | 
			
		||||
                {{ rewardStats.feePerTx | amountShortener}}
 | 
			
		||||
                <span class="symbol">sats/tx</span>
 | 
			
		||||
                <div class="symbol">in the last 8 blocks</div>
 | 
			
		||||
              <div class="item">
 | 
			
		||||
                <h5 class="card-title" i18n="mining.average-fee">Average Fee</h5>
 | 
			
		||||
                <div class="card-text">
 | 
			
		||||
                  {{ rewardStats.feePerTx | amountShortener}}
 | 
			
		||||
                  <span class="symbol">sats/tx</span>
 | 
			
		||||
                  <div class="symbol">in the last 8 blocks</div>
 | 
			
		||||
                </div>
 | 
			
		||||
              </div>
 | 
			
		||||
            </div>
 | 
			
		||||
          </div>
 | 
			
		||||
@ -36,24 +38,24 @@
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <ng-template #loadingReward>
 | 
			
		||||
      <div class="fee-estimation-container">
 | 
			
		||||
      <div class="reward-container">
 | 
			
		||||
        <div class="item">
 | 
			
		||||
          <h5 class="card-title" i18n="">Miners Reward</h5>
 | 
			
		||||
          <div class="card-text">
 | 
			
		||||
          <h5 class="card-title" i18n="mining.rewards">Miners Reward</h5>
 | 
			
		||||
          <div class="card-text skeleton">
 | 
			
		||||
            <div class="skeleton-loader"></div>
 | 
			
		||||
            <div class="skeleton-loader"></div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="item">
 | 
			
		||||
          <h5 class="card-title" i18n="">Reward Per Tx</h5>
 | 
			
		||||
          <div class="card-text">
 | 
			
		||||
          <h5 class="card-title" i18n="mining.rewards-per-tx">Reward Per Tx</h5>
 | 
			
		||||
          <div class="card-text skeleton">
 | 
			
		||||
            <div class="skeleton-loader"></div>
 | 
			
		||||
            <div class="skeleton-loader"></div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div class="item">
 | 
			
		||||
          <h5 class="card-title" i18n="">Average Fee</h5>
 | 
			
		||||
          <div class="card-text">
 | 
			
		||||
          <h5 class="card-title" i18n="mining.average-fee">Average Fee</h5>
 | 
			
		||||
          <div class="card-text skeleton">
 | 
			
		||||
            <div class="skeleton-loader"></div>
 | 
			
		||||
            <div class="skeleton-loader"></div>
 | 
			
		||||
          </div>
 | 
			
		||||
@ -136,4 +138,4 @@
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
  </div>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
@ -59,50 +59,57 @@
 | 
			
		||||
  padding-bottom: 3px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.fee-estimation-container {
 | 
			
		||||
.reward-container {
 | 
			
		||||
  display: flex;
 | 
			
		||||
  justify-content: space-between;
 | 
			
		||||
  @media (min-width: 376px) {
 | 
			
		||||
    flex-direction: row;
 | 
			
		||||
  flex-direction: row;
 | 
			
		||||
  justify-content: space-around;
 | 
			
		||||
  height: 76px;
 | 
			
		||||
  .shared-block {
 | 
			
		||||
    color: #ffffff66;
 | 
			
		||||
    font-size: 12px;
 | 
			
		||||
  }
 | 
			
		||||
  .item {
 | 
			
		||||
    max-width: 150px;
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    width: -webkit-fill-available;
 | 
			
		||||
    @media (min-width: 376px) {
 | 
			
		||||
      margin: 0 auto 0px;
 | 
			
		||||
    }
 | 
			
		||||
    &:first-child{
 | 
			
		||||
    display: table-cell;
 | 
			
		||||
    padding: 0 5px;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    &:nth-child(1) {
 | 
			
		||||
      display: none;
 | 
			
		||||
      @media (min-width: 485px) {
 | 
			
		||||
        display: block;
 | 
			
		||||
        display: table-cell;
 | 
			
		||||
      }
 | 
			
		||||
      @media (min-width: 768px) {
 | 
			
		||||
        display: none;
 | 
			
		||||
      }
 | 
			
		||||
      @media (min-width: 992px) {
 | 
			
		||||
        display: block;
 | 
			
		||||
        display: table-cell;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    &:last-child {
 | 
			
		||||
      margin-bottom: 0;
 | 
			
		||||
    }
 | 
			
		||||
    .card-text span {
 | 
			
		||||
      color: #ffffff66;
 | 
			
		||||
      font-size: 12px;
 | 
			
		||||
      top: 0px;
 | 
			
		||||
    }
 | 
			
		||||
    .fee-text{
 | 
			
		||||
      border-bottom: 1px solid #ffffff1c;
 | 
			
		||||
      width: fit-content;
 | 
			
		||||
      margin: auto;
 | 
			
		||||
      line-height: 1.45;
 | 
			
		||||
      padding: 0px 2px;
 | 
			
		||||
    }
 | 
			
		||||
    .fiat {
 | 
			
		||||
      display: block;
 | 
			
		||||
      font-size: 14px !important;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  .card-text {
 | 
			
		||||
    font-size: 22px;
 | 
			
		||||
    margin-top: -9px;
 | 
			
		||||
    position: relative;
 | 
			
		||||
  }
 | 
			
		||||
  .card-text.skeleton {
 | 
			
		||||
    margin-top: 0px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.more-padding {
 | 
			
		||||
  padding: 18px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.card-wrapper {
 | 
			
		||||
  .card {
 | 
			
		||||
    height: auto !important;
 | 
			
		||||
  }
 | 
			
		||||
  .card-body {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    flex: inherit;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    flex-direction: column;
 | 
			
		||||
    justify-content: space-around;
 | 
			
		||||
    padding: 22px 20px;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -36,8 +36,8 @@ export class MiningDashboardComponent implements OnInit {
 | 
			
		||||
 | 
			
		||||
        return {
 | 
			
		||||
          'totalReward': totalReward,
 | 
			
		||||
          'rewardPerTx': totalReward / totalTx,
 | 
			
		||||
          'feePerTx': totalFee / totalTx,
 | 
			
		||||
          'rewardPerTx': Math.round(totalReward / totalTx),
 | 
			
		||||
          'feePerTx': Math.round(totalFee / totalTx),
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user