@rosen-bridge/abstract-extractor 2.1.2 → 3.0.0-7b38188a

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 (101) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/abstractExtractor.d.ts +24 -12
  3. package/dist/abstractExtractor.d.ts.map +1 -1
  4. package/dist/abstractExtractor.js +1 -1
  5. package/dist/ergo/database/actions/abstractErgoAction.d.ts +83 -0
  6. package/dist/ergo/database/actions/abstractErgoAction.d.ts.map +1 -0
  7. package/dist/ergo/database/actions/abstractErgoAction.js +167 -0
  8. package/dist/ergo/database/actions/abstractErgoBoxAction.d.ts +31 -0
  9. package/dist/ergo/database/actions/abstractErgoBoxAction.d.ts.map +1 -0
  10. package/dist/ergo/database/actions/abstractErgoBoxAction.js +70 -0
  11. package/dist/ergo/database/entities/abstractErgoBoxEntity.d.ts +18 -0
  12. package/dist/ergo/database/entities/abstractErgoBoxEntity.d.ts.map +1 -0
  13. package/dist/ergo/database/entities/abstractErgoBoxEntity.js +36 -0
  14. package/dist/ergo/database/entities/abstractErgoEntity.d.ts +26 -0
  15. package/dist/ergo/database/entities/abstractErgoEntity.d.ts.map +1 -0
  16. package/dist/ergo/database/entities/abstractErgoEntity.js +64 -0
  17. package/dist/ergo/database/index.d.ts +5 -0
  18. package/dist/ergo/database/index.d.ts.map +1 -0
  19. package/dist/ergo/database/index.js +5 -0
  20. package/dist/ergo/extractors/abstractErgoBoxExtractor.d.ts +67 -0
  21. package/dist/ergo/extractors/abstractErgoBoxExtractor.d.ts.map +1 -0
  22. package/dist/ergo/extractors/abstractErgoBoxExtractor.js +106 -0
  23. package/dist/ergo/extractors/abstractErgoExtractor.d.ts +53 -0
  24. package/dist/ergo/extractors/abstractErgoExtractor.d.ts.map +1 -0
  25. package/dist/ergo/extractors/abstractErgoExtractor.js +92 -0
  26. package/dist/ergo/extractors/abstractErgoTxExtractor.d.ts +54 -0
  27. package/dist/ergo/extractors/abstractErgoTxExtractor.d.ts.map +1 -0
  28. package/dist/ergo/extractors/abstractErgoTxExtractor.js +76 -0
  29. package/dist/ergo/extractors/index.d.ts +4 -0
  30. package/dist/ergo/extractors/index.d.ts.map +1 -0
  31. package/dist/ergo/extractors/index.js +4 -0
  32. package/dist/ergo/index.d.ts +5 -7
  33. package/dist/ergo/index.d.ts.map +1 -1
  34. package/dist/ergo/index.js +6 -8
  35. package/dist/ergo/initializers/constants.d.ts +4 -0
  36. package/dist/ergo/initializers/constants.d.ts.map +1 -0
  37. package/dist/ergo/initializers/constants.js +4 -0
  38. package/dist/ergo/initializers/ergoBoxInitializer.d.ts +36 -0
  39. package/dist/ergo/initializers/ergoBoxInitializer.d.ts.map +1 -0
  40. package/dist/ergo/initializers/ergoBoxInitializer.js +84 -0
  41. package/dist/ergo/initializers/ergoInitializer.d.ts +39 -0
  42. package/dist/ergo/initializers/ergoInitializer.d.ts.map +1 -0
  43. package/dist/ergo/initializers/ergoInitializer.js +80 -0
  44. package/dist/ergo/initializers/index.d.ts +4 -0
  45. package/dist/ergo/initializers/index.d.ts.map +1 -0
  46. package/dist/ergo/initializers/index.js +4 -0
  47. package/dist/ergo/initializers/strategies/explorerInitializationStrategy.d.ts +59 -0
  48. package/dist/ergo/initializers/strategies/explorerInitializationStrategy.d.ts.map +1 -0
  49. package/dist/ergo/initializers/strategies/explorerInitializationStrategy.js +161 -0
  50. package/dist/ergo/initializers/strategies/index.d.ts +4 -0
  51. package/dist/ergo/initializers/strategies/index.d.ts.map +1 -0
  52. package/dist/ergo/initializers/strategies/index.js +4 -0
  53. package/dist/ergo/initializers/strategies/nodeInitializationStrategy.d.ts +30 -0
  54. package/dist/ergo/initializers/strategies/nodeInitializationStrategy.d.ts.map +1 -0
  55. package/dist/ergo/initializers/strategies/nodeInitializationStrategy.js +78 -0
  56. package/dist/ergo/initializers/strategies/workerManager.d.ts +79 -0
  57. package/dist/ergo/initializers/strategies/workerManager.d.ts.map +1 -0
  58. package/dist/ergo/initializers/strategies/workerManager.js +182 -0
  59. package/dist/ergo/interfaces.d.ts +31 -17
  60. package/dist/ergo/interfaces.d.ts.map +1 -1
  61. package/dist/ergo/interfaces.js +1 -1
  62. package/dist/ergo/networks/explorerNetwork.d.ts +52 -0
  63. package/dist/ergo/networks/explorerNetwork.d.ts.map +1 -0
  64. package/dist/ergo/networks/explorerNetwork.js +127 -0
  65. package/dist/ergo/networks/index.d.ts +3 -0
  66. package/dist/ergo/networks/index.d.ts.map +1 -0
  67. package/dist/ergo/networks/index.js +3 -0
  68. package/dist/ergo/networks/nodeNetwork.d.ts +28 -0
  69. package/dist/ergo/networks/nodeNetwork.d.ts.map +1 -0
  70. package/dist/ergo/networks/nodeNetwork.js +59 -0
  71. package/dist/ergo/utils.d.ts +15 -0
  72. package/dist/ergo/utils.d.ts.map +1 -1
  73. package/dist/ergo/utils.js +34 -1
  74. package/package.json +8 -5
  75. package/dist/ergo/abstractErgoExtractor.d.ts +0 -80
  76. package/dist/ergo/abstractErgoExtractor.d.ts.map +0 -1
  77. package/dist/ergo/abstractErgoExtractor.js +0 -142
  78. package/dist/ergo/abstractErgoExtractorAction.d.ts +0 -89
  79. package/dist/ergo/abstractErgoExtractorAction.d.ts.map +0 -1
  80. package/dist/ergo/abstractErgoExtractorAction.js +0 -219
  81. package/dist/ergo/abstractErgoExtractorEntity.d.ts +0 -11
  82. package/dist/ergo/abstractErgoExtractorEntity.d.ts.map +0 -1
  83. package/dist/ergo/abstractErgoExtractorEntity.js +0 -57
  84. package/dist/ergo/initializable/abstractInitializable.d.ts +0 -48
  85. package/dist/ergo/initializable/abstractInitializable.d.ts.map +0 -1
  86. package/dist/ergo/initializable/abstractInitializable.js +0 -162
  87. package/dist/ergo/initializable/abstractInitializableAction.d.ts +0 -14
  88. package/dist/ergo/initializable/abstractInitializableAction.d.ts.map +0 -1
  89. package/dist/ergo/initializable/abstractInitializableAction.js +0 -16
  90. package/dist/ergo/initializable/index.d.ts +0 -3
  91. package/dist/ergo/initializable/index.d.ts.map +0 -1
  92. package/dist/ergo/initializable/index.js +0 -3
  93. package/dist/ergo/network/abstractNetwork.d.ts +0 -26
  94. package/dist/ergo/network/abstractNetwork.d.ts.map +0 -1
  95. package/dist/ergo/network/abstractNetwork.js +0 -3
  96. package/dist/ergo/network/explorerNetwork.d.ts +0 -74
  97. package/dist/ergo/network/explorerNetwork.d.ts.map +0 -1
  98. package/dist/ergo/network/explorerNetwork.js +0 -185
  99. package/dist/ergo/network/nodeNetwork.d.ts +0 -60
  100. package/dist/ergo/network/nodeNetwork.d.ts.map +0 -1
  101. package/dist/ergo/network/nodeNetwork.js +0 -131
