@my-packages-changeit/abstract-observation-extractor 1.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/CHANGELOG.md +169 -0
  2. package/README.md +48 -0
  3. package/dist/actions/db.d.ts +28 -0
  4. package/dist/actions/db.d.ts.map +1 -0
  5. package/dist/actions/db.js +101 -0
  6. package/dist/entities/observationEntity.d.ts +20 -0
  7. package/dist/entities/observationEntity.d.ts.map +1 -0
  8. package/dist/entities/observationEntity.js +103 -0
  9. package/dist/extractor/abstractObservationExtractor.d.ts +56 -0
  10. package/dist/extractor/abstractObservationExtractor.d.ts.map +1 -0
  11. package/dist/extractor/abstractObservationExtractor.js +80 -0
  12. package/dist/index.d.ts +6 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +5 -0
  15. package/dist/interfaces/extractedObservation.d.ts +16 -0
  16. package/dist/interfaces/extractedObservation.d.ts.map +1 -0
  17. package/dist/interfaces/extractedObservation.js +2 -0
  18. package/dist/migrations/index.d.ts +7 -0
  19. package/dist/migrations/index.d.ts.map +1 -0
  20. package/dist/migrations/index.js +9 -0
  21. package/dist/migrations/postgres/1688545935708-migration.d.ts +7 -0
  22. package/dist/migrations/postgres/1688545935708-migration.d.ts.map +1 -0
  23. package/dist/migrations/postgres/1688545935708-migration.js +33 -0
  24. package/dist/migrations/postgres/1759307285120-migration.d.ts +7 -0
  25. package/dist/migrations/postgres/1759307285120-migration.d.ts.map +1 -0
  26. package/dist/migrations/postgres/1759307285120-migration.js +15 -0
  27. package/dist/migrations/sqlite/1688555621494-migration.d.ts +7 -0
  28. package/dist/migrations/sqlite/1688555621494-migration.d.ts.map +1 -0
  29. package/dist/migrations/sqlite/1688555621494-migration.js +32 -0
  30. package/dist/migrations/sqlite/1759315440593-migration.d.ts +7 -0
  31. package/dist/migrations/sqlite/1759315440593-migration.d.ts.map +1 -0
  32. package/dist/migrations/sqlite/1759315440593-migration.js +139 -0
  33. package/dist/tsconfig.tsbuildinfo +1 -0
  34. package/package.json +46 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,169 @@
