@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.
- package/CHANGELOG.md +225 -0
- package/README.md +24 -0
- package/dist/abstractExtractor.d.ts +59 -0
- package/dist/abstractExtractor.d.ts.map +1 -0
- package/dist/abstractExtractor.js +22 -0
- package/dist/constants.d.ts +4 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +4 -0
- package/dist/ergo/database/actions/abstractErgoAction.d.ts +91 -0
- package/dist/ergo/database/actions/abstractErgoAction.d.ts.map +1 -0
- package/dist/ergo/database/actions/abstractErgoAction.js +180 -0
- package/dist/ergo/database/actions/abstractErgoBoxAction.d.ts +31 -0
- package/dist/ergo/database/actions/abstractErgoBoxAction.d.ts.map +1 -0
- package/dist/ergo/database/actions/abstractErgoBoxAction.js +70 -0
- package/dist/ergo/database/entities/abstractErgoBoxEntity.d.ts +18 -0
- package/dist/ergo/database/entities/abstractErgoBoxEntity.d.ts.map +1 -0
- package/dist/ergo/database/entities/abstractErgoBoxEntity.js +36 -0
- package/dist/ergo/database/entities/abstractErgoEntity.d.ts +26 -0
- package/dist/ergo/database/entities/abstractErgoEntity.d.ts.map +1 -0
- package/dist/ergo/database/entities/abstractErgoEntity.js +64 -0
- package/dist/ergo/database/index.d.ts +5 -0
- package/dist/ergo/database/index.d.ts.map +1 -0
- package/dist/ergo/database/index.js +5 -0
- package/dist/ergo/extractors/abstractErgoBoxExtractor.d.ts +67 -0
- package/dist/ergo/extractors/abstractErgoBoxExtractor.d.ts.map +1 -0
- package/dist/ergo/extractors/abstractErgoBoxExtractor.js +106 -0
- package/dist/ergo/extractors/abstractErgoExtractor.d.ts +61 -0
- package/dist/ergo/extractors/abstractErgoExtractor.d.ts.map +1 -0
- package/dist/ergo/extractors/abstractErgoExtractor.js +99 -0
- package/dist/ergo/extractors/abstractErgoTxExtractor.d.ts +54 -0
- package/dist/ergo/extractors/abstractErgoTxExtractor.d.ts.map +1 -0
- package/dist/ergo/extractors/abstractErgoTxExtractor.js +76 -0
- package/dist/ergo/extractors/index.d.ts +4 -0
- package/dist/ergo/extractors/index.d.ts.map +1 -0
- package/dist/ergo/extractors/index.js +4 -0
- package/dist/ergo/index.d.ts +8 -0
- package/dist/ergo/index.d.ts.map +1 -0
- package/dist/ergo/index.js +8 -0
- package/dist/ergo/initializers/constants.d.ts +4 -0
- package/dist/ergo/initializers/constants.d.ts.map +1 -0
- package/dist/ergo/initializers/constants.js +4 -0
- package/dist/ergo/initializers/ergoBoxInitializer.d.ts +36 -0
- package/dist/ergo/initializers/ergoBoxInitializer.d.ts.map +1 -0
- package/dist/ergo/initializers/ergoBoxInitializer.js +84 -0
- package/dist/ergo/initializers/ergoInitializer.d.ts +39 -0
- package/dist/ergo/initializers/ergoInitializer.d.ts.map +1 -0
- package/dist/ergo/initializers/ergoInitializer.js +80 -0
- package/dist/ergo/initializers/index.d.ts +4 -0
- package/dist/ergo/initializers/index.d.ts.map +1 -0
- package/dist/ergo/initializers/index.js +4 -0
- package/dist/ergo/initializers/strategies/explorerInitializationStrategy.d.ts +59 -0
- package/dist/ergo/initializers/strategies/explorerInitializationStrategy.d.ts.map +1 -0
- package/dist/ergo/initializers/strategies/explorerInitializationStrategy.js +161 -0
- package/dist/ergo/initializers/strategies/index.d.ts +4 -0
- package/dist/ergo/initializers/strategies/index.d.ts.map +1 -0
- package/dist/ergo/initializers/strategies/index.js +4 -0
- package/dist/ergo/initializers/strategies/nodeInitializationStrategy.d.ts +30 -0
- package/dist/ergo/initializers/strategies/nodeInitializationStrategy.d.ts.map +1 -0
- package/dist/ergo/initializers/strategies/nodeInitializationStrategy.js +78 -0
- package/dist/ergo/initializers/strategies/workerManager.d.ts +79 -0
- package/dist/ergo/initializers/strategies/workerManager.d.ts.map +1 -0
- package/dist/ergo/initializers/strategies/workerManager.js +182 -0
- package/dist/ergo/interfaces.d.ts +63 -0
- package/dist/ergo/interfaces.d.ts.map +1 -0
- package/dist/ergo/interfaces.js +8 -0
- package/dist/ergo/networks/explorerNetwork.d.ts +52 -0
- package/dist/ergo/networks/explorerNetwork.d.ts.map +1 -0
- package/dist/ergo/networks/explorerNetwork.js +132 -0
- package/dist/ergo/networks/index.d.ts +3 -0
- package/dist/ergo/networks/index.d.ts.map +1 -0
- package/dist/ergo/networks/index.js +3 -0
- package/dist/ergo/networks/nodeNetwork.d.ts +34 -0
- package/dist/ergo/networks/nodeNetwork.d.ts.map +1 -0
- package/dist/ergo/networks/nodeNetwork.js +77 -0
- package/dist/ergo/utils.d.ts +23 -0
- package/dist/ergo/utils.d.ts.map +1 -0
- package/dist/ergo/utils.js +49 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- 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 @@
|
|
|
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"}
|