@rosen-bridge/evm-address-tx-extractor 2.0.5 → 3.0.0

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,20 @@
1
1
  # @rosen-bridge/evm-address-tx-extractor
2
2
 
3
+ ## 3.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - **Add Nonce-Based Range Validation**: Added the `hasEventInHeightRange` method to `EvmTxExtractor` to determine if an address may have transactions within a specified block range by comparing stored nonce values with network nonce data.
8
+ - Added `checkNonceAtToHeight` option to the constructor, allowing the extractor to fetch nonce at the specified `toHeight` before falling back to the latest nonce (useful for archive nodes).
9
+ - Added RPC URL and optional auth token to the constructor so the extractor can directly fetch nonce data from the network via ethers `JsonRpcProvider`.
10
+
11
+ ### Patch Changes
12
+
13
+ - Add dependency
14
+ - @rosen-bridge/abstract-scanner@2.0.1
15
+ - Update dependencies
16
+ - @rosen-bridge/abstract-extractor@3.2.1
17
+
3
18
  ## 2.0.5
4
19
 
5
20
  ### Patch Changes
@@ -29,5 +29,15 @@ export declare class TxAction {
29
29
  * @returns A query builder selecting used blocks
30
30
  */
31
31
  createUsedBlocksQuery: (extractorId: string) => SelectQueryBuilder<AddressTxsEntity>;
32
+ /**
33
+ * Returns the highest nonce recorded for the specified extractor and address
34
+ * up to and including the given block height.
35
+ *
36
+ * @param extractor - Extractor identifier.
37
+ * @param address - The address to filter transactions by.
38
+ * @param height - Upper bound block height (Inclusive).
39
+ * @returns The highest nonce up to the given height, or -1 if no transaction found.
40
+ */
41
+ getNonceUpToHeight: (extractor: string, address: string, height: number) => Promise<number>;
32
42
  }
33
43
  //# sourceMappingURL=db.d.ts.map
@@ -1 +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,EAEV,kBAAkB,EACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+B;IAC1D,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;gBAEpB,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,cAAc;IAK3D;;;;OAIG;IACH,cAAc,GAAU,SAAS,MAAM,EAAE,WAAW,MAAM,mBAYxD;IAEF;;;;;;OAMG;IACH,QAAQ,GACN,KAAK,KAAK,CAAC,WAAW,CAAC,EACvB,OAAO,SAAS,EAChB,WAAW,MAAM,mBAuBjB;IAEF;;;;;;OAMG;IACH,qBAAqB,GACnB,aAAa,MAAM,KAClB,kBAAkB,CAAC,gBAAgB,CAAC,CAKrC;CACH"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../lib/actions/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAE5E,OAAO,EACL,UAAU,EAEV,kBAAkB,EACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+B;IAC1D,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;gBAEpB,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,cAAc;IAK3D;;;;OAIG;IACH,cAAc,GAAU,SAAS,MAAM,EAAE,WAAW,MAAM,mBAYxD;IAEF;;;;;;OAMG;IACH,QAAQ,GACN,KAAK,KAAK,CAAC,WAAW,CAAC,EACvB,OAAO,SAAS,EAChB,WAAW,MAAM,mBAuBjB;IAEF;;;;;;OAMG;IACH,qBAAqB,GACnB,aAAa,MAAM,KAClB,kBAAkB,CAAC,gBAAgB,CAAC,CAKrC;IAEF;;;;;;;;OAQG;IACH,kBAAkB,GAChB,WAAW,MAAM,EACjB,SAAS,MAAM,EACf,QAAQ,MAAM,KACb,OAAO,CAAC,MAAM,CAAC,CAahB;CACH"}
@@ -1,4 +1,5 @@
1
1
  import { DummyLogger } from '@rosen-bridge/abstract-logger';
2
+ import { BlockEntity } from '@rosen-bridge/abstract-scanner';
2
3
  import { AddressTxsEntity } from '../entities/addressTxsEntity';