@@ -0,0 +1,64 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Column, PrimaryGeneratedColumn, Unique, } from '@rosen-bridge/extended-typeorm';
11
+ /**
12
+ * Abstract base entity for storing extracted blockchain data.
13
+ *
14
+ * This entity serves as the foundation for all extracted data storage,
15
+ * supporting both box-based and transaction-based extraction patterns.
16
+ * The identifier field can represent different types of blockchain data:
17
+ * - For box-based extractors: boxId (UTXO identifier)
18
+ * - For transaction-based extractors: txId (transaction identifier)
19
+ * - For general extractors: any unique blockchain data identifier
20
+ */
21
+ let AbstractErgoEntity = class AbstractErgoEntity {
22
+ id;
23
+ block;
24
+ height;
25
+ extractor;
26
+ /**
27
+ * Unique identifier for the entity in the blockchain.
28
+ * This can be:
29
+ * - boxId for UTXO-based data (box extractors)
30
+ * - txId for transaction-based data (general extractors)
31
+ * - Any unique blockchain data identifier for custom extractors
32
+ */
33
+ identifier;
34
+ serialized;
35
+ };
36
+ __decorate([
37
+ PrimaryGeneratedColumn(),
38
+ __metadata("design:type", Number)
39
+ ], AbstractErgoEntity.prototype, "id", void 0);
40
+ __decorate([
41
+ Column({ type: 'varchar' }),
42
+ __metadata("design:type", String)
43
+ ], AbstractErgoEntity.prototype, "block", void 0);
44
+ __decorate([
45
+ Column({ type: 'int' }),
46
+ __metadata("design:type", Number)
47
+ ], AbstractErgoEntity.prototype, "height", void 0);
48
+ __decorate([
49
+ Column({ type: 'varchar' }),
50
+ __metadata("design:type", String)
51
+ ], AbstractErgoEntity.prototype, "extractor", void 0);
52
+ __decorate([
53
+ Column({ type: 'varchar' }),
54
+ __metadata("design:type", String)
55
+ ], AbstractErgoEntity.prototype, "identifier", void 0);
56
+ __decorate([
57
+ Column({ type: 'varchar' }),
58
+ __metadata("design:type", String)
59
+ ], AbstractErgoEntity.prototype, "serialized", void 0);
60
+ AbstractErgoEntity = __decorate([
61
+ Unique(['identifier', 'extractor'])
62
+ ], AbstractErgoEntity);
63
+ export { AbstractErgoEntity };
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RFcmdvRW50aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2VyZ28vZGF0YWJhc2UvZW50aXRpZXMvYWJzdHJhY3RFcmdvRW50aXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFDTCxNQUFNLEVBQ04sc0JBQXNCLEVBQ3RCLE1BQU0sR0FDUCxNQUFNLGdDQUFnQyxDQUFDO0FBRXhDOzs7Ozs7Ozs7R0FTRztBQUVJLElBQWUsa0JBQWtCLEdBQWpDLE1BQWUsa0JBQWtCO0lBRXRDLEVBQUUsQ0FBUztJQUdYLEtBQUssQ0FBUztJQUdkLE1BQU0sQ0FBUztJQUdmLFNBQVMsQ0FBUztJQUVsQjs7Ozs7O09BTUc7SUFFSCxVQUFVLENBQVM7SUFHbkIsVUFBVSxDQUFTO0NBQ3BCLENBQUE7QUF2QkM7SUFEQyxzQkFBc0IsRUFBRTs7OENBQ2Q7QUFHWDtJQURDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7aURBQ2Q7QUFHZDtJQURDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7a0RBQ1Q7QUFHZjtJQURDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7cURBQ1Y7QUFVbEI7SUFEQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7O3NEQUNUO0FBR25CO0lBREMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOztzREFDVDtBQXhCQyxrQkFBa0I7SUFEdkMsTUFBTSxDQUFDLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0dBQ2Qsa0JBQWtCLENBeUJ2QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbHVtbixcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgVW5pcXVlLFxufSBmcm9tICdAcm9zZW4tYnJpZGdlL2V4dGVuZGVkLXR5cGVvcm0nO1xuXG4vKipcbiAqIEFic3RyYWN0IGJhc2UgZW50aXR5IGZvciBzdG9yaW5nIGV4dHJhY3RlZCBibG9ja2NoYWluIGRhdGEuXG4gKlxuICogVGhpcyBlbnRpdHkgc2VydmVzIGFzIHRoZSBmb3VuZGF0aW9uIGZvciBhbGwgZXh0cmFjdGVkIGRhdGEgc3RvcmFnZSxcbiAqIHN1cHBvcnRpbmcgYm90aCBib3gtYmFzZWQgYW5kIHRyYW5zYWN0aW9uLWJhc2VkIGV4dHJhY3Rpb24gcGF0dGVybnMuXG4gKiBUaGUgaWRlbnRpZmllciBmaWVsZCBjYW4gcmVwcmVzZW50IGRpZmZlcmVudCB0eXBlcyBvZiBibG9ja2NoYWluIGRhdGE6XG4gKiAtIEZvciBib3gtYmFzZWQgZXh0cmFjdG9yczogYm94SWQgKFVUWE8gaWRlbnRpZmllcilcbiAqIC0gRm9yIHRyYW5zYWN0aW9uLWJhc2VkIGV4dHJhY3RvcnM6IHR4SWQgKHRyYW5zYWN0aW9uIGlkZW50aWZpZXIpXG4gKiAtIEZvciBnZW5lcmFsIGV4dHJhY3RvcnM6IGFueSB1bmlxdWUgYmxvY2tjaGFpbiBkYXRhIGlkZW50aWZpZXJcbiAqL1xuQFVuaXF1ZShbJ2lkZW50aWZpZXInLCAnZXh0cmFjdG9yJ10pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFcmdvRW50aXR5IHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuICBpZDogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndmFyY2hhcicgfSlcbiAgYmxvY2s6IHN0cmluZztcblxuICBAQ29sdW1uKHsgdHlwZTogJ2ludCcgfSlcbiAgaGVpZ2h0OiBudW1iZXI7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICBleHRyYWN0b3I6IHN0cmluZztcblxuICAvKipcbiAgICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBlbnRpdHkgaW4gdGhlIGJsb2NrY2hhaW4uXG4gICAqIFRoaXMgY2FuIGJlOlxuICAgKiAtIGJveElkIGZvciBVVFhPLWJhc2VkIGRhdGEgKGJveCBleHRyYWN0b3JzKVxuICAgKiAtIHR4SWQgZm9yIHRyYW5zYWN0aW9uLWJhc2VkIGRhdGEgKGdlbmVyYWwgZXh0cmFjdG9ycylcbiAgICogLSBBbnkgdW5pcXVlIGJsb2NrY2hhaW4gZGF0YSBpZGVudGlmaWVyIGZvciBjdXN0b20gZXh0cmFjdG9yc1xuICAgKi9cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICBpZGVudGlmaWVyOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICBzZXJpYWxpemVkOiBzdHJpbmc7XG59XG4iXX0=
@@ -0,0 +1,5 @@
1
+ export * from './entities/abstractErgoBoxEntity';
2
+ export * from './entities/abstractErgoEntity';
3
+ export * from './actions/abstractErgoBoxAction';
4
+ export * from './actions/abstractErgoAction';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/ergo/database/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from './entities/abstractErgoBoxEntity';
2
+ export * from './entities/abstractErgoEntity';
3
+ export * from './actions/abstractErgoBoxAction';
4
+ export * from './actions/abstractErgoAction';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZXJnby9kYXRhYmFzZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLDhCQUE4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9lbnRpdGllcy9hYnN0cmFjdEVyZ29Cb3hFbnRpdHknO1xuZXhwb3J0ICogZnJvbSAnLi9lbnRpdGllcy9hYnN0cmFjdEVyZ29FbnRpdHknO1xuZXhwb3J0ICogZnJvbSAnLi9hY3Rpb25zL2Fic3RyYWN0RXJnb0JveEFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL2FjdGlvbnMvYWJzdHJhY3RFcmdvQWN0aW9uJztcbiJdfQ==
@@ -0,0 +1,67 @@
1
+ import { AbstractLogger } from '@rosen-bridge/abstract-logger';
2
+ import { Transaction, BlockInfo, OutputBox, InputExtension } from '@rosen-bridge/scanner-interfaces';
3
+ import { AbstractErgoBoxEntity, AbstractErgoBoxAction } from '../database';
4
+ import { AbstractEntityData, TxExtra, InitializeOptions } from '../interfaces';
5
+ import { AbstractErgoExtractor } from './abstractErgoExtractor';
6
+ /**
7
+ * Abstract Ergo Box Extractor class for box-based data extraction.
8
+ *
9
+ * This class extends the AbstractErgoExtractor class and provides
10
+ * functionality for extracting box-based data from the blockchain.
11
+ *
12
+ * It overrides the `initializeData` method to use the box-based initializer.
13
+ * It implements the `processTransactions` method to use the box-based data extraction.
14
+ *
15
+ * Triggers `Insert` callback on new data insertion.
16
+ * Triggers a new callback type `Spend` for each spent box.
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 AbstractErgoBoxExtractor<ExtractedData extends AbstractEntityData, ExtractorEntity extends AbstractErgoBoxEntity> extends AbstractErgoExtractor<ExtractedData, ExtractorEntity> {
22
+ protected abstract actions: AbstractErgoBoxAction<ExtractedData, ExtractorEntity>;
23
+ constructor(initializeOptions?: InitializeOptions, logger?: AbstractLogger);
24
+ /**
25
+ * extract box data to proper format (not including spending information)
26
+ * @param box
27
+ * @param inputExtensions all input box extensions in transaction
28
+ * @return extracted data in proper format
29
+ */
30
+ abstract extractBoxData: (box: OutputBox, inputExtensions: InputExtension[], txExtra?: TxExtra) => ExtractedData | undefined;
31
+ /**
32
+ * check proper data format in the box
33
+ * @param box
34
+ * @return true if the box has the required data and false otherwise
35
+ */
36
+ abstract hasBoxData: (box: OutputBox) => boolean;
37
+ /**
38
+ * extract transaction extra information
39
+ * override this function if there is extra needed information
40
+ * @param tx
41
+ * @returns
42
+ */
43
+ getTransactionExtraData: (tx: Transaction) => TxExtra;
44
+ /**
45
+ * create spend info array for the transaction
46
+ * @param tx
47
+ * @returns spend info array of the transaction
48
+ */
49
+ getTransactionSpendInfo: (tx: Transaction) => {
50
+ txId: string;
51
+ boxId: string;
52
+ index: number;
53
+ }[];
54
+ /**
55
+ * process a list of transactions in a block and store required information
56
+ * @param txs list of transactions in the block
57
+ * @param block
58
+ * @return true if the process is completed successfully and false otherwise
59
+ */
60
+ processTransactions: (txs: Transaction[], block: BlockInfo) => Promise<boolean>;
61
+ /**
62
+ * initialize extractor database with data created below the initial height
63
+ * @param initialBlock
64
+ */
65
+ initializeData: (initialBlock: BlockInfo) => Promise<void>;
66
+ }
67
+ //# sourceMappingURL=abstractErgoBoxExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstractErgoBoxExtractor.d.ts","sourceRoot":"","sources":["../../../lib/ergo/extractors/abstractErgoBoxExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,EACL,WAAW,EACX,SAAS,EACT,SAAS,EACT,cAAc,EACf,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAE3E,OAAO,EACL,kBAAkB,EAGlB,OAAO,EACP,iBAAiB,EAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE;;;;;;;;;;;;;;GAcG;AACH,8BAAsB,wBAAwB,CAC5C,aAAa,SAAS,kBAAkB,EACxC,eAAe,SAAS,qBAAqB,CAC7C,SAAQ,qBAAqB,CAAC,aAAa,EAAE,eAAe,CAAC;IAC7D,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAC/C,aAAa,EACb,eAAe,CAChB,CAAC;gBAEU,iBAAiB,CAAC,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,cAAc;IAI1E;;;;;OAKG;IACH,QAAQ,CAAC,cAAc,EAAE,CACvB,GAAG,EAAE,SAAS,EACd,eAAe,EAAE,cAAc,EAAE,EACjC,OAAO,CAAC,EAAE,OAAO,KACd,aAAa,GAAG,SAAS,CAAC;IAE/B;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,OAAO,CAAC;IAEjD;;;;;OAKG;IACH,uBAAuB,GACrB,IAAI,WAAW,KACd,OAAO,CAER;IAEF;;;;OAIG;IACH,uBAAuB,GAAI,IAAI,WAAW;;;;QAQxC;IAEF;;;;;OAKG;IACH,mBAAmB,GACjB,KAAK,WAAW,EAAE,EAClB,OAAO,SAAS,KACf,OAAO,CAAC,OAAO,CAAC,CA2DjB;IAEF;;;OAGG;IACH,cAAc,GAAU,cAAc,SAAS,KAAG,OAAO,CAAC,IAAI,CAAC,CAgB7D;CACH"}
@@ -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,53 @@
1
+ import { AbstractLogger } from '@rosen-bridge/abstract-logger';
2
+ import { Transaction } from '@rosen-bridge/scanner-interfaces';
3
+ import { AbstractExtractor } from '../../abstractExtractor';
4
+ import { AbstractErgoEntity, AbstractErgoAction } from '../database';
5
+ import { AbstractEntityData, CallbackType, CallbackMap, CallbackDataMap, InitializeOptions } 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 declare abstract class AbstractErgoExtractor<ExtractedData extends AbstractEntityData, ExtractorEntity extends AbstractErgoEntity> extends AbstractExtractor<Transaction> {
17
+ protected initializeOptions?: InitializeOptions | undefined;
18
+ protected logger: AbstractLogger;
19
+ protected abstract actions: AbstractErgoAction<ExtractedData, ExtractorEntity>;
20
+ protected callbacks: {
21
+ [K in CallbackType]: Map<string, CallbackMap<ExtractedData>[K]>;
22
+ };
23
+ private callbackMutex;
24
+ constructor(initializeOptions?: InitializeOptions | undefined, logger?: AbstractLogger);
25
+ /**
26
+ * hook a new callback on a callback type
27
+ * @param type
28
+ * @param id
29
+ * @param callback
30
+ * @returns callback registered id
31
+ */
32
+ hook: <T extends CallbackType>(type: T, callback: CallbackMap<ExtractedData>[T]) => Promise<string>;
33
+ /**
34
+ * unhook a callback on a type
35
+ * returns false if there is no registered callback with the id
36
+ * @param type
37
+ * @param id
38
+ * @returns success status
39
+ */
40
+ unhook: (type: CallbackType, id: string) => Promise<boolean>;
41
+ /**
42
+ * trigger all callbacks registered on a specific type with the provided data
43
+ * @param type
44
+ * @param data
45
+ */
46
+ protected triggerCallbacks<T extends CallbackType>(type: T, data: CallbackDataMap<ExtractedData>[T]): void;
47
+ /**
48
+ * fork one block and remove all stored information for this block
49
+ * @param hash block hash
50
+ */
51
+ forkBlock: (hash: string) => Promise<void>;
52
+ }
53
+ //# sourceMappingURL=abstractErgoExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstractErgoExtractor.d.ts","sourceRoot":"","sources":["../../../lib/ergo/extractors/abstractErgoExtractor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAE/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,CAAC;IAgBpC,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;CACH"}
@@ -0,0 +1,92 @@
1
+ import { Mutex } from 'await-semaphore';
2
+ import { v4 as uuidv4 } from 'uuid';
3
+ import { DummyLogger } from '@rosen-bridge/abstract-logger';
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
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RFcmdvRXh0cmFjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2VyZ28vZXh0cmFjdG9ycy9hYnN0cmFjdEVyZ29FeHRyYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXBDLE9BQU8sRUFBa0IsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHNUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFNUQsT0FBTyxFQUVMLFlBQVksR0FJYixNQUFNLGVBQWUsQ0FBQztBQUV2Qjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLE9BQWdCLHFCQUdwQixTQUFRLGlCQUE4QjtJQWdCMUI7SUFDQTtJQVpGLFNBQVMsR0FFZjtRQUNGLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksR0FBRyxFQUFFO1FBQ2hDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksR0FBRyxFQUFFO1FBQ2hDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksR0FBRyxFQUFFO1FBQ2hDLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksR0FBRyxFQUFFO0tBQ2hDLENBQUM7SUFDTSxhQUFhLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUVwQyxZQUNZLGlCQUFxQyxFQUNyQyxTQUF5QixJQUFJLFdBQVcsRUFBRTtRQUVwRCxLQUFLLEVBQUUsQ0FBQztRQUhFLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBb0I7UUFDckMsV0FBTSxHQUFOLE1BQU0sQ0FBb0M7SUFHdEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILElBQUksR0FBRyxLQUFLLEVBQ1YsSUFBTyxFQUNQLFFBQXVDLEVBQ3RCLEVBQUU7UUFDbkIsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25ELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsTUFBTSxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDcEIsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDOUIsT0FBTyxFQUFFLENBQUM7UUFDVixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUMsQ0FBQztJQUVGOzs7Ozs7T0FNRztJQUNILE1BQU0sR0FBRyxLQUFLLEVBQUUsSUFBa0IsRUFBRSxFQUFVLEVBQW9CLEVBQUU7UUFDbEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25ELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDZCxxQkFBcUIsRUFBRSxpQ0FBaUMsSUFBSSxJQUFJLENBQ2pFLENBQUM7WUFDRixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8sRUFBRSxDQUFDO1FBQ1YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUM7SUFFRjs7OztPQUlHO0lBQ08sZ0JBQWdCLENBQ3hCLElBQU8sRUFDUCxJQUF1QztRQUV2QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUMvQixJQUFJLENBQUM7Z0JBQ0gsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pCLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNkLHVCQUF1QixJQUFJLG9CQUFvQixJQUFJLGlCQUFpQixDQUFDLEVBQUUsQ0FDeEUsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLEdBQUcsS0FBSyxFQUFFLElBQVksRUFBaUIsRUFBRTtRQUNoRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN0RSxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDL0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2pFLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUMvQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkUsQ0FBQyxDQUFDO0NBQ0giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNdXRleCB9IGZyb20gJ2F3YWl0LXNlbWFwaG9yZSc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcblxuaW1wb3J0IHsgQWJzdHJhY3RMb2dnZXIsIER1bW15TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7IEFic3RyYWN0RXh0cmFjdG9yIH0gZnJvbSAnLi4vLi4vYWJzdHJhY3RFeHRyYWN0b3InO1xuaW1wb3J0IHsgQWJzdHJhY3RFcmdvRW50aXR5LCBBYnN0cmFjdEVyZ29BY3Rpb24gfSBmcm9tICcuLi9kYXRhYmFzZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdEVudGl0eURhdGEsXG4gIENhbGxiYWNrVHlwZSxcbiAgQ2FsbGJhY2tNYXAsXG4gIENhbGxiYWNrRGF0YU1hcCxcbiAgSW5pdGlhbGl6ZU9wdGlvbnMsXG59IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuXG4vKipcbiAqIEFic3RyYWN0IEVyZ28tc3BlY2lmaWMgZXh0cmFjdG9yIHRoYXQgcHJvdmlkZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCBFcmdvIGV4dHJhY3RvcnMuXG4gKlxuICogSXQgcHJvdmlkZXMgY2FsbGJhY2sgc3VwcG9ydCBhbmQgYmxvY2tjaGFpbiBmb3JrIGhhbmRsZSBmb3IgYWxsIGVyZ28gZXh0cmFjdG9ycy5cbiAqXG4gKiBJdCB0cmlnZ2VycyBjYWxsYmFja3MgZm9yIHRoZSBgVXBkYXRlYCBhbmQgYERlbGV0ZWAgYWN0aW9ucyBvbiBhIGZvcmtlZCBibG9jay5cbiAqXG4gKiBAdGVtcGxhdGUgRXh0cmFjdGVkRGF0YSAtIFRoZSB0eXBlIG9mIGRhdGEgZXh0cmFjdGVkIGZyb20gYmxvY2tjaGFpblxuICogQHRlbXBsYXRlIEV4dHJhY3RvckVudGl0eSAtIFRoZSBkYXRhYmFzZSBlbnRpdHkgdHlwZSBmb3Igc3RvcmluZyBleHRyYWN0ZWQgZGF0YVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFcmdvRXh0cmFjdG9yPFxuICBFeHRyYWN0ZWREYXRhIGV4dGVuZHMgQWJzdHJhY3RFbnRpdHlEYXRhLFxuICBFeHRyYWN0b3JFbnRpdHkgZXh0ZW5kcyBBYnN0cmFjdEVyZ29FbnRpdHksXG4+IGV4dGVuZHMgQWJzdHJhY3RFeHRyYWN0b3I8VHJhbnNhY3Rpb24+IHtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGFjdGlvbnM6IEFic3RyYWN0RXJnb0FjdGlvbjxcbiAgICBFeHRyYWN0ZWREYXRhLFxuICAgIEV4dHJhY3RvckVudGl0eVxuICA+O1xuICBwcm90ZWN0ZWQgY2FsbGJhY2tzOiB7XG4gICAgW0sgaW4gQ2FsbGJhY2tUeXBlXTogTWFwPHN0cmluZywgQ2FsbGJhY2tNYXA8RXh0cmFjdGVkRGF0YT5bS10+O1xuICB9ID0ge1xuICAgIFtDYWxsYmFja1R5cGUuVXBkYXRlXTogbmV3IE1hcCgpLFxuICAgIFtDYWxsYmFja1R5cGUuSW5zZXJ0XTogbmV3IE1hcCgpLFxuICAgIFtDYWxsYmFja1R5cGUuRGVsZXRlXTogbmV3IE1hcCgpLFxuICAgIFtDYWxsYmFja1R5cGUuU3BlbmRdOiBuZXcgTWFwKCksXG4gIH07XG4gIHByaXZhdGUgY2FsbGJhY2tNdXRleCA9IG5ldyBNdXRleCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBpbml0aWFsaXplT3B0aW9ucz86IEluaXRpYWxpemVPcHRpb25zLFxuICAgIHByb3RlY3RlZCBsb2dnZXI6IEFic3RyYWN0TG9nZ2VyID0gbmV3IER1bW15TG9nZ2VyKCksXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogaG9vayBhIG5ldyBjYWxsYmFjayBvbiBhIGNhbGxiYWNrIHR5cGVcbiAgICogQHBhcmFtIHR5cGVcbiAgICogQHBhcmFtIGlkXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyBjYWxsYmFjayByZWdpc3RlcmVkIGlkXG4gICAqL1xuICBob29rID0gYXN5bmMgPFQgZXh0ZW5kcyBDYWxsYmFja1R5cGU+KFxuICAgIHR5cGU6IFQsXG4gICAgY2FsbGJhY2s6IENhbGxiYWNrTWFwPEV4dHJhY3RlZERhdGE+W1RdLFxuICApOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgIGNvbnN0IHJlbGVhc2UgPSBhd2FpdCB0aGlzLmNhbGxiYWNrTXV0ZXguYWNxdWlyZSgpO1xuICAgIGNvbnN0IGNhbGxiYWNrTWFwID0gdGhpcy5jYWxsYmFja3NbdHlwZV07XG4gICAgY29uc3QgaWQgPSB1dWlkdjQoKTtcbiAgICBjYWxsYmFja01hcC5zZXQoaWQsIGNhbGxiYWNrKTtcbiAgICByZWxlYXNlKCk7XG4gICAgcmV0dXJuIGlkO1xuICB9O1xuXG4gIC8qKlxuICAgKiB1bmhvb2sgYSBjYWxsYmFjayBvbiBhIHR5cGVcbiAgICogcmV0dXJucyBmYWxzZSBpZiB0aGVyZSBpcyBubyByZWdpc3RlcmVkIGNhbGxiYWNrIHdpdGggdGhlIGlkXG4gICAqIEBwYXJhbSB0eXBlXG4gICAqIEBwYXJhbSBpZFxuICAgKiBAcmV0dXJucyBzdWNjZXNzIHN0YXR1c1xuICAgKi9cbiAgdW5ob29rID0gYXN5bmMgKHR5cGU6IENhbGxiYWNrVHlwZSwgaWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIGNvbnN0IHJlbGVhc2UgPSBhd2FpdCB0aGlzLmNhbGxiYWNrTXV0ZXguYWNxdWlyZSgpO1xuICAgIGNvbnN0IGNhbGxiYWNrTWFwID0gdGhpcy5jYWxsYmFja3NbdHlwZV07XG4gICAgaWYgKCFjYWxsYmFja01hcC5oYXMoaWQpKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICBgQ2FsbGJhY2sgd2l0aCBJZCBbJHtpZH1dIGlzIG5vdCByZWdpc3RlcmVkIGZvciB0eXBlIFske3R5cGV9XS5gLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2FsbGJhY2tNYXAuZGVsZXRlKGlkKTtcbiAgICByZWxlYXNlKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIHRyaWdnZXIgYWxsIGNhbGxiYWNrcyByZWdpc3RlcmVkIG9uIGEgc3BlY2lmaWMgdHlwZSB3aXRoIHRoZSBwcm92aWRlZCBkYXRhXG4gICAqIEBwYXJhbSB0eXBlXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqL1xuICBwcm90ZWN0ZWQgdHJpZ2dlckNhbGxiYWNrczxUIGV4dGVuZHMgQ2FsbGJhY2tUeXBlPihcbiAgICB0eXBlOiBULFxuICAgIGRhdGE6IENhbGxiYWNrRGF0YU1hcDxFeHRyYWN0ZWREYXRhPltUXSxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgY2FsbGJhY2tNYXAgPSB0aGlzLmNhbGxiYWNrc1t0eXBlXTtcbiAgICBjYWxsYmFja01hcC5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY2FsbGJhY2soZGF0YSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgYGNhbGxiYWNrIGZhaWxlZCBmb3IgJHt0eXBlfSBhY3Rpb24gb24gZGF0YSBbJHtkYXRhfV0gd2l0aCBlcnJvcjogJHtlfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogZm9yayBvbmUgYmxvY2sgYW5kIHJlbW92ZSBhbGwgc3RvcmVkIGluZm9ybWF0aW9uIGZvciB0aGlzIGJsb2NrXG4gICAqIEBwYXJhbSBoYXNoIGJsb2NrIGhhc2hcbiAgICovXG4gIGZvcmtCbG9jayA9IGFzeW5jIChoYXNoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFjdGlvbnMuZGVsZXRlQmxvY2tEYXRhKGhhc2gsIHRoaXMuZ2V0SWQoKSk7XG4gICAgaWYgKHJlc3VsdC5kZWxldGVkRGF0YS5sZW5ndGggPiAwKVxuICAgICAgdGhpcy50cmlnZ2VyQ2FsbGJhY2tzKENhbGxiYWNrVHlwZS5EZWxldGUsIHJlc3VsdC5kZWxldGVkRGF0YSk7XG4gICAgaWYgKHJlc3VsdC51cGRhdGVkRGF0YS5sZW5ndGggPiAwKVxuICAgICAgdGhpcy50cmlnZ2VyQ2FsbGJhY2tzKENhbGxiYWNrVHlwZS5VcGRhdGUsIHJlc3VsdC51cGRhdGVkRGF0YSk7XG4gIH07XG59XG4iXX0=
@@ -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) => 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,CAAC,EAAE,EAAE,WAAW,KAAK,aAAa,GAAG,SAAS,CAAC;IAEvE;;;;;;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);
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(`Initializiation for [${this.getId()}] is turned off`);
74
+ };
75
+ }
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RFcmdvVHhFeHRyYWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZXJnby9leHRyYWN0b3JzL2Fic3RyYWN0RXJnb1R4RXh0cmFjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sVUFBVSxNQUFNLDJCQUEyQixDQUFDO0FBSW5ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBRUwsWUFBWSxHQUViLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWhFOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxPQUFnQix1QkFHcEIsU0FBUSxxQkFBcUQ7SUFDN0QsWUFBWSxpQkFBcUMsRUFBRSxNQUF1QjtRQUN4RSxLQUFLLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQW9CRDs7Ozs7OztPQU9HO0lBQ0gsbUJBQW1CLEdBQUcsS0FBSyxFQUN6QixHQUFrQixFQUNsQixLQUFnQixFQUNFLEVBQUU7UUFDcEIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQXlCLEVBQUUsQ0FBQztZQUN6QyxLQUFLLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO29CQUN4QixTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUNBQW1DLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUMvRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLGFBQWEsRUFBRSxDQUFDO29CQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZixrQkFBa0IsVUFBVSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsWUFDbkQsRUFBRSxDQUFDLEVBQ0wsRUFBRSxDQUNILENBQUM7b0JBQ0YsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDOUIsQ0FBQztZQUNILENBQUM7WUFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ3RFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNkLDZCQUE2QixJQUFJLENBQUMsS0FBSyxFQUFFLGlCQUN2QyxLQUFLLENBQUMsTUFDUixFQUFFLENBQ0gsQ0FBQztvQkFDRixPQUFPLEtBQUssQ0FBQztnQkFDZixDQUFDO2dCQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3RELENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLHNDQUFzQyxJQUFJLENBQUMsS0FBSyxFQUFFLGlCQUNoRCxLQUFLLENBQUMsTUFDUixnQkFBZ0IsQ0FBQyxFQUFFLENBQ3BCLENBQUM7WUFDRixJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDL0MsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxDQUFDO0lBRUY7OztPQUdHO0lBQ0gsY0FBYyxHQUFHLEtBQUssRUFBRSxZQUF1QixFQUFpQixFQUFFO1FBQ2hFLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM1RCxNQUFNLFdBQVcsR0FBRyxJQUFJLGVBQWUsQ0FDckMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFDM0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFDMUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFDOUIsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUNaLElBQUksQ0FBQyxtQkFBbUIsRUFDeEIsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLEVBQzFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQ3JDLENBQUM7WUFDRixNQUFNLFdBQVcsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDakQsQ0FBQzs7WUFDQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsSUFBSSxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQzVFLENBQUMsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3RMb2dnZXIgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2Fic3RyYWN0LWxvZ2dlcic7XG5pbXBvcnQgSnNvbkJpZ0ludCBmcm9tICdAcm9zZW4tYnJpZGdlL2pzb24tYmlnaW50JztcbmltcG9ydCB7IEJsb2NrSW5mbywgVHJhbnNhY3Rpb24gfSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7IEFic3RyYWN0RXJnb0VudGl0eSB9IGZyb20gJy4uL2RhdGFiYXNlJztcbmltcG9ydCB7IEVyZ29Jbml0aWFsaXplciB9IGZyb20gJy4uL2luaXRpYWxpemVycyc7XG5pbXBvcnQge1xuICBBYnN0cmFjdEVudGl0eURhdGEsXG4gIENhbGxiYWNrVHlwZSxcbiAgSW5pdGlhbGl6ZU9wdGlvbnMsXG59IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQWJzdHJhY3RFcmdvRXh0cmFjdG9yIH0gZnJvbSAnLi9hYnN0cmFjdEVyZ29FeHRyYWN0b3InO1xuXG4vKipcbiAqIEFic3RyYWN0IEVyZ28gVHggRXh0cmFjdG9yIGNsYXNzIGZvciB0eC1iYXNlZCBkYXRhIGV4dHJhY3Rpb24uXG4gKlxuICogVGhpcyBjbGFzcyBleHRlbmRzIHRoZSBBYnN0cmFjdEVyZ29FeHRyYWN0b3IgY2xhc3MgYW5kIHByb3ZpZGVzXG4gKiBmdW5jdGlvbmFsaXR5IGZvciBleHRyYWN0aW5nIHR4LWJhc2VkIGRhdGEgZnJvbSB0aGUgYmxvY2tjaGFpbi5cbiAqXG4gKiBJdCBpbXBsZW1lbnRzIHRoZSBgaW5pdGlhbGl6ZURhdGFgIG1ldGhvZCB3aXRoIGVyZ28gaW5pdGlhbGl6ZXJzLlxuICogSXQgaW1wbGVtZW50cyB0aGUgYHByb2Nlc3NUcmFuc2FjdGlvbnNgIG1ldGhvZCB0byBleHRyYWN0IGFuZFxuICogc3RvcmUgZGF0YSBmcm9tIHRyYW5zYWN0aW9ucy5cbiAqXG4gKiBUcmlnZ2VycyBgSW5zZXJ0YCBjYWxsYmFjayBvbiBuZXcgZGF0YSBpbnNlcnRpb24uXG4gKlxuICogQHRlbXBsYXRlIEV4dHJhY3RlZERhdGEgLSBUaGUgdHlwZSBvZiBkYXRhIGV4dHJhY3RlZCBmcm9tIGJsb2NrY2hhaW5cbiAqIEB0ZW1wbGF0ZSBFeHRyYWN0b3JFbnRpdHkgLSBUaGUgZGF0YWJhc2UgZW50aXR5IHR5cGUgZm9yIHN0b3JpbmcgZXh0cmFjdGVkIGRhdGFcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RXJnb1R4RXh0cmFjdG9yPFxuICBFeHRyYWN0ZWREYXRhIGV4dGVuZHMgQWJzdHJhY3RFbnRpdHlEYXRhLFxuICBFeHRyYWN0b3JFbnRpdHkgZXh0ZW5kcyBBYnN0cmFjdEVyZ29FbnRpdHksXG4+IGV4dGVuZHMgQWJzdHJhY3RFcmdvRXh0cmFjdG9yPEV4dHJhY3RlZERhdGEsIEV4dHJhY3RvckVudGl0eT4ge1xuICBjb25zdHJ1Y3Rvcihpbml0aWFsaXplT3B0aW9ucz86IEluaXRpYWxpemVPcHRpb25zLCBsb2dnZXI/OiBBYnN0cmFjdExvZ2dlcikge1xuICAgIHN1cGVyKGluaXRpYWxpemVPcHRpb25zLCBsb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgdHJhbnNhY3Rpb24gZGF0YSB0byBwcm9wZXIgZm9ybWF0IChub3QgaW5jbHVkaW5nIHNwZW5kaW5nIGluZm9ybWF0aW9uKS5cbiAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0aGF0IG5lZWQgdHJhbnNhY3Rpb24tYmFzZWQgZXh0cmFjdGlvbi5cbiAgICogQHBhcmFtIHR4IC0gVGhlIHRyYW5zYWN0aW9uIHRvIGV4dHJhY3QgZGF0YSBmcm9tXG4gICAqIEByZXR1cm5zIGV4dHJhY3RlZCBkYXRhIGluIHByb3BlciBmb3JtYXQgb3IgdW5kZWZpbmVkIGlmIG5vIGRhdGEgc2hvdWxkIGJlIGV4dHJhY3RlZFxuICAgKiBAdGhyb3dzIEVycm9yIGlmIG5vdCBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzXG4gICAqL1xuICBhYnN0cmFjdCBleHRyYWN0VHhEYXRhOiAodHg6IFRyYW5zYWN0aW9uKSA9PiBFeHRyYWN0ZWREYXRhIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgdHJhbnNhY3Rpb24gaGFzIHRoZSByZXF1aXJlZCBkYXRhIGZvcm1hdC5cbiAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0aGF0IG5lZWQgdHJhbnNhY3Rpb24tYmFzZWQgZXh0cmFjdGlvbi5cbiAgICogQHBhcmFtIHR4IC0gVGhlIHRyYW5zYWN0aW9uIHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zYWN0aW9uIGhhcyB0aGUgcmVxdWlyZWQgZGF0YSBhbmQgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgbm90IG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NcbiAgICovXG4gIGFic3RyYWN0IGhhc1R4RGF0YTogKHR4OiBUcmFuc2FjdGlvbikgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogUHJvY2VzcyBhIGxpc3Qgb2YgdHJhbnNhY3Rpb25zIGluIGEgYmxvY2sgYW5kIHN0b3JlIHJlcXVpcmVkIGluZm9ybWF0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzIGZvciBjdXN0b20gdHJhbnNhY3Rpb24gcHJvY2Vzc2luZyxcbiAgICogb3IgdGhleSBjYW4gb3ZlcnJpZGUgZXh0cmFjdFR4RGF0YSBhbmQgaGFzVHhEYXRhIG1ldGhvZHMgaW5zdGVhZC5cbiAgICogQHBhcmFtIHR4cyAtIExpc3Qgb2YgdHJhbnNhY3Rpb25zIGluIHRoZSBibG9ja1xuICAgKiBAcGFyYW0gYmxvY2sgLSBCbG9jayBpbmZvcm1hdGlvblxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBwcm9jZXNzIGlzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgYW5kIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgcHJvY2Vzc1RyYW5zYWN0aW9ucyA9IGFzeW5jIChcbiAgICB0eHM6IFRyYW5zYWN0aW9uW10sXG4gICAgYmxvY2s6IEJsb2NrSW5mbyxcbiAgKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHR4c0RhdGE6IEFycmF5PEV4dHJhY3RlZERhdGE+ID0gW107XG4gICAgICBmb3IgKGNvbnN0IHR4IG9mIHR4cykge1xuICAgICAgICBpZiAoIXRoaXMuaGFzVHhEYXRhKHR4KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBUcnlpbmcgdG8gZXh0cmFjdCBkYXRhIGZyb20gdHggWyR7dHguaWR9XWApO1xuICAgICAgICBjb25zdCBleHRyYWN0ZWREYXRhID0gdGhpcy5leHRyYWN0VHhEYXRhKHR4KTtcbiAgICAgICAgaWYgKGV4dHJhY3RlZERhdGEpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBFeHRyYWN0ZWQgZGF0YSAke0pzb25CaWdJbnQuc3RyaW5naWZ5KGV4dHJhY3RlZERhdGEpfSBmcm9tIHR4ICR7XG4gICAgICAgICAgICAgIHR4LmlkXG4gICAgICAgICAgICB9YCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHR4c0RhdGEucHVzaChleHRyYWN0ZWREYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodHhzRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuYWN0aW9ucy5zdG9yZUVudGl0aWVzKHR4c0RhdGEsIGJsb2NrLCB0aGlzLmdldElkKCkpKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgRGF0YSBpbnNlcnRpb24gZmFpbGVkIGZvciAke3RoaXMuZ2V0SWQoKX0gYXQgdGhlIGJsb2NrICR7XG4gICAgICAgICAgICAgIGJsb2NrLmhlaWdodFxuICAgICAgICAgICAgfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50cmlnZ2VyQ2FsbGJhY2tzKENhbGxiYWNrVHlwZS5JbnNlcnQsIHR4c0RhdGEpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICBgUHJvY2Vzc2luZyB0cmFuc2FjdGlvbnMgZmFpbGVkIGZvciAke3RoaXMuZ2V0SWQoKX0gYXQgdGhlIGJsb2NrICR7XG4gICAgICAgICAgYmxvY2suaGVpZ2h0XG4gICAgICAgIH0gd2l0aCBlcnJvcjogJHtlfWAsXG4gICAgICApO1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLnN0YWNrKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBlcnJvciBzdGFjazogJHtlLnN0YWNrfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogaW5pdGlhbGl6ZSBleHRyYWN0b3IgZGF0YWJhc2Ugd2l0aCBkYXRhIGNyZWF0ZWQgYmVsb3cgdGhlIGluaXRpYWwgaGVpZ2h0XG4gICAqIEBwYXJhbSBpbml0aWFsQmxvY2tcbiAgICovXG4gIGluaXRpYWxpemVEYXRhID0gYXN5bmMgKGluaXRpYWxCbG9jazogQmxvY2tJbmZvKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZU9wdGlvbnMgJiYgdGhpcy5pbml0aWFsaXplT3B0aW9ucy5hY3RpdmUpIHtcbiAgICAgIGNvbnN0IGluaXRpYWxpemVyID0gbmV3IEVyZ29Jbml0aWFsaXplcihcbiAgICAgICAgdGhpcy5pbml0aWFsaXplT3B0aW9ucy50eXBlLFxuICAgICAgICB0aGlzLmluaXRpYWxpemVPcHRpb25zLnVybCxcbiAgICAgICAgdGhpcy5pbml0aWFsaXplT3B0aW9ucy5hZGRyZXNzLFxuICAgICAgICB0aGlzLmdldElkKCksXG4gICAgICAgIHRoaXMucHJvY2Vzc1RyYW5zYWN0aW9ucyxcbiAgICAgICAgdGhpcy5hY3Rpb25zLFxuICAgICAgICB0aGlzLmluaXRpYWxpemVPcHRpb25zLm1heFBhcmFsbGVsUmVxdWVzdHMsXG4gICAgICAgIHRoaXMubG9nZ2VyLmNoaWxkKCdFcmdvSW5pdGlhbGl6ZXInKSxcbiAgICAgICk7XG4gICAgICBhd2FpdCBpbml0aWFsaXplci5pbml0aWFsaXplRGF0YShpbml0aWFsQmxvY2spO1xuICAgIH0gZWxzZVxuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgSW5pdGlhbGl6aWF0aW9uIGZvciBbJHt0aGlzLmdldElkKCl9XSBpcyB0dXJuZWQgb2ZmYCk7XG4gIH07XG59XG4iXX0=
@@ -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=