@my-packages-changeit/watcher-data-extractor 13.0.10
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 +394 -0
- package/README.md +74 -0
- package/dist/actions/collateralAction.d.ts +25 -0
- package/dist/actions/collateralAction.d.ts.map +1 -0
- package/dist/actions/collateralAction.js +34 -0
- package/dist/actions/commitmentAction.d.ts +43 -0
- package/dist/actions/commitmentAction.d.ts.map +1 -0
- package/dist/actions/commitmentAction.js +138 -0
- package/dist/actions/eventTriggerAction.d.ts +29 -0
- package/dist/actions/eventTriggerAction.d.ts.map +1 -0
- package/dist/actions/eventTriggerAction.js +101 -0
- package/dist/actions/permitAction.d.ts +73 -0
- package/dist/actions/permitAction.d.ts.map +1 -0
- package/dist/actions/permitAction.js +187 -0
- package/dist/constants.d.ts +4 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +4 -0
- package/dist/entities/collateralEntity.d.ts +8 -0
- package/dist/entities/collateralEntity.d.ts.map +1 -0
- package/dist/entities/collateralEntity.js +34 -0
- package/dist/entities/commitmentEntity.d.ts +19 -0
- package/dist/entities/commitmentEntity.d.ts.map +1 -0
- package/dist/entities/commitmentEntity.js +93 -0
- package/dist/entities/eventTriggerEntity.d.ts +24 -0
- package/dist/entities/eventTriggerEntity.d.ts.map +1 -0
- package/dist/entities/eventTriggerEntity.js +113 -0
- package/dist/entities/permitEntity.d.ts +14 -0
- package/dist/entities/permitEntity.d.ts.map +1 -0
- package/dist/entities/permitEntity.js +68 -0
- package/dist/extractor/collateralExtractor.d.ts +31 -0
- package/dist/extractor/collateralExtractor.d.ts.map +1 -0
- package/dist/extractor/collateralExtractor.js +72 -0
- package/dist/extractor/commitmentExtractor.d.ts +46 -0
- package/dist/extractor/commitmentExtractor.d.ts.map +1 -0
- package/dist/extractor/commitmentExtractor.js +125 -0
- package/dist/extractor/eventTriggerExtractor.d.ts +57 -0
- package/dist/extractor/eventTriggerExtractor.d.ts.map +1 -0
- package/dist/extractor/eventTriggerExtractor.js +215 -0
- package/dist/extractor/permitExtractor.d.ts +150 -0
- package/dist/extractor/permitExtractor.d.ts.map +1 -0
- package/dist/extractor/permitExtractor.js +235 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/interfaces/extractedCollateral.d.ts +9 -0
- package/dist/interfaces/extractedCollateral.d.ts.map +1 -0
- package/dist/interfaces/extractedCollateral.js +2 -0
- package/dist/interfaces/extractedCommitment.d.ts +11 -0
- package/dist/interfaces/extractedCommitment.d.ts.map +1 -0
- package/dist/interfaces/extractedCommitment.js +2 -0
- package/dist/interfaces/extractedEventTrigger.d.ts +22 -0
- package/dist/interfaces/extractedEventTrigger.d.ts.map +1 -0
- package/dist/interfaces/extractedEventTrigger.js +2 -0
- package/dist/interfaces/extractedPermit.d.ts +12 -0
- package/dist/interfaces/extractedPermit.d.ts.map +1 -0
- package/dist/interfaces/extractedPermit.js +2 -0
- package/dist/interfaces/types.d.ts +25 -0
- package/dist/interfaces/types.d.ts.map +1 -0
- package/dist/interfaces/types.js +2 -0
- package/dist/migrations/index.d.ts +7 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +45 -0
- package/dist/migrations/postgres/1688554842087-migration.d.ts +7 -0
- package/dist/migrations/postgres/1688554842087-migration.d.ts.map +1 -0
- package/dist/migrations/postgres/1688554842087-migration.js +82 -0
- package/dist/migrations/postgres/1689175974257-migration.d.ts +7 -0
- package/dist/migrations/postgres/1689175974257-migration.d.ts.map +1 -0
- package/dist/migrations/postgres/1689175974257-migration.js +50 -0
- package/dist/migrations/postgres/1699874447928-migration.d.ts +7 -0
- package/dist/migrations/postgres/1699874447928-migration.d.ts.map +1 -0
- package/dist/migrations/postgres/1699874447928-migration.js +36 -0
- package/dist/migrations/postgres/1706610773315-migration.d.ts +7 -0
- package/dist/migrations/postgres/1706610773315-migration.d.ts.map +1 -0
- package/dist/migrations/postgres/1706610773315-migration.js +69 -0
- package/dist/migrations/postgres/1709388482275-migration.d.ts +7 -0
- package/dist/migrations/postgres/1709388482275-migration.d.ts.map +1 -0
- package/dist/migrations/postgres/1709388482275-migration.js +29 -0
- package/dist/migrations/postgres/1737785036299-migration.d.ts +7 -0
- package/dist/migrations/postgres/1737785036299-migration.d.ts.map +1 -0
- package/dist/migrations/postgres/1737785036299-migration.js +32 -0
- package/dist/migrations/postgres/1746354253000-migration.d.ts +7 -0
- package/dist/migrations/postgres/1746354253000-migration.d.ts.map +1 -0
- package/dist/migrations/postgres/1746354253000-migration.js +15 -0
- package/dist/migrations/postgres/1758958886549-migration.d.ts +7 -0
- package/dist/migrations/postgres/1758958886549-migration.d.ts.map +1 -0
- package/dist/migrations/postgres/1758958886549-migration.js +30 -0
- package/dist/migrations/postgres/1766843825000-migration.d.ts +7 -0
- package/dist/migrations/postgres/1766843825000-migration.d.ts.map +1 -0
- package/dist/migrations/postgres/1766843825000-migration.js +42 -0
- package/dist/migrations/sqlite/1688555766601-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1688555766601-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1688555766601-migration.js +79 -0
- package/dist/migrations/sqlite/1689175103163-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1689175103163-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1689175103163-migration.js +392 -0
- package/dist/migrations/sqlite/1699872205117-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1699872205117-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1699872205117-migration.js +192 -0
- package/dist/migrations/sqlite/1706610773176-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1706610773176-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1706610773176-migration.js +421 -0
- package/dist/migrations/sqlite/1709388134975-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1709388134975-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1709388134975-migration.js +28 -0
- package/dist/migrations/sqlite/1737547743177-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1737547743177-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1737547743177-migration.js +204 -0
- package/dist/migrations/sqlite/1746354254000-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1746354254000-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1746354254000-migration.js +15 -0
- package/dist/migrations/sqlite/1761774736153-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1761774736153-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1761774736153-migration.js +204 -0
- package/dist/migrations/sqlite/1762768664031-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1762768664031-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1762768664031-migration.js +204 -0
- package/dist/migrations/sqlite/1766843824000-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1766843824000-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1766843824000-migration.js +109 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/utils.d.ts +25 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +29 -0
- package/package.json +50 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { chunk } from 'lodash-es';
|
|
2
|
+
import { DummyLogger } from '@rosen-bridge/abstract-logger';
|
|
3
|
+
import { In, } from '@rosen-bridge/extended-typeorm';
|
|
4
|
+
import { dbIdChunkSize } from '../constants';
|
|
5
|
+
import CommitmentEntity from '../entities/commitmentEntity';
|
|
6
|
+
class CommitmentAction {
|
|
7
|
+
logger;
|
|
8
|
+
datasource;
|
|
9
|
+
commitmentRepository;
|
|
10
|
+
constructor(dataSource, logger) {
|
|
11
|
+
this.datasource = dataSource;
|
|
12
|
+
this.logger = logger ? logger : new DummyLogger();
|
|
13
|
+
this.commitmentRepository = dataSource.getRepository(CommitmentEntity);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* It stores list of observations in the dataSource with block id
|
|
17
|
+
* @param commitments
|
|
18
|
+
* @param block
|
|
19
|
+
* @param extractor
|
|
20
|
+
*/
|
|
21
|
+
storeCommitments = async (commitments, block, extractor) => {
|
|
22
|
+
if (commitments.length === 0)
|
|
23
|
+
return true;
|
|
24
|
+
const boxIds = commitments.map((commitment) => commitment.boxId);
|
|
25
|
+
const savedCommitments = await this.commitmentRepository.findBy({
|
|
26
|
+
boxId: In(boxIds),
|
|
27
|
+
extractor: extractor,
|
|
28
|
+
});
|
|
29
|
+
let success = true;
|
|
30
|
+
const queryRunner = this.datasource.createQueryRunner();
|
|
31
|
+
await queryRunner.connect();
|
|
32
|
+
await queryRunner.startTransaction();
|
|
33
|
+
const repository = await queryRunner.manager.getRepository(CommitmentEntity);
|
|
34
|
+
try {
|
|
35
|
+
for (const commitment of commitments) {
|
|
36
|
+
const saved = savedCommitments.some((entity) => {
|
|
37
|
+
return entity.boxId === commitment.boxId;
|
|
38
|
+
});
|
|
39
|
+
const entity = {
|
|
40
|
+
txId: commitment.txId,
|
|
41
|
+
commitment: commitment.commitment,
|
|
42
|
+
eventId: commitment.eventId,
|
|
43
|
+
boxId: commitment.boxId,
|
|
44
|
+
WID: commitment.WID,
|
|
45
|
+
extractor: extractor,
|
|
46
|
+
block: block.hash,
|
|
47
|
+
height: block.height,
|
|
48
|
+
boxSerialized: commitment.boxSerialized,
|
|
49
|
+
rwtCount: commitment.rwtCount,
|
|
50
|
+
};
|
|
51
|
+
if (!saved) {
|
|
52
|
+
this.logger.info(`Saving commitment [${commitment.boxId}] for event [${commitment.eventId}] from watcher [${commitment.WID}] at height ${block.height} and extractor ${extractor}`);
|
|
53
|
+
await repository.insert(entity);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
this.logger.info(`Updating commitment [${commitment.boxId}] for event [${commitment.eventId}] from watcher [${commitment.WID}] at height ${block.height} and extractor ${extractor}`);
|
|
57
|
+
await repository.update({ boxId: commitment.boxId }, entity);
|
|
58
|
+
}
|
|
59
|
+
this.logger.debug(`Entity: ${JSON.stringify(entity)}`);
|
|
60
|
+
}
|
|
61
|
+
await queryRunner.commitTransaction();
|
|
62
|
+
}
|
|
63
|
+
catch (e) {
|
|
64
|
+
this.logger.error(`An error occurred during store commitments action: ${e}`);
|
|
65
|
+
await queryRunner.rollbackTransaction();
|
|
66
|
+
success = false;
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
await queryRunner.release();
|
|
70
|
+
}
|
|
71
|
+
return success;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Update spendBlock and spendHeight of commitments spent on the block
|
|
75
|
+
* @param spendId
|
|
76
|
+
* @param block
|
|
77
|
+
* @param extractor
|
|
78
|
+
*/
|
|
79
|
+
spendCommitments = async (spendId, block, extractor) => {
|
|
80
|
+
// TODO: improve updating (local:ergo/rosen-bridge/scanner#85)
|
|
81
|
+
const spendIdChunks = chunk(spendId, dbIdChunkSize);
|
|
82
|
+
for (const spendIdChunk of spendIdChunks) {
|
|
83
|
+
const commitments = await this.commitmentRepository.findBy({
|
|
84
|
+
boxId: In(spendIdChunk.map((info) => info.boxId)),
|
|
85
|
+
extractor: extractor,
|
|
86
|
+
});
|
|
87
|
+
for (const commitment of commitments) {
|
|
88
|
+
const spendInfo = spendIdChunk.find((info) => info.boxId === commitment.boxId);
|
|
89
|
+
if (!spendInfo)
|
|
90
|
+
throw new Error(`ImpossibleBehavior: box [${commitment.boxId}] is not found in spending info list`);
|
|
91
|
+
await this.commitmentRepository.update({
|
|
92
|
+
id: commitment.id,
|
|
93
|
+
}, {
|
|
94
|
+
spendBlock: block.hash,
|
|
95
|
+
spendHeight: block.height,
|
|
96
|
+
spendTxId: spendInfo.txId,
|
|
97
|
+
spendIndex: spendInfo.index,
|
|
98
|
+
});
|
|
99
|
+
this.logger.info(`Spent commitment [${commitment.boxId}] for event [${commitment.eventId}] at height ${block.height}`);
|
|
100
|
+
this.logger.debug(`Spent commitment [${JSON.stringify(commitment)}]`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Delete all commitments corresponding to the block(id) and extractor(id)
|
|
106
|
+
* and update all commitments spent on the specified block
|
|
107
|
+
* @param block
|
|
108
|
+
* @param extractor
|
|
109
|
+
*/
|
|
110
|
+
deleteBlock = async (block, extractor) => {
|
|
111
|
+
this.logger.info(`Deleting commitments of block [${block}] and extractor ${extractor}`);
|
|
112
|
+
await this.commitmentRepository.delete({
|
|
113
|
+
block: block,
|
|
114
|
+
extractor: extractor,
|
|
115
|
+
});
|
|
116
|
+
await this.commitmentRepository.update({ spendBlock: block, extractor: extractor }, {
|
|
117
|
+
spendBlock: null,
|
|
118
|
+
spendHeight: null,
|
|
119
|
+
spendTxId: null,
|
|
120
|
+
spendIndex: null,
|
|
121
|
+
});
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* Builds a query that returns used blocks by selecting the `block` column from the `CommitmentEntity` repository,
|
|
125
|
+
* filtered by the provided `extractorId`
|
|
126
|
+
*
|
|
127
|
+
* @param extractorId - Identifier of the extractor
|
|
128
|
+
* @returns A query builder selecting used blocks
|
|
129
|
+
*/
|
|
130
|
+
createUsedBlocksQuery = (extractorId) => {
|
|
131
|
+
return this.commitmentRepository
|
|
132
|
+
.createQueryBuilder('commitmentEntity')
|
|
133
|
+
.select('commitmentEntity.block', 'block')
|
|
134
|
+
.where('commitmentEntity.extractor = :extractorId', { extractorId });
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
export default CommitmentAction;
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0bWVudEFjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9hY3Rpb25zL2NvbW1pdG1lbnRBY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVsQyxPQUFPLEVBQWtCLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVFLE9BQU8sRUFFTCxFQUFFLEdBR0gsTUFBTSxnQ0FBZ0MsQ0FBQztBQUd4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sZ0JBQWdCLE1BQU0sOEJBQThCLENBQUM7QUFJNUQsTUFBTSxnQkFBZ0I7SUFDWCxNQUFNLENBQWlCO0lBQ2YsVUFBVSxDQUFhO0lBQ3ZCLG9CQUFvQixDQUErQjtJQUVwRSxZQUFZLFVBQXNCLEVBQUUsTUFBdUI7UUFDekQsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGdCQUFnQixHQUFHLEtBQUssRUFDdEIsV0FBdUMsRUFDdkMsS0FBZ0IsRUFDaEIsU0FBaUIsRUFDQyxFQUFFO1FBQ3BCLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDMUMsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JB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aC1lcyc7XG5cbmltcG9ydCB7IEFic3RyYWN0TG9nZ2VyLCBEdW1teUxvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcbmltcG9ydCB7XG4gIERhdGFTb3VyY2UsXG4gIEluLFxuICBSZXBvc2l0b3J5LFxuICBTZWxlY3RRdWVyeUJ1aWxkZXIsXG59IGZyb20gJ0Byb3Nlbi1icmlkZ2UvZXh0ZW5kZWQtdHlwZW9ybSc7XG5pbXBvcnQgeyBCbG9ja0luZm8gfSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7IGRiSWRDaHVua1NpemUgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IENvbW1pdG1lbnRFbnRpdHkgZnJvbSAnLi4vZW50aXRpZXMvY29tbWl0bWVudEVudGl0eSc7XG5pbXBvcnQgeyBleHRyYWN0ZWRDb21taXRtZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9leHRyYWN0ZWRDb21taXRtZW50JztcbmltcG9ydCB7IFNwZW5kSW5mbyB9IGZyb20gJy4uL2ludGVyZmFjZXMvdHlwZXMnO1xuXG5jbGFzcyBDb21taXRtZW50QWN0aW9uIHtcbiAgcmVhZG9ubHkgbG9nZ2VyOiBBYnN0cmFjdExvZ2dlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhc291cmNlOiBEYXRhU291cmNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbW1pdG1lbnRSZXBvc2l0b3J5OiBSZXBvc2l0b3J5PENvbW1pdG1lbnRFbnRpdHk+O1xuXG4gIGNvbnN0cnVjdG9yKGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsIGxvZ2dlcj86IEFic3RyYWN0TG9nZ2VyKSB7XG4gICAgdGhpcy5kYXRhc291cmNlID0gZGF0YVNvdXJjZTtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlciA/IGxvZ2dlciA6IG5ldyBEdW1teUxvZ2dlcigpO1xuICAgIHRoaXMuY29tbWl0bWVudFJlcG9zaXRvcnkgPSBkYXRhU291cmNlLmdldFJlcG9zaXRvcnkoQ29tbWl0bWVudEVudGl0eSk7XG4gIH1cblxuICAvKipcbiAgICogSXQgc3RvcmVzIGxpc3Qgb2Ygb2JzZXJ2YXRpb25zIGluIHRoZSBkYXRhU291cmNlIHdpdGggYmxvY2sgaWRcbiAgICogQHBhcmFtIGNvbW1pdG1lbnRzXG4gICAqIEBwYXJhbSBibG9ja1xuICAgKiBAcGFyYW0gZXh0cmFjdG9yXG4gICAqL1xuICBzdG9yZUNvbW1pdG1lbnRzID0gYXN5bmMgKFxuICAgIGNvbW1pdG1lbnRzOiBBcnJheTxleHRyYWN0ZWRDb21taXRtZW50PixcbiAgICBibG9jazogQmxvY2tJbmZvLFxuICAgIGV4dHJhY3Rvcjogc3RyaW5nLFxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBpZiAoY29tbWl0bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBib3hJZHMgPSBjb21taXRtZW50cy5tYXAoKGNvbW1pdG1lbnQpID0+IGNvbW1pdG1lbnQuYm94SWQpO1xuICAgIGNvbnN0IHNhdmVkQ29tbWl0bWVudHMgPSBhd2FpdCB0aGlzLmNvbW1pdG1lbnRSZXBvc2l0b3J5LmZpbmRCeSh7XG4gICAgICBib3hJZDogSW4oYm94SWRzKSxcbiAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgIH0pO1xuICAgIGxldCBzdWNjZXNzID0gdHJ1ZTtcbiAgICBjb25zdCBxdWVyeVJ1bm5lciA9IHRoaXMuZGF0YXNvdXJjZS5jcmVhdGVRdWVyeVJ1bm5lcigpO1xuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbm5lY3QoKTtcbiAgICBhd2FpdCBxdWVyeVJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCk7XG4gICAgY29uc3QgcmVwb3NpdG9yeSA9XG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLmdldFJlcG9zaXRvcnkoQ29tbWl0bWVudEVudGl0eSk7XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgY29tbWl0bWVudCBvZiBjb21taXRtZW50cykge1xuICAgICAgICBjb25zdCBzYXZlZCA9IHNhdmVkQ29tbWl0bWVudHMuc29tZSgoZW50aXR5KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGVudGl0eS5ib3hJZCA9PT0gY29tbWl0bWVudC5ib3hJZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGVudGl0eSA9IHtcbiAgICAgICAgICB0eElkOiBjb21taXRtZW50LnR4SWQsXG4gICAgICAgICAgY29tbWl0bWVudDogY29tbWl0bWVudC5jb21taXRtZW50LFxuICAgICAgICAgIGV2ZW50SWQ6IGNvbW1pdG1lbnQuZXZlbnRJZCxcbiAgICAgICAgICBib3hJZDogY29tbWl0bWVudC5ib3hJZCxcbiAgICAgICAgICBXSUQ6IGNvbW1pdG1lbnQuV0lELFxuICAgICAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgICAgICAgIGJsb2NrOiBibG9jay5oYXNoLFxuICAgICAgICAgIGhlaWdodDogYmxvY2suaGVpZ2h0LFxuICAgICAgICAgIGJveFNlcmlhbGl6ZWQ6IGNvbW1pdG1lbnQuYm94U2VyaWFsaXplZCxcbiAgICAgICAgICByd3RDb3VudDogY29tbWl0bWVudC5yd3RDb3VudCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFzYXZlZCkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgICAgICBgU2F2aW5nIGNvbW1pdG1lbnQgWyR7Y29tbWl0bWVudC5ib3hJZH1dIGZvciBldmVudCBbJHtjb21taXRtZW50LmV2ZW50SWR9XSBmcm9tIHdhdGNoZXIgWyR7Y29tbWl0bWVudC5XSUR9XSBhdCBoZWlnaHQgJHtibG9jay5oZWlnaHR9IGFuZCBleHRyYWN0b3IgJHtleHRyYWN0b3J9YCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IHJlcG9zaXRvcnkuaW5zZXJ0KGVudGl0eSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgICAgIGBVcGRhdGluZyBjb21taXRtZW50IFske2NvbW1pdG1lbnQuYm94SWR9XSBmb3IgZXZlbnQgWyR7Y29tbWl0bWVudC5ldmVudElkfV0gZnJvbSB3YXRjaGVyIFske2NvbW1pdG1lbnQuV0lEfV0gYXQgaGVpZ2h0ICR7YmxvY2suaGVpZ2h0fSBhbmQgZXh0cmFjdG9yICR7ZXh0cmFjdG9yfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCByZXBvc2l0b3J5LnVwZGF0ZSh7IGJveElkOiBjb21taXRtZW50LmJveElkIH0sIGVudGl0eSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYEVudGl0eTogJHtKU09OLnN0cmluZ2lmeShlbnRpdHkpfWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYEFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBzdG9yZSBjb21taXRtZW50cyBhY3Rpb246ICR7ZX1gLFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKTtcbiAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucmVsZWFzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHNwZW5kQmxvY2sgYW5kIHNwZW5kSGVpZ2h0IG9mIGNvbW1pdG1lbnRzIHNwZW50IG9uIHRoZSBibG9ja1xuICAgKiBAcGFyYW0gc3BlbmRJZFxuICAgKiBAcGFyYW0gYmxvY2tcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKi9cbiAgc3BlbmRDb21taXRtZW50cyA9IGFzeW5jIChcbiAgICBzcGVuZElkOiBBcnJheTxTcGVuZEluZm8+LFxuICAgIGJsb2NrOiBCbG9ja0luZm8sXG4gICAgZXh0cmFjdG9yOiBzdHJpbmcsXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIC8vIFRPRE86IGltcHJvdmUgdXBkYXRpbmcgKGxvY2FsOmVyZ28vcm9zZW4tYnJpZGdlL3NjYW5uZXIjODUpXG4gICAgY29uc3Qgc3BlbmRJZENodW5rcyA9IGNodW5rKHNwZW5kSWQsIGRiSWRDaHVua1NpemUpO1xuICAgIGZvciAoY29uc3Qgc3BlbmRJZENodW5rIG9mIHNwZW5kSWRDaHVua3MpIHtcbiAgICAgIGNvbnN0IGNvbW1pdG1lbnRzID0gYXdhaXQgdGhpcy5jb21taXRtZW50UmVwb3NpdG9yeS5maW5kQnkoe1xuICAgICAgICBib3hJZDogSW4oc3BlbmRJZENodW5rLm1hcCgoaW5mbykgPT4gaW5mby5ib3hJZCkpLFxuICAgICAgICBleHRyYWN0b3I6IGV4dHJhY3RvcixcbiAgICAgIH0pO1xuXG4gICAgICBmb3IgKGNvbnN0IGNvbW1pdG1lbnQgb2YgY29tbWl0bWVudHMpIHtcbiAgICAgICAgY29uc3Qgc3BlbmRJbmZvID0gc3BlbmRJZENodW5rLmZpbmQoXG4gICAgICAgICAgKGluZm8pID0+IGluZm8uYm94SWQgPT09IGNvbW1pdG1lbnQuYm94SWQsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghc3BlbmRJbmZvKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBJbXBvc3NpYmxlQmVoYXZpb3I6IGJveCBbJHtjb21taXRtZW50LmJveElkfV0gaXMgbm90IGZvdW5kIGluIHNwZW5kaW5nIGluZm8gbGlzdGAsXG4gICAgICAgICAgKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmNvbW1pdG1lbnRSZXBvc2l0b3J5LnVwZGF0ZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogY29tbWl0bWVudC5pZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNwZW5kQmxvY2s6IGJsb2NrLmhhc2gsXG4gICAgICAgICAgICBzcGVuZEhlaWdodDogYmxvY2suaGVpZ2h0LFxuICAgICAgICAgICAgc3BlbmRUeElkOiBzcGVuZEluZm8udHhJZCxcbiAgICAgICAgICAgIHNwZW5kSW5kZXg6IHNwZW5kSW5mby5pbmRleCxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBTcGVudCBjb21taXRtZW50IFske2NvbW1pdG1lbnQuYm94SWR9XSBmb3IgZXZlbnQgWyR7Y29tbWl0bWVudC5ldmVudElkfV0gYXQgaGVpZ2h0ICR7YmxvY2suaGVpZ2h0fWAsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBTcGVudCBjb21taXRtZW50IFske0pTT04uc3RyaW5naWZ5KGNvbW1pdG1lbnQpfV1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbGwgY29tbWl0bWVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgYmxvY2soaWQpIGFuZCBleHRyYWN0b3IoaWQpXG4gICAqIGFuZCB1cGRhdGUgYWxsIGNvbW1pdG1lbnRzIHNwZW50IG9uIHRoZSBzcGVjaWZpZWQgYmxvY2tcbiAgICogQHBhcmFtIGJsb2NrXG4gICAqIEBwYXJhbSBleHRyYWN0b3JcbiAgICovXG4gIGRlbGV0ZUJsb2NrID0gYXN5bmMgKGJsb2NrOiBzdHJpbmcsIGV4dHJhY3Rvcjogc3RyaW5nKSA9PiB7XG4gICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgIGBEZWxldGluZyBjb21taXRtZW50cyBvZiBibG9jayBbJHtibG9ja31dIGFuZCBleHRyYWN0b3IgJHtleHRyYWN0b3J9YCxcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuY29tbWl0bWVudFJlcG9zaXRvcnkuZGVsZXRlKHtcbiAgICAgIGJsb2NrOiBibG9jayxcbiAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMuY29tbWl0bWVudFJlcG9zaXRvcnkudXBkYXRlKFxuICAgICAgeyBzcGVuZEJsb2NrOiBibG9jaywgZXh0cmFjdG9yOiBleHRyYWN0b3IgfSxcbiAgICAgIHtcbiAgICAgICAgc3BlbmRCbG9jazogbnVsbCxcbiAgICAgICAgc3BlbmRIZWlnaHQ6IG51bGwsXG4gICAgICAgIHNwZW5kVHhJZDogbnVsbCxcbiAgICAgICAgc3BlbmRJbmRleDogbnVsbCxcbiAgICAgIH0sXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogQnVpbGRzIGEgcXVlcnkgdGhhdCByZXR1cm5zIHVzZWQgYmxvY2tzIGJ5IHNlbGVjdGluZyB0aGUgYGJsb2NrYCBjb2x1bW4gZnJvbSB0aGUgYENvbW1pdG1lbnRFbnRpdHlgIHJlcG9zaXRvcnksXG4gICAqIGZpbHRlcmVkIGJ5IHRoZSBwcm92aWRlZCBgZXh0cmFjdG9ySWRgXG4gICAqXG4gICAqIEBwYXJhbSBleHRyYWN0b3JJZCAtIElkZW50aWZpZXIgb2YgdGhlIGV4dHJhY3RvclxuICAgKiBAcmV0dXJucyBBIHF1ZXJ5IGJ1aWxkZXIgc2VsZWN0aW5nIHVzZWQgYmxvY2tzXG4gICAqL1xuICBjcmVhdGVVc2VkQmxvY2tzUXVlcnkgPSAoXG4gICAgZXh0cmFjdG9ySWQ6IHN0cmluZyxcbiAgKTogU2VsZWN0UXVlcnlCdWlsZGVyPENvbW1pdG1lbnRFbnRpdHk+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5jb21taXRtZW50UmVwb3NpdG9yeVxuICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcignY29tbWl0bWVudEVudGl0eScpXG4gICAgICAuc2VsZWN0KCdjb21taXRtZW50RW50aXR5LmJsb2NrJywgJ2Jsb2NrJylcbiAgICAgIC53aGVyZSgnY29tbWl0bWVudEVudGl0eS5leHRyYWN0b3IgPSA6ZXh0cmFjdG9ySWQnLCB7IGV4dHJhY3RvcklkIH0pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBDb21taXRtZW50QWN0aW9uO1xuIl19
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { AbstractErgoBoxAction, EntityInfo, SpendInfo } from '@rosen-bridge/abstract-extractor';
|
|
2
|
+
import { AbstractLogger } from '@rosen-bridge/abstract-logger';
|
|
3
|
+
import { DataSource } from '@rosen-bridge/extended-typeorm';
|
|
4
|
+
import { BlockInfo } from '@rosen-bridge/scanner-interfaces';
|
|
5
|
+
import EventTriggerEntity from '../entities/eventTriggerEntity';
|
|
6
|
+
import { ExtractedEventTrigger } from '../interfaces/extractedEventTrigger';
|
|
7
|
+
declare class EventTriggerAction extends AbstractErgoBoxAction<ExtractedEventTrigger, EventTriggerEntity> {
|
|
8
|
+
constructor(dataSource: DataSource, logger?: AbstractLogger);
|
|
9
|
+
/**
|
|
10
|
+
* create the box entity from extracted data and block information
|
|
11
|
+
*/
|
|
12
|
+
createEntity: (triggerBoxes: ExtractedEventTrigger[], block: BlockInfo, extractor: string) => Omit<EventTriggerEntity, "id">[];
|
|
13
|
+
/**
|
|
14
|
+
* convert the database entity back to raw data
|
|
15
|
+
*/
|
|
16
|
+
convertEntityToData: (entities: EventTriggerEntity[]) => ExtractedEventTrigger[];
|
|
17
|
+
/**
|
|
18
|
+
* update spending information of stored event triggers
|
|
19
|
+
* and set result and paymentTxId of the event
|
|
20
|
+
* chunk spendInfos to prevent large database queries
|
|
21
|
+
* @param spendInfArray
|
|
22
|
+
* @param block
|
|
23
|
+
* @param extractorId
|
|
24
|
+
* @returns spent box ids
|
|
25
|
+
*/
|
|
26
|
+
spendBoxes: (spendInfoArray: Array<SpendInfo>, block: BlockInfo, extractorId: string) => Promise<EntityInfo[]>;
|
|
27
|
+
}
|
|
28
|
+
export default EventTriggerAction;
|
|
29
|
+
//# sourceMappingURL=eventTriggerAction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventTriggerAction.d.ts","sourceRoot":"","sources":["../../lib/actions/eventTriggerAction.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,qBAAqB,EAErB,UAAU,EACV,SAAS,EACV,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAM,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAE7D,OAAO,kBAAkB,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAG5E,cAAM,kBAAmB,SAAQ,qBAAqB,CACpD,qBAAqB,EACrB,kBAAkB,CACnB;gBACa,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,cAAc;IAI3D;;OAEG;IACH,YAAY,GACV,cAAc,qBAAqB,EAAE,EACrC,OAAO,SAAS,EAChB,WAAW,MAAM,KAChB,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,EAAE,CAwBjC;IAEF;;OAEG;IACH,mBAAmB,GACjB,UAAU,kBAAkB,EAAE,KAC7B,qBAAqB,EAAE,CAuBxB;IAEF;;;;;;;;OAQG;IACH,UAAU,GACR,gBAAgB,KAAK,CAAC,SAAS,CAAC,EAChC,OAAO,SAAS,EAChB,aAAa,MAAM,KAClB,OAAO,CAAC,UAAU,EAAE,CAAC,CAyCtB;CACH;AAED,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { chunk, pick } from 'lodash-es';
|
|
2
|
+
import { AbstractErgoBoxAction, DB_CHUNK_SIZE, } from '@rosen-bridge/abstract-extractor';
|
|
3
|
+
import { In } from '@rosen-bridge/extended-typeorm';
|
|
4
|
+
import EventTriggerEntity from '../entities/eventTriggerEntity';
|
|
5
|
+
import { JsonBI } from '../utils';
|
|
6
|
+
class EventTriggerAction extends AbstractErgoBoxAction {
|
|
7
|
+
constructor(dataSource, logger) {
|
|
8
|
+
super(dataSource, EventTriggerEntity, logger);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* create the box entity from extracted data and block information
|
|
12
|
+
*/
|
|
13
|
+
createEntity = (triggerBoxes, block, extractor) => {
|
|
14
|
+
return triggerBoxes.map((trigger) => ({
|
|
15
|
+
txId: trigger.txId,
|
|
16
|
+
eventId: trigger.eventId,
|
|
17
|
+
identifier: trigger.identifier,
|
|
18
|
+
serialized: trigger.serialized,
|
|
19
|
+
block: block.hash,
|
|
20
|
+
height: block.height,
|
|
21
|
+
extractor: extractor,
|
|
22
|
+
WIDsCount: trigger.WIDsCount,
|
|
23
|
+
WIDsHash: trigger.WIDsHash,
|
|
24
|
+
amount: trigger.amount,
|
|
25
|
+
bridgeFee: trigger.bridgeFee,
|
|
26
|
+
fromAddress: trigger.fromAddress,
|
|
27
|
+
toAddress: trigger.toAddress,
|
|
28
|
+
fromChain: trigger.fromChain,
|
|
29
|
+
networkFee: trigger.networkFee,
|
|
30
|
+
sourceChainTokenId: trigger.sourceChainTokenId,
|
|
31
|
+
targetChainTokenId: trigger.targetChainTokenId,
|
|
32
|
+
sourceBlockId: trigger.sourceBlockId,
|
|
33
|
+
toChain: trigger.toChain,
|
|
34
|
+
sourceTxId: trigger.sourceTxId,
|
|
35
|
+
sourceChainHeight: trigger.sourceChainHeight,
|
|
36
|
+
}));
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* convert the database entity back to raw data
|
|
40
|
+
*/
|
|
41
|
+
convertEntityToData = (entities) => {
|
|
42
|
+
return entities.map((data) => pick(data, [
|
|
43
|
+
'eventId',
|
|
44
|
+
'txId',
|
|
45
|
+
'identifier',
|
|
46
|
+
'serialized',
|
|
47
|
+
'fromChain',
|
|
48
|
+
'toChain',
|
|
49
|
+
'fromAddress',
|
|
50
|
+
'toAddress',
|
|
51
|
+
'amount',
|
|
52
|
+
'bridgeFee',
|
|
53
|
+
'networkFee',
|
|
54
|
+
'sourceChainTokenId',
|
|
55
|
+
'targetChainTokenId',
|
|
56
|
+
'sourceBlockId',
|
|
57
|
+
'sourceTxId',
|
|
58
|
+
'WIDsCount',
|
|
59
|
+
'WIDsHash',
|
|
60
|
+
'sourceChainHeight',
|
|
61
|
+
]));
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* update spending information of stored event triggers
|
|
65
|
+
* and set result and paymentTxId of the event
|
|
66
|
+
* chunk spendInfos to prevent large database queries
|
|
67
|
+
* @param spendInfArray
|
|
68
|
+
* @param block
|
|
69
|
+
* @param extractorId
|
|
70
|
+
* @returns spent box ids
|
|
71
|
+
*/
|
|
72
|
+
spendBoxes = async (spendInfoArray, block, extractorId) => {
|
|
73
|
+
const spentData = [];
|
|
74
|
+
const spendInfoChunks = chunk(spendInfoArray, DB_CHUNK_SIZE);
|
|
75
|
+
for (const spendInfoChunk of spendInfoChunks) {
|
|
76
|
+
const spentTriggers = await this.repository.findBy({
|
|
77
|
+
identifier: In(spendInfoChunk.map((spendInfo) => spendInfo.boxId)),
|
|
78
|
+
extractor: extractorId,
|
|
79
|
+
});
|
|
80
|
+
for (const spentTrigger of spentTriggers) {
|
|
81
|
+
const spendInfo = spendInfoChunk.find((info) => info.boxId === spentTrigger.identifier);
|
|
82
|
+
if (!spendInfo || !spendInfo.extras || !spendInfo.extras.result) {
|
|
83
|
+
throw Error(`ImpossibleBehavior:: spending information extras does not contain result, ${JsonBI.stringify(spendInfo)}`);
|
|
84
|
+
}
|
|
85
|
+
await this.repository.update({ identifier: spendInfo.boxId, extractor: extractorId }, {
|
|
86
|
+
spendBlock: block.hash,
|
|
87
|
+
spendHeight: block.height,
|
|
88
|
+
spendTxId: spendInfo.txId,
|
|
89
|
+
result: spendInfo.extras.result,
|
|
90
|
+
paymentTxId: spendInfo.extras.paymentTxId || '',
|
|
91
|
+
});
|
|
92
|
+
spentData.push({ identifier: spendInfo.boxId });
|
|
93
|
+
this.logger.info(`Spent trigger [${spentTrigger.identifier}] of event [${spentTrigger.eventId}] at height ${block.height}`);
|
|
94
|
+
this.logger.debug(`Spent trigger: [${JSON.stringify(spentTrigger)}] with spending information [${JsonBI.stringify(spendInfo)}]`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return spentData;
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
export default EventTriggerAction;
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRUcmlnZ2VyQWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2FjdGlvbnMvZXZlbnRUcmlnZ2VyQWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXhDLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsYUFBYSxHQUdkLE1BQU0sa0NBQWtDLENBQUM7QUFFMUMsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBR2hFLE9BQU8sa0JBQWtCLE1BQU0sZ0NBQWdDLENBQUM7QUFFaEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVsQyxNQUFNLGtCQUFtQixTQUFRLHFCQUdoQztJQUNDLFlBQVksVUFBc0IsRUFBRSxNQUF1QjtRQUN6RCxLQUFLLENBQUMsVUFBVSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVksR0FBRyxDQUNiLFlBQXFDLEVBQ3JDLEtBQWdCLEVBQ2hCLFNBQWlCLEVBQ2lCLEVBQUU7UUFDcEMsT0FBTyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtZQUNsQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87WUFDeEIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO1lBQzlCLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtZQUM5QixLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUk7WUFDakIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1lBQ3BCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztZQUM1QixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7WUFDMUIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQ3RCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztZQUM1QixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7WUFDaEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1lBQzVCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztZQUM1QixVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7WUFDOUIsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLGtCQUFrQjtZQUM5QyxrQkFBa0IsRUFBRSxPQUFPLENBQUMsa0JBQWtCO1lBQzlDLGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBYTtZQUNwQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87WUFDeEIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO1lBQzlCLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxpQkFBaUI7U0FDN0MsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDLENBQUM7SUFFRjs7T0FFRztJQUNILG1CQUFtQixHQUFHLENBQ3BCLFFBQThCLEVBQ0wsRUFBRTtRQUMzQixPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUMzQixJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsU0FBUztZQUNULE1BQU07WUFDTixZQUFZO1lBQ1osWUFBWTtZQUNaLFdBQVc7WUFDWCxTQUFTO1lBQ1QsYUFBYTtZQUNiLFdBQVc7WUFDWCxRQUFRO1lBQ1IsV0FBVztZQUNYLFlBQVk7WUFDWixvQkFBb0I7WUFDcEIsb0JBQW9CO1lBQ3BCLGVBQWU7WUFDZixZQUFZO1lBQ1osV0FBVztZQUNYLFVBQVU7WUFDVixtQkFBbUI7U0FDcEIsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDLENBQUM7SUFFRjs7Ozs7Ozs7T0FRRztJQUNILFVBQVUsR0FBRyxLQUFLLEVBQ2hCLGNBQWdDLEVBQ2hDLEtBQWdCLEVBQ2hCLFdBQW1CLEVBQ0ksRUFBRTtRQUN6QixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDckIsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUM3RCxLQUFLLE1BQU0sY0FBYyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQzdDLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7Z0JBQ2pELFVBQVUsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNsRSxTQUFTLEVBQUUsV0FBVzthQUN2QixDQUFDLENBQUM7WUFDSCxLQUFLLE1BQU0sWUFBWSxJQUFJLGFBQWEsRUFBRSxDQUFDO2dCQUN6QyxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUNuQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxZQUFZLENBQUMsVUFBVSxDQUNqRCxDQUFDO2dCQUNGLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDaEUsTUFBTSxLQUFLLENBQ1QsNkVBQTZFLE1BQU0sQ0FBQyxTQUFTLENBQzNGLFNBQVMsQ0FDVixFQUFFLENBQ0osQ0FBQztnQkFDSixDQUFDO2dCQUNELE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQzFCLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxFQUN2RDtvQkFDRSxVQUFVLEVBQUUsS0FBSyxDQUFDLElBQUk7b0JBQ3RCLFdBQVcsRUFBRSxLQUFLLENBQUMsTUFBTTtvQkFDekIsU0FBUyxFQUFFLFNBQVMsQ0FBQyxJQUFJO29CQUN6QixNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNO29CQUMvQixXQUFXLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxXQUFXLElBQUksRUFBRTtpQkFDaEQsQ0FDRixDQUFDO2dCQUNGLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNkLGtCQUFrQixZQUFZLENBQUMsVUFBVSxlQUFlLFlBQVksQ0FBQyxPQUFPLGVBQWUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUMxRyxDQUFDO2dCQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLG1CQUFtQixJQUFJLENBQUMsU0FBUyxDQUMvQixZQUFZLENBQ2IsZ0NBQWdDLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FDaEUsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQyxDQUFDO0NBQ0g7QUFFRCxlQUFlLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2h1bmssIHBpY2sgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5pbXBvcnQge1xuICBBYnN0cmFjdEVyZ29Cb3hBY3Rpb24sXG4gIERCX0NIVU5LX1NJWkUsXG4gIEVudGl0eUluZm8sXG4gIFNwZW5kSW5mbyxcbn0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1leHRyYWN0b3InO1xuaW1wb3J0IHsgQWJzdHJhY3RMb2dnZXIgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2Fic3RyYWN0LWxvZ2dlcic7XG5pbXBvcnQgeyBEYXRhU291cmNlLCBJbiB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvZXh0ZW5kZWQtdHlwZW9ybSc7XG5pbXBvcnQgeyBCbG9ja0luZm8gfSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5cbmltcG9ydCBFdmVudFRyaWdnZXJFbnRpdHkgZnJvbSAnLi4vZW50aXRpZXMvZXZlbnRUcmlnZ2VyRW50aXR5JztcbmltcG9ydCB7IEV4dHJhY3RlZEV2ZW50VHJpZ2dlciB9IGZyb20gJy4uL2ludGVyZmFjZXMvZXh0cmFjdGVkRXZlbnRUcmlnZ2VyJztcbmltcG9ydCB7IEpzb25CSSB9IGZyb20gJy4uL3V0aWxzJztcblxuY2xhc3MgRXZlbnRUcmlnZ2VyQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RFcmdvQm94QWN0aW9uPFxuICBFeHRyYWN0ZWRFdmVudFRyaWdnZXIsXG4gIEV2ZW50VHJpZ2dlckVudGl0eVxuPiB7XG4gIGNvbnN0cnVjdG9yKGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsIGxvZ2dlcj86IEFic3RyYWN0TG9nZ2VyKSB7XG4gICAgc3VwZXIoZGF0YVNvdXJjZSwgRXZlbnRUcmlnZ2VyRW50aXR5LCBsb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIGNyZWF0ZSB0aGUgYm94IGVudGl0eSBmcm9tIGV4dHJhY3RlZCBkYXRhIGFuZCBibG9jayBpbmZvcm1hdGlvblxuICAgKi9cbiAgY3JlYXRlRW50aXR5ID0gKFxuICAgIHRyaWdnZXJCb3hlczogRXh0cmFjdGVkRXZlbnRUcmlnZ2VyW10sXG4gICAgYmxvY2s6IEJsb2NrSW5mbyxcbiAgICBleHRyYWN0b3I6IHN0cmluZyxcbiAgKTogT21pdDxFdmVudFRyaWdnZXJFbnRpdHksICdpZCc+W10gPT4ge1xuICAgIHJldHVybiB0cmlnZ2VyQm94ZXMubWFwKCh0cmlnZ2VyKSA9PiAoe1xuICAgICAgdHhJZDogdHJpZ2dlci50eElkLFxuICAgICAgZXZlbnRJZDogdHJpZ2dlci5ldmVudElkLFxuICAgICAgaWRlbnRpZmllcjogdHJpZ2dlci5pZGVudGlmaWVyLFxuICAgICAgc2VyaWFsaXplZDogdHJpZ2dlci5zZXJpYWxpemVkLFxuICAgICAgYmxvY2s6IGJsb2NrLmhhc2gsXG4gICAgICBoZWlnaHQ6IGJsb2NrLmhlaWdodCxcbiAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgICAgV0lEc0NvdW50OiB0cmlnZ2VyLldJRHNDb3VudCxcbiAgICAgIFdJRHNIYXNoOiB0cmlnZ2VyLldJRHNIYXNoLFxuICAgICAgYW1vdW50OiB0cmlnZ2VyLmFtb3VudCxcbiAgICAgIGJyaWRnZUZlZTogdHJpZ2dlci5icmlkZ2VGZWUsXG4gICAgICBmcm9tQWRkcmVzczogdHJpZ2dlci5mcm9tQWRkcmVzcyxcbiAgICAgIHRvQWRkcmVzczogdHJpZ2dlci50b0FkZHJlc3MsXG4gICAgICBmcm9tQ2hhaW46IHRyaWdnZXIuZnJvbUNoYWluLFxuICAgICAgbmV0d29ya0ZlZTogdHJpZ2dlci5uZXR3b3JrRmVlLFxuICAgICAgc291cmNlQ2hhaW5Ub2tlbklkOiB0cmlnZ2VyLnNvdXJjZUNoYWluVG9rZW5JZCxcbiAgICAgIHRhcmdldENoYWluVG9rZW5JZDogdHJpZ2dlci50YXJnZXRDaGFpblRva2VuSWQsXG4gICAgICBzb3VyY2VCbG9ja0lkOiB0cmlnZ2VyLnNvdXJjZUJsb2NrSWQsXG4gICAgICB0b0NoYWluOiB0cmlnZ2VyLnRvQ2hhaW4sXG4gICAgICBzb3VyY2VUeElkOiB0cmlnZ2VyLnNvdXJjZVR4SWQsXG4gICAgICBzb3VyY2VDaGFpbkhlaWdodDogdHJpZ2dlci5zb3VyY2VDaGFpbkhlaWdodCxcbiAgICB9KSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIGNvbnZlcnQgdGhlIGRhdGFiYXNlIGVudGl0eSBiYWNrIHRvIHJhdyBkYXRhXG4gICAqL1xuICBjb252ZXJ0RW50aXR5VG9EYXRhID0gKFxuICAgIGVudGl0aWVzOiBFdmVudFRyaWdnZXJFbnRpdHlbXSxcbiAgKTogRXh0cmFjdGVkRXZlbnRUcmlnZ2VyW10gPT4ge1xuICAgIHJldHVybiBlbnRpdGllcy5tYXAoKGRhdGEpID0+XG4gICAgICBwaWNrKGRhdGEsIFtcbiAgICAgICAgJ2V2ZW50SWQnLFxuICAgICAgICAndHhJZCcsXG4gICAgICAgICdpZGVudGlmaWVyJyxcbiAgICAgICAgJ3NlcmlhbGl6ZWQnLFxuICAgICAgICAnZnJvbUNoYWluJyxcbiAgICAgICAgJ3RvQ2hhaW4nLFxuICAgICAgICAnZnJvbUFkZHJlc3MnLFxuICAgICAgICAndG9BZGRyZXNzJyxcbiAgICAgICAgJ2Ftb3VudCcsXG4gICAgICAgICdicmlkZ2VGZWUnLFxuICAgICAgICAnbmV0d29ya0ZlZScsXG4gICAgICAgICdzb3VyY2VDaGFpblRva2VuSWQnLFxuICAgICAgICAndGFyZ2V0Q2hhaW5Ub2tlbklkJyxcbiAgICAgICAgJ3NvdXJjZUJsb2NrSWQnLFxuICAgICAgICAnc291cmNlVHhJZCcsXG4gICAgICAgICdXSURzQ291bnQnLFxuICAgICAgICAnV0lEc0hhc2gnLFxuICAgICAgICAnc291cmNlQ2hhaW5IZWlnaHQnLFxuICAgICAgXSksXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogdXBkYXRlIHNwZW5kaW5nIGluZm9ybWF0aW9uIG9mIHN0b3JlZCBldmVudCB0cmlnZ2Vyc1xuICAgKiBhbmQgc2V0IHJlc3VsdCBhbmQgcGF5bWVudFR4SWQgb2YgdGhlIGV2ZW50XG4gICAqIGNodW5rIHNwZW5kSW5mb3MgdG8gcHJldmVudCBsYXJnZSBkYXRhYmFzZSBxdWVyaWVzXG4gICAqIEBwYXJhbSBzcGVuZEluZkFycmF5XG4gICAqIEBwYXJhbSBibG9ja1xuICAgKiBAcGFyYW0gZXh0cmFjdG9ySWRcbiAgICogQHJldHVybnMgc3BlbnQgYm94IGlkc1xuICAgKi9cbiAgc3BlbmRCb3hlcyA9IGFzeW5jIChcbiAgICBzcGVuZEluZm9BcnJheTogQXJyYXk8U3BlbmRJbmZvPixcbiAgICBibG9jazogQmxvY2tJbmZvLFxuICAgIGV4dHJhY3RvcklkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8RW50aXR5SW5mb1tdPiA9PiB7XG4gICAgY29uc3Qgc3BlbnREYXRhID0gW107XG4gICAgY29uc3Qgc3BlbmRJbmZvQ2h1bmtzID0gY2h1bmsoc3BlbmRJbmZvQXJyYXksIERCX0NIVU5LX1NJWkUpO1xuICAgIGZvciAoY29uc3Qgc3BlbmRJbmZvQ2h1bmsgb2Ygc3BlbmRJbmZvQ2h1bmtzKSB7XG4gICAgICBjb25zdCBzcGVudFRyaWdnZXJzID0gYXdhaXQgdGhpcy5yZXBvc2l0b3J5LmZpbmRCeSh7XG4gICAgICAgIGlkZW50aWZpZXI6IEluKHNwZW5kSW5mb0NodW5rLm1hcCgoc3BlbmRJbmZvKSA9PiBzcGVuZEluZm8uYm94SWQpKSxcbiAgICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3JJZCxcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBzcGVudFRyaWdnZXIgb2Ygc3BlbnRUcmlnZ2Vycykge1xuICAgICAgICBjb25zdCBzcGVuZEluZm8gPSBzcGVuZEluZm9DaHVuay5maW5kKFxuICAgICAgICAgIChpbmZvKSA9PiBpbmZvLmJveElkID09PSBzcGVudFRyaWdnZXIuaWRlbnRpZmllcixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFzcGVuZEluZm8gfHwgIXNwZW5kSW5mby5leHRyYXMgfHwgIXNwZW5kSW5mby5leHRyYXMucmVzdWx0KSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBgSW1wb3NzaWJsZUJlaGF2aW9yOjogc3BlbmRpbmcgaW5mb3JtYXRpb24gZXh0cmFzIGRvZXMgbm90IGNvbnRhaW4gcmVzdWx0LCAke0pzb25CSS5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgIHNwZW5kSW5mbyxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMucmVwb3NpdG9yeS51cGRhdGUoXG4gICAgICAgICAgeyBpZGVudGlmaWVyOiBzcGVuZEluZm8uYm94SWQsIGV4dHJhY3RvcjogZXh0cmFjdG9ySWQgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzcGVuZEJsb2NrOiBibG9jay5oYXNoLFxuICAgICAgICAgICAgc3BlbmRIZWlnaHQ6IGJsb2NrLmhlaWdodCxcbiAgICAgICAgICAgIHNwZW5kVHhJZDogc3BlbmRJbmZvLnR4SWQsXG4gICAgICAgICAgICByZXN1bHQ6IHNwZW5kSW5mby5leHRyYXMucmVzdWx0LFxuICAgICAgICAgICAgcGF5bWVudFR4SWQ6IHNwZW5kSW5mby5leHRyYXMucGF5bWVudFR4SWQgfHwgJycsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgc3BlbnREYXRhLnB1c2goeyBpZGVudGlmaWVyOiBzcGVuZEluZm8uYm94SWQgfSk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgICAgYFNwZW50IHRyaWdnZXIgWyR7c3BlbnRUcmlnZ2VyLmlkZW50aWZpZXJ9XSBvZiBldmVudCBbJHtzcGVudFRyaWdnZXIuZXZlbnRJZH1dIGF0IGhlaWdodCAke2Jsb2NrLmhlaWdodH1gLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBgU3BlbnQgdHJpZ2dlcjogWyR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBzcGVudFRyaWdnZXIsXG4gICAgICAgICAgKX1dIHdpdGggc3BlbmRpbmcgaW5mb3JtYXRpb24gWyR7SnNvbkJJLnN0cmluZ2lmeShzcGVuZEluZm8pfV1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3BlbnREYXRhO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBFdmVudFRyaWdnZXJBY3Rpb247XG4iXX0=
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { AbstractLogger } from '@rosen-bridge/abstract-logger';
|
|
2
|
+
import { DataSource, SelectQueryBuilder } from '@rosen-bridge/extended-typeorm';
|
|
3
|
+
import { BlockInfo } from '@rosen-bridge/scanner-interfaces';
|
|
4
|
+
import PermitEntity from '../entities/permitEntity';
|
|
5
|
+
import { ExtractedPermit } from '../interfaces/extractedPermit';
|
|
6
|
+
declare class PermitAction {
|
|
7
|
+
readonly logger: AbstractLogger;
|
|
8
|
+
private readonly datasource;
|
|
9
|
+
private readonly permitRepository;
|
|
10
|
+
constructor(dataSource: DataSource, logger?: AbstractLogger);
|
|
11
|
+
/**
|
|
12
|
+
* insert a new permit boxes in the database
|
|
13
|
+
* @param permits
|
|
14
|
+
* @param initialHeight
|
|
15
|
+
* @param extractor
|
|
16
|
+
*/
|
|
17
|
+
insertPermit: (permit: ExtractedPermit, extractor: string) => Promise<import("@rosen-bridge/extended-typeorm").InsertResult>;
|
|
18
|
+
/**
|
|
19
|
+
* update an unspent permit in the database
|
|
20
|
+
* @param permit
|
|
21
|
+
* @param extractor
|
|
22
|
+
*/
|
|
23
|
+
updatePermit: (permit: ExtractedPermit, extractor: string) => Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* It stores list of permits in the dataSource with block id
|
|
26
|
+
* @param permits
|
|
27
|
+
* @param block
|
|
28
|
+
* @param extractor
|
|
29
|
+
*/
|
|
30
|
+
storePermits: (permits: Array<ExtractedPermit>, block: BlockInfo, extractor: string) => Promise<boolean>;
|
|
31
|
+
/**
|
|
32
|
+
* Update spendBlock and spendHeight of permits spent on the block
|
|
33
|
+
* @param spendId
|
|
34
|
+
* @param block
|
|
35
|
+
* @param extractor
|
|
36
|
+
*/
|
|
37
|
+
spendPermits: (spendId: Array<string>, block: BlockInfo, extractor: string) => Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Delete all permits corresponding to the block(id) and extractor(id)
|
|
40
|
+
* and update all permits spent on the specified block
|
|
41
|
+
* @param block
|
|
42
|
+
* @param extractor
|
|
43
|
+
*/
|
|
44
|
+
deleteBlock: (block: string, extractor: string) => Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Returns all stored permit box ids
|
|
47
|
+
*/
|
|
48
|
+
getAllPermitBoxIds: (extractor: string) => Promise<Array<string>>;
|
|
49
|
+
/**
|
|
50
|
+
* Removes specified permit
|
|
51
|
+
* @param boxId
|
|
52
|
+
* @param extractor
|
|
53
|
+
*/
|
|
54
|
+
removePermit: (boxId: string, extractor: string) => Promise<import("@rosen-bridge/extended-typeorm").DeleteResult>;
|
|
55
|
+
/**
|
|
56
|
+
* Update the permit spending information
|
|
57
|
+
* @param boxId
|
|
58
|
+
* @param extractor
|
|
59
|
+
* @param blockId
|
|
60
|
+
* @param blockHeight
|
|
61
|
+
*/
|
|
62
|
+
updateSpendBlock: (boxId: string, extractor: string, blockId: string, blockHeight: number) => Promise<import("@rosen-bridge/extended-typeorm").UpdateResult>;
|
|
63
|
+
/**
|
|
64
|
+
* Builds a query that returns used blocks by selecting the `block` column from the `PermitEntity` repository,
|
|
65
|
+
* filtered by the provided `extractorId`
|
|
66
|
+
*
|
|
67
|
+
* @param extractorId - Identifier of the extractor
|
|
68
|
+
* @returns A query builder selecting used blocks
|
|
69
|
+
*/
|
|
70
|
+
createUsedBlocksQuery: (extractorId: string) => SelectQueryBuilder<PermitEntity>;
|
|
71
|
+
}
|
|
72
|
+
export default PermitAction;
|
|
73
|
+
//# sourceMappingURL=permitAction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permitAction.d.ts","sourceRoot":"","sources":["../../lib/actions/permitAction.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EACL,UAAU,EAGV,kBAAkB,EACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAG7D,OAAO,YAAY,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,cAAM,YAAY;IAChB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA2B;gBAEhD,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,cAAc;IAM3D;;;;;OAKG;IACH,YAAY,GAAU,QAAQ,eAAe,EAAE,WAAW,MAAM,oEAY9D;IAEF;;;;OAIG;IACH,YAAY,GAAU,QAAQ,eAAe,EAAE,WAAW,MAAM,mBAa9D;IAEF;;;;;OAKG;IACH,YAAY,GACV,SAAS,KAAK,CAAC,eAAe,CAAC,EAC/B,OAAO,SAAS,EAChB,WAAW,MAAM,sBAiDjB;IAEF;;;;;OAKG;IACH,YAAY,GACV,SAAS,KAAK,CAAC,MAAM,CAAC,EACtB,OAAO,SAAS,EAChB,WAAW,MAAM,KAChB,OAAO,CAAC,IAAI,CAAC,CAoBd;IAEF;;;;;OAKG;IACH,WAAW,GAAU,OAAO,MAAM,EAAE,WAAW,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC,CASnE;IAEF;;OAEG;IACH,kBAAkB,GAAU,WAAW,MAAM,KAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAUpE;IAEF;;;;OAIG;IACH,YAAY,GAAU,OAAO,MAAM,EAAE,WAAW,MAAM,oEAKpD;IAEF;;;;;;OAMG;IACH,gBAAgB,GACd,OAAO,MAAM,EACb,WAAW,MAAM,EACjB,SAAS,MAAM,EACf,aAAa,MAAM,oEAMnB;IAEF;;;;;;OAMG;IACH,qBAAqB,GACnB,aAAa,MAAM,KAClB,kBAAkB,CAAC,YAAY,CAAC,CAKjC;CACH;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { chunk } from 'lodash-es';
|
|
2
|
+
import { DummyLogger } from '@rosen-bridge/abstract-logger';
|
|
3
|
+
import { In, } from '@rosen-bridge/extended-typeorm';
|
|
4
|
+
import { dbIdChunkSize } from '../constants';
|
|
5
|
+
import PermitEntity from '../entities/permitEntity';
|
|
6
|
+
class PermitAction {
|
|
7
|
+
logger;
|
|
8
|
+
datasource;
|
|
9
|
+
permitRepository;
|
|
10
|
+
constructor(dataSource, logger) {
|
|
11
|
+
this.datasource = dataSource;
|
|
12
|
+
this.logger = logger ? logger : new DummyLogger();
|
|
13
|
+
this.permitRepository = dataSource.getRepository(PermitEntity);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* insert a new permit boxes in the database
|
|
17
|
+
* @param permits
|
|
18
|
+
* @param initialHeight
|
|
19
|
+
* @param extractor
|
|
20
|
+
*/
|
|
21
|
+
insertPermit = async (permit, extractor) => {
|
|
22
|
+
return this.permitRepository.insert({
|
|
23
|
+
boxId: permit.boxId,
|
|
24
|
+
boxSerialized: permit.boxSerialized,
|
|
25
|
+
block: permit.block,
|
|
26
|
+
height: permit.height,
|
|
27
|
+
extractor: extractor,
|
|
28
|
+
WID: permit.WID,
|
|
29
|
+
txId: permit.txId,
|
|
30
|
+
spendBlock: permit.spendBlock,
|
|
31
|
+
spendHeight: permit.spendHeight,
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* update an unspent permit in the database
|
|
36
|
+
* @param permit
|
|
37
|
+
* @param extractor
|
|
38
|
+
*/
|
|
39
|
+
updatePermit = async (permit, extractor) => {
|
|
40
|
+
await this.permitRepository.update({ boxId: permit.boxId, extractor: extractor }, {
|
|
41
|
+
boxSerialized: permit.boxSerialized,
|
|
42
|
+
block: permit.block,
|
|
43
|
+
height: permit.height,
|
|
44
|
+
WID: permit.WID,
|
|
45
|
+
txId: permit.txId,
|
|
46
|
+
spendBlock: null,
|
|
47
|
+
spendHeight: null,
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* It stores list of permits in the dataSource with block id
|
|
52
|
+
* @param permits
|
|
53
|
+
* @param block
|
|
54
|
+
* @param extractor
|
|
55
|
+
*/
|
|
56
|
+
storePermits = async (permits, block, extractor) => {
|
|
57
|
+
if (permits.length === 0)
|
|
58
|
+
return true;
|
|
59
|
+
const boxIds = permits.map((permit) => permit.boxId);
|
|
60
|
+
const savedPermits = await this.permitRepository.findBy({
|
|
61
|
+
boxId: In(boxIds),
|
|
62
|
+
extractor: extractor,
|
|
63
|
+
});
|
|
64
|
+
let success = true;
|
|
65
|
+
const queryRunner = this.datasource.createQueryRunner();
|
|
66
|
+
await queryRunner.connect();
|
|
67
|
+
await queryRunner.startTransaction();
|
|
68
|
+
const repository = await queryRunner.manager.getRepository(PermitEntity);
|
|
69
|
+
try {
|
|
70
|
+
for (const permit of permits) {
|
|
71
|
+
const saved = savedPermits.some((entity) => {
|
|
72
|
+
return entity.boxId === permit.boxId;
|
|
73
|
+
});
|
|
74
|
+
const entity = {
|
|
75
|
+
boxId: permit.boxId,
|
|
76
|
+
boxSerialized: permit.boxSerialized,
|
|
77
|
+
block: block.hash,
|
|
78
|
+
height: block.height,
|
|
79
|
+
extractor: extractor,
|
|
80
|
+
WID: permit.WID,
|
|
81
|
+
txId: permit.txId,
|
|
82
|
+
};
|
|
83
|
+
if (!saved) {
|
|
84
|
+
this.logger.debug(`Saving permit [${permit.boxId}] belonging to watcher [${permit.WID}] at height ${block.height} and extractor ${extractor}`);
|
|
85
|
+
await repository.insert(entity);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
this.logger.debug(`Updating permit [${permit.boxId}] belonging to watcher [${permit.WID}] at height ${block.height} and extractor ${extractor}`);
|
|
89
|
+
await repository.update({ boxId: permit.boxId }, entity);
|
|
90
|
+
}
|
|
91
|
+
this.logger.debug(`Entity: ${JSON.stringify(entity)}`);
|
|
92
|
+
}
|
|
93
|
+
await queryRunner.commitTransaction();
|
|
94
|
+
}
|
|
95
|
+
catch (e) {
|
|
96
|
+
this.logger.error(`An error occurred during store permit action: ${e}`);
|
|
97
|
+
await queryRunner.rollbackTransaction();
|
|
98
|
+
success = false;
|
|
99
|
+
}
|
|
100
|
+
finally {
|
|
101
|
+
await queryRunner.release();
|
|
102
|
+
}
|
|
103
|
+
return success;
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* Update spendBlock and spendHeight of permits spent on the block
|
|
107
|
+
* @param spendId
|
|
108
|
+
* @param block
|
|
109
|
+
* @param extractor
|
|
110
|
+
*/
|
|
111
|
+
spendPermits = async (spendId, block, extractor) => {
|
|
112
|
+
const spendIdChunks = chunk(spendId, dbIdChunkSize);
|
|
113
|
+
for (const spendIdChunk of spendIdChunks) {
|
|
114
|
+
const updateResult = await this.permitRepository.update({ boxId: In(spendIdChunk), extractor: extractor }, { spendBlock: block.hash, spendHeight: block.height });
|
|
115
|
+
if (updateResult.affected && updateResult.affected > 0) {
|
|
116
|
+
const spentRows = await this.permitRepository.findBy({
|
|
117
|
+
boxId: In(spendIdChunk),
|
|
118
|
+
spendBlock: block.hash,
|
|
119
|
+
});
|
|
120
|
+
for (const row of spentRows) {
|
|
121
|
+
this.logger.debug(`Spent permit with boxId [${row.boxId}] belonging to watcher with WID [${row.WID}] at height ${block.height}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* Delete all permits corresponding to the block(id) and extractor(id)
|
|
128
|
+
* and update all permits spent on the specified block
|
|
129
|
+
* @param block
|
|
130
|
+
* @param extractor
|
|
131
|
+
*/
|
|
132
|
+
deleteBlock = async (block, extractor) => {
|
|
133
|
+
this.logger.info(`Deleting permits at block ${block} and extractor ${extractor}`);
|
|
134
|
+
await this.permitRepository.delete({ block: block, extractor: extractor });
|
|
135
|
+
await this.permitRepository.update({ spendBlock: block, extractor: extractor }, { spendBlock: null, spendHeight: null });
|
|
136
|
+
};
|
|
137
|
+
/**
|
|
138
|
+
* Returns all stored permit box ids
|
|
139
|
+
*/
|
|
140
|
+
getAllPermitBoxIds = async (extractor) => {
|
|
141
|
+
const boxIds = await this.permitRepository.find({
|
|
142
|
+
where: {
|
|
143
|
+
extractor: extractor,
|
|
144
|
+
},
|
|
145
|
+
select: {
|
|
146
|
+
boxId: true,
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
return boxIds.map((item) => item.boxId);
|
|
150
|
+
};
|
|
151
|
+
/**
|
|
152
|
+
* Removes specified permit
|
|
153
|
+
* @param boxId
|
|
154
|
+
* @param extractor
|
|
155
|
+
*/
|
|
156
|
+
removePermit = async (boxId, extractor) => {
|
|
157
|
+
return await this.permitRepository.delete({
|
|
158
|
+
boxId: boxId,
|
|
159
|
+
extractor: extractor,
|
|
160
|
+
});
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* Update the permit spending information
|
|
164
|
+
* @param boxId
|
|
165
|
+
* @param extractor
|
|
166
|
+
* @param blockId
|
|
167
|
+
* @param blockHeight
|
|
168
|
+
*/
|
|
169
|
+
updateSpendBlock = async (boxId, extractor, blockId, blockHeight) => {
|
|
170
|
+
return await this.permitRepository.update({ boxId: boxId, extractor: extractor }, { spendBlock: blockId, spendHeight: blockHeight });
|
|
171
|
+
};
|
|
172
|
+
/**
|
|
173
|
+
* Builds a query that returns used blocks by selecting the `block` column from the `PermitEntity` repository,
|
|
174
|
+
* filtered by the provided `extractorId`
|
|
175
|
+
*
|
|
176
|
+
* @param extractorId - Identifier of the extractor
|
|
177
|
+
* @returns A query builder selecting used blocks
|
|
178
|
+
*/
|
|
179
|
+
createUsedBlocksQuery = (extractorId) => {
|
|
180
|
+
return this.permitRepository
|
|
181
|
+
.createQueryBuilder('permitEntity')
|
|
182
|
+
.select('permitEntity.block', 'block')
|
|
183
|
+
.where('permitEntity.extractor = :extractorId', { extractorId });
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
export default PermitAction;
|
|
187
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWl0QWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2FjdGlvbnMvcGVybWl0QWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFbEMsT0FBTyxFQUFrQixXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RSxPQUFPLEVBRUwsRUFBRSxHQUdILE1BQU0sZ0NBQWdDLENBQUM7QUFHeEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUdwRCxNQUFNLFlBQVk7SUFDUCxNQUFNLENBQWlCO0lBQ2YsVUFBVSxDQUFhO0lBQ3ZCLGdCQUFnQixDQUEyQjtJQUU1RCxZQUFZLFVBQXNCLEVBQUUsTUFBdUI7UUFDekQsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxZQUFZLEdBQUcsS0FBSyxFQUFFLE1BQXVCLEVBQUUsU0FBaUIsRUFBRSxFQUFFO1FBQ2xFLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztZQUNsQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7WUFDbkIsYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUFhO1lBQ25DLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztZQUNuQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07WUFDckIsU0FBUyxFQUFFLFNBQVM7WUFDcEIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFH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QzthQUNyQyxLQUFLLENBQUMsdUNBQXVDLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLENBQUMsQ0FBQztDQUNIO0FBRUQsZUFBZSxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjaHVuayB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbmltcG9ydCB7IEFic3RyYWN0TG9nZ2VyLCBEdW1teUxvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcbmltcG9ydCB7XG4gIERhdGFTb3VyY2UsXG4gIEluLFxuICBSZXBvc2l0b3J5LFxuICBTZWxlY3RRdWVyeUJ1aWxkZXIsXG59IGZyb20gJ0Byb3Nlbi1icmlkZ2UvZXh0ZW5kZWQtdHlwZW9ybSc7XG5pbXBvcnQgeyBCbG9ja0luZm8gfSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7IGRiSWRDaHVua1NpemUgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IFBlcm1pdEVudGl0eSBmcm9tICcuLi9lbnRpdGllcy9wZXJtaXRFbnRpdHknO1xuaW1wb3J0IHsgRXh0cmFjdGVkUGVybWl0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9leHRyYWN0ZWRQZXJtaXQnO1xuXG5jbGFzcyBQZXJtaXRBY3Rpb24ge1xuICByZWFkb25seSBsb2dnZXI6IEFic3RyYWN0TG9nZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFzb3VyY2U6IERhdGFTb3VyY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVybWl0UmVwb3NpdG9yeTogUmVwb3NpdG9yeTxQZXJtaXRFbnRpdHk+O1xuXG4gIGNvbnN0cnVjdG9yKGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsIGxvZ2dlcj86IEFic3RyYWN0TG9nZ2VyKSB7XG4gICAgdGhpcy5kYXRhc291cmNlID0gZGF0YVNvdXJjZTtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlciA/IGxvZ2dlciA6IG5ldyBEdW1teUxvZ2dlcigpO1xuICAgIHRoaXMucGVybWl0UmVwb3NpdG9yeSA9IGRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShQZXJtaXRFbnRpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIGluc2VydCBhIG5ldyBwZXJtaXQgYm94ZXMgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSBwZXJtaXRzXG4gICAqIEBwYXJhbSBpbml0aWFsSGVpZ2h0XG4gICAqIEBwYXJhbSBleHRyYWN0b3JcbiAgICovXG4gIGluc2VydFBlcm1pdCA9IGFzeW5jIChwZXJtaXQ6IEV4dHJhY3RlZFBlcm1pdCwgZXh0cmFjdG9yOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gdGhpcy5wZXJtaXRSZXBvc2l0b3J5Lmluc2VydCh7XG4gICAgICBib3hJZDogcGVybWl0LmJveElkLFxuICAgICAgYm94U2VyaWFsaXplZDogcGVybWl0LmJveFNlcmlhbGl6ZWQsXG4gICAgICBibG9jazogcGVybWl0LmJsb2NrLFxuICAgICAgaGVpZ2h0OiBwZXJtaXQuaGVpZ2h0LFxuICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgICBXSUQ6IHBlcm1pdC5XSUQsXG4gICAgICB0eElkOiBwZXJtaXQudHhJZCxcbiAgICAgIHNwZW5kQmxvY2s6IHBlcm1pdC5zcGVuZEJsb2NrLFxuICAgICAgc3BlbmRIZWlnaHQ6IHBlcm1pdC5zcGVuZEhlaWdodCxcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogdXBkYXRlIGFuIHVuc3BlbnQgcGVybWl0IGluIHRoZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0gcGVybWl0XG4gICAqIEBwYXJhbSBleHRyYWN0b3JcbiAgICovXG4gIHVwZGF0ZVBlcm1pdCA9IGFzeW5jIChwZXJtaXQ6IEV4dHJhY3RlZFBlcm1pdCwgZXh0cmFjdG9yOiBzdHJpbmcpID0+IHtcbiAgICBhd2FpdCB0aGlzLnBlcm1pdFJlcG9zaXRvcnkudXBkYXRlKFxuICAgICAgeyBib3hJZDogcGVybWl0LmJveElkLCBleHRyYWN0b3I6IGV4dHJhY3RvciB9LFxuICAgICAge1xuICAgICAgICBib3hTZXJpYWxpemVkOiBwZXJtaXQuYm94U2VyaWFsaXplZCxcbiAgICAgICAgYmxvY2s6IHBlcm1pdC5ibG9jayxcbiAgICAgICAgaGVpZ2h0OiBwZXJtaXQuaGVpZ2h0LFxuICAgICAgICBXSUQ6IHBlcm1pdC5XSUQsXG4gICAgICAgIHR4SWQ6IHBlcm1pdC50eElkLFxuICAgICAgICBzcGVuZEJsb2NrOiBudWxsLFxuICAgICAgICBzcGVuZEhlaWdodDogbnVsbCxcbiAgICAgIH0sXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogSXQgc3RvcmVzIGxpc3Qgb2YgcGVybWl0cyBpbiB0aGUgZGF0YVNvdXJjZSB3aXRoIGJsb2NrIGlkXG4gICAqIEBwYXJhbSBwZXJtaXRzXG4gICAqIEBwYXJhbSBibG9ja1xuICAgKiBAcGFyYW0gZXh0cmFjdG9yXG4gICAqL1xuICBzdG9yZVBlcm1pdHMgPSBhc3luYyAoXG4gICAgcGVybWl0czogQXJyYXk8RXh0cmFjdGVkUGVybWl0PixcbiAgICBibG9jazogQmxvY2tJbmZvLFxuICAgIGV4dHJhY3Rvcjogc3RyaW5nLFxuICApID0+IHtcbiAgICBpZiAocGVybWl0cy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGJveElkcyA9IHBlcm1pdHMubWFwKChwZXJtaXQpID0+IHBlcm1pdC5ib3hJZCk7XG4gICAgY29uc3Qgc2F2ZWRQZXJtaXRzID0gYXdhaXQgdGhpcy5wZXJtaXRSZXBvc2l0b3J5LmZpbmRCeSh7XG4gICAgICBib3hJZDogSW4oYm94SWRzKSxcbiAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgIH0pO1xuICAgIGxldCBzdWNjZXNzID0gdHJ1ZTtcbiAgICBjb25zdCBxdWVyeVJ1bm5lciA9IHRoaXMuZGF0YXNvdXJjZS5jcmVhdGVRdWVyeVJ1bm5lcigpO1xuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbm5lY3QoKTtcbiAgICBhd2FpdCBxdWVyeVJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCk7XG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIuZ2V0UmVwb3NpdG9yeShQZXJtaXRFbnRpdHkpO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IHBlcm1pdCBvZiBwZXJtaXRzKSB7XG4gICAgICAgIGNvbnN0IHNhdmVkID0gc2F2ZWRQZXJtaXRzLnNvbWUoKGVudGl0eSkgPT4ge1xuICAgICAgICAgIHJldHVybiBlbnRpdHkuYm94SWQgPT09IHBlcm1pdC5ib3hJZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGVudGl0eSA9IHtcbiAgICAgICAgICBib3hJZDogcGVybWl0LmJveElkLFxuICAgICAgICAgIGJveFNlcmlhbGl6ZWQ6IHBlcm1pdC5ib3hTZXJpYWxpemVkLFxuICAgICAgICAgIGJsb2NrOiBibG9jay5oYXNoLFxuICAgICAgICAgIGhlaWdodDogYmxvY2suaGVpZ2h0LFxuICAgICAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgICAgICAgIFdJRDogcGVybWl0LldJRCxcbiAgICAgICAgICB0eElkOiBwZXJtaXQudHhJZCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFzYXZlZCkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFNhdmluZyBwZXJtaXQgWyR7cGVybWl0LmJveElkfV0gYmVsb25naW5nIHRvIHdhdGNoZXIgWyR7cGVybWl0LldJRH1dIGF0IGhlaWdodCAke2Jsb2NrLmhlaWdodH0gYW5kIGV4dHJhY3RvciAke2V4dHJhY3Rvcn1gLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgcmVwb3NpdG9yeS5pbnNlcnQoZW50aXR5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBVcGRhdGluZyBwZXJtaXQgWyR7cGVybWl0LmJveElkfV0gYmVsb25naW5nIHRvIHdhdGNoZXIgWyR7cGVybWl0LldJRH1dIGF0IGhlaWdodCAke2Jsb2NrLmhlaWdodH0gYW5kIGV4dHJhY3RvciAke2V4dHJhY3Rvcn1gLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgcmVwb3NpdG9yeS51cGRhdGUoeyBib3hJZDogcGVybWl0LmJveElkIH0sIGVudGl0eSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYEVudGl0eTogJHtKU09OLnN0cmluZ2lmeShlbnRpdHkpfWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHN0b3JlIHBlcm1pdCBhY3Rpb246ICR7ZX1gKTtcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKTtcbiAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucmVsZWFzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHNwZW5kQmxvY2sgYW5kIHNwZW5kSGVpZ2h0IG9mIHBlcm1pdHMgc3BlbnQgb24gdGhlIGJsb2NrXG4gICAqIEBwYXJhbSBzcGVuZElkXG4gICAqIEBwYXJhbSBibG9ja1xuICAgKiBAcGFyYW0gZXh0cmFjdG9yXG4gICAqL1xuICBzcGVuZFBlcm1pdHMgPSBhc3luYyAoXG4gICAgc3BlbmRJZDogQXJyYXk8c3RyaW5nPixcbiAgICBibG9jazogQmxvY2tJbmZvLFxuICAgIGV4dHJhY3Rvcjogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBzcGVuZElkQ2h1bmtzID0gY2h1bmsoc3BlbmRJZCwgZGJJZENodW5rU2l6ZSk7XG4gICAgZm9yIChjb25zdCBzcGVuZElkQ2h1bmsgb2Ygc3BlbmRJZENodW5rcykge1xuICAgICAgY29uc3QgdXBkYXRlUmVzdWx0ID0gYXdhaXQgdGhpcy5wZXJtaXRSZXBvc2l0b3J5LnVwZGF0ZShcbiAgICAgICAgeyBib3hJZDogSW4oc3BlbmRJZENodW5rKSwgZXh0cmFjdG9yOiBleHRyYWN0b3IgfSxcbiAgICAgICAgeyBzcGVuZEJsb2NrOiBibG9jay5oYXNoLCBzcGVuZEhlaWdodDogYmxvY2suaGVpZ2h0IH0sXG4gICAgICApO1xuXG4gICAgICBpZiAodXBkYXRlUmVzdWx0LmFmZmVjdGVkICYmIHVwZGF0ZVJlc3VsdC5hZmZlY3RlZCA+IDApIHtcbiAgICAgICAgY29uc3Qgc3BlbnRSb3dzID0gYXdhaXQgdGhpcy5wZXJtaXRSZXBvc2l0b3J5LmZpbmRCeSh7XG4gICAgICAgICAgYm94SWQ6IEluKHNwZW5kSWRDaHVuayksXG4gICAgICAgICAgc3BlbmRCbG9jazogYmxvY2suaGFzaCxcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHNwZW50Um93cykge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFNwZW50IHBlcm1pdCB3aXRoIGJveElkIFske3Jvdy5ib3hJZH1dIGJlbG9uZ2luZyB0byB3YXRjaGVyIHdpdGggV0lEIFske3Jvdy5XSUR9XSBhdCBoZWlnaHQgJHtibG9jay5oZWlnaHR9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBEZWxldGUgYWxsIHBlcm1pdHMgY29ycmVzcG9uZGluZyB0byB0aGUgYmxvY2soaWQpIGFuZCBleHRyYWN0b3IoaWQpXG4gICAqIGFuZCB1cGRhdGUgYWxsIHBlcm1pdHMgc3BlbnQgb24gdGhlIHNwZWNpZmllZCBibG9ja1xuICAgKiBAcGFyYW0gYmxvY2tcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKi9cbiAgZGVsZXRlQmxvY2sgPSBhc3luYyAoYmxvY2s6IHN0cmluZywgZXh0cmFjdG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgYERlbGV0aW5nIHBlcm1pdHMgYXQgYmxvY2sgJHtibG9ja30gYW5kIGV4dHJhY3RvciAke2V4dHJhY3Rvcn1gLFxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5wZXJtaXRSZXBvc2l0b3J5LmRlbGV0ZSh7IGJsb2NrOiBibG9jaywgZXh0cmFjdG9yOiBleHRyYWN0b3IgfSk7XG4gICAgYXdhaXQgdGhpcy5wZXJtaXRSZXBvc2l0b3J5LnVwZGF0ZShcbiAgICAgIHsgc3BlbmRCbG9jazogYmxvY2ssIGV4dHJhY3RvcjogZXh0cmFjdG9yIH0sXG4gICAgICB7IHNwZW5kQmxvY2s6IG51bGwsIHNwZW5kSGVpZ2h0OiBudWxsIH0sXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogIFJldHVybnMgYWxsIHN0b3JlZCBwZXJtaXQgYm94IGlkc1xuICAgKi9cbiAgZ2V0QWxsUGVybWl0Qm94SWRzID0gYXN5bmMgKGV4dHJhY3Rvcjogc3RyaW5nKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiA9PiB7XG4gICAgY29uc3QgYm94SWRzID0gYXdhaXQgdGhpcy5wZXJtaXRSZXBvc2l0b3J5LmZpbmQoe1xuICAgICAgd2hlcmU6IHtcbiAgICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgICB9LFxuICAgICAgc2VsZWN0OiB7XG4gICAgICAgIGJveElkOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gYm94SWRzLm1hcCgoaXRlbTogeyBib3hJZDogc3RyaW5nIH0pID0+IGl0ZW0uYm94SWQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHNwZWNpZmllZCBwZXJtaXRcbiAgICogQHBhcmFtIGJveElkXG4gICAqIEBwYXJhbSBleHRyYWN0b3JcbiAgICovXG4gIHJlbW92ZVBlcm1pdCA9IGFzeW5jIChib3hJZDogc3RyaW5nLCBleHRyYWN0b3I6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnBlcm1pdFJlcG9zaXRvcnkuZGVsZXRlKHtcbiAgICAgIGJveElkOiBib3hJZCxcbiAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIHBlcm1pdCBzcGVuZGluZyBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0gYm94SWRcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gYmxvY2tJZFxuICAgKiBAcGFyYW0gYmxvY2tIZWlnaHRcbiAgICovXG4gIHVwZGF0ZVNwZW5kQmxvY2sgPSBhc3luYyAoXG4gICAgYm94SWQ6IHN0cmluZyxcbiAgICBleHRyYWN0b3I6IHN0cmluZyxcbiAgICBibG9ja0lkOiBzdHJpbmcsXG4gICAgYmxvY2tIZWlnaHQ6IG51bWJlcixcbiAgKSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucGVybWl0UmVwb3NpdG9yeS51cGRhdGUoXG4gICAgICB7IGJveElkOiBib3hJZCwgZXh0cmFjdG9yOiBleHRyYWN0b3IgfSxcbiAgICAgIHsgc3BlbmRCbG9jazogYmxvY2tJZCwgc3BlbmRIZWlnaHQ6IGJsb2NrSGVpZ2h0IH0sXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogQnVpbGRzIGEgcXVlcnkgdGhhdCByZXR1cm5zIHVzZWQgYmxvY2tzIGJ5IHNlbGVjdGluZyB0aGUgYGJsb2NrYCBjb2x1bW4gZnJvbSB0aGUgYFBlcm1pdEVudGl0eWAgcmVwb3NpdG9yeSxcbiAgICogZmlsdGVyZWQgYnkgdGhlIHByb3ZpZGVkIGBleHRyYWN0b3JJZGBcbiAgICpcbiAgICogQHBhcmFtIGV4dHJhY3RvcklkIC0gSWRlbnRpZmllciBvZiB0aGUgZXh0cmFjdG9yXG4gICAqIEByZXR1cm5zIEEgcXVlcnkgYnVpbGRlciBzZWxlY3RpbmcgdXNlZCBibG9ja3NcbiAgICovXG4gIGNyZWF0ZVVzZWRCbG9ja3NRdWVyeSA9IChcbiAgICBleHRyYWN0b3JJZDogc3RyaW5nLFxuICApOiBTZWxlY3RRdWVyeUJ1aWxkZXI8UGVybWl0RW50aXR5PiA9PiB7XG4gICAgcmV0dXJuIHRoaXMucGVybWl0UmVwb3NpdG9yeVxuICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigncGVybWl0RW50aXR5JylcbiAgICAgIC5zZWxlY3QoJ3Blcm1pdEVudGl0eS5ibG9jaycsICdibG9jaycpXG4gICAgICAud2hlcmUoJ3Blcm1pdEVudGl0eS5leHRyYWN0b3IgPSA6ZXh0cmFjdG9ySWQnLCB7IGV4dHJhY3RvcklkIH0pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBQZXJtaXRBY3Rpb247XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../lib/constants.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,aAAa,MAAM,CAAC;AAC1B,QAAA,MAAM,eAAe,MAAM,CAAC;AAE5B,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
const dbIdChunkSize = 100;
|
|
2
|
+
const DefaultApiLimit = 100;
|
|
3
|
+
export { dbIdChunkSize, DefaultApiLimit };
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUM7QUFDMUIsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDO0FBRTVCLE9BQU8sRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBkYklkQ2h1bmtTaXplID0gMTAwO1xuY29uc3QgRGVmYXVsdEFwaUxpbWl0ID0gMTAwO1xuXG5leHBvcnQgeyBkYklkQ2h1bmtTaXplLCBEZWZhdWx0QXBpTGltaXQgfTtcbiJdfQ==
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { AbstractErgoBoxEntity } from '@rosen-bridge/abstract-extractor';
|
|
2
|
+
declare class CollateralEntity extends AbstractErgoBoxEntity {
|
|
3
|
+
txId: string;
|
|
4
|
+
wid: string;
|
|
5
|
+
rwtCount: bigint;
|
|
6
|
+
}
|
|
7
|
+
export default CollateralEntity;
|
|
8
|
+
//# sourceMappingURL=collateralEntity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collateralEntity.d.ts","sourceRoot":"","sources":["../../lib/entities/collateralEntity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAIzE,cACM,gBAAiB,SAAQ,qBAAqB;IAElD,IAAI,EAAE,MAAM,CAAC;IAGb,GAAG,EAAE,MAAM,CAAC;IAGZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAe,gBAAgB,CAAC"}
|