@rosen-bridge/evm-address-tx-extractor 0.1.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.
Files changed (43) hide show
  1. package/.eslintignore +1 -0
  2. package/README.md +24 -0
  3. package/dist/actions/db.d.ts +24 -0
  4. package/dist/actions/db.d.ts.map +1 -0
  5. package/dist/actions/db.js +50 -0
  6. package/dist/entities/AddressTxsEntity.d.ts +10 -0
  7. package/dist/entities/AddressTxsEntity.d.ts.map +1 -0
  8. package/dist/entities/AddressTxsEntity.js +52 -0
  9. package/dist/extractors/EvmTxExtractor.d.ts +32 -0
  10. package/dist/extractors/EvmTxExtractor.d.ts.map +1 -0
  11. package/dist/extractors/EvmTxExtractor.js +59 -0
  12. package/dist/index.d.ts +6 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +6 -0
  15. package/dist/interfaces/types.d.ts +7 -0
  16. package/dist/interfaces/types.d.ts.map +1 -0
  17. package/dist/interfaces/types.js +2 -0
  18. package/dist/migrations/index.d.ts +8 -0
  19. package/dist/migrations/index.d.ts.map +1 -0
  20. package/dist/migrations/index.js +7 -0
  21. package/dist/migrations/postgres/1713694851290-migration.d.ts +7 -0
  22. package/dist/migrations/postgres/1713694851290-migration.d.ts.map +1 -0
  23. package/dist/migrations/postgres/1713694851290-migration.js +23 -0
  24. package/dist/migrations/sqlite/1713694799333-migration.d.ts +7 -0
  25. package/dist/migrations/sqlite/1713694799333-migration.d.ts.map +1 -0
  26. package/dist/migrations/sqlite/1713694799333-migration.js +22 -0
  27. package/lib/actions/db.ts +68 -0
  28. package/lib/entities/AddressTxsEntity.ts +25 -0
  29. package/lib/extractors/EvmTxExtractor.ts +82 -0
  30. package/lib/index.ts +5 -0
  31. package/lib/interfaces/types.ts +6 -0
  32. package/lib/migrations/index.ts +7 -0
  33. package/lib/migrations/postgres/1713694851290-migration.ts +26 -0
  34. package/lib/migrations/sqlite/1713694799333-migration.ts +25 -0
  35. package/package.json +41 -0
  36. package/tests/actions/db.spec.ts +123 -0
  37. package/tests/extractor/EvmTxExtractor.spec.ts +48 -0
  38. package/tests/extractor/testData.ts +86 -0
  39. package/tests/testUtils.ts +22 -0
  40. package/tsconfig.build.json +7 -0
  41. package/tsconfig.build.tsbuildinfo +1 -0
  42. package/tsconfig.json +8 -0
  43. package/vitest.config.ts +18 -0
