@rosen-bridge/abstract-extractor 2.0.1 → 2.0.3-52fc0239
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 +14 -0
- package/dist/ergo/AbstractErgoExtractor.d.ts.map +1 -1
- package/dist/ergo/AbstractErgoExtractor.js +3 -2
- package/dist/ergo/AbstractErgoExtractorAction.d.ts +1 -1
- package/dist/ergo/AbstractErgoExtractorAction.d.ts.map +1 -1
- package/dist/ergo/AbstractErgoExtractorAction.js +23 -9
- package/dist/ergo/AbstractErgoExtractorEntity.js +2 -2
- package/dist/ergo/initializable/AbstractInitializableAction.d.ts +1 -1
- package/dist/ergo/initializable/AbstractInitializableAction.d.ts.map +1 -1
- package/dist/ergo/initializable/AbstractInitializableAction.js +4 -2
- package/dist/lib/abstractExtractor.d.ts +25 -0
- package/dist/lib/abstractExtractor.d.ts.map +1 -0
- package/dist/lib/abstractExtractor.js +3 -0
- package/dist/lib/constants.d.ts +4 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +4 -0
- package/dist/lib/ergo/AbstractErgoExtractor.d.ts +80 -0
- package/dist/lib/ergo/AbstractErgoExtractor.d.ts.map +1 -0
- package/dist/lib/ergo/AbstractErgoExtractor.js +143 -0
- package/dist/lib/ergo/AbstractErgoExtractorAction.d.ts +87 -0
- package/dist/lib/ergo/AbstractErgoExtractorAction.d.ts.map +1 -0
- package/dist/lib/ergo/AbstractErgoExtractorAction.js +222 -0
- package/dist/lib/ergo/AbstractErgoExtractorEntity.d.ts +11 -0
- package/dist/lib/ergo/AbstractErgoExtractorEntity.d.ts.map +1 -0
- package/dist/lib/ergo/AbstractErgoExtractorEntity.js +57 -0
- package/dist/lib/ergo/index.d.ts +10 -0
- package/dist/lib/ergo/index.d.ts.map +1 -0
- package/dist/lib/ergo/index.js +10 -0
- package/dist/lib/ergo/initializable/AbstractInitializable.d.ts +48 -0
- package/dist/lib/ergo/initializable/AbstractInitializable.d.ts.map +1 -0
- package/dist/lib/ergo/initializable/AbstractInitializable.js +163 -0
- package/dist/lib/ergo/initializable/AbstractInitializableAction.d.ts +14 -0
- package/dist/lib/ergo/initializable/AbstractInitializableAction.d.ts.map +1 -0
- package/dist/lib/ergo/initializable/AbstractInitializableAction.js +16 -0
- package/dist/lib/ergo/initializable/index.d.ts +3 -0
- package/dist/lib/ergo/initializable/index.d.ts.map +1 -0
- package/dist/lib/ergo/initializable/index.js +3 -0
- package/dist/lib/ergo/interfaces.d.ts +47 -0
- package/dist/lib/ergo/interfaces.d.ts.map +1 -0
- package/dist/lib/ergo/interfaces.js +8 -0
- package/dist/lib/ergo/network/AbstractNetwork.d.ts +26 -0
- package/dist/lib/ergo/network/AbstractNetwork.d.ts.map +1 -0
- package/dist/lib/ergo/network/AbstractNetwork.js +3 -0
- package/dist/lib/ergo/network/ExplorerNetwork.d.ts +74 -0
- package/dist/lib/ergo/network/ExplorerNetwork.d.ts.map +1 -0
- package/dist/lib/ergo/network/ExplorerNetwork.js +185 -0
- package/dist/lib/ergo/network/NodeNetwork.d.ts +60 -0
- package/dist/lib/ergo/network/NodeNetwork.d.ts.map +1 -0
- package/dist/lib/ergo/network/NodeNetwork.js +131 -0
- package/dist/lib/ergo/utils.d.ts +8 -0
- package/dist/lib/ergo/utils.d.ts.map +1 -0
- package/dist/lib/ergo/utils.js +16 -0
- package/dist/lib/index.d.ts +4 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +4 -0
- package/dist/tests/AbstractErgoExtractor.mock.d.ts +11 -0
- package/dist/tests/AbstractErgoExtractor.mock.d.ts.map +1 -0
- package/dist/tests/AbstractErgoExtractor.mock.js +13 -0
- package/dist/tests/AbstractErgoExtractor.spec.d.ts +2 -0
- package/dist/tests/AbstractErgoExtractor.spec.d.ts.map +1 -0
- package/dist/tests/AbstractErgoExtractor.spec.js +241 -0
- package/dist/tests/AbstractErgoExtractorAction.mock.d.ts +15 -0
- package/dist/tests/AbstractErgoExtractorAction.mock.d.ts.map +1 -0
- package/dist/tests/AbstractErgoExtractorAction.mock.js +27 -0
- package/dist/tests/AbstractErgoExtractorAction.spec.d.ts +2 -0
- package/dist/tests/AbstractErgoExtractorAction.spec.d.ts.map +1 -0
- package/dist/tests/AbstractErgoExtractorAction.spec.js +222 -0
- package/dist/tests/initializable/AbstractInitializable.mock.d.ts +60 -0
- package/dist/tests/initializable/AbstractInitializable.mock.d.ts.map +1 -0
- package/dist/tests/initializable/AbstractInitializable.mock.js +22 -0
- package/dist/tests/initializable/AbstractInitializable.spec.d.ts +2 -0
- package/dist/tests/initializable/AbstractInitializable.spec.d.ts.map +1 -0
- package/dist/tests/initializable/AbstractInitializable.spec.js +300 -0
- package/dist/tests/initializable/AbstractInitializableAction.mock.d.ts +15 -0
- package/dist/tests/initializable/AbstractInitializableAction.mock.d.ts.map +1 -0
- package/dist/tests/initializable/AbstractInitializableAction.mock.js +27 -0
- package/dist/tests/initializable/AbstractInitializableAction.spec.d.ts +2 -0
- package/dist/tests/initializable/AbstractInitializableAction.spec.d.ts.map +1 -0
- package/dist/tests/initializable/AbstractInitializableAction.spec.js +55 -0
- package/dist/tests/initializable/testData.d.ts +94 -0
- package/dist/tests/initializable/testData.d.ts.map +1 -0
- package/dist/tests/initializable/testData.js +235 -0
- package/dist/tests/network/ExplorerNetwork.spec.d.ts +2 -0
- package/dist/tests/network/ExplorerNetwork.spec.d.ts.map +1 -0
- package/dist/tests/network/ExplorerNetwork.spec.js +62 -0
- package/dist/tests/network/NodeNetwork.spec.d.ts +2 -0
- package/dist/tests/network/NodeNetwork.spec.d.ts.map +1 -0
- package/dist/tests/network/NodeNetwork.spec.js +49 -0
- package/dist/tests/network/testData.d.ts +752 -0
- package/dist/tests/network/testData.d.ts.map +1 -0
- package/dist/tests/network/testData.js +1401 -0
- package/dist/tests/testData.d.ts +32 -0
- package/dist/tests/testData.d.ts.map +1 -0
- package/dist/tests/testData.js +121 -0
- package/dist/tests/testUtils.d.ts +9 -0
- package/dist/tests/testUtils.d.ts.map +1 -0
- package/dist/tests/testUtils.js +31 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +17 -0
- package/lib/ergo/AbstractErgoExtractor.ts +3 -1
- package/lib/ergo/AbstractErgoExtractorAction.ts +47 -36
- package/lib/ergo/AbstractErgoExtractorEntity.ts +1 -1
- package/lib/ergo/initializable/AbstractInitializableAction.ts +4 -2
- package/package.json +9 -14
- package/tests/AbstractErgoExtractor.mock.ts +4 -2
- package/tests/AbstractErgoExtractorAction.mock.ts +1 -1
- package/tests/AbstractErgoExtractorAction.spec.ts +1 -1
- package/tests/initializable/AbstractInitializable.mock.ts +13 -4
- package/tests/initializable/AbstractInitializable.spec.ts +1 -9
- package/tests/initializable/AbstractInitializableAction.mock.ts +1 -1
- package/tests/initializable/AbstractInitializableAction.spec.ts +1 -1
- package/tests/testUtils.ts +1 -1
- package/tsconfig.build.tsbuildinfo +1 -1
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { AbstractLogger } from '@rosen-bridge/abstract-logger';
|
|
2
|
+
import { BlockInfo, ErgoNetworkType } from '@rosen-bridge/scanner-interfaces';
|
|
3
|
+
import { AbstractBoxData } from '../interfaces';
|
|
4
|
+
import { AbstractErgoExtractor } from '../AbstractErgoExtractor';
|
|
5
|
+
import { AbstractInitializableErgoExtractorAction } from './AbstractInitializableAction';
|
|
6
|
+
import { AbstractErgoExtractorEntity } from '../AbstractErgoExtractorEntity';
|
|
7
|
+
export declare abstract class AbstractInitializableErgoExtractor<ExtractedData extends AbstractBoxData, ExtractorEntity extends AbstractErgoExtractorEntity> extends AbstractErgoExtractor<ExtractedData, ExtractorEntity> {
|
|
8
|
+
protected initialize: boolean;
|
|
9
|
+
private address;
|
|
10
|
+
protected abstract actions: AbstractInitializableErgoExtractorAction<ExtractedData, ExtractorEntity>;
|
|
11
|
+
private network;
|
|
12
|
+
constructor(type: ErgoNetworkType, url: string, address: string, logger?: AbstractLogger, initialize?: boolean);
|
|
13
|
+
/**
|
|
14
|
+
* Initialize extractor using Explorer network
|
|
15
|
+
* @param initialBlock
|
|
16
|
+
*/
|
|
17
|
+
private initializeWithExplorer;
|
|
18
|
+
/**
|
|
19
|
+
* Get the total tx count from Node network
|
|
20
|
+
* @returns total tx count of the address
|
|
21
|
+
*/
|
|
22
|
+
private getTotalTxCount;
|
|
23
|
+
/**
|
|
24
|
+
* Initialize extractor using Node network
|
|
25
|
+
* @param initialBlock
|
|
26
|
+
*/
|
|
27
|
+
private initializeWithNode;
|
|
28
|
+
/**
|
|
29
|
+
* Process a batch of transactions
|
|
30
|
+
* group txs into blocks and process them using `processTransactions`
|
|
31
|
+
* @param txs
|
|
32
|
+
*/
|
|
33
|
+
private processTransactionBatch;
|
|
34
|
+
/**
|
|
35
|
+
* Initialize the extractor with retrial on any unexpected problem
|
|
36
|
+
* its the common part of initialize with Node and Explorer network
|
|
37
|
+
* @param job
|
|
38
|
+
*/
|
|
39
|
+
private initWithRetrial;
|
|
40
|
+
/**
|
|
41
|
+
* initialize extractor database with data created below the initial height
|
|
42
|
+
* ignore initialization if this feature is off
|
|
43
|
+
* try to get data multiple times to pass accidental network problems
|
|
44
|
+
* @param initialBlock
|
|
45
|
+
*/
|
|
46
|
+
initializeBoxes: (initialBlock: BlockInfo) => Promise<void>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=AbstractInitializable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractInitializable.d.ts","sourceRoot":"","sources":["../../../../lib/ergo/initializable/AbstractInitializable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAE9E,OAAO,EAAE,eAAe,EAAuB,MAAM,eAAe,CAAC;AAErE,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wCAAwC,EAAE,MAAM,+BAA+B,CAAC;AAGzF,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAE7E,8BAAsB,kCAAkC,CACtD,aAAa,SAAS,eAAe,EACrC,eAAe,SAAS,2BAA2B,CACnD,SAAQ,qBAAqB,CAAC,aAAa,EAAE,eAAe,CAAC;IAC7D,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,wCAAwC,CAClE,aAAa,EACb,eAAe,CAChB,CAAC;IAEF,OAAO,CAAC,OAAO,CAAgC;gBAG7C,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,cAAc,EACvB,UAAU,UAAO;IAkBnB;;;OAGG;IACH,OAAO,CAAC,sBAAsB,CA6C5B;IAEF;;;OAGG;IACH,OAAO,CAAC,eAAe,CAKrB;IAEF;;;OAGG;IACH,OAAO,CAAC,kBAAkB,CAuCxB;IAEF;;;;OAIG;IACH,OAAO,CAAC,uBAAuB,CAoB7B;IAEF;;;;OAIG;IACH,OAAO,CAAC,eAAe,CA+BrB;IAEF;;;;;OAKG;IACH,eAAe,EAAE,CAAC,YAAY,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { groupBy, sortBy } from 'lodash-es';
|
|
2
|
+
import { ErgoNetworkType } from '@rosen-bridge/scanner-interfaces';
|
|
3
|
+
import { API_LIMIT, RETRIAL_COUNT } from '../../constants';
|
|
4
|
+
import { AbstractErgoExtractor } from '../AbstractErgoExtractor';
|
|
5
|
+
import { ExplorerNetwork } from '../network/ExplorerNetwork';
|
|
6
|
+
import { NodeNetwork } from '../network/NodeNetwork';
|
|
7
|
+
export class AbstractInitializableErgoExtractor extends AbstractErgoExtractor {
|
|
8
|
+
initialize;
|
|
9
|
+
address;
|
|
10
|
+
network;
|
|
11
|
+
constructor(type, url, address, logger, initialize = true) {
|
|
12
|
+
super(logger);
|
|
13
|
+
this.address = address;
|
|
14
|
+
this.initialize = initialize;
|
|
15
|
+
if (type == ErgoNetworkType.Explorer) {
|
|
16
|
+
this.network = new ExplorerNetwork(url);
|
|
17
|
+
this.initializeBoxes = (initialBlock) => {
|
|
18
|
+
return this.initializeWithExplorer(initialBlock);
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
else if (type == ErgoNetworkType.Node) {
|
|
22
|
+
this.network = new NodeNetwork(url);
|
|
23
|
+
this.initializeBoxes = (initialBlock) => {
|
|
24
|
+
return this.initializeWithNode(initialBlock);
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
else
|
|
28
|
+
throw new Error(`Network type ${type} is not supported`);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Initialize extractor using Explorer network
|
|
32
|
+
* @param initialBlock
|
|
33
|
+
*/
|
|
34
|
+
initializeWithExplorer = async (initialBlock) => {
|
|
35
|
+
const explorerNetwork = this.network;
|
|
36
|
+
let fromHeight = 0, toHeight = initialBlock.height;
|
|
37
|
+
await this.initWithRetrial(async () => {
|
|
38
|
+
while (fromHeight < toHeight) {
|
|
39
|
+
let txs;
|
|
40
|
+
// eslint-disable-next-line no-constant-condition
|
|
41
|
+
while (true) {
|
|
42
|
+
txs = await explorerNetwork.getAddressTransactionsWithHeight(this.address, fromHeight, toHeight);
|
|
43
|
+
this.logger.debug(`Found ${txs.length} transactions for the address from height ${fromHeight} to height ${toHeight}`);
|
|
44
|
+
if (txs.length < API_LIMIT || fromHeight === toHeight) {
|
|
45
|
+
break; // Exit loop if we have fewer transactions than the limit or if the range is reduced to a single height
|
|
46
|
+
}
|
|
47
|
+
toHeight = Math.floor((toHeight - fromHeight) / 2) + fromHeight;
|
|
48
|
+
this.logger.debug(`Limiting the query height range to [${fromHeight}, ${toHeight}]`);
|
|
49
|
+
}
|
|
50
|
+
if (txs.length < API_LIMIT) {
|
|
51
|
+
if (txs.length > 0)
|
|
52
|
+
await this.processTransactionBatch(txs);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
this.logger.debug(`Block at height ${fromHeight} has more than (or equal) ${API_LIMIT} relevant txs, processing all txs in the block`);
|
|
56
|
+
const blockId = await explorerNetwork.getBlockIdAtHeight(fromHeight);
|
|
57
|
+
const blockTxs = await explorerNetwork.getBlockTxs(blockId);
|
|
58
|
+
this.logger.debug(`Found ${blockTxs.length} transactions at height ${fromHeight}`);
|
|
59
|
+
await this.processTransactions(blockTxs, {
|
|
60
|
+
hash: blockId,
|
|
61
|
+
height: fromHeight,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
fromHeight = toHeight + 1;
|
|
65
|
+
toHeight = initialBlock.height;
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Get the total tx count from Node network
|
|
71
|
+
* @returns total tx count of the address
|
|
72
|
+
*/
|
|
73
|
+
getTotalTxCount = async () => {
|
|
74
|
+
const response = await this.network.getAddressTransactionsWithOffsetLimit(this.address, 0, 0);
|
|
75
|
+
return response.total;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Initialize extractor using Node network
|
|
79
|
+
* @param initialBlock
|
|
80
|
+
*/
|
|
81
|
+
initializeWithNode = async (initialBlock) => {
|
|
82
|
+
const txCountBeforeInit = await this.getTotalTxCount();
|
|
83
|
+
let offset = 0, total = 1, round = 1;
|
|
84
|
+
await this.initWithRetrial(async () => {
|
|
85
|
+
// Repeat the whole process twice to cover all spent boxes
|
|
86
|
+
// After round 1 all boxes have been saved and processed once
|
|
87
|
+
// After round 2 spending information of all stored boxes are updated successfully
|
|
88
|
+
while (round <= 2) {
|
|
89
|
+
this.logger.debug(`Starting round ${round} of initialization`);
|
|
90
|
+
while (offset < total) {
|
|
91
|
+
const response = await this.network.getAddressTransactionsWithOffsetLimit(this.address, offset, API_LIMIT);
|
|
92
|
+
total = response.total;
|
|
93
|
+
const txs = response.items.filter((tx) => tx.inclusionHeight <= initialBlock.height);
|
|
94
|
+
this.logger.debug(`Found ${txs.length} transactions below the initial height with offset ${offset} and total number of transactions ${total}`);
|
|
95
|
+
if (txs.length > 0)
|
|
96
|
+
await this.processTransactionBatch(txs);
|
|
97
|
+
offset += API_LIMIT;
|
|
98
|
+
}
|
|
99
|
+
round++;
|
|
100
|
+
offset = 0; // next round initial offset
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
const txCountAfterInit = await this.getTotalTxCount();
|
|
104
|
+
if (txCountAfterInit != txCountBeforeInit) {
|
|
105
|
+
throw Error('Total transaction count changed during initialization phase, the stored data is not valid');
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
/**
|
|
109
|
+
* Process a batch of transactions
|
|
110
|
+
* group txs into blocks and process them using `processTransactions`
|
|
111
|
+
* @param txs
|
|
112
|
+
*/
|
|
113
|
+
processTransactionBatch = async (txs) => {
|
|
114
|
+
txs = sortBy(txs, (tx) => tx.inclusionHeight);
|
|
115
|
+
const groupedTxs = groupBy(txs, (tx) => tx.blockId);
|
|
116
|
+
this.logger.debug(`The transaction batch grouped to ${Object.keys(groupedTxs).length} blocks`);
|
|
117
|
+
for (const blockId in groupedTxs) {
|
|
118
|
+
const blockTxs = groupedTxs[blockId];
|
|
119
|
+
const block = { hash: blockId, height: blockTxs[0].inclusionHeight };
|
|
120
|
+
this.logger.debug(`Processing transactions at height ${blockTxs[0].inclusionHeight}`);
|
|
121
|
+
const success = await this.processTransactions(blockTxs, block);
|
|
122
|
+
if (!success)
|
|
123
|
+
throw Error(`Processing transactions failed at height ${blockTxs[0].inclusionHeight}`);
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* Initialize the extractor with retrial on any unexpected problem
|
|
128
|
+
* its the common part of initialize with Node and Explorer network
|
|
129
|
+
* @param job
|
|
130
|
+
*/
|
|
131
|
+
initWithRetrial = async (job) => {
|
|
132
|
+
let trial = 1;
|
|
133
|
+
if (this.initialize) {
|
|
134
|
+
this.logger.debug(`Initializing ${this.getId()} started, removing all existing data`);
|
|
135
|
+
await this.actions.removeAllData(this.getId());
|
|
136
|
+
while (trial <= RETRIAL_COUNT) {
|
|
137
|
+
try {
|
|
138
|
+
await job();
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
catch (e) {
|
|
142
|
+
this.logger.warn(`Initialization for ${this.getId()} failed with error :${e}`);
|
|
143
|
+
if (trial == RETRIAL_COUNT)
|
|
144
|
+
throw Error(`Initialization for ${this.getId()} failed after ${RETRIAL_COUNT} retrial`);
|
|
145
|
+
trial += 1;
|
|
146
|
+
this.logger.info(`Trying again to initialize ${this.getId()} with trial step ${trial}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
this.logger.info(`Initialization completed successfully for ${this.getId()}`);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
this.logger.info(`Initialization for ${this.getId()} is turned off`);
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
/**
|
|
156
|
+
* initialize extractor database with data created below the initial height
|
|
157
|
+
* ignore initialization if this feature is off
|
|
158
|
+
* try to get data multiple times to pass accidental network problems
|
|
159
|
+
* @param initialBlock
|
|
160
|
+
*/
|
|
161
|
+
initializeBoxes;
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RJbml0aWFsaXphYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2VyZ28vaW5pdGlhbGl6YWJsZS9BYnN0cmFjdEluaXRpYWxpemFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDNUMsT0FBTyxFQUFhLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRzlFLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFakUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUdyRCxNQUFNLE9BQWdCLGtDQUdwQixTQUFRLHFCQUFxRDtJQUNuRCxVQUFVLENBQVU7SUFDdEIsT0FBTyxDQUFTO0lBTWhCLE9BQU8sQ0FBZ0M7SUFFL0MsWUFDRSxJQUFxQixFQUNyQixHQUFXLEVBQ1gsT0FBZSxFQUNmLE1BQXVCLEVBQ3ZCLFVBQVUsR0FBRyxJQUFJO1FBRWpCLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksSUFBSSxJQUFJLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxZQUF1QixFQUFFLEVBQUU7Z0JBQ2pELE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ25ELENB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LE1BQU0sQ0FBQyxJQUFJLENBQ2QsOEJBQThCLElBQUksQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLEtBQUssRUFBRSxDQUN0RSxDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ2QsNkNBQTZDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUM1RCxDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRjs7Ozs7T0FLRztJQUNILGVBQWUsQ0FBNkM7Q0FDN0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBYnN0cmFjdExvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcbmltcG9ydCB7IGdyb3VwQnksIHNvcnRCeSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBCbG9ja0luZm8sIEVyZ29OZXR3b3JrVHlwZSB9IGZyb20gJ0Byb3Nlbi1icmlkZ2Uvc2Nhbm5lci1pbnRlcmZhY2VzJztcblxuaW1wb3J0IHsgQWJzdHJhY3RCb3hEYXRhLCBFeHRlbmRlZFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBUElfTElNSVQsIFJFVFJJQUxfQ09VTlQgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQWJzdHJhY3RFcmdvRXh0cmFjdG9yIH0gZnJvbSAnLi4vQWJzdHJhY3RFcmdvRXh0cmFjdG9yJztcbmltcG9ydCB7IEFic3RyYWN0SW5pdGlhbGl6YWJsZUVyZ29FeHRyYWN0b3JBY3Rpb24gfSBmcm9tICcuL0Fic3RyYWN0SW5pdGlhbGl6YWJsZUFjdGlvbic7XG5pbXBvcnQgeyBFeHBsb3Jlck5ldHdvcmsgfSBmcm9tICcuLi9uZXR3b3JrL0V4cGxvcmVyTmV0d29yayc7XG5pbXBvcnQgeyBOb2RlTmV0d29yayB9IGZyb20gJy4uL25ldHdvcmsvTm9kZU5ldHdvcmsnO1xuaW1wb3J0IHsgQWJzdHJhY3RFcmdvRXh0cmFjdG9yRW50aXR5IH0gZnJvbSAnLi4vQWJzdHJhY3RFcmdvRXh0cmFjdG9yRW50aXR5JztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SW5pdGlhbGl6YWJsZUVyZ29FeHRyYWN0b3I8XG4gIEV4dHJhY3RlZERhdGEgZXh0ZW5kcyBBYnN0cmFjdEJveERhdGEsXG4gIEV4dHJhY3RvckVudGl0eSBleHRlbmRzIEFic3RyYWN0RXJnb0V4dHJhY3RvckVudGl0eVxuPiBleHRlbmRzIEFic3RyYWN0RXJnb0V4dHJhY3RvcjxFeHRyYWN0ZWREYXRhLCBFeHRyYWN0b3JFbnRpdHk+IHtcbiAgcHJvdGVjdGVkIGluaXRpYWxpemU6IGJvb2xlYW47XG4gIHByaXZhdGUgYWRkcmVzczogc3RyaW5nO1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYWN0aW9uczogQWJzdHJhY3RJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvckFjdGlvbjxcbiAgICBFeHRyYWN0ZWREYXRhLFxuICAgIEV4dHJhY3RvckVudGl0eVxuICA+O1xuXG4gIHByaXZhdGUgbmV0d29yazogRXhwbG9yZXJOZXR3b3JrIHwgTm9kZU5ldHdvcms7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgdHlwZTogRXJnb05ldHdvcmtUeXBlLFxuICAgIHVybDogc3RyaW5nLFxuICAgIGFkZHJlc3M6IHN0cmluZyxcbiAgICBsb2dnZXI/OiBBYnN0cmFjdExvZ2dlcixcbiAgICBpbml0aWFsaXplID0gdHJ1ZVxuICApIHtcbiAgICBzdXBlcihsb2dnZXIpO1xuICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7XG4gICAgdGhpcy5pbml0aWFsaXplID0gaW5pdGlhbGl6ZTtcbiAgICBpZiAodHlwZSA9PSBFcmdvTmV0d29ya1R5cGUuRXhwbG9yZXIpIHtcbiAgICAgIHRoaXMubmV0d29yayA9IG5ldyBFeHBsb3Jlck5ldHdvcmsodXJsKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUJveGVzID0gKGluaXRpYWxCbG9jazogQmxvY2tJbmZvKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxpemVXaXRoRXhwbG9yZXIoaW5pdGlhbEJsb2NrKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICh0eXBlID09IEVyZ29OZXR3b3JrVHlwZS5Ob2RlKSB7XG4gICAgICB0aGlzLm5ldHdvcmsgPSBuZXcgTm9kZU5ldHdvcmsodXJsKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUJveGVzID0gKGluaXRpYWxCbG9jazogQmxvY2tJbmZvKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxpemVXaXRoTm9kZShpbml0aWFsQmxvY2spO1xuICAgICAgfTtcbiAgICB9IGVsc2UgdGhyb3cgbmV3IEVycm9yKGBOZXR3b3JrIHR5cGUgJHt0eXBlfSBpcyBub3Qgc3VwcG9ydGVkYCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBleHRyYWN0b3IgdXNpbmcgRXhwbG9yZXIgbmV0d29ya1xuICAgKiBAcGFyYW0gaW5pdGlhbEJsb2NrXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpemVXaXRoRXhwbG9yZXIgPSBhc3luYyAoaW5pdGlhbEJsb2NrOiBCbG9ja0luZm8pID0+IHtcbiAgICBjb25zdCBleHBsb3Jlck5ldHdvcmsgPSB0aGlzLm5ldHdvcmsgYXMgRXhwbG9yZXJOZXR3b3JrO1xuICAgIGxldCBmcm9tSGVpZ2h0ID0gMCxcbiAgICAgIHRvSGVpZ2h0ID0gaW5pdGlhbEJsb2NrLmhlaWdodDtcbiAgICBhd2FpdCB0aGlzLmluaXRXaXRoUmV0cmlhbChhc3luYyAoKSA9PiB7XG4gICAgICB3aGlsZSAoZnJvbUhlaWdodCA8IHRvSGVpZ2h0KSB7XG4gICAgICAgIGxldCB0eHM6IEFycmF5PEV4dGVuZGVkVHJhbnNhY3Rpb24+O1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc3RhbnQtY29uZGl0aW9uXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgdHhzID0gYXdhaXQgZXhwbG9yZXJOZXR3b3JrLmdldEFkZHJlc3NUcmFuc2FjdGlvbnNXaXRoSGVpZ2h0KFxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzLFxuICAgICAgICAgICAgZnJvbUhlaWdodCxcbiAgICAgICAgICAgIHRvSGVpZ2h0XG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBGb3VuZCAke3R4cy5sZW5ndGh9IHRyYW5zYWN0aW9ucyBmb3IgdGhlIGFkZHJlc3MgZnJvbSBoZWlnaHQgJHtmcm9tSGVpZ2h0fSB0byBoZWlnaHQgJHt0b0hlaWdodH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodHhzLmxlbmd0aCA8IEFQSV9MSU1JVCB8fCBmcm9tSGVpZ2h0ID09PSB0b0hlaWdodCkge1xuICAgICAgICAgICAgYnJlYWs7IC8vIEV4aXQgbG9vcCBpZiB3ZSBoYXZlIGZld2VyIHRyYW5zYWN0aW9ucyB0aGFuIHRoZSBsaW1pdCBvciBpZiB0aGUgcmFuZ2UgaXMgcmVkdWNlZCB0byBhIHNpbmdsZSBoZWlnaHRcbiAgICAgICAgICB9XG4gICAgICAgICAgdG9IZWlnaHQgPSBNYXRoLmZsb29yKCh0b0hlaWdodCAtIGZyb21IZWlnaHQpIC8gMikgKyBmcm9tSGVpZ2h0O1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYExpbWl0aW5nIHRoZSBxdWVyeSBoZWlnaHQgcmFuZ2UgdG8gWyR7ZnJvbUhlaWdodH0sICR7dG9IZWlnaHR9XWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eHMubGVuZ3RoIDwgQVBJX0xJTUlUKSB7XG4gICAgICAgICAgaWYgKHR4cy5sZW5ndGggPiAwKSBhd2FpdCB0aGlzLnByb2Nlc3NUcmFuc2FjdGlvbkJhdGNoKHR4cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgQmxvY2sgYXQgaGVpZ2h0ICR7ZnJvbUhlaWdodH0gaGFzIG1vcmUgdGhhbiAob3IgZXF1YWwpICR7QVBJX0xJTUlUfSByZWxldmFudCB0eHMsIHByb2Nlc3NpbmcgYWxsIHR4cyBpbiB0aGUgYmxvY2tgXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBibG9ja0lkID0gYXdhaXQgZXhwbG9yZXJOZXR3b3JrLmdldEJsb2NrSWRBdEhlaWdodChmcm9tSGVpZ2h0KTtcbiAgICAgICAgICBjb25zdCBibG9ja1R4cyA9IGF3YWl0IGV4cGxvcmVyTmV0d29yay5nZXRCbG9ja1R4cyhibG9ja0lkKTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBGb3VuZCAke2Jsb2NrVHhzLmxlbmd0aH0gdHJhbnNhY3Rpb25zIGF0IGhlaWdodCAke2Zyb21IZWlnaHR9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzVHJhbnNhY3Rpb25zKGJsb2NrVHhzLCB7XG4gICAgICAgICAgICBoYXNoOiBibG9ja0lkLFxuICAgICAgICAgICAgaGVpZ2h0OiBmcm9tSGVpZ2h0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZyb21IZWlnaHQgPSB0b0hlaWdodCArIDE7XG4gICAgICAgIHRvSGVpZ2h0ID0gaW5pdGlhbEJsb2NrLmhlaWdodDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSB0b3RhbCB0eCBjb3VudCBmcm9tIE5vZGUgbmV0d29ya1xuICAgKiBAcmV0dXJucyB0b3RhbCB0eCBjb3VudCBvZiB0aGUgYWRkcmVzc1xuICAgKi9cbiAgcHJpdmF0ZSBnZXRUb3RhbFR4Q291bnQgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCAoXG4gICAgICB0aGlzLm5ldHdvcmsgYXMgTm9kZU5ldHdvcmtcbiAgICApLmdldEFkZHJlc3NUcmFuc2FjdGlvbnNXaXRoT2Zmc2V0TGltaXQodGhpcy5hZGRyZXNzLCAwLCAwKTtcbiAgICByZXR1cm4gcmVzcG9uc2UudG90YWw7XG4gIH07XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgZXh0cmFjdG9yIHVzaW5nIE5vZGUgbmV0d29ya1xuICAgKiBAcGFyYW0gaW5pdGlhbEJsb2NrXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpemVXaXRoTm9kZSA9IGFzeW5jIChpbml0aWFsQmxvY2s6IEJsb2NrSW5mbykgPT4ge1xuICAgIGNvbnN0IHR4Q291bnRCZWZvcmVJbml0ID0gYXdhaXQgdGhpcy5nZXRUb3RhbFR4Q291bnQoKTtcbiAgICBsZXQgb2Zmc2V0ID0gMCxcbiAgICAgIHRvdGFsID0gMSxcbiAgICAgIHJvdW5kID0gMTtcbiAgICBhd2FpdCB0aGlzLmluaXRXaXRoUmV0cmlhbChhc3luYyAoKSA9PiB7XG4gICAgICAvLyBSZXBlYXQgdGhlIHdob2xlIHByb2Nlc3MgdHdpY2UgdG8gY292ZXIgYWxsIHNwZW50IGJveGVzXG4gICAgICAvLyBBZnRlciByb3VuZCAxIGFsbCBib3hlcyBoYXZlIGJlZW4gc2F2ZWQgYW5kIHByb2Nlc3NlZCBvbmNlXG4gICAgICAvLyBBZnRlciByb3VuZCAyIHNwZW5kaW5nIGluZm9ybWF0aW9uIG9mIGFsbCBzdG9yZWQgYm94ZXMgYXJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICB3aGlsZSAocm91bmQgPD0gMikge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgU3RhcnRpbmcgcm91bmQgJHtyb3VuZH0gb2YgaW5pdGlhbGl6YXRpb25gKTtcbiAgICAgICAgd2hpbGUgKG9mZnNldCA8IHRvdGFsKSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCAoXG4gICAgICAgICAgICB0aGlzLm5ldHdvcmsgYXMgTm9kZU5ldHdvcmtcbiAgICAgICAgICApLmdldEFkZHJlc3NUcmFuc2FjdGlvbnNXaXRoT2Zmc2V0TGltaXQoXG4gICAgICAgICAgICB0aGlzLmFkZHJlc3MsXG4gICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICBBUElfTElNSVRcbiAgICAgICAgICApO1xuICAgICAgICAgIHRvdGFsID0gcmVzcG9uc2UudG90YWw7XG4gICAgICAgICAgY29uc3QgdHhzID0gcmVzcG9uc2UuaXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgKHR4KSA9PiB0eC5pbmNsdXNpb25IZWlnaHQgPD0gaW5pdGlhbEJsb2NrLmhlaWdodFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgRm91bmQgJHt0eHMubGVuZ3RofSB0cmFuc2FjdGlvbnMgYmVsb3cgdGhlIGluaXRpYWwgaGVpZ2h0IHdpdGggb2Zmc2V0ICR7b2Zmc2V0fSBhbmQgdG90YWwgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyAke3RvdGFsfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICh0eHMubGVuZ3RoID4gMCkgYXdhaXQgdGhpcy5wcm9jZXNzVHJhbnNhY3Rpb25CYXRjaCh0eHMpO1xuICAgICAgICAgIG9mZnNldCArPSBBUElfTElNSVQ7XG4gICAgICAgIH1cbiAgICAgICAgcm91bmQrKztcbiAgICAgICAgb2Zmc2V0ID0gMDsgLy8gbmV4dCByb3VuZCBpbml0aWFsIG9mZnNldFxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHR4Q291bnRBZnRlckluaXQgPSBhd2FpdCB0aGlzLmdldFRvdGFsVHhDb3VudCgpO1xuICAgIGlmICh0eENvdW50QWZ0ZXJJbml0ICE9IHR4Q291bnRCZWZvcmVJbml0KSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgJ1RvdGFsIHRyYW5zYWN0aW9uIGNvdW50IGNoYW5nZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uIHBoYXNlLCB0aGUgc3RvcmVkIGRhdGEgaXMgbm90IHZhbGlkJ1xuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgYSBiYXRjaCBvZiB0cmFuc2FjdGlvbnNcbiAgICogZ3JvdXAgdHhzIGludG8gYmxvY2tzIGFuZCBwcm9jZXNzIHRoZW0gdXNpbmcgYHByb2Nlc3NUcmFuc2FjdGlvbnNgXG4gICAqIEBwYXJhbSB0eHNcbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc1RyYW5zYWN0aW9uQmF0Y2ggPSBhc3luYyAodHhzOiBBcnJheTxFeHRlbmRlZFRyYW5zYWN0aW9uPikgPT4ge1xuICAgIHR4cyA9IHNvcnRCeSh0eHMsICh0eCkgPT4gdHguaW5jbHVzaW9uSGVpZ2h0KTtcbiAgICBjb25zdCBncm91cGVkVHhzID0gZ3JvdXBCeSh0eHMsICh0eCkgPT4gdHguYmxvY2tJZCk7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBgVGhlIHRyYW5zYWN0aW9uIGJhdGNoIGdyb3VwZWQgdG8gJHtcbiAgICAgICAgT2JqZWN0LmtleXMoZ3JvdXBlZFR4cykubGVuZ3RoXG4gICAgICB9IGJsb2Nrc2BcbiAgICApO1xuICAgIGZvciAoY29uc3QgYmxvY2tJZCBpbiBncm91cGVkVHhzKSB7XG4gICAgICBjb25zdCBibG9ja1R4cyA9IGdyb3VwZWRUeHNbYmxvY2tJZF07XG4gICAgICBjb25zdCBibG9jayA9IHsgaGFzaDogYmxvY2tJZCwgaGVpZ2h0OiBibG9ja1R4c1swXS5pbmNsdXNpb25IZWlnaHQgfTtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgUHJvY2Vzc2luZyB0cmFuc2FjdGlvbnMgYXQgaGVpZ2h0ICR7YmxvY2tUeHNbMF0uaW5jbHVzaW9uSGVpZ2h0fWBcbiAgICAgICk7XG4gICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgdGhpcy5wcm9jZXNzVHJhbnNhY3Rpb25zKGJsb2NrVHhzLCBibG9jayk7XG4gICAgICBpZiAoIXN1Y2Nlc3MpXG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBQcm9jZXNzaW5nIHRyYW5zYWN0aW9ucyBmYWlsZWQgYXQgaGVpZ2h0ICR7YmxvY2tUeHNbMF0uaW5jbHVzaW9uSGVpZ2h0fWBcbiAgICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgdGhlIGV4dHJhY3RvciB3aXRoIHJldHJpYWwgb24gYW55IHVuZXhwZWN0ZWQgcHJvYmxlbVxuICAgKiBpdHMgdGhlIGNvbW1vbiBwYXJ0IG9mIGluaXRpYWxpemUgd2l0aCBOb2RlIGFuZCBFeHBsb3JlciBuZXR3b3JrXG4gICAqIEBwYXJhbSBqb2JcbiAgICovXG4gIHByaXZhdGUgaW5pdFdpdGhSZXRyaWFsID0gYXN5bmMgKGpvYjogKCkgPT4gUHJvbWlzZTx2b2lkPikgPT4ge1xuICAgIGxldCB0cmlhbCA9IDE7XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgIGBJbml0aWFsaXppbmcgJHt0aGlzLmdldElkKCl9IHN0YXJ0ZWQsIHJlbW92aW5nIGFsbCBleGlzdGluZyBkYXRhYFxuICAgICAgKTtcbiAgICAgIGF3YWl0IHRoaXMuYWN0aW9ucy5yZW1vdmVBbGxEYXRhKHRoaXMuZ2V0SWQoKSk7XG4gICAgICB3aGlsZSAodHJpYWwgPD0gUkVUUklBTF9DT1VOVCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGpvYigpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBJbml0aWFsaXphdGlvbiBmb3IgJHt0aGlzLmdldElkKCl9IGZhaWxlZCB3aXRoIGVycm9yIDoke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHRyaWFsID09IFJFVFJJQUxfQ09VTlQpXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgYEluaXRpYWxpemF0aW9uIGZvciAke3RoaXMuZ2V0SWQoKX0gZmFpbGVkIGFmdGVyICR7UkVUUklBTF9DT1VOVH0gcmV0cmlhbGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgdHJpYWwgKz0gMTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgYFRyeWluZyBhZ2FpbiB0byBpbml0aWFsaXplICR7dGhpcy5nZXRJZCgpfSB3aXRoIHRyaWFsIHN0ZXAgJHt0cmlhbH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgYEluaXRpYWxpemF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgZm9yICR7dGhpcy5nZXRJZCgpfWBcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oYEluaXRpYWxpemF0aW9uIGZvciAke3RoaXMuZ2V0SWQoKX0gaXMgdHVybmVkIG9mZmApO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogaW5pdGlhbGl6ZSBleHRyYWN0b3IgZGF0YWJhc2Ugd2l0aCBkYXRhIGNyZWF0ZWQgYmVsb3cgdGhlIGluaXRpYWwgaGVpZ2h0XG4gICAqIGlnbm9yZSBpbml0aWFsaXphdGlvbiBpZiB0aGlzIGZlYXR1cmUgaXMgb2ZmXG4gICAqIHRyeSB0byBnZXQgZGF0YSBtdWx0aXBsZSB0aW1lcyB0byBwYXNzIGFjY2lkZW50YWwgbmV0d29yayBwcm9ibGVtc1xuICAgKiBAcGFyYW0gaW5pdGlhbEJsb2NrXG4gICAqL1xuICBpbml0aWFsaXplQm94ZXM6IChpbml0aWFsQmxvY2s6IEJsb2NrSW5mbykgPT4gUHJvbWlzZTx2b2lkPjtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { DataSource, EntityTarget } from '@rosen-bridge/extended-typeorm';
|
|
2
|
+
import { AbstractLogger } from '@rosen-bridge/abstract-logger';
|
|
3
|
+
import { AbstractErgoExtractorAction } from '../AbstractErgoExtractorAction';
|
|
4
|
+
import { AbstractBoxData } from '../interfaces';
|
|
5
|
+
import { AbstractErgoExtractorEntity } from '../AbstractErgoExtractorEntity';
|
|
6
|
+
export declare abstract class AbstractInitializableErgoExtractorAction<ExtractedData extends AbstractBoxData, ExtractorEntity extends AbstractErgoExtractorEntity> extends AbstractErgoExtractorAction<ExtractedData, ExtractorEntity> {
|
|
7
|
+
constructor(dataSource: DataSource, repo: EntityTarget<ExtractorEntity>, logger?: AbstractLogger);
|
|
8
|
+
/**
|
|
9
|
+
* remove all existing data for the extractor
|
|
10
|
+
* @param extractorId
|
|
11
|
+
*/
|
|
12
|
+
removeAllData: (extractorId: string) => Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=AbstractInitializableAction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractInitializableAction.d.ts","sourceRoot":"","sources":["../../../../lib/ergo/initializable/AbstractInitializableAction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAoB,MAAM,gCAAgC,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAE7E,8BAAsB,wCAAwC,CAC5D,aAAa,SAAS,eAAe,EACrC,eAAe,SAAS,2BAA2B,CACnD,SAAQ,2BAA2B,CAAC,aAAa,EAAE,eAAe,CAAC;gBAEjE,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,YAAY,CAAC,eAAe,CAAC,EACnC,MAAM,CAAC,EAAE,cAAc;IAKzB;;;OAGG;IACH,aAAa,gBAAuB,MAAM,mBAIxC;CACH"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AbstractErgoExtractorAction } from '../AbstractErgoExtractorAction';
|
|
2
|
+
export class AbstractInitializableErgoExtractorAction extends AbstractErgoExtractorAction {
|
|
3
|
+
constructor(dataSource, repo, logger) {
|
|
4
|
+
super(dataSource, repo, logger);
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* remove all existing data for the extractor
|
|
8
|
+
* @param extractorId
|
|
9
|
+
*/
|
|
10
|
+
removeAllData = async (extractorId) => {
|
|
11
|
+
await this.repository.delete({
|
|
12
|
+
extractor: extractorId,
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RJbml0aWFsaXphYmxlQWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2VyZ28vaW5pdGlhbGl6YWJsZS9BYnN0cmFjdEluaXRpYWxpemFibGVBY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFJN0UsTUFBTSxPQUFnQix3Q0FHcEIsU0FBUSwyQkFBMkQ7SUFDbkUsWUFDRSxVQUFzQixFQUN0QixJQUFtQyxFQUNuQyxNQUF1QjtRQUV2QixLQUFLLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsYUFBYSxHQUFHLEtBQUssRUFBRSxXQUFtQixFQUFFLEVBQUU7UUFDNUMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUMzQixTQUFTLEVBQUUsV0FBVztTQUNjLENBQUMsQ0FBQztJQUMxQyxDQUFDLENBQUM7Q0FDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFTb3VyY2UsIEVudGl0eVRhcmdldCwgRmluZE9wdGlvbnNXaGVyZSB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvZXh0ZW5kZWQtdHlwZW9ybSc7XG5pbXBvcnQgeyBBYnN0cmFjdExvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcblxuaW1wb3J0IHsgQWJzdHJhY3RFcmdvRXh0cmFjdG9yQWN0aW9uIH0gZnJvbSAnLi4vQWJzdHJhY3RFcmdvRXh0cmFjdG9yQWN0aW9uJztcbmltcG9ydCB7IEFic3RyYWN0Qm94RGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQWJzdHJhY3RFcmdvRXh0cmFjdG9yRW50aXR5IH0gZnJvbSAnLi4vQWJzdHJhY3RFcmdvRXh0cmFjdG9yRW50aXR5JztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SW5pdGlhbGl6YWJsZUVyZ29FeHRyYWN0b3JBY3Rpb248XG4gIEV4dHJhY3RlZERhdGEgZXh0ZW5kcyBBYnN0cmFjdEJveERhdGEsXG4gIEV4dHJhY3RvckVudGl0eSBleHRlbmRzIEFic3RyYWN0RXJnb0V4dHJhY3RvckVudGl0eVxuPiBleHRlbmRzIEFic3RyYWN0RXJnb0V4dHJhY3RvckFjdGlvbjxFeHRyYWN0ZWREYXRhLCBFeHRyYWN0b3JFbnRpdHk+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICByZXBvOiBFbnRpdHlUYXJnZXQ8RXh0cmFjdG9yRW50aXR5PixcbiAgICBsb2dnZXI/OiBBYnN0cmFjdExvZ2dlclxuICApIHtcbiAgICBzdXBlcihkYXRhU291cmNlLCByZXBvLCBsb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZSBhbGwgZXhpc3RpbmcgZGF0YSBmb3IgdGhlIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gZXh0cmFjdG9ySWRcbiAgICovXG4gIHJlbW92ZUFsbERhdGEgPSBhc3luYyAoZXh0cmFjdG9ySWQ6IHN0cmluZykgPT4ge1xuICAgIGF3YWl0IHRoaXMucmVwb3NpdG9yeS5kZWxldGUoe1xuICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3JJZCxcbiAgICB9IGFzIEZpbmRPcHRpb25zV2hlcmU8RXh0cmFjdG9yRW50aXR5Pik7XG4gIH07XG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../lib/ergo/initializable/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from './AbstractInitializable';
|
|
2
|
+
export * from './AbstractInitializableAction';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvZXJnby9pbml0aWFsaXphYmxlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYywrQkFBK0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vQWJzdHJhY3RJbml0aWFsaXphYmxlJztcbmV4cG9ydCAqIGZyb20gJy4vQWJzdHJhY3RJbml0aWFsaXphYmxlQWN0aW9uJztcbiJdfQ==
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { OutputBox, Transaction } from '@rosen-bridge/scanner-interfaces';
|
|
2
|
+
export interface ErgoBox extends OutputBox {
|
|
3
|
+
blockId: string;
|
|
4
|
+
inclusionHeight: number;
|
|
5
|
+
spentBlockId?: string;
|
|
6
|
+
spentHeight?: number;
|
|
7
|
+
spentTransactionId?: string;
|
|
8
|
+
spentIndex?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface ExtendedTransaction extends Transaction {
|
|
11
|
+
inclusionHeight: number;
|
|
12
|
+
blockId: string;
|
|
13
|
+
}
|
|
14
|
+
export interface SpendInfo {
|
|
15
|
+
boxId: string;
|
|
16
|
+
txId: string;
|
|
17
|
+
index: number;
|
|
18
|
+
extras?: {
|
|
19
|
+
[key: string]: string;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export interface AbstractBoxData {
|
|
23
|
+
boxId: string;
|
|
24
|
+
serialized: string;
|
|
25
|
+
}
|
|
26
|
+
export declare enum CallbackType {
|
|
27
|
+
Insert = "insert",
|
|
28
|
+
Update = "update",
|
|
29
|
+
Spend = "spend",
|
|
30
|
+
Delete = "delete"
|
|
31
|
+
}
|
|
32
|
+
export interface BoxInfo {
|
|
33
|
+
boxId: string;
|
|
34
|
+
}
|
|
35
|
+
export type CallbackDataMap<ExtractedData extends AbstractBoxData> = {
|
|
36
|
+
[CallbackType.Update]: BoxInfo[];
|
|
37
|
+
[CallbackType.Insert]: ExtractedData[];
|
|
38
|
+
[CallbackType.Delete]: ExtractedData[];
|
|
39
|
+
[CallbackType.Spend]: BoxInfo[];
|
|
40
|
+
};
|
|
41
|
+
export type CallbackMap<ExtractedData extends AbstractBoxData> = {
|
|
42
|
+
[K in CallbackType]: (data: CallbackDataMap<ExtractedData>[K]) => void;
|
|
43
|
+
};
|
|
44
|
+
export type TxExtra = {
|
|
45
|
+
[key: string]: string;
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../lib/ergo/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAE1E,MAAM,WAAW,OAAQ,SAAQ,SAAS;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACtD,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,oBAAY,YAAY;IACtB,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,KAAK,UAAU;IACf,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,eAAe,CAAC,aAAa,SAAS,eAAe,IAAI;IACnE,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACjC,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACvC,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACvC,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,WAAW,CAAC,aAAa,SAAS,eAAe,IAAI;KAC9D,CAAC,IAAI,YAAY,GAAG,CAAC,IAAI,EAAE,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;CACvE,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export var CallbackType;
|
|
2
|
+
(function (CallbackType) {
|
|
3
|
+
CallbackType["Insert"] = "insert";
|
|
4
|
+
CallbackType["Update"] = "update";
|
|
5
|
+
CallbackType["Spend"] = "spend";
|
|
6
|
+
CallbackType["Delete"] = "delete";
|
|
7
|
+
})(CallbackType || (CallbackType = {}));
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9lcmdvL2ludGVyZmFjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBNEJBLE1BQU0sQ0FBTixJQUFZLFlBS1g7QUFMRCxXQUFZLFlBQVk7SUFDdEIsaUNBQWlCLENBQUE7SUFDakIsaUNBQWlCLENBQUE7SUFDakIsK0JBQWUsQ0FBQTtJQUNmLGlDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFMVyxZQUFZLEtBQVosWUFBWSxRQUt2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE91dHB1dEJveCwgVHJhbnNhY3Rpb24gfSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJnb0JveCBleHRlbmRzIE91dHB1dEJveCB7XG4gIGJsb2NrSWQ6IHN0cmluZztcbiAgaW5jbHVzaW9uSGVpZ2h0OiBudW1iZXI7XG4gIHNwZW50QmxvY2tJZD86IHN0cmluZztcbiAgc3BlbnRIZWlnaHQ/OiBudW1iZXI7XG4gIHNwZW50VHJhbnNhY3Rpb25JZD86IHN0cmluZztcbiAgc3BlbnRJbmRleD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRlbmRlZFRyYW5zYWN0aW9uIGV4dGVuZHMgVHJhbnNhY3Rpb24ge1xuICBpbmNsdXNpb25IZWlnaHQ6IG51bWJlcjtcbiAgYmxvY2tJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNwZW5kSW5mbyB7XG4gIGJveElkOiBzdHJpbmc7XG4gIHR4SWQ6IHN0cmluZztcbiAgaW5kZXg6IG51bWJlcjtcbiAgZXh0cmFzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBYnN0cmFjdEJveERhdGEge1xuICBib3hJZDogc3RyaW5nO1xuICBzZXJpYWxpemVkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBlbnVtIENhbGxiYWNrVHlwZSB7XG4gIEluc2VydCA9ICdpbnNlcnQnLFxuICBVcGRhdGUgPSAndXBkYXRlJyxcbiAgU3BlbmQgPSAnc3BlbmQnLFxuICBEZWxldGUgPSAnZGVsZXRlJyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCb3hJbmZvIHtcbiAgYm94SWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgQ2FsbGJhY2tEYXRhTWFwPEV4dHJhY3RlZERhdGEgZXh0ZW5kcyBBYnN0cmFjdEJveERhdGE+ID0ge1xuICBbQ2FsbGJhY2tUeXBlLlVwZGF0ZV06IEJveEluZm9bXTtcbiAgW0NhbGxiYWNrVHlwZS5JbnNlcnRdOiBFeHRyYWN0ZWREYXRhW107XG4gIFtDYWxsYmFja1R5cGUuRGVsZXRlXTogRXh0cmFjdGVkRGF0YVtdO1xuICBbQ2FsbGJhY2tUeXBlLlNwZW5kXTogQm94SW5mb1tdO1xufTtcblxuZXhwb3J0IHR5cGUgQ2FsbGJhY2tNYXA8RXh0cmFjdGVkRGF0YSBleHRlbmRzIEFic3RyYWN0Qm94RGF0YT4gPSB7XG4gIFtLIGluIENhbGxiYWNrVHlwZV06IChkYXRhOiBDYWxsYmFja0RhdGFNYXA8RXh0cmFjdGVkRGF0YT5bS10pID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgdHlwZSBUeEV4dHJhID0geyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbiJdfQ==
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ErgoBox } from '../interfaces';
|
|
2
|
+
export declare abstract class AbstractNetwork {
|
|
3
|
+
/**
|
|
4
|
+
* return related boxes by specified address with limit offset
|
|
5
|
+
* @param address
|
|
6
|
+
* @param offset
|
|
7
|
+
* @param limit
|
|
8
|
+
* @returns related boxes
|
|
9
|
+
*/
|
|
10
|
+
abstract getBoxesByAddress: (address: string, offset: number, limit: number) => Promise<{
|
|
11
|
+
boxes: ErgoBox[];
|
|
12
|
+
hasNextBatch: boolean;
|
|
13
|
+
}>;
|
|
14
|
+
/**
|
|
15
|
+
* return related boxes by specified token with limit offset
|
|
16
|
+
* @param tokenId
|
|
17
|
+
* @param offset
|
|
18
|
+
* @param limit
|
|
19
|
+
* @returns related boxes
|
|
20
|
+
*/
|
|
21
|
+
abstract getBoxesByTokenId: (tokenId: string, offset: number, limit: number) => Promise<{
|
|
22
|
+
boxes: ErgoBox[];
|
|
23
|
+
hasNextBatch: boolean;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=AbstractNetwork.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AbstractNetwork.d.ts","sourceRoot":"","sources":["../../../../lib/ergo/network/AbstractNetwork.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,8BAAsB,eAAe;IACnC;;;;;;OAMG;IACH,QAAQ,CAAC,iBAAiB,EAAE,CAC1B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,KACV,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAE1D;;;;;;OAMG;IACH,QAAQ,CAAC,iBAAiB,EAAE,CAC1B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,KACV,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC3D"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export class AbstractNetwork {
|
|
2
|
+
}
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3ROZXR3b3JrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL2VyZ28vbmV0d29yay9BYnN0cmFjdE5ldHdvcmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFnQixlQUFlO0NBMEJwQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVyZ29Cb3ggfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TmV0d29yayB7XG4gIC8qKlxuICAgKiByZXR1cm4gcmVsYXRlZCBib3hlcyBieSBzcGVjaWZpZWQgYWRkcmVzcyB3aXRoIGxpbWl0IG9mZnNldFxuICAgKiBAcGFyYW0gYWRkcmVzc1xuICAgKiBAcGFyYW0gb2Zmc2V0XG4gICAqIEBwYXJhbSBsaW1pdFxuICAgKiBAcmV0dXJucyByZWxhdGVkIGJveGVzXG4gICAqL1xuICBhYnN0cmFjdCBnZXRCb3hlc0J5QWRkcmVzczogKFxuICAgIGFkZHJlc3M6IHN0cmluZyxcbiAgICBvZmZzZXQ6IG51bWJlcixcbiAgICBsaW1pdDogbnVtYmVyXG4gICkgPT4gUHJvbWlzZTx7IGJveGVzOiBFcmdvQm94W107IGhhc05leHRCYXRjaDogYm9vbGVhbiB9PjtcblxuICAvKipcbiAgICogcmV0dXJuIHJlbGF0ZWQgYm94ZXMgYnkgc3BlY2lmaWVkIHRva2VuIHdpdGggbGltaXQgb2Zmc2V0XG4gICAqIEBwYXJhbSB0b2tlbklkXG4gICAqIEBwYXJhbSBvZmZzZXRcbiAgICogQHBhcmFtIGxpbWl0XG4gICAqIEByZXR1cm5zIHJlbGF0ZWQgYm94ZXNcbiAgICovXG4gIGFic3RyYWN0IGdldEJveGVzQnlUb2tlbklkOiAoXG4gICAgdG9rZW5JZDogc3RyaW5nLFxuICAgIG9mZnNldDogbnVtYmVyLFxuICAgIGxpbWl0OiBudW1iZXJcbiAgKSA9PiBQcm9taXNlPHsgYm94ZXM6IEVyZ29Cb3hbXTsgaGFzTmV4dEJhdGNoOiBib29sZWFuIH0+O1xufVxuIl19
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { AbstractNetwork } from './AbstractNetwork';
|
|
2
|
+
import { BlockInfo, Transaction } from '@rosen-bridge/scanner-interfaces';
|
|
3
|
+
import { ErgoBox, ExtendedTransaction } from '../interfaces';
|
|
4
|
+
export declare class ExplorerNetwork extends AbstractNetwork {
|
|
5
|
+
private api;
|
|
6
|
+
constructor(url: string);
|
|
7
|
+
/**
|
|
8
|
+
* return spending information of a specified box by having spendTxId
|
|
9
|
+
* @param boxId
|
|
10
|
+
* @param spendTxId
|
|
11
|
+
*/
|
|
12
|
+
getSpendingInfo: (boxId: string, spendTxId: string) => Promise<BlockInfo & {
|
|
13
|
+
spendIndex: number;
|
|
14
|
+
}>;
|
|
15
|
+
/**
|
|
16
|
+
* convert explorer api boxes to ErgoBox interface
|
|
17
|
+
* @param box
|
|
18
|
+
* @returns ErgoBox
|
|
19
|
+
*/
|
|
20
|
+
private convertBox;
|
|
21
|
+
/**
|
|
22
|
+
* convert explorer transaction to extractor transaction type
|
|
23
|
+
* @param tx
|
|
24
|
+
*/
|
|
25
|
+
private convertTransaction;
|
|
26
|
+
/**
|
|
27
|
+
* convert explorer block transaction to transaction type
|
|
28
|
+
* @param tx
|
|
29
|
+
*/
|
|
30
|
+
private convertBlockTransaction;
|
|
31
|
+
/**
|
|
32
|
+
* use explorer api to return related transactions of the specified address in the height range
|
|
33
|
+
* @param tokenId
|
|
34
|
+
* @param offset
|
|
35
|
+
* @param limit
|
|
36
|
+
* @returns related transactions
|
|
37
|
+
*/
|
|
38
|
+
getAddressTransactionsWithHeight: (address: string, fromHeight: number, toHeight: number) => Promise<Array<ExtendedTransaction>>;
|
|
39
|
+
/**
|
|
40
|
+
* use explorer api to get the block id at the specified height
|
|
41
|
+
* @param height
|
|
42
|
+
* @returns block id
|
|
43
|
+
*/
|
|
44
|
+
getBlockIdAtHeight: (height: number) => Promise<string>;
|
|
45
|
+
/**
|
|
46
|
+
* use explorer api to return all transactions in a block
|
|
47
|
+
* @param blockId
|
|
48
|
+
* @returns converted transactions
|
|
49
|
+
*/
|
|
50
|
+
getBlockTxs: (blockId: string) => Promise<Array<Transaction>>;
|
|
51
|
+
/**
|
|
52
|
+
* use explorer api to return related boxes by specified address
|
|
53
|
+
* @param address
|
|
54
|
+
* @param offset
|
|
55
|
+
* @param limit
|
|
56
|
+
* @returns related boxes
|
|
57
|
+
*/
|
|
58
|
+
getBoxesByAddress: (address: string, offset: number, limit: number) => Promise<{
|
|
59
|
+
boxes: ErgoBox[];
|
|
60
|
+
hasNextBatch: boolean;
|
|
61
|
+
}>;
|
|
62
|
+
/**
|
|
63
|
+
* use explorer api to return related boxes by specified token id
|
|
64
|
+
* @param tokenId
|
|
65
|
+
* @param offset
|
|
66
|
+
* @param limit
|
|
67
|
+
* @returns related boxes
|
|
68
|
+
*/
|
|
69
|
+
getBoxesByTokenId: (tokenId: string, offset: number, limit: number) => Promise<{
|
|
70
|
+
boxes: ErgoBox[];
|
|
71
|
+
hasNextBatch: boolean;
|
|
72
|
+
}>;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=ExplorerNetwork.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExplorerNetwork.d.ts","sourceRoot":"","sources":["../../../../lib/ergo/network/ExplorerNetwork.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAE1E,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAI7D,qBAAa,eAAgB,SAAQ,eAAe;IAClD,OAAO,CAAC,GAAG,CAAC;gBAEA,GAAG,EAAE,MAAM;IAKvB;;;;OAIG;IACH,eAAe,UACN,MAAM,aACF,MAAM;oBACkB,MAAM;OAYzC;IAEF;;;;OAIG;IACH,OAAO,CAAC,UAAU,CAwBhB;IAEF;;;OAGG;IACH,OAAO,CAAC,kBAAkB,CA8BxB;IAEF;;;OAGG;IACH,OAAO,CAAC,uBAAuB,CAuB7B;IAEF;;;;;;OAMG;IACH,gCAAgC,YACrB,MAAM,cACH,MAAM,YACR,MAAM,KACf,QAAQ,MAAM,mBAAmB,CAAC,CAAC,CAWpC;IAEF;;;;OAIG;IACH,kBAAkB,WAAkB,MAAM,KAAG,QAAQ,MAAM,CAAC,CAG1D;IAEF;;;;OAIG;IACH,WAAW,YAAmB,MAAM,KAAG,QAAQ,MAAM,WAAW,CAAC,CAAC,CAUhE;IAEF;;;;;;OAMG;IACH,iBAAiB,YACN,MAAM,UACP,MAAM,SACP,MAAM;eACK,OAAO,EAAE;sBAAgB,OAAO;OAalD;IAEF;;;;;;OAMG;IACH,iBAAiB,YACN,MAAM,UACP,MAAM,SACP,MAAM;eACK,OAAO,EAAE;sBAAgB,OAAO;OAYlD;CACH"}
|