@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.
- package/.eslintignore +1 -0
- package/README.md +24 -0
- package/dist/actions/db.d.ts +24 -0
- package/dist/actions/db.d.ts.map +1 -0
- package/dist/actions/db.js +50 -0
- package/dist/entities/AddressTxsEntity.d.ts +10 -0
- package/dist/entities/AddressTxsEntity.d.ts.map +1 -0
- package/dist/entities/AddressTxsEntity.js +52 -0
- package/dist/extractors/EvmTxExtractor.d.ts +32 -0
- package/dist/extractors/EvmTxExtractor.d.ts.map +1 -0
- package/dist/extractors/EvmTxExtractor.js +59 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/interfaces/types.d.ts +7 -0
- package/dist/interfaces/types.d.ts.map +1 -0
- package/dist/interfaces/types.js +2 -0
- package/dist/migrations/index.d.ts +8 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +7 -0
- package/dist/migrations/postgres/1713694851290-migration.d.ts +7 -0
- package/dist/migrations/postgres/1713694851290-migration.d.ts.map +1 -0
- package/dist/migrations/postgres/1713694851290-migration.js +23 -0
- package/dist/migrations/sqlite/1713694799333-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1713694799333-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1713694799333-migration.js +22 -0
- package/lib/actions/db.ts +68 -0
- package/lib/entities/AddressTxsEntity.ts +25 -0
- package/lib/extractors/EvmTxExtractor.ts +82 -0
- package/lib/index.ts +5 -0
- package/lib/interfaces/types.ts +6 -0
- package/lib/migrations/index.ts +7 -0
- package/lib/migrations/postgres/1713694851290-migration.ts +26 -0
- package/lib/migrations/sqlite/1713694799333-migration.ts +25 -0
- package/package.json +41 -0
- package/tests/actions/db.spec.ts +123 -0
- package/tests/extractor/EvmTxExtractor.spec.ts +48 -0
- package/tests/extractor/testData.ts +86 -0
- package/tests/testUtils.ts +22 -0
- package/tsconfig.build.json +7 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.json +8 -0
- 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 @@
|
|
|
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==
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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