package/.eslintignore ADDED
@@ -0,0 +1 @@
1
+ dist
package/README.md ADDED
@@ -0,0 +1,24 @@
1
+ # @rosen-bridge/evm-address-tx-extractor
2
+
3
+ ## Table of contents
4
+
5
+ - [Introduction](#introduction)
6
+ - [Installation](#installation)
7
+
8
+ ## Introduction
9
+
10
+ Extract and store EVM chain notable data of transactions for an address
11
+
12
+ ## Installation
13
+
14
+ npm:
15
+
16
+ ```sh
17
+ npm i @rosen-bridge/evm-address-tx-extractor
18
+ ```
19
+
20
+ yarn:
21
+
22
+ ```sh
23
+ yarn add @rosen-bridge/evm-address-tx-extractor
24
+ ```
@@ -0,0 +1,24 @@
1
+ import { ExtractedTx } from '../interfaces/types';
2
+ import { DataSource } from 'typeorm';
3
+ import { BlockEntity } from '@rosen-bridge/scanner';
4
+ import { AbstractLogger } from '@rosen-bridge/abstract-logger';
5
+ export declare class TxAction {
6
+ private readonly repository;
7
+ readonly logger: AbstractLogger;
8
+ constructor(dataSource: DataSource, logger?: AbstractLogger);
9
+ /**
10
+ * remove all inserted transaction for specific block in specific extractor from database
11
+ * @param blockId selected block id
12
+ * @param extractor selected extractor
13
+ */
14
+ deleteBlockTxs: (blockId: string, extractor: string) => Promise<void>;
15
+ /**
16
+ * remove old list of transactions and
17
+ * store a new list of transactions database for specific block and extractor
18
+ * @param txs
19
+ * @param block
20
+ * @param extractor
21
+ */
22
+ storeTxs: (txs: Array<ExtractedTx>, block: BlockEntity, extractor: string) => Promise<void>;
23
+ }
24
+ //# sourceMappingURL=db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../lib/actions/db.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAc,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAE5E,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,YAAmB,MAAM,aAAa,MAAM,mBAYxD;IAEF;;;;;;OAMG;IACH,QAAQ,QACD,MAAM,WAAW,CAAC,SAChB,WAAW,aACP,MAAM,mBAsBjB;CACH"}
@@ -0,0 +1,50 @@
1
+ import { AddressTxsEntity } from '../entities/AddressTxsEntity';
2
+ import { DummyLogger } from '@rosen-bridge/abstract-logger';
3
+ export class TxAction {
4
+ repository;
5
+ logger;
6
+ constructor(dataSource, logger) {
7
+ this.repository = dataSource.getRepository(AddressTxsEntity);
8
+ this.logger = logger ? logger : new DummyLogger();
9
+ }
10
+ /**
11
+ * remove all inserted transaction for specific block in specific extractor from database
12
+ * @param blockId selected block id
13
+ * @param extractor selected extractor
14
+ */
15
+ deleteBlockTxs = async (blockId, extractor) => {
16
+ this.logger.info(`Deleting transactions of block ${blockId} and extractor ${extractor}`);
17
+ await this.repository
18
+ .createQueryBuilder()
19
+ .delete()
20
+ .where('extractor = :extractor AND blockId = :blockId', {
21
+ blockId: blockId,
22
+ extractor: extractor,
23
+ })
24
+ .execute();
25
+ };
26
+ /**
27
+ * remove old list of transactions and
28
+ * store a new list of transactions database for specific block and extractor
29
+ * @param txs
30
+ * @param block
31
+ * @param extractor
32
+ */
33
+ storeTxs = async (txs, block, extractor) => {
34
+ await this.deleteBlockTxs(block.hash, extractor);
35
+ this.logger.info(`Inserting new transactions [${txs.map((tx) => tx.signedHash)}] in block ${block} and extractor ${extractor}`);
36
+ await this.repository
37
+ .createQueryBuilder()
38
+ .insert()
39
+ .values(txs.map((tx) => ({
40
+ unsignedHash: tx.unsignedHash,
41
+ signedHash: tx.signedHash,
42
+ nonce: tx.nonce,
43
+ address: tx.address,
44
+ blockId: block.hash,
45
+ extractor: extractor,
46
+ })))
47
+ .execute();
48
+ };
49
+ }
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYWN0aW9ucy9kYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUloRSxPQUFPLEVBQWtCLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTVFLE1BQU0sT0FBTyxRQUFRO0lBQ0YsVUFBVSxDQUErQjtJQUNqRCxNQUFNLENBQWlCO0lBRWhDLFlBQVksVUFBc0IsRUFBRSxNQUF1QjtRQUN6RCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsY0FBYyxHQUFHLEtBQUssRUFBRSxPQUFlLEVBQUUsU0FBaUIsRUFBRSxFQUFFO1FBQzVELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNkLGtDQUFrQyxPQUFPLGtCQUFrQixTQUFTLEVBQUUsQ0FDdkUsQ0FBQztRQUNGLE1BQU0sSUFBSSxDQUFDLFVBQVU7YUFDbEIsa0JBQWtCLEVBQUU7YUFDcEIsTUFBTSxFQUFFO2FBQ1IsS0FBSyxDQUFDLCtDQUErQyxFQUFFO1lBQ3RELE9BQU8sRUFBRSxPQUFPO1lBQ2hCLFNBQVMsRUFBRSxTQUFTO1NBQ3JCLENBQUM7YUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNmLENBQUMsQ0FBQztJQUVGOzs7Ozs7T0FNRztJQUNILFFBQVEsR0FBRyxLQUFLLEVBQ2QsR0FBdUIsRUFDdkIsS0FBa0IsRUFDbEIsU0FBaUIsRUFDakIsRUFBRTtRQUNGLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNkLCtCQUErQixHQUFHLENBQUMsR0FBRyxDQUNwQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FDdEIsY0FBYyxLQUFLLGtCQUFrQixTQUFTLEVBQUUsQ0FDbEQsQ0FBQztRQUNGLE1BQU0sSUFBSSxDQUFDLFVBQVU7YUFDbEIsa0JBQWtCLEVBQUU7YUFDcEIsTUFBTSxFQUFFO2FBQ1IsTUFBTSxDQUNMLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDZixZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVk7WUFDN0IsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVO1lBQ3pCLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSztZQUNmLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTztZQUNuQixPQUFPLEVBQUUsS0FBSyxDQUFDLElBQUk7WUFDbkIsU0FBUyxFQUFFLFNBQVM7U0FDckIsQ0FBQyxDQUFDLENBQ0o7YUFDQSxPQUFPLEVBQUUsQ0FBQztJQUNmLENBQUMsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWRkcmVzc1R4c0VudGl0eSB9IGZyb20gJy4uL2VudGl0aWVzL0FkZHJlc3NUeHNFbnRpdHknO1xuaW1wb3J0IHsgRXh0cmFjdGVkVHggfSBmcm9tICcuLi9pbnRlcmZhY2VzL3R5cGVzJztcbmltcG9ydCB7IERhdGFTb3VyY2UsIFJlcG9zaXRvcnkgfSBmcm9tICd0eXBlb3JtJztcbmltcG9ydCB7IEJsb2NrRW50aXR5IH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyJztcbmltcG9ydCB7IEFic3RyYWN0TG9nZ2VyLCBEdW1teUxvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcblxuZXhwb3J0IGNsYXNzIFR4QWN0aW9uIHtcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvc2l0b3J5OiBSZXBvc2l0b3J5PEFkZHJlc3NUeHNFbnRpdHk+O1xuICByZWFkb25seSBsb2dnZXI6IEFic3RyYWN0TG9nZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsIGxvZ2dlcj86IEFic3RyYWN0TG9nZ2VyKSB7XG4gICAgdGhpcy5yZXBvc2l0b3J5ID0gZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KEFkZHJlc3NUeHNFbnRpdHkpO1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyID8gbG9nZ2VyIDogbmV3IER1bW15TG9nZ2VyKCk7XG4gIH1cblxuICAvKipcbiAgICogcmVtb3ZlIGFsbCBpbnNlcnRlZCB0cmFuc2FjdGlvbiBmb3Igc3BlY2lmaWMgYmxvY2sgaW4gc3BlY2lmaWMgZXh0cmFjdG9yIGZyb20gZGF0YWJhc2VcbiAgICogQHBhcmFtIGJsb2NrSWQgc2VsZWN0ZWQgYmxvY2sgaWRcbiAgICogQHBhcmFtIGV4dHJhY3RvciBzZWxlY3RlZCBleHRyYWN0b3JcbiAgICovXG4gIGRlbGV0ZUJsb2NrVHhzID0gYXN5bmMgKGJsb2NrSWQ6IHN0cmluZywgZXh0cmFjdG9yOiBzdHJpbmcpID0+IHtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgYERlbGV0aW5nIHRyYW5zYWN0aW9ucyBvZiBibG9jayAke2Jsb2NrSWR9IGFuZCBleHRyYWN0b3IgJHtleHRyYWN0b3J9YFxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5yZXBvc2l0b3J5XG4gICAgICAuY3JlYXRlUXVlcnlCdWlsZGVyKClcbiAgICAgIC5kZWxldGUoKVxuICAgICAgLndoZXJlKCdleHRyYWN0b3IgPSA6ZXh0cmFjdG9yIEFORCBibG9ja0lkID0gOmJsb2NrSWQnLCB7XG4gICAgICAgIGJsb2NrSWQ6IGJsb2NrSWQsXG4gICAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgICAgfSlcbiAgICAgIC5leGVjdXRlKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHJlbW92ZSBvbGQgbGlzdCBvZiB0cmFuc2FjdGlvbnMgYW5kXG4gICAqIHN0b3JlIGEgbmV3IGxpc3Qgb2YgdHJhbnNhY3Rpb25zIGRhdGFiYXNlIGZvciBzcGVjaWZpYyBibG9jayBhbmQgZXh0cmFjdG9yXG4gICAqIEBwYXJhbSB0eHNcbiAgICogQHBhcmFtIGJsb2NrXG4gICAqIEBwYXJhbSBleHRyYWN0b3JcbiAgICovXG4gIHN0b3JlVHhzID0gYXN5bmMgKFxuICAgIHR4czogQXJyYXk8RXh0cmFjdGVkVHg+LFxuICAgIGJsb2NrOiBCbG9ja0VudGl0eSxcbiAgICBleHRyYWN0b3I6IHN0cmluZ1xuICApID0+IHtcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZUJsb2NrVHhzKGJsb2NrLmhhc2gsIGV4dHJhY3Rvcik7XG4gICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgIGBJbnNlcnRpbmcgbmV3IHRyYW5zYWN0aW9ucyBbJHt0eHMubWFwKFxuICAgICAgICAodHgpID0+IHR4LnNpZ25lZEhhc2hcbiAgICAgICl9XSBpbiBibG9jayAke2Jsb2NrfSBhbmQgZXh0cmFjdG9yICR7ZXh0cmFjdG9yfWBcbiAgICApO1xuICAgIGF3YWl0IHRoaXMucmVwb3NpdG9yeVxuICAgICAgLmNyZWF0ZVF1ZXJ5QnVpbGRlcigpXG4gICAgICAuaW5zZXJ0KClcbiAgICAgIC52YWx1ZXMoXG4gICAgICAgIHR4cy5tYXAoKHR4KSA9PiAoe1xuICAgICAgICAgIHVuc2lnbmVkSGFzaDogdHgudW5zaWduZWRIYXNoLFxuICAgICAgICAgIHNpZ25lZEhhc2g6IHR4LnNpZ25lZEhhc2gsXG4gICAgICAgICAgbm9uY2U6IHR4Lm5vbmNlLFxuICAgICAgICAgIGFkZHJlc3M6IHR4LmFkZHJlc3MsXG4gICAgICAgICAgYmxvY2tJZDogYmxvY2suaGFzaCxcbiAgICAgICAgICBleHRyYWN0b3I6IGV4dHJhY3RvcixcbiAgICAgICAgfSkpXG4gICAgICApXG4gICAgICAuZXhlY3V0ZSgpO1xuICB9O1xufVxuIl19
@@ -0,0 +1,10 @@
1
+ export declare class AddressTxsEntity {
2
+ id: number;
3
+ unsignedHash: string;
4
+ signedHash: string;
5
+ nonce: number;
6
+ address: string;
7
+ blockId: string;
8
+ extractor: string;
9
+ }
10
+ //# sourceMappingURL=AddressTxsEntity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddressTxsEntity.d.ts","sourceRoot":"","sources":["../../lib/entities/AddressTxsEntity.ts"],"names":[],"mappings":"AAEA,qBACa,gBAAgB;IAE3B,EAAE,EAAE,MAAM,CAAC;IAGX,YAAY,EAAE,MAAM,CAAC;IAGrB,UAAU,EAAE,MAAM,CAAC;IAGnB,KAAK,EAAE,MAAM,CAAC;IAGd,OAAO,EAAE,MAAM,CAAC;IAGhB,OAAO,EAAE,MAAM,CAAC;IAGhB,SAAS,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,52 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
11
+ let AddressTxsEntity = class AddressTxsEntity {
12
+ id;
13
+ unsignedHash;
14
+ signedHash;
15
+ nonce;
16
+ address;
17
+ blockId;
18
+ extractor;
19
+ };
20
+ __decorate([
21
+ PrimaryGeneratedColumn({ type: 'integer' }),
22
+ __metadata("design:type", Number)
23
+ ], AddressTxsEntity.prototype, "id", void 0);
24
+ __decorate([
25
+ Column({ type: 'varchar' }),
26
+ __metadata("design:type", String)
27
+ ], AddressTxsEntity.prototype, "unsignedHash", void 0);
28
+ __decorate([
29
+ Column({ type: 'varchar' }),
30
+ __metadata("design:type", String)
31
+ ], AddressTxsEntity.prototype, "signedHash", void 0);
32
+ __decorate([
33
+ Column({ type: 'integer' }),
34
+ __metadata("design:type", Number)
35
+ ], AddressTxsEntity.prototype, "nonce", void 0);
36
+ __decorate([
37
+ Column({ type: 'varchar' }),
38
+ __metadata("design:type", String)
39
+ ], AddressTxsEntity.prototype, "address", void 0);
40
+ __decorate([
41
+ Column({ type: 'varchar' }),
42
+ __metadata("design:type", String)
43
+ ], AddressTxsEntity.prototype, "blockId", void 0);
44
+ __decorate([
45
+ Column({ type: 'varchar' }),
46
+ __metadata("design:type", String)
47
+ ], AddressTxsEntity.prototype, "extractor", void 0);
48
+ AddressTxsEntity = __decorate([
49
+ Entity('address_txs_entity')
50
+ ], AddressTxsEntity);
51
+ export { AddressTxsEntity };
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWRkcmVzc1R4c0VudGl0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9lbnRpdGllcy9BZGRyZXNzVHhzRW50aXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRzFELElBQU0sZ0JBQWdCLEdBQXRCLE1BQU0sZ0JBQWdCO0lBRTNCLEVBQUUsQ0FBUztJQUdYLFlBQVksQ0FBUztJQUdyQixVQUFVLENBQVM7SUFHbkIsS0FBSyxDQUFTO0lBR2QsT0FBTyxDQUFTO0lBR2hCLE9BQU8sQ0FBUztJQUdoQixTQUFTLENBQVM7Q0FDbkIsQ0FBQTtBQW5CQztJQURDLHNCQUFzQixDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOzs0Q0FDakM7QUFHWDtJQURDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7c0RBQ1A7QUFHckI7SUFEQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7O29EQUNUO0FBR25CO0lBREMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOzsrQ0FDZDtBQUdkO0lBREMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOztpREFDWjtBQUdoQjtJQURDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7aURBQ1o7QUFHaEI7SUFEQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7O21EQUNWO0FBcEJQLGdCQUFnQjtJQUQ1QixNQUFNLENBQUMsb0JBQW9CLENBQUM7R0FDaEIsZ0JBQWdCLENBcUI1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbHVtbiwgRW50aXR5LCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uIH0gZnJvbSAndHlwZW9ybSc7XG5cbkBFbnRpdHkoJ2FkZHJlc3NfdHhzX2VudGl0eScpXG5leHBvcnQgY2xhc3MgQWRkcmVzc1R4c0VudGl0eSB7XG4gIEBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uKHsgdHlwZTogJ2ludGVnZXInIH0pXG4gIGlkOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICB1bnNpZ25lZEhhc2g6IHN0cmluZztcblxuICBAQ29sdW1uKHsgdHlwZTogJ3ZhcmNoYXInIH0pXG4gIHNpZ25lZEhhc2g6IHN0cmluZztcblxuICBAQ29sdW1uKHsgdHlwZTogJ2ludGVnZXInIH0pXG4gIG5vbmNlOiBudW1iZXI7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICBhZGRyZXNzOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICBibG9ja0lkOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICBleHRyYWN0b3I6IHN0cmluZztcbn1cbiJdfQ==
@@ -0,0 +1,32 @@
1
+ import { DataSource } from 'typeorm';
2
+ import { TxAction } from '../actions/db';
3
+ import { AbstractExtractor, BlockEntity } from '@rosen-bridge/scanner';
4
+ import { Transaction } from 'ethers';
5
+ import { AbstractLogger } from '@rosen-bridge/abstract-logger';
6
+ export declare class EvmTxExtractor extends AbstractExtractor<Transaction> {
7
+ readonly logger: AbstractLogger;
8
+ readonly action: TxAction;
9
+ private readonly id;
10
+ private readonly address;
11
+ constructor(dataSource: DataSource, id: string, address: string, logger?: AbstractLogger);
12
+ /**
13
+ * get Id for current extractor
14
+ */
15
+ getId: () => string;
16
+ /**
17
+ * gets block id and transactions corresponding to the block and saves all transaction ids in database
18
+ * @param txs
19
+ * @param block
20
+ */
21
+ processTransactions: (txs: Array<Transaction>, block: BlockEntity) => Promise<boolean>;
22
+ /**
23
+ * fork one block and remove all stored txId for this block
24
+ * @param hash: block hash
25
+ */
26
+ forkBlock: (hash: string) => Promise<void>;
27
+ /**
28
+ * Initializes the database with older boxes related to the address
29
+ */
30
+ initializeBoxes: () => Promise<void>;
31
+ }
32
+ //# sourceMappingURL=EvmTxExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvmTxExtractor.d.ts","sourceRoot":"","sources":["../../lib/extractors/EvmTxExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAG5E,qBAAa,cAAe,SAAQ,iBAAiB,CAAC,WAAW,CAAC;IAChE,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;gBAG/B,UAAU,EAAE,UAAU,EACtB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,cAAkC;IAS5C;;OAEG;IACH,KAAK,eAAiB;IAEtB;;;;OAIG;IACH,mBAAmB,QACZ,MAAM,WAAW,CAAC,SAChB,WAAW,KACjB,QAAQ,OAAO,CAAC,CA0BjB;IAEF;;;OAGG;IACH,SAAS,SAAgB,MAAM,KAAG,QAAQ,IAAI,CAAC,CAE7C;IAEF;;OAEG;IACH,eAAe,sBAEb;CACH"}
@@ -0,0 +1,59 @@
1
+ import { TxAction } from '../actions/db';
2
+ import { AbstractExtractor } from '@rosen-bridge/scanner';
3
+ import { DummyLogger } from '@rosen-bridge/abstract-logger';
4
+ export class EvmTxExtractor extends AbstractExtractor {
5
+ logger;
6
+ action;
7
+ id;
8
+ address;
9
+ constructor(dataSource, id, address, logger = new DummyLogger()) {
10
+ super();
11
+ this.id = id;
12
+ this.address = address;
13
+ this.logger = logger;
14
+ this.action = new TxAction(dataSource, this.logger);
15
+ }
16
+ /**
17
+ * get Id for current extractor
18
+ */
19
+ getId = () => this.id;
20
+ /**
21
+ * gets block id and transactions corresponding to the block and saves all transaction ids in database
22
+ * @param txs
23
+ * @param block
24
+ */
25
+ processTransactions = async (txs, block) => {
26
+ const extractedTxs = txs.reduce((addressTxs, tx) => {
27
+ if (tx.from === null) {
28
+ throw Error('ImpossibleBehaviour: RPC transactions must have `from`.');
29
+ }
30
+ if (tx.hash === null) {
31
+ throw Error('ImpossibleBehaviour: RPC transactions must have `hash`.');
32
+ }
33
+ if (tx.from === this.address)
34
+ addressTxs.push({
35
+ unsignedHash: tx.unsignedHash,
36
+ signedHash: tx.hash,
37
+ nonce: tx.nonce,
38
+ address: tx.from,
39
+ });
40
+ return addressTxs;
41
+ }, []);
42
+ await this.action.storeTxs(extractedTxs, block, this.getId());
43
+ return true;
44
+ };
45
+ /**
46
+ * fork one block and remove all stored txId for this block
47
+ * @param hash: block hash
48
+ */
49
+ forkBlock = async (hash) => {
50
+ await this.action.deleteBlockTxs(hash, this.getId());
51
+ };
52
+ /**
53
+ * Initializes the database with older boxes related to the address
54
+ */
55
+ initializeBoxes = async () => {
56
+ return;
57
+ };
58
+ }
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZtVHhFeHRyYWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZXh0cmFjdG9ycy9Fdm1UeEV4dHJhY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxpQkFBaUIsRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBRXZFLE9BQU8sRUFBa0IsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFHNUUsTUFBTSxPQUFPLGNBQWUsU0FBUSxpQkFBOEI7SUFDdkQsTUFBTSxDQUFpQjtJQUN2QixNQUFNLENBQVc7SUFDVCxFQUFFLENBQVM7SUFDWCxPQUFPLENBQVM7SUFFakMsWUFDRSxVQUFzQixFQUN0QixFQUFVLEVBQ1YsT0FBZSxFQUNmLFNBQXlCLElBQUksV0FBVyxFQUFFO1FBRTFDLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksUUFBUSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7SUFFdEI7Ozs7T0FJRztJQUNILG1CQUFtQixHQUFHLEtBQUssRUFDekIsR0FBdUIsRUFDdkIsS0FBa0IsRUFDQSxFQUFFO1FBQ3BCLE1BQU0sWUFBWSxHQUF1QixHQUFHLENBQUMsTUFBTSxDQUNqRCxDQUFDLFVBQThCLEVBQUUsRUFBZSxFQUFFLEVBQUU7WUFDbEQsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNyQixNQUFNLEtBQUssQ0FDVCx5REFBeUQsQ0FDMUQsQ0FBQztZQUNKLENBQUM7WUFDRCxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ3JCLE1BQU0sS0FBSyxDQUNULHlEQUF5RCxDQUMxRCxDQUFDO1lBQ0osQ0FBQztZQUNELElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsT0FBTztnQkFDMUIsVUFBVSxDQUFDLElBQUksQ0FBQztvQkFDZCxZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVk7b0JBQzdCLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSTtvQkFDbkIsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLO29CQUNmLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSTtpQkFDakIsQ0FBQyxDQUFDO1lBQ0wsT0FBTyxVQUFVLENBQUM7UUFDcEIsQ0FBQyxFQUNELEVBQUUsQ0FDSCxDQUFDO1FBQ0YsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzlELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxDQUFDO0lBRUY7OztPQUdHO0lBQ0gsU0FBUyxHQUFHLEtBQUssRUFBRSxJQUFZLEVBQWlCLEVBQUU7UUFDaEQsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQyxDQUFDO0lBRUY7O09BRUc7SUFDSCxlQUFlLEdBQUcsS0FBSyxJQUFJLEVBQUU7UUFDM0IsT0FBTztJQUNULENBQUMsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0IHsgVHhBY3Rpb24gfSBmcm9tICcuLi9hY3Rpb25zL2RiJztcbmltcG9ydCB7IEFic3RyYWN0RXh0cmFjdG9yLCBCbG9ja0VudGl0eSB9IGZyb20gJ0Byb3Nlbi1icmlkZ2Uvc2Nhbm5lcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJ2V0aGVycyc7XG5pbXBvcnQgeyBBYnN0cmFjdExvZ2dlciwgRHVtbXlMb2dnZXIgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2Fic3RyYWN0LWxvZ2dlcic7XG5pbXBvcnQgeyBFeHRyYWN0ZWRUeCB9IGZyb20gJy4uL2ludGVyZmFjZXMvdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgRXZtVHhFeHRyYWN0b3IgZXh0ZW5kcyBBYnN0cmFjdEV4dHJhY3RvcjxUcmFuc2FjdGlvbj4ge1xuICByZWFkb25seSBsb2dnZXI6IEFic3RyYWN0TG9nZ2VyO1xuICByZWFkb25seSBhY3Rpb246IFR4QWN0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWRkcmVzczogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhZGRyZXNzOiBzdHJpbmcsXG4gICAgbG9nZ2VyOiBBYnN0cmFjdExvZ2dlciA9IG5ldyBEdW1teUxvZ2dlcigpXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7XG4gICAgdGhpcy5hY3Rpb24gPSBuZXcgVHhBY3Rpb24oZGF0YVNvdXJjZSwgdGhpcy5sb2dnZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCBJZCBmb3IgY3VycmVudCBleHRyYWN0b3JcbiAgICovXG4gIGdldElkID0gKCkgPT4gdGhpcy5pZDtcblxuICAvKipcbiAgICogZ2V0cyBibG9jayBpZCBhbmQgdHJhbnNhY3Rpb25zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJsb2NrIGFuZCBzYXZlcyBhbGwgdHJhbnNhY3Rpb24gaWRzIGluIGRhdGFiYXNlXG4gICAqIEBwYXJhbSB0eHNcbiAgICogQHBhcmFtIGJsb2NrXG4gICAqL1xuICBwcm9jZXNzVHJhbnNhY3Rpb25zID0gYXN5bmMgKFxuICAgIHR4czogQXJyYXk8VHJhbnNhY3Rpb24+LFxuICAgIGJsb2NrOiBCbG9ja0VudGl0eVxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCBleHRyYWN0ZWRUeHM6IEFycmF5PEV4dHJhY3RlZFR4PiA9IHR4cy5yZWR1Y2UoXG4gICAgICAoYWRkcmVzc1R4czogQXJyYXk8RXh0cmFjdGVkVHg+LCB0eDogVHJhbnNhY3Rpb24pID0+IHtcbiAgICAgICAgaWYgKHR4LmZyb20gPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICdJbXBvc3NpYmxlQmVoYXZpb3VyOiBSUEMgdHJhbnNhY3Rpb25zIG11c3QgaGF2ZSBgZnJvbWAuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR4Lmhhc2ggPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICdJbXBvc3NpYmxlQmVoYXZpb3VyOiBSUEMgdHJhbnNhY3Rpb25zIG11c3QgaGF2ZSBgaGFzaGAuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR4LmZyb20gPT09IHRoaXMuYWRkcmVzcylcbiAgICAgICAgICBhZGRyZXNzVHhzLnB1c2goe1xuICAgICAgICAgICAgdW5zaWduZWRIYXNoOiB0eC51bnNpZ25lZEhhc2gsXG4gICAgICAgICAgICBzaWduZWRIYXNoOiB0eC5oYXNoLFxuICAgICAgICAgICAgbm9uY2U6IHR4Lm5vbmNlLFxuICAgICAgICAgICAgYWRkcmVzczogdHguZnJvbSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGFkZHJlc3NUeHM7XG4gICAgICB9LFxuICAgICAgW11cbiAgICApO1xuICAgIGF3YWl0IHRoaXMuYWN0aW9uLnN0b3JlVHhzKGV4dHJhY3RlZFR4cywgYmxvY2ssIHRoaXMuZ2V0SWQoKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIGZvcmsgb25lIGJsb2NrIGFuZCByZW1vdmUgYWxsIHN0b3JlZCB0eElkIGZvciB0aGlzIGJsb2NrXG4gICAqIEBwYXJhbSBoYXNoOiBibG9jayBoYXNoXG4gICAqL1xuICBmb3JrQmxvY2sgPSBhc3luYyAoaGFzaDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXdhaXQgdGhpcy5hY3Rpb24uZGVsZXRlQmxvY2tUeHMoaGFzaCwgdGhpcy5nZXRJZCgpKTtcbiAgfTtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGRhdGFiYXNlIHdpdGggb2xkZXIgYm94ZXMgcmVsYXRlZCB0byB0aGUgYWRkcmVzc1xuICAgKi9cbiAgaW5pdGlhbGl6ZUJveGVzID0gYXN5bmMgKCkgPT4ge1xuICAgIHJldHVybjtcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,6 @@
1
+ export * from './interfaces/types';
2
+ export * from './extractors/EvmTxExtractor';
3
+ export * from './entities/AddressTxsEntity';
4
+ export * from './actions/db';
5
+ export { default as migrations } from './migrations';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export * from './interfaces/types';
2
+ export * from './extractors/EvmTxExtractor';
3
+ export * from './entities/AddressTxsEntity';
4
+ export * from './actions/db';
5
+ export { default as migrations } from './migrations';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyxjQUFjLENBQUM7QUFDN0IsT0FBTyxFQUFFLE9BQU8sSUFBSSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZXMvdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9leHRyYWN0b3JzL0V2bVR4RXh0cmFjdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vZW50aXRpZXMvQWRkcmVzc1R4c0VudGl0eSc7XG5leHBvcnQgKiBmcm9tICcuL2FjdGlvbnMvZGInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBtaWdyYXRpb25zIH0gZnJvbSAnLi9taWdyYXRpb25zJztcbiJdfQ==
@@ -0,0 +1,7 @@
1
+ export interface ExtractedTx {
2
+ unsignedHash: string;
3
+ signedHash: string;
4
+ nonce: number;
5
+ address: string;
6
+ }
7
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../lib/interfaces/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaW50ZXJmYWNlcy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0ZWRUeCB7XG4gIHVuc2lnbmVkSGFzaDogc3RyaW5nO1xuICBzaWduZWRIYXNoOiBzdHJpbmc7XG4gIG5vbmNlOiBudW1iZXI7XG4gIGFkZHJlc3M6IHN0cmluZztcbn1cbiJdfQ==
@@ -0,0 +1,8 @@
1
+ import { Migration1713694851290 } from './postgres/1713694851290-migration';
2
+ import { Migration1713694799333 } from './sqlite/1713694799333-migration';
3
+ declare const _default: {
4
+ sqlite: (typeof Migration1713694799333)[];
5
+ postgres: (typeof Migration1713694851290)[];
6
+ };
7
+ export default _default;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;;;;;AAE1E,wBAGE"}
@@ -0,0 +1,7 @@
1
+ import { Migration1713694851290 } from './postgres/1713694851290-migration';
2
+ import { Migration1713694799333 } from './sqlite/1713694799333-migration';
3
+ export default {
4
+ sqlite: [Migration1713694799333],
5
+ postgres: [Migration1713694851290],
6
+ };
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWlncmF0aW9ucy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUUxRSxlQUFlO0lBQ2IsTUFBTSxFQUFFLENBQUMsc0JBQXNCLENBQUM7SUFDaEMsUUFBUSxFQUFFLENBQUMsc0JBQXNCLENBQUM7Q0FDbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1pZ3JhdGlvbjE3MTM2OTQ4NTEyOTAgfSBmcm9tICcuL3Bvc3RncmVzLzE3MTM2OTQ4NTEyOTAtbWlncmF0aW9uJztcbmltcG9ydCB7IE1pZ3JhdGlvbjE3MTM2OTQ3OTkzMzMgfSBmcm9tICcuL3NxbGl0ZS8xNzEzNjk0Nzk5MzMzLW1pZ3JhdGlvbic7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc3FsaXRlOiBbTWlncmF0aW9uMTcxMzY5NDc5OTMzM10sXG4gIHBvc3RncmVzOiBbTWlncmF0aW9uMTcxMzY5NDg1MTI5MF0sXG59O1xuIl19
@@ -0,0 +1,7 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+ export declare class Migration1713694851290 implements MigrationInterface {
3
+ name: string;
4
+ up(queryRunner: QueryRunner): Promise<void>;
5
+ down(queryRunner: QueryRunner): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=1713694851290-migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"1713694851290-migration.d.ts","sourceRoot":"","sources":["../../../lib/migrations/postgres/1713694851290-migration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE1D,qBAAa,sBAAuB,YAAW,kBAAkB;IAC/D,IAAI,SAA4B;IAEnB,EAAE,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAe3C,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAK3D"}
@@ -0,0 +1,23 @@
1
+ export class Migration1713694851290 {
2
+ name = 'Migration1713694851290';
3
+ async up(queryRunner) {
4
+ await queryRunner.query(`
5
+ CREATE TABLE "address_txs_entity" (
6
+ "id" SERIAL NOT NULL,
7
+ "unsignedHash" character varying NOT NULL,
8
+ "signedHash" character varying NOT NULL,
9
+ "nonce" integer NOT NULL,
10
+ "address" character varying NOT NULL,
11
+ "blockId" character varying NOT NULL,
12
+ "extractor" character varying NOT NULL,
13
+ CONSTRAINT "PK_3d12ab238cb8eed0354cec04ea4" PRIMARY KEY ("id")
14
+ )
15
+ `);
16
+ }
17
+ async down(queryRunner) {
18
+ await queryRunner.query(`
19
+ DROP TABLE "address_txs_entity"
20
+ `);
21
+ }
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcxMzY5NDg1MTI5MC1taWdyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvbWlncmF0aW9ucy9wb3N0Z3Jlcy8xNzEzNjk0ODUxMjkwLW1pZ3JhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDLElBQUksR0FBRyx3QkFBd0IsQ0FBQztJQUV6QixLQUFLLENBQUMsRUFBRSxDQUFDLFdBQXdCO1FBQ3RDLE1BQU0sV0FBVyxDQUFDLEtBQUssQ0FBQzs7Ozs7Ozs7Ozs7U0FXbkIsQ0FBQyxDQUFDO0lBQ1QsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBd0I7UUFDeEMsTUFBTSxXQUFXLENBQUMsS0FBSyxDQUFDOztTQUVuQixDQUFDLENBQUM7SUFDVCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNaWdyYXRpb25JbnRlcmZhY2UsIFF1ZXJ5UnVubmVyIH0gZnJvbSAndHlwZW9ybSc7XG5cbmV4cG9ydCBjbGFzcyBNaWdyYXRpb24xNzEzNjk0ODUxMjkwIGltcGxlbWVudHMgTWlncmF0aW9uSW50ZXJmYWNlIHtcbiAgbmFtZSA9ICdNaWdyYXRpb24xNzEzNjk0ODUxMjkwJztcblxuICBwdWJsaWMgYXN5bmMgdXAocXVlcnlSdW5uZXI6IFF1ZXJ5UnVubmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgcXVlcnlSdW5uZXIucXVlcnkoYFxuICAgICAgICAgICAgQ1JFQVRFIFRBQkxFIFwiYWRkcmVzc190eHNfZW50aXR5XCIgKFxuICAgICAgICAgICAgICAgIFwiaWRcIiBTRVJJQUwgTk9UIE5VTEwsXG4gICAgICAgICAgICAgICAgXCJ1bnNpZ25lZEhhc2hcIiBjaGFyYWN0ZXIgdmFyeWluZyBOT1QgTlVMTCxcbiAgICAgICAgICAgICAgICBcInNpZ25lZEhhc2hcIiBjaGFyYWN0ZXIgdmFyeWluZyBOT1QgTlVMTCxcbiAgICAgICAgICAgICAgICBcIm5vbmNlXCIgaW50ZWdlciBOT1QgTlVMTCxcbiAgICAgICAgICAgICAgICBcImFkZHJlc3NcIiBjaGFyYWN0ZXIgdmFyeWluZyBOT1QgTlVMTCxcbiAgICAgICAgICAgICAgICBcImJsb2NrSWRcIiBjaGFyYWN0ZXIgdmFyeWluZyBOT1QgTlVMTCxcbiAgICAgICAgICAgICAgICBcImV4dHJhY3RvclwiIGNoYXJhY3RlciB2YXJ5aW5nIE5PVCBOVUxMLFxuICAgICAgICAgICAgICAgIENPTlNUUkFJTlQgXCJQS18zZDEyYWIyMzhjYjhlZWQwMzU0Y2VjMDRlYTRcIiBQUklNQVJZIEtFWSAoXCJpZFwiKVxuICAgICAgICAgICAgKVxuICAgICAgICBgKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkb3duKHF1ZXJ5UnVubmVyOiBRdWVyeVJ1bm5lcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnF1ZXJ5KGBcbiAgICAgICAgICAgIERST1AgVEFCTEUgXCJhZGRyZXNzX3R4c19lbnRpdHlcIlxuICAgICAgICBgKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,7 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+ export declare class Migration1713694799333 implements MigrationInterface {
3
+ name: string;
4
+ up(queryRunner: QueryRunner): Promise<void>;
5
+ down(queryRunner: QueryRunner): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=1713694799333-migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"1713694799333-migration.d.ts","sourceRoot":"","sources":["../../../lib/migrations/sqlite/1713694799333-migration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE1D,qBAAa,sBAAuB,YAAW,kBAAkB;IAC/D,IAAI,SAA4B;IAEnB,EAAE,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAc3C,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAK3D"}
@@ -0,0 +1,22 @@
1
+ export class Migration1713694799333 {
2
+ name = 'Migration1713694799333';
3
+ async up(queryRunner) {
4
+ await queryRunner.query(`
5
+ CREATE TABLE "address_txs_entity" (
6
+ "id" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
7
+ "unsignedHash" varchar NOT NULL,
8
+ "signedHash" varchar NOT NULL,
9
+ "nonce" integer NOT NULL,
10
+ "address" varchar NOT NULL,
11
+ "blockId" varchar NOT NULL,
12
+ "extractor" varchar NOT NULL
13
+ )
14
+ `);
15
+ }
16
+ async down(queryRunner) {
17
+ await queryRunner.query(`
18
+ DROP TABLE "address_txs_entity"
19
+ `);
20
+ }
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcxMzY5NDc5OTMzMy1taWdyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvbWlncmF0aW9ucy9zcWxpdGUvMTcxMzY5NDc5OTMzMy1taWdyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFPLHNCQUFzQjtJQUNqQyxJQUFJLEdBQUcsd0JBQXdCLENBQUM7SUFFekIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxXQUF3QjtRQUN0QyxNQUFNLFdBQVcsQ0FBQyxLQUFLLENBQUM7Ozs7Ozs7Ozs7U0FVbkIsQ0FBQyxDQUFDO0lBQ1QsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBd0I7UUFDeEMsTUFBTSxXQUFXLENBQUMsS0FBSyxDQUFDOztTQUVuQixDQUFDLENBQUM7SUFDVCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNaWdyYXRpb25JbnRlcmZhY2UsIFF1ZXJ5UnVubmVyIH0gZnJvbSAndHlwZW9ybSc7XG5cbmV4cG9ydCBjbGFzcyBNaWdyYXRpb24xNzEzNjk0Nzk5MzMzIGltcGxlbWVudHMgTWlncmF0aW9uSW50ZXJmYWNlIHtcbiAgbmFtZSA9ICdNaWdyYXRpb24xNzEzNjk0Nzk5MzMzJztcblxuICBwdWJsaWMgYXN5bmMgdXAocXVlcnlSdW5uZXI6IFF1ZXJ5UnVubmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgcXVlcnlSdW5uZXIucXVlcnkoYFxuICAgICAgICAgICAgQ1JFQVRFIFRBQkxFIFwiYWRkcmVzc190eHNfZW50aXR5XCIgKFxuICAgICAgICAgICAgICAgIFwiaWRcIiBpbnRlZ2VyIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQgTk9UIE5VTEwsXG4gICAgICAgICAgICAgICAgXCJ1bnNpZ25lZEhhc2hcIiB2YXJjaGFyIE5PVCBOVUxMLFxuICAgICAgICAgICAgICAgIFwic2lnbmVkSGFzaFwiIHZhcmNoYXIgTk9UIE5VTEwsXG4gICAgICAgICAgICAgICAgXCJub25jZVwiIGludGVnZXIgTk9UIE5VTEwsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzXCIgdmFyY2hhciBOT1QgTlVMTCxcbiAgICAgICAgICAgICAgICBcImJsb2NrSWRcIiB2YXJjaGFyIE5PVCBOVUxMLFxuICAgICAgICAgICAgICAgIFwiZXh0cmFjdG9yXCIgdmFyY2hhciBOT1QgTlVMTFxuICAgICAgICAgICAgKVxuICAgICAgICBgKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkb3duKHF1ZXJ5UnVubmVyOiBRdWVyeVJ1bm5lcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnF1ZXJ5KGBcbiAgICAgICAgICAgIERST1AgVEFCTEUgXCJhZGRyZXNzX3R4c19lbnRpdHlcIlxuICAgICAgICBgKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,68 @@
1
+ import { AddressTxsEntity } from '../entities/AddressTxsEntity';
2
+ import { ExtractedTx } from '../interfaces/types';
3
+ import { DataSource, Repository } from 'typeorm';
4
+ import { BlockEntity } from '@rosen-bridge/scanner';
5
+ import { AbstractLogger, DummyLogger } from '@rosen-bridge/abstract-logger';
6
+
7
+ export class TxAction {
8
+ private readonly repository: Repository<AddressTxsEntity>;
9
+ readonly logger: AbstractLogger;
10
+
11
+ constructor(dataSource: DataSource, logger?: AbstractLogger) {
12
+ this.repository = dataSource.getRepository(AddressTxsEntity);
13
+ this.logger = logger ? logger : new DummyLogger();
14
+ }
15
+
16
+ /**
17
+ * remove all inserted transaction for specific block in specific extractor from database
18
+ * @param blockId selected block id
19
+ * @param extractor selected extractor
20
+ */
21
+ deleteBlockTxs = async (blockId: string, extractor: string) => {
22
+ this.logger.info(
23
+ `Deleting transactions of block ${blockId} and extractor ${extractor}`
24
+ );
25
+ await this.repository
26
+ .createQueryBuilder()
27
+ .delete()
28
+ .where('extractor = :extractor AND blockId = :blockId', {
29
+ blockId: blockId,
30
+ extractor: extractor,
31
+ })
32
+ .execute();
33
+ };
34
+
35
+ /**
36
+ * remove old list of transactions and
37
+ * store a new list of transactions database for specific block and extractor
38
+ * @param txs
39
+ * @param block
40
+ * @param extractor
41
+ */
42
+ storeTxs = async (
43
+ txs: Array<ExtractedTx>,
44
+ block: BlockEntity,
45
+ extractor: string
46
+ ) => {
47
+ await this.deleteBlockTxs(block.hash, extractor);
48
+ this.logger.info(
49
+ `Inserting new transactions [${txs.map(
50
+ (tx) => tx.signedHash
51
+ )}] in block ${block} and extractor ${extractor}`
52
+ );
53
+ await this.repository
54
+ .createQueryBuilder()
55
+ .insert()
56
+ .values(
57
+ txs.map((tx) => ({
58
+ unsignedHash: tx.unsignedHash,
59
+ signedHash: tx.signedHash,
60
+ nonce: tx.nonce,
61
+ address: tx.address,
62
+ blockId: block.hash,
63
+ extractor: extractor,
64
+ }))
65
+ )
66
+ .execute();
67
+ };
68
+ }
@@ -0,0 +1,25 @@
1
+ import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
2
+
3
+ @Entity('address_txs_entity')
4
+ export class AddressTxsEntity {
5
+ @PrimaryGeneratedColumn({ type: 'integer' })
6
+ id: number;
7
+
8
+ @Column({ type: 'varchar' })
9
+ unsignedHash: string;
10
+
11
+ @Column({ type: 'varchar' })
12
+ signedHash: string;
13
+
14
+ @Column({ type: 'integer' })
15
+ nonce: number;
16
+
17
+ @Column({ type: 'varchar' })
18
+ address: string;
19
+
20
+ @Column({ type: 'varchar' })
21
+ blockId: string;
22
+
23
+ @Column({ type: 'varchar' })
24
+ extractor: string;
25
+ }
@@ -0,0 +1,82 @@
1
+ import { DataSource } from 'typeorm';
2
+ import { TxAction } from '../actions/db';
3
+ import { AbstractExtractor, BlockEntity } from '@rosen-bridge/scanner';
4
+ import { Transaction } from 'ethers';
5
+ import { AbstractLogger, DummyLogger } from '@rosen-bridge/abstract-logger';
6
+ import { ExtractedTx } from '../interfaces/types';
7
+
8
+ export class EvmTxExtractor extends AbstractExtractor<Transaction> {
9
+ readonly logger: AbstractLogger;
10
+ readonly action: TxAction;
11
+ private readonly id: string;
12
+ private readonly address: string;
13
+
14
+ constructor(
15
+ dataSource: DataSource,
16
+ id: string,
17
+ address: string,
18
+ logger: AbstractLogger = new DummyLogger()
19
+ ) {
20
+ super();
21
+ this.id = id;
22
+ this.address = address;
23
+ this.logger = logger;
24
+ this.action = new TxAction(dataSource, this.logger);
25
+ }
26
+
27
+ /**
28
+ * get Id for current extractor
29
+ */
30
+ getId = () => this.id;
31
+
32
+ /**
33
+ * gets block id and transactions corresponding to the block and saves all transaction ids in database
34
+ * @param txs
35
+ * @param block
36
+ */
37
+ processTransactions = async (
38
+ txs: Array<Transaction>,
39
+ block: BlockEntity
40
+ ): Promise<boolean> => {
41
+ const extractedTxs: Array<ExtractedTx> = txs.reduce(
42
+ (addressTxs: Array<ExtractedTx>, tx: Transaction) => {
43
+ if (tx.from === null) {
44
+ throw Error(
45
+ 'ImpossibleBehaviour: RPC transactions must have `from`.'
46
+ );
47
+ }
48
+ if (tx.hash === null) {
49
+ throw Error(
50
+ 'ImpossibleBehaviour: RPC transactions must have `hash`.'
51
+ );
52
+ }
53
+ if (tx.from === this.address)
54
+ addressTxs.push({
55
+ unsignedHash: tx.unsignedHash,
56
+ signedHash: tx.hash,
57
+ nonce: tx.nonce,
58
+ address: tx.from,
59
+ });
60
+ return addressTxs;
61
+ },
62
+ []
63
+ );
64
+ await this.action.storeTxs(extractedTxs, block, this.getId());
65
+ return true;
66
+ };
67
+
68
+ /**
69
+ * fork one block and remove all stored txId for this block
70
+ * @param hash: block hash
71
+ */
72
+ forkBlock = async (hash: string): Promise<void> => {
73
+ await this.action.deleteBlockTxs(hash, this.getId());
74
+ };
75
+
76
+ /**
77
+ * Initializes the database with older boxes related to the address
78
+ */
79
+ initializeBoxes = async () => {
80
+ return;
81
+ };
82
+ }
package/lib/index.ts ADDED
@@ -0,0 +1,5 @@
1
+ export * from './interfaces/types';
2
+ export * from './extractors/EvmTxExtractor';
3
+ export * from './entities/AddressTxsEntity';
4
+ export * from './actions/db';
5
+ export { default as migrations } from './migrations';
@@ -0,0 +1,6 @@
1
+ export interface ExtractedTx {
2
+ unsignedHash: string;
3
+ signedHash: string;
4
+ nonce: number;
5
+ address: string;
6
+ }
@@ -0,0 +1,7 @@
1
+ import { Migration1713694851290 } from './postgres/1713694851290-migration';
2
+ import { Migration1713694799333 } from './sqlite/1713694799333-migration';
3
+
4
+ export default {
5
+ sqlite: [Migration1713694799333],
6
+ postgres: [Migration1713694851290],
7
+ };