@my-packages-changeit/abstract-extractor 3.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +225 -0
- package/README.md +24 -0
- package/dist/abstractExtractor.d.ts +59 -0
- package/dist/abstractExtractor.d.ts.map +1 -0
- package/dist/abstractExtractor.js +22 -0
- package/dist/constants.d.ts +4 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +4 -0
- package/dist/ergo/database/actions/abstractErgoAction.d.ts +91 -0
- package/dist/ergo/database/actions/abstractErgoAction.d.ts.map +1 -0
- package/dist/ergo/database/actions/abstractErgoAction.js +180 -0
- package/dist/ergo/database/actions/abstractErgoBoxAction.d.ts +31 -0
- package/dist/ergo/database/actions/abstractErgoBoxAction.d.ts.map +1 -0
- package/dist/ergo/database/actions/abstractErgoBoxAction.js +70 -0
- package/dist/ergo/database/entities/abstractErgoBoxEntity.d.ts +18 -0
- package/dist/ergo/database/entities/abstractErgoBoxEntity.d.ts.map +1 -0
- package/dist/ergo/database/entities/abstractErgoBoxEntity.js +36 -0
- package/dist/ergo/database/entities/abstractErgoEntity.d.ts +26 -0
- package/dist/ergo/database/entities/abstractErgoEntity.d.ts.map +1 -0
- package/dist/ergo/database/entities/abstractErgoEntity.js +64 -0
- package/dist/ergo/database/index.d.ts +5 -0
- package/dist/ergo/database/index.d.ts.map +1 -0
- package/dist/ergo/database/index.js +5 -0
- package/dist/ergo/extractors/abstractErgoBoxExtractor.d.ts +67 -0
- package/dist/ergo/extractors/abstractErgoBoxExtractor.d.ts.map +1 -0
- package/dist/ergo/extractors/abstractErgoBoxExtractor.js +106 -0
- package/dist/ergo/extractors/abstractErgoExtractor.d.ts +61 -0
- package/dist/ergo/extractors/abstractErgoExtractor.d.ts.map +1 -0
- package/dist/ergo/extractors/abstractErgoExtractor.js +99 -0
- package/dist/ergo/extractors/abstractErgoTxExtractor.d.ts +54 -0
- package/dist/ergo/extractors/abstractErgoTxExtractor.d.ts.map +1 -0
- package/dist/ergo/extractors/abstractErgoTxExtractor.js +76 -0
- package/dist/ergo/extractors/index.d.ts +4 -0
- package/dist/ergo/extractors/index.d.ts.map +1 -0
- package/dist/ergo/extractors/index.js +4 -0
- package/dist/ergo/index.d.ts +8 -0
- package/dist/ergo/index.d.ts.map +1 -0
- package/dist/ergo/index.js +8 -0
- package/dist/ergo/initializers/constants.d.ts +4 -0
- package/dist/ergo/initializers/constants.d.ts.map +1 -0
- package/dist/ergo/initializers/constants.js +4 -0
- package/dist/ergo/initializers/ergoBoxInitializer.d.ts +36 -0
- package/dist/ergo/initializers/ergoBoxInitializer.d.ts.map +1 -0
- package/dist/ergo/initializers/ergoBoxInitializer.js +84 -0
- package/dist/ergo/initializers/ergoInitializer.d.ts +39 -0
- package/dist/ergo/initializers/ergoInitializer.d.ts.map +1 -0
- package/dist/ergo/initializers/ergoInitializer.js +80 -0
- package/dist/ergo/initializers/index.d.ts +4 -0
- package/dist/ergo/initializers/index.d.ts.map +1 -0
- package/dist/ergo/initializers/index.js +4 -0
- package/dist/ergo/initializers/strategies/explorerInitializationStrategy.d.ts +59 -0
- package/dist/ergo/initializers/strategies/explorerInitializationStrategy.d.ts.map +1 -0
- package/dist/ergo/initializers/strategies/explorerInitializationStrategy.js +161 -0
- package/dist/ergo/initializers/strategies/index.d.ts +4 -0
- package/dist/ergo/initializers/strategies/index.d.ts.map +1 -0
- package/dist/ergo/initializers/strategies/index.js +4 -0
- package/dist/ergo/initializers/strategies/nodeInitializationStrategy.d.ts +30 -0
- package/dist/ergo/initializers/strategies/nodeInitializationStrategy.d.ts.map +1 -0
- package/dist/ergo/initializers/strategies/nodeInitializationStrategy.js +78 -0
- package/dist/ergo/initializers/strategies/workerManager.d.ts +79 -0
- package/dist/ergo/initializers/strategies/workerManager.d.ts.map +1 -0
- package/dist/ergo/initializers/strategies/workerManager.js +182 -0
- package/dist/ergo/interfaces.d.ts +63 -0
- package/dist/ergo/interfaces.d.ts.map +1 -0
- package/dist/ergo/interfaces.js +8 -0
- package/dist/ergo/networks/explorerNetwork.d.ts +52 -0
- package/dist/ergo/networks/explorerNetwork.d.ts.map +1 -0
- package/dist/ergo/networks/explorerNetwork.js +132 -0
- package/dist/ergo/networks/index.d.ts +3 -0
- package/dist/ergo/networks/index.d.ts.map +1 -0
- package/dist/ergo/networks/index.js +3 -0
- package/dist/ergo/networks/nodeNetwork.d.ts +34 -0
- package/dist/ergo/networks/nodeNetwork.d.ts.map +1 -0
- package/dist/ergo/networks/nodeNetwork.js +77 -0
- package/dist/ergo/utils.d.ts +23 -0
- package/dist/ergo/utils.d.ts.map +1 -0
- package/dist/ergo/utils.js +49 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import JsonBigInt from '@rosen-bridge/json-bigint';
|
|
2
|
+
import { ErgoBoxInitializer } from '../initializers';
|
|
3
|
+
import { CallbackType, } from '../interfaces';
|
|
4
|
+
import { AbstractErgoExtractor } from './abstractErgoExtractor';
|
|
5
|
+
/**
|
|
6
|
+
* Abstract Ergo Box Extractor class for box-based data extraction.
|
|
7
|
+
*
|
|
8
|
+
* This class extends the AbstractErgoExtractor class and provides
|
|
9
|
+
* functionality for extracting box-based data from the blockchain.
|
|
10
|
+
*
|
|
11
|
+
* It overrides the `initializeData` method to use the box-based initializer.
|
|
12
|
+
* It implements the `processTransactions` method to use the box-based data extraction.
|
|
13
|
+
*
|
|
14
|
+
* Triggers `Insert` callback on new data insertion.
|
|
15
|
+
* Triggers a new callback type `Spend` for each spent box.
|
|
16
|
+
*
|
|
17
|
+
* @template ExtractedData - The type of data extracted from blockchain
|
|
18
|
+
* @template ExtractorEntity - The database entity type for storing extracted data
|
|
19
|
+
*/
|
|
20
|
+
export class AbstractErgoBoxExtractor extends AbstractErgoExtractor {
|
|
21
|
+
constructor(initializeOptions, logger) {
|
|
22
|
+
super(initializeOptions, logger);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* extract transaction extra information
|
|
26
|
+
* override this function if there is extra needed information
|
|
27
|
+
* @param tx
|
|
28
|
+
* @returns
|
|
29
|
+
*/
|
|
30
|
+
getTransactionExtraData = (tx) => {
|
|
31
|
+
return {};
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* create spend info array for the transaction
|
|
35
|
+
* @param tx
|
|
36
|
+
* @returns spend info array of the transaction
|
|
37
|
+
*/
|
|
38
|
+
getTransactionSpendInfo = (tx) => {
|
|
39
|
+
let boxIndex = 1;
|
|
40
|
+
const spendInfoArray = [];
|
|
41
|
+
for (const input of tx.inputs) {
|
|
42
|
+
spendInfoArray.push({ txId: tx.id, boxId: input.boxId, index: boxIndex });
|
|
43
|
+
boxIndex += 1;
|
|
44
|
+
}
|
|
45
|
+
return spendInfoArray;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* process a list of transactions in a block and store required information
|
|
49
|
+
* @param txs list of transactions in the block
|
|
50
|
+
* @param block
|
|
51
|
+
* @return true if the process is completed successfully and false otherwise
|
|
52
|
+
*/
|
|
53
|
+
processTransactions = async (txs, block) => {
|
|
54
|
+
try {
|
|
55
|
+
const boxes = [];
|
|
56
|
+
const spentInfos = [];
|
|
57
|
+
for (const tx of txs) {
|
|
58
|
+
const inputExtensions = tx.inputs.map((input) => input.extension || {});
|
|
59
|
+
for (const output of tx.outputs) {
|
|
60
|
+
if (!this.hasBoxData(output)) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
this.logger.debug(`Trying to extract data from box ${output.boxId}`);
|
|
64
|
+
const extractedData = this.extractBoxData(output, inputExtensions, this.getTransactionExtraData(tx));
|
|
65
|
+
if (extractedData) {
|
|
66
|
+
this.logger.debug(`Extracted data ${JsonBigInt.stringify(extractedData)} from box ${output.boxId}`);
|
|
67
|
+
boxes.push(extractedData);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
spentInfos.push(...this.getTransactionSpendInfo(tx));
|
|
71
|
+
}
|
|
72
|
+
if (boxes.length > 0) {
|
|
73
|
+
if (!(await this.actions.storeEntities(boxes, block, this.getId()))) {
|
|
74
|
+
this.logger.warn(`Data insertion failed for ${this.getId()} at the block ${block.height}`);
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
this.triggerCallbacks(CallbackType.Insert, boxes);
|
|
78
|
+
}
|
|
79
|
+
const spentData = await this.actions.updateSpendingInfo(spentInfos, block, this.getId());
|
|
80
|
+
if (spentData.length > 0) {
|
|
81
|
+
this.triggerCallbacks(CallbackType.Spend, spentData);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
this.logger.error(`Processing transactions failed for ${this.getId()} at the block ${block.height} with error: ${e}`);
|
|
86
|
+
if (e instanceof Error && e.stack) {
|
|
87
|
+
this.logger.error(`error stack: ${e.stack}`);
|
|
88
|
+
}
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
return true;
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* initialize extractor database with data created below the initial height
|
|
95
|
+
* @param initialBlock
|
|
96
|
+
*/
|
|
97
|
+
initializeData = async (initialBlock) => {
|
|
98
|
+
if (this.initializeOptions && this.initializeOptions.active) {
|
|
99
|
+
const initializer = new ErgoBoxInitializer(this.initializeOptions.type, this.initializeOptions.url, this.initializeOptions.address, this.getId(), this.hasBoxData, this.processTransactions, this.actions, this.initializeOptions.maxParallelRequests, this.logger.child('ErgoBoxInitializer'));
|
|
100
|
+
await initializer.initializeData(initialBlock);
|
|
101
|
+
}
|
|
102
|
+
else
|
|
103
|
+
this.logger.info(`Initializiation for [${this.getId()}] is turned off`);
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RFcmdvQm94RXh0cmFjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2VyZ28vZXh0cmFjdG9ycy9hYnN0cmFjdEVyZ29Cb3hFeHRyYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxVQUFVLE1BQU0sMkJBQTJCLENBQUM7QUFTbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUdMLFlBQVksR0FHYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVoRTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sT0FBZ0Isd0JBR3BCLFNBQVEscUJBQXFEO0lBTTdELFlBQVksaUJBQXFDLEVBQUUsTUFBdUI7UUFDeEUsS0FBSyxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFxQkQ7Ozs7O09BS0c7SUFDSCx1QkFBdUIsR0FBRyxDQUN4QixFQUFlLEVBQ04sRUFBRTtRQUNYLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQyxDQUFDO0lBRUY7Ozs7T0FJRztJQUNILHVCQUF1QixHQUFHLENBQUMsRUFBZSxFQUFFLEVBQUU7UUFDNUMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUMxQixLQUFLLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM5QixjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDMUUsUUFBUSxJQUFJLENBQUMsQ0FBQztRQUNoQixDQUFDO1FBQ0QsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQyxDQUFDO0lBRUY7Ozs7O09BS0c7SUFDSCxtQkFBbUIsR0FBRyxLQUFLLEVBQ3pCLEdBQWtCLEVBQ2xCLEtBQWdCLEVBQ0UsRUFBRTtRQUNwQixJQUFJLENBQUM7WUFDSCxNQUFNLEtBQUssR0FBeUIsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sVUFBVSxHQUFxQixFQUFFLENBQUM7WUFDeEMsS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3hFLEtBQUssTUFBTSxNQUFNLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO3dCQUM3QixTQUFTO29CQUNYLENBQUM7b0JBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUNBQW1DLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO29CQUNyRSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUN2QyxNQUFNLEVBQ04sZUFBZSxFQUNmLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsQ0FDakMsQ0FBQztvQkFDRixJQUFJLGFBQWEsRUFBRSxDQUFDO3dCQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZixrQkFBa0IsVUFBVSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsYUFDbkQsTUFBTSxDQUFDLEtBQ1QsRUFBRSxDQUNILENBQUM7d0JBQ0YsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDNUIsQ0FBQztnQkFDSCxDQUFDO2dCQUNELFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2RCxDQUFDO1lBRUQsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUNwRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDZCw2QkFBNkIsSUFBSSxDQUFDLEtBQUssRUFBRSxpQkFDdkMsS0FBSyxDQUFDLE1BQ1IsRUFBRSxDQUNILENBQUM7b0JBQ0YsT0FBTyxLQUFLLENBQUM7Z0JBQ2YsQ0FBQztnQkFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwRCxDQUFDO1lBQ0QsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUNyRCxVQUFVLEVBQ1YsS0FBSyxFQUNMLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FDYixDQUFDO1lBQ0YsSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN2RCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZixzQ0FBc0MsSUFBSSxDQUFDLEtBQUssRUFBRSxpQkFDaEQsS0FBSyxDQUFDLE1BQ1IsZ0JBQWdCLENBQUMsRUFBRSxDQUNwQixDQUFDO1lBQ0YsSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQztJQUVGOzs7T0FHRztJQUNILGNBQWMsR0FBRyxLQUFLLEVBQUUsWUFBdUIsRUFBaUIsRUFBRTtRQUNoRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDNUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxrQkFBa0IsQ0FDeEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFDM0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFDMUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFDOUIsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUNaLElBQUksQ0FBQyxVQUFVLEVBQ2YsSUFBSSxDQUFDLG1CQUFtQixFQUN4QixJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsRUFDMUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FDeEMsQ0FBQztZQUNGLE1BQU0sV0FBVyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNqRCxDQUFDOztZQUNDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixJQUFJLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDNUUsQ0FBQyxDQUFDO0NBQ0giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBYnN0cmFjdExvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcbmltcG9ydCBKc29uQmlnSW50IGZyb20gJ0Byb3Nlbi1icmlkZ2UvanNvbi1iaWdpbnQnO1xuaW1wb3J0IHtcbiAgVHJhbnNhY3Rpb24sXG4gIEJsb2NrSW5mbyxcbiAgT3V0cHV0Qm94LFxuICBJbnB1dEV4dGVuc2lvbixcbn0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyLWludGVyZmFjZXMnO1xuXG5pbXBvcnQgeyBBYnN0cmFjdEVyZ29Cb3hFbnRpdHksIEFic3RyYWN0RXJnb0JveEFjdGlvbiB9IGZyb20gJy4uL2RhdGFiYXNlJztcbmltcG9ydCB7IEVyZ29Cb3hJbml0aWFsaXplciB9IGZyb20gJy4uL2luaXRpYWxpemVycyc7XG5pbXBvcnQge1xuICBBYnN0cmFjdEVudGl0eURhdGEsXG4gIFNwZW5kSW5mbyxcbiAgQ2FsbGJhY2tUeXBlLFxuICBUeEV4dHJhLFxuICBJbml0aWFsaXplT3B0aW9ucyxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBYnN0cmFjdEVyZ29FeHRyYWN0b3IgfSBmcm9tICcuL2Fic3RyYWN0RXJnb0V4dHJhY3Rvcic7XG5cbi8qKlxuICogQWJzdHJhY3QgRXJnbyBCb3ggRXh0cmFjdG9yIGNsYXNzIGZvciBib3gtYmFzZWQgZGF0YSBleHRyYWN0aW9uLlxuICpcbiAqIFRoaXMgY2xhc3MgZXh0ZW5kcyB0aGUgQWJzdHJhY3RFcmdvRXh0cmFjdG9yIGNsYXNzIGFuZCBwcm92aWRlc1xuICogZnVuY3Rpb25hbGl0eSBmb3IgZXh0cmFjdGluZyBib3gtYmFzZWQgZGF0YSBmcm9tIHRoZSBibG9ja2NoYWluLlxuICpcbiAqIEl0IG92ZXJyaWRlcyB0aGUgYGluaXRpYWxpemVEYXRhYCBtZXRob2QgdG8gdXNlIHRoZSBib3gtYmFzZWQgaW5pdGlhbGl6ZXIuXG4gKiBJdCBpbXBsZW1lbnRzIHRoZSBgcHJvY2Vzc1RyYW5zYWN0aW9uc2AgbWV0aG9kIHRvIHVzZSB0aGUgYm94LWJhc2VkIGRhdGEgZXh0cmFjdGlvbi5cbiAqXG4gKiBUcmlnZ2VycyBgSW5zZXJ0YCBjYWxsYmFjayBvbiBuZXcgZGF0YSBpbnNlcnRpb24uXG4gKiBUcmlnZ2VycyBhIG5ldyBjYWxsYmFjayB0eXBlIGBTcGVuZGAgZm9yIGVhY2ggc3BlbnQgYm94LlxuICpcbiAqIEB0ZW1wbGF0ZSBFeHRyYWN0ZWREYXRhIC0gVGhlIHR5cGUgb2YgZGF0YSBleHRyYWN0ZWQgZnJvbSBibG9ja2NoYWluXG4gKiBAdGVtcGxhdGUgRXh0cmFjdG9yRW50aXR5IC0gVGhlIGRhdGFiYXNlIGVudGl0eSB0eXBlIGZvciBzdG9yaW5nIGV4dHJhY3RlZCBkYXRhXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVyZ29Cb3hFeHRyYWN0b3I8XG4gIEV4dHJhY3RlZERhdGEgZXh0ZW5kcyBBYnN0cmFjdEVudGl0eURhdGEsXG4gIEV4dHJhY3RvckVudGl0eSBleHRlbmRzIEFic3RyYWN0RXJnb0JveEVudGl0eSxcbj4gZXh0ZW5kcyBBYnN0cmFjdEVyZ29FeHRyYWN0b3I8RXh0cmFjdGVkRGF0YSwgRXh0cmFjdG9yRW50aXR5PiB7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBhY3Rpb25zOiBBYnN0cmFjdEVyZ29Cb3hBY3Rpb248XG4gICAgRXh0cmFjdGVkRGF0YSxcbiAgICBFeHRyYWN0b3JFbnRpdHlcbiAgPjtcblxuICBjb25zdHJ1Y3Rvcihpbml0aWFsaXplT3B0aW9ucz86IEluaXRpYWxpemVPcHRpb25zLCBsb2dnZXI/OiBBYnN0cmFjdExvZ2dlcikge1xuICAgIHN1cGVyKGluaXRpYWxpemVPcHRpb25zLCBsb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIGV4dHJhY3QgYm94IGRhdGEgdG8gcHJvcGVyIGZvcm1hdCAobm90IGluY2x1ZGluZyBzcGVuZGluZyBpbmZvcm1hdGlvbilcbiAgICogQHBhcmFtIGJveFxuICAgKiBAcGFyYW0gaW5wdXRFeHRlbnNpb25zIGFsbCBpbnB1dCBib3ggZXh0ZW5zaW9ucyBpbiB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJuIGV4dHJhY3RlZCBkYXRhIGluIHByb3BlciBmb3JtYXRcbiAgICovXG4gIGFic3RyYWN0IGV4dHJhY3RCb3hEYXRhOiAoXG4gICAgYm94OiBPdXRwdXRCb3gsXG4gICAgaW5wdXRFeHRlbnNpb25zOiBJbnB1dEV4dGVuc2lvbltdLFxuICAgIHR4RXh0cmE/OiBUeEV4dHJhLFxuICApID0+IEV4dHJhY3RlZERhdGEgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIGNoZWNrIHByb3BlciBkYXRhIGZvcm1hdCBpbiB0aGUgYm94XG4gICAqIEBwYXJhbSBib3hcbiAgICogQHJldHVybiB0cnVlIGlmIHRoZSBib3ggaGFzIHRoZSByZXF1aXJlZCBkYXRhIGFuZCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIGFic3RyYWN0IGhhc0JveERhdGE6IChib3g6IE91dHB1dEJveCkgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogZXh0cmFjdCB0cmFuc2FjdGlvbiBleHRyYSBpbmZvcm1hdGlvblxuICAgKiBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGlmIHRoZXJlIGlzIGV4dHJhIG5lZWRlZCBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0gdHhcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldFRyYW5zYWN0aW9uRXh0cmFEYXRhID0gKFxuICAgIHR4OiBUcmFuc2FjdGlvbiwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgKTogVHhFeHRyYSA9PiB7XG4gICAgcmV0dXJuIHt9O1xuICB9O1xuXG4gIC8qKlxuICAgKiBjcmVhdGUgc3BlbmQgaW5mbyBhcnJheSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB0eFxuICAgKiBAcmV0dXJucyBzcGVuZCBpbmZvIGFycmF5IG9mIHRoZSB0cmFuc2FjdGlvblxuICAgKi9cbiAgZ2V0VHJhbnNhY3Rpb25TcGVuZEluZm8gPSAodHg6IFRyYW5zYWN0aW9uKSA9PiB7XG4gICAgbGV0IGJveEluZGV4ID0gMTtcbiAgICBjb25zdCBzcGVuZEluZm9BcnJheSA9IFtdO1xuICAgIGZvciAoY29uc3QgaW5wdXQgb2YgdHguaW5wdXRzKSB7XG4gICAgICBzcGVuZEluZm9BcnJheS5wdXNoKHsgdHhJZDogdHguaWQsIGJveElkOiBpbnB1dC5ib3hJZCwgaW5kZXg6IGJveEluZGV4IH0pO1xuICAgICAgYm94SW5kZXggKz0gMTtcbiAgICB9XG4gICAgcmV0dXJuIHNwZW5kSW5mb0FycmF5O1xuICB9O1xuXG4gIC8qKlxuICAgKiBwcm9jZXNzIGEgbGlzdCBvZiB0cmFuc2FjdGlvbnMgaW4gYSBibG9jayBhbmQgc3RvcmUgcmVxdWlyZWQgaW5mb3JtYXRpb25cbiAgICogQHBhcmFtIHR4cyBsaXN0IG9mIHRyYW5zYWN0aW9ucyBpbiB0aGUgYmxvY2tcbiAgICogQHBhcmFtIGJsb2NrXG4gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvY2VzcyBpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGFuZCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHByb2Nlc3NUcmFuc2FjdGlvbnMgPSBhc3luYyAoXG4gICAgdHhzOiBUcmFuc2FjdGlvbltdLFxuICAgIGJsb2NrOiBCbG9ja0luZm8sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBib3hlczogQXJyYXk8RXh0cmFjdGVkRGF0YT4gPSBbXTtcbiAgICAgIGNvbnN0IHNwZW50SW5mb3M6IEFycmF5PFNwZW5kSW5mbz4gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdHggb2YgdHhzKSB7XG4gICAgICAgIGNvbnN0IGlucHV0RXh0ZW5zaW9ucyA9IHR4LmlucHV0cy5tYXAoKGlucHV0KSA9PiBpbnB1dC5leHRlbnNpb24gfHwge30pO1xuICAgICAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiB0eC5vdXRwdXRzKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmhhc0JveERhdGEob3V0cHV0KSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBUcnlpbmcgdG8gZXh0cmFjdCBkYXRhIGZyb20gYm94ICR7b3V0cHV0LmJveElkfWApO1xuICAgICAgICAgIGNvbnN0IGV4dHJhY3RlZERhdGEgPSB0aGlzLmV4dHJhY3RCb3hEYXRhKFxuICAgICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgICAgaW5wdXRFeHRlbnNpb25zLFxuICAgICAgICAgICAgdGhpcy5nZXRUcmFuc2FjdGlvbkV4dHJhRGF0YSh0eCksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZXh0cmFjdGVkRGF0YSkge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgIGBFeHRyYWN0ZWQgZGF0YSAke0pzb25CaWdJbnQuc3RyaW5naWZ5KGV4dHJhY3RlZERhdGEpfSBmcm9tIGJveCAke1xuICAgICAgICAgICAgICAgIG91dHB1dC5ib3hJZFxuICAgICAgICAgICAgICB9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBib3hlcy5wdXNoKGV4dHJhY3RlZERhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzcGVudEluZm9zLnB1c2goLi4udGhpcy5nZXRUcmFuc2FjdGlvblNwZW5kSW5mbyh0eCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYm94ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoIShhd2FpdCB0aGlzLmFjdGlvbnMuc3RvcmVFbnRpdGllcyhib3hlcywgYmxvY2ssIHRoaXMuZ2V0SWQoKSkpKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBEYXRhIGluc2VydGlvbiBmYWlsZWQgZm9yICR7dGhpcy5nZXRJZCgpfSBhdCB0aGUgYmxvY2sgJHtcbiAgICAgICAgICAgICAgYmxvY2suaGVpZ2h0XG4gICAgICAgICAgICB9YCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRyaWdnZXJDYWxsYmFja3MoQ2FsbGJhY2tUeXBlLkluc2VydCwgYm94ZXMpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3BlbnREYXRhID0gYXdhaXQgdGhpcy5hY3Rpb25zLnVwZGF0ZVNwZW5kaW5nSW5mbyhcbiAgICAgICAgc3BlbnRJbmZvcyxcbiAgICAgICAgYmxvY2ssXG4gICAgICAgIHRoaXMuZ2V0SWQoKSxcbiAgICAgICk7XG4gICAgICBpZiAoc3BlbnREYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyQ2FsbGJhY2tzKENhbGxiYWNrVHlwZS5TcGVuZCwgc3BlbnREYXRhKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYFByb2Nlc3NpbmcgdHJhbnNhY3Rpb25zIGZhaWxlZCBmb3IgJHt0aGlzLmdldElkKCl9IGF0IHRoZSBibG9jayAke1xuICAgICAgICAgIGJsb2NrLmhlaWdodFxuICAgICAgICB9IHdpdGggZXJyb3I6ICR7ZX1gLFxuICAgICAgKTtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5zdGFjaykge1xuICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihgZXJyb3Igc3RhY2s6ICR7ZS5zdGFja31gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIGluaXRpYWxpemUgZXh0cmFjdG9yIGRhdGFiYXNlIHdpdGggZGF0YSBjcmVhdGVkIGJlbG93IHRoZSBpbml0aWFsIGhlaWdodFxuICAgKiBAcGFyYW0gaW5pdGlhbEJsb2NrXG4gICAqL1xuICBpbml0aWFsaXplRGF0YSA9IGFzeW5jIChpbml0aWFsQmxvY2s6IEJsb2NrSW5mbyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVPcHRpb25zICYmIHRoaXMuaW5pdGlhbGl6ZU9wdGlvbnMuYWN0aXZlKSB7XG4gICAgICBjb25zdCBpbml0aWFsaXplciA9IG5ldyBFcmdvQm94SW5pdGlhbGl6ZXIoXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZU9wdGlvbnMudHlwZSxcbiAgICAgICAgdGhpcy5pbml0aWFsaXplT3B0aW9ucy51cmwsXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZU9wdGlvbnMuYWRkcmVzcyxcbiAgICAgICAgdGhpcy5nZXRJZCgpLFxuICAgICAgICB0aGlzLmhhc0JveERhdGEsXG4gICAgICAgIHRoaXMucHJvY2Vzc1RyYW5zYWN0aW9ucyxcbiAgICAgICAgdGhpcy5hY3Rpb25zLFxuICAgICAgICB0aGlzLmluaXRpYWxpemVPcHRpb25zLm1heFBhcmFsbGVsUmVxdWVzdHMsXG4gICAgICAgIHRoaXMubG9nZ2VyLmNoaWxkKCdFcmdvQm94SW5pdGlhbGl6ZXInKSxcbiAgICAgICk7XG4gICAgICBhd2FpdCBpbml0aWFsaXplci5pbml0aWFsaXplRGF0YShpbml0aWFsQmxvY2spO1xuICAgIH0gZWxzZVxuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgSW5pdGlhbGl6aWF0aW9uIGZvciBbJHt0aGlzLmdldElkKCl9XSBpcyB0dXJuZWQgb2ZmYCk7XG4gIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { AbstractLogger } from '@rosen-bridge/abstract-logger';
|
|
2
|
+
import { SelectQueryBuilder } from '@rosen-bridge/extended-typeorm';
|
|
3
|
+
import { Transaction } from '@rosen-bridge/scanner-interfaces';
|
|
4
|
+
import { AbstractExtractor } from '../../abstractExtractor';
|
|
5
|
+
import { AbstractErgoEntity, AbstractErgoAction } from '../database';
|
|
6
|
+
import { AbstractEntityData, CallbackType, CallbackMap, CallbackDataMap, InitializeOptions } from '../interfaces';
|
|
7
|
+
/**
|
|
8
|
+
* Abstract Ergo-specific extractor that provides common functionality for all Ergo extractors.
|
|
9
|
+
*
|
|
10
|
+
* It provides callback support and blockchain fork handle for all ergo extractors.
|
|
11
|
+
*
|
|
12
|
+
* It triggers callbacks for the `Update` and `Delete` actions on a forked block.
|
|
13
|
+
*
|
|
14
|
+
* @template ExtractedData - The type of data extracted from blockchain
|
|
15
|
+
* @template ExtractorEntity - The database entity type for storing extracted data
|
|
16
|
+
*/
|
|
17
|
+
export declare abstract class AbstractErgoExtractor<ExtractedData extends AbstractEntityData, ExtractorEntity extends AbstractErgoEntity> extends AbstractExtractor<Transaction, ExtractorEntity> {
|
|
18
|
+
protected initializeOptions?: InitializeOptions | undefined;
|
|
19
|
+
protected logger: AbstractLogger;
|
|
20
|
+
protected abstract actions: AbstractErgoAction<ExtractedData, ExtractorEntity>;
|
|
21
|
+
protected callbacks: {
|
|
22
|
+
[K in CallbackType]: Map<string, CallbackMap<ExtractedData>[K]>;
|
|
23
|
+
};
|
|
24
|
+
private callbackMutex;
|
|
25
|
+
constructor(initializeOptions?: InitializeOptions | undefined, logger?: AbstractLogger);
|
|
26
|
+
/**
|
|
27
|
+
* hook a new callback on a callback type
|
|
28
|
+
* @param type
|
|
29
|
+
* @param id
|
|
30
|
+
* @param callback
|
|
31
|
+
* @returns callback registered id
|
|
32
|
+
*/
|
|
33
|
+
hook: <T extends CallbackType>(type: T, callback: CallbackMap<ExtractedData>[T]) => Promise<string>;
|
|
34
|
+
/**
|
|
35
|
+
* unhook a callback on a type
|
|
36
|
+
* returns false if there is no registered callback with the id
|
|
37
|
+
* @param type
|
|
38
|
+
* @param id
|
|
39
|
+
* @returns success status
|
|
40
|
+
*/
|
|
41
|
+
unhook: (type: CallbackType, id: string) => Promise<boolean>;
|
|
42
|
+
/**
|
|
43
|
+
* trigger all callbacks registered on a specific type with the provided data
|
|
44
|
+
* @param type
|
|
45
|
+
* @param data
|
|
46
|
+
*/
|
|
47
|
+
protected triggerCallbacks<T extends CallbackType>(type: T, data: CallbackDataMap<ExtractedData>[T]): void;
|
|
48
|
+
/**
|
|
49
|
+
* fork one block and remove all stored information for this block
|
|
50
|
+
* @param hash block hash
|
|
51
|
+
*/
|
|
52
|
+
forkBlock: (hash: string) => Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Builds a query that returns used blocks by selecting the `block` column from the `ExtractorEntity` repository,
|
|
55
|
+
* filtered by the provided `extractorId`
|
|
56
|
+
*
|
|
57
|
+
* @returns A query builder selecting used blocks
|
|
58
|
+
*/
|
|
59
|
+
createUsedBlocksQuery: () => SelectQueryBuilder<ExtractorEntity>;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=abstractErgoExtractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abstractErgoExtractor.d.ts","sourceRoot":"","sources":["../../../lib/ergo/extractors/abstractErgoExtractor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAG/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,iBAAiB,EAClB,MAAM,eAAe,CAAC;AAEvB;;;;;;;;;GASG;AACH,8BAAsB,qBAAqB,CACzC,aAAa,SAAS,kBAAkB,EACxC,eAAe,SAAS,kBAAkB,CAC1C,SAAQ,iBAAiB,CAAC,WAAW,EAAE,eAAe,CAAC;IAgBrD,SAAS,CAAC,iBAAiB,CAAC,EAAE,iBAAiB;IAC/C,SAAS,CAAC,MAAM,EAAE,cAAc;IAhBlC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAC5C,aAAa,EACb,eAAe,CAChB,CAAC;IACF,SAAS,CAAC,SAAS,EAAE;SAClB,CAAC,IAAI,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;KAChE,CAKC;IACF,OAAO,CAAC,aAAa,CAAe;gBAGxB,iBAAiB,CAAC,EAAE,iBAAiB,YAAA,EACrC,MAAM,GAAE,cAAkC;IAKtD;;;;;;OAMG;IACH,IAAI,GAAU,CAAC,SAAS,YAAY,EAClC,MAAM,CAAC,EACP,UAAU,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KACtC,OAAO,CAAC,MAAM,CAAC,CAOhB;IAEF;;;;;;OAMG;IACH,MAAM,GAAU,MAAM,YAAY,EAAE,IAAI,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC,CAY/D;IAEF;;;;OAIG;IACH,SAAS,CAAC,gBAAgB,CAAC,CAAC,SAAS,YAAY,EAC/C,IAAI,EAAE,CAAC,EACP,IAAI,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GACtC,IAAI;IAaP;;;OAGG;IACH,SAAS,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC,CAM7C;IAEF;;;;;OAKG;IACH,qBAAqB,QAAO,kBAAkB,CAAC,eAAe,CAAC,CACZ;CACpD"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
2
|
+
import { DummyLogger } from '@rosen-bridge/abstract-logger';
|
|
3
|
+
import { Mutex } from '@rosen-bridge/semaphore';
|
|
4
|
+
import { AbstractExtractor } from '../../abstractExtractor';
|
|
5
|
+
import { CallbackType, } from '../interfaces';
|
|
6
|
+
/**
|
|
7
|
+
* Abstract Ergo-specific extractor that provides common functionality for all Ergo extractors.
|
|
8
|
+
*
|
|
9
|
+
* It provides callback support and blockchain fork handle for all ergo extractors.
|
|
10
|
+
*
|
|
11
|
+
* It triggers callbacks for the `Update` and `Delete` actions on a forked block.
|
|
12
|
+
*
|
|
13
|
+
* @template ExtractedData - The type of data extracted from blockchain
|
|
14
|
+
* @template ExtractorEntity - The database entity type for storing extracted data
|
|
15
|
+
*/
|
|
16
|
+
export class AbstractErgoExtractor extends AbstractExtractor {
|
|
17
|
+
initializeOptions;
|
|
18
|
+
logger;
|
|
19
|
+
callbacks = {
|
|
20
|
+
[CallbackType.Update]: new Map(),
|
|
21
|
+
[CallbackType.Insert]: new Map(),
|
|
22
|
+
[CallbackType.Delete]: new Map(),
|
|
23
|
+
[CallbackType.Spend]: new Map(),
|
|
24
|
+
};
|
|
25
|
+
callbackMutex = new Mutex();
|
|
26
|
+
constructor(initializeOptions, logger = new DummyLogger()) {
|
|
27
|
+
super();
|
|
28
|
+
this.initializeOptions = initializeOptions;
|
|
29
|
+
this.logger = logger;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* hook a new callback on a callback type
|
|
33
|
+
* @param type
|
|
34
|
+
* @param id
|
|
35
|
+
* @param callback
|
|
36
|
+
* @returns callback registered id
|
|
37
|
+
*/
|
|
38
|
+
hook = async (type, callback) => {
|
|
39
|
+
const release = await this.callbackMutex.acquire();
|
|
40
|
+
const callbackMap = this.callbacks[type];
|
|
41
|
+
const id = uuidv4();
|
|
42
|
+
callbackMap.set(id, callback);
|
|
43
|
+
release();
|
|
44
|
+
return id;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* unhook a callback on a type
|
|
48
|
+
* returns false if there is no registered callback with the id
|
|
49
|
+
* @param type
|
|
50
|
+
* @param id
|
|
51
|
+
* @returns success status
|
|
52
|
+
*/
|
|
53
|
+
unhook = async (type, id) => {
|
|
54
|
+
const release = await this.callbackMutex.acquire();
|
|
55
|
+
const callbackMap = this.callbacks[type];
|
|
56
|
+
if (!callbackMap.has(id)) {
|
|
57
|
+
this.logger.warn(`Callback with Id [${id}] is not registered for type [${type}].`);
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
callbackMap.delete(id);
|
|
61
|
+
release();
|
|
62
|
+
return true;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* trigger all callbacks registered on a specific type with the provided data
|
|
66
|
+
* @param type
|
|
67
|
+
* @param data
|
|
68
|
+
*/
|
|
69
|
+
triggerCallbacks(type, data) {
|
|
70
|
+
const callbackMap = this.callbacks[type];
|
|
71
|
+
callbackMap.forEach((callback) => {
|
|
72
|
+
try {
|
|
73
|
+
callback(data);
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
this.logger.warn(`callback failed for ${type} action on data [${data}] with error: ${e}`);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* fork one block and remove all stored information for this block
|
|
82
|
+
* @param hash block hash
|
|
83
|
+
*/
|
|
84
|
+
forkBlock = async (hash) => {
|
|
85
|
+
const result = await this.actions.deleteBlockData(hash, this.getId());
|
|
86
|
+
if (result.deletedData.length > 0)
|
|
87
|
+
this.triggerCallbacks(CallbackType.Delete, result.deletedData);
|
|
88
|
+
if (result.updatedData.length > 0)
|
|
89
|
+
this.triggerCallbacks(CallbackType.Update, result.updatedData);
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Builds a query that returns used blocks by selecting the `block` column from the `ExtractorEntity` repository,
|
|
93
|
+
* filtered by the provided `extractorId`
|
|
94
|
+
*
|
|
95
|
+
* @returns A query builder selecting used blocks
|
|
96
|
+
*/
|
|
97
|
+
createUsedBlocksQuery = () => this.actions.createUsedBlocksQuery(this.getId());
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RFcmdvRXh0cmFjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2VyZ28vZXh0cmFjdG9ycy9hYnN0cmFjdEVyZ29FeHRyYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEMsT0FBTyxFQUFrQixXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUc1RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFaEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFNUQsT0FBTyxFQUVMLFlBQVksR0FJYixNQUFNLGVBQWUsQ0FBQztBQUV2Qjs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLE9BQWdCLHFCQUdwQixTQUFRLGlCQUErQztJQWdCM0M7SUFDQTtJQVpGLFNBQVMsR0FFZjtRQUNGLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksR0FBRyxFQUFFO1FBQ2hDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksR0FBRyxFQUFFO1FBQ2hDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksR0FBRyxFQUFFO1FBQ2hDLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksR0FBRyxFQUFFO0tBQ2hDLENBQUM7SUFDTSxhQUFhLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUVwQyxZQUNZLGlCQUFxQyxFQUNyQyxTQUF5QixJQUFJLFdBQVcsRUFBRTtRQUVwRCxLQUFLLEVBQUUsQ0FBQztRQUhFLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBb0I7UUFDckMsV0FBTSxHQUFOLE1BQU0sQ0FBb0M7SUFHdEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILElBQUksR0FBRyxLQUFLLEVBQ1YsSUFBTyxFQUNQLFFBQXVDLEVBQ3RCLEVBQUU7UUFDbkIsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25ELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsTUFBTSxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDcEIsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDOUIsT0FBTyxFQUFFLENBQUM7UUFDVixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUMsQ0FBQztJQUVGOzs7Ozs7T0FNRztJQUNILE1BQU0sR0FBRyxLQUFLLEVBQUUsSUFBa0IsRUFBRSxFQUFVLEVBQW9CLEVBQUU7UUFDbEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25ELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDZCxxQkFBcUIsRUFBRSxpQ0FBaUMsSUFBSSxJQUFJLENBQ2pFLENBQUM7WUFDRixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8sRUFBRSxDQUFDO1FBQ1YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUM7SUFFRjs7OztPQUlHO0lBQ08sZ0JBQWdCLENBQ3hCLElBQU8sRUFDUCxJQUF1QztRQUV2QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUMvQixJQUFJLENBQUM7Z0JBQ0gsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pCLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO2dCQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNkLHVCQUF1QixJQUFJLG9CQUFvQixJQUFJLGlCQUFpQixDQUFDLEVBQUUsQ0FDeEUsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLEdBQUcsS0FBSyxFQUFFLElBQVksRUFBaUIsRUFBRTtRQUNoRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN0RSxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDL0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2pFLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUMvQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkUsQ0FBQyxDQUFDO0lBRUY7Ozs7O09BS0c7SUFDSCxxQkFBcUIsR0FBRyxHQUF3QyxFQUFFLENBQ2hFLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7Q0FDcEQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcblxuaW1wb3J0IHsgQWJzdHJhY3RMb2dnZXIsIER1bW15TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHsgU2VsZWN0UXVlcnlCdWlsZGVyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9leHRlbmRlZC10eXBlb3JtJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyLWludGVyZmFjZXMnO1xuaW1wb3J0IHsgTXV0ZXggfSBmcm9tICdAcm9zZW4tYnJpZGdlL3NlbWFwaG9yZSc7XG5cbmltcG9ydCB7IEFic3RyYWN0RXh0cmFjdG9yIH0gZnJvbSAnLi4vLi4vYWJzdHJhY3RFeHRyYWN0b3InO1xuaW1wb3J0IHsgQWJzdHJhY3RFcmdvRW50aXR5LCBBYnN0cmFjdEVyZ29BY3Rpb24gfSBmcm9tICcuLi9kYXRhYmFzZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdEVudGl0eURhdGEsXG4gIENhbGxiYWNrVHlwZSxcbiAgQ2FsbGJhY2tNYXAsXG4gIENhbGxiYWNrRGF0YU1hcCxcbiAgSW5pdGlhbGl6ZU9wdGlvbnMsXG59IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuXG4vKipcbiAqIEFic3RyYWN0IEVyZ28tc3BlY2lmaWMgZXh0cmFjdG9yIHRoYXQgcHJvdmlkZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCBFcmdvIGV4dHJhY3RvcnMuXG4gKlxuICogSXQgcHJvdmlkZXMgY2FsbGJhY2sgc3VwcG9ydCBhbmQgYmxvY2tjaGFpbiBmb3JrIGhhbmRsZSBmb3IgYWxsIGVyZ28gZXh0cmFjdG9ycy5cbiAqXG4gKiBJdCB0cmlnZ2VycyBjYWxsYmFja3MgZm9yIHRoZSBgVXBkYXRlYCBhbmQgYERlbGV0ZWAgYWN0aW9ucyBvbiBhIGZvcmtlZCBibG9jay5cbiAqXG4gKiBAdGVtcGxhdGUgRXh0cmFjdGVkRGF0YSAtIFRoZSB0eXBlIG9mIGRhdGEgZXh0cmFjdGVkIGZyb20gYmxvY2tjaGFpblxuICogQHRlbXBsYXRlIEV4dHJhY3RvckVudGl0eSAtIFRoZSBkYXRhYmFzZSBlbnRpdHkgdHlwZSBmb3Igc3RvcmluZyBleHRyYWN0ZWQgZGF0YVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFcmdvRXh0cmFjdG9yPFxuICBFeHRyYWN0ZWREYXRhIGV4dGVuZHMgQWJzdHJhY3RFbnRpdHlEYXRhLFxuICBFeHRyYWN0b3JFbnRpdHkgZXh0ZW5kcyBBYnN0cmFjdEVyZ29FbnRpdHksXG4+IGV4dGVuZHMgQWJzdHJhY3RFeHRyYWN0b3I8VHJhbnNhY3Rpb24sIEV4dHJhY3RvckVudGl0eT4ge1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYWN0aW9uczogQWJzdHJhY3RFcmdvQWN0aW9uPFxuICAgIEV4dHJhY3RlZERhdGEsXG4gICAgRXh0cmFjdG9yRW50aXR5XG4gID47XG4gIHByb3RlY3RlZCBjYWxsYmFja3M6IHtcbiAgICBbSyBpbiBDYWxsYmFja1R5cGVdOiBNYXA8c3RyaW5nLCBDYWxsYmFja01hcDxFeHRyYWN0ZWREYXRhPltLXT47XG4gIH0gPSB7XG4gICAgW0NhbGxiYWNrVHlwZS5VcGRhdGVdOiBuZXcgTWFwKCksXG4gICAgW0NhbGxiYWNrVHlwZS5JbnNlcnRdOiBuZXcgTWFwKCksXG4gICAgW0NhbGxiYWNrVHlwZS5EZWxldGVdOiBuZXcgTWFwKCksXG4gICAgW0NhbGxiYWNrVHlwZS5TcGVuZF06IG5ldyBNYXAoKSxcbiAgfTtcbiAgcHJpdmF0ZSBjYWxsYmFja011dGV4ID0gbmV3IE11dGV4KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGluaXRpYWxpemVPcHRpb25zPzogSW5pdGlhbGl6ZU9wdGlvbnMsXG4gICAgcHJvdGVjdGVkIGxvZ2dlcjogQWJzdHJhY3RMb2dnZXIgPSBuZXcgRHVtbXlMb2dnZXIoKSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBob29rIGEgbmV3IGNhbGxiYWNrIG9uIGEgY2FsbGJhY2sgdHlwZVxuICAgKiBAcGFyYW0gdHlwZVxuICAgKiBAcGFyYW0gaWRcbiAgICogQHBhcmFtIGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIGNhbGxiYWNrIHJlZ2lzdGVyZWQgaWRcbiAgICovXG4gIGhvb2sgPSBhc3luYyA8VCBleHRlbmRzIENhbGxiYWNrVHlwZT4oXG4gICAgdHlwZTogVCxcbiAgICBjYWxsYmFjazogQ2FsbGJhY2tNYXA8RXh0cmFjdGVkRGF0YT5bVF0sXG4gICk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgY29uc3QgcmVsZWFzZSA9IGF3YWl0IHRoaXMuY2FsbGJhY2tNdXRleC5hY3F1aXJlKCk7XG4gICAgY29uc3QgY2FsbGJhY2tNYXAgPSB0aGlzLmNhbGxiYWNrc1t0eXBlXTtcbiAgICBjb25zdCBpZCA9IHV1aWR2NCgpO1xuICAgIGNhbGxiYWNrTWFwLnNldChpZCwgY2FsbGJhY2spO1xuICAgIHJlbGVhc2UoKTtcbiAgICByZXR1cm4gaWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIHVuaG9vayBhIGNhbGxiYWNrIG9uIGEgdHlwZVxuICAgKiByZXR1cm5zIGZhbHNlIGlmIHRoZXJlIGlzIG5vIHJlZ2lzdGVyZWQgY2FsbGJhY2sgd2l0aCB0aGUgaWRcbiAgICogQHBhcmFtIHR5cGVcbiAgICogQHBhcmFtIGlkXG4gICAqIEByZXR1cm5zIHN1Y2Nlc3Mgc3RhdHVzXG4gICAqL1xuICB1bmhvb2sgPSBhc3luYyAodHlwZTogQ2FsbGJhY2tUeXBlLCBpZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgY29uc3QgcmVsZWFzZSA9IGF3YWl0IHRoaXMuY2FsbGJhY2tNdXRleC5hY3F1aXJlKCk7XG4gICAgY29uc3QgY2FsbGJhY2tNYXAgPSB0aGlzLmNhbGxiYWNrc1t0eXBlXTtcbiAgICBpZiAoIWNhbGxiYWNrTWFwLmhhcyhpZCkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgIGBDYWxsYmFjayB3aXRoIElkIFske2lkfV0gaXMgbm90IHJlZ2lzdGVyZWQgZm9yIHR5cGUgWyR7dHlwZX1dLmAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjYWxsYmFja01hcC5kZWxldGUoaWQpO1xuICAgIHJlbGVhc2UoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogdHJpZ2dlciBhbGwgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgb24gYSBzcGVjaWZpYyB0eXBlIHdpdGggdGhlIHByb3ZpZGVkIGRhdGFcbiAgICogQHBhcmFtIHR5cGVcbiAgICogQHBhcmFtIGRhdGFcbiAgICovXG4gIHByb3RlY3RlZCB0cmlnZ2VyQ2FsbGJhY2tzPFQgZXh0ZW5kcyBDYWxsYmFja1R5cGU+KFxuICAgIHR5cGU6IFQsXG4gICAgZGF0YTogQ2FsbGJhY2tEYXRhTWFwPEV4dHJhY3RlZERhdGE+W1RdLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBjYWxsYmFja01hcCA9IHRoaXMuY2FsbGJhY2tzW3R5cGVdO1xuICAgIGNhbGxiYWNrTWFwLmZvckVhY2goKGNhbGxiYWNrKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjYWxsYmFjayhkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgY2FsbGJhY2sgZmFpbGVkIGZvciAke3R5cGV9IGFjdGlvbiBvbiBkYXRhIFske2RhdGF9XSB3aXRoIGVycm9yOiAke2V9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBmb3JrIG9uZSBibG9jayBhbmQgcmVtb3ZlIGFsbCBzdG9yZWQgaW5mb3JtYXRpb24gZm9yIHRoaXMgYmxvY2tcbiAgICogQHBhcmFtIGhhc2ggYmxvY2sgaGFzaFxuICAgKi9cbiAgZm9ya0Jsb2NrID0gYXN5bmMgKGhhc2g6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWN0aW9ucy5kZWxldGVCbG9ja0RhdGEoaGFzaCwgdGhpcy5nZXRJZCgpKTtcbiAgICBpZiAocmVzdWx0LmRlbGV0ZWREYXRhLmxlbmd0aCA+IDApXG4gICAgICB0aGlzLnRyaWdnZXJDYWxsYmFja3MoQ2FsbGJhY2tUeXBlLkRlbGV0ZSwgcmVzdWx0LmRlbGV0ZWREYXRhKTtcbiAgICBpZiAocmVzdWx0LnVwZGF0ZWREYXRhLmxlbmd0aCA+IDApXG4gICAgICB0aGlzLnRyaWdnZXJDYWxsYmFja3MoQ2FsbGJhY2tUeXBlLlVwZGF0ZSwgcmVzdWx0LnVwZGF0ZWREYXRhKTtcbiAgfTtcblxuICAvKipcbiAgICogQnVpbGRzIGEgcXVlcnkgdGhhdCByZXR1cm5zIHVzZWQgYmxvY2tzIGJ5IHNlbGVjdGluZyB0aGUgYGJsb2NrYCBjb2x1bW4gZnJvbSB0aGUgYEV4dHJhY3RvckVudGl0eWAgcmVwb3NpdG9yeSxcbiAgICogZmlsdGVyZWQgYnkgdGhlIHByb3ZpZGVkIGBleHRyYWN0b3JJZGBcbiAgICpcbiAgICogQHJldHVybnMgQSBxdWVyeSBidWlsZGVyIHNlbGVjdGluZyB1c2VkIGJsb2Nrc1xuICAgKi9cbiAgY3JlYXRlVXNlZEJsb2Nrc1F1ZXJ5ID0gKCk6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxFeHRyYWN0b3JFbnRpdHk+ID0+XG4gICAgdGhpcy5hY3Rpb25zLmNyZWF0ZVVzZWRCbG9ja3NRdWVyeSh0aGlzLmdldElkKCkpO1xufVxuIl19
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { AbstractLogger } from '@rosen-bridge/abstract-logger';
|
|
2
|
+
import { BlockInfo, Transaction } from '@rosen-bridge/scanner-interfaces';
|
|
3
|
+
import { AbstractErgoEntity } from '../database';
|
|
4
|
+
import { AbstractEntityData, InitializeOptions } from '../interfaces';
|
|
5
|
+
import { AbstractErgoExtractor } from './abstractErgoExtractor';
|
|
6
|
+
/**
|
|
7
|
+
* Abstract Ergo Tx Extractor class for tx-based data extraction.
|
|
8
|
+
*
|
|
9
|
+
* This class extends the AbstractErgoExtractor class and provides
|
|
10
|
+
* functionality for extracting tx-based data from the blockchain.
|
|
11
|
+
*
|
|
12
|
+
* It implements the `initializeData` method with ergo initializers.
|
|
13
|
+
* It implements the `processTransactions` method to extract and
|
|
14
|
+
* store data from transactions.
|
|
15
|
+
*
|
|
16
|
+
* Triggers `Insert` callback on new data insertion.
|
|
17
|
+
*
|
|
18
|
+
* @template ExtractedData - The type of data extracted from blockchain
|
|
19
|
+
* @template ExtractorEntity - The database entity type for storing extracted data
|
|
20
|
+
*/
|
|
21
|
+
export declare abstract class AbstractErgoTxExtractor<ExtractedData extends AbstractEntityData, ExtractorEntity extends AbstractErgoEntity> extends AbstractErgoExtractor<ExtractedData, ExtractorEntity> {
|
|
22
|
+
constructor(initializeOptions?: InitializeOptions, logger?: AbstractLogger);
|
|
23
|
+
/**
|
|
24
|
+
* Extract transaction data to proper format (not including spending information).
|
|
25
|
+
* This method should be overridden by subclasses that need transaction-based extraction.
|
|
26
|
+
* @param tx - The transaction to extract data from
|
|
27
|
+
* @returns extracted data in proper format or undefined if no data should be extracted
|
|
28
|
+
* @throws Error if not overridden by subclass
|
|
29
|
+
*/
|
|
30
|
+
abstract extractTxData: (tx: Transaction, block: BlockInfo) => ExtractedData | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* Check if the transaction has the required data format.
|
|
33
|
+
* This method should be overridden by subclasses that need transaction-based extraction.
|
|
34
|
+
* @param tx - The transaction to check
|
|
35
|
+
* @returns true if the transaction has the required data and false otherwise
|
|
36
|
+
* @throws Error if not overridden by subclass
|
|
37
|
+
*/
|
|
38
|
+
abstract hasTxData: (tx: Transaction) => boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Process a list of transactions in a block and store required information.
|
|
41
|
+
* This method can be overridden by subclasses for custom transaction processing,
|
|
42
|
+
* or they can override extractTxData and hasTxData methods instead.
|
|
43
|
+
* @param txs - List of transactions in the block
|
|
44
|
+
* @param block - Block information
|
|
45
|
+
* @returns true if the process is completed successfully and false otherwise
|
|
46
|
+
*/
|
|
47
|
+
processTransactions: (txs: Transaction[], block: BlockInfo) => Promise<boolean>;
|
|
48
|
+
/**
|
|
49
|
+
* initialize extractor database with data created below the initial height
|
|
50
|
+
* @param initialBlock
|
|
51
|
+
*/
|
|
52
|
+
initializeData: (initialBlock: BlockInfo) => Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=abstractErgoTxExtractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abstractErgoTxExtractor.d.ts","sourceRoot":"","sources":["../../../lib/ergo/extractors/abstractErgoTxExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAE1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EACL,kBAAkB,EAElB,iBAAiB,EAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE;;;;;;;;;;;;;;GAcG;AACH,8BAAsB,uBAAuB,CAC3C,aAAa,SAAS,kBAAkB,EACxC,eAAe,SAAS,kBAAkB,CAC1C,SAAQ,qBAAqB,CAAC,aAAa,EAAE,eAAe,CAAC;gBACjD,iBAAiB,CAAC,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,cAAc;IAI1E;;;;;;OAMG;IACH,QAAQ,CAAC,aAAa,EAAE,CACtB,EAAE,EAAE,WAAW,EACf,KAAK,EAAE,SAAS,KACb,aAAa,GAAG,SAAS,CAAC;IAE/B;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,OAAO,CAAC;IAEjD;;;;;;;OAOG;IACH,mBAAmB,GACjB,KAAK,WAAW,EAAE,EAClB,OAAO,SAAS,KACf,OAAO,CAAC,OAAO,CAAC,CA0CjB;IAEF;;;OAGG;IACH,cAAc,GAAU,cAAc,SAAS,KAAG,OAAO,CAAC,IAAI,CAAC,CAe7D;CACH"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import JsonBigInt from '@rosen-bridge/json-bigint';
|
|
2
|
+
import { ErgoInitializer } from '../initializers';
|
|
3
|
+
import { CallbackType, } from '../interfaces';
|
|
4
|
+
import { AbstractErgoExtractor } from './abstractErgoExtractor';
|
|
5
|
+
/**
|
|
6
|
+
* Abstract Ergo Tx Extractor class for tx-based data extraction.
|
|
7
|
+
*
|
|
8
|
+
* This class extends the AbstractErgoExtractor class and provides
|
|
9
|
+
* functionality for extracting tx-based data from the blockchain.
|
|
10
|
+
*
|
|
11
|
+
* It implements the `initializeData` method with ergo initializers.
|
|
12
|
+
* It implements the `processTransactions` method to extract and
|
|
13
|
+
* store data from transactions.
|
|
14
|
+
*
|
|
15
|
+
* Triggers `Insert` callback on new data insertion.
|
|
16
|
+
*
|
|
17
|
+
* @template ExtractedData - The type of data extracted from blockchain
|
|
18
|
+
* @template ExtractorEntity - The database entity type for storing extracted data
|
|
19
|
+
*/
|
|
20
|
+
export class AbstractErgoTxExtractor extends AbstractErgoExtractor {
|
|
21
|
+
constructor(initializeOptions, logger) {
|
|
22
|
+
super(initializeOptions, logger);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Process a list of transactions in a block and store required information.
|
|
26
|
+
* This method can be overridden by subclasses for custom transaction processing,
|
|
27
|
+
* or they can override extractTxData and hasTxData methods instead.
|
|
28
|
+
* @param txs - List of transactions in the block
|
|
29
|
+
* @param block - Block information
|
|
30
|
+
* @returns true if the process is completed successfully and false otherwise
|
|
31
|
+
*/
|
|
32
|
+
processTransactions = async (txs, block) => {
|
|
33
|
+
try {
|
|
34
|
+
const txsData = [];
|
|
35
|
+
for (const tx of txs) {
|
|
36
|
+
if (!this.hasTxData(tx)) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
this.logger.debug(`Trying to extract data from tx [${tx.id}]`);
|
|
40
|
+
const extractedData = this.extractTxData(tx, block);
|
|
41
|
+
if (extractedData) {
|
|
42
|
+
this.logger.debug(`Extracted data ${JsonBigInt.stringify(extractedData)} from tx ${tx.id}`);
|
|
43
|
+
txsData.push(extractedData);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (txsData.length > 0) {
|
|
47
|
+
if (!(await this.actions.storeEntities(txsData, block, this.getId()))) {
|
|
48
|
+
this.logger.warn(`Data insertion failed for ${this.getId()} at the block ${block.height}`);
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
this.triggerCallbacks(CallbackType.Insert, txsData);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
this.logger.error(`Processing transactions failed for ${this.getId()} at the block ${block.height} with error: ${e}`);
|
|
56
|
+
if (e instanceof Error && e.stack) {
|
|
57
|
+
this.logger.debug(`error stack: ${e.stack}`);
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* initialize extractor database with data created below the initial height
|
|
65
|
+
* @param initialBlock
|
|
66
|
+
*/
|
|
67
|
+
initializeData = async (initialBlock) => {
|
|
68
|
+
if (this.initializeOptions && this.initializeOptions.active) {
|
|
69
|
+
const initializer = new ErgoInitializer(this.initializeOptions.type, this.initializeOptions.url, this.initializeOptions.address, this.getId(), this.processTransactions, this.actions, this.initializeOptions.maxParallelRequests, this.logger.child('ErgoInitializer'));
|
|
70
|
+
await initializer.initializeData(initialBlock);
|
|
71
|
+
}
|
|
72
|
+
else
|
|
73
|
+
this.logger.info(`Initialization for [${this.getId()}] is turned off`);
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RFcmdvVHhFeHRyYWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZXJnby9leHRyYWN0b3JzL2Fic3RyYWN0RXJnb1R4RXh0cmFjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sVUFBVSxNQUFNLDJCQUEyQixDQUFDO0FBSW5ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBRUwsWUFBWSxHQUViLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWhFOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxPQUFnQix1QkFHcEIsU0FBUSxxQkFBcUQ7SUFDN0QsWUFBWSxpQkFBcUMsRUFBRSxNQUF1QjtRQUN4RSxLQUFLLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQXVCRDs7Ozs7OztPQU9HO0lBQ0gsbUJBQW1CLEdBQUcsS0FBSyxFQUN6QixHQUFrQixFQUNsQixLQUFnQixFQUNFLEVBQUU7UUFDcEIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQXlCLEVBQUUsQ0FBQztZQUN6QyxLQUFLLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO29CQUN4QixTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUNBQW1DLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUMvRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxhQUFhLEVBQUUsQ0FBQztvQkFDbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2Ysa0JBQWtCLFVBQVUsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFlBQ25ELEVBQUUsQ0FBQyxFQUNMLEVBQUUsQ0FDSCxDQUFDO29CQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQzlCLENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN0RSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDZCw2QkFBNkIsSUFBSSxDQUFDLEtBQUssRUFBRSxpQkFDdkMsS0FBSyxDQUFDLE1BQ1IsRUFBRSxDQUNILENBQUM7b0JBQ0YsT0FBTyxLQUFLLENBQUM7Z0JBQ2YsQ0FBQztnQkFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN0RCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZixzQ0FBc0MsSUFBSSxDQUFDLEtBQUssRUFBRSxpQkFDaEQsS0FBSyxDQUFDLE1BQ1IsZ0JBQWdCLENBQUMsRUFBRSxDQUNwQixDQUFDO1lBQ0YsSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQztJQUVGOzs7T0FHRztJQUNILGNBQWMsR0FBRyxLQUFLLEVBQUUsWUFBdUIsRUFBaUIsRUFBRTtRQUNoRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDNUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxlQUFlLENBQ3JDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQzNCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQzlCLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFDWixJQUFJLENBQUMsbUJBQW1CLEVBQ3hCLElBQUksQ0FBQyxPQUFPLEVBQ1osSUFBSSxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixFQUMxQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUNyQyxDQUFDO1lBQ0YsTUFBTSxXQUFXLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pELENBQUM7O1lBQ0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLElBQUksQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUMzRSxDQUFDLENBQUM7Q0FDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IEpzb25CaWdJbnQgZnJvbSAnQHJvc2VuLWJyaWRnZS9qc29uLWJpZ2ludCc7XG5pbXBvcnQgeyBCbG9ja0luZm8sIFRyYW5zYWN0aW9uIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyLWludGVyZmFjZXMnO1xuXG5pbXBvcnQgeyBBYnN0cmFjdEVyZ29FbnRpdHkgfSBmcm9tICcuLi9kYXRhYmFzZSc7XG5pbXBvcnQgeyBFcmdvSW5pdGlhbGl6ZXIgfSBmcm9tICcuLi9pbml0aWFsaXplcnMnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RFbnRpdHlEYXRhLFxuICBDYWxsYmFja1R5cGUsXG4gIEluaXRpYWxpemVPcHRpb25zLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFic3RyYWN0RXJnb0V4dHJhY3RvciB9IGZyb20gJy4vYWJzdHJhY3RFcmdvRXh0cmFjdG9yJztcblxuLyoqXG4gKiBBYnN0cmFjdCBFcmdvIFR4IEV4dHJhY3RvciBjbGFzcyBmb3IgdHgtYmFzZWQgZGF0YSBleHRyYWN0aW9uLlxuICpcbiAqIFRoaXMgY2xhc3MgZXh0ZW5kcyB0aGUgQWJzdHJhY3RFcmdvRXh0cmFjdG9yIGNsYXNzIGFuZCBwcm92aWRlc1xuICogZnVuY3Rpb25hbGl0eSBmb3IgZXh0cmFjdGluZyB0eC1iYXNlZCBkYXRhIGZyb20gdGhlIGJsb2NrY2hhaW4uXG4gKlxuICogSXQgaW1wbGVtZW50cyB0aGUgYGluaXRpYWxpemVEYXRhYCBtZXRob2Qgd2l0aCBlcmdvIGluaXRpYWxpemVycy5cbiAqIEl0IGltcGxlbWVudHMgdGhlIGBwcm9jZXNzVHJhbnNhY3Rpb25zYCBtZXRob2QgdG8gZXh0cmFjdCBhbmRcbiAqIHN0b3JlIGRhdGEgZnJvbSB0cmFuc2FjdGlvbnMuXG4gKlxuICogVHJpZ2dlcnMgYEluc2VydGAgY2FsbGJhY2sgb24gbmV3IGRhdGEgaW5zZXJ0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBFeHRyYWN0ZWREYXRhIC0gVGhlIHR5cGUgb2YgZGF0YSBleHRyYWN0ZWQgZnJvbSBibG9ja2NoYWluXG4gKiBAdGVtcGxhdGUgRXh0cmFjdG9yRW50aXR5IC0gVGhlIGRhdGFiYXNlIGVudGl0eSB0eXBlIGZvciBzdG9yaW5nIGV4dHJhY3RlZCBkYXRhXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVyZ29UeEV4dHJhY3RvcjxcbiAgRXh0cmFjdGVkRGF0YSBleHRlbmRzIEFic3RyYWN0RW50aXR5RGF0YSxcbiAgRXh0cmFjdG9yRW50aXR5IGV4dGVuZHMgQWJzdHJhY3RFcmdvRW50aXR5LFxuPiBleHRlbmRzIEFic3RyYWN0RXJnb0V4dHJhY3RvcjxFeHRyYWN0ZWREYXRhLCBFeHRyYWN0b3JFbnRpdHk+IHtcbiAgY29uc3RydWN0b3IoaW5pdGlhbGl6ZU9wdGlvbnM/OiBJbml0aWFsaXplT3B0aW9ucywgbG9nZ2VyPzogQWJzdHJhY3RMb2dnZXIpIHtcbiAgICBzdXBlcihpbml0aWFsaXplT3B0aW9ucywgbG9nZ2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IHRyYW5zYWN0aW9uIGRhdGEgdG8gcHJvcGVyIGZvcm1hdCAobm90IGluY2x1ZGluZyBzcGVuZGluZyBpbmZvcm1hdGlvbikuXG4gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdGhhdCBuZWVkIHRyYW5zYWN0aW9uLWJhc2VkIGV4dHJhY3Rpb24uXG4gICAqIEBwYXJhbSB0eCAtIFRoZSB0cmFuc2FjdGlvbiB0byBleHRyYWN0IGRhdGEgZnJvbVxuICAgKiBAcmV0dXJucyBleHRyYWN0ZWQgZGF0YSBpbiBwcm9wZXIgZm9ybWF0IG9yIHVuZGVmaW5lZCBpZiBubyBkYXRhIHNob3VsZCBiZSBleHRyYWN0ZWRcbiAgICogQHRocm93cyBFcnJvciBpZiBub3Qgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc1xuICAgKi9cbiAgYWJzdHJhY3QgZXh0cmFjdFR4RGF0YTogKFxuICAgIHR4OiBUcmFuc2FjdGlvbixcbiAgICBibG9jazogQmxvY2tJbmZvLFxuICApID0+IEV4dHJhY3RlZERhdGEgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSB0cmFuc2FjdGlvbiBoYXMgdGhlIHJlcXVpcmVkIGRhdGEgZm9ybWF0LlxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzIHRoYXQgbmVlZCB0cmFuc2FjdGlvbi1iYXNlZCBleHRyYWN0aW9uLlxuICAgKiBAcGFyYW0gdHggLSBUaGUgdHJhbnNhY3Rpb24gdG8gY2hlY2tcbiAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgdHJhbnNhY3Rpb24gaGFzIHRoZSByZXF1aXJlZCBkYXRhIGFuZCBmYWxzZSBvdGhlcndpc2VcbiAgICogQHRocm93cyBFcnJvciBpZiBub3Qgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc1xuICAgKi9cbiAgYWJzdHJhY3QgaGFzVHhEYXRhOiAodHg6IFRyYW5zYWN0aW9uKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQcm9jZXNzIGEgbGlzdCBvZiB0cmFuc2FjdGlvbnMgaW4gYSBibG9jayBhbmQgc3RvcmUgcmVxdWlyZWQgaW5mb3JtYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgZm9yIGN1c3RvbSB0cmFuc2FjdGlvbiBwcm9jZXNzaW5nLFxuICAgKiBvciB0aGV5IGNhbiBvdmVycmlkZSBleHRyYWN0VHhEYXRhIGFuZCBoYXNUeERhdGEgbWV0aG9kcyBpbnN0ZWFkLlxuICAgKiBAcGFyYW0gdHhzIC0gTGlzdCBvZiB0cmFuc2FjdGlvbnMgaW4gdGhlIGJsb2NrXG4gICAqIEBwYXJhbSBibG9jayAtIEJsb2NrIGluZm9ybWF0aW9uXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHByb2Nlc3MgaXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBhbmQgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwcm9jZXNzVHJhbnNhY3Rpb25zID0gYXN5bmMgKFxuICAgIHR4czogVHJhbnNhY3Rpb25bXSxcbiAgICBibG9jazogQmxvY2tJbmZvLFxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdHhzRGF0YTogQXJyYXk8RXh0cmFjdGVkRGF0YT4gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdHggb2YgdHhzKSB7XG4gICAgICAgIGlmICghdGhpcy5oYXNUeERhdGEodHgpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYFRyeWluZyB0byBleHRyYWN0IGRhdGEgZnJvbSB0eCBbJHt0eC5pZH1dYCk7XG4gICAgICAgIGNvbnN0IGV4dHJhY3RlZERhdGEgPSB0aGlzLmV4dHJhY3RUeERhdGEodHgsIGJsb2NrKTtcbiAgICAgICAgaWYgKGV4dHJhY3RlZERhdGEpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBFeHRyYWN0ZWQgZGF0YSAke0pzb25CaWdJbnQuc3RyaW5naWZ5KGV4dHJhY3RlZERhdGEpfSBmcm9tIHR4ICR7XG4gICAgICAgICAgICAgIHR4LmlkXG4gICAgICAgICAgICB9YCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHR4c0RhdGEucHVzaChleHRyYWN0ZWREYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodHhzRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuYWN0aW9ucy5zdG9yZUVudGl0aWVzKHR4c0RhdGEsIGJsb2NrLCB0aGlzLmdldElkKCkpKSkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICBgRGF0YSBpbnNlcnRpb24gZmFpbGVkIGZvciAke3RoaXMuZ2V0SWQoKX0gYXQgdGhlIGJsb2NrICR7XG4gICAgICAgICAgICAgIGJsb2NrLmhlaWdodFxuICAgICAgICAgICAgfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50cmlnZ2VyQ2FsbGJhY2tzKENhbGxiYWNrVHlwZS5JbnNlcnQsIHR4c0RhdGEpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICBgUHJvY2Vzc2luZyB0cmFuc2FjdGlvbnMgZmFpbGVkIGZvciAke3RoaXMuZ2V0SWQoKX0gYXQgdGhlIGJsb2NrICR7XG4gICAgICAgICAgYmxvY2suaGVpZ2h0XG4gICAgICAgIH0gd2l0aCBlcnJvcjogJHtlfWAsXG4gICAgICApO1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLnN0YWNrKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBlcnJvciBzdGFjazogJHtlLnN0YWNrfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogaW5pdGlhbGl6ZSBleHRyYWN0b3IgZGF0YWJhc2Ugd2l0aCBkYXRhIGNyZWF0ZWQgYmVsb3cgdGhlIGluaXRpYWwgaGVpZ2h0XG4gICAqIEBwYXJhbSBpbml0aWFsQmxvY2tcbiAgICovXG4gIGluaXRpYWxpemVEYXRhID0gYXN5bmMgKGluaXRpYWxCbG9jazogQmxvY2tJbmZvKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZU9wdGlvbnMgJiYgdGhpcy5pbml0aWFsaXplT3B0aW9ucy5hY3RpdmUpIHtcbiAgICAgIGNvbnN0IGluaXRpYWxpemVyID0gbmV3IEVyZ29Jbml0aWFsaXplcihcbiAgICAgICAgdGhpcy5pbml0aWFsaXplT3B0aW9ucy50eXBlLFxuICAgICAgICB0aGlzLmluaXRpYWxpemVPcHRpb25zLnVybCxcbiAgICAgICAgdGhpcy5pbml0aWFsaXplT3B0aW9ucy5hZGRyZXNzLFxuICAgICAgICB0aGlzLmdldElkKCksXG4gICAgICAgIHRoaXMucHJvY2Vzc1RyYW5zYWN0aW9ucyxcbiAgICAgICAgdGhpcy5hY3Rpb25zLFxuICAgICAgICB0aGlzLmluaXRpYWxpemVPcHRpb25zLm1heFBhcmFsbGVsUmVxdWVzdHMsXG4gICAgICAgIHRoaXMubG9nZ2VyLmNoaWxkKCdFcmdvSW5pdGlhbGl6ZXInKSxcbiAgICAgICk7XG4gICAgICBhd2FpdCBpbml0aWFsaXplci5pbml0aWFsaXplRGF0YShpbml0aWFsQmxvY2spO1xuICAgIH0gZWxzZVxuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgSW5pdGlhbGl6YXRpb24gZm9yIFske3RoaXMuZ2V0SWQoKX1dIGlzIHR1cm5lZCBvZmZgKTtcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/ergo/extractors/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from './abstractErgoExtractor';
|
|
2
|
+
export * from './abstractErgoBoxExtractor';
|
|
3
|
+
export * from './abstractErgoTxExtractor';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvZXJnby9leHRyYWN0b3JzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDJCQUEyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hYnN0cmFjdEVyZ29FeHRyYWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9hYnN0cmFjdEVyZ29Cb3hFeHRyYWN0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9hYnN0cmFjdEVyZ29UeEV4dHJhY3Rvcic7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/ergo/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './extractors';
|
|
2
|
+
export * from './initializers';
|
|
3
|
+
export * from './database';
|
|
4
|
+
export * from './interfaces';
|
|
5
|
+
export * from './networks';
|
|
6
|
+
export * from './initializers';
|
|
7
|
+
export * from './utils';
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZXJnby9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2V4dHJhY3RvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbml0aWFsaXplcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9kYXRhYmFzZSc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9uZXR3b3Jrcyc7XG5leHBvcnQgKiBmcm9tICcuL2luaXRpYWxpemVycyc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxzJztcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../lib/ergo/initializers/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAC/C,eAAO,MAAM,8BAA8B,OAAO,CAAC;AACnD,eAAO,MAAM,qBAAqB,KAAK,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export const DELAY_BETWEEN_INIT_REQUESTS = 100; // In milliseconds (only applies to node initialization)
|
|
2
|
+
export const INIT_WORKERS_REASSIGN_INTERVAL = 5000; //milliseconds (only applies to explorer initialization)
|
|
3
|
+
export const MAX_PARALLEL_REQUESTS = 10;
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2VyZ28vaW5pdGlhbGl6ZXJzL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxHQUFHLENBQUMsQ0FBQyx3REFBd0Q7QUFDeEcsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsSUFBSSxDQUFDLENBQUMsd0RBQXdEO0FBQzVHLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBERUxBWV9CRVRXRUVOX0lOSVRfUkVRVUVTVFMgPSAxMDA7IC8vIEluIG1pbGxpc2Vjb25kcyAob25seSBhcHBsaWVzIHRvIG5vZGUgaW5pdGlhbGl6YXRpb24pXG5leHBvcnQgY29uc3QgSU5JVF9XT1JLRVJTX1JFQVNTSUdOX0lOVEVSVkFMID0gNTAwMDsgLy9taWxsaXNlY29uZHMgKG9ubHkgYXBwbGllcyB0byBleHBsb3JlciBpbml0aWFsaXphdGlvbilcbmV4cG9ydCBjb25zdCBNQVhfUEFSQUxMRUxfUkVRVUVTVFMgPSAxMDtcbiJdfQ==
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { AbstractLogger } from '@rosen-bridge/abstract-logger';
|
|
2
|
+
import { BlockInfo, ErgoNetworkType, OutputBox, Transaction } from '@rosen-bridge/scanner-interfaces';
|
|
3
|
+
import { AbstractErgoBoxAction, AbstractErgoEntity } from '../database';
|
|
4
|
+
import { AbstractEntityData, ExtendedSpendInfo, ExtendedTransaction } from '../interfaces';
|
|
5
|
+
import { ErgoInitializer } from './ergoInitializer';
|
|
6
|
+
export declare class ErgoBoxInitializer<ExtractedData extends AbstractEntityData, ExtractorEntity extends AbstractErgoEntity> extends ErgoInitializer<ExtractedData, ExtractorEntity> {
|
|
7
|
+
protected extractorId: string;
|
|
8
|
+
protected hasBoxData: (box: OutputBox) => boolean;
|
|
9
|
+
protected processTransactions: (txs: Transaction[], block: BlockInfo) => Promise<boolean>;
|
|
10
|
+
protected actions: AbstractErgoBoxAction<ExtractedData, ExtractorEntity>;
|
|
11
|
+
protected logger: AbstractLogger;
|
|
12
|
+
private spendRecordsMutex;
|
|
13
|
+
private spendRecords;
|
|
14
|
+
constructor(networkType: ErgoNetworkType, url: string, address: string, extractorId: string, hasBoxData: (box: OutputBox) => boolean, processTransactions: (txs: Transaction[], block: BlockInfo) => Promise<boolean>, actions: AbstractErgoBoxAction<ExtractedData, ExtractorEntity>, maxParallelRequests?: number, logger?: AbstractLogger);
|
|
15
|
+
/**
|
|
16
|
+
* Extracts spending information of all related boxes in the transaction
|
|
17
|
+
* Note: override this function if the extractor needs extra spending info
|
|
18
|
+
* @param tx
|
|
19
|
+
* @returns transaction spend info
|
|
20
|
+
*/
|
|
21
|
+
protected extractTxSpendInfo: (tx: ExtendedTransaction) => ExtendedSpendInfo[];
|
|
22
|
+
/**
|
|
23
|
+
* Extract and store all spending information of a transaction batch
|
|
24
|
+
* @param txs
|
|
25
|
+
*/
|
|
26
|
+
protected storeExtraInfo: (txs: ExtendedTransaction[]) => Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Apply stored spend records into extractor database
|
|
29
|
+
* Note: As transactions are processed out of order (due to parallel
|
|
30
|
+
* processing), some box spend information may be invalid after the first pass
|
|
31
|
+
* To avoid processing everything twice, we keep all spend records in the
|
|
32
|
+
* first pass and reapply them at the end
|
|
33
|
+
*/
|
|
34
|
+
protected applyExtraInfo: () => Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=ergoBoxInitializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ergoBoxInitializer.d.ts","sourceRoot":"","sources":["../../../lib/ergo/initializers/ergoBoxInitializer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EACL,SAAS,EACT,eAAe,EACf,SAAS,EACT,WAAW,EACZ,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,qBAAa,kBAAkB,CAC7B,aAAa,SAAS,kBAAkB,EACxC,eAAe,SAAS,kBAAkB,CAC1C,SAAQ,eAAe,CAAC,aAAa,EAAE,eAAe,CAAC;IAQrD,SAAS,CAAC,WAAW,EAAE,MAAM;IAC7B,SAAS,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,OAAO;IACjD,SAAS,CAAC,mBAAmB,EAAE,CAC7B,GAAG,EAAE,WAAW,EAAE,EAClB,KAAK,EAAE,SAAS,KACb,OAAO,CAAC,OAAO,CAAC;IACrB,SAAS,CAAC,OAAO,EAAE,qBAAqB,CAAC,aAAa,EAAE,eAAe,CAAC;IAExE,SAAS,CAAC,MAAM,EAAE,cAAc;IAflC,OAAO,CAAC,iBAAiB,CAAe;IACxC,OAAO,CAAC,YAAY,CAAsB;gBAGxC,WAAW,EAAE,eAAe,EAC5B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACL,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,CAAC,GAAG,EAAE,SAAS,KAAK,OAAO,EACvC,mBAAmB,EAAE,CAC7B,GAAG,EAAE,WAAW,EAAE,EAClB,KAAK,EAAE,SAAS,KACb,OAAO,CAAC,OAAO,CAAC,EACX,OAAO,EAAE,qBAAqB,CAAC,aAAa,EAAE,eAAe,CAAC,EACxE,mBAAmB,SAAwB,EACjC,MAAM,GAAE,cAAkC;IAetD;;;;;OAKG;IACH,SAAS,CAAC,kBAAkB,GAC1B,IAAI,mBAAmB,KACtB,iBAAiB,EAAE,CAepB;IAEF;;;OAGG;IACH,SAAS,CAAC,cAAc,GACtB,KAAK,mBAAmB,EAAE,KACzB,OAAO,CAAC,IAAI,CAAC,CASd;IAEF;;;;;;OAMG;IACH,SAAS,CAAC,cAAc,sBAuBtB;CACH"}
|