@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,180 @@
1
+ import { difference, pick } from 'lodash-es';
2
+ import { DummyLogger } from '@rosen-bridge/abstract-logger';
3
+ import { In, } from '@rosen-bridge/extended-typeorm';
4
+ import JsonBigInt from '@rosen-bridge/json-bigint';
5
+ export class AbstractErgoAction {
6
+ dataSource;
7
+ repo;
8
+ logger;
9
+ repository;
10
+ constructor(dataSource, repo, logger = new DummyLogger()) {
11
+ this.dataSource = dataSource;
12
+ this.repo = repo;
13
+ this.logger = logger;
14
+ this.repository = this.dataSource.getRepository(repo);
15
+ }
16
+ /**
17
+ * insert entities extracted from a block to database
18
+ * @param queryRunner
19
+ * @param entitiesToInsert
20
+ * @param block
21
+ * @param extractor
22
+ */
23
+ insertEntities = async (queryRunner, entitiesToInsert, block, extractor) => {
24
+ const repository = queryRunner.manager.getRepository(this.repo);
25
+ await repository.insert(this.createEntity(entitiesToInsert, block, extractor));
26
+ };
27
+ /**
28
+ * update an entity in the database
29
+ * @param queryRunner
30
+ * @param updateEntity
31
+ * @param block
32
+ * @param extractor
33
+ */
34
+ updateEntity = async (queryRunner, updatedEntity, block, extractor) => {
35
+ const repository = queryRunner.manager.getRepository(this.repo);
36
+ const entity = this.createEntity([updatedEntity], block, extractor)[0];
37
+ await repository.update({
38
+ identifier: entity.identifier,
39
+ extractor: extractor,
40
+ }, entity);
41
+ };
42
+ /**
43
+ * delete all database records that were created from a specific block
44
+ * @param queryRunner
45
+ * @param extractor
46
+ * @param block
47
+ * @returns
48
+ */
49
+ deleteBlockRecords = async (queryRunner, extractor, block) => {
50
+ const repository = queryRunner.manager.getRepository(this.repo);
51
+ const deletedData = await repository.find({
52
+ where: {
53
+ extractor: extractor,
54
+ block: block,
55
+ },
56
+ });
57
+ await repository.delete({
58
+ extractor: extractor,
59
+ block: block,
60
+ });
61
+ return this.convertEntityToData(deletedData);
62
+ };
63
+ /**
64
+ * override this method to revert the updates made to entities when a block is deleted
65
+ * e.g., mark boxes as unspent, update related entities, etc.
66
+ * @param queryRunner
67
+ * @param extractor
68
+ * @param block
69
+ * @returns
70
+ */
71
+ revertBlockUpdates = async (queryRunner, // eslint-disable-line @typescript-eslint/no-unused-vars
72
+ extractor, // eslint-disable-line @typescript-eslint/no-unused-vars
73
+ block) => {
74
+ return [];
75
+ };
76
+ /**
77
+ * delete extracted data from a specific block
78
+ * if an entity is updated using the data in this block revert the update
79
+ * if an entity is created in this block remove it from database
80
+ * @param block
81
+ * @param extractor
82
+ * @return deleted items and updated entity identifiers
83
+ */
84
+ deleteBlockData = async (block, extractor) => {
85
+ this.logger.info(`Deleting data in block ${block} and extractor ${extractor}`);
86
+ const queryRunner = this.dataSource.createQueryRunner();
87
+ await queryRunner.connect();
88
+ await queryRunner.startTransaction();
89
+ try {
90
+ const updatedData = await this.revertBlockUpdates(queryRunner, extractor, block);
91
+ const deletedData = await this.deleteBlockRecords(queryRunner, extractor, block);
92
+ await queryRunner.commitTransaction();
93
+ this.logger.debug(`Deleted data successfully in block ${block} and extractor ${extractor}`);
94
+ return {
95
+ deletedData,
96
+ updatedData: updatedData.map((data) => pick(data, 'identifier')),
97
+ };
98
+ }
99
+ catch (error) {
100
+ await queryRunner.rollbackTransaction();
101
+ throw error;
102
+ }
103
+ finally {
104
+ await queryRunner.release();
105
+ }
106
+ };
107
+ /**
108
+ * insert all extracted entity data in an atomic transaction
109
+ * update the data if a entity with the same id is already stored in db
110
+ * @param entities
111
+ * @param block
112
+ * @param extractor
113
+ * @return inserted items and updated entity identifiers
114
+ * returns undefined in case of any problem
115
+ */
116
+ storeEntities = async (entities, block, extractor) => {
117
+ this.logger.debug(`Storing entities in block ${block.hash} and ${extractor} extractor`);
118
+ let entitiesToInsert = [], entitiesToUpdate = [];
119
+ const queryRunner = this.dataSource.createQueryRunner();
120
+ await queryRunner.connect();
121
+ await queryRunner.startTransaction();
122
+ try {
123
+ const repository = queryRunner.manager.getRepository(this.repo);
124
+ const dbEntityIdentifiers = (await repository.findBy({
125
+ identifier: In(entities.map((item) => item.identifier)),
126
+ extractor: extractor,
127
+ })).map((entity) => entity.identifier);
128
+ if (dbEntityIdentifiers.length > 0)
129
+ this.logger.debug(`Found stored entities with same identifier`, dbEntityIdentifiers);
130
+ entitiesToUpdate = entities.filter((entity) => dbEntityIdentifiers.includes(entity.identifier));
131
+ entitiesToInsert = difference(entities, entitiesToUpdate);
132
+ if (entitiesToInsert.length > 0) {
133
+ this.logger.debug(`Inserting ${entitiesToInsert.length} new entities to database`);
134
+ await this.insertEntities(queryRunner, entitiesToInsert, block, extractor);
135
+ }
136
+ if (entitiesToUpdate.length > 0)
137
+ this.logger.info(`Updating entities with following Ids in the database: [${entitiesToUpdate
138
+ .map((entity) => entity.identifier)
139
+ .join(', ')}]`);
140
+ for (const entity of entitiesToUpdate) {
141
+ this.logger.debug(`Updating entities in database [${JsonBigInt.stringify(entity)}]`);
142
+ await this.updateEntity(queryRunner, entity, block, extractor);
143
+ }
144
+ await queryRunner.commitTransaction();
145
+ return true;
146
+ }
147
+ catch (e) {
148
+ this.logger.error(`An error occurred during store entities action: ${e}`);
149
+ await queryRunner.rollbackTransaction();
150
+ return false;
151
+ }
152
+ finally {
153
+ await queryRunner.release();
154
+ }
155
+ };
156
+ /**
157
+ * remove all existing data for the extractor
158
+ * @param extractorId
159
+ */
160
+ removeAllData = async (extractorId) => {
161
+ this.logger.debug(`Removing all old data for extractor ${extractorId}`);
162
+ await this.repository.delete({
163
+ extractor: extractorId,
164
+ });
165
+ };
166
+ /**
167
+ * Builds a query that returns used blocks by selecting the `block` column from the `ExtractorEntity` repository,
168
+ * filtered by the provided `extractorId`
169
+ *
170
+ * @param extractorId - Identifier of the extractor
171
+ * @returns A query builder selecting used blocks
172
+ */
173
+ createUsedBlocksQuery = (extractorId) => {
174
+ return this.repository
175
+ .createQueryBuilder('extractorEntity')
176
+ .select('extractorEntity.block', 'block')
177
+ .where('extractorEntity.extractor = :extractorId', { extractorId });
178
+ };
179
+ }
180
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RFcmdvQWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2VyZ28vZGF0YWJhc2UvYWN0aW9ucy9hYnN0cmFjdEVyZ29BY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFN0MsT0FBTyxFQUFrQixXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RSxPQUFPLEVBSUwsRUFBRSxHQUlILE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxVQUFVLE1BQU0sMkJBQTJCLENBQUM7QUFNbkQsTUFBTSxPQUFnQixrQkFBa0I7SUFPakI7SUFDQTtJQUNBO0lBTEYsVUFBVSxDQUE4QjtJQUUzRCxZQUNxQixVQUFzQixFQUN0QixJQUFtQyxFQUNuQyxTQUF5QixJQUFJLFdBQVcsRUFBRTtRQUYxQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLFNBQUksR0FBSixJQUFJLENBQStCO1FBQ25DLFdBQU0sR0FBTixNQUFNLENBQW9DO1FBRTdELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQWtCRDs7Ozs7O09BTUc7SUFDTyxjQUFjLEdBQUcsS0FBSyxFQUM5QixXQUF3QixFQUN4QixnQkFBc0MsRUFDdEMsS0FBZ0IsRUFDaEIsU0FBaUIsRUFDakIsRUFBRTtRQUNGLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRSxNQUFNLFVBQVUsQ0FBQyxNQUFNLENBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBUSxDQUM3RCxDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBRUY7Ozs7OztPQU1HO0lB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QU0sV0FBVyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDeEMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO2dCQUFTLENBQUM7WUFDVCxNQUFNLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUY7OztPQUdHO0lBQ0gsYUFBYSxHQUFHLEtBQUssRUFBRSxXQUFtQixFQUFFLEVBQUU7UUFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsdUNBQXVDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDeEUsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUMzQixTQUFTLEVBQUUsV0FBVztTQUNjLENBQUMsQ0FBQztJQUMxQyxDQUFDLENBQUM7SUFFRjs7Ozs7O09BTUc7SUFDSCxxQkFBcUIsR0FBRyxDQUN0QixXQUFtQixFQUNrQixFQUFFO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLFVBQVU7YUFDbkIsa0JBQWtCLENBQUMsaUJBQWlCLENBQUM7YUFDckMsTUFBTSxDQUFDLHVCQUF1QixFQUFFLE9BQU8sQ0FBQzthQUN4QyxLQUFLLENBQUMsMENBQTBDLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLENBQUMsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGlmZmVyZW5jZSwgcGljayB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbmltcG9ydCB7IEFic3RyYWN0TG9nZ2VyLCBEdW1teUxvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcbmltcG9ydCB7XG4gIERhdGFTb3VyY2UsXG4gIEVudGl0eVRhcmdldCxcbiAgRmluZE9wdGlvbnNXaGVyZSxcbiAgSW4sXG4gIFF1ZXJ5UnVubmVyLFxuICBSZXBvc2l0b3J5LFxuICBTZWxlY3RRdWVyeUJ1aWxkZXIsXG59IGZyb20gJ0Byb3Nlbi1icmlkZ2UvZXh0ZW5kZWQtdHlwZW9ybSc7XG5pbXBvcnQgSnNvbkJpZ0ludCBmcm9tICdAcm9zZW4tYnJpZGdlL2pzb24tYmlnaW50JztcbmltcG9ydCB7IEJsb2NrSW5mbyB9IGZyb20gJ0Byb3Nlbi1icmlkZ2Uvc2Nhbm5lci1pbnRlcmZhY2VzJztcblxuaW1wb3J0IHsgQWJzdHJhY3RFbnRpdHlEYXRhLCBFbnRpdHlJbmZvIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBYnN0cmFjdEVyZ29FbnRpdHkgfSBmcm9tICcuLi9lbnRpdGllcy9hYnN0cmFjdEVyZ29FbnRpdHknO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFcmdvQWN0aW9uPFxuICBFeHRyYWN0ZWREYXRhIGV4dGVuZHMgQWJzdHJhY3RFbnRpdHlEYXRhLFxuICBFeHRyYWN0b3JFbnRpdHkgZXh0ZW5kcyBBYnN0cmFjdEVyZ29FbnRpdHksXG4+IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlcG9zaXRvcnk6IFJlcG9zaXRvcnk8RXh0cmFjdG9yRW50aXR5PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVwbzogRW50aXR5VGFyZ2V0PEV4dHJhY3RvckVudGl0eT4sXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGxvZ2dlcjogQWJzdHJhY3RMb2dnZXIgPSBuZXcgRHVtbXlMb2dnZXIoKSxcbiAgKSB7XG4gICAgdGhpcy5yZXBvc2l0b3J5ID0gdGhpcy5kYXRhU291cmNlLmdldFJlcG9zaXRvcnkocmVwbyk7XG4gIH1cblxuICAvKipcbiAgICogY3JlYXRlIHRoZSBkYXRhYmFzZSBlbnRpdHkgZnJvbSBleHRyYWN0ZWQgZGF0YSBhbmQgYmxvY2sgaW5mb3JtYXRpb25cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjcmVhdGVFbnRpdHk6IChcbiAgICBkYXRhOiBFeHRyYWN0ZWREYXRhW10sXG4gICAgYmxvY2s6IEJsb2NrSW5mbyxcbiAgICBleHRyYWN0b3I6IHN0cmluZyxcbiAgKSA9PiBBcnJheTxPbWl0PEV4dHJhY3RvckVudGl0eSwgJ2lkJz4+O1xuXG4gIC8qKlxuICAgKiBjb252ZXJ0IHRoZSBkYXRhYmFzZSBlbnRpdHkgYmFjayB0byByYXcgZGF0YVxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNvbnZlcnRFbnRpdHlUb0RhdGE6IChcbiAgICBlbnRpdGllczogRXh0cmFjdG9yRW50aXR5W10sXG4gICkgPT4gRXh0cmFjdGVkRGF0YVtdO1xuXG4gIC8qKlxuICAgKiBpbnNlcnQgZW50aXRpZXMgZXh0cmFjdGVkIGZyb20gYSBibG9jayB0byBkYXRhYmFzZVxuICAgKiBAcGFyYW0gcXVlcnlSdW5uZXJcbiAgICogQHBhcmFtIGVudGl0aWVzVG9JbnNlcnRcbiAgICogQHBhcmFtIGJsb2NrXG4gICAqIEBwYXJhbSBleHRyYWN0b3JcbiAgICovXG4gIHByb3RlY3RlZCBpbnNlcnRFbnRpdGllcyA9IGFzeW5jIChcbiAgICBxdWVyeVJ1bm5lcjogUXVlcnlSdW5uZXIsXG4gICAgZW50aXRpZXNUb0luc2VydDogQXJyYXk8RXh0cmFjdGVkRGF0YT4sXG4gICAgYmxvY2s6IEJsb2NrSW5mbyxcbiAgICBleHRyYWN0b3I6IHN0cmluZyxcbiAgKSA9PiB7XG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IHF1ZXJ5UnVubmVyLm1hbmFnZXIuZ2V0UmVwb3NpdG9yeSh0aGlzLnJlcG8pO1xuICAgIGF3YWl0IHJlcG9zaXRvcnkuaW5zZXJ0KFxuICAgICAgdGhpcy5jcmVhdGVFbnRpdHkoZW50aXRpZXNUb0luc2VydCwgYmxvY2ssIGV4dHJhY3RvcikgYXMgYW55LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiB1cGRhdGUgYW4gZW50aXR5IGluIHRoZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0gcXVlcnlSdW5uZXJcbiAgICogQHBhcmFtIHVwZGF0ZUVudGl0eVxuICAgKiBAcGFyYW0gYmxvY2tcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKi9cbiAgcHJvdGVjdGVkIHVwZGF0ZUVudGl0eSA9IGFzeW5jIChcbiAgICBxdWVyeVJ1bm5lcjogUXVlcnlSdW5uZXIsXG4gICAgdXBkYXRlZEVudGl0eTogRXh0cmFjdGVkRGF0YSxcbiAgICBibG9jazogQmxvY2tJbmZvLFxuICAgIGV4dHJhY3Rvcjogc3RyaW5nLFxuICApID0+IHtcbiAgICBjb25zdCByZXBvc2l0b3J5ID0gcXVlcnlSdW5uZXIubWFuYWdlci5nZXRSZXBvc2l0b3J5KHRoaXMucmVwbyk7XG4gICAgY29uc3QgZW50aXR5ID0gdGhpcy5jcmVhdGVFbnRpdHkoW3VwZGF0ZWRFbnRpdHldLCBibG9jaywgZXh0cmFjdG9yKVswXTtcbiAgICBhd2FpdCByZXBvc2l0b3J5LnVwZGF0ZShcbiAgICAgIHtcbiAgICAgICAgaWRlbnRpZmllcjogZW50aXR5LmlkZW50aWZpZXIsXG4gICAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgICAgfSBhcyBGaW5kT3B0aW9uc1doZXJlPEV4dHJhY3RvckVudGl0eT4sXG4gICAgICBlbnRpdHkgYXMgYW55LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBkZWxldGUgYWxsIGRhdGFiYXNlIHJlY29yZHMgdGhhdCB3ZXJlIGNyZWF0ZWQgZnJvbSBhIHNwZWNpZmljIGJsb2NrXG4gICAqIEBwYXJhbSBxdWVyeVJ1bm5lclxuICAgKiBAcGFyYW0gZXh0cmFjdG9yXG4gICAqIEBwYXJhbSBibG9ja1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHJvdGVjdGVkIGRlbGV0ZUJsb2NrUmVjb3JkcyA9IGFzeW5jIChcbiAgICBxdWVyeVJ1bm5lcjogUXVlcnlSdW5uZXIsXG4gICAgZXh0cmFjdG9yOiBzdHJpbmcsXG4gICAgYmxvY2s6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxFeHRyYWN0ZWREYXRhW10+ID0+IHtcbiAgICBjb25zdCByZXBvc2l0b3J5ID0gcXVlcnlSdW5uZXIubWFuYWdlci5nZXRSZXBvc2l0b3J5KHRoaXMucmVwbyk7XG4gICAgY29uc3QgZGVsZXRlZERhdGEgPSBhd2FpdCByZXBvc2l0b3J5LmZpbmQoe1xuICAgICAgd2hlcmU6IHtcbiAgICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgICAgIGJsb2NrOiBibG9jayxcbiAgICAgIH0gYXMgRmluZE9wdGlvbnNXaGVyZTxFeHRyYWN0b3JFbnRpdHk+LFxuICAgIH0pO1xuICAgIGF3YWl0IHJlcG9zaXRvcnkuZGVsZXRlKHtcbiAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgICAgYmxvY2s6IGJsb2NrLFxuICAgIH0gYXMgdW5rbm93biBhcyBGaW5kT3B0aW9uc1doZXJlPEV4dHJhY3RvckVudGl0eT4pO1xuICAgIHJldHVybiB0aGlzLmNvbnZlcnRFbnRpdHlUb0RhdGEoZGVsZXRlZERhdGEpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXZlcnQgdGhlIHVwZGF0ZXMgbWFkZSB0byBlbnRpdGllcyB3aGVuIGEgYmxvY2sgaXMgZGVsZXRlZFxuICAgKiBlLmcuLCBtYXJrIGJveGVzIGFzIHVuc3BlbnQsIHVwZGF0ZSByZWxhdGVkIGVudGl0aWVzLCBldGMuXG4gICAqIEBwYXJhbSBxdWVyeVJ1bm5lclxuICAgKiBAcGFyYW0gZXh0cmFjdG9yXG4gICAqIEBwYXJhbSBibG9ja1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHJvdGVjdGVkIHJldmVydEJsb2NrVXBkYXRlcyA9IGFzeW5jIChcbiAgICBxdWVyeVJ1bm5lcjogUXVlcnlSdW5uZXIsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgZXh0cmFjdG9yOiBzdHJpbmcsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgYmxvY2s6IHN0cmluZywgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgKTogUHJvbWlzZTxFeHRyYWN0b3JFbnRpdHlbXT4gPT4ge1xuICAgIHJldHVybiBbXTtcbiAgfTtcblxuICAvKipcbiAgICogZGVsZXRlIGV4dHJhY3RlZCBkYXRhIGZyb20gYSBzcGVjaWZpYyBibG9ja1xuICAgKiBpZiBhbiBlbnRpdHkgaXMgdXBkYXRlZCB1c2luZyB0aGUgZGF0YSBpbiB0aGlzIGJsb2NrIHJldmVydCB0aGUgdXBkYXRlXG4gICAqIGlmIGFuIGVudGl0eSBpcyBjcmVhdGVkIGluIHRoaXMgYmxvY2sgcmVtb3ZlIGl0IGZyb20gZGF0YWJhc2VcbiAgICogQHBhcmFtIGJsb2NrXG4gICAqIEBwYXJhbSBleHRyYWN0b3JcbiAgICogQHJldHVybiBkZWxldGVkIGl0ZW1zIGFuZCB1cGRhdGVkIGVudGl0eSBpZGVudGlmaWVyc1xuICAgKi9cbiAgZGVsZXRlQmxvY2tEYXRhID0gYXN5bmMgKFxuICAgIGJsb2NrOiBzdHJpbmcsXG4gICAgZXh0cmFjdG9yOiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBkZWxldGVkRGF0YTogRXh0cmFjdGVkRGF0YVtdOyB1cGRhdGVkRGF0YTogRW50aXR5SW5mb1tdIH0+ID0+IHtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgYERlbGV0aW5nIGRhdGEgaW4gYmxvY2sgJHtibG9ja30gYW5kIGV4dHJhY3RvciAke2V4dHJhY3Rvcn1gLFxuICAgICk7XG4gICAgY29uc3QgcXVlcnlSdW5uZXIgPSB0aGlzLmRhdGFTb3VyY2UuY3JlYXRlUXVlcnlSdW5uZXIoKTtcbiAgICBhd2FpdCBxdWVyeVJ1bm5lci5jb25uZWN0KCk7XG4gICAgYXdhaXQgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cGRhdGVkRGF0YSA9IGF3YWl0IHRoaXMucmV2ZXJ0QmxvY2tVcGRhdGVzKFxuICAgICAgICBxdWVyeVJ1bm5lcixcbiAgICAgICAgZXh0cmFjdG9yLFxuICAgICAgICBibG9jayxcbiAgICAgICk7XG4gICAgICBjb25zdCBkZWxldGVkRGF0YSA9IGF3YWl0IHRoaXMuZGVsZXRlQmxvY2tSZWNvcmRzKFxuICAgICAgICBxdWVyeVJ1bm5lcixcbiAgICAgICAgZXh0cmFjdG9yLFxuICAgICAgICBibG9jayxcbiAgICAgICk7XG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpO1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgIGBEZWxldGVkIGRhdGEgc3VjY2Vzc2Z1bGx5IGluIGJsb2NrICR7YmxvY2t9IGFuZCBleHRyYWN0b3IgJHtleHRyYWN0b3J9YCxcbiAgICAgICk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZWxldGVkRGF0YSxcbiAgICAgICAgdXBkYXRlZERhdGE6IHVwZGF0ZWREYXRhLm1hcCgoZGF0YSkgPT4gcGljayhkYXRhLCAnaWRlbnRpZmllcicpKSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yZWxlYXNlKCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBpbnNlcnQgYWxsIGV4dHJhY3RlZCBlbnRpdHkgZGF0YSBpbiBhbiBhdG9taWMgdHJhbnNhY3Rpb25cbiAgICogdXBkYXRlIHRoZSBkYXRhIGlmIGEgZW50aXR5IHdpdGggdGhlIHNhbWUgaWQgaXMgYWxyZWFkeSBzdG9yZWQgaW4gZGJcbiAgICogQHBhcmFtIGVudGl0aWVzXG4gICAqIEBwYXJhbSBibG9ja1xuICAgKiBAcGFyYW0gZXh0cmFjdG9yXG4gICAqIEByZXR1cm4gaW5zZXJ0ZWQgaXRlbXMgYW5kIHVwZGF0ZWQgZW50aXR5IGlkZW50aWZpZXJzXG4gICAqIHJldHVybnMgdW5kZWZpbmVkIGluIGNhc2Ugb2YgYW55IHByb2JsZW1cbiAgICovXG4gIHN0b3JlRW50aXRpZXMgPSBhc3luYyAoXG4gICAgZW50aXRpZXM6IEFycmF5PEV4dHJhY3RlZERhdGE+LFxuICAgIGJsb2NrOiBCbG9ja0luZm8sXG4gICAgZXh0cmFjdG9yOiBzdHJpbmcsXG4gICk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgYFN0b3JpbmcgZW50aXRpZXMgaW4gYmxvY2sgJHtibG9jay5oYXNofSBhbmQgJHtleHRyYWN0b3J9IGV4dHJhY3RvcmAsXG4gICAgKTtcbiAgICBsZXQgZW50aXRpZXNUb0luc2VydDogRXh0cmFjdGVkRGF0YVtdID0gW10sXG4gICAgICBlbnRpdGllc1RvVXBkYXRlOiBFeHRyYWN0ZWREYXRhW10gPSBbXTtcbiAgICBjb25zdCBxdWVyeVJ1bm5lciA9IHRoaXMuZGF0YVNvdXJjZS5jcmVhdGVRdWVyeVJ1bm5lcigpO1xuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbm5lY3QoKTtcbiAgICBhd2FpdCBxdWVyeVJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBxdWVyeVJ1bm5lci5tYW5hZ2VyLmdldFJlcG9zaXRvcnkodGhpcy5yZXBvKTtcbiAgICAgIGNvbnN0IGRiRW50aXR5SWRlbnRpZmllcnMgPSAoXG4gICAgICAgIGF3YWl0IHJlcG9zaXRvcnkuZmluZEJ5KHtcbiAgICAgICAgICBpZGVudGlmaWVyOiBJbihlbnRpdGllcy5tYXAoKGl0ZW0pID0+IGl0ZW0uaWRlbnRpZmllcikpLFxuICAgICAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgICAgICB9IGFzIEZpbmRPcHRpb25zV2hlcmU8RXh0cmFjdG9yRW50aXR5PilcbiAgICAgICkubWFwKChlbnRpdHkpID0+IGVudGl0eS5pZGVudGlmaWVyKTtcbiAgICAgIGlmIChkYkVudGl0eUlkZW50aWZpZXJzLmxlbmd0aCA+IDApXG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIGBGb3VuZCBzdG9yZWQgZW50aXRpZXMgd2l0aCBzYW1lIGlkZW50aWZpZXJgLFxuICAgICAgICAgIGRiRW50aXR5SWRlbnRpZmllcnMsXG4gICAgICAgICk7XG5cbiAgICAgIGVudGl0aWVzVG9VcGRhdGUgPSBlbnRpdGllcy5maWx0ZXIoKGVudGl0eSkgPT5cbiAgICAgICAgZGJFbnRpdHlJZGVudGlmaWVycy5pbmNsdWRlcyhlbnRpdHkuaWRlbnRpZmllciksXG4gICAgICApO1xuICAgICAgZW50aXRpZXNUb0luc2VydCA9IGRpZmZlcmVuY2UoZW50aXRpZXMsIGVudGl0aWVzVG9VcGRhdGUpO1xuXG4gICAgICBpZiAoZW50aXRpZXNUb0luc2VydC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIGBJbnNlcnRpbmcgJHtlbnRpdGllc1RvSW5zZXJ0Lmxlbmd0aH0gbmV3IGVudGl0aWVzIHRvIGRhdGFiYXNlYCxcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pbnNlcnRFbnRpdGllcyhcbiAgICAgICAgICBxdWVyeVJ1bm5lcixcbiAgICAgICAgICBlbnRpdGllc1RvSW5zZXJ0LFxuICAgICAgICAgIGJsb2NrLFxuICAgICAgICAgIGV4dHJhY3RvcixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChlbnRpdGllc1RvVXBkYXRlLmxlbmd0aCA+IDApXG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgICAgYFVwZGF0aW5nIGVudGl0aWVzIHdpdGggZm9sbG93aW5nIElkcyBpbiB0aGUgZGF0YWJhc2U6IFske2VudGl0aWVzVG9VcGRhdGVcbiAgICAgICAgICAgIC5tYXAoKGVudGl0eSkgPT4gZW50aXR5LmlkZW50aWZpZXIpXG4gICAgICAgICAgICAuam9pbignLCAnKX1dYCxcbiAgICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgZW50aXR5IG9mIGVudGl0aWVzVG9VcGRhdGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgYFVwZGF0aW5nIGVudGl0aWVzIGluIGRhdGFiYXNlIFske0pzb25CaWdJbnQuc3RyaW5naWZ5KGVudGl0eSl9XWAsXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlRW50aXR5KHF1ZXJ5UnVubmVyLCBlbnRpdHksIGJsb2NrLCBleHRyYWN0b3IpO1xuICAgICAgfVxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgc3RvcmUgZW50aXRpZXMgYWN0aW9uOiAke2V9YCk7XG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJlbGVhc2UoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIHJlbW92ZSBhbGwgZXhpc3RpbmcgZGF0YSBmb3IgdGhlIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gZXh0cmFjdG9ySWRcbiAgICovXG4gIHJlbW92ZUFsbERhdGEgPSBhc3luYyAoZXh0cmFjdG9ySWQ6IHN0cmluZykgPT4ge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBSZW1vdmluZyBhbGwgb2xkIGRhdGEgZm9yIGV4dHJhY3RvciAke2V4dHJhY3RvcklkfWApO1xuICAgIGF3YWl0IHRoaXMucmVwb3NpdG9yeS5kZWxldGUoe1xuICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3JJZCxcbiAgICB9IGFzIEZpbmRPcHRpb25zV2hlcmU8RXh0cmFjdG9yRW50aXR5Pik7XG4gIH07XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHF1ZXJ5IHRoYXQgcmV0dXJucyB1c2VkIGJsb2NrcyBieSBzZWxlY3RpbmcgdGhlIGBibG9ja2AgY29sdW1uIGZyb20gdGhlIGBFeHRyYWN0b3JFbnRpdHlgIHJlcG9zaXRvcnksXG4gICAqIGZpbHRlcmVkIGJ5IHRoZSBwcm92aWRlZCBgZXh0cmFjdG9ySWRgXG4gICAqXG4gICAqIEBwYXJhbSBleHRyYWN0b3JJZCAtIElkZW50aWZpZXIgb2YgdGhlIGV4dHJhY3RvclxuICAgKiBAcmV0dXJucyBBIHF1ZXJ5IGJ1aWxkZXIgc2VsZWN0aW5nIHVzZWQgYmxvY2tzXG4gICAqL1xuICBjcmVhdGVVc2VkQmxvY2tzUXVlcnkgPSAoXG4gICAgZXh0cmFjdG9ySWQ6IHN0cmluZyxcbiAgKTogU2VsZWN0UXVlcnlCdWlsZGVyPEV4dHJhY3RvckVudGl0eT4gPT4ge1xuICAgIHJldHVybiB0aGlzLnJlcG9zaXRvcnlcbiAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoJ2V4dHJhY3RvckVudGl0eScpXG4gICAgICAuc2VsZWN0KCdleHRyYWN0b3JFbnRpdHkuYmxvY2snLCAnYmxvY2snKVxuICAgICAgLndoZXJlKCdleHRyYWN0b3JFbnRpdHkuZXh0cmFjdG9yID0gOmV4dHJhY3RvcklkJywgeyBleHRyYWN0b3JJZCB9KTtcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,31 @@
1
+ import { AbstractLogger } from '@rosen-bridge/abstract-logger';
2
+ import { DataSource, EntityTarget, QueryRunner } from '@rosen-bridge/extended-typeorm';
3
+ import { BlockInfo } from '@rosen-bridge/scanner-interfaces';
4
+ import { AbstractEntityData, EntityInfo, SpendInfo } from '../../interfaces';
5
+ import { AbstractErgoBoxEntity } from '../entities/abstractErgoBoxEntity';
6
+ import { AbstractErgoAction } from './abstractErgoAction';
7
+ export declare abstract class AbstractErgoBoxAction<ExtractedData extends AbstractEntityData, ExtractorEntity extends AbstractErgoBoxEntity> extends AbstractErgoAction<ExtractedData, ExtractorEntity> {
8
+ constructor(dataSource: DataSource, repo: EntityTarget<ExtractorEntity>, logger?: AbstractLogger);
9
+ /**
10
+ * revert the spending updates when a block is deleted
11
+ * remove spending information of boxes that are spent in the block
12
+ * @param queryRunner
13
+ * @param extractor
14
+ * @param block
15
+ * @returns
16
+ */
17
+ protected revertBlockUpdates: (queryRunner: QueryRunner, extractor: string, block: string) => Promise<ExtractorEntity[]>;
18
+ /**
19
+ * update spending information of stored boxes
20
+ * chunk spendInfos to prevent large database queries
21
+ * Note: It only updates the spendHeight and spendBlock fields. If updating
22
+ * anything else is required, override this implementation to include the
23
+ * additional fields.
24
+ * @param spendInfos
25
+ * @param block
26
+ * @param extractor
27
+ * @returns spent box ids
28
+ */
29
+ updateSpendingInfo: (spendInfos: Array<SpendInfo>, block: BlockInfo, extractor: string) => Promise<EntityInfo[]>;
30
+ }
31
+ //# sourceMappingURL=abstractErgoBoxAction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstractErgoBoxAction.d.ts","sourceRoot":"","sources":["../../../../lib/ergo/database/actions/abstractErgoBoxAction.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EACL,UAAU,EAGV,YAAY,EAEZ,WAAW,EACZ,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAG7D,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,8BAAsB,qBAAqB,CACzC,aAAa,SAAS,kBAAkB,EACxC,eAAe,SAAS,qBAAqB,CAC7C,SAAQ,kBAAkB,CAAC,aAAa,EAAE,eAAe,CAAC;gBAExD,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,YAAY,CAAC,eAAe,CAAC,EACnC,MAAM,CAAC,EAAE,cAAc;IAKzB;;;;;;;OAOG;IACH,SAAS,CAAC,kBAAkB,GAC1B,aAAa,WAAW,EACxB,WAAW,MAAM,EACjB,OAAO,MAAM,KACZ,OAAO,CAAC,eAAe,EAAE,CAAC,CAoB3B;IAEF;;;;;;;;;;OAUG;IACH,kBAAkB,GAChB,YAAY,KAAK,CAAC,SAAS,CAAC,EAC5B,OAAO,SAAS,EAChB,WAAW,MAAM,KAChB,OAAO,CAAC,UAAU,EAAE,CAAC,CA4BtB;CACH"}
@@ -0,0 +1,70 @@
1
+ import { chunk, pick } from 'lodash-es';
2
+ import { In, Not, } from '@rosen-bridge/extended-typeorm';
3
+ import { DB_CHUNK_SIZE } from '../../../constants';
4
+ import { AbstractErgoAction } from './abstractErgoAction';
5
+ export class AbstractErgoBoxAction extends AbstractErgoAction {
6
+ constructor(dataSource, repo, logger) {
7
+ super(dataSource, repo, logger);
8
+ }
9
+ /**
10
+ * revert the spending updates when a block is deleted
11
+ * remove spending information of boxes that are spent in the block
12
+ * @param queryRunner
13
+ * @param extractor
14
+ * @param block
15
+ * @returns
16
+ */
17
+ revertBlockUpdates = async (queryRunner, extractor, block) => {
18
+ const repository = queryRunner.manager.getRepository(this.repo);
19
+ const updatedData = await repository.find({
20
+ where: {
21
+ extractor: extractor,
22
+ spendBlock: block,
23
+ block: Not(block),
24
+ },
25
+ });
26
+ await repository.update({
27
+ spendBlock: block,
28
+ extractor: extractor,
29
+ }, {
30
+ spendBlock: null,
31
+ spendHeight: null,
32
+ });
33
+ return updatedData;
34
+ };
35
+ /**
36
+ * update spending information of stored boxes
37
+ * chunk spendInfos to prevent large database queries
38
+ * Note: It only updates the spendHeight and spendBlock fields. If updating
39
+ * anything else is required, override this implementation to include the
40
+ * additional fields.
41
+ * @param spendInfos
42
+ * @param block
43
+ * @param extractor
44
+ * @returns spent box ids
45
+ */
46
+ updateSpendingInfo = async (spendInfos, block, extractor) => {
47
+ const spentData = [];
48
+ const spendInfoChunks = chunk(spendInfos, DB_CHUNK_SIZE);
49
+ for (const spendInfoChunk of spendInfoChunks) {
50
+ const boxIds = spendInfoChunk.map((info) => info.boxId);
51
+ const updateResult = await this.repository.update({
52
+ identifier: In(boxIds),
53
+ extractor: extractor,
54
+ }, {
55
+ spendBlock: block.hash,
56
+ spendHeight: block.height,
57
+ });
58
+ if (updateResult.affected && updateResult.affected > 0) {
59
+ const spentRows = await this.repository.findBy({
60
+ identifier: In(boxIds),
61
+ spendBlock: block.hash,
62
+ });
63
+ spentData.push(...spentRows);
64
+ this.logger.debug(`Spent boxes with boxId ${spentRows.map((row) => row.identifier)} at height ${block.height}`);
65
+ }
66
+ }
67
+ return spentData.map((data) => pick(data, 'identifier'));
68
+ };
69
+ }
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RFcmdvQm94QWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2VyZ28vZGF0YWJhc2UvYWN0aW9ucy9hYnN0cmFjdEVyZ29Cb3hBY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHeEMsT0FBTyxFQUVMLEVBQUUsRUFDRixHQUFHLEdBSUosTUFBTSxnQ0FBZ0MsQ0FBQztBQUd4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFMUQsTUFBTSxPQUFnQixxQkFHcEIsU0FBUSxrQkFBa0Q7SUFDMUQsWUFDRSxVQUFzQixFQUN0QixJQUFtQyxFQUNuQyxNQUF1QjtRQUV2QixLQUFLLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNPLGtCQUFrQixHQUFHLEtBQUssRUFDbEMsV0FBd0IsRUFDeEIsU0FBaUIsRUFDakIsS0FBYSxFQUNlLEVBQUU7UUFDOUIsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sV0FBVyxHQUFHLE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQztZQUN4QyxLQUFLLEVBQUU7Z0JBQ0wsU0FBUyxFQUFFLFNBQVM7Z0JBQ3BCLFVBQVUsRUFBRSxLQUFLO2dCQUNqQixLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQzthQUM4QjtTQUNsRCxDQUFDLENBQUM7UUFDSCxNQUFNLFVBQVUsQ0FBQyxNQUFNLENBQ3JCO1lBQ0UsVUFBVSxFQUFFLEtBQUs7WUFDakIsU0FBUyxFQUFFLFNBQVM7U0FDMkIsRUFDakQ7WUFDRSxVQUFVLEVBQUUsSUFBSTtZQUNoQixXQUFXLEVBQUUsSUFBSTtTQUNYLENBQ1QsQ0FBQztRQUNGLE9BQU8sV0FBMkMsQ0FBQztJQUNyRCxDQUFDLENBQUM7SUFFRjs7Ozs7Ozs7OztPQVVHO0lBQ0gsa0JBQWtCLEdBQUcsS0FBSyxFQUN4QixVQUE0QixFQUM1QixLQUFnQixFQUNoQixTQUFpQixFQUNNLEVBQUU7UUFDekIsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDekQsS0FBSyxNQUFNLGNBQWMsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUM3QyxNQUFNLE1BQU0sR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEQsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FDL0M7Z0JBQ0UsVUFBVSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUM7Z0JBQ3RCLFNBQVMsRUFBRSxTQUFTO2FBQ2dCLEVBQ3RDO2dCQUNFLFVBQVUsRUFBRSxLQUFLLENBQUMsSUFBSTtnQkFDdEIsV0FBVyxFQUFFLEtBQUssQ0FBQyxNQUFNO2FBQ25CLENBQ1QsQ0FBQztZQUVGLElBQUksWUFBWSxDQUFDLFFBQVEsSUFBSSxZQUFZLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN2RCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO29CQUM3QyxVQUFVLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQztvQkFDdEIsVUFBVSxFQUFFLEtBQUssQ0FBQyxJQUFJO2lCQUNjLENBQUMsQ0FBQztnQkFDeEMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO2dCQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZiwwQkFBMEIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxjQUFjLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FDN0YsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQyxDQUFDO0NBQ0giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjaHVuaywgcGljayB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbmltcG9ydCB7IEFic3RyYWN0TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHtcbiAgRGF0YVNvdXJjZSxcbiAgSW4sXG4gIE5vdCxcbiAgRW50aXR5VGFyZ2V0LFxuICBGaW5kT3B0aW9uc1doZXJlLFxuICBRdWVyeVJ1bm5lcixcbn0gZnJvbSAnQHJvc2VuLWJyaWRnZS9leHRlbmRlZC10eXBlb3JtJztcbmltcG9ydCB7IEJsb2NrSW5mbyB9IGZyb20gJ0Byb3Nlbi1icmlkZ2Uvc2Nhbm5lci1pbnRlcmZhY2VzJztcblxuaW1wb3J0IHsgREJfQ0hVTktfU0laRSB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBBYnN0cmFjdEVudGl0eURhdGEsIEVudGl0eUluZm8sIFNwZW5kSW5mbyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQWJzdHJhY3RFcmdvQm94RW50aXR5IH0gZnJvbSAnLi4vZW50aXRpZXMvYWJzdHJhY3RFcmdvQm94RW50aXR5JztcbmltcG9ydCB7IEFic3RyYWN0RXJnb0FjdGlvbiB9IGZyb20gJy4vYWJzdHJhY3RFcmdvQWN0aW9uJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RXJnb0JveEFjdGlvbjxcbiAgRXh0cmFjdGVkRGF0YSBleHRlbmRzIEFic3RyYWN0RW50aXR5RGF0YSxcbiAgRXh0cmFjdG9yRW50aXR5IGV4dGVuZHMgQWJzdHJhY3RFcmdvQm94RW50aXR5LFxuPiBleHRlbmRzIEFic3RyYWN0RXJnb0FjdGlvbjxFeHRyYWN0ZWREYXRhLCBFeHRyYWN0b3JFbnRpdHk+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICByZXBvOiBFbnRpdHlUYXJnZXQ8RXh0cmFjdG9yRW50aXR5PixcbiAgICBsb2dnZXI/OiBBYnN0cmFjdExvZ2dlcixcbiAgKSB7XG4gICAgc3VwZXIoZGF0YVNvdXJjZSwgcmVwbywgbG9nZ2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXZlcnQgdGhlIHNwZW5kaW5nIHVwZGF0ZXMgd2hlbiBhIGJsb2NrIGlzIGRlbGV0ZWRcbiAgICogcmVtb3ZlIHNwZW5kaW5nIGluZm9ybWF0aW9uIG9mIGJveGVzIHRoYXQgYXJlIHNwZW50IGluIHRoZSBibG9ja1xuICAgKiBAcGFyYW0gcXVlcnlSdW5uZXJcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gYmxvY2tcbiAgICogQHJldHVybnNcbiAgICovXG4gIHByb3RlY3RlZCByZXZlcnRCbG9ja1VwZGF0ZXMgPSBhc3luYyAoXG4gICAgcXVlcnlSdW5uZXI6IFF1ZXJ5UnVubmVyLFxuICAgIGV4dHJhY3Rvcjogc3RyaW5nLFxuICAgIGJsb2NrOiBzdHJpbmcsXG4gICk6IFByb21pc2U8RXh0cmFjdG9yRW50aXR5W10+ID0+IHtcbiAgICBjb25zdCByZXBvc2l0b3J5ID0gcXVlcnlSdW5uZXIubWFuYWdlci5nZXRSZXBvc2l0b3J5KHRoaXMucmVwbyk7XG4gICAgY29uc3QgdXBkYXRlZERhdGEgPSBhd2FpdCByZXBvc2l0b3J5LmZpbmQoe1xuICAgICAgd2hlcmU6IHtcbiAgICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgICAgIHNwZW5kQmxvY2s6IGJsb2NrLFxuICAgICAgICBibG9jazogTm90KGJsb2NrKSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBGaW5kT3B0aW9uc1doZXJlPEV4dHJhY3RvckVudGl0eT4sXG4gICAgfSk7XG4gICAgYXdhaXQgcmVwb3NpdG9yeS51cGRhdGUoXG4gICAgICB7XG4gICAgICAgIHNwZW5kQmxvY2s6IGJsb2NrLFxuICAgICAgICBleHRyYWN0b3I6IGV4dHJhY3RvcixcbiAgICAgIH0gYXMgdW5rbm93biBhcyBGaW5kT3B0aW9uc1doZXJlPEV4dHJhY3RvckVudGl0eT4sXG4gICAgICB7XG4gICAgICAgIHNwZW5kQmxvY2s6IG51bGwsXG4gICAgICAgIHNwZW5kSGVpZ2h0OiBudWxsLFxuICAgICAgfSBhcyBhbnksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICk7XG4gICAgcmV0dXJuIHVwZGF0ZWREYXRhIGFzIHVua25vd24gYXMgRXh0cmFjdG9yRW50aXR5W107XG4gIH07XG5cbiAgLyoqXG4gICAqIHVwZGF0ZSBzcGVuZGluZyBpbmZvcm1hdGlvbiBvZiBzdG9yZWQgYm94ZXNcbiAgICogY2h1bmsgc3BlbmRJbmZvcyB0byBwcmV2ZW50IGxhcmdlIGRhdGFiYXNlIHF1ZXJpZXNcbiAgICogTm90ZTogSXQgb25seSB1cGRhdGVzIHRoZSBzcGVuZEhlaWdodCBhbmQgc3BlbmRCbG9jayBmaWVsZHMuIElmIHVwZGF0aW5nXG4gICAqIGFueXRoaW5nIGVsc2UgaXMgcmVxdWlyZWQsIG92ZXJyaWRlIHRoaXMgaW1wbGVtZW50YXRpb24gdG8gaW5jbHVkZSB0aGVcbiAgICogYWRkaXRpb25hbCBmaWVsZHMuXG4gICAqIEBwYXJhbSBzcGVuZEluZm9zXG4gICAqIEBwYXJhbSBibG9ja1xuICAgKiBAcGFyYW0gZXh0cmFjdG9yXG4gICAqIEByZXR1cm5zIHNwZW50IGJveCBpZHNcbiAgICovXG4gIHVwZGF0ZVNwZW5kaW5nSW5mbyA9IGFzeW5jIChcbiAgICBzcGVuZEluZm9zOiBBcnJheTxTcGVuZEluZm8+LFxuICAgIGJsb2NrOiBCbG9ja0luZm8sXG4gICAgZXh0cmFjdG9yOiBzdHJpbmcsXG4gICk6IFByb21pc2U8RW50aXR5SW5mb1tdPiA9PiB7XG4gICAgY29uc3Qgc3BlbnREYXRhID0gW107XG4gICAgY29uc3Qgc3BlbmRJbmZvQ2h1bmtzID0gY2h1bmsoc3BlbmRJbmZvcywgREJfQ0hVTktfU0laRSk7XG4gICAgZm9yIChjb25zdCBzcGVuZEluZm9DaHVuayBvZiBzcGVuZEluZm9DaHVua3MpIHtcbiAgICAgIGNvbnN0IGJveElkcyA9IHNwZW5kSW5mb0NodW5rLm1hcCgoaW5mbykgPT4gaW5mby5ib3hJZCk7XG4gICAgICBjb25zdCB1cGRhdGVSZXN1bHQgPSBhd2FpdCB0aGlzLnJlcG9zaXRvcnkudXBkYXRlKFxuICAgICAgICB7XG4gICAgICAgICAgaWRlbnRpZmllcjogSW4oYm94SWRzKSxcbiAgICAgICAgICBleHRyYWN0b3I6IGV4dHJhY3RvcixcbiAgICAgICAgfSBhcyBGaW5kT3B0aW9uc1doZXJlPEV4dHJhY3RvckVudGl0eT4sXG4gICAgICAgIHtcbiAgICAgICAgICBzcGVuZEJsb2NrOiBibG9jay5oYXNoLFxuICAgICAgICAgIHNwZW5kSGVpZ2h0OiBibG9jay5oZWlnaHQsXG4gICAgICAgIH0gYXMgYW55LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICk7XG5cbiAgICAgIGlmICh1cGRhdGVSZXN1bHQuYWZmZWN0ZWQgJiYgdXBkYXRlUmVzdWx0LmFmZmVjdGVkID4gMCkge1xuICAgICAgICBjb25zdCBzcGVudFJvd3MgPSBhd2FpdCB0aGlzLnJlcG9zaXRvcnkuZmluZEJ5KHtcbiAgICAgICAgICBpZGVudGlmaWVyOiBJbihib3hJZHMpLFxuICAgICAgICAgIHNwZW5kQmxvY2s6IGJsb2NrLmhhc2gsXG4gICAgICAgIH0gYXMgRmluZE9wdGlvbnNXaGVyZTxFeHRyYWN0b3JFbnRpdHk+KTtcbiAgICAgICAgc3BlbnREYXRhLnB1c2goLi4uc3BlbnRSb3dzKTtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgYFNwZW50IGJveGVzIHdpdGggYm94SWQgJHtzcGVudFJvd3MubWFwKChyb3cpID0+IHJvdy5pZGVudGlmaWVyKX0gYXQgaGVpZ2h0ICR7YmxvY2suaGVpZ2h0fWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzcGVudERhdGEubWFwKChkYXRhKSA9PiBwaWNrKGRhdGEsICdpZGVudGlmaWVyJykpO1xuICB9O1xufVxuIl19
@@ -0,0 +1,18 @@
1
+ import { AbstractErgoEntity } from './abstractErgoEntity';
2
+ /**
3
+ * Box entity for UTXO-based data extraction.
4
+ *
5
+ * This entity extends the base AbstractErgoEntity with box-specific fields
6
+ * for tracking UTXO spending states.
7
+ */
8
+ export declare abstract class AbstractErgoBoxEntity extends AbstractErgoEntity {
9
+ /**
10
+ * Block hash where this box was spent (null if unspent).
11
+ */
12
+ spendBlock?: string | null;
13
+ /**
14
+ * Block height where this box was spent (null if unspent).
15
+ */
16
+ spendHeight?: number | null;
17
+ }
18
+ //# sourceMappingURL=abstractErgoBoxEntity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstractErgoBoxEntity.d.ts","sourceRoot":"","sources":["../../../../lib/ergo/database/entities/abstractErgoBoxEntity.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;;;GAKG;AACH,8BAAsB,qBAAsB,SAAQ,kBAAkB;IACpE;;OAEG;IAEH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3B;;OAEG;IAEH,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B"}
@@ -0,0 +1,36 @@
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 } from '@rosen-bridge/extended-typeorm';
11
+ import { AbstractErgoEntity } from './abstractErgoEntity';
12
+ /**
13
+ * Box entity for UTXO-based data extraction.
14
+ *
15
+ * This entity extends the base AbstractErgoEntity with box-specific fields
16
+ * for tracking UTXO spending states.
17
+ */
18
+ export class AbstractErgoBoxEntity extends AbstractErgoEntity {
19
+ /**
20
+ * Block hash where this box was spent (null if unspent).
21
+ */
22
+ spendBlock;
23
+ /**
24
+ * Block height where this box was spent (null if unspent).
25
+ */
26
+ spendHeight;
27
+ }
28
+ __decorate([
29
+ Column({ nullable: true, type: 'varchar' }),
30
+ __metadata("design:type", Object)
31
+ ], AbstractErgoBoxEntity.prototype, "spendBlock", void 0);
32
+ __decorate([
33
+ Column({ nullable: true, type: 'int' }),
34
+ __metadata("design:type", Object)
35
+ ], AbstractErgoBoxEntity.prototype, "spendHeight", void 0);
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RFcmdvQm94RW50aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2VyZ28vZGF0YWJhc2UvZW50aXRpZXMvYWJzdHJhY3RFcmdvQm94RW50aXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV4RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUxRDs7Ozs7R0FLRztBQUNILE1BQU0sT0FBZ0IscUJBQXNCLFNBQVEsa0JBQWtCO0lBQ3BFOztPQUVHO0lBRUgsVUFBVSxDQUFpQjtJQUUzQjs7T0FFRztJQUVILFdBQVcsQ0FBaUI7Q0FDN0I7QUFQQztJQURDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOzt5REFDakI7QUFNM0I7SUFEQyxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7MERBQ1oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb2x1bW4gfSBmcm9tICdAcm9zZW4tYnJpZGdlL2V4dGVuZGVkLXR5cGVvcm0nO1xuXG5pbXBvcnQgeyBBYnN0cmFjdEVyZ29FbnRpdHkgfSBmcm9tICcuL2Fic3RyYWN0RXJnb0VudGl0eSc7XG5cbi8qKlxuICogQm94IGVudGl0eSBmb3IgVVRYTy1iYXNlZCBkYXRhIGV4dHJhY3Rpb24uXG4gKlxuICogVGhpcyBlbnRpdHkgZXh0ZW5kcyB0aGUgYmFzZSBBYnN0cmFjdEVyZ29FbnRpdHkgd2l0aCBib3gtc3BlY2lmaWMgZmllbGRzXG4gKiBmb3IgdHJhY2tpbmcgVVRYTyBzcGVuZGluZyBzdGF0ZXMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVyZ29Cb3hFbnRpdHkgZXh0ZW5kcyBBYnN0cmFjdEVyZ29FbnRpdHkge1xuICAvKipcbiAgICogQmxvY2sgaGFzaCB3aGVyZSB0aGlzIGJveCB3YXMgc3BlbnQgKG51bGwgaWYgdW5zcGVudCkuXG4gICAqL1xuICBAQ29sdW1uKHsgbnVsbGFibGU6IHRydWUsIHR5cGU6ICd2YXJjaGFyJyB9KVxuICBzcGVuZEJsb2NrPzogc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogQmxvY2sgaGVpZ2h0IHdoZXJlIHRoaXMgYm94IHdhcyBzcGVudCAobnVsbCBpZiB1bnNwZW50KS5cbiAgICovXG4gIEBDb2x1bW4oeyBudWxsYWJsZTogdHJ1ZSwgdHlwZTogJ2ludCcgfSlcbiAgc3BlbmRIZWlnaHQ/OiBudW1iZXIgfCBudWxsO1xufVxuIl19
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Abstract base entity for storing extracted blockchain data.
3
+ *
4
+ * This entity serves as the foundation for all extracted data storage,
5
+ * supporting both box-based and transaction-based extraction patterns.
6
+ * The identifier field can represent different types of blockchain data:
7
+ * - For box-based extractors: boxId (UTXO identifier)
8
+ * - For transaction-based extractors: txId (transaction identifier)
9
+ * - For general extractors: any unique blockchain data identifier
10
+ */
11
+ export declare abstract class AbstractErgoEntity {
12
+ id: number;
13
+ block: string;
14
+ height: number;
15
+ extractor: string;
16
+ /**
17
+ * Unique identifier for the entity in the blockchain.
18
+ * This can be:
19
+ * - boxId for UTXO-based data (box extractors)
20
+ * - txId for transaction-based data (general extractors)
21
+ * - Any unique blockchain data identifier for custom extractors
22
+ */
23
+ identifier: string;
24
+ serialized: string;
25
+ }
26
+ //# sourceMappingURL=abstractErgoEntity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstractErgoEntity.d.ts","sourceRoot":"","sources":["../../../../lib/ergo/database/entities/abstractErgoEntity.ts"],"names":[],"mappings":"AAMA;;;;;;;;;GASG;AACH,8BACsB,kBAAkB;IAEtC,EAAE,EAAE,MAAM,CAAC;IAGX,KAAK,EAAE,MAAM,CAAC;IAGd,MAAM,EAAE,MAAM,CAAC;IAGf,SAAS,EAAE,MAAM,CAAC;IAElB;;;;;;OAMG;IAEH,UAAU,EAAE,MAAM,CAAC;IAGnB,UAAU,EAAE,MAAM,CAAC;CACpB"}
@@ -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"}