@rosen-bridge/watcher-data-extractor 13.0.7 → 14.0.0-d7a97532

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 CHANGED
@@ -1,5 +1,12 @@
1
1
  # @rosen-bridge/watcher-data-extractor
2
2
 
3
+ ## 14.0.0-d7a97532
4
+
5
+ ### Major Changes
6
+
7
+ - Refactor Permit Extractor:
8
+ - Refactor the PermitExtractor to inherit from `AbstractBoxExtractor` and implement an initialize option to support flexible setup
9
+
3
10
  ## 13.0.7
4
11
 
5
12
  ### Patch Changes
@@ -1,73 +1,25 @@
1
+ import { AbstractErgoBoxAction } from '@rosen-bridge/abstract-extractor';
1
2
  import { AbstractLogger } from '@rosen-bridge/abstract-logger';
2
- import { DataSource, SelectQueryBuilder } from '@rosen-bridge/extended-typeorm';
3
+ import { DataSource } from '@rosen-bridge/extended-typeorm';
3
4
  import { BlockInfo } from '@rosen-bridge/scanner-interfaces';
4
5
  import PermitEntity from '../entities/permitEntity';
5
6
  import { ExtractedPermit } from '../interfaces/extractedPermit';
6
- declare class PermitAction {
7
- readonly logger: AbstractLogger;
8
- private readonly datasource;
9
- private readonly permitRepository;
7
+ declare class PermitAction extends AbstractErgoBoxAction<ExtractedPermit, PermitEntity> {
10
8
  constructor(dataSource: DataSource, logger?: AbstractLogger);
11
9
  /**
12
- * insert a new permit boxes in the database
10
+ * Creates the permit entity from extracted data and block information
13
11
  * @param permits
14
- * @param initialHeight
15
- * @param extractor
16
- */
17
- insertPermit: (permit: ExtractedPermit, extractor: string) => Promise<import("@rosen-bridge/extended-typeorm").InsertResult>;
18
- /**
19
- * update an unspent permit in the database
20
- * @param permit
21
- * @param extractor
22
- */
23
- updatePermit: (permit: ExtractedPermit, extractor: string) => Promise<void>;
24
- /**
25
- * It stores list of permits in the dataSource with block id
26
- * @param permits
27
- * @param block
28
- * @param extractor
29
- */
30
- storePermits: (permits: Array<ExtractedPermit>, block: BlockInfo, extractor: string) => Promise<boolean>;
31
- /**
32
- * Update spendBlock and spendHeight of permits spent on the block
33
- * @param spendId
34
12
  * @param block
35
13
  * @param extractor
14
+ * @returns the permit entities (without the id)
36
15
  */
37
- spendPermits: (spendId: Array<string>, block: BlockInfo, extractor: string) => Promise<void>;
38
- /**
39
- * Delete all permits corresponding to the block(id) and extractor(id)
40
- * and update all permits spent on the specified block
41
- * @param block
42
- * @param extractor
43
- */
44
- deleteBlock: (block: string, extractor: string) => Promise<void>;
45
- /**
46
- * Returns all stored permit box ids
47
- */
48
- getAllPermitBoxIds: (extractor: string) => Promise<Array<string>>;
49
- /**
50
- * Removes specified permit
51
- * @param boxId
52
- * @param extractor
53
- */
54
- removePermit: (boxId: string, extractor: string) => Promise<import("@rosen-bridge/extended-typeorm").DeleteResult>;
55
- /**
56
- * Update the permit spending information
57
- * @param boxId
58
- * @param extractor
59
- * @param blockId
60
- * @param blockHeight
61
- */
62
- updateSpendBlock: (boxId: string, extractor: string, blockId: string, blockHeight: number) => Promise<import("@rosen-bridge/extended-typeorm").UpdateResult>;
16
+ protected createEntity: (permits: ExtractedPermit[], block: BlockInfo, extractor: string) => Array<Omit<PermitEntity, "id">>;
63
17
  /**
64
- * Builds a query that returns used blocks by selecting the `block` column from the `PermitEntity` repository,
65
- * filtered by the provided `extractorId`
66
- *
67
- * @param extractorId - Identifier of the extractor
68
- * @returns A query builder selecting used blocks
18
+ * convert the database entity back to raw data
19
+ * @param entities
20
+ * @returns the extracted collateral data
69
21
  */
70
- createUsedBlocksQuery: (extractorId: string) => SelectQueryBuilder<PermitEntity>;
22
+ protected convertEntityToData: (entities: PermitEntity[]) => ExtractedPermit[];
71
23
  }
72
24
  export default PermitAction;
73
25
  //# sourceMappingURL=permitAction.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"permitAction.d.ts","sourceRoot":"","sources":["../../lib/actions/permitAction.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EACL,UAAU,EAGV,kBAAkB,EACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAG7D,OAAO,YAAY,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,cAAM,YAAY;IAChB,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA2B;gBAEhD,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,cAAc;IAM3D;;;;;OAKG;IACH,YAAY,GAAU,QAAQ,eAAe,EAAE,WAAW,MAAM,oEAY9D;IAEF;;;;OAIG;IACH,YAAY,GAAU,QAAQ,eAAe,EAAE,WAAW,MAAM,mBAa9D;IAEF;;;;;OAKG;IACH,YAAY,GACV,SAAS,KAAK,CAAC,eAAe,CAAC,EAC/B,OAAO,SAAS,EAChB,WAAW,MAAM,sBAiDjB;IAEF;;;;;OAKG;IACH,YAAY,GACV,SAAS,KAAK,CAAC,MAAM,CAAC,EACtB,OAAO,SAAS,EAChB,WAAW,MAAM,KAChB,OAAO,CAAC,IAAI,CAAC,CAoBd;IAEF;;;;;OAKG;IACH,WAAW,GAAU,OAAO,MAAM,EAAE,WAAW,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC,CASnE;IAEF;;OAEG;IACH,kBAAkB,GAAU,WAAW,MAAM,KAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAUpE;IAEF;;;;OAIG;IACH,YAAY,GAAU,OAAO,MAAM,EAAE,WAAW,MAAM,oEAKpD;IAEF;;;;;;OAMG;IACH,gBAAgB,GACd,OAAO,MAAM,EACb,WAAW,MAAM,EACjB,SAAS,MAAM,EACf,aAAa,MAAM,oEAMnB;IAEF;;;;;;OAMG;IACH,qBAAqB,GACnB,aAAa,MAAM,KAClB,kBAAkB,CAAC,YAAY,CAAC,CAKjC;CACH;AAED,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"permitAction.d.ts","sourceRoot":"","sources":["../../lib/actions/permitAction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAE7D,OAAO,YAAY,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,cAAM,YAAa,SAAQ,qBAAqB,CAC9C,eAAe,EACf,YAAY,CACb;gBACa,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,cAAc;IAI3D;;;;;;OAMG;IACH,SAAS,CAAC,YAAY,GACpB,SAAS,eAAe,EAAE,EAC1B,OAAO,SAAS,EAChB,WAAW,MAAM,KAChB,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAUhC;IAEF;;;;OAIG;IACH,SAAS,CAAC,mBAAmB,GAC3B,UAAU,YAAY,EAAE,KACvB,eAAe,EAAE,CAElB;CACH;AAED,eAAe,YAAY,CAAC"}
@@ -1,187 +1,35 @@
1
- import { chunk } from 'lodash-es';
2
- import { DummyLogger } from '@rosen-bridge/abstract-logger';
3
- import { In, } from '@rosen-bridge/extended-typeorm';
4
- import { dbIdChunkSize } from '../constants';
1
+ import { AbstractErgoBoxAction } from '@rosen-bridge/abstract-extractor';
5
2
  import PermitEntity from '../entities/permitEntity';
6
- class PermitAction {
7
- logger;
8
- datasource;
9
- permitRepository;
3
+ class PermitAction extends AbstractErgoBoxAction {
10
4
  constructor(dataSource, logger) {
11
- this.datasource = dataSource;
12
- this.logger = logger ? logger : new DummyLogger();
13
- this.permitRepository = dataSource.getRepository(PermitEntity);
5
+ super(dataSource, PermitEntity, logger);
14
6
  }
15
7
  /**
16
- * insert a new permit boxes in the database
8
+ * Creates the permit entity from extracted data and block information
17
9
  * @param permits
18
- * @param initialHeight
19
- * @param extractor
20
- */
21
- insertPermit = async (permit, extractor) => {
22
- return this.permitRepository.insert({
23
- boxId: permit.boxId,
24
- boxSerialized: permit.boxSerialized,
25
- block: permit.block,
26
- height: permit.height,
27
- extractor: extractor,
28
- WID: permit.WID,
29
- txId: permit.txId,
30
- spendBlock: permit.spendBlock,
31
- spendHeight: permit.spendHeight,
32
- });
33
- };
34
- /**
35
- * update an unspent permit in the database
36
- * @param permit
37
- * @param extractor
38
- */
39
- updatePermit = async (permit, extractor) => {
40
- await this.permitRepository.update({ boxId: permit.boxId, extractor: extractor }, {
41
- boxSerialized: permit.boxSerialized,
42
- block: permit.block,
43
- height: permit.height,
44
- WID: permit.WID,
45
- txId: permit.txId,
46
- spendBlock: null,
47
- spendHeight: null,
48
- });
49
- };
50
- /**
51
- * It stores list of permits in the dataSource with block id
52
- * @param permits
53
- * @param block
54
- * @param extractor
55
- */
56
- storePermits = async (permits, block, extractor) => {
57
- if (permits.length === 0)
58
- return true;
59
- const boxIds = permits.map((permit) => permit.boxId);
60
- const savedPermits = await this.permitRepository.findBy({
61
- boxId: In(boxIds),
62
- extractor: extractor,
63
- });
64
- let success = true;
65
- const queryRunner = this.datasource.createQueryRunner();
66
- await queryRunner.connect();
67
- await queryRunner.startTransaction();
68
- const repository = await queryRunner.manager.getRepository(PermitEntity);
69
- try {
70
- for (const permit of permits) {
71
- const saved = savedPermits.some((entity) => {
72
- return entity.boxId === permit.boxId;
73
- });
74
- const entity = {
75
- boxId: permit.boxId,
76
- boxSerialized: permit.boxSerialized,
77
- block: block.hash,
78
- height: block.height,
79
- extractor: extractor,
80
- WID: permit.WID,
81
- txId: permit.txId,
82
- };
83
- if (!saved) {
84
- this.logger.debug(`Saving permit [${permit.boxId}] belonging to watcher [${permit.WID}] at height ${block.height} and extractor ${extractor}`);
85
- await repository.insert(entity);
86
- }
87
- else {
88
- this.logger.debug(`Updating permit [${permit.boxId}] belonging to watcher [${permit.WID}] at height ${block.height} and extractor ${extractor}`);
89
- await repository.update({ boxId: permit.boxId }, entity);
90
- }
91
- this.logger.debug(`Entity: ${JSON.stringify(entity)}`);
92
- }
93
- await queryRunner.commitTransaction();
94
- }
95
- catch (e) {
96
- this.logger.error(`An error occurred during store permit action: ${e}`);
97
- await queryRunner.rollbackTransaction();
98
- success = false;
99
- }
100
- finally {
101
- await queryRunner.release();
102
- }
103
- return success;
104
- };
105
- /**
106
- * Update spendBlock and spendHeight of permits spent on the block
107
- * @param spendId
108
- * @param block
109
- * @param extractor
110
- */
111
- spendPermits = async (spendId, block, extractor) => {
112
- const spendIdChunks = chunk(spendId, dbIdChunkSize);
113
- for (const spendIdChunk of spendIdChunks) {
114
- const updateResult = await this.permitRepository.update({ boxId: In(spendIdChunk), extractor: extractor }, { spendBlock: block.hash, spendHeight: block.height });
115
- if (updateResult.affected && updateResult.affected > 0) {
116
- const spentRows = await this.permitRepository.findBy({
117
- boxId: In(spendIdChunk),
118
- spendBlock: block.hash,
119
- });
120
- for (const row of spentRows) {
121
- this.logger.debug(`Spent permit with boxId [${row.boxId}] belonging to watcher with WID [${row.WID}] at height ${block.height}`);
122
- }
123
- }
124
- }
125
- };
126
- /**
127
- * Delete all permits corresponding to the block(id) and extractor(id)
128
- * and update all permits spent on the specified block
129
10
  * @param block
130
11
  * @param extractor
131
- */
132
- deleteBlock = async (block, extractor) => {
133
- this.logger.info(`Deleting permits at block ${block} and extractor ${extractor}`);
134
- await this.permitRepository.delete({ block: block, extractor: extractor });
135
- await this.permitRepository.update({ spendBlock: block, extractor: extractor }, { spendBlock: null, spendHeight: null });
136
- };
137
- /**
138
- * Returns all stored permit box ids
139
- */
140
- getAllPermitBoxIds = async (extractor) => {
141
- const boxIds = await this.permitRepository.find({
142
- where: {
143
- extractor: extractor,
144
- },
145
- select: {
146
- boxId: true,
147
- },
148
- });
149
- return boxIds.map((item) => item.boxId);
150
- };
151
- /**
152
- * Removes specified permit
153
- * @param boxId
154
- * @param extractor
155
- */
156
- removePermit = async (boxId, extractor) => {
157
- return await this.permitRepository.delete({
158
- boxId: boxId,
159
- extractor: extractor,
160
- });
161
- };
162
- /**
163
- * Update the permit spending information
164
- * @param boxId
165
- * @param extractor
166
- * @param blockId
167
- * @param blockHeight
168
- */
169
- updateSpendBlock = async (boxId, extractor, blockId, blockHeight) => {
170
- return await this.permitRepository.update({ boxId: boxId, extractor: extractor }, { spendBlock: blockId, spendHeight: blockHeight });
12
+ * @returns the permit entities (without the id)
13
+ */
14
+ createEntity = (permits, block, extractor) => {
15
+ return permits.map((permit) => ({
16
+ ...permit,
17
+ block: block.hash,
18
+ height: block.height,
19
+ extractor,
20
+ WID: permit.WID,
21
+ spendBlock: permit.spendBlock ?? null,
22
+ spendHeight: permit.spendHeight ?? null,
23
+ }));
171
24
  };
172
25
  /**
173
- * Builds a query that returns used blocks by selecting the `block` column from the `PermitEntity` repository,
174
- * filtered by the provided `extractorId`
175
- *
176
- * @param extractorId - Identifier of the extractor
177
- * @returns A query builder selecting used blocks
26
+ * convert the database entity back to raw data
27
+ * @param entities
28
+ * @returns the extracted collateral data
178
29
  */
179
- createUsedBlocksQuery = (extractorId) => {
180
- return this.permitRepository
181
- .createQueryBuilder('permitEntity')
182
- .select('permitEntity.block', 'block')
183
- .where('permitEntity.extractor = :extractorId', { extractorId });
30
+ convertEntityToData = (entities) => {
31
+ return entities;
184
32
  };
185
33
  }
186
34
  export default PermitAction;
187
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWl0QWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2FjdGlvbnMvcGVybWl0QWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFbEMsT0FBTyxFQUFrQixXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RSxPQUFPLEVBRUwsRUFBRSxHQUdILE1BQU0sZ0NBQWdDLENBQUM7QUFHeEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUdwRCxNQUFNLFlBQVk7SUFDUCxNQUFNLENBQWlCO0lBQ2YsVUFBVSxDQUFhO0lBQ3ZCLGdCQUFnQixDQUEyQjtJQUU1RCxZQUFZLFVBQXNCLEVBQUUsTUFBdUI7UUFDekQsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxZQUFZLEdBQUcsS0FBSyxFQUFFLE1BQXVCLEVBQUUsU0FBaUIsRUFBRSxFQUFFO1FBQ2xFLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQztZQUNsQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7WUFDbkIsYUFBYSxFQUFFLE1BQU0sQ0FBQyxhQUFhO1lBQ25DLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztZQUNuQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07WUFDckIsU0FBUyxFQUFFLFNBQVM7WUFDcEIsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFH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QzthQUNyQyxLQUFLLENBQUMsdUNBQXVDLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLENBQUMsQ0FBQztDQUNIO0FBRUQsZUFBZSxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjaHVuayB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbmltcG9ydCB7IEFic3RyYWN0TG9nZ2VyLCBEdW1teUxvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcbmltcG9ydCB7XG4gIERhdGFTb3VyY2UsXG4gIEluLFxuICBSZXBvc2l0b3J5LFxuICBTZWxlY3RRdWVyeUJ1aWxkZXIsXG59IGZyb20gJ0Byb3Nlbi1icmlkZ2UvZXh0ZW5kZWQtdHlwZW9ybSc7XG5pbXBvcnQgeyBCbG9ja0luZm8gfSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7IGRiSWRDaHVua1NpemUgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IFBlcm1pdEVudGl0eSBmcm9tICcuLi9lbnRpdGllcy9wZXJtaXRFbnRpdHknO1xuaW1wb3J0IHsgRXh0cmFjdGVkUGVybWl0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9leHRyYWN0ZWRQZXJtaXQnO1xuXG5jbGFzcyBQZXJtaXRBY3Rpb24ge1xuICByZWFkb25seSBsb2dnZXI6IEFic3RyYWN0TG9nZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFzb3VyY2U6IERhdGFTb3VyY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVybWl0UmVwb3NpdG9yeTogUmVwb3NpdG9yeTxQZXJtaXRFbnRpdHk+O1xuXG4gIGNvbnN0cnVjdG9yKGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsIGxvZ2dlcj86IEFic3RyYWN0TG9nZ2VyKSB7XG4gICAgdGhpcy5kYXRhc291cmNlID0gZGF0YVNvdXJjZTtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlciA/IGxvZ2dlciA6IG5ldyBEdW1teUxvZ2dlcigpO1xuICAgIHRoaXMucGVybWl0UmVwb3NpdG9yeSA9IGRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShQZXJtaXRFbnRpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIGluc2VydCBhIG5ldyBwZXJtaXQgYm94ZXMgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBwYXJhbSBwZXJtaXRzXG4gICAqIEBwYXJhbSBpbml0aWFsSGVpZ2h0XG4gICAqIEBwYXJhbSBleHRyYWN0b3JcbiAgICovXG4gIGluc2VydFBlcm1pdCA9IGFzeW5jIChwZXJtaXQ6IEV4dHJhY3RlZFBlcm1pdCwgZXh0cmFjdG9yOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gdGhpcy5wZXJtaXRSZXBvc2l0b3J5Lmluc2VydCh7XG4gICAgICBib3hJZDogcGVybWl0LmJveElkLFxuICAgICAgYm94U2VyaWFsaXplZDogcGVybWl0LmJveFNlcmlhbGl6ZWQsXG4gICAgICBibG9jazogcGVybWl0LmJsb2NrLFxuICAgICAgaGVpZ2h0OiBwZXJtaXQuaGVpZ2h0LFxuICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgICBXSUQ6IHBlcm1pdC5XSUQsXG4gICAgICB0eElkOiBwZXJtaXQudHhJZCxcbiAgICAgIHNwZW5kQmxvY2s6IHBlcm1pdC5zcGVuZEJsb2NrLFxuICAgICAgc3BlbmRIZWlnaHQ6IHBlcm1pdC5zcGVuZEhlaWdodCxcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogdXBkYXRlIGFuIHVuc3BlbnQgcGVybWl0IGluIHRoZSBkYXRhYmFzZVxuICAgKiBAcGFyYW0gcGVybWl0XG4gICAqIEBwYXJhbSBleHRyYWN0b3JcbiAgICovXG4gIHVwZGF0ZVBlcm1pdCA9IGFzeW5jIChwZXJtaXQ6IEV4dHJhY3RlZFBlcm1pdCwgZXh0cmFjdG9yOiBzdHJpbmcpID0+IHtcbiAgICBhd2FpdCB0aGlzLnBlcm1pdFJlcG9zaXRvcnkudXBkYXRlKFxuICAgICAgeyBib3hJZDogcGVybWl0LmJveElkLCBleHRyYWN0b3I6IGV4dHJhY3RvciB9LFxuICAgICAge1xuICAgICAgICBib3hTZXJpYWxpemVkOiBwZXJtaXQuYm94U2VyaWFsaXplZCxcbiAgICAgICAgYmxvY2s6IHBlcm1pdC5ibG9jayxcbiAgICAgICAgaGVpZ2h0OiBwZXJtaXQuaGVpZ2h0LFxuICAgICAgICBXSUQ6IHBlcm1pdC5XSUQsXG4gICAgICAgIHR4SWQ6IHBlcm1pdC50eElkLFxuICAgICAgICBzcGVuZEJsb2NrOiBudWxsLFxuICAgICAgICBzcGVuZEhlaWdodDogbnVsbCxcbiAgICAgIH0sXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogSXQgc3RvcmVzIGxpc3Qgb2YgcGVybWl0cyBpbiB0aGUgZGF0YVNvdXJjZSB3aXRoIGJsb2NrIGlkXG4gICAqIEBwYXJhbSBwZXJtaXRzXG4gICAqIEBwYXJhbSBibG9ja1xuICAgKiBAcGFyYW0gZXh0cmFjdG9yXG4gICAqL1xuICBzdG9yZVBlcm1pdHMgPSBhc3luYyAoXG4gICAgcGVybWl0czogQXJyYXk8RXh0cmFjdGVkUGVybWl0PixcbiAgICBibG9jazogQmxvY2tJbmZvLFxuICAgIGV4dHJhY3Rvcjogc3RyaW5nLFxuICApID0+IHtcbiAgICBpZiAocGVybWl0cy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGJveElkcyA9IHBlcm1pdHMubWFwKChwZXJtaXQpID0+IHBlcm1pdC5ib3hJZCk7XG4gICAgY29uc3Qgc2F2ZWRQZXJtaXRzID0gYXdhaXQgdGhpcy5wZXJtaXRSZXBvc2l0b3J5LmZpbmRCeSh7XG4gICAgICBib3hJZDogSW4oYm94SWRzKSxcbiAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgIH0pO1xuICAgIGxldCBzdWNjZXNzID0gdHJ1ZTtcbiAgICBjb25zdCBxdWVyeVJ1bm5lciA9IHRoaXMuZGF0YXNvdXJjZS5jcmVhdGVRdWVyeVJ1bm5lcigpO1xuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbm5lY3QoKTtcbiAgICBhd2FpdCBxdWVyeVJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCk7XG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IGF3YWl0IHF1ZXJ5UnVubmVyLm1hbmFnZXIuZ2V0UmVwb3NpdG9yeShQZXJtaXRFbnRpdHkpO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IHBlcm1pdCBvZiBwZXJtaXRzKSB7XG4gICAgICAgIGNvbnN0IHNhdmVkID0gc2F2ZWRQZXJtaXRzLnNvbWUoKGVudGl0eSkgPT4ge1xuICAgICAgICAgIHJldHVybiBlbnRpdHkuYm94SWQgPT09IHBlcm1pdC5ib3hJZDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGVudGl0eSA9IHtcbiAgICAgICAgICBib3hJZDogcGVybWl0LmJveElkLFxuICAgICAgICAgIGJveFNlcmlhbGl6ZWQ6IHBlcm1pdC5ib3hTZXJpYWxpemVkLFxuICAgICAgICAgIGJsb2NrOiBibG9jay5oYXNoLFxuICAgICAgICAgIGhlaWdodDogYmxvY2suaGVpZ2h0LFxuICAgICAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgICAgICAgIFdJRDogcGVybWl0LldJRCxcbiAgICAgICAgICB0eElkOiBwZXJtaXQudHhJZCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKCFzYXZlZCkge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFNhdmluZyBwZXJtaXQgWyR7cGVybWl0LmJveElkfV0gYmVsb25naW5nIHRvIHdhdGNoZXIgWyR7cGVybWl0LldJRH1dIGF0IGhlaWdodCAke2Jsb2NrLmhlaWdodH0gYW5kIGV4dHJhY3RvciAke2V4dHJhY3Rvcn1gLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgcmVwb3NpdG9yeS5pbnNlcnQoZW50aXR5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBVcGRhdGluZyBwZXJtaXQgWyR7cGVybWl0LmJveElkfV0gYmVsb25naW5nIHRvIHdhdGNoZXIgWyR7cGVybWl0LldJRH1dIGF0IGhlaWdodCAke2Jsb2NrLmhlaWdodH0gYW5kIGV4dHJhY3RvciAke2V4dHJhY3Rvcn1gLFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgcmVwb3NpdG9yeS51cGRhdGUoeyBib3hJZDogcGVybWl0LmJveElkIH0sIGVudGl0eSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYEVudGl0eTogJHtKU09OLnN0cmluZ2lmeShlbnRpdHkpfWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihgQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHN0b3JlIHBlcm1pdCBhY3Rpb246ICR7ZX1gKTtcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKTtcbiAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucmVsZWFzZSgpO1xuICAgIH1cbiAgICByZXR1cm4gc3VjY2VzcztcbiAgfTtcblxuICAvKipcbiAgICogVXBkYXRlIHNwZW5kQmxvY2sgYW5kIHNwZW5kSGVpZ2h0IG9mIHBlcm1pdHMgc3BlbnQgb24gdGhlIGJsb2NrXG4gICAqIEBwYXJhbSBzcGVuZElkXG4gICAqIEBwYXJhbSBibG9ja1xuICAgKiBAcGFyYW0gZXh0cmFjdG9yXG4gICAqL1xuICBzcGVuZFBlcm1pdHMgPSBhc3luYyAoXG4gICAgc3BlbmRJZDogQXJyYXk8c3RyaW5nPixcbiAgICBibG9jazogQmxvY2tJbmZvLFxuICAgIGV4dHJhY3Rvcjogc3RyaW5nLFxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBzcGVuZElkQ2h1bmtzID0gY2h1bmsoc3BlbmRJZCwgZGJJZENodW5rU2l6ZSk7XG4gICAgZm9yIChjb25zdCBzcGVuZElkQ2h1bmsgb2Ygc3BlbmRJZENodW5rcykge1xuICAgICAgY29uc3QgdXBkYXRlUmVzdWx0ID0gYXdhaXQgdGhpcy5wZXJtaXRSZXBvc2l0b3J5LnVwZGF0ZShcbiAgICAgICAgeyBib3hJZDogSW4oc3BlbmRJZENodW5rKSwgZXh0cmFjdG9yOiBleHRyYWN0b3IgfSxcbiAgICAgICAgeyBzcGVuZEJsb2NrOiBibG9jay5oYXNoLCBzcGVuZEhlaWdodDogYmxvY2suaGVpZ2h0IH0sXG4gICAgICApO1xuXG4gICAgICBpZiAodXBkYXRlUmVzdWx0LmFmZmVjdGVkICYmIHVwZGF0ZVJlc3VsdC5hZmZlY3RlZCA+IDApIHtcbiAgICAgICAgY29uc3Qgc3BlbnRSb3dzID0gYXdhaXQgdGhpcy5wZXJtaXRSZXBvc2l0b3J5LmZpbmRCeSh7XG4gICAgICAgICAgYm94SWQ6IEluKHNwZW5kSWRDaHVuayksXG4gICAgICAgICAgc3BlbmRCbG9jazogYmxvY2suaGFzaCxcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHNwZW50Um93cykge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFNwZW50IHBlcm1pdCB3aXRoIGJveElkIFske3Jvdy5ib3hJZH1dIGJlbG9uZ2luZyB0byB3YXRjaGVyIHdpdGggV0lEIFske3Jvdy5XSUR9XSBhdCBoZWlnaHQgJHtibG9jay5oZWlnaHR9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBEZWxldGUgYWxsIHBlcm1pdHMgY29ycmVzcG9uZGluZyB0byB0aGUgYmxvY2soaWQpIGFuZCBleHRyYWN0b3IoaWQpXG4gICAqIGFuZCB1cGRhdGUgYWxsIHBlcm1pdHMgc3BlbnQgb24gdGhlIHNwZWNpZmllZCBibG9ja1xuICAgKiBAcGFyYW0gYmxvY2tcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKi9cbiAgZGVsZXRlQmxvY2sgPSBhc3luYyAoYmxvY2s6IHN0cmluZywgZXh0cmFjdG9yOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgYERlbGV0aW5nIHBlcm1pdHMgYXQgYmxvY2sgJHtibG9ja30gYW5kIGV4dHJhY3RvciAke2V4dHJhY3Rvcn1gLFxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5wZXJtaXRSZXBvc2l0b3J5LmRlbGV0ZSh7IGJsb2NrOiBibG9jaywgZXh0cmFjdG9yOiBleHRyYWN0b3IgfSk7XG4gICAgYXdhaXQgdGhpcy5wZXJtaXRSZXBvc2l0b3J5LnVwZGF0ZShcbiAgICAgIHsgc3BlbmRCbG9jazogYmxvY2ssIGV4dHJhY3RvcjogZXh0cmFjdG9yIH0sXG4gICAgICB7IHNwZW5kQmxvY2s6IG51bGwsIHNwZW5kSGVpZ2h0OiBudWxsIH0sXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogIFJldHVybnMgYWxsIHN0b3JlZCBwZXJtaXQgYm94IGlkc1xuICAgKi9cbiAgZ2V0QWxsUGVybWl0Qm94SWRzID0gYXN5bmMgKGV4dHJhY3Rvcjogc3RyaW5nKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiA9PiB7XG4gICAgY29uc3QgYm94SWRzID0gYXdhaXQgdGhpcy5wZXJtaXRSZXBvc2l0b3J5LmZpbmQoe1xuICAgICAgd2hlcmU6IHtcbiAgICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgICB9LFxuICAgICAgc2VsZWN0OiB7XG4gICAgICAgIGJveElkOiB0cnVlLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gYm94SWRzLm1hcCgoaXRlbTogeyBib3hJZDogc3RyaW5nIH0pID0+IGl0ZW0uYm94SWQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHNwZWNpZmllZCBwZXJtaXRcbiAgICogQHBhcmFtIGJveElkXG4gICAqIEBwYXJhbSBleHRyYWN0b3JcbiAgICovXG4gIHJlbW92ZVBlcm1pdCA9IGFzeW5jIChib3hJZDogc3RyaW5nLCBleHRyYWN0b3I6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnBlcm1pdFJlcG9zaXRvcnkuZGVsZXRlKHtcbiAgICAgIGJveElkOiBib3hJZCxcbiAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIHBlcm1pdCBzcGVuZGluZyBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0gYm94SWRcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKiBAcGFyYW0gYmxvY2tJZFxuICAgKiBAcGFyYW0gYmxvY2tIZWlnaHRcbiAgICovXG4gIHVwZGF0ZVNwZW5kQmxvY2sgPSBhc3luYyAoXG4gICAgYm94SWQ6IHN0cmluZyxcbiAgICBleHRyYWN0b3I6IHN0cmluZyxcbiAgICBibG9ja0lkOiBzdHJpbmcsXG4gICAgYmxvY2tIZWlnaHQ6IG51bWJlcixcbiAgKSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucGVybWl0UmVwb3NpdG9yeS51cGRhdGUoXG4gICAgICB7IGJveElkOiBib3hJZCwgZXh0cmFjdG9yOiBleHRyYWN0b3IgfSxcbiAgICAgIHsgc3BlbmRCbG9jazogYmxvY2tJZCwgc3BlbmRIZWlnaHQ6IGJsb2NrSGVpZ2h0IH0sXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogQnVpbGRzIGEgcXVlcnkgdGhhdCByZXR1cm5zIHVzZWQgYmxvY2tzIGJ5IHNlbGVjdGluZyB0aGUgYGJsb2NrYCBjb2x1bW4gZnJvbSB0aGUgYFBlcm1pdEVudGl0eWAgcmVwb3NpdG9yeSxcbiAgICogZmlsdGVyZWQgYnkgdGhlIHByb3ZpZGVkIGBleHRyYWN0b3JJZGBcbiAgICpcbiAgICogQHBhcmFtIGV4dHJhY3RvcklkIC0gSWRlbnRpZmllciBvZiB0aGUgZXh0cmFjdG9yXG4gICAqIEByZXR1cm5zIEEgcXVlcnkgYnVpbGRlciBzZWxlY3RpbmcgdXNlZCBibG9ja3NcbiAgICovXG4gIGNyZWF0ZVVzZWRCbG9ja3NRdWVyeSA9IChcbiAgICBleHRyYWN0b3JJZDogc3RyaW5nLFxuICApOiBTZWxlY3RRdWVyeUJ1aWxkZXI8UGVybWl0RW50aXR5PiA9PiB7XG4gICAgcmV0dXJuIHRoaXMucGVybWl0UmVwb3NpdG9yeVxuICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigncGVybWl0RW50aXR5JylcbiAgICAgIC5zZWxlY3QoJ3Blcm1pdEVudGl0eS5ibG9jaycsICdibG9jaycpXG4gICAgICAud2hlcmUoJ3Blcm1pdEVudGl0eS5leHRyYWN0b3IgPSA6ZXh0cmFjdG9ySWQnLCB7IGV4dHJhY3RvcklkIH0pO1xuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBQZXJtaXRBY3Rpb247XG4iXX0=
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWl0QWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2FjdGlvbnMvcGVybWl0QWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBS3pFLE9BQU8sWUFBWSxNQUFNLDBCQUEwQixDQUFDO0FBR3BELE1BQU0sWUFBYSxTQUFRLHFCQUcxQjtJQUNDLFlBQVksVUFBc0IsRUFBRSxNQUF1QjtRQUN6RCxLQUFLLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ08sWUFBWSxHQUFHLENBQ3ZCLE9BQTBCLEVBQzFCLEtBQWdCLEVBQ2hCLFNBQWlCLEVBQ2dCLEVBQUU7UUFDbkMsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzlCLEdBQUcsTUFBTTtZQUNULEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSTtZQUNqQixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07WUFDcEIsU0FBUztZQUNULEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRztZQUNmLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLElBQUk7WUFDckMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLElBQUksSUFBSTtTQUN4QyxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUMsQ0FBQztJQUVGOzs7O09BSUc7SUFDTyxtQkFBbUIsR0FBRyxDQUM5QixRQUF3QixFQUNMLEVBQUU7UUFDckIsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQyxDQUFDO0NBQ0g7QUFFRCxlQUFlLFlBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0RXJnb0JveEFjdGlvbiB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtZXh0cmFjdG9yJztcbmltcG9ydCB7IEFic3RyYWN0TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvZXh0ZW5kZWQtdHlwZW9ybSc7XG5pbXBvcnQgeyBCbG9ja0luZm8gfSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5cbmltcG9ydCBQZXJtaXRFbnRpdHkgZnJvbSAnLi4vZW50aXRpZXMvcGVybWl0RW50aXR5JztcbmltcG9ydCB7IEV4dHJhY3RlZFBlcm1pdCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZXh0cmFjdGVkUGVybWl0JztcblxuY2xhc3MgUGVybWl0QWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RFcmdvQm94QWN0aW9uPFxuICBFeHRyYWN0ZWRQZXJtaXQsXG4gIFBlcm1pdEVudGl0eVxuPiB7XG4gIGNvbnN0cnVjdG9yKGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsIGxvZ2dlcj86IEFic3RyYWN0TG9nZ2VyKSB7XG4gICAgc3VwZXIoZGF0YVNvdXJjZSwgUGVybWl0RW50aXR5LCBsb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHBlcm1pdCBlbnRpdHkgZnJvbSBleHRyYWN0ZWQgZGF0YSBhbmQgYmxvY2sgaW5mb3JtYXRpb25cbiAgICogQHBhcmFtIHBlcm1pdHNcbiAgICogQHBhcmFtIGJsb2NrXG4gICAqIEBwYXJhbSBleHRyYWN0b3JcbiAgICogQHJldHVybnMgdGhlIHBlcm1pdCBlbnRpdGllcyAod2l0aG91dCB0aGUgaWQpXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlRW50aXR5ID0gKFxuICAgIHBlcm1pdHM6IEV4dHJhY3RlZFBlcm1pdFtdLFxuICAgIGJsb2NrOiBCbG9ja0luZm8sXG4gICAgZXh0cmFjdG9yOiBzdHJpbmcsXG4gICk6IEFycmF5PE9taXQ8UGVybWl0RW50aXR5LCAnaWQnPj4gPT4ge1xuICAgIHJldHVybiBwZXJtaXRzLm1hcCgocGVybWl0KSA9PiAoe1xuICAgICAgLi4ucGVybWl0LFxuICAgICAgYmxvY2s6IGJsb2NrLmhhc2gsXG4gICAgICBoZWlnaHQ6IGJsb2NrLmhlaWdodCxcbiAgICAgIGV4dHJhY3RvcixcbiAgICAgIFdJRDogcGVybWl0LldJRCxcbiAgICAgIHNwZW5kQmxvY2s6IHBlcm1pdC5zcGVuZEJsb2NrID8/IG51bGwsXG4gICAgICBzcGVuZEhlaWdodDogcGVybWl0LnNwZW5kSGVpZ2h0ID8/IG51bGwsXG4gICAgfSkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBjb252ZXJ0IHRoZSBkYXRhYmFzZSBlbnRpdHkgYmFjayB0byByYXcgZGF0YVxuICAgKiBAcGFyYW0gZW50aXRpZXNcbiAgICogQHJldHVybnMgdGhlIGV4dHJhY3RlZCBjb2xsYXRlcmFsIGRhdGFcbiAgICovXG4gIHByb3RlY3RlZCBjb252ZXJ0RW50aXR5VG9EYXRhID0gKFxuICAgIGVudGl0aWVzOiBQZXJtaXRFbnRpdHlbXSxcbiAgKTogRXh0cmFjdGVkUGVybWl0W10gPT4ge1xuICAgIHJldHVybiBlbnRpdGllcztcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgUGVybWl0QWN0aW9uO1xuIl19
@@ -1,13 +1,6 @@
1
- declare class PermitEntity {
2
- id: number;
3
- extractor: string;
4
- boxId: string;
5
- boxSerialized: string;
1
+ import { AbstractErgoBoxEntity } from '@rosen-bridge/abstract-extractor';
2
+ declare class PermitEntity extends AbstractErgoBoxEntity {
6
3
  WID: string;
7
- block: string;
8
- height: number;
9
- spendBlock?: string | null;
10
- spendHeight?: number | null;
11
4
  txId: string;
12
5
  }
13
6
  export default PermitEntity;
@@ -1 +1 @@
1
- {"version":3,"file":"permitEntity.d.ts","sourceRoot":"","sources":["../../lib/entities/permitEntity.ts"],"names":[],"mappings":"AAOA,cAEM,YAAY;IAEhB,EAAE,EAAE,MAAM,CAAC;IAGX,SAAS,EAAE,MAAM,CAAC;IAGlB,KAAK,EAAE,MAAM,CAAC;IAGd,aAAa,EAAE,MAAM,CAAC;IAGtB,GAAG,EAAE,MAAM,CAAC;IAGZ,KAAK,EAAE,MAAM,CAAC;IAGd,MAAM,EAAE,MAAM,CAAC;IAGf,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAG3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAG5B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"permitEntity.d.ts","sourceRoot":"","sources":["../../lib/entities/permitEntity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAGzE,cACM,YAAa,SAAQ,qBAAqB;IAE9C,GAAG,EAAE,MAAM,CAAC;IAGZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAe,YAAY,CAAC"}
@@ -7,62 +7,22 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  var __metadata = (this && this.__metadata) || function (k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  };
10
- import { Column, Entity, PrimaryGeneratedColumn, Unique, } from '@rosen-bridge/extended-typeorm';
11
- let PermitEntity = class PermitEntity {
12
- id;
13
- extractor;
14
- boxId;
15
- boxSerialized;
10
+ import { AbstractErgoBoxEntity } from '@rosen-bridge/abstract-extractor';
11
+ import { Column, Entity } from '@rosen-bridge/extended-typeorm';
12
+ let PermitEntity = class PermitEntity extends AbstractErgoBoxEntity {
16
13
  WID;
17
- block;
18
- height;
19
- spendBlock;
20
- spendHeight;
21
14
  txId;
22
15
  };
23
- __decorate([
24
- PrimaryGeneratedColumn(),
25
- __metadata("design:type", Number)
26
- ], PermitEntity.prototype, "id", void 0);
27
- __decorate([
28
- Column({ type: 'varchar' }),
29
- __metadata("design:type", String)
30
- ], PermitEntity.prototype, "extractor", void 0);
31
- __decorate([
32
- Column({ type: 'varchar' }),
33
- __metadata("design:type", String)
34
- ], PermitEntity.prototype, "boxId", void 0);
35
- __decorate([
36
- Column({ type: 'varchar' }),
37
- __metadata("design:type", String)
38
- ], PermitEntity.prototype, "boxSerialized", void 0);
39
16
  __decorate([
40
17
  Column({ type: 'varchar' }),
41
18
  __metadata("design:type", String)
42
19
  ], PermitEntity.prototype, "WID", void 0);
43
- __decorate([
44
- Column({ type: 'varchar' }),
45
- __metadata("design:type", String)
46
- ], PermitEntity.prototype, "block", void 0);
47
- __decorate([
48
- Column({ type: 'int' }),
49
- __metadata("design:type", Number)
50
- ], PermitEntity.prototype, "height", void 0);
51
- __decorate([
52
- Column({ nullable: true, type: 'text' }),
53
- __metadata("design:type", Object)
54
- ], PermitEntity.prototype, "spendBlock", void 0);
55
- __decorate([
56
- Column({ nullable: true, type: 'int' }),
57
- __metadata("design:type", Object)
58
- ], PermitEntity.prototype, "spendHeight", void 0);
59
20
  __decorate([
60
21
  Column({ type: 'varchar' }),
61
22
  __metadata("design:type", String)
62
23
  ], PermitEntity.prototype, "txId", void 0);
63
24
  PermitEntity = __decorate([
64
- Entity('permit_entity'),
65
- Unique(['boxId', 'extractor'])
25
+ Entity('permit_entity')
66
26
  ], PermitEntity);
67
27
  export default PermitEntity;
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWl0RW50aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2VudGl0aWVzL3Blcm1pdEVudGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQ0wsTUFBTSxFQUNOLE1BQU0sRUFDTixzQkFBc0IsRUFDdEIsTUFBTSxHQUNQLE1BQU0sZ0NBQWdDLENBQUM7QUFJeEMsSUFBTSxZQUFZLEdBQWxCLE1BQU0sWUFBWTtJQUVoQixFQUFFLENBQVM7SUFHWCxTQUFTLENBQVM7SUFHbEIsS0FBSyxDQUFTO0lBR2QsYUFBYSxDQUFTO0lBR3RCLEdBQUcsQ0FBUztJQUdaLEtBQUssQ0FBUztJQUdkLE1BQU0sQ0FBUztJQUdmLFVBQVUsQ0FBaUI7SUFHM0IsV0FBVyxDQUFpQjtJQUc1QixJQUFJLENBQVM7Q0FDZCxDQUFBO0FBNUJDO0lBREMsc0JBQXNCLEVBQUU7O3dDQUNkO0FBR1g7SUFEQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7OytDQUNWO0FBR2xCO0lBREMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOzsyQ0FDZDtBQUdkO0lBREMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOzttREFDTjtBQUd0QjtJQURDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7eUNBQ2hCO0FBR1o7SUFEQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7OzJDQUNkO0FBR2Q7SUFEQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7OzRDQUNUO0FBR2Y7SUFEQyxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7Z0RBQ2Q7QUFHM0I7SUFEQyxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7aURBQ1o7QUFHNUI7SUFEQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7OzBDQUNmO0FBN0JULFlBQVk7SUFGakIsTUFBTSxDQUFDLGVBQWUsQ0FBQztJQUN2QixNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7R0FDekIsWUFBWSxDQThCakI7QUFFRCxlQUFlLFlBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbHVtbixcbiAgRW50aXR5LFxuICBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uLFxuICBVbmlxdWUsXG59IGZyb20gJ0Byb3Nlbi1icmlkZ2UvZXh0ZW5kZWQtdHlwZW9ybSc7XG5cbkBFbnRpdHkoJ3Blcm1pdF9lbnRpdHknKVxuQFVuaXF1ZShbJ2JveElkJywgJ2V4dHJhY3RvciddKVxuY2xhc3MgUGVybWl0RW50aXR5IHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuICBpZDogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndmFyY2hhcicgfSlcbiAgZXh0cmFjdG9yOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICBib3hJZDogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndmFyY2hhcicgfSlcbiAgYm94U2VyaWFsaXplZDogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndmFyY2hhcicgfSlcbiAgV0lEOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICBibG9jazogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAnaW50JyB9KVxuICBoZWlnaHQ6IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbnVsbGFibGU6IHRydWUsIHR5cGU6ICd0ZXh0JyB9KVxuICBzcGVuZEJsb2NrPzogc3RyaW5nIHwgbnVsbDtcblxuICBAQ29sdW1uKHsgbnVsbGFibGU6IHRydWUsIHR5cGU6ICdpbnQnIH0pXG4gIHNwZW5kSGVpZ2h0PzogbnVtYmVyIHwgbnVsbDtcblxuICBAQ29sdW1uKHsgdHlwZTogJ3ZhcmNoYXInIH0pXG4gIHR4SWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgUGVybWl0RW50aXR5O1xuIl19
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWl0RW50aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2VudGl0aWVzL3Blcm1pdEVudGl0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBR2hFLElBQU0sWUFBWSxHQUFsQixNQUFNLFlBQWEsU0FBUSxxQkFBcUI7SUFFOUMsR0FBRyxDQUFTO0lBR1osSUFBSSxDQUFTO0NBQ2QsQ0FBQTtBQUpDO0lBREMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOzt5Q0FDaEI7QUFHWjtJQURDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7MENBQ2Y7QUFMVCxZQUFZO0lBRGpCLE1BQU0sQ0FBQyxlQUFlLENBQUM7R0FDbEIsWUFBWSxDQU1qQjtBQUVELGVBQWUsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3RFcmdvQm94RW50aXR5IH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1leHRyYWN0b3InO1xuaW1wb3J0IHsgQ29sdW1uLCBFbnRpdHkgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2V4dGVuZGVkLXR5cGVvcm0nO1xuXG5ARW50aXR5KCdwZXJtaXRfZW50aXR5JylcbmNsYXNzIFBlcm1pdEVudGl0eSBleHRlbmRzIEFic3RyYWN0RXJnb0JveEVudGl0eSB7XG4gIEBDb2x1bW4oeyB0eXBlOiAndmFyY2hhcicgfSlcbiAgV0lEOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICB0eElkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBlcm1pdEVudGl0eTtcbiJdfQ==
@@ -1,134 +1,26 @@
1
- import { AbstractExtractor } from '@rosen-bridge/abstract-extractor';
1
+ import { AbstractErgoBoxExtractor, InitializeOptions } from '@rosen-bridge/abstract-extractor';
2
2
  import { AbstractLogger } from '@rosen-bridge/abstract-logger';
3
- import { DataSource, SelectQueryBuilder } from '@rosen-bridge/extended-typeorm';
4
- import { BlockInfo, Transaction } from '@rosen-bridge/scanner-interfaces';
5
- import { V1 } from '@rosen-clients/ergo-explorer';
3
+ import { DataSource } from '@rosen-bridge/extended-typeorm';
4
+ import { OutputBox } from '@rosen-bridge/scanner-interfaces';
6
5
  import PermitAction from '../actions/permitAction';
7
6
  import PermitEntity from '../entities/permitEntity';
8
7
  import { ExtractedPermit } from '../interfaces/extractedPermit';
9
- declare class PermitExtractor extends AbstractExtractor<Transaction, PermitEntity> {
10
- readonly logger: AbstractLogger;
11
- id: string;
12
- private readonly dataSource;
8
+ declare class PermitExtractor extends AbstractErgoBoxExtractor<ExtractedPermit, PermitEntity> {
9
+ private readonly id;
13
10
  readonly actions: PermitAction;
14
11
  private readonly permitErgoTree;
15
12
  private readonly RWT;
16
- readonly explorerApi: {
17
- v0: {
18
- getApiV0AddressesP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0AddressesP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").AddressInfo>;
19
- getApiV0AddressesP1Transactions: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0AddressesP1TransactionsParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").ItemsTransactionInfo>;
20
- getApiV0AddressesAssetholdersP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0AddressesAssetholdersP1Params) => Promise<string[]>;
21
- getApiV0AddressesBalances: (params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0AddressesBalancesParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").ItemsBalanceInfo>;
22
- getApiV0AssetsIssuingboxes: (params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0AssetsIssuingboxesParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").ItemsOutputInfo>;
23
- getApiV0AssetsP1Issuingbox: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").OutputInfo[]>;
24
- getApiV0Blocks: (params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0BlocksParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").ItemsBlockInfo>;
25
- getApiV0BlocksP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").BlockSummary>;
26
- getApiV0BlocksAtP1: (p1: number) => Promise<string[]>;
27
- getApiV0DexTokensP1Unspentsellorders: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0DexTokensP1UnspentsellordersParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").DexSellOrderInfo[]>;
28
- getApiV0DexTokensP1Unspentbuyorders: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0DexTokensP1UnspentbuyordersParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").DexBuyOrderInfo[]>;
29
- getApiV0TransactionsP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").TransactionSummary>;
30
- getApiV0TransactionsUnconfirmedP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").UTransactionSummary>;
31
- getApiV0TransactionsUnconfirmedByaddressP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0TransactionsUnconfirmedByaddressP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").ItemsUTransactionInfo>;
32
- getApiV0TransactionsUnconfirmed: (params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0TransactionsUnconfirmedParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").ItemsUTransactionInfo>;
33
- getApiV0TransactionsSinceP1: (p1: number, params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0TransactionsSinceP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").TransactionInfo[]>;
34
- postApiV0TransactionsSend: (postApiV0TransactionsSendBody: import("@rosen-clients/ergo-explorer/dist/v0/types").PostApiV0TransactionsSendBody) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").TxIdResponse>;
35
- getApiV0TransactionsBoxesP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").OutputInfo>;
36
- getApiV0TransactionsBoxesByergotreeP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").OutputInfo[]>;
37
- getApiV0TransactionsBoxesByergotreeUnspentP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").OutputInfo[]>;
38
- getApiV0TransactionsBoxesByaddressP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").OutputInfo[]>;
39
- getApiV0TransactionsBoxesByaddressUnspentP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").OutputInfo[]>;
40
- getApiV0Info: () => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").BlockChainInfo>;
41
- getApiV0InfoSupply: () => Promise<string>;
42
- getApiV0Stats: () => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").StatsSummary>;
43
- getApiV0DocsOpenapi: () => Promise<string>;
44
- };
45
- v1: {
46
- getApiV1TransactionsP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").TransactionInfo>;
47
- getApiV1TransactionsByinputsscripttemplatehashP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1TransactionsByinputsscripttemplatehashP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsTransactionInfo>;
48
- getApiV1TransactionsByglobalindexStream: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1TransactionsByglobalindexStreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListTransactionInfo>;
49
- getApiV1BoxesUnspentBylastepochsStream: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentBylastepochsStreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListOutputInfo>;
50
- getApiV1BoxesUnspentByglobalindexStream: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentByglobalindexStreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListOutputInfo>;
51
- getApiV1BoxesUnspentStream: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentStreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListOutputInfo>;
52
- getApiV1BoxesByergotreetemplatehashP1Stream: (p1: string, params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesByergotreetemplatehashP1StreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListOutputInfo>;
53
- getApiV1BoxesUnspentByergotreetemplatehashP1Stream: (p1: string, params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentByergotreetemplatehashP1StreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListOutputInfo>;
54
- getApiV1BoxesUnspentBytokenidP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentBytokenidP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
55
- getApiV1BoxesBytokenidP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesBytokenidP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
56
- getApiV1BoxesP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").OutputInfo>;
57
- getApiV1BoxesByergotreeP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesByergotreeP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
58
- getApiV1BoxesByergotreetemplatehashP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesByergotreetemplatehashP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
59
- getApiV1BoxesUnspentByergotreeP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentByergotreeP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
60
- getApiV1BoxesUnspentByergotreetemplatehashP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentByergotreetemplatehashP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
61
- getApiV1BoxesByaddressP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesByaddressP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
62
- getApiV1BoxesUnspentUnconfirmedByaddressP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentUnconfirmedByaddressP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").MOutputInfo[]>;
63
- getApiV1BoxesUnspentByaddressP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentByaddressP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
64
- getApiV1BoxesByglobalindexStream: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesByglobalindexStreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListOutputInfo>;
65
- postApiV1BoxesUnspentSearchUnion: (boxAssetsQuery: import("@rosen-clients/ergo-explorer/dist/v1/types").BoxAssetsQuery, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").PostApiV1BoxesUnspentSearchUnionParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
66
- postApiV1BoxesUnspentSearch: (boxQuery: import("@rosen-clients/ergo-explorer/dist/v1/types").BoxQuery, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").PostApiV1BoxesUnspentSearchParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
67
- postApiV1BoxesSearch: (boxQuery: import("@rosen-clients/ergo-explorer/dist/v1/types").BoxQuery, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").PostApiV1BoxesSearchParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
68
- getApiV1Tokens: (params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1TokensParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsTokenInfo>;
69
- getApiV1TokensSearch: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1TokensSearchParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsTokenInfo>;
70
- getApiV1TokensBysymbolP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").TokenInfo[]>;
71
- getApiV1TokensP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").TokenInfo>;
72
- getApiV1Assets: (params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1AssetsParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsTokenInfo>;
73
- getApiV1AssetsSearchBytokenid: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1AssetsSearchBytokenidParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsAssetInfo>;
74
- getApiV1EpochsParams: () => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").EpochInfo>;
75
- getApiV1AddressesP1Transactions: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1AddressesP1TransactionsParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsTransactionInfo>;
76
- getApiV1AddressesP1BalanceConfirmed: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1AddressesP1BalanceConfirmedParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").Balance>;
77
- getApiV1AddressesP1BalanceTotal: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").TotalBalance>;
78
- getApiV1Blocks: (params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BlocksParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsBlockInfo>;
79
- getApiV1BlocksP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").BlockSummary>;
80
- getApiV1BlocksHeaders: (params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BlocksHeadersParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsBlockHeader>;
81
- getApiV1BlocksByglobalindexStream: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BlocksByglobalindexStreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListBlockInfo>;
82
- getApiV1BlocksStreamSummary: (params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BlocksStreamSummaryParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListBlockSummaryV1>;
83
- postApiV1MempoolTransactionsSubmit: (postApiV1MempoolTransactionsSubmitBody: import("@rosen-clients/ergo-explorer/dist/v1/types").PostApiV1MempoolTransactionsSubmitBody) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").TxIdResponse>;
84
- getApiV1MempoolTransactionsByaddressP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1MempoolTransactionsByaddressP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsUTransactionInfo>;
85
- getApiV1MempoolBoxesUnspent: () => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListOutputInfo>;
86
- getApiV1Info: () => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").NetworkState>;
87
- getApiV1Networkstate: () => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").NetworkState>;
88
- getApiV1Networkstats: () => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").NetworkStats>;
89
- postApiV1ErgotreeConvert: (ergoTreeConversionRequest: import("@rosen-clients/ergo-explorer/dist/v1/types").ErgoTreeConversionRequest) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ErgoTreeHuman>;
90
- };
91
- };
92
- constructor(id: string, dataSource: DataSource, address: string, RWT: string, explorerUrl: string, logger?: AbstractLogger);
93
- getId: () => string;
94
- /**
95
- * gets block id and transactions corresponding to the block and saves if they are valid rosen
96
- * transactions and in case of success return true and in case of failure returns false
97
- * @param block
98
- * @param txs
99
- */
100
- processTransactions: (txs: Array<Transaction>, block: BlockInfo) => Promise<boolean>;
101
- forkBlock: (hash: string) => Promise<void>;
102
- /**
103
- * Initializes the database with older permits related to the address
104
- */
105
- initializeData: (initialBlock: BlockInfo) => Promise<void>;
106
- /**
107
- * Validate all remaining permits in the database
108
- * update the correct ones and remove the invalid ones
109
- * @param unchangedStoredBoxIds
110
- * @param initialHeight
111
- */
112
- validateOldStoredPermits: (unchangedStoredBoxIds: Array<string>, initialHeight: number) => Promise<void>;
113
- /**
114
- * Return extracted permit from a box
115
- * @param boxId
116
- */
117
- getPermitWithBoxId: (boxId: string) => Promise<ExtractedPermit | undefined>;
13
+ constructor(id: string, dataSource: DataSource, address: string, RWT: string, initializeOptions: InitializeOptions, logger?: AbstractLogger);
118
14
  /**
119
- * Return all unspent permits
120
- * @param initialHeight
121
- * @returns
15
+ * get Id for current extractor
122
16
  */
123
- getAllUnspentPermits: (initialHeight: number) => Promise<Array<ExtractedPermit>>;
17
+ getId: () => string;
124
18
  /**
125
- * Returns block information of tx
126
- * @param txId
19
+ * check proper data format in the box
20
+ * @param box
21
+ * @return true if the box has the required data and false otherwise
127
22
  */
128
- getTxBlock: (txId: string) => Promise<{
129
- id: string;
130
- height: number;
131
- }>;
23
+ hasBoxData: (box: OutputBox) => boolean;
132
24
  /**
133
25
  * Extract permit data from json boxes
134
26
  * and filter to fit in a specified height range
@@ -137,14 +29,7 @@ declare class PermitExtractor extends AbstractExtractor<Transaction, PermitEntit
137
29
  * @param heightDifference
138
30
  * @returns extracted permit
139
31
  */
140
- extractPermitData: (boxes: Array<V1.OutputInfo>) => Promise<ExtractedPermit[]>;
141
- /**
142
- * Builds a query that returns used blocks by selecting the `block` column from the `PermitEntity` repository,
143
- * filtered by the provided `extractorId`
144
- *
145
- * @returns A query builder selecting used blocks
146
- */
147
- createUsedBlocksQuery: () => SelectQueryBuilder<PermitEntity>;
32
+ extractBoxData: (box: OutputBox) => ExtractedPermit | undefined;
148
33
  }
149
34
  export default PermitExtractor;
150
35
  //# sourceMappingURL=permitExtractor.d.ts.map