3
4
  export class TxAction {
4
5
  repository;
@@ -60,5 +61,27 @@ export class TxAction {
60
61
  .select('evmAddressTxEntity.blockId', 'block')
61
62
  .where('evmAddressTxEntity.extractor = :extractorId', { extractorId });
62
63
  };
64
+ /**
65
+ * Returns the highest nonce recorded for the specified extractor and address
66
+ * up to and including the given block height.
67
+ *
68
+ * @param extractor - Extractor identifier.
69
+ * @param address - The address to filter transactions by.
70
+ * @param height - Upper bound block height (Inclusive).
71
+ * @returns The highest nonce up to the given height, or -1 if no transaction found.
72
+ */
73
+ getNonceUpToHeight = async (extractor, address, height) => {
74
+ const result = await this.repository
75
+ .createQueryBuilder('tx')
76
+ .innerJoin(BlockEntity, 'block', 'block.hash = tx.blockId')
77
+ .select('MAX(tx.nonce)', 'nonce')
78
+ .where('tx.extractor = :extractor', { extractor })
79
+ .andWhere('tx.address = :address', { address })
80
+ .andWhere('block.height <= :height', { height })
81
+ .getRawOne();
82
+ return result?.nonce !== null && result?.nonce !== undefined
83
+ ? Number(result.nonce)
84
+ : -1;
85
+ };
63
86
  }
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYWN0aW9ucy9kYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtCLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBUTVFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBR2hFLE1BQU0sT0FBTyxRQUFRO0lBQ0YsVUFBVSxDQUErQjtJQUNqRCxNQUFNLENBQWlCO0lBRWhDLFlBQVksVUFBc0IsRUFBRSxNQUF1QjtRQUN6RCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsY0FBYyxHQUFHLEtBQUssRUFBRSxPQUFlLEVBQUUsU0FBaUIsRUFBRSxFQUFFO1FBQzVELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLGtDQUFrQyxPQUFPLGtCQUFrQixTQUFTLEVBQUUsQ0FDdkUsQ0FBQztRQUNGLE1BQU0sSUFBSSxDQUFDLFVBQVU7YUFDbEIsa0JBQWtCLEVBQUU7YUFDcEIsTUFBTSxFQUFFO2FBQ1IsS0FBSyxDQUFDLCtDQUErQyxFQUFFO1lBQ3RELE9BQU8sRUFBRSxPQUFPO1lBQ2hCLFNBQVMsRUFBRSxTQUFTO1NBQ3JCLENBQUM7YUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNmLENBQUMsQ0FBQztJQUVGOzs7Ozs7T0FNRztJQUNILFFBQVEsR0FBRyxLQUFLLEVBQ2QsR0FBdUIsRUFDdkIsS0FBZ0IsRUFDaEIsU0FBaUIsRUFDakIsRUFBRTtRQUNGLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLCtCQUErQixHQUFHLENBQUMsR0FBRyxDQUNwQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FDdEIsY0FBYyxLQUFLLENBQUMsSUFBSSxrQkFBa0IsU0FBUyxFQUFFLENBQ3ZELENBQUM7UUFDRixNQUFNLElBQUksQ0FBQyxVQUFVO2FBQ2xCLGtCQUFrQixFQUFFO2FBQ3BCLE1BQU0sRUFBRTthQUNSLE1BQU0sQ0FDTCxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2YsWUFBWSxFQUFFLEVBQUUsQ0FBQyxZQUFZO1lBQzdCLFVBQVUsRUFBRSxFQUFFLENBQUMsVUFBVTtZQUN6QixLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUs7WUFDZixPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU87WUFDbkIsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJO1lBQ25CLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTTtTQUNsQixDQUFDLENBQUMsQ0FDSjthQUNBLE9BQU8sRUFBRSxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0lBRUY7Ozs7OztPQU1HO0lBQ0gscUJBQXFCLEdBQUcsQ0FDdEIsV0FBbUIsRUFDbUIsRUFBRTtRQUN4QyxPQUFPLElBQUksQ0FBQyxVQUFVO2FBQ25CLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDO2FBQ3hDLE1BQU0sQ0FBQyw0QkFBNEIsRUFBRSxPQUFPLENBQUM7YUFDN0MsS0FBSyxDQUFDLDZDQUE2QyxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUMzRSxDQUFDLENBQUM7Q0FDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0TG9nZ2VyLCBEdW1teUxvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcbmltcG9ydCB7XG4gIERhdGFTb3VyY2UsXG4gIFJlcG9zaXRvcnksXG4gIFNlbGVjdFF1ZXJ5QnVpbGRlcixcbn0gZnJvbSAnQHJvc2VuLWJyaWRnZS9leHRlbmRlZC10eXBlb3JtJztcbmltcG9ydCB7IEJsb2NrSW5mbyB9IGZyb20gJ0Byb3Nlbi1icmlkZ2Uvc2Nhbm5lci1pbnRlcmZhY2VzJztcblxuaW1wb3J0IHsgQWRkcmVzc1R4c0VudGl0eSB9IGZyb20gJy4uL2VudGl0aWVzL2FkZHJlc3NUeHNFbnRpdHknO1xuaW1wb3J0IHsgRXh0cmFjdGVkVHggfSBmcm9tICcuLi9pbnRlcmZhY2VzL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFR4QWN0aW9uIHtcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvc2l0b3J5OiBSZXBvc2l0b3J5PEFkZHJlc3NUeHNFbnRpdHk+O1xuICByZWFkb25seSBsb2dnZXI6IEFic3RyYWN0TG9nZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsIGxvZ2dlcj86IEFic3RyYWN0TG9nZ2VyKSB7XG4gICAgdGhpcy5yZXBvc2l0b3J5ID0gZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KEFkZHJlc3NUeHNFbnRpdHkpO1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyID8gbG9nZ2VyIDogbmV3IER1bW15TG9nZ2VyKCk7XG4gIH1cblxuICAvKipcbiAgICogcmVtb3ZlIGFsbCBpbnNlcnRlZCB0cmFuc2FjdGlvbiBmb3Igc3BlY2lmaWMgYmxvY2sgaW4gc3BlY2lmaWMgZXh0cmFjdG9yIGZyb20gZGF0YWJhc2VcbiAgICogQHBhcmFtIGJsb2NrSWQgc2VsZWN0ZWQgYmxvY2sgaWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBzZWxlY3RlZCBleHRyYWN0b3JcbiAgICovXG4gIGRlbGV0ZUJsb2NrVHhzID0gYXN5bmMgKGJsb2NrSWQ6IHN0cmluZywgZXh0cmFjdG9yOiBzdHJpbmcpID0+IHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBEZWxldGluZyB0cmFuc2FjdGlvbnMgb2YgYmxvY2sgJHtibG9ja0lkfSBhbmQgZXh0cmFjdG9yICR7ZXh0cmFjdG9yfWAsXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLnJlcG9zaXRvcnlcbiAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgLmRlbGV0ZSgpXG4gICAgICAud2hlcmUoJ2V4dHJhY3RvciA9IDpleHRyYWN0b3IgQU5EIGJsb2NrSWQgPSA6YmxvY2tJZCcsIHtcbiAgICAgICAgYmxvY2tJZDogYmxvY2tJZCxcbiAgICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgICB9KVxuICAgICAgLmV4ZWN1dGUoKTtcbiAgfTtcblxuICAvKipcbiAgICogcmVtb3ZlIG9sZCBsaXN0IG9mIHRyYW5zYWN0aW9ucyBhbmRcbiAgICogc3RvcmUgYSBuZXcgbGlzdCBvZiB0cmFuc2FjdGlvbnMgZGF0YWJhc2UgZm9yIHNwZWNpZmljIGJsb2NrIGFuZCBleHRyYWN0b3JcbiAgICogQHBhcmFtIHR4c1xuICAgKiBAcGFyYW0gYmxvY2tcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKi9cbiAgc3RvcmVUeHMgPSBhc3luYyAoXG4gICAgdHhzOiBBcnJheTxFeHRyYWN0ZWRUeD4sXG4gICAgYmxvY2s6IEJsb2NrSW5mbyxcbiAgICBleHRyYWN0b3I6IHN0cmluZyxcbiAgKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVCbG9ja1R4cyhibG9jay5oYXNoLCBleHRyYWN0b3IpO1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgYEluc2VydGluZyBuZXcgdHJhbnNhY3Rpb25zIFske3R4cy5tYXAoXG4gICAgICAgICh0eCkgPT4gdHguc2lnbmVkSGFzaCxcbiAgICAgICl9XSBpbiBibG9jayAke2Jsb2NrLmhhc2h9IGFuZCBleHRyYWN0b3IgJHtleHRyYWN0b3J9YCxcbiAgICApO1xuICAgIGF3YWl0IHRoaXMucmVwb3NpdG9yeVxuICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAuaW5zZXJ0KClcbiAgICAgIC52YWx1ZXMoXG4gICAgICAgIHR4cy5tYXAoKHR4KSA9PiAoe1xuICAgICAgICAgIHVuc2lnbmVkSGFzaDogdHgudW5zaWduZWRIYXNoLFxuICAgICAgICAgIHNpZ25lZEhhc2g6IHR4LnNpZ25lZEhhc2gsXG4gICAgICAgICAgbm9uY2U6IHR4Lm5vbmNlLFxuICAgICAgICAgIGFkZHJlc3M6IHR4LmFkZHJlc3MsXG4gICAgICAgICAgYmxvY2tJZDogYmxvY2suaGFzaCxcbiAgICAgICAgICBleHRyYWN0b3I6IGV4dHJhY3RvcixcbiAgICAgICAgICBzdGF0dXM6IHR4LnN0YXR1cyxcbiAgICAgICAgfSkpLFxuICAgICAgKVxuICAgICAgLmV4ZWN1dGUoKTtcbiAgfTtcblxuICAvKipcbiAgICogQnVpbGRzIGEgcXVlcnkgdGhhdCByZXR1cm5zIHVzZWQgYmxvY2tzIGJ5IHNlbGVjdGluZyB0aGUgYGJsb2NrYCBjb2x1bW4gZnJvbSB0aGUgYGV2bUFkZHJlc3NUeEVudGl0eWAgcmVwb3NpdG9yeSxcbiAgICogZmlsdGVyZWQgYnkgdGhlIHByb3ZpZGVkIGBleHRyYWN0b3JJZGBcbiAgICpcbiAgICogQHBhcmFtIGV4dHJhY3RvcklkIC0gSWRlbnRpZmllciBvZiB0aGUgZXh0cmFjdG9yXG4gICAqIEByZXR1cm5zIEEgcXVlcnkgYnVpbGRlciBzZWxlY3RpbmcgdXNlZCBibG9ja3NcbiAgICovXG4gIGNyZWF0ZVVzZWRCbG9ja3NRdWVyeSA9IChcbiAgICBleHRyYWN0b3JJZDogc3RyaW5nLFxuICApOiBTZWxlY3RRdWVyeUJ1aWxkZXI8QWRkcmVzc1R4c0VudGl0eT4gPT4ge1xuICAgIHJldHVybiB0aGlzLnJlcG9zaXRvcnlcbiAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoJ2V2bUFkZHJlc3NUeEVudGl0eScpXG4gICAgICAuc2VsZWN0KCdldm1BZGRyZXNzVHhFbnRpdHkuYmxvY2tJZCcsICdibG9jaycpXG4gICAgICAud2hlcmUoJ2V2bUFkZHJlc3NUeEVudGl0eS5leHRyYWN0b3IgPSA6ZXh0cmFjdG9ySWQnLCB7IGV4dHJhY3RvcklkIH0pO1xuICB9O1xufVxuIl19
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYWN0aW9ucy9kYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtCLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQVE3RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUdoRSxNQUFNLE9BQU8sUUFBUTtJQUNGLFVBQVUsQ0FBK0I7SUFDakQsTUFBTSxDQUFpQjtJQUVoQyxZQUFZLFVBQXNCLEVBQUUsTUFBdUI7UUFDekQsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGNBQWMsR0FBRyxLQUFLLEVBQUUsT0FBZSxFQUFFLFNBQWlCLEVBQUUsRUFBRTtRQUM1RCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZixrQ0FBa0MsT0FBTyxrQkFBa0IsU0FBUyxFQUFFLENBQ3ZFLENBQUM7UUFDRixNQUFNLElBQUksQ0FBQyxVQUFVO2FBQ2xCLGtCQUFrQixFQUFFO2FBQ3BCLE1BQU0sRUFBRTthQUNSLEtBQUssQ0FBQywrQ0FBK0MsRUFBRTtZQUN0RCxPQUFPLEVBQUUsT0FBTztZQUNoQixTQUFTLEVBQUUsU0FBUztTQUNyQixDQUFDO2FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDZixDQUFDLENBQUM7SUFFRjs7Ozs7O09BTUc7SUFDSCxRQUFRLEdBQUcsS0FBSyxFQUNkLEdBQXVCLEVBQ3ZCLEtBQWdCLEVBQ2hCLFNBQWlCLEVBQ2pCLEVBQUU7UUFDRixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZiwrQkFBK0IsR0FBRyxDQUFDLEdBQUcsQ0FDcEMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQ3RCLGNBQWMsS0FBSyxDQUFDLElBQUksa0JBQWtCLFNBQVMsRUFBRSxDQUN2RCxDQUFDO1FBQ0YsTUFBTSxJQUFJLENBQUMsVUFBVTthQUNsQixrQkFBa0IsRUFBRTthQUNwQixNQUFNLEVBQUU7YUFDUixNQUFNLENBQ0wsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNmLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWTtZQUM3QixVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVU7WUFDekIsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLO1lBQ2YsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPO1lBQ25CLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSTtZQUNuQixTQUFTLEVBQUUsU0FBUztZQUNwQixNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU07U0FDbEIsQ0FBQyxDQUFDLENBQ0o7YUFDQSxPQUFPLEVBQUUsQ0FBQztJQUNmLENBQUMsQ0FBQztJQUVGOzs7Ozs7T0FNRztJQUNILHFCQUFxQixHQUFHLENBQ3RCLFdBQW1CLEVBQ21CLEVBQUU7UUFDeEMsT0FBTyxJQUFJLENBQUMsVUFBVTthQUNuQixrQkFBa0IsQ0FBQyxvQkFBb0IsQ0FBQzthQUN4QyxNQUFNLENBQUMsNEJBQTRCLEVBQUUsT0FBTyxDQUFDO2FBQzdDLEtBQUssQ0FBQyw2Q0FBNkMsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDM0UsQ0FBQyxDQUFDO0lBRUY7Ozs7Ozs7O09BUUc7SUFDSCxrQkFBa0IsR0FBRyxLQUFLLEVBQ3hCLFNBQWlCLEVBQ2pCLE9BQWUsRUFDZixNQUFjLEVBQ0csRUFBRTtRQUNuQixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVO2FBQ2pDLGtCQUFrQixDQUFDLElBQUksQ0FBQzthQUN4QixTQUFTLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSx5QkFBeUIsQ0FBQzthQUMxRCxNQUFNLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQzthQUNoQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQzthQUNqRCxRQUFRLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQzthQUM5QyxRQUFRLENBQUMseUJBQXlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQzthQUMvQyxTQUFTLEVBQUUsQ0FBQztRQUVmLE9BQU8sTUFBTSxFQUFFLEtBQUssS0FBSyxJQUFJLElBQUksTUFBTSxFQUFFLEtBQUssS0FBSyxTQUFTO1lBQzFELENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUN0QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDVCxDQUFDLENBQUM7Q0FDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0TG9nZ2VyLCBEdW1teUxvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcbmltcG9ydCB7IEJsb2NrRW50aXR5IH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1zY2FubmVyJztcbmltcG9ydCB7XG4gIERhdGFTb3VyY2UsXG4gIFJlcG9zaXRvcnksXG4gIFNlbGVjdFF1ZXJ5QnVpbGRlcixcbn0gZnJvbSAnQHJvc2VuLWJyaWRnZS9leHRlbmRlZC10eXBlb3JtJztcbmltcG9ydCB7IEJsb2NrSW5mbyB9IGZyb20gJ0Byb3Nlbi1icmlkZ2Uvc2Nhbm5lci1pbnRlcmZhY2VzJztcblxuaW1wb3J0IHsgQWRkcmVzc1R4c0VudGl0eSB9IGZyb20gJy4uL2VudGl0aWVzL2FkZHJlc3NUeHNFbnRpdHknO1xuaW1wb3J0IHsgRXh0cmFjdGVkVHggfSBmcm9tICcuLi9pbnRlcmZhY2VzL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFR4QWN0aW9uIHtcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvc2l0b3J5OiBSZXBvc2l0b3J5PEFkZHJlc3NUeHNFbnRpdHk+O1xuICByZWFkb25seSBsb2dnZXI6IEFic3RyYWN0TG9nZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsIGxvZ2dlcj86IEFic3RyYWN0TG9nZ2VyKSB7XG4gICAgdGhpcy5yZXBvc2l0b3J5ID0gZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KEFkZHJlc3NUeHNFbnRpdHkpO1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyID8gbG9nZ2VyIDogbmV3IER1bW15TG9nZ2VyKCk7XG4gIH1cblxuICAvKipcbiAgICogcmVtb3ZlIGFsbCBpbnNlcnRlZCB0cmFuc2FjdGlvbiBmb3Igc3BlY2lmaWMgYmxvY2sgaW4gc3BlY2lmaWMgZXh0cmFjdG9yIGZyb20gZGF0YWJhc2VcbiAgICogQHBhcmFtIGJsb2NrSWQgc2VsZWN0ZWQgYmxvY2sgaWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBzZWxlY3RlZCBleHRyYWN0b3JcbiAgICovXG4gIGRlbGV0ZUJsb2NrVHhzID0gYXN5bmMgKGJsb2NrSWQ6IHN0cmluZywgZXh0cmFjdG9yOiBzdHJpbmcpID0+IHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBEZWxldGluZyB0cmFuc2FjdGlvbnMgb2YgYmxvY2sgJHtibG9ja0lkfSBhbmQgZXh0cmFjdG9yICR7ZXh0cmFjdG9yfWAsXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLnJlcG9zaXRvcnlcbiAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgLmRlbGV0ZSgpXG4gICAgICAud2hlcmUoJ2V4dHJhY3RvciA9IDpleHRyYWN0b3IgQU5EIGJsb2NrSWQgPSA6YmxvY2tJZCcsIHtcbiAgICAgICAgYmxvY2tJZDogYmxvY2tJZCxcbiAgICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgICB9KVxuICAgICAgLmV4ZWN1dGUoKTtcbiAgfTtcblxuICAvKipcbiAgICogcmVtb3ZlIG9sZCBsaXN0IG9mIHRyYW5zYWN0aW9ucyBhbmRcbiAgICogc3RvcmUgYSBuZXcgbGlzdCBvZiB0cmFuc2FjdGlvbnMgZGF0YWJhc2UgZm9yIHNwZWNpZmljIGJsb2NrIGFuZCBleHRyYWN0b3JcbiAgICogQHBhcmFtIHR4c1xuICAgKiBAcGFyYW0gYmxvY2tcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKi9cbiAgc3RvcmVUeHMgPSBhc3luYyAoXG4gICAgdHhzOiBBcnJheTxFeHRyYWN0ZWRUeD4sXG4gICAgYmxvY2s6IEJsb2NrSW5mbyxcbiAgICBleHRyYWN0b3I6IHN0cmluZyxcbiAgKSA9PiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVCbG9ja1R4cyhibG9jay5oYXNoLCBleHRyYWN0b3IpO1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgYEluc2VydGluZyBuZXcgdHJhbnNhY3Rpb25zIFske3R4cy5tYXAoXG4gICAgICAgICh0eCkgPT4gdHguc2lnbmVkSGFzaCxcbiAgICAgICl9XSBpbiBibG9jayAke2Jsb2NrLmhhc2h9IGFuZCBleHRyYWN0b3IgJHtleHRyYWN0b3J9YCxcbiAgICApO1xuICAgIGF3YWl0IHRoaXMucmVwb3NpdG9yeVxuICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAuaW5zZXJ0KClcbiAgICAgIC52YWx1ZXMoXG4gICAgICAgIHR4cy5tYXAoKHR4KSA9PiAoe1xuICAgICAgICAgIHVuc2lnbmVkSGFzaDogdHgudW5zaWduZWRIYXNoLFxuICAgICAgICAgIHNpZ25lZEhhc2g6IHR4LnNpZ25lZEhhc2gsXG4gICAgICAgICAgbm9uY2U6IHR4Lm5vbmNlLFxuICAgICAgICAgIGFkZHJlc3M6IHR4LmFkZHJlc3MsXG4gICAgICAgICAgYmxvY2tJZDogYmxvY2suaGFzaCxcbiAgICAgICAgICBleHRyYWN0b3I6IGV4dHJhY3RvcixcbiAgICAgICAgICBzdGF0dXM6IHR4LnN0YXR1cyxcbiAgICAgICAgfSkpLFxuICAgICAgKVxuICAgICAgLmV4ZWN1dGUoKTtcbiAgfTtcblxuICAvKipcbiAgICogQnVpbGRzIGEgcXVlcnkgdGhhdCByZXR1cm5zIHVzZWQgYmxvY2tzIGJ5IHNlbGVjdGluZyB0aGUgYGJsb2NrYCBjb2x1bW4gZnJvbSB0aGUgYGV2bUFkZHJlc3NUeEVudGl0eWAgcmVwb3NpdG9yeSxcbiAgICogZmlsdGVyZWQgYnkgdGhlIHByb3ZpZGVkIGBleHRyYWN0b3JJZGBcbiAgICpcbiAgICogQHBhcmFtIGV4dHJhY3RvcklkIC0gSWRlbnRpZmllciBvZiB0aGUgZXh0cmFjdG9yXG4gICAqIEByZXR1cm5zIEEgcXVlcnkgYnVpbGRlciBzZWxlY3RpbmcgdXNlZCBibG9ja3NcbiAgICovXG4gIGNyZWF0ZVVzZWRCbG9ja3NRdWVyeSA9IChcbiAgICBleHRyYWN0b3JJZDogc3RyaW5nLFxuICApOiBTZWxlY3RRdWVyeUJ1aWxkZXI8QWRkcmVzc1R4c0VudGl0eT4gPT4ge1xuICAgIHJldHVybiB0aGlzLnJlcG9zaXRvcnlcbiAgICAgIC5jcmVhdGVRdWVyeUJ1aWxkZXIoJ2V2bUFkZHJlc3NUeEVudGl0eScpXG4gICAgICAuc2VsZWN0KCdldm1BZGRyZXNzVHhFbnRpdHkuYmxvY2tJZCcsICdibG9jaycpXG4gICAgICAud2hlcmUoJ2V2bUFkZHJlc3NUeEVudGl0eS5leHRyYWN0b3IgPSA6ZXh0cmFjdG9ySWQnLCB7IGV4dHJhY3RvcklkIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBoaWdoZXN0IG5vbmNlIHJlY29yZGVkIGZvciB0aGUgc3BlY2lmaWVkIGV4dHJhY3RvciBhbmQgYWRkcmVzc1xuICAgKiB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBnaXZlbiBibG9jayBoZWlnaHQuXG4gICAqXG4gICAqIEBwYXJhbSBleHRyYWN0b3IgLSBFeHRyYWN0b3IgaWRlbnRpZmllci5cbiAgICogQHBhcmFtIGFkZHJlc3MgLSBUaGUgYWRkcmVzcyB0byBmaWx0ZXIgdHJhbnNhY3Rpb25zIGJ5LlxuICAgKiBAcGFyYW0gaGVpZ2h0IC0gVXBwZXIgYm91bmQgYmxvY2sgaGVpZ2h0IChJbmNsdXNpdmUpLlxuICAgKiBAcmV0dXJucyBUaGUgaGlnaGVzdCBub25jZSB1cCB0byB0aGUgZ2l2ZW4gaGVpZ2h0LCBvciAtMSBpZiBubyB0cmFuc2FjdGlvbiBmb3VuZC5cbiAgICovXG4gIGdldE5vbmNlVXBUb0hlaWdodCA9IGFzeW5jIChcbiAgICBleHRyYWN0b3I6IHN0cmluZyxcbiAgICBhZGRyZXNzOiBzdHJpbmcsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXBvc2l0b3J5XG4gICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKCd0eCcpXG4gICAgICAuaW5uZXJKb2luKEJsb2NrRW50aXR5LCAnYmxvY2snLCAnYmxvY2suaGFzaCA9IHR4LmJsb2NrSWQnKVxuICAgICAgLnNlbGVjdCgnTUFYKHR4Lm5vbmNlKScsICdub25jZScpXG4gICAgICAud2hlcmUoJ3R4LmV4dHJhY3RvciA9IDpleHRyYWN0b3InLCB7IGV4dHJhY3RvciB9KVxuICAgICAgLmFuZFdoZXJlKCd0eC5hZGRyZXNzID0gOmFkZHJlc3MnLCB7IGFkZHJlc3MgfSlcbiAgICAgIC5hbmRXaGVyZSgnYmxvY2suaGVpZ2h0IDw9IDpoZWlnaHQnLCB7IGhlaWdodCB9KVxuICAgICAgLmdldFJhd09uZSgpO1xuXG4gICAgcmV0dXJuIHJlc3VsdD8ubm9uY2UgIT09IG51bGwgJiYgcmVzdWx0Py5ub25jZSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IE51bWJlcihyZXN1bHQubm9uY2UpXG4gICAgICA6IC0xO1xuICB9O1xufVxuIl19
@@ -10,10 +10,12 @@ export declare class EvmTxExtractor extends AbstractExtractor<TransactionRespons
10
10
  readonly action: TxAction;
