diff --git a/backend/src/api/bitcoin/bitcoin-api.ts b/backend/src/api/bitcoin/bitcoin-api.ts index e4557b65f..97a428c23 100644 --- a/backend/src/api/bitcoin/bitcoin-api.ts +++ b/backend/src/api/bitcoin/bitcoin-api.ts @@ -41,7 +41,9 @@ class BitcoinApi implements AbstractBitcoinApi { $getBlockHeightTip(): Promise { return this.bitcoindClient.getChainTips() - .then((result: IBitcoinApi.ChainTips[]) => result[0].height); + .then((result: IBitcoinApi.ChainTips[]) => { + return result.find(tip => tip.status === 'active')!.height; + }); } $getTxIdsForBlock(hash: string): Promise { diff --git a/backend/src/api/blocks.ts b/backend/src/api/blocks.ts index 79b11bcb1..40687060f 100644 --- a/backend/src/api/blocks.ts +++ b/backend/src/api/blocks.ts @@ -252,7 +252,7 @@ class Blocks { const blockHeightTip = await bitcoinApi.$getBlockHeightTip(); if (this.blocks.length === 0) { - this.currentBlockHeight = blockHeightTip - config.MEMPOOL.INITIAL_BLOCKS_AMOUNT; + this.currentBlockHeight = Math.max(blockHeightTip - config.MEMPOOL.INITIAL_BLOCKS_AMOUNT, -1); } else { this.currentBlockHeight = this.blocks[this.blocks.length - 1].height; } @@ -271,17 +271,19 @@ class Blocks { this.lastDifficultyAdjustmentTime = block.timestamp; this.currentDifficulty = block.difficulty; - const previousPeriodBlockHash = await bitcoinApi.$getBlockHash(blockHeightTip - heightDiff - 2016); - const previousPeriodBlock = await bitcoinApi.$getBlock(previousPeriodBlockHash); - this.previousDifficultyRetarget = (block.difficulty - previousPeriodBlock.difficulty) / previousPeriodBlock.difficulty * 100; - logger.debug(`Initial difficulty adjustment data set.`); + if (blockHeightTip >= 2016) { + const previousPeriodBlockHash = await bitcoinApi.$getBlockHash(blockHeightTip - heightDiff - 2016); + const previousPeriodBlock = await bitcoinApi.$getBlock(previousPeriodBlockHash); + this.previousDifficultyRetarget = (block.difficulty - previousPeriodBlock.difficulty) / previousPeriodBlock.difficulty * 100; + logger.debug(`Initial difficulty adjustment data set.`); + } } else { logger.debug(`Blockchain headers (${blockchainInfo.headers}) and blocks (${blockchainInfo.blocks}) not in sync. Waiting...`); } } while (this.currentBlockHeight < blockHeightTip) { - if (this.currentBlockHeight === 0) { + if (this.currentBlockHeight < blockHeightTip - config.MEMPOOL.INITIAL_BLOCKS_AMOUNT) { this.currentBlockHeight = blockHeightTip; } else { this.currentBlockHeight++; diff --git a/backend/src/routes.ts b/backend/src/routes.ts index 8ccc9c2e1..710cd8378 100644 --- a/backend/src/routes.ts +++ b/backend/src/routes.ts @@ -681,7 +681,7 @@ class Routes { } let nextHash = startFromHash; - for (let i = 0; i < 10; i++) { + for (let i = 0; i < 10 && nextHash; i++) { const localBlock = blocks.getBlocks().find((b) => b.id === nextHash); if (localBlock) { returnBlocks.push(localBlock); diff --git a/frontend/src/app/components/block/block.component.ts b/frontend/src/app/components/block/block.component.ts index 4e7b08373..512b6b411 100644 --- a/frontend/src/app/components/block/block.component.ts +++ b/frontend/src/app/components/block/block.component.ts @@ -217,12 +217,8 @@ export class BlockComponent implements OnInit, OnDestroy { this.blockSubsidy = 0; return; } - this.blockSubsidy = 50; - let halvenings = Math.floor(this.block.height / 210000); - while (halvenings > 0) { - this.blockSubsidy = this.blockSubsidy / 2; - halvenings--; - } + const halvings = Math.floor(this.block.height / 210000); + this.blockSubsidy = 50 * 2 ** -halvings; } pageChange(page: number, target: HTMLElement) { diff --git a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts index 7a0123a78..4352944c6 100644 --- a/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts +++ b/frontend/src/app/components/blockchain-blocks/blockchain-blocks.component.ts @@ -110,7 +110,7 @@ export class BlockchainBlocksComponent implements OnInit, OnDestroy { this.markBlockSubscription = this.stateService.markBlock$ .subscribe((state) => { this.markHeight = undefined; - if (state.blockHeight) { + if (state.blockHeight !== undefined) { this.markHeight = state.blockHeight; } this.moveArrowToPosition(false); @@ -127,7 +127,7 @@ export class BlockchainBlocksComponent implements OnInit, OnDestroy { } moveArrowToPosition(animate: boolean, newBlockFromLeft = false) { - if (!this.markHeight) { + if (this.markHeight === undefined) { this.arrowVisible = false; return; } diff --git a/frontend/src/app/components/latest-blocks/latest-blocks.component.ts b/frontend/src/app/components/latest-blocks/latest-blocks.component.ts index cef512388..5bdb55ece 100644 --- a/frontend/src/app/components/latest-blocks/latest-blocks.component.ts +++ b/frontend/src/app/components/latest-blocks/latest-blocks.component.ts @@ -109,8 +109,12 @@ export class LatestBlocksComponent implements OnInit, OnDestroy { if (this.isLoading) { return; } + const height = this.blocks[this.blocks.length - 1].height - 1; + if (height < 0) { + return; + } this.isLoading = true; - this.electrsApiService.listBlocks$(this.blocks[this.blocks.length - 1].height - 1) + this.electrsApiService.listBlocks$(height) .subscribe((blocks) => { this.blocks = this.blocks.concat(blocks); this.isLoading = false; diff --git a/frontend/src/app/dashboard/dashboard.component.ts b/frontend/src/app/dashboard/dashboard.component.ts index 33fb5ea91..610f45765 100644 --- a/frontend/src/app/dashboard/dashboard.component.ts +++ b/frontend/src/app/dashboard/dashboard.component.ts @@ -144,6 +144,9 @@ export class DashboardComponent implements OnInit { this.latestBlockHeight = block.height; }), scan((acc, [block]) => { + if (acc.find((b) => b.height == block.height)) { + return acc; + } acc.unshift(block); acc = acc.slice(0, 6); return acc; @@ -153,6 +156,9 @@ export class DashboardComponent implements OnInit { this.transactions$ = this.stateService.transactions$ .pipe( scan((acc, tx) => { + if (acc.find((t) => t.txid == tx.txid)) { + return acc; + } acc.unshift(tx); acc = acc.slice(0, 6); return acc; diff --git a/frontend/src/app/services/state.service.ts b/frontend/src/app/services/state.service.ts index 98a65d34a..5e181063b 100644 --- a/frontend/src/app/services/state.service.ts +++ b/frontend/src/app/services/state.service.ts @@ -71,7 +71,7 @@ export class StateService { network = ''; blockVSize: number; env: Env; - latestBlockHeight = 0; + latestBlockHeight = -1; networkChanged$ = new ReplaySubject(1); blocks$: ReplaySubject<[BlockExtended, boolean]>; diff --git a/frontend/src/app/services/websocket.service.ts b/frontend/src/app/services/websocket.service.ts index ae4c0e381..1eb9a56e6 100644 --- a/frontend/src/app/services/websocket.service.ts +++ b/frontend/src/app/services/websocket.service.ts @@ -68,7 +68,7 @@ export class WebsocketService { clearTimeout(this.onlineCheckTimeout); clearTimeout(this.onlineCheckTimeoutTwo); - this.stateService.latestBlockHeight = 0; + this.stateService.latestBlockHeight = -1; this.websocketSubject.complete(); this.subscription.unsubscribe();