Merge branch 'master' into mononaut/faster-rbf-load
This commit is contained in:
		
						commit
						a2f6ea7b3a
					
				| @ -81,6 +81,7 @@ class Blocks { | ||||
|   private async $getTransactionsExtended( | ||||
|     blockHash: string, | ||||
|     blockHeight: number, | ||||
|     blockTime: number, | ||||
|     onlyCoinbase: boolean, | ||||
|     txIds: string[] | null = null, | ||||
|     quiet: boolean = false, | ||||
| @ -101,6 +102,12 @@ class Blocks { | ||||
|     if (!onlyCoinbase) { | ||||
|       for (const txid of txIds) { | ||||
|         if (mempool[txid]) { | ||||
|           mempool[txid].status = { | ||||
|             confirmed: true, | ||||
|             block_height: blockHeight, | ||||
|             block_hash: blockHash, | ||||
|             block_time: blockTime, | ||||
|           }; | ||||
|           transactionMap[txid] = mempool[txid]; | ||||
|           foundInMempool++; | ||||
|           totalFound++; | ||||
| @ -608,7 +615,7 @@ class Blocks { | ||||
|           } | ||||
|           const blockHash = await bitcoinApi.$getBlockHash(blockHeight); | ||||
|           const block: IEsploraApi.Block = await bitcoinApi.$getBlock(blockHash); | ||||
|           const transactions = await this.$getTransactionsExtended(blockHash, block.height, true, null, true); | ||||
|           const transactions = await this.$getTransactionsExtended(blockHash, block.height, block.timestamp, true, null, true); | ||||
|           const blockExtended = await this.$getBlockExtended(block, transactions); | ||||
| 
 | ||||
|           newlyIndexed++; | ||||
| @ -701,7 +708,7 @@ class Blocks { | ||||
|       const verboseBlock = await bitcoinClient.getBlock(blockHash, 2); | ||||
|       const block = BitcoinApi.convertBlock(verboseBlock); | ||||
|       const txIds: string[] = verboseBlock.tx.map(tx => tx.txid); | ||||
|       const transactions = await this.$getTransactionsExtended(blockHash, block.height, false, txIds, false, true) as MempoolTransactionExtended[]; | ||||
|       const transactions = await this.$getTransactionsExtended(blockHash, block.height, block.timestamp, false, txIds, false, true) as MempoolTransactionExtended[]; | ||||
| 
 | ||||
|       // fill in missing transaction fee data from verboseBlock
 | ||||
|       for (let i = 0; i < transactions.length; i++) { | ||||
| @ -890,7 +897,7 @@ class Blocks { | ||||
| 
 | ||||
|     const blockHash = await bitcoinApi.$getBlockHash(height); | ||||
|     const block: IEsploraApi.Block = await bitcoinApi.$getBlock(blockHash); | ||||
|     const transactions = await this.$getTransactionsExtended(blockHash, block.height, true); | ||||
|     const transactions = await this.$getTransactionsExtended(blockHash, block.height, block.timestamp, true); | ||||
|     const blockExtended = await this.$getBlockExtended(block, transactions); | ||||
| 
 | ||||
|     if (Common.indexingEnabled()) { | ||||
| @ -902,7 +909,7 @@ class Blocks { | ||||
| 
 | ||||
|   public async $indexStaleBlock(hash: string): Promise<BlockExtended> { | ||||
|     const block: IEsploraApi.Block = await bitcoinApi.$getBlock(hash); | ||||
|     const transactions = await this.$getTransactionsExtended(hash, block.height, true); | ||||
|     const transactions = await this.$getTransactionsExtended(hash, block.height, block.timestamp, true); | ||||
|     const blockExtended = await this.$getBlockExtended(block, transactions); | ||||
| 
 | ||||
|     blockExtended.canonical = await bitcoinApi.$getBlockHash(block.height); | ||||
|  | ||||
| @ -63,7 +63,8 @@ export class IncomingTransactionsGraphComponent implements OnInit, OnChanges, On | ||||
|       return; | ||||
|     } | ||||
|     this.windowPreference = this.windowPreferenceOverride ? this.windowPreferenceOverride : this.storageService.getValue('graphWindowPreference'); | ||||
|     this.MA = this.calculateMA(this.data.series[0]); | ||||
|     const windowSize = Math.max(10, Math.floor(this.data.series[0].length / 8)); | ||||
|     this.MA = this.calculateMA(this.data.series[0], windowSize); | ||||
|     this.mountChart(); | ||||
|   } | ||||
| 
 | ||||
| @ -74,33 +75,22 @@ export class IncomingTransactionsGraphComponent implements OnInit, OnChanges, On | ||||
|     this.isLoading = false; | ||||
|   } | ||||
| 
 | ||||
|   /// calculate the moving average of maData
 | ||||
|   calculateMA(maData): number[][] { | ||||
|   /// calculate the moving average of the provided data based on windowSize
 | ||||
|   calculateMA(data: number[][], windowSize: number = 100): number[][] { | ||||
|     //update const variables that are not changed
 | ||||
|     const ma: number[][] = []; | ||||
|     let sum = 0; | ||||
|     let i = 0; | ||||
|     const len = maData.length; | ||||
| 
 | ||||
|     //Adjust window length based on the length of the data
 | ||||
|     //5% appeared as a good amount from tests
 | ||||
|     //TODO: make this a text box in the UI
 | ||||
|     const maWindowLen = Math.ceil(len * 0.05); | ||||
| 
 | ||||
|     //calculate the center of the moving average window
 | ||||
|     const center = Math.floor(maWindowLen / 2); | ||||
| 
 | ||||
|     //calculate the centered moving average
 | ||||
|     for (i = center; i < len - center; i++) { | ||||
|       sum = 0; | ||||
|       //build out ma as we loop through the data
 | ||||
|       ma[i] = []; | ||||
|       ma[i].push(maData[i][0]); | ||||
|       for (let j = i - center; j <= i + center; j++) { | ||||
|         sum += maData[j][1]; | ||||
|     for (i = 0; i < data.length; i++) { | ||||
|       sum += data[i][1]; | ||||
|       if (i >= windowSize) { | ||||
|         sum -= data[i - windowSize][1]; | ||||
|         const midpoint = i - Math.floor(windowSize / 2); | ||||
|         const avg = sum / windowSize; | ||||
|         ma.push([data[midpoint][0], avg]); | ||||
|       } | ||||
| 
 | ||||
|       ma[i].push(sum / maWindowLen); | ||||
|     } | ||||
| 
 | ||||
|     //return the moving average array
 | ||||
| @ -138,36 +128,22 @@ export class IncomingTransactionsGraphComponent implements OnInit, OnChanges, On | ||||
|           } | ||||
|         }], | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       zlevel: 0, | ||||
|       name: 'MA', | ||||
|       data: this.MA, | ||||
|       type: 'line', | ||||
|       smooth: false, | ||||
|       showSymbol: false, | ||||
|       symbol: 'none', | ||||
|       lineStyle: { | ||||
|         width: 1, | ||||
|         color: "white", | ||||
|       }, | ||||
|       markLine: { | ||||
|         silent: true, | ||||
|     }); | ||||
|     if (this.template !== 'widget') { | ||||
|       seriesGraph.push({ | ||||
|         zlevel: 0, | ||||
|         name: 'MA', | ||||
|         data: this.MA, | ||||
|         type: 'line', | ||||
|         smooth: false, | ||||
|         showSymbol: false, | ||||
|         symbol: 'none', | ||||
|         lineStyle: { | ||||
|           color: '#fff', | ||||
|           opacity: 1, | ||||
|           width: 2, | ||||
|         }, | ||||
|         data: [{ | ||||
|           yAxis: 1667, | ||||
|           label: { | ||||
|             show: false, | ||||
|             color: '#ffffff', | ||||
|           } | ||||
|         }], | ||||
|       } | ||||
|     }); | ||||
|           color: "white", | ||||
|         } | ||||
|       }); | ||||
|     } | ||||
| 
 | ||||
|     this.mempoolStatsChartOption = { | ||||
|       grid: { | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| // Import tree-shakeable echarts
 | ||||
| import * as echarts from 'echarts/core'; | ||||
| import { LineChart, LinesChart, BarChart, TreemapChart, PieChart, ScatterChart } from 'echarts/charts'; | ||||
| import { TitleComponent, TooltipComponent, GridComponent, LegendComponent, GeoComponent, DataZoomComponent, VisualMapComponent } from 'echarts/components'; | ||||
| import { TitleComponent, TooltipComponent, GridComponent, LegendComponent, GeoComponent, DataZoomComponent, VisualMapComponent, MarkLineComponent } from 'echarts/components'; | ||||
| import { SVGRenderer, CanvasRenderer } from 'echarts/renderers'; | ||||
| // Typescript interfaces
 | ||||
| import { EChartsOption, TreemapSeriesOption, LineSeriesOption, PieSeriesOption } from 'echarts'; | ||||
| @ -11,7 +11,7 @@ echarts.use([ | ||||
|   SVGRenderer, CanvasRenderer, | ||||
|   TitleComponent, TooltipComponent, GridComponent, | ||||
|   LegendComponent, GeoComponent, DataZoomComponent, | ||||
|   VisualMapComponent, | ||||
|   VisualMapComponent, MarkLineComponent, | ||||
|   LineChart, LinesChart, BarChart, TreemapChart, PieChart, ScatterChart | ||||
| ]); | ||||
| export { echarts, EChartsOption, TreemapSeriesOption, LineSeriesOption, PieSeriesOption }; | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user