Add /api/v1/mining/blocks/fee-rates/{interval} API
This commit is contained in:
		
							parent
							
								
									653ce3e40c
								
							
						
					
					
						commit
						078c7ac228
					
				| @ -15,7 +15,7 @@ class Mining { | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
|    * Get historical block reward and total fee |    * Get historical block total fee | ||||||
|    */ |    */ | ||||||
|   public async $getHistoricalBlockFees(interval: string | null = null): Promise<any> { |   public async $getHistoricalBlockFees(interval: string | null = null): Promise<any> { | ||||||
|     return await BlocksRepository.$getHistoricalBlockFees( |     return await BlocksRepository.$getHistoricalBlockFees( | ||||||
| @ -34,6 +34,16 @@ class Mining { | |||||||
|     ); |     ); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   /** | ||||||
|  |    * Get historical block fee rates percentiles | ||||||
|  |    */ | ||||||
|  |    public async $getHistoricalBlockFeeRates(interval: string | null = null): Promise<any> { | ||||||
|  |     return await BlocksRepository.$getHistoricalBlockFeeRates( | ||||||
|  |       this.getTimeRange(interval), | ||||||
|  |       Common.getSqlInterval(interval) | ||||||
|  |     ); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   /** |   /** | ||||||
|    * Generate high level overview of the pool ranks and general stats |    * Generate high level overview of the pool ranks and general stats | ||||||
|    */ |    */ | ||||||
|  | |||||||
| @ -326,6 +326,7 @@ class Server { | |||||||
|         .get(config.MEMPOOL.API_URL_PREFIX + 'mining/reward-stats/:blockCount', routes.$getRewardStats) |         .get(config.MEMPOOL.API_URL_PREFIX + 'mining/reward-stats/:blockCount', routes.$getRewardStats) | ||||||
|         .get(config.MEMPOOL.API_URL_PREFIX + 'mining/blocks/fees/:interval', routes.$getHistoricalBlockFees) |         .get(config.MEMPOOL.API_URL_PREFIX + 'mining/blocks/fees/:interval', routes.$getHistoricalBlockFees) | ||||||
|         .get(config.MEMPOOL.API_URL_PREFIX + 'mining/blocks/rewards/:interval', routes.$getHistoricalBlockRewards) |         .get(config.MEMPOOL.API_URL_PREFIX + 'mining/blocks/rewards/:interval', routes.$getHistoricalBlockRewards) | ||||||
|  |         .get(config.MEMPOOL.API_URL_PREFIX + 'mining/blocks/fee-rates/:interval', routes.$getHistoricalBlockFeeRates) | ||||||
|       ; |       ; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -427,6 +427,41 @@ class BlocksRepository { | |||||||
|       throw e; |       throw e; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * Get the historical averaged block fee rate percentiles | ||||||
|  |    */ | ||||||
|  |    public async $getHistoricalBlockFeeRates(div: number, interval: string | null): Promise<any> { | ||||||
|  |     let connection; | ||||||
|  |     try { | ||||||
|  |       connection = await DB.getConnection(); | ||||||
|  | 
 | ||||||
|  |       let query = `SELECT CAST(AVG(UNIX_TIMESTAMP(blockTimestamp)) as INT) as timestamp,
 | ||||||
|  |         CAST(AVG(JSON_EXTRACT(fee_span, '$[0]')) as INT) as avg_fee_0, | ||||||
|  |         CAST(AVG(JSON_EXTRACT(fee_span, '$[1]')) as INT) as avg_fee_10, | ||||||
|  |         CAST(AVG(JSON_EXTRACT(fee_span, '$[2]')) as INT) as avg_fee_25, | ||||||
|  |         CAST(AVG(JSON_EXTRACT(fee_span, '$[3]')) as INT) as avg_fee_50, | ||||||
|  |         CAST(AVG(JSON_EXTRACT(fee_span, '$[4]')) as INT) as avg_fee_75, | ||||||
|  |         CAST(AVG(JSON_EXTRACT(fee_span, '$[5]')) as INT) as avg_fee_90, | ||||||
|  |         CAST(AVG(JSON_EXTRACT(fee_span, '$[6]')) as INT) as avg_fee_100 | ||||||
|  |       FROM blocks`;
 | ||||||
|  | 
 | ||||||
|  |       if (interval !== null) { | ||||||
|  |         query += ` WHERE blockTimestamp BETWEEN DATE_SUB(NOW(), INTERVAL ${interval}) AND NOW()`; | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       query += ` GROUP BY UNIX_TIMESTAMP(blockTimestamp) DIV ${div}`; | ||||||
|  | 
 | ||||||
|  |       const [rows]: any = await connection.query(query); | ||||||
|  |       connection.release(); | ||||||
|  | 
 | ||||||
|  |       return rows; | ||||||
|  |     } catch (e) { | ||||||
|  |       connection.release(); | ||||||
|  |       logger.err('Cannot generate block fee rates history. Reason: ' + (e instanceof Error ? e.message : e)); | ||||||
|  |       throw e; | ||||||
|  |     } | ||||||
|  |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export default new BlocksRepository(); | export default new BlocksRepository(); | ||||||
|  | |||||||
| @ -670,6 +670,22 @@ class Routes { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   public async $getHistoricalBlockFeeRates(req: Request, res: Response) { | ||||||
|  |     try { | ||||||
|  |       const blockFees = await mining.$getHistoricalBlockFeeRates(req.params.interval ?? null); | ||||||
|  |       const oldestIndexedBlockTimestamp = await BlocksRepository.$oldestBlockTimestamp(); | ||||||
|  |       res.header('Pragma', 'public'); | ||||||
|  |       res.header('Cache-control', 'public'); | ||||||
|  |       res.setHeader('Expires', new Date(Date.now() + 1000 * 300).toUTCString()); | ||||||
|  |       res.json({ | ||||||
|  |         oldestIndexedBlockTimestamp: oldestIndexedBlockTimestamp, | ||||||
|  |         blockFees: blockFees, | ||||||
|  |       }); | ||||||
|  |     } catch (e) { | ||||||
|  |       res.status(500).send(e instanceof Error ? e.message : e); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   public async getBlock(req: Request, res: Response) { |   public async getBlock(req: Request, res: Response) { | ||||||
|     try { |     try { | ||||||
|       const result = await bitcoinApi.$getBlock(req.params.hash); |       const result = await bitcoinApi.$getBlock(req.params.hash); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user