@my-packages-changeit/abstract-extractor 3.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/CHANGELOG.md +225 -0
  2. package/README.md +24 -0
  3. package/dist/abstractExtractor.d.ts +59 -0
  4. package/dist/abstractExtractor.d.ts.map +1 -0
  5. package/dist/abstractExtractor.js +22 -0
  6. package/dist/constants.d.ts +4 -0
  7. package/dist/constants.d.ts.map +1 -0
  8. package/dist/constants.js +4 -0
  9. package/dist/ergo/database/actions/abstractErgoAction.d.ts +91 -0
  10. package/dist/ergo/database/actions/abstractErgoAction.d.ts.map +1 -0
  11. package/dist/ergo/database/actions/abstractErgoAction.js +180 -0
  12. package/dist/ergo/database/actions/abstractErgoBoxAction.d.ts +31 -0
  13. package/dist/ergo/database/actions/abstractErgoBoxAction.d.ts.map +1 -0
  14. package/dist/ergo/database/actions/abstractErgoBoxAction.js +70 -0
  15. package/dist/ergo/database/entities/abstractErgoBoxEntity.d.ts +18 -0
  16. package/dist/ergo/database/entities/abstractErgoBoxEntity.d.ts.map +1 -0
  17. package/dist/ergo/database/entities/abstractErgoBoxEntity.js +36 -0
  18. package/dist/ergo/database/entities/abstractErgoEntity.d.ts +26 -0
  19. package/dist/ergo/database/entities/abstractErgoEntity.d.ts.map +1 -0
  20. package/dist/ergo/database/entities/abstractErgoEntity.js +64 -0
  21. package/dist/ergo/database/index.d.ts +5 -0
  22. package/dist/ergo/database/index.d.ts.map +1 -0
  23. package/dist/ergo/database/index.js +5 -0
  24. package/dist/ergo/extractors/abstractErgoBoxExtractor.d.ts +67 -0
  25. package/dist/ergo/extractors/abstractErgoBoxExtractor.d.ts.map +1 -0
  26. package/dist/ergo/extractors/abstractErgoBoxExtractor.js +106 -0
  27. package/dist/ergo/extractors/abstractErgoExtractor.d.ts +61 -0
  28. package/dist/ergo/extractors/abstractErgoExtractor.d.ts.map +1 -0
  29. package/dist/ergo/extractors/abstractErgoExtractor.js +99 -0
  30. package/dist/ergo/extractors/abstractErgoTxExtractor.d.ts +54 -0
  31. package/dist/ergo/extractors/abstractErgoTxExtractor.d.ts.map +1 -0
  32. package/dist/ergo/extractors/abstractErgoTxExtractor.js +76 -0
  33. package/dist/ergo/extractors/index.d.ts +4 -0
  34. package/dist/ergo/extractors/index.d.ts.map +1 -0
  35. package/dist/ergo/extractors/index.js +4 -0
  36. package/dist/ergo/index.d.ts +8 -0
  37. package/dist/ergo/index.d.ts.map +1 -0
  38. package/dist/ergo/index.js +8 -0
  39. package/dist/ergo/initializers/constants.d.ts +4 -0
  40. package/dist/ergo/initializers/constants.d.ts.map +1 -0
  41. package/dist/ergo/initializers/constants.js +4 -0
  42. package/dist/ergo/initializers/ergoBoxInitializer.d.ts +36 -0
  43. package/dist/ergo/initializers/ergoBoxInitializer.d.ts.map +1 -0
  44. package/dist/ergo/initializers/ergoBoxInitializer.js +84 -0
  45. package/dist/ergo/initializers/ergoInitializer.d.ts +39 -0
  46. package/dist/ergo/initializers/ergoInitializer.d.ts.map +1 -0
  47. package/dist/ergo/initializers/ergoInitializer.js +80 -0
  48. package/dist/ergo/initializers/index.d.ts +4 -0
  49. package/dist/ergo/initializers/index.d.ts.map +1 -0
  50. package/dist/ergo/initializers/index.js +4 -0
  51. package/dist/ergo/initializers/strategies/explorerInitializationStrategy.d.ts +59 -0
  52. package/dist/ergo/initializers/strategies/explorerInitializationStrategy.d.ts.map +1 -0
  53. package/dist/ergo/initializers/strategies/explorerInitializationStrategy.js +161 -0
  54. package/dist/ergo/initializers/strategies/index.d.ts +4 -0
  55. package/dist/ergo/initializers/strategies/index.d.ts.map +1 -0
  56. package/dist/ergo/initializers/strategies/index.js +4 -0
  57. package/dist/ergo/initializers/strategies/nodeInitializationStrategy.d.ts +30 -0
  58. package/dist/ergo/initializers/strategies/nodeInitializationStrategy.d.ts.map +1 -0
  59. package/dist/ergo/initializers/strategies/nodeInitializationStrategy.js +78 -0
  60. package/dist/ergo/initializers/strategies/workerManager.d.ts +79 -0
  61. package/dist/ergo/initializers/strategies/workerManager.d.ts.map +1 -0
  62. package/dist/ergo/initializers/strategies/workerManager.js +182 -0
  63. package/dist/ergo/interfaces.d.ts +63 -0
  64. package/dist/ergo/interfaces.d.ts.map +1 -0
  65. package/dist/ergo/interfaces.js +8 -0
  66. package/dist/ergo/networks/explorerNetwork.d.ts +52 -0
  67. package/dist/ergo/networks/explorerNetwork.d.ts.map +1 -0
  68. package/dist/ergo/networks/explorerNetwork.js +132 -0
  69. package/dist/ergo/networks/index.d.ts +3 -0
  70. package/dist/ergo/networks/index.d.ts.map +1 -0
  71. package/dist/ergo/networks/index.js +3 -0
  72. package/dist/ergo/networks/nodeNetwork.d.ts +34 -0
  73. package/dist/ergo/networks/nodeNetwork.d.ts.map +1 -0
  74. package/dist/ergo/networks/nodeNetwork.js +77 -0
  75. package/dist/ergo/utils.d.ts +23 -0
  76. package/dist/ergo/utils.d.ts.map +1 -0
  77. package/dist/ergo/utils.js +49 -0
  78. package/dist/index.d.ts +4 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +4 -0
  81. package/dist/tsconfig.tsbuildinfo +1 -0
  82. package/package.json +49 -0
