| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  | import TxSprite from './tx-sprite'; | 
					
						
							|  |  |  | import { FastVertexArray } from './fast-vertex-array'; | 
					
						
							|  |  |  | import { SpriteUpdateParams, Square, Color, ViewUpdateParams } from './sprite-types'; | 
					
						
							| 
									
										
										
										
											2023-12-07 11:12:20 +00:00
										 |  |  | import { hexToColor } from './utils'; | 
					
						
							| 
									
										
										
										
											2022-11-23 19:07:17 +09:00
										 |  |  | import BlockScene from './block-scene'; | 
					
						
							| 
									
										
										
										
											2023-12-05 06:54:31 +00:00
										 |  |  | import { TransactionStripped } from '../../interfaces/node-api.interface'; | 
					
						
							| 
									
										
										
										
											2024-02-24 20:37:41 +00:00
										 |  |  | import { TransactionFlags } from '../../shared/filters.utils'; | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  | const hoverTransitionTime = 300; | 
					
						
							|  |  |  | const defaultHoverColor = hexToColor('1bd8f4'); | 
					
						
							| 
									
										
										
										
											2023-07-12 10:11:04 +09:00
										 |  |  | const defaultHighlightColor = hexToColor('800080'); | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // convert from this class's update format to TxSprite's update format
 | 
					
						
							| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  | function toSpriteUpdate(params: ViewUpdateParams): SpriteUpdateParams { | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  |   return { | 
					
						
							| 
									
										
										
										
											2022-05-31 18:00:40 +00:00
										 |  |  |     start: (params.start || performance.now()) + (params.delay || 0), | 
					
						
							|  |  |  |     duration: params.duration, | 
					
						
							|  |  |  |     minDuration: params.minDuration, | 
					
						
							|  |  |  |     ...params.display.position, | 
					
						
							|  |  |  |     ...params.display.color, | 
					
						
							|  |  |  |     adjust: params.adjust | 
					
						
							| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export default class TxView implements TransactionStripped { | 
					
						
							|  |  |  |   txid: string; | 
					
						
							|  |  |  |   fee: number; | 
					
						
							|  |  |  |   vsize: number; | 
					
						
							|  |  |  |   value: number; | 
					
						
							|  |  |  |   feerate: number; | 
					
						
							| 
									
										
										
										
											2023-07-18 15:05:44 +09:00
										 |  |  |   acc?: boolean; | 
					
						
							| 
									
										
										
										
											2023-03-14 15:39:55 +09:00
										 |  |  |   rate?: number; | 
					
						
							| 
									
										
										
										
											2024-03-22 07:13:21 +00:00
										 |  |  |   flags: number; | 
					
						
							| 
									
										
										
										
											2023-12-05 06:54:31 +00:00
										 |  |  |   bigintFlags?: bigint | null = 0b00000100_00000000_00000000_00000000n; | 
					
						
							| 
									
										
										
										
											2024-03-31 03:45:48 +00:00
										 |  |  |   time?: number; | 
					
						
							| 
									
										
										
										
											2024-08-17 00:14:33 +00:00
										 |  |  |   status?: 'found' | 'missing' | 'sigop' | 'fresh' | 'freshcpfp' | 'added' | 'added_prioritized' | 'prioritized' | 'added_deprioritized' | 'deprioritized' | 'censored' | 'selected' | 'rbf' | 'accelerated'; | 
					
						
							| 
									
										
										
										
											2022-11-23 19:07:17 +09:00
										 |  |  |   context?: 'projected' | 'actual'; | 
					
						
							| 
									
										
										
										
											2023-01-26 18:57:32 -06:00
										 |  |  |   scene?: BlockScene; | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   initialised: boolean; | 
					
						
							|  |  |  |   vertexArray: FastVertexArray; | 
					
						
							|  |  |  |   hover: boolean; | 
					
						
							| 
									
										
										
										
											2023-07-12 10:11:04 +09:00
										 |  |  |   highlight: boolean; | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  |   sprite: TxSprite; | 
					
						
							|  |  |  |   hoverColor: Color | void; | 
					
						
							| 
									
										
										
										
											2023-07-12 10:11:04 +09:00
										 |  |  |   highlightColor: Color | void; | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   screenPosition: Square; | 
					
						
							| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  |   gridPosition: Square | void; | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   dirty: boolean; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-26 18:57:32 -06:00
										 |  |  |   constructor(tx: TransactionStripped, scene: BlockScene) { | 
					
						
							|  |  |  |     this.scene = scene; | 
					
						
							| 
									
										
										
										
											2022-11-23 19:07:17 +09:00
										 |  |  |     this.context = tx.context; | 
					
						
							| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  |     this.txid = tx.txid; | 
					
						
							| 
									
										
										
										
											2024-03-31 03:45:48 +00:00
										 |  |  |     this.time = tx.time || 0; | 
					
						
							| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  |     this.fee = tx.fee; | 
					
						
							|  |  |  |     this.vsize = tx.vsize; | 
					
						
							|  |  |  |     this.value = tx.value; | 
					
						
							| 
									
										
										
										
											2023-03-14 15:39:55 +09:00
										 |  |  |     this.feerate = tx.rate || (tx.fee / tx.vsize); // sort by effective fee rate where available
 | 
					
						
							| 
									
										
										
										
											2023-05-26 21:10:32 -04:00
										 |  |  |     this.acc = tx.acc; | 
					
						
							| 
									
										
										
										
											2023-03-14 15:39:55 +09:00
										 |  |  |     this.rate = tx.rate; | 
					
						
							| 
									
										
										
										
											2022-07-07 19:11:42 +02:00
										 |  |  |     this.status = tx.status; | 
					
						
							| 
									
										
										
										
											2024-03-22 07:13:21 +00:00
										 |  |  |     this.flags = tx.flags || 0; | 
					
						
							| 
									
										
										
										
											2024-03-03 16:40:28 +00:00
										 |  |  |     this.bigintFlags = tx.flags ? (BigInt(tx.flags) | (this.acc ? TransactionFlags.acceleration : 0n)): 0n; | 
					
						
							| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  |     this.initialised = false; | 
					
						
							| 
									
										
										
										
											2023-01-26 18:57:32 -06:00
										 |  |  |     this.vertexArray = scene.vertexArray; | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  |     this.hover = false; | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  |     this.screenPosition = { x: 0, y: 0, s: 0 }; | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  |     this.dirty = true; | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  |   destroy(): void { | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  |     if (this.sprite) { | 
					
						
							| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  |       this.sprite.destroy(); | 
					
						
							|  |  |  |       this.sprite = null; | 
					
						
							|  |  |  |       this.initialised = false; | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  |   applyGridPosition(position: Square): void { | 
					
						
							|  |  |  |     if (!this.gridPosition) { | 
					
						
							|  |  |  |       this.gridPosition = { x: 0, y: 0, s: 0 }; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (this.gridPosition.x !== position.x || this.gridPosition.y !== position.y || this.gridPosition.s !== position.s) { | 
					
						
							|  |  |  |       this.gridPosition.x = position.x; | 
					
						
							|  |  |  |       this.gridPosition.y = position.y; | 
					
						
							|  |  |  |       this.gridPosition.s = position.s; | 
					
						
							|  |  |  |       this.dirty = true; | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* | 
					
						
							|  |  |  |     display: defines the final appearance of the sprite | 
					
						
							|  |  |  |         position: { x, y, s } (coordinates & size) | 
					
						
							|  |  |  |         color: { r, g, b, a} (color channels & alpha) | 
					
						
							|  |  |  |     duration: of the tweening animation from the previous display state | 
					
						
							|  |  |  |     start: performance.now() timestamp, when to start the transition | 
					
						
							|  |  |  |     delay: additional milliseconds to wait before starting | 
					
						
							|  |  |  |     jitter: if set, adds a random amount to the delay, | 
					
						
							|  |  |  |     adjust: if true, modify an in-progress transition instead of replacing it | 
					
						
							| 
									
										
										
										
											2022-06-14 23:08:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     returns minimum transition end time | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  |   */ | 
					
						
							| 
									
										
										
										
											2024-09-19 14:12:38 +00:00
										 |  |  |   update(params: ViewUpdateParams, { minX, maxX, maxY }: { minX: number, maxX: number, maxY: number }): number { | 
					
						
							| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  |     if (params.jitter) { | 
					
						
							|  |  |  |       params.delay += (Math.random() * params.jitter); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (!this.initialised || !this.sprite) { | 
					
						
							| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  |       this.initialised = true; | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  |       this.sprite = new TxSprite( | 
					
						
							| 
									
										
										
										
											2022-05-31 18:00:40 +00:00
										 |  |  |         toSpriteUpdate(params), | 
					
						
							| 
									
										
										
										
											2024-09-19 13:51:20 +00:00
										 |  |  |         this.vertexArray, | 
					
						
							|  |  |  |         minX, | 
					
						
							| 
									
										
										
										
											2024-09-19 14:12:38 +00:00
										 |  |  |         maxX, | 
					
						
							| 
									
										
										
										
											2024-09-19 13:51:20 +00:00
										 |  |  |         maxY | 
					
						
							| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  |       ); | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  |       // apply any pending hover event
 | 
					
						
							|  |  |  |       if (this.hover) { | 
					
						
							| 
									
										
										
										
											2022-06-14 23:08:18 +00:00
										 |  |  |         params.duration = Math.max(params.duration, hoverTransitionTime); | 
					
						
							| 
									
										
										
										
											2024-09-19 13:51:20 +00:00
										 |  |  |         this.sprite.update( | 
					
						
							|  |  |  |           { | 
					
						
							|  |  |  |             ...this.hoverColor, | 
					
						
							|  |  |  |             duration: hoverTransitionTime, | 
					
						
							|  |  |  |             adjust: false, | 
					
						
							|  |  |  |             temp: true | 
					
						
							|  |  |  |           }, | 
					
						
							|  |  |  |           minX, | 
					
						
							| 
									
										
										
										
											2024-09-19 14:12:38 +00:00
										 |  |  |           maxX, | 
					
						
							| 
									
										
										
										
											2024-09-19 13:51:20 +00:00
										 |  |  |           maxY | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  |       } | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       this.sprite.update( | 
					
						
							| 
									
										
										
										
											2024-09-19 13:51:20 +00:00
										 |  |  |         toSpriteUpdate(params), | 
					
						
							|  |  |  |         minX, | 
					
						
							| 
									
										
										
										
											2024-09-19 14:12:38 +00:00
										 |  |  |         maxX, | 
					
						
							| 
									
										
										
										
											2024-09-19 13:51:20 +00:00
										 |  |  |         maxY | 
					
						
							| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  |       ); | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  |     this.dirty = false; | 
					
						
							| 
									
										
										
										
											2022-06-14 23:08:18 +00:00
										 |  |  |     return (params.start || performance.now()) + (params.delay || 0) + (params.duration || 0); | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Temporarily override the tx color
 | 
					
						
							| 
									
										
										
										
											2022-06-14 23:08:18 +00:00
										 |  |  |   // returns minimum transition end time
 | 
					
						
							|  |  |  |   setHover(hoverOn: boolean, color: Color | void = defaultHoverColor): number { | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  |     if (hoverOn) { | 
					
						
							| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  |       this.hover = true; | 
					
						
							|  |  |  |       this.hoverColor = color; | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       this.sprite.update({ | 
					
						
							|  |  |  |         ...this.hoverColor, | 
					
						
							|  |  |  |         duration: hoverTransitionTime, | 
					
						
							|  |  |  |         adjust: false, | 
					
						
							|  |  |  |         temp: true | 
					
						
							| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  |       this.hover = false; | 
					
						
							|  |  |  |       this.hoverColor = null; | 
					
						
							| 
									
										
										
										
											2023-07-12 10:11:04 +09:00
										 |  |  |       if (this.highlight) { | 
					
						
							|  |  |  |         this.setHighlight(true, this.highlightColor); | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         if (this.sprite) { | 
					
						
							|  |  |  |           this.sprite.resume(hoverTransitionTime); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     this.dirty = false; | 
					
						
							|  |  |  |     return performance.now() + hoverTransitionTime; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Temporarily override the tx color
 | 
					
						
							|  |  |  |   // returns minimum transition end time
 | 
					
						
							|  |  |  |   setHighlight(highlightOn: boolean, color: Color | void = defaultHighlightColor): number { | 
					
						
							|  |  |  |     if (highlightOn) { | 
					
						
							|  |  |  |       this.highlight = true; | 
					
						
							|  |  |  |       this.highlightColor = color; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       this.sprite.update({ | 
					
						
							|  |  |  |         ...this.highlightColor, | 
					
						
							|  |  |  |         duration: hoverTransitionTime, | 
					
						
							|  |  |  |         adjust: false, | 
					
						
							|  |  |  |         temp: true | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       this.highlight = false; | 
					
						
							|  |  |  |       this.highlightColor = null; | 
					
						
							|  |  |  |       if (this.hover) { | 
					
						
							|  |  |  |         this.setHover(true, this.hoverColor); | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         if (this.sprite) { | 
					
						
							|  |  |  |           this.sprite.resume(hoverTransitionTime); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-06-02 01:29:03 +04:00
										 |  |  |     this.dirty = false; | 
					
						
							| 
									
										
										
										
											2022-06-14 23:08:18 +00:00
										 |  |  |     return performance.now() + hoverTransitionTime; | 
					
						
							| 
									
										
										
										
											2022-05-30 21:53:39 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2022-10-27 18:39:26 -06:00
										 |  |  | } |