1
+ # @rosen-bridge/abstract-observation-extractor
2
+
3
+ ## 1.0.10
4
+
5
+ ### Patch Changes
6
+
7
+ - Update dependencies
8
+ - @rosen-bridge/abstract-extractor@3.2.3
9
+
10
+ ## 1.0.9
11
+
12
+ ### Patch Changes
13
+
14
+ - Update dependencies
15
+ - @rosen-bridge/abstract-extractor@3.2.2
16
+ - @rosen-bridge/rosen-extractor@12.1.1
17
+ - @rosen-bridge/tokens@6.0.2
18
+
19
+ ## 1.0.8
20
+
21
+ ### Patch Changes
22
+
23
+ - Update dependencies
24
+ - @rosen-bridge/abstract-extractor@3.2.1
25
+
26
+ ## 1.0.7
27
+
28
+ ### Patch Changes
29
+
30
+ - Update dependencies
31
+ - @rosen-bridge/abstract-extractor@3.2.0
32
+ - @rosen-bridge/scanner-interfaces@1.0.0
33
+
34
+ ## 1.0.6
35
+
36
+ ### Patch Changes
37
+
38
+ - Update dependencies
39
+ - @rosen-bridge/rosen-extractor@12.0.2
40
+
41
+ ## 1.0.5
42
+
43
+ ### Patch Changes
44
+
45
+ - Update dependencies
46
+ - @rosen-bridge/abstract-extractor@3.1.2
47
+ - @rosen-bridge/extended-typeorm@1.1.0
48
+ - @rosen-bridge/rosen-extractor@12.0.1
49
+ - @rosen-bridge/tokens@6.0.1
50
+
51
+ ## 1.0.4
52
+
53
+ ### Patch Changes
54
+
55
+ - Update dependencies
56
+ - @rosen-bridge/abstract-extractor@3.1.1
57
+
58
+ ## 1.0.3
59
+
60
+ ### Patch Changes
61
+
62
+ - Update dependencies
63
+ - @rosen-bridge/abstract-extractor@3.1.0
64
+ - @rosen-bridge/rosen-extractor@11.3.0
65
+
66
+ ## 1.0.2
67
+
68
+ ### Patch Changes
69
+
70
+ - Update dependencies:
71
+ - @rosen-bridge/rosen-extractor@11.2.2
72
+ - @rosen-bridge/tokens@6.0.0
73
+
74
+ ## 1.0.1
75
+
76
+ ### Patch Changes
77
+
78
+ - Update dependencies
79
+ - @rosen-bridge/abstract-extractor@3.0.1
80
+ - @rosen-bridge/rosen-extractor@11.2.1
81
+ - @rosen-bridge/scanner-interfaces@0.2.2
82
+ - @rosen-bridge/tokens@5.0.1
83
+
84
+ ## 1.0.0
85
+
86
+ ### Major Changes
87
+
88
+ - Update AbstractExtractor interface; use `BlockInfo` in `processTransactions` and rename `initializeBoxes` to `initializeData`
89
+
90
+ ### Minor Changes
91
+
92
+ - Update AbstractExtractor interface; add `createUsedBlocksQuery` method that returns the query for used blocks
93
+
94
+ ### Patch Changes
95
+
96
+ - Update ObservationEntityAction to considering extractor in storeObservations method
97
+ - Update dependencies
98
+ - @rosen-bridge/abstract-extractor@3.0.0
99
+ - @rosen-bridge/abstract-logger@4.0.0
100
+ - @rosen-bridge/rosen-extractor@11.2.0
101
+ - @rosen-bridge/tokens@5.0.0
102
+
103
+ ## 0.2.3
104
+
105
+ ### Patch Changes
106
+
107
+ - Update dependencies
108
+ - @rosen-bridge/rosen-extractor@11.1.1
109
+
110
+ ## 0.2.2
111
+
112
+ ### Patch Changes
113
+
114
+ - Update Dependencies
115
+ - @rosen-bridge/rosen-extractor@11.1.0
116
+
117
+ ## 0.2.1
118
+
119
+ ### Patch Changes
120
+
121
+ - Fixed type definitions in entities based migrations
122
+ - Update Dependencies
123
+ - @rosen-bridge/rosen-extractor@11.0.0
124
+
125
+ ## 0.2.0
126
+
127
+ ### Minor Changes
128
+
129
+ - Added preprocessTransactions method
130
+ - Add rawData field in ObservationEntity and AbstractObservationExtractor processTransactions method
131
+
132
+ ### Patch Changes
133
+
134
+ - Fix package-lock and move typescript and types/node into root
135
+ - Update eslint and plugins:
136
+ - Apply new rules such as sort imports and file name
137
+ - Update dependencies
138
+ - @rosen-bridge/extended-typeorm@1.0.1
139
+ - @rosen-clients/rate-limited-axios@1.1.0
140
+ - @rosen-bridge/rosen-extractor@10.1.1
141
+ - @rosen-bridge/tokens@4.0.1
142
+ - @rosen-bridge/abstract-logger@3.0.1
143
+ - @rosen-bridge/json-bigint@1.1.0
144
+ - @rosen-clients/ergo-explorer@2.1.0
145
+ - @rosen-clients/ergo-node@3.1.0
146
+ - @rosen-bridge/abstract-extractor@2.1.2
147
+ - @rosen-bridge/scanner-interfaces@0.2.1
148
+
149
+ ## 0.1.2
150
+
151
+ ### Patch Changes
152
+
153
+ - Update dependencies
154
+ - @rosen-bridge/abstract-extractor@2.1.1
155
+ - @rosen-bridge/extended-typeorm@1.0.0
156
+ - @rosen-bridge/tokens@4.0.0
157
+ - @rosen-bridge/rosen-extractor@10.0.0
158
+ - @rosen-bridge/abstract-logger@3.0.0
159
+
160
+ ## 0.1.1
161
+
162
+ ### Patch Changes
163
+
164
+ - Update @rosen-bridge/rosen-extractor version to 9.0.0
165
+
166
+ ## 0.1.0
167
+
168
+ - The package has been **renamed** from `@rosen-bridge/observation-extractor`.
169
+ You can track the previous history in the changelog of the old package. The latest update is available [here](https://github.com/rosen-bridge/scanner/blob/d4a5539b01c523b101104470b03ff7023a10b70b/packages/observation-extractor/CHANGELOG.md).
package/README.md ADDED
@@ -0,0 +1,48 @@
1
+ # Abstract Observation Extractor
2
+
3
+ ### Table of Contents
4
+
5
+ - [Description](#description)
6
+ - [Related Projects](#related-projects)
7
+ - [How to Use the Observation Extractor](#how-to-use-the-observation-extractor)
8
+ - [Install](#install)
9
+ - [Usage](#usage)
10
+ - [Contributing](#contributing)
11
+ - [License](#license)
12
+
13
+ <a name="headers"/>
14
+
15
+ ## Description
16
+
17
+ Data extractors are modules that are integrated within a scanner. They drive the required information from the scanned blocks and store them in their own database. The observation extractor is designed to fulfill a watcher's main task: observing user payments in source networks. The bridge payment transaction has its own structure, and the observation extractor searches for this pattern occurrence in source chains and stores all needed information for a watcher commitment creation and revealment.
18
+
19
+ ## Related Projects
20
+
21
+ This module is used within the [Scanner](https://github.com/rosen-bridge/scanner) project. The address scanner is currently used in the [Watcher](https://github.com/rosen-bridge/watcher) service to drive the valid source chain observations.
22
+
23
+ ## How to Use the Observation Extractor
24
+
25
+ ### Install
26
+
27
+ This project is written in node-js using Esnext module and typeorm database. Extractors are not standalone projects and should be used as scanner modules. You can easily install it using npm with the command:
28
+
29
+ ```shell
30
+ npm install @rosen-bridge/abstract-observation-extractor
31
+ ```
32
+
33
+ Alternatively, you can build and use it manually by cloning the project and running:
34
+
35
+ ```shell
36
+ npm install
37
+ npm run build
38
+ ```
39
+
40
+ ### Usage
41
+
42
+ ## Contributing
43
+
44
+ TBD
45
+
46
+ ## License
47
+
48
+ TBD
@@ -0,0 +1,28 @@
1
+ import { AbstractLogger } from '@rosen-bridge/abstract-logger';
2
+ import { DataSource, SelectQueryBuilder } from '@rosen-bridge/extended-typeorm';
3
+ import { BlockInfo } from '@rosen-bridge/scanner-interfaces';
4
+ import { ObservationEntity } from '../entities/observationEntity';
5
+ import { ExtractedObservation } from '../interfaces/extractedObservation';
6
+ export declare class ObservationEntityAction {
7
+ readonly logger: AbstractLogger;
8
+ private readonly datasource;
9
+ private readonly observationRepository;
10
+ constructor(dataSource: DataSource, logger?: AbstractLogger);
11
+ /**
12
+ * It stores list of observations in the dataSource with block id
13
+ * @param observations
14
+ * @param block
15
+ * @param extractor
16
+ */
17
+ storeObservations: (observations: Array<ExtractedObservation>, block: BlockInfo, extractor: string) => Promise<boolean>;
18
+ deleteBlockObservation: (block: string, extractor: string) => Promise<void>;
19
+ /**
20
+ * Builds a query that returns used blocks by selecting the `block` column from the `ObservationEntity` repository,
21
+ * filtered by the provided `extractorId`
22
+ *
23
+ * @param extractorId - Identifier of the extractor
24
+ * @returns A query builder selecting used blocks
25
+ */
26
+ createUsedBlocksQuery: (extractorId: string) => SelectQueryBuilder<ObservationEntity>;
27
+ }
28
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../lib/actions/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EACL,UAAU,EAGV,kBAAkB,EACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAE7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAE1E,qBAAa,uBAAuB;IAClC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAgC;gBAE1D,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,cAAc;IAM3D;;;;;OAKG;IACH,iBAAiB,GACf,cAAc,KAAK,CAAC,oBAAoB,CAAC,EACzC,OAAO,SAAS,EAChB,WAAW,MAAM,sBAmEjB;IAEF,sBAAsB,GAAU,OAAO,MAAM,EAAE,WAAW,MAAM,mBAQ9D;IAEF;;;;;;OAMG;IACH,qBAAqB,GACnB,aAAa,MAAM,KAClB,kBAAkB,CAAC,iBAAiB,CAAC,CAKtC;CACH"}
@@ -0,0 +1,101 @@
1
+ import { DummyLogger } from '@rosen-bridge/abstract-logger';
2
+ import { In, } from '@rosen-bridge/extended-typeorm';
3
+ import { ObservationEntity } from '../entities/observationEntity';
4
+ export class ObservationEntityAction {
5
+ logger;
6
+ datasource;
7
+ observationRepository;
8
+ constructor(dataSource, logger) {
9
+ this.datasource = dataSource;
10
+ this.observationRepository = dataSource.getRepository(ObservationEntity);
11
+ this.logger = logger ? logger : new DummyLogger();
12
+ }
13
+ /**
14
+ * It stores list of observations in the dataSource with block id
15
+ * @param observations
16
+ * @param block
17
+ * @param extractor
18
+ */
19
+ storeObservations = async (observations, block, extractor) => {
20
+ if (observations.length === 0)
21
+ return true;
22
+ const requestIds = observations.map((item) => item.requestId);
23
+ const savedObservations = await this.observationRepository.findBy({
24
+ requestId: In(requestIds),
25
+ extractor: extractor,
26
+ });
27
+ let success = true;
28
+ const queryRunner = this.datasource.createQueryRunner();
29
+ await queryRunner.connect();
30
+ await queryRunner.startTransaction();
31
+ const repository = await queryRunner.manager.getRepository(ObservationEntity);
32
+ try {
33
+ for (const observation of observations) {
34
+ const saved = savedObservations.some((entity) => {
35
+ return entity.requestId === observation.requestId;
36
+ });
37
+ const entity = {
38
+ block: block.hash,
39
+ height: block.height,
40
+ bridgeFee: observation.bridgeFee,
41
+ amount: observation.amount,
42
+ fromAddress: observation.fromAddress,
43
+ fromChain: observation.fromChain,
44
+ networkFee: observation.networkFee,
45
+ requestId: observation.requestId,
46
+ sourceBlockId: observation.sourceBlockId,
47
+ sourceTxId: observation.sourceTxId,
48
+ toChain: observation.toChain,
49
+ sourceChainTokenId: observation.sourceChainTokenId,
50
+ targetChainTokenId: observation.targetChainTokenId,
51
+ toAddress: observation.toAddress,
52
+ extractor: extractor,
53
+ rawData: observation.rawData,
54
+ };
55
+ if (!saved) {
56
+ this.logger.info(`Storing observation for event ${observation.requestId} in blockHeight ${block.height} and extractor ${extractor}`);
57
+ await repository.insert(entity);
58
+ }
59
+ else {
60
+ this.logger.info(`Updating observation for event ${observation.requestId} in blockHeight ${block.height} and extractor ${extractor}`);
61
+ await repository.update({
62
+ requestId: observation.requestId,
63
+ extractor: extractor,
64
+ }, entity);
65
+ }
66
+ this.logger.debug(`Entity ${JSON.stringify(entity)}`);
67
+ }
68
+ await queryRunner.commitTransaction();
69
+ }
70
+ catch (e) {
71
+ this.logger.error(`An error occurred during store observation action: ${e}`);
72
+ await queryRunner.rollbackTransaction();
73
+ success = false;
74
+ }
75
+ finally {
76
+ await queryRunner.release();
77
+ }
78
+ return success;
79
+ };
80
+ deleteBlockObservation = async (block, extractor) => {
81
+ this.logger.info(`Deleting observations in block ${block} and extractor ${extractor}`);
82
+ await this.observationRepository.delete({
83
+ block: block,
84
+ extractor: extractor,
85
+ });
86
+ };
87
+ /**
88
+ * Builds a query that returns used blocks by selecting the `block` column from the `ObservationEntity` repository,
89
+ * filtered by the provided `extractorId`
90
+ *
91
+ * @param extractorId - Identifier of the extractor
92
+ * @returns A query builder selecting used blocks
93
+ */
94
+ createUsedBlocksQuery = (extractorId) => {
95
+ return this.observationRepository
96
+ .createQueryBuilder('observationEntity')
97
+ .select('observationEntity.block', 'block')
98
+ .where('observationEntity.extractor = :extractorId', { extractorId });
99
+ };
100
+ }
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYWN0aW9ucy9kYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtCLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVFLE9BQU8sRUFFTCxFQUFFLEdBR0gsTUFBTSxnQ0FBZ0MsQ0FBQztBQUd4QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUdsRSxNQUFNLE9BQU8sdUJBQXVCO0lBQ3pCLE1BQU0sQ0FBaUI7SUFDZixVQUFVLENBQWE7SUFDdkIscUJBQXFCLENBQWdDO0lBRXRFLFlBQVksVUFBc0IsRUFBRSxNQUF1QjtRQUN6RCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMscUJBQXFCLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksV0FBVyxFQUFFLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsaUJBQWlCLEdBQUcsS0FBSyxFQUN2QixZQUF5QyxFQUN6QyxLQUFnQixFQUNoQixTQUFpQixFQUNqQixFQUFFO1FBQ0YsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUMzQyxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUQsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUM7WUFDaEUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUM7WUFDekIsU0FBUyxFQUFFLFNBQVM7U0FDckIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN4RCxNQUFNLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM1QixNQUFNLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sVUFBVSxHQUNkLE1BQU0sV0FBVyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUM7WUFDSCxLQUFLLE1BQU0sV0FBVyxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUN2QyxNQUFNLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDOUMsT0FBTyxNQUFNLENBQUMsU0FBUyxLQUFLLFdBQVcsQ0FBQyxTQUFTLENBQUM7Z0JBQ3BELENBQUMsQ0FBQyxDQUFDO2dCQUNILE1BQU0sTUFBTSxHQUFHO29CQUNiLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSTtvQkFDakIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO29CQUNwQixTQUFTLEVBQUUsV0FBVyxDQUFDLFNBQVM7b0JBQ2hDLE1BQU0sRUFBRSxXQUFXLENBQUMsTUFBTTtvQkFDMUIsV0FBVyxFQUFFLFdBQVcsQ0FBQyxXQUFXO29CQUNwQyxTQUFTLEVBQUUsV0FBVyxDQUFDLFNBQVM7b0JBQ2hDLFVBQVUsRUFBRSxXQUFXLENBQUMsVUFBVTtvQkFDbEMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxTQUFTO29CQUNoQyxhQUFhLEVBQUUsV0FBVyxDQUFDLGFBQWE7b0JBQ3hDLFVBQVUsRUFBRSxXQUFXLENBQUMsVUFBVTtvQkFDbEMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxPQUFPO29CQUM1QixrQkFBa0IsRUFBRSxXQUFXLENBQUMsa0JBQWtCO29CQUNsRCxrQkFBa0IsRUFBRSxXQUFXLENBQUMsa0JBQWtCO29CQUNsRCxTQUFTLEVBQUUsV0FBVyxDQUFDLFNBQVM7b0JBQ2hDLFNBQVMsRUFBRSxTQUFTO29CQUNwQixPQUFPLEVBQUUsV0FBVyxDQUFDLE9BQU87aUJBQzdCLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNYLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNkLGlDQUFpQyxXQUFXLENBQUMsU0FBUyxtQkFBbUIsS0FBSyxDQUFDLE1BQU0sa0JBQWtCLFNBQVMsRUFBRSxDQUNuSCxDQUFDO29CQUNGLE1BQU0sVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbEMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNkLGtDQUFrQyxXQUFXLENBQUMsU0FBUyxtQkFBbUIsS0FBSyxDQUFDLE1BQU0sa0JBQWtCLFNBQVMsRUFBRSxDQUNwSCxDQUFDO29CQUNGLE1BQU0sVUFBVSxDQUFDLE1BQU0sQ0FDckI7d0JBQ0UsU0FBUyxFQUFFLFdBQVcsQ0FBQyxTQUFTO3dCQUNoQyxTQUFTLEVBQUUsU0FBUztxQkFDckIsRUFDRCxNQUFNLENBQ1AsQ0FBQztnQkFDSixDQUFDO2dCQUNELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDeEQsQ0FBQztZQUNELE1BQU0sV0FBVyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDeEMsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZixzREFBc0QsQ0FBQyxFQUFFLENBQzFELENBQUM7WUFDRixNQUFNLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDbEIsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsTUFBTSxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDOUIsQ0FBQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUMsQ0FBQztJQUVGLHNCQUFzQixHQUFHLEtBQUssRUFBRSxLQUFhLEVBQUUsU0FBaUIsRUFBRSxFQUFFO1FBQ2xFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNkLGtDQUFrQyxLQUFLLGtCQUFrQixTQUFTLEVBQUUsQ0FDckUsQ0FBQztRQUNGLE1BQU0sSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQztZQUN0QyxLQUFLLEVBQUUsS0FBSztZQUNaLFNBQVMsRUFBRSxTQUFTO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGOzs7Ozs7T0FNRztJQUNILHFCQUFxQixHQUFHLENBQ3RCLFdBQW1CLEVBQ29CLEVBQUU7UUFDekMsT0FBTyxJQUFJLENBQUMscUJBQXFCO2FBQzlCLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDO2FBQ3ZDLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRSxPQUFPLENBQUM7YUFDMUMsS0FBSyxDQUFDLDRDQUE0QyxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDLENBQUM7Q0FDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0TG9nZ2VyLCBEdW1teUxvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcbmltcG9ydCB7XG4gIERhdGFTb3VyY2UsXG4gIEluLFxuICBSZXBvc2l0b3J5LFxuICBTZWxlY3RRdWVyeUJ1aWxkZXIsXG59IGZyb20gJ0Byb3Nlbi1icmlkZ2UvZXh0ZW5kZWQtdHlwZW9ybSc7XG5pbXBvcnQgeyBCbG9ja0luZm8gfSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7IE9ic2VydmF0aW9uRW50aXR5IH0gZnJvbSAnLi4vZW50aXRpZXMvb2JzZXJ2YXRpb25FbnRpdHknO1xuaW1wb3J0IHsgRXh0cmFjdGVkT2JzZXJ2YXRpb24gfSBmcm9tICcuLi9pbnRlcmZhY2VzL2V4dHJhY3RlZE9ic2VydmF0aW9uJztcblxuZXhwb3J0IGNsYXNzIE9ic2VydmF0aW9uRW50aXR5QWN0aW9uIHtcbiAgcmVhZG9ubHkgbG9nZ2VyOiBBYnN0cmFjdExvZ2dlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhc291cmNlOiBEYXRhU291cmNlO1xuICBwcml2YXRlIHJlYWRvbmx5IG9ic2VydmF0aW9uUmVwb3NpdG9yeTogUmVwb3NpdG9yeTxPYnNlcnZhdGlvbkVudGl0eT47XG5cbiAgY29uc3RydWN0b3IoZGF0YVNvdXJjZTogRGF0YVNvdXJjZSwgbG9nZ2VyPzogQWJzdHJhY3RMb2dnZXIpIHtcbiAgICB0aGlzLmRhdGFzb3VyY2UgPSBkYXRhU291cmNlO1xuICAgIHRoaXMub2JzZXJ2YXRpb25SZXBvc2l0b3J5ID0gZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KE9ic2VydmF0aW9uRW50aXR5KTtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlciA/IGxvZ2dlciA6IG5ldyBEdW1teUxvZ2dlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEl0IHN0b3JlcyBsaXN0IG9mIG9ic2VydmF0aW9ucyBpbiB0aGUgZGF0YVNvdXJjZSB3aXRoIGJsb2NrIGlkXG4gICAqIEBwYXJhbSBvYnNlcnZhdGlvbnNcbiAgICogQHBhcmFtIGJsb2NrXG4gICAqIEBwYXJhbSBleHRyYWN0b3JcbiAgICovXG4gIHN0b3JlT2JzZXJ2YXRpb25zID0gYXN5bmMgKFxuICAgIG9ic2VydmF0aW9uczogQXJyYXk8RXh0cmFjdGVkT2JzZXJ2YXRpb24+LFxuICAgIGJsb2NrOiBCbG9ja0luZm8sXG4gICAgZXh0cmFjdG9yOiBzdHJpbmcsXG4gICkgPT4ge1xuICAgIGlmIChvYnNlcnZhdGlvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCByZXF1ZXN0SWRzID0gb2JzZXJ2YXRpb25zLm1hcCgoaXRlbSkgPT4gaXRlbS5yZXF1ZXN0SWQpO1xuICAgIGNvbnN0IHNhdmVkT2JzZXJ2YXRpb25zID0gYXdhaXQgdGhpcy5vYnNlcnZhdGlvblJlcG9zaXRvcnkuZmluZEJ5KHtcbiAgICAgIHJlcXVlc3RJZDogSW4ocmVxdWVzdElkcyksXG4gICAgICBleHRyYWN0b3I6IGV4dHJhY3RvcixcbiAgICB9KTtcbiAgICBsZXQgc3VjY2VzcyA9IHRydWU7XG4gICAgY29uc3QgcXVlcnlSdW5uZXIgPSB0aGlzLmRhdGFzb3VyY2UuY3JlYXRlUXVlcnlSdW5uZXIoKTtcbiAgICBhd2FpdCBxdWVyeVJ1bm5lci5jb25uZWN0KCk7XG4gICAgYXdhaXQgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpO1xuICAgIGNvbnN0IHJlcG9zaXRvcnkgPVxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIubWFuYWdlci5nZXRSZXBvc2l0b3J5KE9ic2VydmF0aW9uRW50aXR5KTtcbiAgICB0cnkge1xuICAgICAgZm9yIChjb25zdCBvYnNlcnZhdGlvbiBvZiBvYnNlcnZhdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgc2F2ZWQgPSBzYXZlZE9ic2VydmF0aW9ucy5zb21lKChlbnRpdHkpID0+IHtcbiAgICAgICAgICByZXR1cm4gZW50aXR5LnJlcXVlc3RJZCA9PT0gb2JzZXJ2YXRpb24ucmVxdWVzdElkO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZW50aXR5ID0ge1xuICAgICAgICAgIGJsb2NrOiBibG9jay5oYXNoLFxuICAgICAgICAgIGhlaWdodDogYmxvY2suaGVpZ2h0LFxuICAgICAgICAgIGJyaWRnZUZlZTogb2JzZXJ2YXRpb24uYnJpZGdlRmVlLFxuICAgICAgICAgIGFtb3VudDogb2JzZXJ2YXRpb24uYW1vdW50LFxuICAgICAgICAgIGZyb21BZGRyZXNzOiBvYnNlcnZhdGlvbi5mcm9tQWRkcmVzcyxcbiAgICAgICAgICBmcm9tQ2hhaW46IG9ic2VydmF0aW9uLmZyb21DaGFpbixcbiAgICAgICAgICBuZXR3b3JrRmVlOiBvYnNlcnZhdGlvbi5uZXR3b3JrRmVlLFxuICAgICAgICAgIHJlcXVlc3RJZDogb2JzZXJ2YXRpb24ucmVxdWVzdElkLFxuICAgICAgICAgIHNvdXJjZUJsb2NrSWQ6IG9ic2VydmF0aW9uLnNvdXJjZUJsb2NrSWQsXG4gICAgICAgICAgc291cmNlVHhJZDogb2JzZXJ2YXRpb24uc291cmNlVHhJZCxcbiAgICAgICAgICB0b0NoYWluOiBvYnNlcnZhdGlvbi50b0NoYWluLFxuICAgICAgICAgIHNvdXJjZUNoYWluVG9rZW5JZDogb2JzZXJ2YXRpb24uc291cmNlQ2hhaW5Ub2tlbklkLFxuICAgICAgICAgIHRhcmdldENoYWluVG9rZW5JZDogb2JzZXJ2YXRpb24udGFyZ2V0Q2hhaW5Ub2tlbklkLFxuICAgICAgICAgIHRvQWRkcmVzczogb2JzZXJ2YXRpb24udG9BZGRyZXNzLFxuICAgICAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgICAgICAgIHJhd0RhdGE6IG9ic2VydmF0aW9uLnJhd0RhdGEsXG4gICAgICAgIH07XG4gICAgICAgIGlmICghc2F2ZWQpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgYFN0b3Jpbmcgb2JzZXJ2YXRpb24gZm9yIGV2ZW50ICR7b2JzZXJ2YXRpb24ucmVxdWVzdElkfSBpbiBibG9ja0hlaWdodCAke2Jsb2NrLmhlaWdodH0gYW5kIGV4dHJhY3RvciAke2V4dHJhY3Rvcn1gLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgcmVwb3NpdG9yeS5pbnNlcnQoZW50aXR5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgYFVwZGF0aW5nIG9ic2VydmF0aW9uIGZvciBldmVudCAke29ic2VydmF0aW9uLnJlcXVlc3RJZH0gaW4gYmxvY2tIZWlnaHQgJHtibG9jay5oZWlnaHR9IGFuZCBleHRyYWN0b3IgJHtleHRyYWN0b3J9YCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IHJlcG9zaXRvcnkudXBkYXRlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICByZXF1ZXN0SWQ6IG9ic2VydmF0aW9uLnJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYEVudGl0eSAke0pTT04uc3RyaW5naWZ5KGVudGl0eSl9YCk7XG4gICAgICB9XG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICBgQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHN0b3JlIG9ic2VydmF0aW9uIGFjdGlvbjogJHtlfWAsXG4gICAgICApO1xuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpO1xuICAgICAgc3VjY2VzcyA9IGZhbHNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yZWxlYXNlKCk7XG4gICAgfVxuICAgIHJldHVybiBzdWNjZXNzO1xuICB9O1xuXG4gIGRlbGV0ZUJsb2NrT2JzZXJ2YXRpb24gPSBhc3luYyAoYmxvY2s6IHN0cmluZywgZXh0cmFjdG9yOiBzdHJpbmcpID0+IHtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgYERlbGV0aW5nIG9ic2VydmF0aW9ucyBpbiBibG9jayAke2Jsb2NrfSBhbmQgZXh0cmFjdG9yICR7ZXh0cmFjdG9yfWAsXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLm9ic2VydmF0aW9uUmVwb3NpdG9yeS5kZWxldGUoe1xuICAgICAgYmxvY2s6IGJsb2NrLFxuICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHF1ZXJ5IHRoYXQgcmV0dXJucyB1c2VkIGJsb2NrcyBieSBzZWxlY3RpbmcgdGhlIGBibG9ja2AgY29sdW1uIGZyb20gdGhlIGBPYnNlcnZhdGlvbkVudGl0eWAgcmVwb3NpdG9yeSxcbiAgICogZmlsdGVyZWQgYnkgdGhlIHByb3ZpZGVkIGBleHRyYWN0b3JJZGBcbiAgICpcbiAgICogQHBhcmFtIGV4dHJhY3RvcklkIC0gSWRlbnRpZmllciBvZiB0aGUgZXh0cmFjdG9yXG4gICAqIEByZXR1cm5zIEEgcXVlcnkgYnVpbGRlciBzZWxlY3RpbmcgdXNlZCBibG9ja3NcbiAgICovXG4gIGNyZWF0ZVVzZWRCbG9ja3NRdWVyeSA9IChcbiAgICBleHRyYWN0b3JJZDogc3RyaW5nLFxuICApOiBTZWxlY3RRdWVyeUJ1aWxkZXI8T2JzZXJ2YXRpb25FbnRpdHk+ID0+IHtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZhdGlvblJlcG9zaXRvcnlcbiAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoJ29ic2VydmF0aW9uRW50aXR5JylcbiAgICAgIC5zZWxlY3QoJ29ic2VydmF0aW9uRW50aXR5LmJsb2NrJywgJ2Jsb2NrJylcbiAgICAgIC53aGVyZSgnb2JzZXJ2YXRpb25FbnRpdHkuZXh0cmFjdG9yID0gOmV4dHJhY3RvcklkJywgeyBleHRyYWN0b3JJZCB9KTtcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,20 @@
1
+ export declare class ObservationEntity {
2
+ id: number;
3
+ fromChain: string;
4
+ toChain: string;
5
+ fromAddress: string;
6
+ toAddress: string;
7
+ height: number;
8
+ amount: string;
9
+ networkFee: string;
10
+ bridgeFee: string;
11
+ sourceChainTokenId: string;
12
+ targetChainTokenId: string;
13
+ sourceTxId: string;
14
+ sourceBlockId: string;
15
+ requestId: string;
16
+ block: string;
17
+ extractor: string;
18
+ rawData: string;
19
+ }
20
+ //# sourceMappingURL=observationEntity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observationEntity.d.ts","sourceRoot":"","sources":["../../lib/entities/observationEntity.ts"],"names":[],"mappings":"AAOA,qBAEa,iBAAiB;IAE5B,EAAE,EAAE,MAAM,CAAC;IAEX,SAAS,EAAE,MAAM,CAAC;IAGlB,OAAO,EAAE,MAAM,CAAC;IAGhB,WAAW,EAAE,MAAM,CAAC;IAGpB,SAAS,EAAE,MAAM,CAAC;IAGlB,MAAM,EAAE,MAAM,CAAC;IAGf,MAAM,EAAE,MAAM,CAAC;IAGf,UAAU,EAAE,MAAM,CAAC;IAGnB,SAAS,EAAE,MAAM,CAAC;IAGlB,kBAAkB,EAAE,MAAM,CAAC;IAG3B,kBAAkB,EAAE,MAAM,CAAC;IAG3B,UAAU,EAAE,MAAM,CAAC;IAGnB,aAAa,EAAE,MAAM,CAAC;IAGtB,SAAS,EAAE,MAAM,CAAC;IAGlB,KAAK,EAAE,MAAM,CAAC;IAGd,SAAS,EAAE,MAAM,CAAC;IAGlB,OAAO,EAAE,MAAM,CAAC;CACjB"}
@@ -0,0 +1,103 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Column, Entity, PrimaryGeneratedColumn, Unique, } from '@rosen-bridge/extended-typeorm';
11
+ let ObservationEntity = class ObservationEntity {
12
+ id;
13
+ fromChain;
14
+ toChain;
15
+ fromAddress;
16
+ toAddress;
17
+ height;
18
+ amount;
19
+ networkFee;
20
+ bridgeFee;
21
+ sourceChainTokenId;
22
+ targetChainTokenId;
23
+ sourceTxId;
24
+ sourceBlockId;
25
+ requestId;
26
+ block;
27
+ extractor;
28
+ rawData;
29
+ };
30
+ __decorate([
31
+ PrimaryGeneratedColumn(),
32
+ __metadata("design:type", Number)
33
+ ], ObservationEntity.prototype, "id", void 0);
34
+ __decorate([
35
+ Column({ type: 'varchar', length: 30 }),
36
+ __metadata("design:type", String)
37
+ ], ObservationEntity.prototype, "fromChain", void 0);
38
+ __decorate([
39
+ Column({ type: 'varchar', length: 30 }),
40
+ __metadata("design:type", String)
41
+ ], ObservationEntity.prototype, "toChain", void 0);
42
+ __decorate([
43
+ Column({ type: 'varchar' }),
44
+ __metadata("design:type", String)
45
+ ], ObservationEntity.prototype, "fromAddress", void 0);
46
+ __decorate([
47
+ Column({ type: 'varchar' }),
48
+ __metadata("design:type", String)
49
+ ], ObservationEntity.prototype, "toAddress", void 0);
50
+ __decorate([
51
+ Column({ type: 'int' }),
52
+ __metadata("design:type", Number)
53
+ ], ObservationEntity.prototype, "height", void 0);
54
+ __decorate([
55
+ Column({ type: 'varchar' }),
56
+ __metadata("design:type", String)
57
+ ], ObservationEntity.prototype, "amount", void 0);
58
+ __decorate([
59
+ Column({ type: 'varchar' }),
60
+ __metadata("design:type", String)
61
+ ], ObservationEntity.prototype, "networkFee", void 0);
62
+ __decorate([
63
+ Column({ type: 'varchar' }),
64
+ __metadata("design:type", String)
65
+ ], ObservationEntity.prototype, "bridgeFee", void 0);
66
+ __decorate([
67
+ Column({ type: 'varchar' }),
68
+ __metadata("design:type", String)
69
+ ], ObservationEntity.prototype, "sourceChainTokenId", void 0);
70
+ __decorate([
71
+ Column({ type: 'varchar' }),
72
+ __metadata("design:type", String)
73
+ ], ObservationEntity.prototype, "targetChainTokenId", void 0);
74
+ __decorate([
75
+ Column({ type: 'varchar' }),
76
+ __metadata("design:type", String)
77
+ ], ObservationEntity.prototype, "sourceTxId", void 0);
78
+ __decorate([
79
+ Column({ type: 'varchar' }),
80
+ __metadata("design:type", String)
81
+ ], ObservationEntity.prototype, "sourceBlockId", void 0);
82
+ __decorate([
83
+ Column({ type: 'varchar' }),
84
+ __metadata("design:type", String)
85
+ ], ObservationEntity.prototype, "requestId", void 0);
86
+ __decorate([
87
+ Column({ type: 'varchar' }),
88
+ __metadata("design:type", String)
89
+ ], ObservationEntity.prototype, "block", void 0);
90
+ __decorate([
91
+ Column({ type: 'varchar' }),
92
+ __metadata("design:type", String)
93
+ ], ObservationEntity.prototype, "extractor", void 0);
94
+ __decorate([
95
+ Column({ type: 'varchar', default: '' }),
96
+ __metadata("design:type", String)
97
+ ], ObservationEntity.prototype, "rawData", void 0);
98
+ ObservationEntity = __decorate([
99
+ Entity('observation_entity'),
100
+ Unique(['requestId', 'extractor'])
101
+ ], ObservationEntity);
102
+ export { ObservationEntity };
103
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzZXJ2YXRpb25FbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZW50aXRpZXMvb2JzZXJ2YXRpb25FbnRpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sc0JBQXNCLEVBQ3RCLE1BQU0sR0FDUCxNQUFNLGdDQUFnQyxDQUFDO0FBSWpDLElBQU0saUJBQWlCLEdBQXZCLE1BQU0saUJBQWlCO0lBRTVCLEVBQUUsQ0FBUztJQUVYLFNBQVMsQ0FBUztJQUdsQixPQUFPLENBQVM7SUFHaEIsV0FBVyxDQUFTO0lBR3BCLFNBQVMsQ0FBUztJQUdsQixNQUFNLENBQVM7SUFHZixNQUFNLENBQVM7SUFHZixVQUFVLENBQVM7SUFHbkIsU0FBUyxDQUFTO0lBR2xCLGtCQUFrQixDQUFTO0lBRzNCLGtCQUFrQixDQUFTO0lBRzNCLFVBQVUsQ0FBUztJQUduQixhQUFhLENBQVM7SUFHdEIsU0FBUyxDQUFTO0lBR2xCLEtBQUssQ0FBUztJQUdkLFNBQVMsQ0FBUztJQUdsQixPQUFPLENBQVM7Q0FDakIsQ0FBQTtBQWhEQztJQURDLHNCQUFzQixFQUFFOzs2Q0FDZDtBQUVYO0lBREMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7O29EQUN0QjtBQUdsQjtJQURDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDOztrREFDeEI7QUFHaEI7SUFEQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7O3NEQUNSO0FBR3BCO0lBREMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOztvREFDVjtBQUdsQjtJQURDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7aURBQ1Q7QUFHZjtJQURDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7aURBQ2I7QUFHZjtJQURDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7cURBQ1Q7QUFHbkI7SUFEQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7O29EQUNWO0FBR2xCO0lBREMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOzs2REFDRDtBQUczQjtJQURDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7NkRBQ0Q7QUFHM0I7SUFEQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7O3FEQUNUO0FBR25CO0lBREMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOzt3REFDTjtBQUd0QjtJQURDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7b0RBQ1Y7QUFHbEI7SUFEQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7O2dEQUNkO0FBR2Q7SUFEQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7O29EQUNWO0FBR2xCO0lBREMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUM7O2tEQUN6QjtBQWpETCxpQkFBaUI7SUFGN0IsTUFBTSxDQUFDLG9CQUFvQixDQUFDO0lBQzVCLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztHQUN0QixpQkFBaUIsQ0FrRDdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29sdW1uLFxuICBFbnRpdHksXG4gIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4sXG4gIFVuaXF1ZSxcbn0gZnJvbSAnQHJvc2VuLWJyaWRnZS9leHRlbmRlZC10eXBlb3JtJztcblxuQEVudGl0eSgnb2JzZXJ2YXRpb25fZW50aXR5JylcbkBVbmlxdWUoWydyZXF1ZXN0SWQnLCAnZXh0cmFjdG9yJ10pXG5leHBvcnQgY2xhc3MgT2JzZXJ2YXRpb25FbnRpdHkge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIGlkOiBudW1iZXI7XG4gIEBDb2x1bW4oeyB0eXBlOiAndmFyY2hhcicsIGxlbmd0aDogMzAgfSlcbiAgZnJvbUNoYWluOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJywgbGVuZ3RoOiAzMCB9KVxuICB0b0NoYWluOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICBmcm9tQWRkcmVzczogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndmFyY2hhcicgfSlcbiAgdG9BZGRyZXNzOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICdpbnQnIH0pXG4gIGhlaWdodDogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndmFyY2hhcicgfSlcbiAgYW1vdW50OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICBuZXR3b3JrRmVlOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICBicmlkZ2VGZWU6IHN0cmluZztcblxuICBAQ29sdW1uKHsgdHlwZTogJ3ZhcmNoYXInIH0pXG4gIHNvdXJjZUNoYWluVG9rZW5JZDogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndmFyY2hhcicgfSlcbiAgdGFyZ2V0Q2hhaW5Ub2tlbklkOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICBzb3VyY2VUeElkOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICBzb3VyY2VCbG9ja0lkOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICByZXF1ZXN0SWQ6IHN0cmluZztcblxuICBAQ29sdW1uKHsgdHlwZTogJ3ZhcmNoYXInIH0pXG4gIGJsb2NrOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICBleHRyYWN0b3I6IHN0cmluZztcblxuICBAQ29sdW1uKHsgdHlwZTogJ3ZhcmNoYXInLCBkZWZhdWx0OiAnJyB9KVxuICByYXdEYXRhOiBzdHJpbmc7XG59XG4iXX0=
@@ -0,0 +1,56 @@
1
+ import { AbstractExtractor } from '@rosen-bridge/abstract-extractor';
2
+ import { AbstractLogger } from '@rosen-bridge/abstract-logger';
3
+ import { DataSource, SelectQueryBuilder } from '@rosen-bridge/extended-typeorm';
4
+ import { AbstractRosenDataExtractor } from '@rosen-bridge/rosen-extractor';
5
+ import { BlockInfo } from '@rosen-bridge/scanner-interfaces';
6
+ import { TokenMap } from '@rosen-bridge/tokens';
7
+ import { ObservationEntityAction } from '../actions/db';
8
+ import { ObservationEntity } from '../entities/observationEntity';
9
+ export declare abstract class AbstractObservationExtractor<TransactionType> extends AbstractExtractor<TransactionType, ObservationEntity> {
10
+ protected readonly logger: AbstractLogger;
11
+ protected readonly dataSource: DataSource;
12
+ protected readonly tokens: TokenMap;
13
+ protected readonly actions: ObservationEntityAction;
14
+ protected extractor: AbstractRosenDataExtractor<TransactionType>;
15
+ abstract readonly FROM_CHAIN: string;
16
+ constructor(dataSource: DataSource, tokens: TokenMap, extractor: AbstractRosenDataExtractor<TransactionType>, logger?: AbstractLogger);
17
+ /**
18
+ * gets Id for current extractor
19
+ */
20
+ abstract getId: () => string;
21
+ /**
22
+ * gets transaction id from TransactionType
23
+ */
24
+ abstract getTxId: (tx: TransactionType) => string;
25
+ /**
26
+ * manipulate transactions before processing
27
+ * @param txs
28
+ * @param block
29
+ */
30
+ protected preprocessTransactions: (txs: Array<TransactionType>, block: BlockInfo) => TransactionType[];
31
+ /**
32
+ * gets block id and transactions corresponding to the block and saves if they are valid rosen
33
+ * transactions and in case of success return true and in case of failure returns false
34
+ * @param txs
35
+ * @param block
36
+ */
37
+ processTransactions: (txs: Array<TransactionType>, block: BlockInfo) => Promise<boolean>;
38
+ /**
39
+ * fork one block and remove all stored information for this block
40
+ * @param hash: block hash
41
+ */
42
+ forkBlock: (hash: string) => Promise<void>;
43
+ /**
44
+ * Extractor box initialization
45
+ * No action needed in observation extractors
46
+ */
47
+ initializeData: () => Promise<void>;
48
+ /**
49
+ * Builds a query that returns used blocks by selecting the `block` column from the `ObservationEntity` repository,
50
+ * filtered by the provided `extractorId`
51
+ *
52
+ * @returns A query builder selecting used blocks
53
+ */
54
+ createUsedBlocksQuery: () => SelectQueryBuilder<ObservationEntity>;
55
+ }
56
+ //# sourceMappingURL=abstractObservationExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abstractObservationExtractor.d.ts","sourceRoot":"","sources":["../../lib/extractor/abstractObservationExtractor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAGlE,8BAAsB,4BAA4B,CAChD,eAAe,CACf,SAAQ,iBAAiB,CAAC,eAAe,EAAE,iBAAiB,CAAC;IAC7D,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAC1C,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAC1C,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IACpC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,uBAAuB,CAAC;IACpD,SAAS,CAAC,SAAS,EAAE,0BAA0B,CAAC,eAAe,CAAC,CAAC;IACjE,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAGnC,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,QAAQ,EAChB,SAAS,EAAE,0BAA0B,CAAC,eAAe,CAAC,EACtD,MAAM,CAAC,EAAE,cAAc;IAazB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,MAAM,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,eAAe,KAAK,MAAM,CAAC;IAElD;;;;OAIG;IACH,SAAS,CAAC,sBAAsB,GAC9B,KAAK,KAAK,CAAC,eAAe,CAAC,EAC3B,OAAO,SAAS,uBACT;IAET;;;;;OAKG;IACH,mBAAmB,GACjB,KAAK,KAAK,CAAC,eAAe,CAAC,EAC3B,OAAO,SAAS,KACf,OAAO,CAAC,OAAO,CAAC,CA2BjB;IAEF;;;OAGG;IACH,SAAS,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC,CAE7C;IAEF;;;OAGG;IACH,cAAc,sBAEZ;IAEF;;;;;OAKG;IACH,qBAAqB,QAAO,kBAAkB,CAAC,iBAAiB,CAAC,CACd;CACpD"}
@@ -0,0 +1,80 @@
1
+ import { blake2b } from 'blakejs';
2
+ import { Buffer } from 'buffer';
3
+ import { AbstractExtractor } from '@rosen-bridge/abstract-extractor';
4
+ import { DummyLogger } from '@rosen-bridge/abstract-logger';
5
+ import { ObservationEntityAction } from '../actions/db';
6
+ export class AbstractObservationExtractor extends AbstractExtractor {
7
+ logger;
8
+ dataSource;
9
+ tokens;
10
+ actions;
11
+ extractor;
12
+ constructor(dataSource, tokens, extractor, logger) {
13
+ super();
14
+ this.dataSource = dataSource;
15
+ this.tokens = tokens;
16
+ this.logger = logger ? logger : new DummyLogger();
17
+ this.actions = new ObservationEntityAction(dataSource, this.logger.child('ObservationEntityAction'));
18
+ this.extractor = extractor;
19
+ }
20
+ /**
21
+ * manipulate transactions before processing
22
+ * @param txs
23
+ * @param block
24
+ */
25
+ preprocessTransactions = (txs, block) => txs;
26
+ /**
27
+ * gets block id and transactions corresponding to the block and saves if they are valid rosen
28
+ * transactions and in case of success return true and in case of failure returns false
29
+ * @param txs
30
+ * @param block
31
+ */
32
+ processTransactions = (txs, block) => {
33
+ const observations = [];
34
+ const filteredTxs = this.preprocessTransactions(txs, block);
35
+ filteredTxs.forEach((transaction) => {
36
+ const data = this.extractor.get(transaction);
37
+ if (data) {
38
+ const requestId = Buffer.from(blake2b(this.getTxId(transaction), undefined, 32)).toString('hex');
39
+ observations.push({
40
+ fromChain: this.FROM_CHAIN,
41
+ toChain: data.toChain,
42
+ amount: data.amount,
43
+ sourceChainTokenId: data.sourceChainTokenId,
44
+ targetChainTokenId: data.targetChainTokenId,
45
+ sourceTxId: data.sourceTxId,
46
+ bridgeFee: data.bridgeFee,
47
+ networkFee: data.networkFee,
48
+ sourceBlockId: block.hash,
49
+ requestId: requestId,
50
+ toAddress: data.toAddress,
51
+ fromAddress: data.fromAddress,
52
+ rawData: data.rawData,
53
+ });
54
+ }
55
+ });
56
+ return this.actions.storeObservations(observations, block, this.getId());
57
+ };
58
+ /**
59
+ * fork one block and remove all stored information for this block
60
+ * @param hash: block hash
61
+ */
62
+ forkBlock = async (hash) => {
63
+ await this.actions.deleteBlockObservation(hash, this.getId());
64
+ };
65
+ /**
66
+ * Extractor box initialization
67
+ * No action needed in observation extractors
68
+ */
69
+ initializeData = async () => {
70
+ return;
71
+ };
72
+ /**
73
+ * Builds a query that returns used blocks by selecting the `block` column from the `ObservationEntity` repository,
74
+ * filtered by the provided `extractorId`
75
+ *
76
+ * @returns A query builder selecting used blocks
77
+ */
78
+ createUsedBlocksQuery = () => this.actions.createUsedBlocksQuery(this.getId());
79
+ }
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RPYnNlcnZhdGlvbkV4dHJhY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9leHRyYWN0b3IvYWJzdHJhY3RPYnNlcnZhdGlvbkV4dHJhY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFaEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFrQixXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQU01RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJeEQsTUFBTSxPQUFnQiw0QkFFcEIsU0FBUSxpQkFBcUQ7SUFDMUMsTUFBTSxDQUFpQjtJQUN2QixVQUFVLENBQWE7SUFDdkIsTUFBTSxDQUFXO0lBQ2pCLE9BQU8sQ0FBMEI7SUFDMUMsU0FBUyxDQUE4QztJQUdqRSxZQUNFLFVBQXNCLEVBQ3RCLE1BQWdCLEVBQ2hCLFNBQXNELEVBQ3RELE1BQXVCO1FBRXZCLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksdUJBQXVCLENBQ3hDLFVBQVUsRUFDVixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUM3QyxDQUFDO1FBQ0YsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQVlEOzs7O09BSUc7SUFDTyxzQkFBc0IsR0FBRyxDQUNqQyxHQUEyQixFQUMzQixLQUFnQixFQUNoQixFQUFFLENBQUMsR0FBRyxDQUFDO0lBRVQ7Ozs7O09BS0c7SUFDSCxtQkFBbUIsR0FBRyxDQUNwQixHQUEyQixFQUMzQixLQUFnQixFQUNFLEVBQUU7UUFDcEIsTUFBTSxZQUFZLEdBQWdDLEVBQUUsQ0FBQztRQUNyRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVELFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUNsQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM3QyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNULE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQzNCLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FDbEQsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2xCLFlBQVksQ0FBQyxJQUFJLENBQUM7b0JBQ2hCLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVTtvQkFDMUIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO29CQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07b0JBQ25CLGtCQUFrQixFQUFFLElBQUksQ0FBQyxrQkFBa0I7b0JBQzNDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxrQkFBa0I7b0JBQzNDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtvQkFDM0IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO29CQUN6QixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7b0JBQzNCLGFBQWEsRUFBRSxLQUFLLENBQUMsSUFBSTtvQkFDekIsU0FBUyxFQUFFLFNBQVM7b0JBQ3BCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztvQkFDekIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO29CQUM3QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87aUJBQ3RCLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzNFLENBQUMsQ0FBQztJQUVGOzs7T0FHRztJQUNILFNBQVMsR0FBRyxLQUFLLEVBQUUsSUFBWSxFQUFpQixFQUFFO1FBQ2hELE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDaEUsQ0FBQyxDQUFDO0lBRUY7OztPQUdHO0lBQ0gsY0FBYyxHQUFHLEtBQUssSUFBSSxFQUFFO1FBQzFCLE9BQU87SUFDVCxDQUFDLENBQUM7SUFFRjs7Ozs7T0FLRztJQUNILHFCQUFxQixHQUFHLEdBQTBDLEVBQUUsQ0FDbEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztDQUNwRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJsYWtlMmIgfSBmcm9tICdibGFrZWpzJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5cbmltcG9ydCB7IEFic3RyYWN0RXh0cmFjdG9yIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1leHRyYWN0b3InO1xuaW1wb3J0IHsgQWJzdHJhY3RMb2dnZXIsIER1bW15TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSwgU2VsZWN0UXVlcnlCdWlsZGVyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9leHRlbmRlZC10eXBlb3JtJztcbmltcG9ydCB7IEFic3RyYWN0Um9zZW5EYXRhRXh0cmFjdG9yIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9yb3Nlbi1leHRyYWN0b3InO1xuaW1wb3J0IHsgQmxvY2tJbmZvIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyLWludGVyZmFjZXMnO1xuaW1wb3J0IHsgVG9rZW5NYXAgfSBmcm9tICdAcm9zZW4tYnJpZGdlL3Rva2Vucyc7XG5cbmltcG9ydCB7IE9ic2VydmF0aW9uRW50aXR5QWN0aW9uIH0gZnJvbSAnLi4vYWN0aW9ucy9kYic7XG5pbXBvcnQgeyBPYnNlcnZhdGlvbkVudGl0eSB9IGZyb20gJy4uL2VudGl0aWVzL29ic2VydmF0aW9uRW50aXR5JztcbmltcG9ydCB7IEV4dHJhY3RlZE9ic2VydmF0aW9uIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9leHRyYWN0ZWRPYnNlcnZhdGlvbic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ic2VydmF0aW9uRXh0cmFjdG9yPFxuICBUcmFuc2FjdGlvblR5cGUsXG4+IGV4dGVuZHMgQWJzdHJhY3RFeHRyYWN0b3I8VHJhbnNhY3Rpb25UeXBlLCBPYnNlcnZhdGlvbkVudGl0eT4ge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbG9nZ2VyOiBBYnN0cmFjdExvZ2dlcjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRhdGFTb3VyY2U6IERhdGFTb3VyY2U7XG4gIHByb3RlY3RlZCByZWFkb25seSB0b2tlbnM6IFRva2VuTWFwO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWN0aW9uczogT2JzZXJ2YXRpb25FbnRpdHlBY3Rpb247XG4gIHByb3RlY3RlZCBleHRyYWN0b3I6IEFic3RyYWN0Um9zZW5EYXRhRXh0cmFjdG9yPFRyYW5zYWN0aW9uVHlwZT47XG4gIGFic3RyYWN0IHJlYWRvbmx5IEZST01fQ0hBSU46IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBkYXRhU291cmNlOiBEYXRhU291cmNlLFxuICAgIHRva2VuczogVG9rZW5NYXAsXG4gICAgZXh0cmFjdG9yOiBBYnN0cmFjdFJvc2VuRGF0YUV4dHJhY3RvcjxUcmFuc2FjdGlvblR5cGU+LFxuICAgIGxvZ2dlcj86IEFic3RyYWN0TG9nZ2VyLFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7XG4gICAgdGhpcy50b2tlbnMgPSB0b2tlbnM7XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXIgPyBsb2dnZXIgOiBuZXcgRHVtbXlMb2dnZXIoKTtcbiAgICB0aGlzLmFjdGlvbnMgPSBuZXcgT2JzZXJ2YXRpb25FbnRpdHlBY3Rpb24oXG4gICAgICBkYXRhU291cmNlLFxuICAgICAgdGhpcy5sb2dnZXIuY2hpbGQoJ09ic2VydmF0aW9uRW50aXR5QWN0aW9uJyksXG4gICAgKTtcbiAgICB0aGlzLmV4dHJhY3RvciA9IGV4dHJhY3RvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXRzIElkIGZvciBjdXJyZW50IGV4dHJhY3RvclxuICAgKi9cbiAgYWJzdHJhY3QgZ2V0SWQ6ICgpID0+IHN0cmluZztcblxuICAvKipcbiAgICogZ2V0cyB0cmFuc2FjdGlvbiBpZCBmcm9tIFRyYW5zYWN0aW9uVHlwZVxuICAgKi9cbiAgYWJzdHJhY3QgZ2V0VHhJZDogKHR4OiBUcmFuc2FjdGlvblR5cGUpID0+IHN0cmluZztcblxuICAvKipcbiAgICogbWFuaXB1bGF0ZSB0cmFuc2FjdGlvbnMgYmVmb3JlIHByb2Nlc3NpbmdcbiAgICogQHBhcmFtIHR4c1xuICAgKiBAcGFyYW0gYmxvY2tcbiAgICovXG4gIHByb3RlY3RlZCBwcmVwcm9jZXNzVHJhbnNhY3Rpb25zID0gKFxuICAgIHR4czogQXJyYXk8VHJhbnNhY3Rpb25UeXBlPixcbiAgICBibG9jazogQmxvY2tJbmZvLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICApID0+IHR4cztcblxuICAvKipcbiAgICogZ2V0cyBibG9jayBpZCBhbmQgdHJhbnNhY3Rpb25zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJsb2NrIGFuZCBzYXZlcyBpZiB0aGV5IGFyZSB2YWxpZCByb3NlblxuICAgKiAgdHJhbnNhY3Rpb25zIGFuZCBpbiBjYXNlIG9mIHN1Y2Nlc3MgcmV0dXJuIHRydWUgYW5kIGluIGNhc2Ugb2YgZmFpbHVyZSByZXR1cm5zIGZhbHNlXG4gICAqIEBwYXJhbSB0eHNcbiAgICogQHBhcmFtIGJsb2NrXG4gICAqL1xuICBwcm9jZXNzVHJhbnNhY3Rpb25zID0gKFxuICAgIHR4czogQXJyYXk8VHJhbnNhY3Rpb25UeXBlPixcbiAgICBibG9jazogQmxvY2tJbmZvLFxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCBvYnNlcnZhdGlvbnM6IEFycmF5PEV4dHJhY3RlZE9ic2VydmF0aW9uPiA9IFtdO1xuICAgIGNvbnN0IGZpbHRlcmVkVHhzID0gdGhpcy5wcmVwcm9jZXNzVHJhbnNhY3Rpb25zKHR4cywgYmxvY2spO1xuICAgIGZpbHRlcmVkVHhzLmZvckVhY2goKHRyYW5zYWN0aW9uKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gdGhpcy5leHRyYWN0b3IuZ2V0KHRyYW5zYWN0aW9uKTtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IEJ1ZmZlci5mcm9tKFxuICAgICAgICAgIGJsYWtlMmIodGhpcy5nZXRUeElkKHRyYW5zYWN0aW9uKSwgdW5kZWZpbmVkLCAzMiksXG4gICAgICAgICkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgICBvYnNlcnZhdGlvbnMucHVzaCh7XG4gICAgICAgICAgZnJvbUNoYWluOiB0aGlzLkZST01fQ0hBSU4sXG4gICAgICAgICAgdG9DaGFpbjogZGF0YS50b0NoYWluLFxuICAgICAgICAgIGFtb3VudDogZGF0YS5hbW91bnQsXG4gICAgICAgICAgc291cmNlQ2hhaW5Ub2tlbklkOiBkYXRhLnNvdXJjZUNoYWluVG9rZW5JZCxcbiAgICAgICAgICB0YXJnZXRDaGFpblRva2VuSWQ6IGRhdGEudGFyZ2V0Q2hhaW5Ub2tlbklkLFxuICAgICAgICAgIHNvdXJjZVR4SWQ6IGRhdGEuc291cmNlVHhJZCxcbiAgICAgICAgICBicmlkZ2VGZWU6IGRhdGEuYnJpZGdlRmVlLFxuICAgICAgICAgIG5ldHdvcmtGZWU6IGRhdGEubmV0d29ya0ZlZSxcbiAgICAgICAgICBzb3VyY2VCbG9ja0lkOiBibG9jay5oYXNoLFxuICAgICAgICAgIHJlcXVlc3RJZDogcmVxdWVzdElkLFxuICAgICAgICAgIHRvQWRkcmVzczogZGF0YS50b0FkZHJlc3MsXG4gICAgICAgICAgZnJvbUFkZHJlc3M6IGRhdGEuZnJvbUFkZHJlc3MsXG4gICAgICAgICAgcmF3RGF0YTogZGF0YS5yYXdEYXRhLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5hY3Rpb25zLnN0b3JlT2JzZXJ2YXRpb25zKG9ic2VydmF0aW9ucywgYmxvY2ssIHRoaXMuZ2V0SWQoKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIGZvcmsgb25lIGJsb2NrIGFuZCByZW1vdmUgYWxsIHN0b3JlZCBpbmZvcm1hdGlvbiBmb3IgdGhpcyBibG9ja1xuICAgKiBAcGFyYW0gaGFzaDogYmxvY2sgaGFzaFxuICAgKi9cbiAgZm9ya0Jsb2NrID0gYXN5bmMgKGhhc2g6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGF3YWl0IHRoaXMuYWN0aW9ucy5kZWxldGVCbG9ja09ic2VydmF0aW9uKGhhc2gsIHRoaXMuZ2V0SWQoKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RvciBib3ggaW5pdGlhbGl6YXRpb25cbiAgICogTm8gYWN0aW9uIG5lZWRlZCBpbiBvYnNlcnZhdGlvbiBleHRyYWN0b3JzXG4gICAqL1xuICBpbml0aWFsaXplRGF0YSA9IGFzeW5jICgpID0+IHtcbiAgICByZXR1cm47XG4gIH07XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHF1ZXJ5IHRoYXQgcmV0dXJucyB1c2VkIGJsb2NrcyBieSBzZWxlY3RpbmcgdGhlIGBibG9ja2AgY29sdW1uIGZyb20gdGhlIGBPYnNlcnZhdGlvbkVudGl0eWAgcmVwb3NpdG9yeSxcbiAgICogZmlsdGVyZWQgYnkgdGhlIHByb3ZpZGVkIGBleHRyYWN0b3JJZGBcbiAgICpcbiAgICogQHJldHVybnMgQSBxdWVyeSBidWlsZGVyIHNlbGVjdGluZyB1c2VkIGJsb2Nrc1xuICAgKi9cbiAgY3JlYXRlVXNlZEJsb2Nrc1F1ZXJ5ID0gKCk6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxPYnNlcnZhdGlvbkVudGl0eT4gPT5cbiAgICB0aGlzLmFjdGlvbnMuY3JlYXRlVXNlZEJsb2Nrc1F1ZXJ5KHRoaXMuZ2V0SWQoKSk7XG59XG4iXX0=