@rosen-bridge/watcher-data-extractor 2.1.5 → 2.1.6
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/package.json +3 -3
- package/dist/actions/EventTriggerAction.d.ts +0 -35
- package/dist/actions/EventTriggerAction.d.ts.map +0 -1
- package/dist/actions/EventTriggerAction.js +0 -122
- package/dist/actions/commitmentAction.d.ts +0 -33
- package/dist/actions/commitmentAction.d.ts.map +0 -1
- package/dist/actions/commitmentAction.js +0 -110
- package/dist/actions/permitAction.d.ts +0 -64
- package/dist/actions/permitAction.d.ts.map +0 -1
- package/dist/actions/permitAction.js +0 -173
- package/dist/constants.d.ts +0 -4
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -4
- package/dist/entities/CommitmentEntity.d.ts +0 -17
- package/dist/entities/CommitmentEntity.d.ts.map +0 -1
- package/dist/entities/CommitmentEntity.js +0 -83
- package/dist/entities/EventTriggerEntity.d.ts +0 -28
- package/dist/entities/EventTriggerEntity.d.ts.map +0 -1
- package/dist/entities/EventTriggerEntity.js +0 -138
- package/dist/entities/PermitEntity.d.ts +0 -14
- package/dist/entities/PermitEntity.d.ts.map +0 -1
- package/dist/entities/PermitEntity.js +0 -68
- package/dist/extractor/EventTriggerExtractor.d.ts +0 -28
- package/dist/extractor/EventTriggerExtractor.d.ts.map +0 -1
- package/dist/extractor/EventTriggerExtractor.js +0 -126
- package/dist/extractor/commitmentExtractor.d.ts +0 -35
- package/dist/extractor/commitmentExtractor.d.ts.map +0 -1
- package/dist/extractor/commitmentExtractor.js +0 -110
- package/dist/extractor/permitExtractor.d.ts +0 -139
- package/dist/extractor/permitExtractor.d.ts.map +0 -1
- package/dist/extractor/permitExtractor.js +0 -227
- package/dist/index.d.ts +0 -10
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -10
- package/dist/interfaces/extractedCommitment.d.ts +0 -11
- package/dist/interfaces/extractedCommitment.d.ts.map +0 -1
- package/dist/interfaces/extractedCommitment.js +0 -2
- package/dist/interfaces/extractedEventTrigger.d.ts +0 -21
- package/dist/interfaces/extractedEventTrigger.d.ts.map +0 -1
- package/dist/interfaces/extractedEventTrigger.js +0 -2
- package/dist/interfaces/extractedPermit.d.ts +0 -12
- package/dist/interfaces/extractedPermit.d.ts.map +0 -1
- package/dist/interfaces/extractedPermit.js +0 -2
- package/dist/interfaces/types.d.ts +0 -20
- package/dist/interfaces/types.d.ts.map +0 -1
- package/dist/interfaces/types.js +0 -2
- package/dist/migrations/index.d.ts +0 -7
- package/dist/migrations/index.d.ts.map +0 -1
- package/dist/migrations/index.js +0 -9
- package/dist/migrations/postgres/1688554842087-migration.d.ts +0 -7
- package/dist/migrations/postgres/1688554842087-migration.d.ts.map +0 -1
- package/dist/migrations/postgres/1688554842087-migration.js +0 -82
- package/dist/migrations/postgres/1689175974257-migration.d.ts +0 -7
- package/dist/migrations/postgres/1689175974257-migration.d.ts.map +0 -1
- package/dist/migrations/postgres/1689175974257-migration.js +0 -50
- package/dist/migrations/sqlite/1688555766601-migration.d.ts +0 -7
- package/dist/migrations/sqlite/1688555766601-migration.d.ts.map +0 -1
- package/dist/migrations/sqlite/1688555766601-migration.js +0 -79
- package/dist/migrations/sqlite/1689175103163-migration.d.ts +0 -7
- package/dist/migrations/sqlite/1689175103163-migration.d.ts.map +0 -1
- package/dist/migrations/sqlite/1689175103163-migration.js +0 -392
- package/dist/utils.d.ts +0 -9
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js +0 -6
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rosen-bridge/watcher-data-extractor",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.6",
|
|
4
4
|
"description": "Extractor for rosen specific boxes on ergo blockchain",
|
|
5
5
|
"author": "Rosen Team",
|
|
6
6
|
"license": "GPL-3.0",
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
],
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@rosen-bridge/logger-interface": "^0.1.0",
|
|
23
|
-
"@rosen-bridge/scanner": "^2.1.
|
|
24
|
-
"@rosen-clients/ergo-explorer": "^1.0.
|
|
23
|
+
"@rosen-bridge/scanner": "^2.1.5",
|
|
24
|
+
"@rosen-clients/ergo-explorer": "^1.0.2",
|
|
25
25
|
"@types/lodash-es": "^4.17.6",
|
|
26
26
|
"blakejs": "^1.2.1",
|
|
27
27
|
"ergo-lib-wasm-nodejs": "^0.24.0-alpha-1f24f53",
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { DataSource } from 'typeorm';
|
|
2
|
-
import { BlockEntity } from '@rosen-bridge/scanner';
|
|
3
|
-
import { AbstractLogger } from '@rosen-bridge/logger-interface';
|
|
4
|
-
import { ExtractedEventTrigger } from '../interfaces/extractedEventTrigger';
|
|
5
|
-
declare class EventTriggerAction {
|
|
6
|
-
readonly logger: AbstractLogger;
|
|
7
|
-
private readonly datasource;
|
|
8
|
-
private readonly triggerEventRepository;
|
|
9
|
-
constructor(dataSource: DataSource, logger: AbstractLogger);
|
|
10
|
-
/**
|
|
11
|
-
* It stores list of eventTriggers in the dataSource with block id
|
|
12
|
-
* @param eventTriggers
|
|
13
|
-
* @param block
|
|
14
|
-
* @param extractor
|
|
15
|
-
*/
|
|
16
|
-
storeEventTriggers: (eventTriggers: Array<ExtractedEventTrigger>, block: BlockEntity, extractor: string) => Promise<boolean>;
|
|
17
|
-
/**
|
|
18
|
-
* Update spendBlock and spendHeight of eventTriggers spent on the block
|
|
19
|
-
* also update the spendTxId with the specified txId
|
|
20
|
-
* @param spendId
|
|
21
|
-
* @param block
|
|
22
|
-
* @param extractor
|
|
23
|
-
* @param txId
|
|
24
|
-
*/
|
|
25
|
-
spendEventTriggers: (spendId: Array<string>, block: BlockEntity, extractor: string, txId: string) => Promise<void>;
|
|
26
|
-
/**
|
|
27
|
-
* Delete all eventTriggers corresponding to the block(id) and extractor(id)
|
|
28
|
-
* and update all eventTriggers spent on the specified block
|
|
29
|
-
* @param block
|
|
30
|
-
* @param extractor
|
|
31
|
-
*/
|
|
32
|
-
deleteBlock: (block: string, extractor: string) => Promise<void>;
|
|
33
|
-
}
|
|
34
|
-
export default EventTriggerAction;
|
|
35
|
-
//# sourceMappingURL=EventTriggerAction.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EventTriggerAction.d.ts","sourceRoot":"","sources":["../../lib/actions/EventTriggerAction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAkB,MAAM,SAAS,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAGhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAG5E,cAAM,kBAAkB;IACtB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAiC;gBAE5D,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc;IAM1D;;;;;OAKG;IACH,kBAAkB,kBACD,MAAM,qBAAqB,CAAC,SACpC,WAAW,aACP,MAAM,sBAkEjB;IAEF;;;;;;;OAOG;IACH,kBAAkB,YACP,MAAM,MAAM,CAAC,SACf,WAAW,aACP,MAAM,QACX,MAAM,KACX,QAAQ,IAAI,CAAC,CAqBd;IAEF;;;;;OAKG;IACH,WAAW,UAAiB,MAAM,aAAa,MAAM,mBAYnD;CACH;AAED,eAAe,kBAAkB,CAAC"}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import { In } from 'typeorm';
|
|
2
|
-
import { chunk } from 'lodash-es';
|
|
3
|
-
import EventTriggerEntity from '../entities/EventTriggerEntity';
|
|
4
|
-
import { dbIdChunkSize } from '../constants';
|
|
5
|
-
class EventTriggerAction {
|
|
6
|
-
logger;
|
|
7
|
-
datasource;
|
|
8
|
-
triggerEventRepository;
|
|
9
|
-
constructor(dataSource, logger) {
|
|
10
|
-
this.datasource = dataSource;
|
|
11
|
-
this.logger = logger;
|
|
12
|
-
this.triggerEventRepository = dataSource.getRepository(EventTriggerEntity);
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* It stores list of eventTriggers in the dataSource with block id
|
|
16
|
-
* @param eventTriggers
|
|
17
|
-
* @param block
|
|
18
|
-
* @param extractor
|
|
19
|
-
*/
|
|
20
|
-
storeEventTriggers = async (eventTriggers, block, extractor) => {
|
|
21
|
-
if (eventTriggers.length === 0)
|
|
22
|
-
return true;
|
|
23
|
-
const boxIds = eventTriggers.map((trigger) => trigger.boxId);
|
|
24
|
-
const savedTriggers = await this.triggerEventRepository.findBy({
|
|
25
|
-
boxId: In(boxIds),
|
|
26
|
-
extractor: extractor,
|
|
27
|
-
});
|
|
28
|
-
let success = true;
|
|
29
|
-
const queryRunner = this.datasource.createQueryRunner();
|
|
30
|
-
await queryRunner.connect();
|
|
31
|
-
await queryRunner.startTransaction();
|
|
32
|
-
const repository = await queryRunner.manager.getRepository(EventTriggerEntity);
|
|
33
|
-
try {
|
|
34
|
-
for (const trigger of eventTriggers) {
|
|
35
|
-
const saved = savedTriggers.some((entity) => {
|
|
36
|
-
return entity.boxId === trigger.boxId;
|
|
37
|
-
});
|
|
38
|
-
const entity = {
|
|
39
|
-
txId: trigger.txId,
|
|
40
|
-
eventId: trigger.eventId,
|
|
41
|
-
boxId: trigger.boxId,
|
|
42
|
-
boxSerialized: trigger.boxSerialized,
|
|
43
|
-
block: block.hash,
|
|
44
|
-
height: block.height,
|
|
45
|
-
extractor: extractor,
|
|
46
|
-
WIDs: trigger.WIDs,
|
|
47
|
-
amount: trigger.amount,
|
|
48
|
-
bridgeFee: trigger.bridgeFee,
|
|
49
|
-
fromAddress: trigger.fromAddress,
|
|
50
|
-
toAddress: trigger.toAddress,
|
|
51
|
-
fromChain: trigger.fromChain,
|
|
52
|
-
networkFee: trigger.networkFee,
|
|
53
|
-
sourceChainTokenId: trigger.sourceChainTokenId,
|
|
54
|
-
targetChainTokenId: trigger.targetChainTokenId,
|
|
55
|
-
sourceBlockId: trigger.sourceBlockId,
|
|
56
|
-
toChain: trigger.toChain,
|
|
57
|
-
sourceTxId: trigger.sourceTxId,
|
|
58
|
-
sourceChainHeight: trigger.sourceChainHeight,
|
|
59
|
-
};
|
|
60
|
-
if (!saved) {
|
|
61
|
-
this.logger.info(`Storing event trigger [${trigger.boxId}] for event [${trigger.eventId}] at height ${block.height} and extractor ${extractor}`);
|
|
62
|
-
await repository.insert(entity);
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
this.logger.info(`Updating event trigger ${trigger.boxId} for event [${trigger.eventId}] at height ${block.height} and extractor ${extractor}`);
|
|
66
|
-
await repository.update({ boxId: trigger.boxId }, entity);
|
|
67
|
-
}
|
|
68
|
-
this.logger.debug(`Entity: ${JSON.stringify(entity)}`);
|
|
69
|
-
}
|
|
70
|
-
await queryRunner.commitTransaction();
|
|
71
|
-
}
|
|
72
|
-
catch (e) {
|
|
73
|
-
this.logger.error(`An error occurred during store eventTrigger action: ${e}`);
|
|
74
|
-
await queryRunner.rollbackTransaction();
|
|
75
|
-
success = false;
|
|
76
|
-
}
|
|
77
|
-
finally {
|
|
78
|
-
await queryRunner.release();
|
|
79
|
-
}
|
|
80
|
-
return success;
|
|
81
|
-
};
|
|
82
|
-
/**
|
|
83
|
-
* Update spendBlock and spendHeight of eventTriggers spent on the block
|
|
84
|
-
* also update the spendTxId with the specified txId
|
|
85
|
-
* @param spendId
|
|
86
|
-
* @param block
|
|
87
|
-
* @param extractor
|
|
88
|
-
* @param txId
|
|
89
|
-
*/
|
|
90
|
-
spendEventTriggers = async (spendId, block, extractor, txId) => {
|
|
91
|
-
const spendIdChunks = chunk(spendId, dbIdChunkSize);
|
|
92
|
-
for (const spendIdChunk of spendIdChunks) {
|
|
93
|
-
const updateResult = await this.triggerEventRepository.update({ boxId: In(spendIdChunk), extractor: extractor }, { spendBlock: block.hash, spendHeight: block.height, spendTxId: txId });
|
|
94
|
-
if (updateResult.affected && updateResult.affected > 0) {
|
|
95
|
-
const spentRows = await this.triggerEventRepository.findBy({
|
|
96
|
-
boxId: In(spendIdChunk),
|
|
97
|
-
spendBlock: block.hash,
|
|
98
|
-
});
|
|
99
|
-
for (const row of spentRows) {
|
|
100
|
-
this.logger.info(`Spent trigger [${row.boxId}] of event [${row.eventId}] at height ${block.height}`);
|
|
101
|
-
this.logger.debug(`Spent trigger: [${JSON.stringify(row)}]`);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
};
|
|
106
|
-
/**
|
|
107
|
-
* Delete all eventTriggers corresponding to the block(id) and extractor(id)
|
|
108
|
-
* and update all eventTriggers spent on the specified block
|
|
109
|
-
* @param block
|
|
110
|
-
* @param extractor
|
|
111
|
-
*/
|
|
112
|
-
deleteBlock = async (block, extractor) => {
|
|
113
|
-
this.logger.info(`Deleting event triggers at block ${block} and extractor ${extractor}`);
|
|
114
|
-
await this.triggerEventRepository.delete({
|
|
115
|
-
block: block,
|
|
116
|
-
extractor: extractor,
|
|
117
|
-
});
|
|
118
|
-
await this.triggerEventRepository.update({ spendBlock: block, extractor: extractor }, { spendBlock: null, spendHeight: 0 });
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
export default EventTriggerAction;
|
|
122
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRUcmlnZ2VyQWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2FjdGlvbnMvRXZlbnRUcmlnZ2VyQWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxFQUFFLEVBQWMsTUFBTSxTQUFTLENBQUM7QUFDckQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUlsQyxPQUFPLGtCQUFrQixNQUFNLGdDQUFnQyxDQUFDO0FBRWhFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFN0MsTUFBTSxrQkFBa0I7SUFDYixNQUFNLENBQWlCO0lBQ2YsVUFBVSxDQUFhO0lBQ3ZCLHNCQUFzQixDQUFpQztJQUV4RSxZQUFZLFVBQXNCLEVBQUUsTUFBc0I7UUFDeEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxrQkFBa0IsR0FBRyxLQUFLLEVBQ3hCLGFBQTJDLEVBQzNDLEtBQWtCLEVBQ2xCLFNBQWlCLEVBQ2pCLEVBQUU7UUFDRixJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQzVDLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3RCxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUM7WUFDN0QsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDakIsU0FBUyxFQUFFLFNBQVM7U0FDckIsQ0FBQyxDQUFDO1FB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QUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDOUQ7YUFDRjtTQUNGO0lBQ0gsQ0FBQyxDQUFDO0lBRUY7Ozs7O09BS0c7SUFDSCxXQUFXLEdBQUcsS0FBSyxFQUFFLEtBQWEsRUFBRSxTQUFpQixFQUFFLEVBQUU7UUFDdkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2Qsb0NBQW9DLEtBQUssa0JBQWtCLFNBQVMsRUFBRSxDQUN2RSxDQUFDO1FBQ0YsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDO1lBQ3ZDLEtBQUssRUFBRSxLQUFLO1lBQ1osU0FBUyxFQUFFLFNBQVM7U0FDckIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUN0QyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxFQUMzQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUNyQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0NBQ0g7QUFFRCxlQUFlLGtCQUFrQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YVNvdXJjZSwgSW4sIFJlcG9zaXRvcnkgfSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IGNodW5rIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJsb2NrRW50aXR5IH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyJztcbmltcG9ydCB7IEFic3RyYWN0TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9sb2dnZXItaW50ZXJmYWNlJztcblxuaW1wb3J0IEV2ZW50VHJpZ2dlckVudGl0eSBmcm9tICcuLi9lbnRpdGllcy9FdmVudFRyaWdnZXJFbnRpdHknO1xuaW1wb3J0IHsgRXh0cmFjdGVkRXZlbnRUcmlnZ2VyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9leHRyYWN0ZWRFdmVudFRyaWdnZXInO1xuaW1wb3J0IHsgZGJJZENodW5rU2l6ZSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5cbmNsYXNzIEV2ZW50VHJpZ2dlckFjdGlvbiB7XG4gIHJlYWRvbmx5IGxvZ2dlcjogQWJzdHJhY3RMb2dnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YXNvdXJjZTogRGF0YVNvdXJjZTtcbiAgcHJpdmF0ZSByZWFkb25seSB0cmlnZ2VyRXZlbnRSZXBvc2l0b3J5OiBSZXBvc2l0b3J5PEV2ZW50VHJpZ2dlckVudGl0eT47XG5cbiAgY29uc3RydWN0b3IoZGF0YVNvdXJjZTogRGF0YVNvdXJjZSwgbG9nZ2VyOiBBYnN0cmFjdExvZ2dlcikge1xuICAgIHRoaXMuZGF0YXNvdXJjZSA9IGRhdGFTb3VyY2U7XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7XG4gICAgdGhpcy50cmlnZ2VyRXZlbnRSZXBvc2l0b3J5ID0gZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KEV2ZW50VHJpZ2dlckVudGl0eSk7XG4gIH1cblxuICAvKipcbiAgICogSXQgc3RvcmVzIGxpc3Qgb2YgZXZlbnRUcmlnZ2VycyBpbiB0aGUgZGF0YVNvdXJjZSB3aXRoIGJsb2NrIGlkXG4gICAqIEBwYXJhbSBldmVudFRyaWdnZXJzXG4gICAqIEBwYXJhbSBibG9ja1xuICAgKiBAcGFyYW0gZXh0cmFjdG9yXG4gICAqL1xuICBzdG9yZUV2ZW50VHJpZ2dlcnMgPSBhc3luYyAoXG4gICAgZXZlbnRUcmlnZ2VyczogQXJyYXk8RXh0cmFjdGVkRXZlbnRUcmlnZ2VyPixcbiAgICBibG9jazogQmxvY2tFbnRpdHksXG4gICAgZXh0cmFjdG9yOiBzdHJpbmdcbiAgKSA9PiB7XG4gICAgaWYgKGV2ZW50VHJpZ2dlcnMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBib3hJZHMgPSBldmVudFRyaWdnZXJzLm1hcCgodHJpZ2dlcikgPT4gdHJpZ2dlci5ib3hJZCk7XG4gICAgY29uc3Qgc2F2ZWRUcmlnZ2VycyA9IGF3YWl0IHRoaXMudHJpZ2dlckV2ZW50UmVwb3NpdG9yeS5maW5kQnkoe1xuICAgICAgYm94SWQ6IEluKGJveElkcyksXG4gICAgICBleHRyYWN0b3I6IGV4dHJhY3RvcixcbiAgICB9KTtcbiAgICBsZXQgc3VjY2VzcyA9IHRydWU7XG4gICAgY29uc3QgcXVlcnlSdW5uZXIgPSB0aGlzLmRhdGFzb3VyY2UuY3JlYXRlUXVlcnlSdW5uZXIoKTtcbiAgICBhd2FpdCBxdWVyeVJ1bm5lci5jb25uZWN0KCk7XG4gICAgYXdhaXQgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpO1xuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLmdldFJlcG9zaXRvcnkoXG4gICAgICBFdmVudFRyaWdnZXJFbnRpdHlcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IHRyaWdnZXIgb2YgZXZlbnRUcmlnZ2Vycykge1xuICAgICAgICBjb25zdCBzYXZlZCA9IHNhdmVkVHJpZ2dlcnMuc29tZSgoZW50aXR5KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGVudGl0eS5ib3hJZCA9PT0gdHJpZ2dlci5ib3hJZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGVudGl0eSA9IHtcbiAgICAgICAgICB0eElkOiB0cmlnZ2VyLnR4SWQsXG4gICAgICAgICAgZXZlbnRJZDogdHJpZ2dlci5ldmVudElkLFxuICAgICAgICAgIGJveElkOiB0cmlnZ2VyLmJveElkLFxuICAgICAgICAgIGJveFNlcmlhbGl6ZWQ6IHRyaWdnZXIuYm94U2VyaWFsaXplZCxcbiAgICAgICAgICBibG9jazogYmxvY2suaGFzaCxcbiAgICAgICAgICBoZWlnaHQ6IGJsb2NrLmhlaWdodCxcbiAgICAgICAgICBleHRyYWN0b3I6IGV4dHJhY3RvcixcbiAgICAgICAgICBXSURzOiB0cmlnZ2VyLldJRHMsXG4gICAgICAgICAgYW1vdW50OiB0cmlnZ2VyLmFtb3VudCxcbiAgICAgICAgICBicmlkZ2VGZWU6IHRyaWdnZXIuYnJpZGdlRmVlLFxuICAgICAgICAgIGZyb21BZGRyZXNzOiB0cmlnZ2VyLmZyb21BZGRyZXNzLFxuICAgICAgICAgIHRvQWRkcmVzczogdHJpZ2dlci50b0FkZHJlc3MsXG4gICAgICAgICAgZnJvbUNoYWluOiB0cmlnZ2VyLmZyb21DaGFpbixcbiAgICAgICAgICBuZXR3b3JrRmVlOiB0cmlnZ2VyLm5ldHdvcmtGZWUsXG4gICAgICAgICAgc291cmNlQ2hhaW5Ub2tlbklkOiB0cmlnZ2VyLnNvdXJjZUNoYWluVG9rZW5JZCxcbiAgICAgICAgICB0YXJnZXRDaGFpblRva2VuSWQ6IHRyaWdnZXIudGFyZ2V0Q2hhaW5Ub2tlbklkLFxuICAgICAgICAgIHNvdXJjZUJsb2NrSWQ6IHRyaWdnZXIuc291cmNlQmxvY2tJZCxcbiAgICAgICAgICB0b0NoYWluOiB0cmlnZ2VyLnRvQ2hhaW4sXG4gICAgICAgICAgc291cmNlVHhJZDogdHJpZ2dlci5zb3VyY2VUeElkLFxuICAgICAgICAgIHNvdXJjZUNoYWluSGVpZ2h0OiB0cmlnZ2VyLnNvdXJjZUNoYWluSGVpZ2h0LFxuICAgICAgICB9O1xuICAgICAgICBpZiAoIXNhdmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgICAgIGBTdG9yaW5nIGV2ZW50IHRyaWdnZXIgWyR7dHJpZ2dlci5ib3hJZH1dIGZvciBldmVudCBbJHt0cmlnZ2VyLmV2ZW50SWR9XSBhdCBoZWlnaHQgJHtibG9jay5oZWlnaHR9IGFuZCBleHRyYWN0b3IgJHtleHRyYWN0b3J9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgcmVwb3NpdG9yeS5pbnNlcnQoZW50aXR5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgYFVwZGF0aW5nIGV2ZW50IHRyaWdnZXIgJHt0cmlnZ2VyLmJveElkfSBmb3IgZXZlbnQgWyR7dHJpZ2dlci5ldmVudElkfV0gYXQgaGVpZ2h0ICR7YmxvY2suaGVpZ2h0fSBhbmQgZXh0cmFjdG9yICR7ZXh0cmFjdG9yfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IHJlcG9zaXRvcnkudXBkYXRlKHsgYm94SWQ6IHRyaWdnZXIuYm94SWQgfSwgZW50aXR5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgRW50aXR5OiAke0pTT04uc3RyaW5naWZ5KGVudGl0eSl9YCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICBgQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHN0b3JlIGV2ZW50VHJpZ2dlciBhY3Rpb246ICR7ZX1gXG4gICAgICApO1xuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpO1xuICAgICAgc3VjY2VzcyA9IGZhbHNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yZWxlYXNlKCk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZXNzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgc3BlbmRCbG9jayBhbmQgc3BlbmRIZWlnaHQgb2YgZXZlbnRUcmlnZ2VycyBzcGVudCBvbiB0aGUgYmxvY2tcbiAgICogYWxzbyB1cGRhdGUgdGhlIHNwZW5kVHhJZCB3aXRoIHRoZSBzcGVjaWZpZWQgdHhJZFxuICAgKiBAcGFyYW0gc3BlbmRJZFxuICAgKiBAcGFyYW0gYmxvY2tcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gdHhJZFxuICAgKi9cbiAgc3BlbmRFdmVudFRyaWdnZXJzID0gYXN5bmMgKFxuICAgIHNwZW5kSWQ6IEFycmF5PHN0cmluZz4sXG4gICAgYmxvY2s6IEJsb2NrRW50aXR5LFxuICAgIGV4dHJhY3Rvcjogc3RyaW5nLFxuICAgIHR4SWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBzcGVuZElkQ2h1bmtzID0gY2h1bmsoc3BlbmRJZCwgZGJJZENodW5rU2l6ZSk7XG4gICAgZm9yIChjb25zdCBzcGVuZElkQ2h1bmsgb2Ygc3BlbmRJZENodW5rcykge1xuICAgICAgY29uc3QgdXBkYXRlUmVzdWx0ID0gYXdhaXQgdGhpcy50cmlnZ2VyRXZlbnRSZXBvc2l0b3J5LnVwZGF0ZShcbiAgICAgICAgeyBib3hJZDogSW4oc3BlbmRJZENodW5rKSwgZXh0cmFjdG9yOiBleHRyYWN0b3IgfSxcbiAgICAgICAgeyBzcGVuZEJsb2NrOiBibG9jay5oYXNoLCBzcGVuZEhlaWdodDogYmxvY2suaGVpZ2h0LCBzcGVuZFR4SWQ6IHR4SWQgfVxuICAgICAgKTtcblxuICAgICAgaWYgKHVwZGF0ZVJlc3VsdC5hZmZlY3RlZCAmJiB1cGRhdGVSZXN1bHQuYWZmZWN0ZWQgPiAwKSB7XG4gICAgICAgIGNvbnN0IHNwZW50Um93cyA9IGF3YWl0IHRoaXMudHJpZ2dlckV2ZW50UmVwb3NpdG9yeS5maW5kQnkoe1xuICAgICAgICAgIGJveElkOiBJbihzcGVuZElkQ2h1bmspLFxuICAgICAgICAgIHNwZW5kQmxvY2s6IGJsb2NrLmhhc2gsXG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiBzcGVudFJvd3MpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgYFNwZW50IHRyaWdnZXIgWyR7cm93LmJveElkfV0gb2YgZXZlbnQgWyR7cm93LmV2ZW50SWR9XSBhdCBoZWlnaHQgJHtibG9jay5oZWlnaHR9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFNwZW50IHRyaWdnZXI6IFske0pTT04uc3RyaW5naWZ5KHJvdyl9XWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBEZWxldGUgYWxsIGV2ZW50VHJpZ2dlcnMgY29ycmVzcG9uZGluZyB0byB0aGUgYmxvY2soaWQpIGFuZCBleHRyYWN0b3IoaWQpXG4gICAqIGFuZCB1cGRhdGUgYWxsIGV2ZW50VHJpZ2dlcnMgc3BlbnQgb24gdGhlIHNwZWNpZmllZCBibG9ja1xuICAgKiBAcGFyYW0gYmxvY2tcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKi9cbiAgZGVsZXRlQmxvY2sgPSBhc3luYyAoYmxvY2s6IHN0cmluZywgZXh0cmFjdG9yOiBzdHJpbmcpID0+IHtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgYERlbGV0aW5nIGV2ZW50IHRyaWdnZXJzIGF0IGJsb2NrICR7YmxvY2t9IGFuZCBleHRyYWN0b3IgJHtleHRyYWN0b3J9YFxuICAgICk7XG4gICAgYXdhaXQgdGhpcy50cmlnZ2VyRXZlbnRSZXBvc2l0b3J5LmRlbGV0ZSh7XG4gICAgICBibG9jazogYmxvY2ssXG4gICAgICBleHRyYWN0b3I6IGV4dHJhY3RvcixcbiAgICB9KTtcbiAgICBhd2FpdCB0aGlzLnRyaWdnZXJFdmVudFJlcG9zaXRvcnkudXBkYXRlKFxuICAgICAgeyBzcGVuZEJsb2NrOiBibG9jaywgZXh0cmFjdG9yOiBleHRyYWN0b3IgfSxcbiAgICAgIHsgc3BlbmRCbG9jazogbnVsbCwgc3BlbmRIZWlnaHQ6IDAgfVxuICAgICk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IEV2ZW50VHJpZ2dlckFjdGlvbjtcbiJdfQ==
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { DataSource } from 'typeorm';
|
|
2
|
-
import { BlockEntity } from '@rosen-bridge/scanner';
|
|
3
|
-
import { AbstractLogger } from '@rosen-bridge/logger-interface';
|
|
4
|
-
import { extractedCommitment } from '../interfaces/extractedCommitment';
|
|
5
|
-
declare class CommitmentAction {
|
|
6
|
-
readonly logger: AbstractLogger;
|
|
7
|
-
private readonly datasource;
|
|
8
|
-
private readonly commitmentRepository;
|
|
9
|
-
constructor(dataSource: DataSource, logger: AbstractLogger);
|
|
10
|
-
/**
|
|
11
|
-
* It stores list of observations in the dataSource with block id
|
|
12
|
-
* @param commitments
|
|
13
|
-
* @param block
|
|
14
|
-
* @param extractor
|
|
15
|
-
*/
|
|
16
|
-
storeCommitments: (commitments: Array<extractedCommitment>, block: BlockEntity, extractor: string) => Promise<boolean>;
|
|
17
|
-
/**
|
|
18
|
-
* Update spendBlock and spendHeight of commitments spent on the block
|
|
19
|
-
* @param spendId
|
|
20
|
-
* @param block
|
|
21
|
-
* @param extractor
|
|
22
|
-
*/
|
|
23
|
-
spendCommitments: (spendId: Array<string>, block: BlockEntity, extractor: string) => Promise<void>;
|
|
24
|
-
/**
|
|
25
|
-
* Delete all commitments corresponding to the block(id) and extractor(id)
|
|
26
|
-
* and update all commitments spent on the specified block
|
|
27
|
-
* @param block
|
|
28
|
-
* @param extractor
|
|
29
|
-
*/
|
|
30
|
-
deleteBlock: (block: string, extractor: string) => Promise<void>;
|
|
31
|
-
}
|
|
32
|
-
export default CommitmentAction;
|
|
33
|
-
//# sourceMappingURL=commitmentAction.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"commitmentAction.d.ts","sourceRoot":"","sources":["../../lib/actions/commitmentAction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAkB,MAAM,SAAS,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAIxE,cAAM,gBAAgB;IACpB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA+B;gBAExD,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc;IAM1D;;;;;OAKG;IACH,gBAAgB,gBACD,MAAM,mBAAmB,CAAC,SAChC,WAAW,aACP,MAAM,KAChB,QAAQ,OAAO,CAAC,CAuDjB;IAEF;;;;;OAKG;IACH,gBAAgB,YACL,MAAM,MAAM,CAAC,SACf,WAAW,aACP,MAAM,KAChB,QAAQ,IAAI,CAAC,CAqBd;IAEF;;;;;OAKG;IACH,WAAW,UAAiB,MAAM,aAAa,MAAM,mBAYnD;CACH;AAED,eAAe,gBAAgB,CAAC"}
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import { In } from 'typeorm';
|
|
2
|
-
import { chunk } from 'lodash-es';
|
|
3
|
-
import CommitmentEntity from '../entities/CommitmentEntity';
|
|
4
|
-
import { dbIdChunkSize } from '../constants';
|
|
5
|
-
class CommitmentAction {
|
|
6
|
-
logger;
|
|
7
|
-
datasource;
|
|
8
|
-
commitmentRepository;
|
|
9
|
-
constructor(dataSource, logger) {
|
|
10
|
-
this.datasource = dataSource;
|
|
11
|
-
this.logger = logger;
|
|
12
|
-
this.commitmentRepository = dataSource.getRepository(CommitmentEntity);
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* It stores list of observations in the dataSource with block id
|
|
16
|
-
* @param commitments
|
|
17
|
-
* @param block
|
|
18
|
-
* @param extractor
|
|
19
|
-
*/
|
|
20
|
-
storeCommitments = async (commitments, block, extractor) => {
|
|
21
|
-
if (commitments.length === 0)
|
|
22
|
-
return true;
|
|
23
|
-
const boxIds = commitments.map((commitment) => commitment.boxId);
|
|
24
|
-
const savedCommitments = await this.commitmentRepository.findBy({
|
|
25
|
-
boxId: In(boxIds),
|
|
26
|
-
extractor: extractor,
|
|
27
|
-
});
|
|
28
|
-
let success = true;
|
|
29
|
-
const queryRunner = this.datasource.createQueryRunner();
|
|
30
|
-
await queryRunner.connect();
|
|
31
|
-
await queryRunner.startTransaction();
|
|
32
|
-
const repository = await queryRunner.manager.getRepository(CommitmentEntity);
|
|
33
|
-
try {
|
|
34
|
-
for (const commitment of commitments) {
|
|
35
|
-
const saved = savedCommitments.some((entity) => {
|
|
36
|
-
return entity.boxId === commitment.boxId;
|
|
37
|
-
});
|
|
38
|
-
const entity = {
|
|
39
|
-
txId: commitment.txId,
|
|
40
|
-
commitment: commitment.commitment,
|
|
41
|
-
eventId: commitment.eventId,
|
|
42
|
-
boxId: commitment.boxId,
|
|
43
|
-
WID: commitment.WID,
|
|
44
|
-
extractor: extractor,
|
|
45
|
-
block: block.hash,
|
|
46
|
-
height: block.height,
|
|
47
|
-
boxSerialized: commitment.boxSerialized,
|
|
48
|
-
rwtCount: commitment.rwtCount,
|
|
49
|
-
};
|
|
50
|
-
if (!saved) {
|
|
51
|
-
this.logger.info(`Saving commitment [${commitment.boxId}] for event [${commitment.eventId}] from watcher [${commitment.WID}] at height ${block.height} and extractor ${extractor}`);
|
|
52
|
-
await repository.insert(entity);
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
this.logger.info(`Updating commitment [${commitment.boxId}] for event [${commitment.eventId}] from watcher [${commitment.WID}] at height ${block.height} and extractor ${extractor}`);
|
|
56
|
-
await repository.update({ boxId: commitment.boxId }, entity);
|
|
57
|
-
}
|
|
58
|
-
this.logger.debug(`Entity: ${JSON.stringify(entity)}`);
|
|
59
|
-
}
|
|
60
|
-
await queryRunner.commitTransaction();
|
|
61
|
-
}
|
|
62
|
-
catch (e) {
|
|
63
|
-
this.logger.error(`An error occurred during store commitments action: ${e}`);
|
|
64
|
-
await queryRunner.rollbackTransaction();
|
|
65
|
-
success = false;
|
|
66
|
-
}
|
|
67
|
-
finally {
|
|
68
|
-
await queryRunner.release();
|
|
69
|
-
}
|
|
70
|
-
return success;
|
|
71
|
-
};
|
|
72
|
-
/**
|
|
73
|
-
* Update spendBlock and spendHeight of commitments spent on the block
|
|
74
|
-
* @param spendId
|
|
75
|
-
* @param block
|
|
76
|
-
* @param extractor
|
|
77
|
-
*/
|
|
78
|
-
spendCommitments = async (spendId, block, extractor) => {
|
|
79
|
-
const spendIdChunks = chunk(spendId, dbIdChunkSize);
|
|
80
|
-
for (const spendIdChunk of spendIdChunks) {
|
|
81
|
-
const updateResult = await this.commitmentRepository.update({ boxId: In(spendIdChunk), extractor: extractor }, { spendBlock: block.hash, spendHeight: block.height });
|
|
82
|
-
if (updateResult.affected && updateResult.affected > 0) {
|
|
83
|
-
const spentRows = await this.commitmentRepository.findBy({
|
|
84
|
-
boxId: In(spendIdChunk),
|
|
85
|
-
spendBlock: block.hash,
|
|
86
|
-
});
|
|
87
|
-
for (const row of spentRows) {
|
|
88
|
-
this.logger.info(`Spent commitment [${row.boxId}] for event [${row.eventId}] at height ${block.height}`);
|
|
89
|
-
this.logger.debug(`Spent commitment [${JSON.stringify(row)}]`);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
/**
|
|
95
|
-
* Delete all commitments corresponding to the block(id) and extractor(id)
|
|
96
|
-
* and update all commitments spent on the specified block
|
|
97
|
-
* @param block
|
|
98
|
-
* @param extractor
|
|
99
|
-
*/
|
|
100
|
-
deleteBlock = async (block, extractor) => {
|
|
101
|
-
this.logger.info(`Deleting commitments of block [${block}] and extractor ${extractor}`);
|
|
102
|
-
await this.commitmentRepository.delete({
|
|
103
|
-
block: block,
|
|
104
|
-
extractor: extractor,
|
|
105
|
-
});
|
|
106
|
-
await this.commitmentRepository.update({ spendBlock: block, extractor: extractor }, { spendBlock: null, spendHeight: 0 });
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
export default CommitmentAction;
|
|
110
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0bWVudEFjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9hY3Rpb25zL2NvbW1pdG1lbnRBY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLEVBQUUsRUFBYyxNQUFNLFNBQVMsQ0FBQztBQUNyRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBS2xDLE9BQU8sZ0JBQWdCLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU3QyxNQUFNLGdCQUFnQjtJQUNYLE1BQU0sQ0FBaUI7SUFDZixVQUFVLENBQWE7SUFDdkIsb0JBQW9CLENBQStCO0lBRXBFLFlBQVksVUFBc0IsRUFBRSxNQUFzQjtRQUN4RCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGdCQUFnQixHQUFHLEtBQUssRUFDdEIsV0FBdUMsRUFDdkMsS0FBa0IsRUFDbEIsU0FBaUIsRUFDQyxFQUFFO1FBQ3BCLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDMUMsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDO1lBQzlELEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2pCLFNBQVMsRUFBRSxTQUFTO1NBQ3JCLENBQUMsQ0FBQztRQUNI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QUNILE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FDcEMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsRUFDM0MsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FDckMsQ0FBQztJQUNKLENBQUMsQ0FBQztDQUNIO0FBRUQsZUFBZSxnQkFBZ0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFTb3VyY2UsIEluLCBSZXBvc2l0b3J5IH0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBjaHVuayB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBCbG9ja0VudGl0eSB9IGZyb20gJ0Byb3Nlbi1icmlkZ2Uvc2Nhbm5lcic7XG5pbXBvcnQgeyBBYnN0cmFjdExvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvbG9nZ2VyLWludGVyZmFjZSc7XG5cbmltcG9ydCB7IGV4dHJhY3RlZENvbW1pdG1lbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2V4dHJhY3RlZENvbW1pdG1lbnQnO1xuaW1wb3J0IENvbW1pdG1lbnRFbnRpdHkgZnJvbSAnLi4vZW50aXRpZXMvQ29tbWl0bWVudEVudGl0eSc7XG5pbXBvcnQgeyBkYklkQ2h1bmtTaXplIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuY2xhc3MgQ29tbWl0bWVudEFjdGlvbiB7XG4gIHJlYWRvbmx5IGxvZ2dlcjogQWJzdHJhY3RMb2dnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YXNvdXJjZTogRGF0YVNvdXJjZTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb21taXRtZW50UmVwb3NpdG9yeTogUmVwb3NpdG9yeTxDb21taXRtZW50RW50aXR5PjtcblxuICBjb25zdHJ1Y3RvcihkYXRhU291cmNlOiBEYXRhU291cmNlLCBsb2dnZXI6IEFic3RyYWN0TG9nZ2VyKSB7XG4gICAgdGhpcy5kYXRhc291cmNlID0gZGF0YVNvdXJjZTtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcbiAgICB0aGlzLmNvbW1pdG1lbnRSZXBvc2l0b3J5ID0gZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KENvbW1pdG1lbnRFbnRpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0IHN0b3JlcyBsaXN0IG9mIG9ic2VydmF0aW9ucyBpbiB0aGUgZGF0YVNvdXJjZSB3aXRoIGJsb2NrIGlkXG4gICAqIEBwYXJhbSBjb21taXRtZW50c1xuICAgKiBAcGFyYW0gYmxvY2tcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKi9cbiAgc3RvcmVDb21taXRtZW50cyA9IGFzeW5jIChcbiAgICBjb21taXRtZW50czogQXJyYXk8ZXh0cmFjdGVkQ29tbWl0bWVudD4sXG4gICAgYmxvY2s6IEJsb2NrRW50aXR5LFxuICAgIGV4dHJhY3Rvcjogc3RyaW5nXG4gICk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIGlmIChjb21taXRtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGJveElkcyA9IGNvbW1pdG1lbnRzLm1hcCgoY29tbWl0bWVudCkgPT4gY29tbWl0bWVudC5ib3hJZCk7XG4gICAgY29uc3Qgc2F2ZWRDb21taXRtZW50cyA9IGF3YWl0IHRoaXMuY29tbWl0bWVudFJlcG9zaXRvcnkuZmluZEJ5KHtcbiAgICAgIGJveElkOiBJbihib3hJZHMpLFxuICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgfSk7XG4gICAgbGV0IHN1Y2Nlc3MgPSB0cnVlO1xuICAgIGNvbnN0IHF1ZXJ5UnVubmVyID0gdGhpcy5kYXRhc291cmNlLmNyZWF0ZVF1ZXJ5UnVubmVyKCk7XG4gICAgYXdhaXQgcXVlcnlSdW5uZXIuY29ubmVjdCgpO1xuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKTtcbiAgICBjb25zdCByZXBvc2l0b3J5ID0gYXdhaXQgcXVlcnlSdW5uZXIubWFuYWdlci5nZXRSZXBvc2l0b3J5KFxuICAgICAgQ29tbWl0bWVudEVudGl0eVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgY29tbWl0bWVudCBvZiBjb21taXRtZW50cykge1xuICAgICAgICBjb25zdCBzYXZlZCA9IHNhdmVkQ29tbWl0bWVudHMuc29tZSgoZW50aXR5KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGVudGl0eS5ib3hJZCA9PT0gY29tbWl0bWVudC5ib3hJZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGVudGl0eSA9IHtcbiAgICAgICAgICB0eElkOiBjb21taXRtZW50LnR4SWQsXG4gICAgICAgICAgY29tbWl0bWVudDogY29tbWl0bWVudC5jb21taXRtZW50LFxuICAgICAgICAgIGV2ZW50SWQ6IGNvbW1pdG1lbnQuZXZlbnRJZCxcbiAgICAgICAgICBib3hJZDogY29tbWl0bWVudC5ib3hJZCxcbiAgICAgICAgICBXSUQ6IGNvbW1pdG1lbnQuV0lELFxuICAgICAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgICAgICAgIGJsb2NrOiBibG9jay5oYXNoLFxuICAgICAgICAgIGhlaWdodDogYmxvY2suaGVpZ2h0LFxuICAgICAgICAgIGJveFNlcmlhbGl6ZWQ6IGNvbW1pdG1lbnQuYm94U2VyaWFsaXplZCxcbiAgICAgICAgICByd3RDb3VudDogY29tbWl0bWVudC5yd3RDb3VudCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFzYXZlZCkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgICAgICBgU2F2aW5nIGNvbW1pdG1lbnQgWyR7Y29tbWl0bWVudC5ib3hJZH1dIGZvciBldmVudCBbJHtjb21taXRtZW50LmV2ZW50SWR9XSBmcm9tIHdhdGNoZXIgWyR7Y29tbWl0bWVudC5XSUR9XSBhdCBoZWlnaHQgJHtibG9jay5oZWlnaHR9IGFuZCBleHRyYWN0b3IgJHtleHRyYWN0b3J9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgcmVwb3NpdG9yeS5pbnNlcnQoZW50aXR5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgYFVwZGF0aW5nIGNvbW1pdG1lbnQgWyR7Y29tbWl0bWVudC5ib3hJZH1dIGZvciBldmVudCBbJHtjb21taXRtZW50LmV2ZW50SWR9XSBmcm9tIHdhdGNoZXIgWyR7Y29tbWl0bWVudC5XSUR9XSBhdCBoZWlnaHQgJHtibG9jay5oZWlnaHR9IGFuZCBleHRyYWN0b3IgJHtleHRyYWN0b3J9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgcmVwb3NpdG9yeS51cGRhdGUoeyBib3hJZDogY29tbWl0bWVudC5ib3hJZCB9LCBlbnRpdHkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBFbnRpdHk6ICR7SlNPTi5zdHJpbmdpZnkoZW50aXR5KX1gKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbW1pdFRyYW5zYWN0aW9uKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgIGBBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgc3RvcmUgY29tbWl0bWVudHMgYWN0aW9uOiAke2V9YFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKTtcbiAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucmVsZWFzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHNwZW5kQmxvY2sgYW5kIHNwZW5kSGVpZ2h0IG9mIGNvbW1pdG1lbnRzIHNwZW50IG9uIHRoZSBibG9ja1xuICAgKiBAcGFyYW0gc3BlbmRJZFxuICAgKiBAcGFyYW0gYmxvY2tcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKi9cbiAgc3BlbmRDb21taXRtZW50cyA9IGFzeW5jIChcbiAgICBzcGVuZElkOiBBcnJheTxzdHJpbmc+LFxuICAgIGJsb2NrOiBCbG9ja0VudGl0eSxcbiAgICBleHRyYWN0b3I6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBzcGVuZElkQ2h1bmtzID0gY2h1bmsoc3BlbmRJZCwgZGJJZENodW5rU2l6ZSk7XG4gICAgZm9yIChjb25zdCBzcGVuZElkQ2h1bmsgb2Ygc3BlbmRJZENodW5rcykge1xuICAgICAgY29uc3QgdXBkYXRlUmVzdWx0ID0gYXdhaXQgdGhpcy5jb21taXRtZW50UmVwb3NpdG9yeS51cGRhdGUoXG4gICAgICAgIHsgYm94SWQ6IEluKHNwZW5kSWRDaHVuayksIGV4dHJhY3RvcjogZXh0cmFjdG9yIH0sXG4gICAgICAgIHsgc3BlbmRCbG9jazogYmxvY2suaGFzaCwgc3BlbmRIZWlnaHQ6IGJsb2NrLmhlaWdodCB9XG4gICAgICApO1xuXG4gICAgICBpZiAodXBkYXRlUmVzdWx0LmFmZmVjdGVkICYmIHVwZGF0ZVJlc3VsdC5hZmZlY3RlZCA+IDApIHtcbiAgICAgICAgY29uc3Qgc3BlbnRSb3dzID0gYXdhaXQgdGhpcy5jb21taXRtZW50UmVwb3NpdG9yeS5maW5kQnkoe1xuICAgICAgICAgIGJveElkOiBJbihzcGVuZElkQ2h1bmspLFxuICAgICAgICAgIHNwZW5kQmxvY2s6IGJsb2NrLmhhc2gsXG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiBzcGVudFJvd3MpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgYFNwZW50IGNvbW1pdG1lbnQgWyR7cm93LmJveElkfV0gZm9yIGV2ZW50IFske3Jvdy5ldmVudElkfV0gYXQgaGVpZ2h0ICR7YmxvY2suaGVpZ2h0fWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBTcGVudCBjb21taXRtZW50IFske0pTT04uc3RyaW5naWZ5KHJvdyl9XWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBEZWxldGUgYWxsIGNvbW1pdG1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJsb2NrKGlkKSBhbmQgZXh0cmFjdG9yKGlkKVxuICAgKiBhbmQgdXBkYXRlIGFsbCBjb21taXRtZW50cyBzcGVudCBvbiB0aGUgc3BlY2lmaWVkIGJsb2NrXG4gICAqIEBwYXJhbSBibG9ja1xuICAgKiBAcGFyYW0gZXh0cmFjdG9yXG4gICAqL1xuICBkZWxldGVCbG9jayA9IGFzeW5jIChibG9jazogc3RyaW5nLCBleHRyYWN0b3I6IHN0cmluZykgPT4ge1xuICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICBgRGVsZXRpbmcgY29tbWl0bWVudHMgb2YgYmxvY2sgWyR7YmxvY2t9XSBhbmQgZXh0cmFjdG9yICR7ZXh0cmFjdG9yfWBcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuY29tbWl0bWVudFJlcG9zaXRvcnkuZGVsZXRlKHtcbiAgICAgIGJsb2NrOiBibG9jayxcbiAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMuY29tbWl0bWVudFJlcG9zaXRvcnkudXBkYXRlKFxuICAgICAgeyBzcGVuZEJsb2NrOiBibG9jaywgZXh0cmFjdG9yOiBleHRyYWN0b3IgfSxcbiAgICAgIHsgc3BlbmRCbG9jazogbnVsbCwgc3BlbmRIZWlnaHQ6IDAgfVxuICAgICk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbW1pdG1lbnRBY3Rpb247XG4iXX0=
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { DataSource } from 'typeorm';
|
|
2
|
-
import { BlockEntity } from '@rosen-bridge/scanner';
|
|
3
|
-
import { AbstractLogger } from '@rosen-bridge/logger-interface';
|
|
4
|
-
import { ExtractedPermit } from '../interfaces/extractedPermit';
|
|
5
|
-
declare class PermitAction {
|
|
6
|
-
readonly logger: AbstractLogger;
|
|
7
|
-
private readonly datasource;
|
|
8
|
-
private readonly permitRepository;
|
|
9
|
-
constructor(dataSource: DataSource, logger: AbstractLogger);
|
|
10
|
-
/**
|
|
11
|
-
* insert a new permit boxes in the database
|
|
12
|
-
* @param permits
|
|
13
|
-
* @param initialHeight
|
|
14
|
-
* @param extractor
|
|
15
|
-
*/
|
|
16
|
-
insertPermit: (permit: ExtractedPermit, extractor: string) => Promise<import("typeorm").InsertResult>;
|
|
17
|
-
/**
|
|
18
|
-
* update an unspent permit in the database
|
|
19
|
-
* @param permit
|
|
20
|
-
* @param extractor
|
|
21
|
-
*/
|
|
22
|
-
updatePermit: (permit: ExtractedPermit, extractor: string) => Promise<void>;
|
|
23
|
-
/**
|
|
24
|
-
* It stores list of permits in the dataSource with block id
|
|
25
|
-
* @param permits
|
|
26
|
-
* @param block
|
|
27
|
-
* @param extractor
|
|
28
|
-
*/
|
|
29
|
-
storePermits: (permits: Array<ExtractedPermit>, block: BlockEntity, extractor: string) => Promise<boolean>;
|
|
30
|
-
/**
|
|
31
|
-
* Update spendBlock and spendHeight of permits spent on the block
|
|
32
|
-
* @param spendId
|
|
33
|
-
* @param block
|
|
34
|
-
* @param extractor
|
|
35
|
-
*/
|
|
36
|
-
spendPermits: (spendId: Array<string>, block: BlockEntity, extractor: string) => Promise<void>;
|
|
37
|
-
/**
|
|
38
|
-
* Delete all permits corresponding to the block(id) and extractor(id)
|
|
39
|
-
* and update all permits spent on the specified block
|
|
40
|
-
* @param block
|
|
41
|
-
* @param extractor
|
|
42
|
-
*/
|
|
43
|
-
deleteBlock: (block: string, extractor: string) => Promise<void>;
|
|
44
|
-
/**
|
|
45
|
-
* Returns all stored permit box ids
|
|
46
|
-
*/
|
|
47
|
-
getAllPermitBoxIds: (extractor: string) => Promise<Array<string>>;
|
|
48
|
-
/**
|
|
49
|
-
* Removes specified permit
|
|
50
|
-
* @param boxId
|
|
51
|
-
* @param extractor
|
|
52
|
-
*/
|
|
53
|
-
removePermit: (boxId: string, extractor: string) => Promise<import("typeorm").DeleteResult>;
|
|
54
|
-
/**
|
|
55
|
-
* Update the permit spending information
|
|
56
|
-
* @param boxId
|
|
57
|
-
* @param extractor
|
|
58
|
-
* @param blockId
|
|
59
|
-
* @param blockHeight
|
|
60
|
-
*/
|
|
61
|
-
updateSpendBlock: (boxId: string, extractor: string, blockId: string, blockHeight: number) => Promise<import("typeorm").UpdateResult>;
|
|
62
|
-
}
|
|
63
|
-
export default PermitAction;
|
|
64
|
-
//# sourceMappingURL=permitAction.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"permitAction.d.ts","sourceRoot":"","sources":["../../lib/actions/permitAction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAkB,MAAM,SAAS,CAAC;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAIhE,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,EAAE,cAAc;IAM1D;;;;;OAKG;IACH,YAAY,WAAkB,eAAe,aAAa,MAAM,6CAY9D;IAEF;;;;OAIG;IACH,YAAY,WAAkB,eAAe,aAAa,MAAM,mBAa9D;IAEF;;;;;OAKG;IACH,YAAY,YACD,MAAM,eAAe,CAAC,SACxB,WAAW,aACP,MAAM,sBAiDjB;IAEF;;;;;OAKG;IACH,YAAY,YACD,MAAM,MAAM,CAAC,SACf,WAAW,aACP,MAAM,KAChB,QAAQ,IAAI,CAAC,CAoBd;IAEF;;;;;OAKG;IACH,WAAW,UAAiB,MAAM,aAAa,MAAM,KAAG,QAAQ,IAAI,CAAC,CASnE;IAEF;;OAEG;IACH,kBAAkB,cAAqB,MAAM,KAAG,QAAQ,MAAM,MAAM,CAAC,CAAC,CAUpE;IAEF;;;;OAIG;IACH,YAAY,UAAiB,MAAM,aAAa,MAAM,6CAKpD;IAEF;;;;;;OAMG;IACH,gBAAgB,UACP,MAAM,aACF,MAAM,WACR,MAAM,eACF,MAAM,6CAMnB;CACH;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
import { In } from 'typeorm';
|
|
2
|
-
import { chunk } from 'lodash-es';
|
|
3
|
-
import PermitEntity from '../entities/PermitEntity';
|
|
4
|
-
import { dbIdChunkSize } from '../constants';
|
|
5
|
-
class PermitAction {
|
|
6
|
-
logger;
|
|
7
|
-
datasource;
|
|
8
|
-
permitRepository;
|
|
9
|
-
constructor(dataSource, logger) {
|
|
10
|
-
this.datasource = dataSource;
|
|
11
|
-
this.logger = logger;
|
|
12
|
-
this.permitRepository = dataSource.getRepository(PermitEntity);
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* insert a new permit boxes in the database
|
|
16
|
-
* @param permits
|
|
17
|
-
* @param initialHeight
|
|
18
|
-
* @param extractor
|
|
19
|
-
*/
|
|
20
|
-
insertPermit = async (permit, extractor) => {
|
|
21
|
-
return this.permitRepository.insert({
|
|
22
|
-
boxId: permit.boxId,
|
|
23
|
-
boxSerialized: permit.boxSerialized,
|
|
24
|
-
block: permit.block,
|
|
25
|
-
height: permit.height,
|
|
26
|
-
extractor: extractor,
|
|
27
|
-
WID: permit.WID,
|
|
28
|
-
txId: permit.txId,
|
|
29
|
-
spendBlock: permit.spendBlock,
|
|
30
|
-
spendHeight: permit.spendHeight,
|
|
31
|
-
});
|
|
32
|
-
};
|
|
33
|
-
/**
|
|
34
|
-
* update an unspent permit in the database
|
|
35
|
-
* @param permit
|
|
36
|
-
* @param extractor
|
|
37
|
-
*/
|
|
38
|
-
updatePermit = async (permit, extractor) => {
|
|
39
|
-
await this.permitRepository.update({ boxId: permit.boxId, extractor: extractor }, {
|
|
40
|
-
boxSerialized: permit.boxSerialized,
|
|
41
|
-
block: permit.block,
|
|
42
|
-
height: permit.height,
|
|
43
|
-
WID: permit.WID,
|
|
44
|
-
txId: permit.txId,
|
|
45
|
-
spendBlock: null,
|
|
46
|
-
spendHeight: 0,
|
|
47
|
-
});
|
|
48
|
-
};
|
|
49
|
-
/**
|
|
50
|
-
* It stores list of permits in the dataSource with block id
|
|
51
|
-
* @param permits
|
|
52
|
-
* @param block
|
|
53
|
-
* @param extractor
|
|
54
|
-
*/
|
|
55
|
-
storePermits = async (permits, block, extractor) => {
|
|
56
|
-
if (permits.length === 0)
|
|
57
|
-
return true;
|
|
58
|
-
const boxIds = permits.map((permit) => permit.boxId);
|
|
59
|
-
const savedPermits = await this.permitRepository.findBy({
|
|
60
|
-
boxId: In(boxIds),
|
|
61
|
-
extractor: extractor,
|
|
62
|
-
});
|
|
63
|
-
let success = true;
|
|
64
|
-
const queryRunner = this.datasource.createQueryRunner();
|
|
65
|
-
await queryRunner.connect();
|
|
66
|
-
await queryRunner.startTransaction();
|
|
67
|
-
const repository = await queryRunner.manager.getRepository(PermitEntity);
|
|
68
|
-
try {
|
|
69
|
-
for (const permit of permits) {
|
|
70
|
-
const saved = savedPermits.some((entity) => {
|
|
71
|
-
return entity.boxId === permit.boxId;
|
|
72
|
-
});
|
|
73
|
-
const entity = {
|
|
74
|
-
boxId: permit.boxId,
|
|
75
|
-
boxSerialized: permit.boxSerialized,
|
|
76
|
-
block: block.hash,
|
|
77
|
-
height: block.height,
|
|
78
|
-
extractor: extractor,
|
|
79
|
-
WID: permit.WID,
|
|
80
|
-
txId: permit.txId,
|
|
81
|
-
};
|
|
82
|
-
if (!saved) {
|
|
83
|
-
this.logger.debug(`Saving permit [${permit.boxId}] belonging to watcher [${permit.WID}] at height ${block.height} and extractor ${extractor}`);
|
|
84
|
-
await repository.insert(entity);
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
this.logger.debug(`Updating permit [${permit.boxId}] belonging to watcher [${permit.WID}] at height ${block.height} and extractor ${extractor}`);
|
|
88
|
-
await repository.update({ boxId: permit.boxId }, entity);
|
|
89
|
-
}
|
|
90
|
-
this.logger.debug(`Entity: ${JSON.stringify(entity)}`);
|
|
91
|
-
}
|
|
92
|
-
await queryRunner.commitTransaction();
|
|
93
|
-
}
|
|
94
|
-
catch (e) {
|
|
95
|
-
this.logger.error(`An error occurred during store permit action: ${e}`);
|
|
96
|
-
await queryRunner.rollbackTransaction();
|
|
97
|
-
success = false;
|
|
98
|
-
}
|
|
99
|
-
finally {
|
|
100
|
-
await queryRunner.release();
|
|
101
|
-
}
|
|
102
|
-
return success;
|
|
103
|
-
};
|
|
104
|
-
/**
|
|
105
|
-
* Update spendBlock and spendHeight of permits spent on the block
|
|
106
|
-
* @param spendId
|
|
107
|
-
* @param block
|
|
108
|
-
* @param extractor
|
|
109
|
-
*/
|
|
110
|
-
spendPermits = async (spendId, block, extractor) => {
|
|
111
|
-
const spendIdChunks = chunk(spendId, dbIdChunkSize);
|
|
112
|
-
for (const spendIdChunk of spendIdChunks) {
|
|
113
|
-
const updateResult = await this.permitRepository.update({ boxId: In(spendIdChunk), extractor: extractor }, { spendBlock: block.hash, spendHeight: block.height });
|
|
114
|
-
if (updateResult.affected && updateResult.affected > 0) {
|
|
115
|
-
const spentRows = await this.permitRepository.findBy({
|
|
116
|
-
boxId: In(spendIdChunk),
|
|
117
|
-
spendBlock: block.hash,
|
|
118
|
-
});
|
|
119
|
-
for (const row of spentRows) {
|
|
120
|
-
this.logger.debug(`Spent permit with boxId [${row.boxId}] belonging to watcher with WID [${row.WID}] at height ${block.height}`);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
};
|
|
125
|
-
/**
|
|
126
|
-
* Delete all permits corresponding to the block(id) and extractor(id)
|
|
127
|
-
* and update all permits spent on the specified block
|
|
128
|
-
* @param block
|
|
129
|
-
* @param extractor
|
|
130
|
-
*/
|
|
131
|
-
deleteBlock = async (block, extractor) => {
|
|
132
|
-
this.logger.info(`Deleting permits at block ${block} and extractor ${extractor}`);
|
|
133
|
-
await this.permitRepository.delete({ block: block, extractor: extractor });
|
|
134
|
-
await this.permitRepository.update({ spendBlock: block, extractor: extractor }, { spendBlock: null, spendHeight: 0 });
|
|
135
|
-
};
|
|
136
|
-
/**
|
|
137
|
-
* Returns all stored permit box ids
|
|
138
|
-
*/
|
|
139
|
-
getAllPermitBoxIds = async (extractor) => {
|
|
140
|
-
const boxIds = await this.permitRepository.find({
|
|
141
|
-
where: {
|
|
142
|
-
extractor: extractor,
|
|
143
|
-
},
|
|
144
|
-
select: {
|
|
145
|
-
boxId: true,
|
|
146
|
-
},
|
|
147
|
-
});
|
|
148
|
-
return boxIds.map((item) => item.boxId);
|
|
149
|
-
};
|
|
150
|
-
/**
|
|
151
|
-
* Removes specified permit
|
|
152
|
-
* @param boxId
|
|
153
|
-
* @param extractor
|
|
154
|
-
*/
|
|
155
|
-
removePermit = async (boxId, extractor) => {
|
|
156
|
-
return await this.permitRepository.delete({
|
|
157
|
-
boxId: boxId,
|
|
158
|
-
extractor: extractor,
|
|
159
|
-
});
|
|
160
|
-
};
|
|
161
|
-
/**
|
|
162
|
-
* Update the permit spending information
|
|
163
|
-
* @param boxId
|
|
164
|
-
* @param extractor
|
|
165
|
-
* @param blockId
|
|
166
|
-
* @param blockHeight
|
|
167
|
-
*/
|
|
168
|
-
updateSpendBlock = async (boxId, extractor, blockId, blockHeight) => {
|
|
169
|
-
return await this.permitRepository.update({ boxId: boxId, extractor: extractor }, { spendBlock: blockId, spendHeight: blockHeight });
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
export default PermitAction;
|
|
173
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWl0QWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2FjdGlvbnMvcGVybWl0QWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxFQUFFLEVBQWMsTUFBTSxTQUFTLENBQUM7QUFDckQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUtsQyxPQUFPLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTdDLE1BQU0sWUFBWTtJQUNQLE1BQU0sQ0FBaUI7SUFDZixVQUFVLENBQWE7SUFDdkIsZ0JBQWdCLENBQTJCO0lBRTVELFlBQVksVUFBc0IsRUFBRSxNQUFzQjtRQUN4RCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxZQUFZLEdBQUcsS0FBSyxFQUFFLE1BQXVCLEVBQUUsU0FBaUIsRUFBRSxFQUFFO1FBQ2xFLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztZQUNsQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7WUFDbkIsYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUFhO1lBQ25DLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztZQUNuQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07WUFDckIsU0FBUyxFQUFFLFNBQVM7WUFDcEIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHO1lBQ2YsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1lBQ2pCLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtZQUM3QixXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7U0FD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QUFJO2FBQ1o7U0FDRixDQUFDLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUF1QixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0QsQ0FBQyxDQUFDO0lBRUY7Ozs7T0FJRztJQUNILFlBQVksR0FBRyxLQUFLLEVBQUUsS0FBYSxFQUFFLFNBQWlCLEVBQUUsRUFBRTtRQUN4RCxPQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztZQUN4QyxLQUFLLEVBQUUsS0FBSztZQUNaLFNBQVMsRUFBRSxTQUFTO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGOzs7Ozs7T0FNRztJQUNILGdCQUFnQixHQUFHLEtBQUssRUFDdEIsS0FBYSxFQUNiLFNBQWlCLEVBQ2pCLE9BQWUsRUFDZixXQUFtQixFQUNuQixFQUFFO1FBQ0YsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQ3ZDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEVBQ3RDLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQ2xELENBQUM7SUFDSixDQUFDLENBQUM7Q0FDSDtBQUVELGVBQWUsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YVNvdXJjZSwgSW4sIFJlcG9zaXRvcnkgfSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IGNodW5rIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJsb2NrRW50aXR5IH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyJztcbmltcG9ydCB7IEFic3RyYWN0TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9sb2dnZXItaW50ZXJmYWNlJztcblxuaW1wb3J0IHsgRXh0cmFjdGVkUGVybWl0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9leHRyYWN0ZWRQZXJtaXQnO1xuaW1wb3J0IFBlcm1pdEVudGl0eSBmcm9tICcuLi9lbnRpdGllcy9QZXJtaXRFbnRpdHknO1xuaW1wb3J0IHsgZGJJZENodW5rU2l6ZSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5cbmNsYXNzIFBlcm1pdEFjdGlvbiB7XG4gIHJlYWRvbmx5IGxvZ2dlcjogQWJzdHJhY3RMb2dnZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YXNvdXJjZTogRGF0YVNvdXJjZTtcbiAgcHJpdmF0ZSByZWFkb25seSBwZXJtaXRSZXBvc2l0b3J5OiBSZXBvc2l0b3J5PFBlcm1pdEVudGl0eT47XG5cbiAgY29uc3RydWN0b3IoZGF0YVNvdXJjZTogRGF0YVNvdXJjZSwgbG9nZ2VyOiBBYnN0cmFjdExvZ2dlcikge1xuICAgIHRoaXMuZGF0YXNvdXJjZSA9IGRhdGFTb3VyY2U7XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7XG4gICAgdGhpcy5wZXJtaXRSZXBvc2l0b3J5ID0gZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFBlcm1pdEVudGl0eSk7XG4gIH1cblxuICAvKipcbiAgICogaW5zZXJ0IGEgbmV3IHBlcm1pdCBib3hlcyBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHBhcmFtIHBlcm1pdHNcbiAgICogQHBhcmFtIGluaXRpYWxIZWlnaHRcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKi9cbiAgaW5zZXJ0UGVybWl0ID0gYXN5bmMgKHBlcm1pdDogRXh0cmFjdGVkUGVybWl0LCBleHRyYWN0b3I6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiB0aGlzLnBlcm1pdFJlcG9zaXRvcnkuaW5zZXJ0KHtcbiAgICAgIGJveElkOiBwZXJtaXQuYm94SWQsXG4gICAgICBib3hTZXJpYWxpemVkOiBwZXJtaXQuYm94U2VyaWFsaXplZCxcbiAgICAgIGJsb2NrOiBwZXJtaXQuYmxvY2ssXG4gICAgICBoZWlnaHQ6IHBlcm1pdC5oZWlnaHQsXG4gICAgICBleHRyYWN0b3I6IGV4dHJhY3RvcixcbiAgICAgIFdJRDogcGVybWl0LldJRCxcbiAgICAgIHR4SWQ6IHBlcm1pdC50eElkLFxuICAgICAgc3BlbmRCbG9jazogcGVybWl0LnNwZW5kQmxvY2ssXG4gICAgICBzcGVuZEhlaWdodDogcGVybWl0LnNwZW5kSGVpZ2h0LFxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiB1cGRhdGUgYW4gdW5zcGVudCBwZXJtaXQgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSBwZXJtaXRcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKi9cbiAgdXBkYXRlUGVybWl0ID0gYXN5bmMgKHBlcm1pdDogRXh0cmFjdGVkUGVybWl0LCBleHRyYWN0b3I6IHN0cmluZykgPT4ge1xuICAgIGF3YWl0IHRoaXMucGVybWl0UmVwb3NpdG9yeS51cGRhdGUoXG4gICAgICB7IGJveElkOiBwZXJtaXQuYm94SWQsIGV4dHJhY3RvcjogZXh0cmFjdG9yIH0sXG4gICAgICB7XG4gICAgICAgIGJveFNlcmlhbGl6ZWQ6IHBlcm1pdC5ib3hTZXJpYWxpemVkLFxuICAgICAgICBibG9jazogcGVybWl0LmJsb2NrLFxuICAgICAgICBoZWlnaHQ6IHBlcm1pdC5oZWlnaHQsXG4gICAgICAgIFdJRDogcGVybWl0LldJRCxcbiAgICAgICAgdHhJZDogcGVybWl0LnR4SWQsXG4gICAgICAgIHNwZW5kQmxvY2s6IG51bGwsXG4gICAgICAgIHNwZW5kSGVpZ2h0OiAwLFxuICAgICAgfVxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEl0IHN0b3JlcyBsaXN0IG9mIHBlcm1pdHMgaW4gdGhlIGRhdGFTb3VyY2Ugd2l0aCBibG9jayBpZFxuICAgKiBAcGFyYW0gcGVybWl0c1xuICAgKiBAcGFyYW0gYmxvY2tcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKi9cbiAgc3RvcmVQZXJtaXRzID0gYXN5bmMgKFxuICAgIHBlcm1pdHM6IEFycmF5PEV4dHJhY3RlZFBlcm1pdD4sXG4gICAgYmxvY2s6IEJsb2NrRW50aXR5LFxuICAgIGV4dHJhY3Rvcjogc3RyaW5nXG4gICkgPT4ge1xuICAgIGlmIChwZXJtaXRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgYm94SWRzID0gcGVybWl0cy5tYXAoKHBlcm1pdCkgPT4gcGVybWl0LmJveElkKTtcbiAgICBjb25zdCBzYXZlZFBlcm1pdHMgPSBhd2FpdCB0aGlzLnBlcm1pdFJlcG9zaXRvcnkuZmluZEJ5KHtcbiAgICAgIGJveElkOiBJbihib3hJZHMpLFxuICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgfSk7XG4gICAgbGV0IHN1Y2Nlc3MgPSB0cnVlO1xuICAgIGNvbnN0IHF1ZXJ5UnVubmVyID0gdGhpcy5kYXRhc291cmNlLmNyZWF0ZVF1ZXJ5UnVubmVyKCk7XG4gICAgYXdhaXQgcXVlcnlSdW5uZXIuY29ubmVjdCgpO1xuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKTtcbiAgICBjb25zdCByZXBvc2l0b3J5ID0gYXdhaXQgcXVlcnlSdW5uZXIubWFuYWdlci5nZXRSZXBvc2l0b3J5KFBlcm1pdEVudGl0eSk7XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgcGVybWl0IG9mIHBlcm1pdHMpIHtcbiAgICAgICAgY29uc3Qgc2F2ZWQgPSBzYXZlZFBlcm1pdHMuc29tZSgoZW50aXR5KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGVudGl0eS5ib3hJZCA9PT0gcGVybWl0LmJveElkO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZW50aXR5ID0ge1xuICAgICAgICAgIGJveElkOiBwZXJtaXQuYm94SWQsXG4gICAgICAgICAgYm94U2VyaWFsaXplZDogcGVybWl0LmJveFNlcmlhbGl6ZWQsXG4gICAgICAgICAgYmxvY2s6IGJsb2NrLmhhc2gsXG4gICAgICAgICAgaGVpZ2h0OiBibG9jay5oZWlnaHQsXG4gICAgICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgICAgICAgV0lEOiBwZXJtaXQuV0lELFxuICAgICAgICAgIHR4SWQ6IHBlcm1pdC50eElkLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoIXNhdmVkKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgU2F2aW5nIHBlcm1pdCBbJHtwZXJtaXQuYm94SWR9XSBiZWxvbmdpbmcgdG8gd2F0Y2hlciBbJHtwZXJtaXQuV0lEfV0gYXQgaGVpZ2h0ICR7YmxvY2suaGVpZ2h0fSBhbmQgZXh0cmFjdG9yICR7ZXh0cmFjdG9yfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IHJlcG9zaXRvcnkuaW5zZXJ0KGVudGl0eSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgVXBkYXRpbmcgcGVybWl0IFske3Blcm1pdC5ib3hJZH1dIGJlbG9uZ2luZyB0byB3YXRjaGVyIFske3Blcm1pdC5XSUR9XSBhdCBoZWlnaHQgJHtibG9jay5oZWlnaHR9IGFuZCBleHRyYWN0b3IgJHtleHRyYWN0b3J9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgcmVwb3NpdG9yeS51cGRhdGUoeyBib3hJZDogcGVybWl0LmJveElkIH0sIGVudGl0eSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYEVudGl0eTogJHtKU09OLnN0cmluZ2lmeShlbnRpdHkpfWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHN0b3JlIHBlcm1pdCBhY3Rpb246ICR7ZX1gKTtcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKTtcbiAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucmVsZWFzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHNwZW5kQmxvY2sgYW5kIHNwZW5kSGVpZ2h0IG9mIHBlcm1pdHMgc3BlbnQgb24gdGhlIGJsb2NrXG4gICAqIEBwYXJhbSBzcGVuZElkXG4gICAqIEBwYXJhbSBibG9ja1xuICAgKiBAcGFyYW0gZXh0cmFjdG9yXG4gICAqL1xuICBzcGVuZFBlcm1pdHMgPSBhc3luYyAoXG4gICAgc3BlbmRJZDogQXJyYXk8c3RyaW5nPixcbiAgICBibG9jazogQmxvY2tFbnRpdHksXG4gICAgZXh0cmFjdG9yOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3Qgc3BlbmRJZENodW5rcyA9IGNodW5rKHNwZW5kSWQsIGRiSWRDaHVua1NpemUpO1xuICAgIGZvciAoY29uc3Qgc3BlbmRJZENodW5rIG9mIHNwZW5kSWRDaHVua3MpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZVJlc3VsdCA9IGF3YWl0IHRoaXMucGVybWl0UmVwb3NpdG9yeS51cGRhdGUoXG4gICAgICAgIHsgYm94SWQ6IEluKHNwZW5kSWRDaHVuayksIGV4dHJhY3RvcjogZXh0cmFjdG9yIH0sXG4gICAgICAgIHsgc3BlbmRCbG9jazogYmxvY2suaGFzaCwgc3BlbmRIZWlnaHQ6IGJsb2NrLmhlaWdodCB9XG4gICAgICApO1xuXG4gICAgICBpZiAodXBkYXRlUmVzdWx0LmFmZmVjdGVkICYmIHVwZGF0ZVJlc3VsdC5hZmZlY3RlZCA+IDApIHtcbiAgICAgICAgY29uc3Qgc3BlbnRSb3dzID0gYXdhaXQgdGhpcy5wZXJtaXRSZXBvc2l0b3J5LmZpbmRCeSh7XG4gICAgICAgICAgYm94SWQ6IEluKHNwZW5kSWRDaHVuayksXG4gICAgICAgICAgc3BlbmRCbG9jazogYmxvY2suaGFzaCxcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHNwZW50Um93cykge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFNwZW50IHBlcm1pdCB3aXRoIGJveElkIFske3Jvdy5ib3hJZH1dIGJlbG9uZ2luZyB0byB3YXRjaGVyIHdpdGggV0lEIFske3Jvdy5XSUR9XSBhdCBoZWlnaHQgJHtibG9jay5oZWlnaHR9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbGwgcGVybWl0cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBibG9jayhpZCkgYW5kIGV4dHJhY3RvcihpZClcbiAgICogYW5kIHVwZGF0ZSBhbGwgcGVybWl0cyBzcGVudCBvbiB0aGUgc3BlY2lmaWVkIGJsb2NrXG4gICAqIEBwYXJhbSBibG9ja1xuICAgKiBAcGFyYW0gZXh0cmFjdG9yXG4gICAqL1xuICBkZWxldGVCbG9jayA9IGFzeW5jIChibG9jazogc3RyaW5nLCBleHRyYWN0b3I6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICBgRGVsZXRpbmcgcGVybWl0cyBhdCBibG9jayAke2Jsb2NrfSBhbmQgZXh0cmFjdG9yICR7ZXh0cmFjdG9yfWBcbiAgICApO1xuICAgIGF3YWl0IHRoaXMucGVybWl0UmVwb3NpdG9yeS5kZWxldGUoeyBibG9jazogYmxvY2ssIGV4dHJhY3RvcjogZXh0cmFjdG9yIH0pO1xuICAgIGF3YWl0IHRoaXMucGVybWl0UmVwb3NpdG9yeS51cGRhdGUoXG4gICAgICB7IHNwZW5kQmxvY2s6IGJsb2NrLCBleHRyYWN0b3I6IGV4dHJhY3RvciB9LFxuICAgICAgeyBzcGVuZEJsb2NrOiBudWxsLCBzcGVuZEhlaWdodDogMCB9XG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogIFJldHVybnMgYWxsIHN0b3JlZCBwZXJtaXQgYm94IGlkc1xuICAgKi9cbiAgZ2V0QWxsUGVybWl0Qm94SWRzID0gYXN5bmMgKGV4dHJhY3Rvcjogc3RyaW5nKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiA9PiB7XG4gICAgY29uc3QgYm94SWRzID0gYXdhaXQgdGhpcy5wZXJtaXRSZXBvc2l0b3J5LmZpbmQoe1xuICAgICAgd2hlcmU6IHtcbiAgICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgICB9LFxuICAgICAgc2VsZWN0OiB7XG4gICAgICAgIGJveElkOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gYm94SWRzLm1hcCgoaXRlbTogeyBib3hJZDogc3RyaW5nIH0pID0+IGl0ZW0uYm94SWQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHNwZWNpZmllZCBwZXJtaXRcbiAgICogQHBhcmFtIGJveElkXG4gICAqIEBwYXJhbSBleHRyYWN0b3JcbiAgICovXG4gIHJlbW92ZVBlcm1pdCA9IGFzeW5jIChib3hJZDogc3RyaW5nLCBleHRyYWN0b3I6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnBlcm1pdFJlcG9zaXRvcnkuZGVsZXRlKHtcbiAgICAgIGJveElkOiBib3hJZCxcbiAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIHBlcm1pdCBzcGVuZGluZyBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0gYm94SWRcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gYmxvY2tJZFxuICAgKiBAcGFyYW0gYmxvY2tIZWlnaHRcbiAgICovXG4gIHVwZGF0ZVNwZW5kQmxvY2sgPSBhc3luYyAoXG4gICAgYm94SWQ6IHN0cmluZyxcbiAgICBleHRyYWN0b3I6IHN0cmluZyxcbiAgICBibG9ja0lkOiBzdHJpbmcsXG4gICAgYmxvY2tIZWlnaHQ6IG51bWJlclxuICApID0+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wZXJtaXRSZXBvc2l0b3J5LnVwZGF0ZShcbiAgICAgIHsgYm94SWQ6IGJveElkLCBleHRyYWN0b3I6IGV4dHJhY3RvciB9LFxuICAgICAgeyBzcGVuZEJsb2NrOiBibG9ja0lkLCBzcGVuZEhlaWdodDogYmxvY2tIZWlnaHQgfVxuICAgICk7XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBlcm1pdEFjdGlvbjtcbiJdfQ==
|