11
11
  private readonly id;
12
12
  private readonly address;
13
+ private readonly provider;
14
+ private readonly checkNonceAtToHeight;
13
15
  /**
14
16
  * address should be lower case (without checksum)
15
17
  */
16
- constructor(dataSource: DataSource, id: string, address: string, logger?: AbstractLogger);
18
+ constructor(dataSource: DataSource, id: string, address: string, rpcUrl: string, authToken?: string, checkNonceAtToHeight?: boolean, logger?: AbstractLogger);
17
19
  /**
18
20
  * get Id for current extractor
19
21
  */
@@ -40,5 +42,14 @@ export declare class EvmTxExtractor extends AbstractExtractor<TransactionRespons
40
42
  * @returns A query builder selecting used blocks
41
43
  */
42
44
  createUsedBlocksQuery: () => SelectQueryBuilder<AddressTxsEntity>;
45
+ /**
46
+ * checks if nonce changes within the specified height range
47
+ *
48
+ * @param fromHeight - Start height of the range being evaluated.
49
+ * @param toHeight - End height of the range being evaluated.
50
+ * @returns `true` if the range may contain relevant transactions,
51
+ * `false` if it is guaranteed to be empty.
52
+ */
53
+ hasEventInHeightRange: (fromHeight: number, toHeight: number) => Promise<boolean>;
43
54
  }