@@ -0,0 +1,106 @@
1
+ import JsonBigInt from '@rosen-bridge/json-bigint';
2
+ import { ErgoBoxInitializer } from '../initializers';
3
+ import { CallbackType, } from '../interfaces';
4
+ import { AbstractErgoExtractor } from './abstractErgoExtractor';
5
+ /**
6
+ * Abstract Ergo Box Extractor class for box-based data extraction.
7
+ *
8
+ * This class extends the AbstractErgoExtractor class and provides
9
+ * functionality for extracting box-based data from the blockchain.
10
+ *
11
+ * It overrides the `initializeData` method to use the box-based initializer.
12
+ * It implements the `processTransactions` method to use the box-based data extraction.
13
+ *
14
+ * Triggers `Insert` callback on new data insertion.
15
+ * Triggers a new callback type `Spend` for each spent box.
16
+ *
17
+ * @template ExtractedData - The type of data extracted from blockchain
18
+ * @template ExtractorEntity - The database entity type for storing extracted data
19
+ */
20
+ export class AbstractErgoBoxExtractor extends AbstractErgoExtractor {
21
+ constructor(initializeOptions, logger) {
22
+ super(initializeOptions, logger);
23
+ }
24
+ /**
25
+ * extract transaction extra information
26
+ * override this function if there is extra needed information
27
+ * @param tx
28
+ * @returns
29
+ */
30
+ getTransactionExtraData = (tx) => {
31
+ return {};
32
+ };
33
+ /**
34
+ * create spend info array for the transaction
35
+ * @param tx
36
+ * @returns spend info array of the transaction
37
+ */
38
+ getTransactionSpendInfo = (tx) => {
39
+ let boxIndex = 1;
40
+ const spendInfoArray = [];
41
+ for (const input of tx.inputs) {
42
+ spendInfoArray.push({ txId: tx.id, boxId: input.boxId, index: boxIndex });
43
+ boxIndex += 1;
44
+ }
45
+ return spendInfoArray;
46
+ };
47
+ /**
48
+ * process a list of transactions in a block and store required information
49
+ * @param txs list of transactions in the block
50
+ * @param block
51
+ * @return true if the process is completed successfully and false otherwise
52
+ */
53
+ processTransactions = async (txs, block) => {
54
+ try {
55
+ const boxes = [];
56
+ const spentInfos = [];
57
+ for (const tx of txs) {
58
+ const inputExtensions = tx.inputs.map((input) => input.extension || {});
59
+ for (const output of tx.outputs) {
60
+ if (!this.hasBoxData(output)) {
61
+ continue;
62
+ }
63
+ this.logger.debug(`Trying to extract data from box ${output.boxId}`);
64
+ const extractedData = this.extractBoxData(output, inputExtensions, this.getTransactionExtraData(tx));
65
+ if (extractedData) {
66
+ this.logger.debug(`Extracted data ${JsonBigInt.stringify(extractedData)} from box ${output.boxId}`);
67
+ boxes.push(extractedData);
68
+ }
69
+ }
70
+ spentInfos.push(...this.getTransactionSpendInfo(tx));
71
+ }
72
+ if (boxes.length > 0) {
73
+ if (!(await this.actions.storeEntities(boxes, block, this.getId()))) {
74
+ this.logger.warn(`Data insertion failed for ${this.getId()} at the block ${block.height}`);
75
+ return false;
76
+ }
77
+ this.triggerCallbacks(CallbackType.Insert, boxes);
78
+ }
79
+ const spentData = await this.actions.updateSpendingInfo(spentInfos, block, this.getId());
80
+ if (spentData.length > 0) {
81
+ this.triggerCallbacks(CallbackType.Spend, spentData);
82
+ }
83
+ }
84
+ catch (e) {
85
+ this.logger.error(`Processing transactions failed for ${this.getId()} at the block ${block.height} with error: ${e}`);
86
+ if (e instanceof Error && e.stack) {
87
+ this.logger.error(`error stack: ${e.stack}`);
88
+ }
89
+ return false;
90
+ }
91
+ return true;
92
+ };
93
+ /**
94
+ * initialize extractor database with data created below the initial height
95
+ * @param initialBlock
96
+ */
97
+ initializeData = async (initialBlock) => {
98
+ if (this.initializeOptions && this.initializeOptions.active) {
99
+ const initializer = new ErgoBoxInitializer(this.initializeOptions.type, this.initializeOptions.url, this.initializeOptions.address, this.getId(), this.hasBoxData, this.processTransactions, this.actions, this.initializeOptions.maxParallelRequests, this.logger.child('ErgoBoxInitializer'));
100
+ await initializer.initializeData(initialBlock);
101
+ }
102
+ else
103
+ this.logger.info(`Initializiation for [${this.getId()}] is turned off`);
104
+ };
105
+ }
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RFcmdvQm94RXh0cmFjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2VyZ28vZXh0cmFjdG9ycy9hYnN0cmFjdEVyZ29Cb3hFeHRyYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxVQUFVLE1BQU0sMkJBQTJCLENBQUM7QUFTbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUdMLFlBQVksR0FHYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVoRTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sT0FBZ0Isd0JBR3BCLFNBQVEscUJBQXFEO0lBTTdELFlBQVksaUJBQXFDLEVBQUUsTUFBdUI7UUFDeEUsS0FBSyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFxQkQ7Ozs7O09BS0c7SUFDSCx1QkFBdUIsR0FBRyxDQUN4QixFQUFlLEVBQ04sRUFBRTtRQUNYLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQyxDQUFDO0lBRUY7Ozs7T0FJRztJQUNILHVCQUF1QixHQUFHLENBQUMsRUFBZSxFQUFFLEVBQUU7UUFDNUMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUMxQixLQUFLLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM5QixjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDMUUsUUFBUSxJQUFJLENBQUMsQ0FBQztRQUNoQixDQUFDO1FBQ0QsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQyxDQUFDO0lBRUY7Ozs7O09BS0c7SUFDSCxtQkFBbUIsR0FBRyxLQUFLLEVBQ3pCLEdBQWtCLEVBQ2xCLEtBQWdCLEVBQ0UsRUFBRTtRQUNwQixJQUFJLENBQUM7WUFDSCxNQUFNLEtBQUssR0FBeUIsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sVUFBVSxHQUFxQixFQUFFLENBQUM7WUFDeEMsS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3hFLEtBQUssTUFBTSxNQUFNLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO3dCQUM3QixTQUFTO29CQUNYLENBQUM7b0JBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUNBQW1DLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO29CQUNyRSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUN2QyxNQUFNLEVBQ04sZUFBZSxFQUNmLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsQ0FDakMsQ0FBQztvQkFDRixJQUFJLGFBQWEsRUFBRSxDQUFDO3dCQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZixrQkFBa0IsVUFBVSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsYUFDbkQsTUFBTSxDQUFDLEtBQ1QsRUFBRSxDQUNILENBQUM7d0JBQ0YsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDNUIsQ0FBQztnQkFDSCxDQUFDO2dCQUNELFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2RCxDQUFDO1lBRUQsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNwRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDZCw2QkFBNkIsSUFBSSxDQUFDLEtBQUssRUFBRSxpQkFDdkMsS0FBSyxDQUFDLE1BQ1IsRUFBRSxDQUNILENBQUM7b0JBQ0YsT0FBTyxLQUFLLENBQUM7Z0JBQ2YsQ0FBQztnQkFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwRCxDQUFDO1lBQ0QsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUNyRCxVQUFVLEVBQ1YsS0FBSyxFQUNMLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FDYixDQUFDO1lBQ0YsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN2RCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZixzQ0FBc0MsSUFBSSxDQUFDLEtBQUssRUFBRSxpQkFDaEQsS0FBSyxDQUFDLE1BQ1IsZ0JBQWdCLENBQUMsRUFBRSxDQUNwQixDQUFDO1lBQ0YsSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQztJQUVGOzs7T0FHRztJQUNILGNBQWMsR0FBRyxLQUFLLEVBQUUsWUFBdUIsRUFBaUIsRUFBRTtRQUNoRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDNUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxrQkFBa0IsQ0FDeEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFDM0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFDMUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFDOUIsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUNaLElBQUksQ0FBQyxVQUFVLEVBQ2YsSUFBSSxDQUFDLG1CQUFtQixFQUN4QixJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsRUFDMUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FDeEMsQ0FBQztZQUNGLE1BQU0sV0FBVyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNqRCxDQUFDOztZQUNDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixJQUFJLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDNUUsQ0FBQyxDQUFDO0NBQ0giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBYnN0cmFjdExvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcbmltcG9ydCBKc29uQmlnSW50IGZyb20gJ0Byb3Nlbi1icmlkZ2UvanNvbi1iaWdpbnQnO1xuaW1wb3J0IHtcbiAgVHJhbnNhY3Rpb24sXG4gIEJsb2NrSW5mbyxcbiAgT3V0cHV0Qm94LFxuICBJbnB1dEV4dGVuc2lvbixcbn0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyLWludGVyZmFjZXMnO1xuXG5pbXBvcnQgeyBBYnN0cmFjdEVyZ29Cb3hFbnRpdHksIEFic3RyYWN0RXJnb0JveEFjdGlvbiB9IGZyb20gJy4uL2RhdGFiYXNlJztcbmltcG9ydCB7IEVyZ29Cb3hJbml0aWFsaXplciB9IGZyb20gJy4uL2luaXRpYWxpemVycyc7XG5pbXBvcnQge1xuICBBYnN0cmFjdEVudGl0eURhdGEsXG4gIFNwZW5kSW5mbyxcbiAgQ2FsbGJhY2tUeXBlLFxuICBUeEV4dHJhLFxuICBJbml0aWFsaXplT3B0aW9ucyxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBYnN0cmFjdEVyZ29FeHRyYWN0b3IgfSBmcm9tICcuL2Fic3RyYWN0RXJnb0V4dHJhY3Rvcic7XG5cbi8qKlxuICogQWJzdHJhY3QgRXJnbyBCb3ggRXh0cmFjdG9yIGNsYXNzIGZvciBib3gtYmFzZWQgZGF0YSBleHRyYWN0aW9uLlxuICpcbiAqIFRoaXMgY2xhc3MgZXh0ZW5kcyB0aGUgQWJzdHJhY3RFcmdvRXh0cmFjdG9yIGNsYXNzIGFuZCBwcm92aWRlc1xuICogZnVuY3Rpb25hbGl0eSBmb3IgZXh0cmFjdGluZyBib3gtYmFzZWQgZGF0YSBmcm9tIHRoZSBibG9ja2NoYWluLlxuICpcbiAqIEl0IG92ZXJyaWRlcyB0aGUgYGluaXRpYWxpemVEYXRhYCBtZXRob2QgdG8gdXNlIHRoZSBib3gtYmFzZWQgaW5pdGlhbGl6ZXIuXG4gKiBJdCBpbXBsZW1lbnRzIHRoZSBgcHJvY2Vzc1RyYW5zYWN0aW9uc2AgbWV0aG9kIHRvIHVzZSB0aGUgYm94LWJhc2VkIGRhdGEgZXh0cmFjdGlvbi5cbiAqXG4gKiBUcmlnZ2VycyBgSW5zZXJ0YCBjYWxsYmFjayBvbiBuZXcgZGF0YSBpbnNlcnRpb24uXG4gKiBUcmlnZ2VycyBhIG5ldyBjYWxsYmFjayB0eXBlIGBTcGVuZGAgZm9yIGVhY2ggc3BlbnQgYm94LlxuICpcbiAqIEB0ZW1wbGF0ZSBFeHRyYWN0ZWREYXRhIC0gVGhlIHR5cGUgb2YgZGF0YSBleHRyYWN0ZWQgZnJvbSBibG9ja2NoYWluXG4gKiBAdGVtcGxhdGUgRXh0cmFjdG9yRW50aXR5IC0gVGhlIGRhdGFiYXNlIGVudGl0eSB0eXBlIGZvciBzdG9yaW5nIGV4dHJhY3RlZCBkYXRhXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVyZ29Cb3hFeHRyYWN0b3I8XG4gIEV4dHJhY3RlZERhdGEgZXh0ZW5kcyBBYnN0cmFjdEVudGl0eURhdGEsXG4gIEV4dHJhY3RvckVudGl0eSBleHRlbmRzIEFic3RyYWN0RXJnb0JveEVudGl0eSxcbj4gZXh0ZW5kcyBBYnN0cmFjdEVyZ29FeHRyYWN0b3I8RXh0cmFjdGVkRGF0YSwgRXh0cmFjdG9yRW50aXR5PiB7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBhY3Rpb25zOiBBYnN0cmFjdEVyZ29Cb3hBY3Rpb248XG4gICAgRXh0cmFjdGVkRGF0YSxcbiAgICBFeHRyYWN0b3JFbnRpdHlcbiAgPjtcblxuICBjb25zdHJ1Y3Rvcihpbml0aWFsaXplT3B0aW9ucz86IEluaXRpYWxpemVPcHRpb25zLCBsb2dnZXI/OiBBYnN0cmFjdExvZ2dlcikge1xuICAgIHN1cGVyKGluaXRpYWxpemVPcHRpb25zLCBsb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIGV4dHJhY3QgYm94IGRhdGEgdG8gcHJvcGVyIGZvcm1hdCAobm90IGluY2x1ZGluZyBzcGVuZGluZyBpbmZvcm1hdGlvbilcbiAgICogQHBhcmFtIGJveFxuICAgKiBAcGFyYW0gaW5wdXRFeHRlbnNpb25zIGFsbCBpbnB1dCBib3ggZXh0ZW5zaW9ucyBpbiB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIGV4dHJhY3RlZCBkYXRhIGluIHByb3BlciBmb3JtYXRcbiAgICovXG4gIGFic3RyYWN0IGV4dHJhY3RCb3hEYXRhOiAoXG4gICAgYm94OiBPdXRwdXRCb3gsXG4gICAgaW5wdXRFeHRlbnNpb25zOiBJbnB1dEV4dGVuc2lvbltdLFxuICAgIHR4RXh0cmE/OiBUeEV4dHJhLFxuICApID0+IEV4dHJhY3RlZERhdGEgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIGNoZWNrIHByb3BlciBkYXRhIGZvcm1hdCBpbiB0aGUgYm94XG4gICAqIEBwYXJhbSBib3hcbiAgICogQHJldHVybiB0cnVlIGlmIHRoZSBib3ggaGFzIHRoZSByZXF1aXJlZCBkYXRhIGFuZCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIGFic3RyYWN0IGhhc0JveERhdGE6IChib3g6IE91dHB1dEJveCkgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogZXh0cmFjdCB0cmFuc2FjdGlvbiBleHRyYSBpbmZvcm1hdGlvblxuICAgKiBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGlmIHRoZXJlIGlzIGV4dHJhIG5lZWRlZCBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0gdHhcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldFRyYW5zYWN0aW9uRXh0cmFEYXRhID0gKFxuICAgIHR4OiBUcmFuc2FjdGlvbiwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgKTogVHhFeHRyYSA9PiB7XG4gICAgcmV0dXJuIHt9O1xuICB9O1xuXG4gIC8qKlxuICAgKiBjcmVhdGUgc3BlbmQgaW5mbyBhcnJheSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB0eFxuICAgKiBAcmV0dXJucyBzcGVuZCBpbmZvIGFycmF5IG9mIHRoZSB0cmFuc2FjdGlvblxuICAgKi9cbiAgZ2V0VHJhbnNhY3Rpb25TcGVuZEluZm8gPSAodHg6IFRyYW5zYWN0aW9uKSA9PiB7XG4gICAgbGV0IGJveEluZGV4ID0gMTtcbiAgICBjb25zdCBzcGVuZEluZm9BcnJheSA9IFtdO1xuICAgIGZvciAoY29uc3QgaW5wdXQgb2YgdHguaW5wdXRzKSB7XG4gICAgICBzcGVuZEluZm9BcnJheS5wdXNoKHsgdHhJZDogdHguaWQsIGJveElkOiBpbnB1dC5ib3hJZCwgaW5kZXg6IGJveEluZGV4IH0pO1xuICAgICAgYm94SW5kZXggKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIHNwZW5kSW5mb0FycmF5O1xuICB9O1xuXG4gIC8qKlxuICAgKiBwcm9jZXNzIGEgbGlzdCBvZiB0cmFuc2FjdGlvbnMgaW4gYSBibG9jayBhbmQgc3RvcmUgcmVxdWlyZWQgaW5mb3JtYXRpb25cbiAgICogQHBhcmFtIHR4cyBsaXN0IG9mIHRyYW5zYWN0aW9ucyBpbiB0aGUgYmxvY2tcbiAgICogQHBhcmFtIGJsb2NrXG4gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvY2VzcyBpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGFuZCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHByb2Nlc3NUcmFuc2FjdGlvbnMgPSBhc3luYyAoXG4gICAgdHhzOiBUcmFuc2FjdGlvbltdLFxuICAgIGJsb2NrOiBCbG9ja0luZm8sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBib3hlczogQXJyYXk8RXh0cmFjdGVkRGF0YT4gPSBbXTtcbiAgICAgIGNvbnN0IHNwZW50SW5mb3M6IEFycmF5PFNwZW5kSW5mbz4gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdHggb2YgdHhzKSB7XG4gICAgICAgIGNvbnN0IGlucHV0RXh0ZW5zaW9ucyA9IHR4LmlucHV0cy5tYXAoKGlucHV0KSA9PiBpbnB1dC5leHRlbnNpb24gfHwge30pO1xuICAgICAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiB0eC5vdXRwdXRzKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmhhc0JveERhdGEob3V0cHV0KSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBUcnlpbmcgdG8gZXh0cmFjdCBkYXRhIGZyb20gYm94ICR7b3V0cHV0LmJveElkfWApO1xuICAgICAgICAgIGNvbnN0IGV4dHJhY3RlZERhdGEgPSB0aGlzLmV4dHJhY3RCb3hEYXRhKFxuICAgICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgICAgaW5wdXRFeHRlbnNpb25zLFxuICAgICAgICAgICAgdGhpcy5nZXRUcmFuc2FjdGlvbkV4dHJhRGF0YSh0eCksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXh0cmFjdGVkRGF0YSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgIGBFeHRyYWN0ZWQgZGF0YSAke0pzb25CaWdJbnQuc3RyaW5naWZ5KGV4dHJhY3RlZERhdGEpfSBmcm9tIGJveCAke1xuICAgICAgICAgICAgICAgIG91dHB1dC5ib3hJZFxuICAgICAgICAgICAgICB9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBib3hlcy5wdXNoKGV4dHJhY3RlZERhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzcGVudEluZm9zLnB1c2goLi4udGhpcy5nZXRUcmFuc2FjdGlvblNwZW5kSW5mbyh0eCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYm94ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmFjdGlvbnMuc3RvcmVFbnRpdGllcyhib3hlcywgYmxvY2ssIHRoaXMuZ2V0SWQoKSkpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBEYXRhIGluc2VydGlvbiBmYWlsZWQgZm9yICR7dGhpcy5nZXRJZCgpfSBhdCB0aGUgYmxvY2sgJHtcbiAgICAgICAgICAgICAgYmxvY2suaGVpZ2h0XG4gICAgICAgICAgICB9YCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRyaWdnZXJDYWxsYmFja3MoQ2FsbGJhY2tUeXBlLkluc2VydCwgYm94ZXMpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3BlbnREYXRhID0gYXdhaXQgdGhpcy5hY3Rpb25zLnVwZGF0ZVNwZW5kaW5nSW5mbyhcbiAgICAgICAgc3BlbnRJbmZvcyxcbiAgICAgICAgYmxvY2ssXG4gICAgICAgIHRoaXMuZ2V0SWQoKSxcbiAgICAgICk7XG4gICAgICBpZiAoc3BlbnREYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyQ2FsbGJhY2tzKENhbGxiYWNrVHlwZS5TcGVuZCwgc3BlbnREYXRhKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYFByb2Nlc3NpbmcgdHJhbnNhY3Rpb25zIGZhaWxlZCBmb3IgJHt0aGlzLmdldElkKCl9IGF0IHRoZSBibG9jayAke1xuICAgICAgICAgIGJsb2NrLmhlaWdodFxuICAgICAgICB9IHdpdGggZXJyb3I6ICR7ZX1gLFxuICAgICAgKTtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5zdGFjaykge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgZXJyb3Igc3RhY2s6ICR7ZS5zdGFja31gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIGluaXRpYWxpemUgZXh0cmFjdG9yIGRhdGFiYXNlIHdpdGggZGF0YSBjcmVhdGVkIGJlbG93IHRoZSBpbml0aWFsIGhlaWdodFxuICAgKiBAcGFyYW0gaW5pdGlhbEJsb2NrXG4gICAqL1xuICBpbml0aWFsaXplRGF0YSA9IGFzeW5jIChpbml0aWFsQmxvY2s6IEJsb2NrSW5mbyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVPcHRpb25zICYmIHRoaXMuaW5pdGlhbGl6ZU9wdGlvbnMuYWN0aXZlKSB7XG4gICAgICBjb25zdCBpbml0aWFsaXplciA9IG5ldyBFcmdvQm94SW5pdGlhbGl6ZXIoXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZU9wdGlvbnMudHlwZSxcbiAgICAgICAgdGhpcy5pbml0aWFsaXplT3B0aW9ucy51cmwsXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZU9wdGlvbnMuYWRkcmVzcyxcbiAgICAgICAgdGhpcy5nZXRJZCgpLFxuICAgICAgICB0aGlzLmhhc0JveERhdGEsXG4gICAgICAgIHRoaXMucHJvY2Vzc1RyYW5zYWN0aW9ucyxcbiAgICAgICAgdGhpcy5hY3Rpb25zLFxuICAgICAgICB0aGlzLmluaXRpYWxpemVPcHRpb25zLm1heFBhcmFsbGVsUmVxdWVzdHMsXG4gICAgICAgIHRoaXMubG9nZ2VyLmNoaWxkKCdFcmdvQm94SW5pdGlhbGl6ZXInKSxcbiAgICAgICk7XG4gICAgICBhd2FpdCBpbml0aWFsaXplci5pbml0aWFsaXplRGF0YShpbml0aWFsQmxvY2spO1xuICAgIH0gZWxzZVxuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgSW5pdGlhbGl6aWF0aW9uIGZvciBbJHt0aGlzLmdldElkKCl9XSBpcyB0dXJuZWQgb2ZmYCk7XG4gIH07XG59XG4iXX0=
@@ -0,0 +1,61 @@
1
+ import { AbstractLogger } from '@rosen-bridge/abstract-logger';
2
+ import { SelectQueryBuilder } from '@rosen-bridge/extended-typeorm';
3
+ import { Transaction } from '@rosen-bridge/scanner-interfaces';
4
+ import { AbstractExtractor } from '../../abstractExtractor';
5
+ import { AbstractErgoEntity, AbstractErgoAction } from '../database';
6
+ import { AbstractEntityData, CallbackType, CallbackMap, CallbackDataMap, InitializeOptions } from '../interfaces';
7
+ /**
8
+ * Abstract Ergo-specific extractor that provides common functionality for all Ergo extractors.
9
+ *
10
+ * It provides callback support and blockchain fork handle for all ergo extractors.
11
+ *
12
+ * It triggers callbacks for the `Update` and `Delete` actions on a forked block.
13
+ *
14
+ * @template ExtractedData - The type of data extracted from blockchain
15
+ * @template ExtractorEntity - The database entity type for storing extracted data
16
+ */
17
+ export declare abstract class AbstractErgoExtractor<ExtractedData extends AbstractEntityData, ExtractorEntity extends AbstractErgoEntity> extends AbstractExtractor<Transaction, ExtractorEntity> {
18
+ protected initializeOptions?: InitializeOptions | undefined;
19
+ protected logger: AbstractLogger;
20
+ protected abstract actions: AbstractErgoAction<ExtractedData, ExtractorEntity>;
21
+ protected callbacks: {
22
+ [K in CallbackType]: Map<string, CallbackMap<ExtractedData>[K]>;
23
+ };
24
+ private callbackMutex;
25
+ constructor(initializeOptions?: InitializeOptions | undefined, logger?: AbstractLogger);
26
+ /**
27
+ * hook a new callback on a callback type
28
+ * @param type
29
+ * @param id
30
+ * @param callback
31
+ * @returns callback registered id
32
+ */
33
+ hook: <T extends CallbackType>(type: T, callback: CallbackMap<ExtractedData>[T]) => Promise<string>;
34
+ /**
35
+ * unhook a callback on a type
36
+ * returns false if there is no registered callback with the id
37
+ * @param type
38
+ * @param id
39
+ * @returns success status
40
+ */
41
+ unhook: (type: CallbackType, id: string) => Promise<boolean>;
42
+ /**
43
+ * trigger all callbacks registered on a specific type with the provided data
44
+ * @param type
45
+ * @param data
46
+ */
47
+ protected triggerCallbacks<T extends CallbackType>(type: T, data: CallbackDataMap<ExtractedData>[T]): void;
48
+ /**
49
+ * fork one block and remove all stored information for this block
50
+ * @param hash block hash
51
+ */
52
+ forkBlock: (hash: string) => Promise<void>;
53
+ /**
54
+ * Builds a query that returns used blocks by selecting the `block` column from the `ExtractorEntity` repository,
55
+ * filtered by the provided `extractorId`
56
+ *
57
+ * @returns A query builder selecting used blocks
58
+ */
59
+ createUsedBlocksQuery: () => SelectQueryBuilder<ExtractorEntity>;
60
+ }
61
+ //# sourceMappingURL=abstractErgoExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstractErgoExtractor.d.ts","sourceRoot":"","sources":["../../../lib/ergo/extractors/abstractErgoExtractor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAG/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,iBAAiB,EAClB,MAAM,eAAe,CAAC;AAEvB;;;;;;;;;GASG;AACH,8BAAsB,qBAAqB,CACzC,aAAa,SAAS,kBAAkB,EACxC,eAAe,SAAS,kBAAkB,CAC1C,SAAQ,iBAAiB,CAAC,WAAW,EAAE,eAAe,CAAC;IAgBrD,SAAS,CAAC,iBAAiB,CAAC,EAAE,iBAAiB;IAC/C,SAAS,CAAC,MAAM,EAAE,cAAc;IAhBlC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAC5C,aAAa,EACb,eAAe,CAChB,CAAC;IACF,SAAS,CAAC,SAAS,EAAE;SAClB,CAAC,IAAI,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;KAChE,CAKC;IACF,OAAO,CAAC,aAAa,CAAe;gBAGxB,iBAAiB,CAAC,EAAE,iBAAiB,YAAA,EACrC,MAAM,GAAE,cAAkC;IAKtD;;;;;;OAMG;IACH,IAAI,GAAU,CAAC,SAAS,YAAY,EAClC,MAAM,CAAC,EACP,UAAU,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KACtC,OAAO,CAAC,MAAM,CAAC,CAOhB;IAEF;;;;;;OAMG;IACH,MAAM,GAAU,MAAM,YAAY,EAAE,IAAI,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC,CAY/D;IAEF;;;;OAIG;IACH,SAAS,CAAC,gBAAgB,CAAC,CAAC,SAAS,YAAY,EAC/C,IAAI,EAAE,CAAC,EACP,IAAI,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GACtC,IAAI;IAaP;;;OAGG;IACH,SAAS,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC,CAM7C;IAEF;;;;;OAKG;IACH,qBAAqB,QAAO,kBAAkB,CAAC,eAAe,CAAC,CACZ;CACpD"}
@@ -0,0 +1,99 @@
1
+ import { v4 as uuidv4 } from 'uuid';
2
+ import { DummyLogger } from '@rosen-bridge/abstract-logger';
3
+ import { Mutex } from '@rosen-bridge/semaphore';
4
+ import { AbstractExtractor } from '../../abstractExtractor';
5
+ import { CallbackType, } from '../interfaces';
6
+ /**
7
+ * Abstract Ergo-specific extractor that provides common functionality for all Ergo extractors.
8
+ *
9
+ * It provides callback support and blockchain fork handle for all ergo extractors.
10
+ *
11
+ * It triggers callbacks for the `Update` and `Delete` actions on a forked block.
12
+ *
13
+ * @template ExtractedData - The type of data extracted from blockchain
14
+ * @template ExtractorEntity - The database entity type for storing extracted data
15
+ */
16
+ export class AbstractErgoExtractor extends AbstractExtractor {
17
+ initializeOptions;
18
+ logger;
19
+ callbacks = {
20
+ [CallbackType.Update]: new Map(),
21
+ [CallbackType.Insert]: new Map(),
22
+ [CallbackType.Delete]: new Map(),
23
+ [CallbackType.Spend]: new Map(),
24
+ };
25
+ callbackMutex = new Mutex();
26
+ constructor(initializeOptions, logger = new DummyLogger()) {
27
+ super();
28
+ this.initializeOptions = initializeOptions;
29
+ this.logger = logger;
30
+ }
31
+ /**
32
+ * hook a new callback on a callback type
33
+ * @param type
34
+ * @param id
35
+ * @param callback
36
+ * @returns callback registered id
37
+ */
38
+ hook = async (type, callback) => {
39
+ const release = await this.callbackMutex.acquire();
40
+ const callbackMap = this.callbacks[type];
41
+ const id = uuidv4();
42
+ callbackMap.set(id, callback);
43
+ release();
44
+ return id;
45
+ };
46
+ /**
47
+ * unhook a callback on a type
48
+ * returns false if there is no registered callback with the id
49
+ * @param type
50
+ * @param id
51
+ * @returns success status
52
+ */
53
+ unhook = async (type, id) => {
54
+ const release = await this.callbackMutex.acquire();
55
+ const callbackMap = this.callbacks[type];
56
+ if (!callbackMap.has(id)) {
57
+ this.logger.warn(`Callback with Id [${id}] is not registered for type [${type}].`);
58
+ return false;
59
+ }
60
+ callbackMap.delete(id);
61
+ release();
62
+ return true;
63
+ };
64
+ /**
65
+ * trigger all callbacks registered on a specific type with the provided data
66
+ * @param type
67
+ * @param data
68
+ */
69
+ triggerCallbacks(type, data) {
70
+ const callbackMap = this.callbacks[type];
71
+ callbackMap.forEach((callback) => {
72
+ try {
73
+ callback(data);
74
+ }
75
+ catch (e) {
76
+ this.logger.warn(`callback failed for ${type} action on data [${data}] with error: ${e}`);
77
+ }
78
+ });
79
+ }
80
+ /**
81
+ * fork one block and remove all stored information for this block
82
+ * @param hash block hash
83
+ */
84
+ forkBlock = async (hash) => {
85
+ const result = await this.actions.deleteBlockData(hash, this.getId());
86
+ if (result.deletedData.length > 0)
87
+ this.triggerCallbacks(CallbackType.Delete, result.deletedData);
88
+ if (result.updatedData.length > 0)
89
+ this.triggerCallbacks(CallbackType.Update, result.updatedData);
90
+ };
91
+ /**
92
+ * Builds a query that returns used blocks by selecting the `block` column from the `ExtractorEntity` repository,
93
+ * filtered by the provided `extractorId`
94
+ *
95
+ * @returns A query builder selecting used blocks
96
+ */
97
+ createUsedBlocksQuery = () => this.actions.createUsedBlocksQuery(this.getId());
98
+ }
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RFcmdvRXh0cmFjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2VyZ28vZXh0cmFjdG9ycy9hYnN0cmFjdEVyZ29FeHRyYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEMsT0FBTyxFQUFrQixXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUc1RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFaEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFNUQsT0FBTyxFQUVMLFlBQVksR0FJYixNQUFNLGVBQWUsQ0FBQztBQUV2Qjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLE9BQWdCLHFCQUdwQixTQUFRLGlCQUErQztJQWdCM0M7SUFDQTtJQVpGLFNBQVMsR0FFZjtRQUNGLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksR0FBRyxFQUFFO1FBQ2hDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksR0FBRyxFQUFFO1FBQ2hDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksR0FBRyxFQUFFO1FBQ2hDLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksR0FBRyxFQUFFO0tBQ2hDLENBQUM7SUFDTSxhQUFhLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUVwQyxZQUNZLGlCQUFxQyxFQUNyQyxTQUF5QixJQUFJLFdBQVcsRUFBRTtRQUVwRCxLQUFLLEVBQUUsQ0FBQztRQUhFLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBb0I7UUFDckMsV0FBTSxHQUFOLE1BQU0sQ0FBb0M7SUFHdEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILElBQUksR0FBRyxLQUFLLEVBQ1YsSUFBTyxFQUNQLFFBQXVDLEVBQ3RCLEVBQUU7UUFDbkIsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25ELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsTUFBTSxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDcEIsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDOUIsT0FBTyxFQUFFLENBQUM7UUFDVixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUMsQ0FBQztJQUVGOzs7Ozs7T0FNRztJQUNILE1BQU0sR0FBRyxLQUFLLEVBQUUsSUFBa0IsRUFBRSxFQUFVLEVBQW9CLEVBQUU7UUFDbEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25ELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDZCxxQkFBcUIsRUFBRSxpQ0FBaUMsSUFBSSxJQUFJLENBQ2pFLENBQUM7WUFDRixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8sRUFBRSxDQUFDO1FBQ1YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUM7SUFFRjs7OztPQUlHO0lBQ08sZ0JBQWdCLENBQ3hCLElBQU8sRUFDUCxJQUF1QztRQUV2QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUMvQixJQUFJLENBQUM7Z0JBQ0gsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pCLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNkLHVCQUF1QixJQUFJLG9CQUFvQixJQUFJLGlCQUFpQixDQUFDLEVBQUUsQ0FDeEUsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLEdBQUcsS0FBSyxFQUFFLElBQVksRUFBaUIsRUFBRTtRQUNoRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN0RSxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDL0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2pFLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUMvQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkUsQ0FBQyxDQUFDO0lBRUY7Ozs7O09BS0c7SUFDSCxxQkFBcUIsR0FBRyxHQUF3QyxFQUFFLENBQ2hFLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7Q0FDcEQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcblxuaW1wb3J0IHsgQWJzdHJhY3RMb2dnZXIsIER1bW15TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHsgU2VsZWN0UXVlcnlCdWlsZGVyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9leHRlbmRlZC10eXBlb3JtJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyLWludGVyZmFjZXMnO1xuaW1wb3J0IHsgTXV0ZXggfSBmcm9tICdAcm9zZW4tYnJpZGdlL3NlbWFwaG9yZSc7XG5cbmltcG9ydCB7IEFic3RyYWN0RXh0cmFjdG9yIH0gZnJvbSAnLi4vLi4vYWJzdHJhY3RFeHRyYWN0b3InO1xuaW1wb3J0IHsgQWJzdHJhY3RFcmdvRW50aXR5LCBBYnN0cmFjdEVyZ29BY3Rpb24gfSBmcm9tICcuLi9kYXRhYmFzZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdEVudGl0eURhdGEsXG4gIENhbGxiYWNrVHlwZSxcbiAgQ2FsbGJhY2tNYXAsXG4gIENhbGxiYWNrRGF0YU1hcCxcbiAgSW5pdGlhbGl6ZU9wdGlvbnMsXG59IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuXG4vKipcbiAqIEFic3RyYWN0IEVyZ28tc3BlY2lmaWMgZXh0cmFjdG9yIHRoYXQgcHJvdmlkZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCBFcmdvIGV4dHJhY3RvcnMuXG4gKlxuICogSXQgcHJvdmlkZXMgY2FsbGJhY2sgc3VwcG9ydCBhbmQgYmxvY2tjaGFpbiBmb3JrIGhhbmRsZSBmb3IgYWxsIGVyZ28gZXh0cmFjdG9ycy5cbiAqXG4gKiBJdCB0cmlnZ2VycyBjYWxsYmFja3MgZm9yIHRoZSBgVXBkYXRlYCBhbmQgYERlbGV0ZWAgYWN0aW9ucyBvbiBhIGZvcmtlZCBibG9jay5cbiAqXG4gKiBAdGVtcGxhdGUgRXh0cmFjdGVkRGF0YSAtIFRoZSB0eXBlIG9mIGRhdGEgZXh0cmFjdGVkIGZyb20gYmxvY2tjaGFpblxuICogQHRlbXBsYXRlIEV4dHJhY3RvckVudGl0eSAtIFRoZSBkYXRhYmFzZSBlbnRpdHkgdHlwZSBmb3Igc3RvcmluZyBleHRyYWN0ZWQgZGF0YVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFcmdvRXh0cmFjdG9yPFxuICBFeHRyYWN0ZWREYXRhIGV4dGVuZHMgQWJzdHJhY3RFbnRpdHlEYXRhLFxuICBFeHRyYWN0b3JFbnRpdHkgZXh0ZW5kcyBBYnN0cmFjdEVyZ29FbnRpdHksXG4+IGV4dGVuZHMgQWJzdHJhY3RFeHRyYWN0b3I8VHJhbnNhY3Rpb24sIEV4dHJhY3RvckVudGl0eT4ge1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYWN0aW9uczogQWJzdHJhY3RFcmdvQWN0aW9uPFxuICAgIEV4dHJhY3RlZERhdGEsXG4gICAgRXh0cmFjdG9yRW50aXR5XG4gID47XG4gIHByb3RlY3RlZCBjYWxsYmFja3M6IHtcbiAgICBbSyBpbiBDYWxsYmFja1R5cGVdOiBNYXA8c3RyaW5nLCBDYWxsYmFja01hcDxFeHRyYWN0ZWREYXRhPltLXT47XG4gIH0gPSB7XG4gICAgW0NhbGxiYWNrVHlwZS5VcGRhdGVdOiBuZXcgTWFwKCksXG4gICAgW0NhbGxiYWNrVHlwZS5JbnNlcnRdOiBuZXcgTWFwKCksXG4gICAgW0NhbGxiYWNrVHlwZS5EZWxldGVdOiBuZXcgTWFwKCksXG4gICAgW0NhbGxiYWNrVHlwZS5TcGVuZF06IG5ldyBNYXAoKSxcbiAgfTtcbiAgcHJpdmF0ZSBjYWxsYmFja011dGV4ID0gbmV3IE11dGV4KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGluaXRpYWxpemVPcHRpb25zPzogSW5pdGlhbGl6ZU9wdGlvbnMsXG4gICAgcHJvdGVjdGVkIGxvZ2dlcjogQWJzdHJhY3RMb2dnZXIgPSBuZXcgRHVtbXlMb2dnZXIoKSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBob29rIGEgbmV3IGNhbGxiYWNrIG9uIGEgY2FsbGJhY2sgdHlwZVxuICAgKiBAcGFyYW0gdHlwZVxuICAgKiBAcGFyYW0gaWRcbiAgICogQHBhcmFtIGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIGNhbGxiYWNrIHJlZ2lzdGVyZWQgaWRcbiAgICovXG4gIGhvb2sgPSBhc3luYyA8VCBleHRlbmRzIENhbGxiYWNrVHlwZT4oXG4gICAgdHlwZTogVCxcbiAgICBjYWxsYmFjazogQ2FsbGJhY2tNYXA8RXh0cmFjdGVkRGF0YT5bVF0sXG4gICk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgY29uc3QgcmVsZWFzZSA9IGF3YWl0IHRoaXMuY2FsbGJhY2tNdXRleC5hY3F1aXJlKCk7XG4gICAgY29uc3QgY2FsbGJhY2tNYXAgPSB0aGlzLmNhbGxiYWNrc1t0eXBlXTtcbiAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgIGNhbGxiYWNrTWFwLnNldChpZCwgY2FsbGJhY2spO1xuICAgIHJlbGVhc2UoKTtcbiAgICByZXR1cm4gaWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIHVuaG9vayBhIGNhbGxiYWNrIG9uIGEgdHlwZVxuICAgKiByZXR1cm5zIGZhbHNlIGlmIHRoZXJlIGlzIG5vIHJlZ2lzdGVyZWQgY2FsbGJhY2sgd2l0aCB0aGUgaWRcbiAgICogQHBhcmFtIHR5cGVcbiAgICogQHBhcmFtIGlkXG4gICAqIEByZXR1cm5zIHN1Y2Nlc3Mgc3RhdHVzXG4gICAqL1xuICB1bmhvb2sgPSBhc3luYyAodHlwZTogQ2FsbGJhY2tUeXBlLCBpZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgY29uc3QgcmVsZWFzZSA9IGF3YWl0IHRoaXMuY2FsbGJhY2tNdXRleC5hY3F1aXJlKCk7XG4gICAgY29uc3QgY2FsbGJhY2tNYXAgPSB0aGlzLmNhbGxiYWNrc1t0eXBlXTtcbiAgICBpZiAoIWNhbGxiYWNrTWFwLmhhcyhpZCkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgIGBDYWxsYmFjayB3aXRoIElkIFske2lkfV0gaXMgbm90IHJlZ2lzdGVyZWQgZm9yIHR5cGUgWyR7dHlwZX1dLmAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjYWxsYmFja01hcC5kZWxldGUoaWQpO1xuICAgIHJlbGVhc2UoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogdHJpZ2dlciBhbGwgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgb24gYSBzcGVjaWZpYyB0eXBlIHdpdGggdGhlIHByb3ZpZGVkIGRhdGFcbiAgICogQHBhcmFtIHR5cGVcbiAgICogQHBhcmFtIGRhdGFcbiAgICovXG4gIHByb3RlY3RlZCB0cmlnZ2VyQ2FsbGJhY2tzPFQgZXh0ZW5kcyBDYWxsYmFja1R5cGU+KFxuICAgIHR5cGU6IFQsXG4gICAgZGF0YTogQ2FsbGJhY2tEYXRhTWFwPEV4dHJhY3RlZERhdGE+W1RdLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBjYWxsYmFja01hcCA9IHRoaXMuY2FsbGJhY2tzW3R5cGVdO1xuICAgIGNhbGxiYWNrTWFwLmZvckVhY2goKGNhbGxiYWNrKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgY2FsbGJhY2sgZmFpbGVkIGZvciAke3R5cGV9IGFjdGlvbiBvbiBkYXRhIFske2RhdGF9XSB3aXRoIGVycm9yOiAke2V9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBmb3JrIG9uZSBibG9jayBhbmQgcmVtb3ZlIGFsbCBzdG9yZWQgaW5mb3JtYXRpb24gZm9yIHRoaXMgYmxvY2tcbiAgICogQHBhcmFtIGhhc2ggYmxvY2sgaGFzaFxuICAgKi9cbiAgZm9ya0Jsb2NrID0gYXN5bmMgKGhhc2g6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWN0aW9ucy5kZWxldGVCbG9ja0RhdGEoaGFzaCwgdGhpcy5nZXRJZCgpKTtcbiAgICBpZiAocmVzdWx0LmRlbGV0ZWREYXRhLmxlbmd0aCA+IDApXG4gICAgICB0aGlzLnRyaWdnZXJDYWxsYmFja3MoQ2FsbGJhY2tUeXBlLkRlbGV0ZSwgcmVzdWx0LmRlbGV0ZWREYXRhKTtcbiAgICBpZiAocmVzdWx0LnVwZGF0ZWREYXRhLmxlbmd0aCA+IDApXG4gICAgICB0aGlzLnRyaWdnZXJDYWxsYmFja3MoQ2FsbGJhY2tUeXBlLlVwZGF0ZSwgcmVzdWx0LnVwZGF0ZWREYXRhKTtcbiAgfTtcblxuICAvKipcbiAgICogQnVpbGRzIGEgcXVlcnkgdGhhdCByZXR1cm5zIHVzZWQgYmxvY2tzIGJ5IHNlbGVjdGluZyB0aGUgYGJsb2NrYCBjb2x1bW4gZnJvbSB0aGUgYEV4dHJhY3RvckVudGl0eWAgcmVwb3NpdG9yeSxcbiAgICogZmlsdGVyZWQgYnkgdGhlIHByb3ZpZGVkIGBleHRyYWN0b3JJZGBcbiAgICpcbiAgICogQHJldHVybnMgQSBxdWVyeSBidWlsZGVyIHNlbGVjdGluZyB1c2VkIGJsb2Nrc1xuICAgKi9cbiAgY3JlYXRlVXNlZEJsb2Nrc1F1ZXJ5ID0gKCk6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxFeHRyYWN0b3JFbnRpdHk+ID0+XG4gICAgdGhpcy5hY3Rpb25zLmNyZWF0ZVVzZWRCbG9ja3NRdWVyeSh0aGlzLmdldElkKCkpO1xufVxuIl19
@@ -0,0 +1,54 @@
1
+ import { AbstractLogger } from '@rosen-bridge/abstract-logger';
2
+ import { BlockInfo, Transaction } from '@rosen-bridge/scanner-interfaces';
3
+ import { AbstractErgoEntity } from '../database';
4
+ import { AbstractEntityData, InitializeOptions } from '../interfaces';
5
+ import { AbstractErgoExtractor } from './abstractErgoExtractor';
6
+ /**
7
+ * Abstract Ergo Tx Extractor class for tx-based data extraction.
8
+ *
9
+ * This class extends the AbstractErgoExtractor class and provides
10
+ * functionality for extracting tx-based data from the blockchain.
11
+ *
12
+ * It implements the `initializeData` method with ergo initializers.
13
+ * It implements the `processTransactions` method to extract and
14
+ * store data from transactions.
15
+ *
16
+ * Triggers `Insert` callback on new data insertion.
17
+ *
18
+ * @template ExtractedData - The type of data extracted from blockchain
19
+ * @template ExtractorEntity - The database entity type for storing extracted data
20
+ */
21
+ export declare abstract class AbstractErgoTxExtractor<ExtractedData extends AbstractEntityData, ExtractorEntity extends AbstractErgoEntity> extends AbstractErgoExtractor<ExtractedData, ExtractorEntity> {
22
+ constructor(initializeOptions?: InitializeOptions, logger?: AbstractLogger);
23
+ /**
24
+ * Extract transaction data to proper format (not including spending information).
25
+ * This method should be overridden by subclasses that need transaction-based extraction.
26
+ * @param tx - The transaction to extract data from
27
+ * @returns extracted data in proper format or undefined if no data should be extracted
28
+ * @throws Error if not overridden by subclass
29
+ */
30
+ abstract extractTxData: (tx: Transaction, block: BlockInfo) => ExtractedData | undefined;
31
+ /**
32
+ * Check if the transaction has the required data format.
33
+ * This method should be overridden by subclasses that need transaction-based extraction.
34
+ * @param tx - The transaction to check
35
+ * @returns true if the transaction has the required data and false otherwise
36
+ * @throws Error if not overridden by subclass
37
+ */
38
+ abstract hasTxData: (tx: Transaction) => boolean;
39
+ /**
40
+ * Process a list of transactions in a block and store required information.
41
+ * This method can be overridden by subclasses for custom transaction processing,
42
+ * or they can override extractTxData and hasTxData methods instead.
43
+ * @param txs - List of transactions in the block
44
+ * @param block - Block information
45
+ * @returns true if the process is completed successfully and false otherwise
46
+ */
47
+ processTransactions: (txs: Transaction[], block: BlockInfo) => Promise<boolean>;
48
+ /**
49
+ * initialize extractor database with data created below the initial height
50
+ * @param initialBlock
51
+ */
52
+ initializeData: (initialBlock: BlockInfo) => Promise<void>;
53
+ }
54
+ //# sourceMappingURL=abstractErgoTxExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstractErgoTxExtractor.d.ts","sourceRoot":"","sources":["../../../lib/ergo/extractors/abstractErgoTxExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAE1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EACL,kBAAkB,EAElB,iBAAiB,EAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE;;;;;;;;;;;;;;GAcG;AACH,8BAAsB,uBAAuB,CAC3C,aAAa,SAAS,kBAAkB,EACxC,eAAe,SAAS,kBAAkB,CAC1C,SAAQ,qBAAqB,CAAC,aAAa,EAAE,eAAe,CAAC;gBACjD,iBAAiB,CAAC,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,cAAc;IAI1E;;;;;;OAMG;IACH,QAAQ,CAAC,aAAa,EAAE,CACtB,EAAE,EAAE,WAAW,EACf,KAAK,EAAE,SAAS,KACb,aAAa,GAAG,SAAS,CAAC;IAE/B;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,OAAO,CAAC;IAEjD;;;;;;;OAOG;IACH,mBAAmB,GACjB,KAAK,WAAW,EAAE,EAClB,OAAO,SAAS,KACf,OAAO,CAAC,OAAO,CAAC,CA0CjB;IAEF;;;OAGG;IACH,cAAc,GAAU,cAAc,SAAS,KAAG,OAAO,CAAC,IAAI,CAAC,CAe7D;CACH"}
@@ -0,0 +1,76 @@
1
+ import JsonBigInt from '@rosen-bridge/json-bigint';
2
+ import { ErgoInitializer } from '../initializers';
3
+ import { CallbackType, } from '../interfaces';
4
+ import { AbstractErgoExtractor } from './abstractErgoExtractor';
5
+ /**
6
+ * Abstract Ergo Tx Extractor class for tx-based data extraction.
7
+ *
8
+ * This class extends the AbstractErgoExtractor class and provides
9
+ * functionality for extracting tx-based data from the blockchain.
10
+ *
11
+ * It implements the `initializeData` method with ergo initializers.
12
+ * It implements the `processTransactions` method to extract and
13
+ * store data from transactions.
14
+ *
15
+ * Triggers `Insert` callback on new data insertion.
16
+ *
17
+ * @template ExtractedData - The type of data extracted from blockchain
18
+ * @template ExtractorEntity - The database entity type for storing extracted data
19
+ */
20
+ export class AbstractErgoTxExtractor extends AbstractErgoExtractor {
21
+ constructor(initializeOptions, logger) {
22
+ super(initializeOptions, logger);
23
+ }
24
+ /**
25
+ * Process a list of transactions in a block and store required information.
26
+ * This method can be overridden by subclasses for custom transaction processing,
27
+ * or they can override extractTxData and hasTxData methods instead.
28
+ * @param txs - List of transactions in the block
29
+ * @param block - Block information
30
+ * @returns true if the process is completed successfully and false otherwise
31
+ */
32
+ processTransactions = async (txs, block) => {
33
+ try {
34
+ const txsData = [];
35
+ for (const tx of txs) {
36
+ if (!this.hasTxData(tx)) {
37
+ continue;
38
+ }
39
+ this.logger.debug(`Trying to extract data from tx [${tx.id}]`);
40
+ const extractedData = this.extractTxData(tx, block);
41
+ if (extractedData) {
42
+ this.logger.debug(`Extracted data ${JsonBigInt.stringify(extractedData)} from tx ${tx.id}`);
43
+ txsData.push(extractedData);
44
+ }
45
+ }
46
+ if (txsData.length > 0) {
47
+ if (!(await this.actions.storeEntities(txsData, block, this.getId()))) {
48
+ this.logger.warn(`Data insertion failed for ${this.getId()} at the block ${block.height}`);
49
+ return false;
50
+ }
51
+ this.triggerCallbacks(CallbackType.Insert, txsData);
52
+ }
53
+ }
54
+ catch (e) {
55
+ this.logger.error(`Processing transactions failed for ${this.getId()} at the block ${block.height} with error: ${e}`);
56
+ if (e instanceof Error && e.stack) {
57
+ this.logger.debug(`error stack: ${e.stack}`);
58
+ }
59
+ return false;
60
+ }
61
+ return true;
62
+ };
63
+ /**
64
+ * initialize extractor database with data created below the initial height
65
+ * @param initialBlock
66
+ */
67
+ initializeData = async (initialBlock) => {
68
+ if (this.initializeOptions && this.initializeOptions.active) {
69
+ const initializer = new ErgoInitializer(this.initializeOptions.type, this.initializeOptions.url, this.initializeOptions.address, this.getId(), this.processTransactions, this.actions, this.initializeOptions.maxParallelRequests, this.logger.child('ErgoInitializer'));
70
+ await initializer.initializeData(initialBlock);
71
+ }
72
+ else
73
+ this.logger.info(`Initialization for [${this.getId()}] is turned off`);
74
+ };
75
+ }
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RFcmdvVHhFeHRyYWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZXJnby9leHRyYWN0b3JzL2Fic3RyYWN0RXJnb1R4RXh0cmFjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sVUFBVSxNQUFNLDJCQUEyQixDQUFDO0FBSW5ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBRUwsWUFBWSxHQUViLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWhFOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxPQUFnQix1QkFHcEIsU0FBUSxxQkFBcUQ7SUFDN0QsWUFBWSxpQkFBcUMsRUFBRSxNQUF1QjtRQUN4RSxLQUFLLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQXVCRDs7Ozs7OztPQU9HO0lBQ0gsbUJBQW1CLEdBQUcsS0FBSyxFQUN6QixHQUFrQixFQUNsQixLQUFnQixFQUNFLEVBQUU7UUFDcEIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQXlCLEVBQUUsQ0FBQztZQUN6QyxLQUFLLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO29CQUN4QixTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUNBQW1DLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUMvRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxhQUFhLEVBQUUsQ0FBQztvQkFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2Ysa0JBQWtCLFVBQVUsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFlBQ25ELEVBQUUsQ0FBQyxFQUNMLEVBQUUsQ0FDSCxDQUFDO29CQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQzlCLENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN0RSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDZCw2QkFBNkIsSUFBSSxDQUFDLEtBQUssRUFBRSxpQkFDdkMsS0FBSyxDQUFDLE1BQ1IsRUFBRSxDQUNILENBQUM7b0JBQ0YsT0FBTyxLQUFLLENBQUM7Z0JBQ2YsQ0FBQztnQkFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN0RCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZixzQ0FBc0MsSUFBSSxDQUFDLEtBQUssRUFBRSxpQkFDaEQsS0FBSyxDQUFDLE1BQ1IsZ0JBQWdCLENBQUMsRUFBRSxDQUNwQixDQUFDO1lBQ0YsSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQztJQUVGOzs7T0FHRztJQUNILGNBQWMsR0FBRyxLQUFLLEVBQUUsWUFBdUIsRUFBaUIsRUFBRTtRQUNoRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDNUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxlQUFlLENBQ3JDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQzNCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQzlCLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFDWixJQUFJLENBQUMsbUJBQW1CLEVBQ3hCLElBQUksQ0FBQyxPQUFPLEVBQ1osSUFBSSxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixFQUMxQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUNyQyxDQUFDO1lBQ0YsTUFBTSxXQUFXLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pELENBQUM7O1lBQ0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLElBQUksQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUMzRSxDQUFDLENBQUM7Q0FDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IEpzb25CaWdJbnQgZnJvbSAnQHJvc2VuLWJyaWRnZS9qc29uLWJpZ2ludCc7XG5pbXBvcnQgeyBCbG9ja0luZm8sIFRyYW5zYWN0aW9uIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyLWludGVyZmFjZXMnO1xuXG5pbXBvcnQgeyBBYnN0cmFjdEVyZ29FbnRpdHkgfSBmcm9tICcuLi9kYXRhYmFzZSc7XG5pbXBvcnQgeyBFcmdvSW5pdGlhbGl6ZXIgfSBmcm9tICcuLi9pbml0aWFsaXplcnMnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RFbnRpdHlEYXRhLFxuICBDYWxsYmFja1R5cGUsXG4gIEluaXRpYWxpemVPcHRpb25zLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFic3RyYWN0RXJnb0V4dHJhY3RvciB9IGZyb20gJy4vYWJzdHJhY3RFcmdvRXh0cmFjdG9yJztcblxuLyoqXG4gKiBBYnN0cmFjdCBFcmdvIFR4IEV4dHJhY3RvciBjbGFzcyBmb3IgdHgtYmFzZWQgZGF0YSBleHRyYWN0aW9uLlxuICpcbiAqIFRoaXMgY2xhc3MgZXh0ZW5kcyB0aGUgQWJzdHJhY3RFcmdvRXh0cmFjdG9yIGNsYXNzIGFuZCBwcm92aWRlc1xuICogZnVuY3Rpb25hbGl0eSBmb3IgZXh0cmFjdGluZyB0eC1iYXNlZCBkYXRhIGZyb20gdGhlIGJsb2NrY2hhaW4uXG4gKlxuICogSXQgaW1wbGVtZW50cyB0aGUgYGluaXRpYWxpemVEYXRhYCBtZXRob2Qgd2l0aCBlcmdvIGluaXRpYWxpemVycy5cbiAqIEl0IGltcGxlbWVudHMgdGhlIGBwcm9jZXNzVHJhbnNhY3Rpb25zYCBtZXRob2QgdG8gZXh0cmFjdCBhbmRcbiAqIHN0b3JlIGRhdGEgZnJvbSB0cmFuc2FjdGlvbnMuXG4gKlxuICogVHJpZ2dlcnMgYEluc2VydGAgY2FsbGJhY2sgb24gbmV3IGRhdGEgaW5zZXJ0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBFeHRyYWN0ZWREYXRhIC0gVGhlIHR5cGUgb2YgZGF0YSBleHRyYWN0ZWQgZnJvbSBibG9ja2NoYWluXG4gKiBAdGVtcGxhdGUgRXh0cmFjdG9yRW50aXR5IC0gVGhlIGRhdGFiYXNlIGVudGl0eSB0eXBlIGZvciBzdG9yaW5nIGV4dHJhY3RlZCBkYXRhXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVyZ29UeEV4dHJhY3RvcjxcbiAgRXh0cmFjdGVkRGF0YSBleHRlbmRzIEFic3RyYWN0RW50aXR5RGF0YSxcbiAgRXh0cmFjdG9yRW50aXR5IGV4dGVuZHMgQWJzdHJhY3RFcmdvRW50aXR5LFxuPiBleHRlbmRzIEFic3RyYWN0RXJnb0V4dHJhY3RvcjxFeHRyYWN0ZWREYXRhLCBFeHRyYWN0b3JFbnRpdHk+IHtcbiAgY29uc3RydWN0b3IoaW5pdGlhbGl6ZU9wdGlvbnM/OiBJbml0aWFsaXplT3B0aW9ucywgbG9nZ2VyPzogQWJzdHJhY3RMb2dnZXIpIHtcbiAgICBzdXBlcihpbml0aWFsaXplT3B0aW9ucywgbG9nZ2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IHRyYW5zYWN0aW9uIGRhdGEgdG8gcHJvcGVyIGZvcm1hdCAobm90IGluY2x1ZGluZyBzcGVuZGluZyBpbmZvcm1hdGlvbikuXG4gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdGhhdCBuZWVkIHRyYW5zYWN0aW9uLWJhc2VkIGV4dHJhY3Rpb24uXG4gICAqIEBwYXJhbSB0eCAtIFRoZSB0cmFuc2FjdGlvbiB0byBleHRyYWN0IGRhdGEgZnJvbVxuICAgKiBAcmV0dXJucyBleHRyYWN0ZWQgZGF0YSBpbiBwcm9wZXIgZm9ybWF0IG9yIHVuZGVmaW5lZCBpZiBubyBkYXRhIHNob3VsZCBiZSBleHRyYWN0ZWRcbiAgICogQHRocm93cyBFcnJvciBpZiBub3Qgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc1xuICAgKi9cbiAgYWJzdHJhY3QgZXh0cmFjdFR4RGF0YTogKFxuICAgIHR4OiBUcmFuc2FjdGlvbixcbiAgICBibG9jazogQmxvY2tJbmZvLFxuICApID0+IEV4dHJhY3RlZERhdGEgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSB0cmFuc2FjdGlvbiBoYXMgdGhlIHJlcXVpcmVkIGRhdGEgZm9ybWF0LlxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzIHRoYXQgbmVlZCB0cmFuc2FjdGlvbi1iYXNlZCBleHRyYWN0aW9uLlxuICAgKiBAcGFyYW0gdHggLSBUaGUgdHJhbnNhY3Rpb24gdG8gY2hlY2tcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNhY3Rpb24gaGFzIHRoZSByZXF1aXJlZCBkYXRhIGFuZCBmYWxzZSBvdGhlcndpc2VcbiAgICogQHRocm93cyBFcnJvciBpZiBub3Qgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc1xuICAgKi9cbiAgYWJzdHJhY3QgaGFzVHhEYXRhOiAodHg6IFRyYW5zYWN0aW9uKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQcm9jZXNzIGEgbGlzdCBvZiB0cmFuc2FjdGlvbnMgaW4gYSBibG9jayBhbmQgc3RvcmUgcmVxdWlyZWQgaW5mb3JtYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgZm9yIGN1c3RvbSB0cmFuc2FjdGlvbiBwcm9jZXNzaW5nLFxuICAgKiBvciB0aGV5IGNhbiBvdmVycmlkZSBleHRyYWN0VHhEYXRhIGFuZCBoYXNUeERhdGEgbWV0aG9kcyBpbnN0ZWFkLlxuICAgKiBAcGFyYW0gdHhzIC0gTGlzdCBvZiB0cmFuc2FjdGlvbnMgaW4gdGhlIGJsb2NrXG4gICAqIEBwYXJhbSBibG9jayAtIEJsb2NrIGluZm9ybWF0aW9uXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHByb2Nlc3MgaXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBhbmQgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwcm9jZXNzVHJhbnNhY3Rpb25zID0gYXN5bmMgKFxuICAgIHR4czogVHJhbnNhY3Rpb25bXSxcbiAgICBibG9jazogQmxvY2tJbmZvLFxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdHhzRGF0YTogQXJyYXk8RXh0cmFjdGVkRGF0YT4gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdHggb2YgdHhzKSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNUeERhdGEodHgpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFRyeWluZyB0byBleHRyYWN0IGRhdGEgZnJvbSB0eCBbJHt0eC5pZH1dYCk7XG4gICAgICAgIGNvbnN0IGV4dHJhY3RlZERhdGEgPSB0aGlzLmV4dHJhY3RUeERhdGEodHgsIGJsb2NrKTtcbiAgICAgICAgaWYgKGV4dHJhY3RlZERhdGEpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBFeHRyYWN0ZWQgZGF0YSAke0pzb25CaWdJbnQuc3RyaW5naWZ5KGV4dHJhY3RlZERhdGEpfSBmcm9tIHR4ICR7XG4gICAgICAgICAgICAgIHR4LmlkXG4gICAgICAgICAgICB9YCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHR4c0RhdGEucHVzaChleHRyYWN0ZWREYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodHhzRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuYWN0aW9ucy5zdG9yZUVudGl0aWVzKHR4c0RhdGEsIGJsb2NrLCB0aGlzLmdldElkKCkpKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgRGF0YSBpbnNlcnRpb24gZmFpbGVkIGZvciAke3RoaXMuZ2V0SWQoKX0gYXQgdGhlIGJsb2NrICR7XG4gICAgICAgICAgICAgIGJsb2NrLmhlaWdodFxuICAgICAgICAgICAgfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50cmlnZ2VyQ2FsbGJhY2tzKENhbGxiYWNrVHlwZS5JbnNlcnQsIHR4c0RhdGEpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICBgUHJvY2Vzc2luZyB0cmFuc2FjdGlvbnMgZmFpbGVkIGZvciAke3RoaXMuZ2V0SWQoKX0gYXQgdGhlIGJsb2NrICR7XG4gICAgICAgICAgYmxvY2suaGVpZ2h0XG4gICAgICAgIH0gd2l0aCBlcnJvcjogJHtlfWAsXG4gICAgICApO1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLnN0YWNrKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBlcnJvciBzdGFjazogJHtlLnN0YWNrfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogaW5pdGlhbGl6ZSBleHRyYWN0b3IgZGF0YWJhc2Ugd2l0aCBkYXRhIGNyZWF0ZWQgYmVsb3cgdGhlIGluaXRpYWwgaGVpZ2h0XG4gICAqIEBwYXJhbSBpbml0aWFsQmxvY2tcbiAgICovXG4gIGluaXRpYWxpemVEYXRhID0gYXN5bmMgKGluaXRpYWxCbG9jazogQmxvY2tJbmZvKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZU9wdGlvbnMgJiYgdGhpcy5pbml0aWFsaXplT3B0aW9ucy5hY3RpdmUpIHtcbiAgICAgIGNvbnN0IGluaXRpYWxpemVyID0gbmV3IEVyZ29Jbml0aWFsaXplcihcbiAgICAgICAgdGhpcy5pbml0aWFsaXplT3B0aW9ucy50eXBlLFxuICAgICAgICB0aGlzLmluaXRpYWxpemVPcHRpb25zLnVybCxcbiAgICAgICAgdGhpcy5pbml0aWFsaXplT3B0aW9ucy5hZGRyZXNzLFxuICAgICAgICB0aGlzLmdldElkKCksXG4gICAgICAgIHRoaXMucHJvY2Vzc1RyYW5zYWN0aW9ucyxcbiAgICAgICAgdGhpcy5hY3Rpb25zLFxuICAgICAgICB0aGlzLmluaXRpYWxpemVPcHRpb25zLm1heFBhcmFsbGVsUmVxdWVzdHMsXG4gICAgICAgIHRoaXMubG9nZ2VyLmNoaWxkKCdFcmdvSW5pdGlhbGl6ZXInKSxcbiAgICAgICk7XG4gICAgICBhd2FpdCBpbml0aWFsaXplci5pbml0aWFsaXplRGF0YShpbml0aWFsQmxvY2spO1xuICAgIH0gZWxzZVxuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgSW5pdGlhbGl6YXRpb24gZm9yIFske3RoaXMuZ2V0SWQoKX1dIGlzIHR1cm5lZCBvZmZgKTtcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ export * from './abstractErgoExtractor';
2
+ export * from './abstractErgoBoxExtractor';
3
+ export * from './abstractErgoTxExtractor';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/ergo/extractors/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './abstractErgoExtractor';
2
+ export * from './abstractErgoBoxExtractor';
3
+ export * from './abstractErgoTxExtractor';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZXJnby9leHRyYWN0b3JzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDJCQUEyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hYnN0cmFjdEVyZ29FeHRyYWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9hYnN0cmFjdEVyZ29Cb3hFeHRyYWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9hYnN0cmFjdEVyZ29UeEV4dHJhY3Rvcic7XG4iXX0=
@@ -0,0 +1,8 @@
1
+ export * from './extractors';
2
+ export * from './initializers';
3
+ export * from './database';
4
+ export * from './interfaces';
5
+ export * from './networks';
6
+ export * from './initializers';
7
+ export * from './utils';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/ergo/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC"}
@@ -0,0 +1,8 @@
1
+ export * from './extractors';
2
+ export * from './initializers';
3
+ export * from './database';
4
+ export * from './interfaces';
5
+ export * from './networks';
6
+ export * from './initializers';
7
+ export * from './utils';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZXJnby9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2V4dHJhY3RvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbml0aWFsaXplcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9kYXRhYmFzZSc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9uZXR3b3Jrcyc7XG5leHBvcnQgKiBmcm9tICcuL2luaXRpYWxpemVycyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzJztcbiJdfQ==
@@ -0,0 +1,4 @@
1
+ export declare const DELAY_BETWEEN_INIT_REQUESTS = 100;
2
+ export declare const INIT_WORKERS_REASSIGN_INTERVAL = 5000;
3
+ export declare const MAX_PARALLEL_REQUESTS = 10;
4
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../lib/ergo/initializers/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAC/C,eAAO,MAAM,8BAA8B,OAAO,CAAC;AACnD,eAAO,MAAM,qBAAqB,KAAK,CAAC"}
@@ -0,0 +1,4 @@
1
+ export const DELAY_BETWEEN_INIT_REQUESTS = 100; // In milliseconds (only applies to node initialization)
2
+ export const INIT_WORKERS_REASSIGN_INTERVAL = 5000; //milliseconds (only applies to explorer initialization)
3
+ export const MAX_PARALLEL_REQUESTS = 10;
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2VyZ28vaW5pdGlhbGl6ZXJzL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxHQUFHLENBQUMsQ0FBQyx3REFBd0Q7QUFDeEcsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsSUFBSSxDQUFDLENBQUMsd0RBQXdEO0FBQzVHLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBERUxBWV9CRVRXRUVOX0lOSVRfUkVRVUVTVFMgPSAxMDA7IC8vIEluIG1pbGxpc2Vjb25kcyAob25seSBhcHBsaWVzIHRvIG5vZGUgaW5pdGlhbGl6YXRpb24pXG5leHBvcnQgY29uc3QgSU5JVF9XT1JLRVJTX1JFQVNTSUdOX0lOVEVSVkFMID0gNTAwMDsgLy9taWxsaXNlY29uZHMgKG9ubHkgYXBwbGllcyB0byBleHBsb3JlciBpbml0aWFsaXphdGlvbilcbmV4cG9ydCBjb25zdCBNQVhfUEFSQUxMRUxfUkVRVUVTVFMgPSAxMDtcbiJdfQ==
@@ -0,0 +1,36 @@
1
+ import { AbstractLogger } from '@rosen-bridge/abstract-logger';
2
+ import { BlockInfo, ErgoNetworkType, OutputBox, Transaction } from '@rosen-bridge/scanner-interfaces';
3
+ import { AbstractErgoBoxAction, AbstractErgoEntity } from '../database';
4
+ import { AbstractEntityData, ExtendedSpendInfo, ExtendedTransaction } from '../interfaces';
5
+ import { ErgoInitializer } from './ergoInitializer';
6
+ export declare class ErgoBoxInitializer<ExtractedData extends AbstractEntityData, ExtractorEntity extends AbstractErgoEntity> extends ErgoInitializer<ExtractedData, ExtractorEntity> {
7
+ protected extractorId: string;
8
+ protected hasBoxData: (box: OutputBox) => boolean;
9
+ protected processTransactions: (txs: Transaction[], block: BlockInfo) => Promise<boolean>;
10
+ protected actions: AbstractErgoBoxAction<ExtractedData, ExtractorEntity>;
11
+ protected logger: AbstractLogger;
12
+ private spendRecordsMutex;
13
+ private spendRecords;
14
+ constructor(networkType: ErgoNetworkType, url: string, address: string, extractorId: string, hasBoxData: (box: OutputBox) => boolean, processTransactions: (txs: Transaction[], block: BlockInfo) => Promise<boolean>, actions: AbstractErgoBoxAction<ExtractedData, ExtractorEntity>, maxParallelRequests?: number, logger?: AbstractLogger);
15
+ /**
16
+ * Extracts spending information of all related boxes in the transaction
17
+ * Note: override this function if the extractor needs extra spending info
18
+ * @param tx
19
+ * @returns transaction spend info
20
+ */
21
+ protected extractTxSpendInfo: (tx: ExtendedTransaction) => ExtendedSpendInfo[];
22
+ /**
23
+ * Extract and store all spending information of a transaction batch
24
+ * @param txs
25
+ */
26
+ protected storeExtraInfo: (txs: ExtendedTransaction[]) => Promise<void>;
27
+ /**
28
+ * Apply stored spend records into extractor database
29
+ * Note: As transactions are processed out of order (due to parallel
30
+ * processing), some box spend information may be invalid after the first pass
31
+ * To avoid processing everything twice, we keep all spend records in the
32
+ * first pass and reapply them at the end
33
+ */
34
+ protected applyExtraInfo: () => Promise<void>;
35
+ }
36
+ //# sourceMappingURL=ergoBoxInitializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ergoBoxInitializer.d.ts","sourceRoot":"","sources":["../../../lib/ergo/initializers/ergoBoxInitializer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EACL,SAAS,EACT,eAAe,EACf,SAAS,EACT,WAAW,EACZ,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,qBAAa,kBAAkB,CAC7B,aAAa,SAAS,kBAAkB,EACxC,eAAe,SAAS,kBAAkB,CAC1C,SAAQ,eAAe,CAAC,aAAa,EAAE,eAAe,CAAC;IAQrD,SAAS,CAAC,WAAW,EAAE,MAAM;IAC7B,SAAS,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,OAAO;IACjD,SAAS,CAAC,mBAAmB,EAAE,CAC7B,GAAG,EAAE,WAAW,EAAE,EAClB,KAAK,EAAE,SAAS,KACb,OAAO,CAAC,OAAO,CAAC;IACrB,SAAS,CAAC,OAAO,EAAE,qBAAqB,CAAC,aAAa,EAAE,eAAe,CAAC;IAExE,SAAS,CAAC,MAAM,EAAE,cAAc;IAflC,OAAO,CAAC,iBAAiB,CAAe;IACxC,OAAO,CAAC,YAAY,CAAsB;gBAGxC,WAAW,EAAE,eAAe,EAC5B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACL,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,OAAO,EACvC,mBAAmB,EAAE,CAC7B,GAAG,EAAE,WAAW,EAAE,EAClB,KAAK,EAAE,SAAS,KACb,OAAO,CAAC,OAAO,CAAC,EACX,OAAO,EAAE,qBAAqB,CAAC,aAAa,EAAE,eAAe,CAAC,EACxE,mBAAmB,SAAwB,EACjC,MAAM,GAAE,cAAkC;IAetD;;;;;OAKG;IACH,SAAS,CAAC,kBAAkB,GAC1B,IAAI,mBAAmB,KACtB,iBAAiB,EAAE,CAepB;IAEF;;;OAGG;IACH,SAAS,CAAC,cAAc,GACtB,KAAK,mBAAmB,EAAE,KACzB,OAAO,CAAC,IAAI,CAAC,CASd;IAEF;;;;;;OAMG;IACH,SAAS,CAAC,cAAc,sBAuBtB;CACH"}