44
55
  //# sourceMappingURL=evmTxExtractor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"evmTxExtractor.d.ts","sourceRoot":"","sources":["../../lib/extractors/evmTxExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAE3E,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,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAE7D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAGhE,qBAAa,cAAe,SAAQ,iBAAiB,CACnD,mBAAmB,EACnB,gBAAgB,CACjB;IACC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC;;OAEG;gBAED,UAAU,EAAE,UAAU,EACtB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,cAAkC;IAS5C;;OAEG;IACH,KAAK,eAAiB;IAEtB;;;;OAIG;IACH,mBAAmB,GACjB,KAAK,KAAK,CAAC,mBAAmB,CAAC,EAC/B,OAAO,SAAS,KACf,OAAO,CAAC,OAAO,CAAC,CAkCjB;IAEF;;;OAGG;IACH,SAAS,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC,CAE7C;IAEF;;OAEG;IACH,cAAc,sBAEZ;IAEF;;;;;OAKG;IACH,qBAAqB,QAAO,kBAAkB,CAAC,gBAAgB,CAAC,CACd;CACnD"}
1
+ {"version":3,"file":"evmTxExtractor.d.ts","sourceRoot":"","sources":["../../lib/extractors/evmTxExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,mBAAmB,EACpB,MAAM,QAAQ,CAAC;AAEhB,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,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAE7D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAGhE,qBAAa,cAAe,SAAQ,iBAAiB,CACnD,mBAAmB,EACnB,gBAAgB,CACjB;IACC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkB;IAC3C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAU;IAE/C;;OAEG;gBAED,UAAU,EAAE,UAAU,EACtB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,oBAAoB,UAAQ,EAC5B,MAAM,GAAE,cAAkC;IAa5C;;OAEG;IACH,KAAK,eAAiB;IAEtB;;;;OAIG;IACH,mBAAmB,GACjB,KAAK,KAAK,CAAC,mBAAmB,CAAC,EAC/B,OAAO,SAAS,KACf,OAAO,CAAC,OAAO,CAAC,CAkCjB;IAEF;;;OAGG;IACH,SAAS,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC,CAE7C;IAEF;;OAEG;IACH,cAAc,sBAEZ;IAEF;;;;;OAKG;IACH,qBAAqB,QAAO,kBAAkB,CAAC,gBAAgB,CAAC,CACd;IAElD;;;;;;;OAOG;IACH,qBAAqB,GACnB,YAAY,MAAM,EAClB,UAAU,MAAM,KACf,OAAO,CAAC,OAAO,CAAC,CAgDjB;CACH"}
@@ -1,4 +1,4 @@
1
- import { isCallException, Transaction } from 'ethers';
1
+ import { isCallException, JsonRpcProvider, Transaction, } from 'ethers';
2
2
  import { AbstractExtractor } from '@rosen-bridge/abstract-extractor';
3
3
  import { DummyLogger } from '@rosen-bridge/abstract-logger';
4
4
  import { TxAction } from '../actions/db';
@@ -8,15 +8,21 @@ export class EvmTxExtractor extends AbstractExtractor {
8
8
  action;
9
9
  id;
10
10
  address;
11
+ provider;
12
+ checkNonceAtToHeight;
11
13
  /**
12
14
  * address should be lower case (without checksum)
13
15
  */
14
- constructor(dataSource, id, address, logger = new DummyLogger()) {
16
+ constructor(dataSource, id, address, rpcUrl, authToken, checkNonceAtToHeight = false, logger = new DummyLogger()) {
15
17
  super();
16
18
  this.id = id;
17
19
  this.address = address;
18
20
  this.logger = logger;
19
21
  this.action = new TxAction(dataSource, this.logger.child('TxAction'));
22
+ this.provider = authToken
23
+ ? new JsonRpcProvider(`${rpcUrl}/${authToken}`)
24
+ : new JsonRpcProvider(rpcUrl);
25
+ this.checkNonceAtToHeight = checkNonceAtToHeight;
20
26
  }
21
27
  /**
22
28
  * get Id for current extractor
@@ -84,5 +90,42 @@ export class EvmTxExtractor extends AbstractExtractor {
84
90
  * @returns A query builder selecting used blocks
85
91
  */
86
92
  createUsedBlocksQuery = () => this.action.createUsedBlocksQuery(this.getId());
93
+ /**
94
+ * checks if nonce changes within the specified height range
95
+ *
96
+ * @param fromHeight - Start height of the range being evaluated.
97
+ * @param toHeight - End height of the range being evaluated.
98
+ * @returns `true` if the range may contain relevant transactions,
99
+ * `false` if it is guaranteed to be empty.
100
+ */
101
+ hasEventInHeightRange = async (fromHeight, toHeight) => {
102
+ const lastDbNonce = await this.action.getNonceUpToHeight(this.getId(), this.address, fromHeight);
103
+ let networkNonce;
104
+ if (this.checkNonceAtToHeight) {
105
+ try {
106
+ networkNonce = await this.provider.getTransactionCount(this.address, toHeight);
107
+ this.logger.debug(`Nonce at height [${toHeight}] is [${networkNonce}]`);
108
+ }
109
+ catch (error) {
110
+ this.logger.debug(`Failed to fetch nonce at height [${toHeight}], falling back to latest nonce: ${error}`);
111
+ networkNonce = await this.provider.getTransactionCount(this.address);
112
+ }
113
+ }
114
+ else {
115
+ networkNonce = await this.provider.getTransactionCount(this.address);
116
+ }
117
+ this.logger.debug(`Checking range [${fromHeight}, ${toHeight}] with db nonce [${lastDbNonce}] and using network nonce [${networkNonce}]`);
118
+ const nextExpectedNonce = lastDbNonce + 1;
119
+ if (networkNonce < nextExpectedNonce) {
120
+ throw new Error(`ImpossibleBehavior: Next network nonce [${networkNonce}] is less than the expected nonce [${nextExpectedNonce}]`);
121
+ }
122
+ if (networkNonce === nextExpectedNonce) {
123
+ this.logger.debug(`No related transaction is expected to be found in block range [${fromHeight}, ${toHeight}]`);
124
+ return false;
125
+ }
126
+ const possibleTxCount = networkNonce - nextExpectedNonce;
127
+ this.logger.debug(`It's possible to have [${possibleTxCount}] related transaction(s) in block range [${fromHeight}, ${toHeight}]`);
128
+ return true;
129
+ };
87
130
  }
88
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZtVHhFeHRyYWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZXh0cmFjdG9ycy9ldm1UeEV4dHJhY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBdUIsTUFBTSxRQUFRLENBQUM7QUFFM0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFrQixXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUk1RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxXQUFXLEVBQWUsTUFBTSxxQkFBcUIsQ0FBQztBQUUvRCxNQUFNLE9BQU8sY0FBZSxTQUFRLGlCQUduQztJQUNVLE1BQU0sQ0FBaUI7SUFDdkIsTUFBTSxDQUFXO0lBQ1QsRUFBRSxDQUFTO0lBQ1gsT0FBTyxDQUFTO0lBRWpDOztPQUVHO0lBQ0gsWUFDRSxVQUFzQixFQUN0QixFQUFVLEVBQ1YsT0FBZSxFQUNmLFNBQXlCLElBQUksV0FBVyxFQUFFO1FBRTFDLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksUUFBUSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBRXRCOzs7O09BSUc7SUFDSCxtQkFBbUIsR0FBRyxLQUFLLEVBQ3pCLEdBQStCLEVBQy9CLEtBQWdCLEVBQ0UsRUFBRTtRQUNwQixNQUFNLFlBQVksR0FBdUIsRUFBRSxDQUFDO1FBQzVDLEtBQUssTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUM7WUFDckIsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNyQixNQUFNLEtBQUssQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO1lBQ3hFLENBQUM7WUFDRCxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ3JCLE1BQU0sS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7WUFDeEUsQ0FBQztZQUNELElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzNDLElBQUksTUFBbUIsQ0FBQztnQkFDeEIsSUFBSSxDQUFDO29CQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDaEMsSUFBSSxNQUFNO3dCQUFFLE1BQU0sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDOzt3QkFFdkMsTUFBTSxLQUFLLENBQ1QsK0JBQStCLEVBQUUsQ0FBQyxJQUFJLDJCQUEyQixLQUFLLENBQUMsSUFBSSw2Q0FBNkMsQ0FDekgsQ0FBQztnQkFDTixDQUFDO2dCQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1gsSUFBSSxlQUFlLENBQUMsQ0FBQyxDQUFDO3dCQUFFLE1BQU0sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDOzt3QkFDL0MsTUFBTSxDQUFDLENBQUM7Z0JBQ2YsQ0FBQztnQkFDRCxZQUFZLENBQUMsSUFBSSxDQUFDO29CQUNoQixZQUFZLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZO29CQUMvQyxVQUFVLEVBQUUsRUFBRSxDQUFDLElBQUk7b0JBQ25CLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSztvQkFDZixPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7b0JBQzlCLE1BQU0sRUFBRSxNQUFNO2lCQUNmLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDekIsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxDQUFDO0lBRUY7OztPQUdHO0lBQ0gsU0FBUyxHQUFHLEtBQUssRUFBRSxJQUFZLEVBQWlCLEVBQUU7UUFDaEQsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQyxDQUFDO0lBRUY7O09BRUc7SUFDSCxjQUFjLEdBQUcsS0FBSyxJQUFJLEVBQUU7UUFDMUIsT0FBTztJQUNULENBQUMsQ0FBQztJQUVGOzs7OztPQUtHO0lBQ0gscUJBQXFCLEdBQUcsR0FBeUMsRUFBRSxDQUNqRSxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0NBQ25EIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNDYWxsRXhjZXB0aW9uLCBUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25SZXNwb25zZSB9IGZyb20gJ2V0aGVycyc7XG5cbmltcG9ydCB7IEFic3RyYWN0RXh0cmFjdG9yIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1leHRyYWN0b3InO1xuaW1wb3J0IHsgQWJzdHJhY3RMb2dnZXIsIER1bW15TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSwgU2VsZWN0UXVlcnlCdWlsZGVyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9leHRlbmRlZC10eXBlb3JtJztcbmltcG9ydCB7IEJsb2NrSW5mbyB9IGZyb20gJ0Byb3Nlbi1icmlkZ2Uvc2Nhbm5lci1pbnRlcmZhY2VzJztcblxuaW1wb3J0IHsgVHhBY3Rpb24gfSBmcm9tICcuLi9hY3Rpb25zL2RiJztcbmltcG9ydCB7IEFkZHJlc3NUeHNFbnRpdHkgfSBmcm9tICcuLi9lbnRpdGllcy9hZGRyZXNzVHhzRW50aXR5JztcbmltcG9ydCB7IEV2bVR4U3RhdHVzLCBFeHRyYWN0ZWRUeCB9IGZyb20gJy4uL2ludGVyZmFjZXMvdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgRXZtVHhFeHRyYWN0b3IgZXh0ZW5kcyBBYnN0cmFjdEV4dHJhY3RvcjxcbiAgVHJhbnNhY3Rpb25SZXNwb25zZSxcbiAgQWRkcmVzc1R4c0VudGl0eVxuPiB7XG4gIHJlYWRvbmx5IGxvZ2dlcjogQWJzdHJhY3RMb2dnZXI7XG4gIHJlYWRvbmx5IGFjdGlvbjogVHhBY3Rpb247XG4gIHByaXZhdGUgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBhZGRyZXNzOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGFkZHJlc3Mgc2hvdWxkIGJlIGxvd2VyIGNhc2UgKHdpdGhvdXQgY2hlY2tzdW0pXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBkYXRhU291cmNlOiBEYXRhU291cmNlLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYWRkcmVzczogc3RyaW5nLFxuICAgIGxvZ2dlcjogQWJzdHJhY3RMb2dnZXIgPSBuZXcgRHVtbXlMb2dnZXIoKSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmlkID0gaWQ7XG4gICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzcztcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcbiAgICB0aGlzLmFjdGlvbiA9IG5ldyBUeEFjdGlvbihkYXRhU291cmNlLCB0aGlzLmxvZ2dlci5jaGlsZCgnVHhBY3Rpb24nKSk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IElkIGZvciBjdXJyZW50IGV4dHJhY3RvclxuICAgKi9cbiAgZ2V0SWQgPSAoKSA9PiB0aGlzLmlkO1xuXG4gIC8qKlxuICAgKiBnZXRzIGJsb2NrIGlkIGFuZCB0cmFuc2FjdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGUgYmxvY2sgYW5kIHNhdmVzIGFsbCB0cmFuc2FjdGlvbiBpZHMgaW4gZGF0YWJhc2VcbiAgICogQHBhcmFtIHR4c1xuICAgKiBAcGFyYW0gYmxvY2tcbiAgICovXG4gIHByb2Nlc3NUcmFuc2FjdGlvbnMgPSBhc3luYyAoXG4gICAgdHhzOiBBcnJheTxUcmFuc2FjdGlvblJlc3BvbnNlPixcbiAgICBibG9jazogQmxvY2tJbmZvLFxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCBleHRyYWN0ZWRUeHM6IEFycmF5PEV4dHJhY3RlZFR4PiA9IFtdO1xuICAgIGZvciAoY29uc3QgdHggb2YgdHhzKSB7XG4gICAgICBpZiAodHguZnJvbSA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBFcnJvcignSW1wb3NzaWJsZUJlaGF2aW9yOiBSUEMgdHJhbnNhY3Rpb25zIG11c3QgaGF2ZSBgZnJvbWAuJyk7XG4gICAgICB9XG4gICAgICBpZiAodHguaGFzaCA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBFcnJvcignSW1wb3NzaWJsZUJlaGF2aW9yOiBSUEMgdHJhbnNhY3Rpb25zIG11c3QgaGF2ZSBgaGFzaGAuJyk7XG4gICAgICB9XG4gICAgICBpZiAodHguZnJvbS50b0xvd2VyQ2FzZSgpID09PSB0aGlzLmFkZHJlc3MpIHtcbiAgICAgICAgbGV0IHN0YXR1czogRXZtVHhTdGF0dXM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHgud2FpdCgwKTtcbiAgICAgICAgICBpZiAocmVzdWx0KSBzdGF0dXMgPSBFdm1UeFN0YXR1cy5zdWNjZWVkO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICBgSW1wb3NzaWJsZUJlaGF2aW9yOiBFdm0gVHggWyR7dHguaGFzaH1dIGlzIGluY2x1ZGVkIGluIGJsb2NrIFske2Jsb2NrLmhhc2h9XSBidXQgd2FpdGluZyByZXN1bHRlZCBpcyBudWxsIG9yIHVuZGVmaW5lZGAsXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGlzQ2FsbEV4Y2VwdGlvbihlKSkgc3RhdHVzID0gRXZtVHhTdGF0dXMuZmFpbGVkO1xuICAgICAgICAgIGVsc2UgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICBleHRyYWN0ZWRUeHMucHVzaCh7XG4gICAgICAgICAgdW5zaWduZWRIYXNoOiBUcmFuc2FjdGlvbi5mcm9tKHR4KS51bnNpZ25lZEhhc2gsXG4gICAgICAgICAgc2lnbmVkSGFzaDogdHguaGFzaCxcbiAgICAgICAgICBub25jZTogdHgubm9uY2UsXG4gICAgICAgICAgYWRkcmVzczogdHguZnJvbS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGV4dHJhY3RlZFR4cy5sZW5ndGggPiAwKVxuICAgICAgYXdhaXQgdGhpcy5hY3Rpb24uc3RvcmVUeHMoZXh0cmFjdGVkVHhzLCBibG9jaywgdGhpcy5nZXRJZCgpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogZm9yayBvbmUgYmxvY2sgYW5kIHJlbW92ZSBhbGwgc3RvcmVkIHR4SWQgZm9yIHRoaXMgYmxvY2tcbiAgICogQHBhcmFtIGhhc2g6IGJsb2NrIGhhc2hcbiAgICovXG4gIGZvcmtCbG9jayA9IGFzeW5jIChoYXNoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBhd2FpdCB0aGlzLmFjdGlvbi5kZWxldGVCbG9ja1R4cyhoYXNoLCB0aGlzLmdldElkKCkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgZGF0YWJhc2Ugd2l0aCBvbGRlciBib3hlcyByZWxhdGVkIHRvIHRoZSBhZGRyZXNzXG4gICAqL1xuICBpbml0aWFsaXplRGF0YSA9IGFzeW5jICgpID0+IHtcbiAgICByZXR1cm47XG4gIH07XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHF1ZXJ5IHRoYXQgcmV0dXJucyB1c2VkIGJsb2NrcyBieSBzZWxlY3RpbmcgdGhlIGBibG9ja2AgY29sdW1uIGZyb20gdGhlIGBldm1BZGRyZXNzVHhFbnRpdHlgIHJlcG9zaXRvcnksXG4gICAqIGZpbHRlcmVkIGJ5IHRoZSBwcm92aWRlZCBgZXh0cmFjdG9ySWRgXG4gICAqXG4gICAqIEByZXR1cm5zIEEgcXVlcnkgYnVpbGRlciBzZWxlY3RpbmcgdXNlZCBibG9ja3NcbiAgICovXG4gIGNyZWF0ZVVzZWRCbG9ja3NRdWVyeSA9ICgpOiBTZWxlY3RRdWVyeUJ1aWxkZXI8QWRkcmVzc1R4c0VudGl0eT4gPT5cbiAgICB0aGlzLmFjdGlvbi5jcmVhdGVVc2VkQmxvY2tzUXVlcnkodGhpcy5nZXRJZCgpKTtcbn1cbiJdfQ==
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZtVHhFeHRyYWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZXh0cmFjdG9ycy9ldm1UeEV4dHJhY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZUFBZSxFQUNmLGVBQWUsRUFDZixXQUFXLEdBRVosTUFBTSxRQUFRLENBQUM7QUFFaEIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFrQixXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUk1RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxXQUFXLEVBQWUsTUFBTSxxQkFBcUIsQ0FBQztBQUUvRCxNQUFNLE9BQU8sY0FBZSxTQUFRLGlCQUduQztJQUNVLE1BQU0sQ0FBaUI7SUFDdkIsTUFBTSxDQUFXO0lBQ1QsRUFBRSxDQUFTO0lBQ1gsT0FBTyxDQUFTO0lBQ2hCLFFBQVEsQ0FBa0I7SUFDMUIsb0JBQW9CLENBQVU7SUFFL0M7O09BRUc7SUFDSCxZQUNFLFVBQXNCLEVBQ3RCLEVBQVUsRUFDVixPQUFlLEVBQ2YsTUFBYyxFQUNkLFNBQWtCLEVBQ2xCLG9CQUFvQixHQUFHLEtBQUssRUFDNUIsU0FBeUIsSUFBSSxXQUFXLEVBQUU7UUFFMUMsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxRQUFRLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTO1lBQ3ZCLENBQUMsQ0FBQyxJQUFJLGVBQWUs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SixDQUFDO1FBQ0QsSUFBSSxZQUFZLEtBQUssaUJBQWlCLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZixrRUFBa0UsVUFBVSxLQUFLLFFBQVEsR0FBRyxDQUM3RixDQUFDO1lBQ0YsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsTUFBTSxlQUFlLEdBQUcsWUFBWSxHQUFHLGlCQUFpQixDQUFDO1FBQ3pELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLDBCQUEwQixlQUFlLDRDQUE0QyxVQUFVLEtBQUssUUFBUSxHQUFHLENBQ2hILENBQUM7UUFDRixPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgaXNDYWxsRXhjZXB0aW9uLFxuICBKc29uUnBjUHJvdmlkZXIsXG4gIFRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvblJlc3BvbnNlLFxufSBmcm9tICdldGhlcnMnO1xuXG5pbXBvcnQgeyBBYnN0cmFjdEV4dHJhY3RvciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtZXh0cmFjdG9yJztcbmltcG9ydCB7IEFic3RyYWN0TG9nZ2VyLCBEdW1teUxvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcbmltcG9ydCB7IERhdGFTb3VyY2UsIFNlbGVjdFF1ZXJ5QnVpbGRlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvZXh0ZW5kZWQtdHlwZW9ybSc7XG5pbXBvcnQgeyBCbG9ja0luZm8gfSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7IFR4QWN0aW9uIH0gZnJvbSAnLi4vYWN0aW9ucy9kYic7XG5pbXBvcnQgeyBBZGRyZXNzVHhzRW50aXR5IH0gZnJvbSAnLi4vZW50aXRpZXMvYWRkcmVzc1R4c0VudGl0eSc7XG5pbXBvcnQgeyBFdm1UeFN0YXR1cywgRXh0cmFjdGVkVHggfSBmcm9tICcuLi9pbnRlcmZhY2VzL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIEV2bVR4RXh0cmFjdG9yIGV4dGVuZHMgQWJzdHJhY3RFeHRyYWN0b3I8XG4gIFRyYW5zYWN0aW9uUmVzcG9uc2UsXG4gIEFkZHJlc3NUeHNFbnRpdHlcbj4ge1xuICByZWFkb25seSBsb2dnZXI6IEFic3RyYWN0TG9nZ2VyO1xuICByZWFkb25seSBhY3Rpb246IFR4QWN0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkcmVzczogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3ZpZGVyOiBKc29uUnBjUHJvdmlkZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hlY2tOb25jZUF0VG9IZWlnaHQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGFkZHJlc3Mgc2hvdWxkIGJlIGxvd2VyIGNhc2UgKHdpdGhvdXQgY2hlY2tzdW0pXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBkYXRhU291cmNlOiBEYXRhU291cmNlLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYWRkcmVzczogc3RyaW5nLFxuICAgIHJwY1VybDogc3RyaW5nLFxuICAgIGF1dGhUb2tlbj86IHN0cmluZyxcbiAgICBjaGVja05vbmNlQXRUb0hlaWdodCA9IGZhbHNlLFxuICAgIGxvZ2dlcjogQWJzdHJhY3RMb2dnZXIgPSBuZXcgRHVtbXlMb2dnZXIoKSxcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmlkID0gaWQ7XG4gICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzcztcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjtcbiAgICB0aGlzLmFjdGlvbiA9IG5ldyBUeEFjdGlvbihkYXRhU291cmNlLCB0aGlzLmxvZ2dlci5jaGlsZCgnVHhBY3Rpb24nKSk7XG4gICAgdGhpcy5wcm92aWRlciA9IGF1dGhUb2tlblxuICAgICAgPyBuZXcgSnNvblJwY1Byb3ZpZGVyKGAke3JwY1VybH0vJHthdXRoVG9rZW59YClcbiAgICAgIDogbmV3IEpzb25ScGNQcm92aWRlcihycGNVcmwpO1xuICAgIHRoaXMuY2hlY2tOb25jZUF0VG9IZWlnaHQgPSBjaGVja05vbmNlQXRUb0hlaWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgSWQgZm9yIGN1cnJlbnQgZXh0cmFjdG9yXG4gICAqL1xuICBnZXRJZCA9ICgpID0+IHRoaXMuaWQ7XG5cbiAgLyoqXG4gICAqIGdldHMgYmxvY2sgaWQgYW5kIHRyYW5zYWN0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBibG9jayBhbmQgc2F2ZXMgYWxsIHRyYW5zYWN0aW9uIGlkcyBpbiBkYXRhYmFzZVxuICAgKiBAcGFyYW0gdHhzXG4gICAqIEBwYXJhbSBibG9ja1xuICAgKi9cbiAgcHJvY2Vzc1RyYW5zYWN0aW9ucyA9IGFzeW5jIChcbiAgICB0eHM6IEFycmF5PFRyYW5zYWN0aW9uUmVzcG9uc2U+LFxuICAgIGJsb2NrOiBCbG9ja0luZm8sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIGNvbnN0IGV4dHJhY3RlZFR4czogQXJyYXk8RXh0cmFjdGVkVHg+ID0gW107XG4gICAgZm9yIChjb25zdCB0eCBvZiB0eHMpIHtcbiAgICAgIGlmICh0eC5mcm9tID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdJbXBvc3NpYmxlQmVoYXZpb3I6IFJQQyB0cmFuc2FjdGlvbnMgbXVzdCBoYXZlIGBmcm9tYC4nKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eC5oYXNoID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdJbXBvc3NpYmxlQmVoYXZpb3I6IFJQQyB0cmFuc2FjdGlvbnMgbXVzdCBoYXZlIGBoYXNoYC4nKTtcbiAgICAgIH1cbiAgICAgIGlmICh0eC5mcm9tLnRvTG93ZXJDYXNlKCkgPT09IHRoaXMuYWRkcmVzcykge1xuICAgICAgICBsZXQgc3RhdHVzOiBFdm1UeFN0YXR1cztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0eC53YWl0KDApO1xuICAgICAgICAgIGlmIChyZXN1bHQpIHN0YXR1cyA9IEV2bVR4U3RhdHVzLnN1Y2NlZWQ7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgIGBJbXBvc3NpYmxlQmVoYXZpb3I6IEV2bSBUeCBbJHt0eC5oYXNofV0gaXMgaW5jbHVkZWQgaW4gYmxvY2sgWyR7YmxvY2suaGFzaH1dIGJ1dCB3YWl0aW5nIHJlc3VsdGVkIGlzIG51bGwgb3IgdW5kZWZpbmVkYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoaXNDYWxsRXhjZXB0aW9uKGUpKSBzdGF0dXMgPSBFdm1UeFN0YXR1cy5mYWlsZWQ7XG4gICAgICAgICAgZWxzZSB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGV4dHJhY3RlZFR4cy5wdXNoKHtcbiAgICAgICAgICB1bnNpZ25lZEhhc2g6IFRyYW5zYWN0aW9uLmZyb20odHgpLnVuc2lnbmVkSGFzaCxcbiAgICAgICAgICBzaWduZWRIYXNoOiB0eC5oYXNoLFxuICAgICAgICAgIG5vbmNlOiB0eC5ub25jZSxcbiAgICAgICAgICBhZGRyZXNzOiB0eC5mcm9tLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgc3RhdHVzOiBzdGF0dXMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXh0cmFjdGVkVHhzLmxlbmd0aCA+IDApXG4gICAgICBhd2FpdCB0aGlzLmFjdGlvbi5zdG9yZVR4cyhleHRyYWN0ZWRUeHMsIGJsb2NrLCB0aGlzLmdldElkKCkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBmb3JrIG9uZSBibG9jayBhbmQgcmVtb3ZlIGFsbCBzdG9yZWQgdHhJZCBmb3IgdGhpcyBibG9ja1xuICAgKiBAcGFyYW0gaGFzaDogYmxvY2sgaGFzaFxuICAgKi9cbiAgZm9ya0Jsb2NrID0gYXN5bmMgKGhhc2g6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGF3YWl0IHRoaXMuYWN0aW9uLmRlbGV0ZUJsb2NrVHhzKGhhc2gsIHRoaXMuZ2V0SWQoKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBkYXRhYmFzZSB3aXRoIG9sZGVyIGJveGVzIHJlbGF0ZWQgdG8gdGhlIGFkZHJlc3NcbiAgICovXG4gIGluaXRpYWxpemVEYXRhID0gYXN5bmMgKCkgPT4ge1xuICAgIHJldHVybjtcbiAgfTtcblxuICAvKipcbiAgICogQnVpbGRzIGEgcXVlcnkgdGhhdCByZXR1cm5zIHVzZWQgYmxvY2tzIGJ5IHNlbGVjdGluZyB0aGUgYGJsb2NrYCBjb2x1bW4gZnJvbSB0aGUgYGV2bUFkZHJlc3NUeEVudGl0eWAgcmVwb3NpdG9yeSxcbiAgICogZmlsdGVyZWQgYnkgdGhlIHByb3ZpZGVkIGBleHRyYWN0b3JJZGBcbiAgICpcbiAgICogQHJldHVybnMgQSBxdWVyeSBidWlsZGVyIHNlbGVjdGluZyB1c2VkIGJsb2Nrc1xuICAgKi9cbiAgY3JlYXRlVXNlZEJsb2Nrc1F1ZXJ5ID0gKCk6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxBZGRyZXNzVHhzRW50aXR5PiA9PlxuICAgIHRoaXMuYWN0aW9uLmNyZWF0ZVVzZWRCbG9ja3NRdWVyeSh0aGlzLmdldElkKCkpO1xuXG4gIC8qKlxuICAgKiBjaGVja3MgaWYgbm9uY2UgY2hhbmdlcyB3aXRoaW4gdGhlIHNwZWNpZmllZCBoZWlnaHQgcmFuZ2VcbiAgICpcbiAgICogQHBhcmFtIGZyb21IZWlnaHQgLSBTdGFydCBoZWlnaHQgb2YgdGhlIHJhbmdlIGJlaW5nIGV2YWx1YXRlZC5cbiAgICogQHBhcmFtIHRvSGVpZ2h0IC0gRW5kIGhlaWdodCBvZiB0aGUgcmFuZ2UgYmVpbmcgZXZhbHVhdGVkLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHJhbmdlIG1heSBjb250YWluIHJlbGV2YW50IHRyYW5zYWN0aW9ucyxcbiAgICogYGZhbHNlYCBpZiBpdCBpcyBndWFyYW50ZWVkIHRvIGJlIGVtcHR5LlxuICAgKi9cbiAgaGFzRXZlbnRJbkhlaWdodFJhbmdlID0gYXN5bmMgKFxuICAgIGZyb21IZWlnaHQ6IG51bWJlcixcbiAgICB0b0hlaWdodDogbnVtYmVyLFxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCBsYXN0RGJOb25jZSA9IGF3YWl0IHRoaXMuYWN0aW9uLmdldE5vbmNlVXBUb0hlaWdodChcbiAgICAgIHRoaXMuZ2V0SWQoKSxcbiAgICAgIHRoaXMuYWRkcmVzcyxcbiAgICAgIGZyb21IZWlnaHQsXG4gICAgKTtcblxuICAgIGxldCBuZXR3b3JrTm9uY2U6IG51bWJlcjtcbiAgICBpZiAodGhpcy5jaGVja05vbmNlQXRUb0hlaWdodCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV0d29ya05vbmNlID0gYXdhaXQgdGhpcy5wcm92aWRlci5nZXRUcmFuc2FjdGlvbkNvdW50KFxuICAgICAgICAgIHRoaXMuYWRkcmVzcyxcbiAgICAgICAgICB0b0hlaWdodCxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgTm9uY2UgYXQgaGVpZ2h0IFske3RvSGVpZ2h0fV0gaXMgWyR7bmV0d29ya05vbmNlfV1gKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIGBGYWlsZWQgdG8gZmV0Y2ggbm9uY2UgYXQgaGVpZ2h0IFske3RvSGVpZ2h0fV0sIGZhbGxpbmcgYmFjayB0byBsYXRlc3Qgbm9uY2U6ICR7ZXJyb3J9YCxcbiAgICAgICAgKTtcbiAgICAgICAgbmV0d29ya05vbmNlID0gYXdhaXQgdGhpcy5wcm92aWRlci5nZXRUcmFuc2FjdGlvbkNvdW50KHRoaXMuYWRkcmVzcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ldHdvcmtOb25jZSA9IGF3YWl0IHRoaXMucHJvdmlkZXIuZ2V0VHJhbnNhY3Rpb25Db3VudCh0aGlzLmFkZHJlc3MpO1xuICAgIH1cblxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgYENoZWNraW5nIHJhbmdlIFske2Zyb21IZWlnaHR9LCAke3RvSGVpZ2h0fV0gd2l0aCBkYiBub25jZSBbJHtsYXN0RGJOb25jZX1dIGFuZCB1c2luZyBuZXR3b3JrIG5vbmNlIFske25ldHdvcmtOb25jZX1dYCxcbiAgICApO1xuXG4gICAgY29uc3QgbmV4dEV4cGVjdGVkTm9uY2UgPSBsYXN0RGJOb25jZSArIDE7XG5cbiAgICBpZiAobmV0d29ya05vbmNlIDwgbmV4dEV4cGVjdGVkTm9uY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEltcG9zc2libGVCZWhhdmlvcjogTmV4dCBuZXR3b3JrIG5vbmNlIFske25ldHdvcmtOb25jZX1dIGlzIGxlc3MgdGhhbiB0aGUgZXhwZWN0ZWQgbm9uY2UgWyR7bmV4dEV4cGVjdGVkTm9uY2V9XWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobmV0d29ya05vbmNlID09PSBuZXh0RXhwZWN0ZWROb25jZSkge1xuICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgIGBObyByZWxhdGVkIHRyYW5zYWN0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIGZvdW5kIGluIGJsb2NrIHJhbmdlIFske2Zyb21IZWlnaHR9LCAke3RvSGVpZ2h0fV1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcG9zc2libGVUeENvdW50ID0gbmV0d29ya05vbmNlIC0gbmV4dEV4cGVjdGVkTm9uY2U7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBgSXQncyBwb3NzaWJsZSB0byBoYXZlIFske3Bvc3NpYmxlVHhDb3VudH1dIHJlbGF0ZWQgdHJhbnNhY3Rpb24ocykgaW4gYmxvY2sgcmFuZ2UgWyR7ZnJvbUhlaWdodH0sICR7dG9IZWlnaHR9XWAsXG4gICAgKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn1cbiJdfQ==