@rosen-bridge/abstract-extractor 2.1.2 → 3.0.0-8f3c7016
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 +9 -0
- package/dist/abstractExtractor.d.ts +24 -12
- package/dist/abstractExtractor.d.ts.map +1 -1
- package/dist/abstractExtractor.js +1 -1
- package/dist/constants.d.ts +1 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +2 -1
- package/dist/ergo/database/actions/abstractErgoAction.d.ts +83 -0
- package/dist/ergo/database/actions/abstractErgoAction.d.ts.map +1 -0
- package/dist/ergo/database/actions/abstractErgoAction.js +167 -0
- package/dist/ergo/database/actions/abstractErgoBoxAction.d.ts +31 -0
- package/dist/ergo/database/actions/abstractErgoBoxAction.d.ts.map +1 -0
- package/dist/ergo/database/actions/abstractErgoBoxAction.js +70 -0
- package/dist/ergo/database/entities/abstractErgoBoxEntity.d.ts +18 -0
- package/dist/ergo/database/entities/abstractErgoBoxEntity.d.ts.map +1 -0
- package/dist/ergo/database/entities/abstractErgoBoxEntity.js +36 -0
- package/dist/ergo/database/entities/abstractErgoEntity.d.ts +26 -0
- package/dist/ergo/database/entities/abstractErgoEntity.d.ts.map +1 -0
- package/dist/ergo/database/entities/abstractErgoEntity.js +64 -0
- package/dist/ergo/database/index.d.ts +5 -0
- package/dist/ergo/database/index.d.ts.map +1 -0
- package/dist/ergo/database/index.js +5 -0
- package/dist/ergo/extractors/abstractErgoBoxExtractor.d.ts +67 -0
- package/dist/ergo/extractors/abstractErgoBoxExtractor.d.ts.map +1 -0
- package/dist/ergo/extractors/abstractErgoBoxExtractor.js +106 -0
- package/dist/ergo/extractors/abstractErgoExtractor.d.ts +53 -0
- package/dist/ergo/extractors/abstractErgoExtractor.d.ts.map +1 -0
- package/dist/ergo/extractors/abstractErgoExtractor.js +92 -0
- package/dist/ergo/extractors/abstractErgoTxExtractor.d.ts +56 -0
- package/dist/ergo/extractors/abstractErgoTxExtractor.d.ts.map +1 -0
- package/dist/ergo/extractors/abstractErgoTxExtractor.js +81 -0
- package/dist/ergo/extractors/index.d.ts +4 -0
- package/dist/ergo/extractors/index.d.ts.map +1 -0
- package/dist/ergo/extractors/index.js +4 -0
- package/dist/ergo/index.d.ts +5 -7
- package/dist/ergo/index.d.ts.map +1 -1
- package/dist/ergo/index.js +6 -8
- package/dist/ergo/initializers/ergoBoxInitializer.d.ts +36 -0
- package/dist/ergo/initializers/ergoBoxInitializer.d.ts.map +1 -0
- package/dist/ergo/initializers/ergoBoxInitializer.js +80 -0
- package/dist/ergo/initializers/ergoInitializer.d.ts +39 -0
- package/dist/ergo/initializers/ergoInitializer.d.ts.map +1 -0
- package/dist/ergo/initializers/ergoInitializer.js +80 -0
- package/dist/ergo/initializers/index.d.ts +4 -0
- package/dist/ergo/initializers/index.d.ts.map +1 -0
- package/dist/ergo/initializers/index.js +4 -0
- package/dist/ergo/initializers/strategies/constants.d.ts +3 -0
- package/dist/ergo/initializers/strategies/constants.d.ts.map +1 -0
- package/dist/ergo/initializers/strategies/constants.js +3 -0
- package/dist/ergo/initializers/strategies/explorerInitializationStrategy.d.ts +59 -0
- package/dist/ergo/initializers/strategies/explorerInitializationStrategy.d.ts.map +1 -0
- package/dist/ergo/initializers/strategies/explorerInitializationStrategy.js +141 -0
- package/dist/ergo/initializers/strategies/index.d.ts +4 -0
- package/dist/ergo/initializers/strategies/index.d.ts.map +1 -0
- package/dist/ergo/initializers/strategies/index.js +4 -0
- package/dist/ergo/initializers/strategies/nodeInitializationStrategy.d.ts +29 -0
- package/dist/ergo/initializers/strategies/nodeInitializationStrategy.d.ts.map +1 -0
- package/dist/ergo/initializers/strategies/nodeInitializationStrategy.js +66 -0
- package/dist/ergo/initializers/strategies/workerManager.d.ts +79 -0
- package/dist/ergo/initializers/strategies/workerManager.d.ts.map +1 -0
- package/dist/ergo/initializers/strategies/workerManager.js +183 -0
- package/dist/ergo/interfaces.d.ts +31 -17
- package/dist/ergo/interfaces.d.ts.map +1 -1
- package/dist/ergo/interfaces.js +1 -1
- package/dist/ergo/networks/explorerNetwork.d.ts +52 -0
- package/dist/ergo/networks/explorerNetwork.d.ts.map +1 -0
- package/dist/ergo/networks/explorerNetwork.js +127 -0
- package/dist/ergo/networks/index.d.ts +3 -0
- package/dist/ergo/networks/index.d.ts.map +1 -0
- package/dist/ergo/networks/index.js +3 -0
- package/dist/ergo/networks/nodeNetwork.d.ts +28 -0
- package/dist/ergo/networks/nodeNetwork.d.ts.map +1 -0
- package/dist/ergo/networks/nodeNetwork.js +59 -0
- package/dist/ergo/utils.d.ts +15 -0
- package/dist/ergo/utils.d.ts.map +1 -1
- package/dist/ergo/utils.js +34 -1
- package/package.json +3 -1
- package/dist/ergo/abstractErgoExtractor.d.ts +0 -80
- package/dist/ergo/abstractErgoExtractor.d.ts.map +0 -1
- package/dist/ergo/abstractErgoExtractor.js +0 -142
- package/dist/ergo/abstractErgoExtractorAction.d.ts +0 -89
- package/dist/ergo/abstractErgoExtractorAction.d.ts.map +0 -1
- package/dist/ergo/abstractErgoExtractorAction.js +0 -219
- package/dist/ergo/abstractErgoExtractorEntity.d.ts +0 -11
- package/dist/ergo/abstractErgoExtractorEntity.d.ts.map +0 -1
- package/dist/ergo/abstractErgoExtractorEntity.js +0 -57
- package/dist/ergo/initializable/abstractInitializable.d.ts +0 -48
- package/dist/ergo/initializable/abstractInitializable.d.ts.map +0 -1
- package/dist/ergo/initializable/abstractInitializable.js +0 -162
- package/dist/ergo/initializable/abstractInitializableAction.d.ts +0 -14
- package/dist/ergo/initializable/abstractInitializableAction.d.ts.map +0 -1
- package/dist/ergo/initializable/abstractInitializableAction.js +0 -16
- package/dist/ergo/initializable/index.d.ts +0 -3
- package/dist/ergo/initializable/index.d.ts.map +0 -1
- package/dist/ergo/initializable/index.js +0 -3
- package/dist/ergo/network/abstractNetwork.d.ts +0 -26
- package/dist/ergo/network/abstractNetwork.d.ts.map +0 -1
- package/dist/ergo/network/abstractNetwork.js +0 -3
- package/dist/ergo/network/explorerNetwork.d.ts +0 -74
- package/dist/ergo/network/explorerNetwork.d.ts.map +0 -1
- package/dist/ergo/network/explorerNetwork.js +0 -185
- package/dist/ergo/network/nodeNetwork.d.ts +0 -60
- package/dist/ergo/network/nodeNetwork.d.ts.map +0 -1
- package/dist/ergo/network/nodeNetwork.js +0 -131
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import { AbstractLogger } from '@rosen-bridge/abstract-logger';
|
|
2
|
-
import { DataSource, Repository, EntityTarget, QueryRunner } from '@rosen-bridge/extended-typeorm';
|
|
3
|
-
import { BlockInfo } from '@rosen-bridge/scanner-interfaces';
|
|
4
|
-
import { AbstractErgoExtractorEntity } from './abstractErgoExtractorEntity';
|
|
5
|
-
import { AbstractBoxData, BoxInfo, SpendInfo } from './interfaces';
|
|
6
|
-
export declare abstract class AbstractErgoExtractorAction<ExtractedData extends AbstractBoxData, ExtractorEntity extends AbstractErgoExtractorEntity> {
|
|
7
|
-
private readonly datasource;
|
|
8
|
-
readonly logger: AbstractLogger;
|
|
9
|
-
protected readonly repository: Repository<ExtractorEntity>;
|
|
10
|
-
private repo;
|
|
11
|
-
constructor(dataSource: DataSource, repo: EntityTarget<ExtractorEntity>, logger?: AbstractLogger);
|
|
12
|
-
/**
|
|
13
|
-
* create the database entity from extracted data and block information
|
|
14
|
-
*/
|
|
15
|
-
protected createEntity: (data: ExtractedData[], // eslint-disable-line @typescript-eslint/no-unused-vars
|
|
16
|
-
block: BlockInfo, // eslint-disable-line @typescript-eslint/no-unused-vars
|
|
17
|
-
extractor: string) => Array<Omit<ExtractorEntity, "id">>;
|
|
18
|
-
/**
|
|
19
|
-
* convert the database entity back to raw data
|
|
20
|
-
*/
|
|
21
|
-
protected convertEntityToData: (entities: ExtractorEntity[]) => ExtractedData[];
|
|
22
|
-
/**
|
|
23
|
-
* insert entities extracted from a block to database
|
|
24
|
-
* @param queryRunner
|
|
25
|
-
* @param boxesToInsert
|
|
26
|
-
* @param block
|
|
27
|
-
* @param extractor
|
|
28
|
-
*/
|
|
29
|
-
protected insertEntities: (queryRunner: QueryRunner, boxesToInsert: Array<ExtractedData>, block: BlockInfo, extractor: string) => Promise<void>;
|
|
30
|
-
/**
|
|
31
|
-
* update entities related to a box
|
|
32
|
-
* @param queryRunner
|
|
33
|
-
* @param updateBox
|
|
34
|
-
* @param block
|
|
35
|
-
* @param extractor
|
|
36
|
-
*/
|
|
37
|
-
protected updateEntity: (queryRunner: QueryRunner, updateBox: ExtractedData, block: BlockInfo, extractor: string) => Promise<void>;
|
|
38
|
-
/**
|
|
39
|
-
* delete all data extracted from a block
|
|
40
|
-
* @param queryRunner
|
|
41
|
-
* @param extractor
|
|
42
|
-
* @param block
|
|
43
|
-
* @returns
|
|
44
|
-
*/
|
|
45
|
-
protected deleteBlockEntities: (queryRunner: QueryRunner, extractor: string, block: string) => Promise<ExtractedData[]>;
|
|
46
|
-
/**
|
|
47
|
-
* delete all data extracted from a block
|
|
48
|
-
* @param queryRunner
|
|
49
|
-
* @param extractor
|
|
50
|
-
* @param block
|
|
51
|
-
* @returns
|
|
52
|
-
*/
|
|
53
|
-
protected updateBlockEntities: (queryRunner: QueryRunner, extractor: string, block: string) => Promise<ExtractorEntity[]>;
|
|
54
|
-
/**
|
|
55
|
-
* insert all extracted box data in an atomic transaction
|
|
56
|
-
* update the data if a box with the same id is already stored in db
|
|
57
|
-
* @param boxes
|
|
58
|
-
* @param block
|
|
59
|
-
* @param extractor
|
|
60
|
-
* @return inserted items and updated box ids
|
|
61
|
-
* returns undefined in case of any problem
|
|
62
|
-
*/
|
|
63
|
-
storeBoxes: (boxes: Array<ExtractedData>, block: BlockInfo, extractor: string) => Promise<boolean>;
|
|
64
|
-
/**
|
|
65
|
-
* update spending information of stored boxes
|
|
66
|
-
* chunk spendInfos to prevent large database queries
|
|
67
|
-
* Note: It only updates the spendHeight and spendBlock fields. If updating
|
|
68
|
-
* anything else is required, override this implementation to include the
|
|
69
|
-
* additional fields.
|
|
70
|
-
* @param spendInfos
|
|
71
|
-
* @param block
|
|
72
|
-
* @param extractor
|
|
73
|
-
* @returns spent box ids
|
|
74
|
-
*/
|
|
75
|
-
spendBoxes: (spendInfos: Array<SpendInfo>, block: BlockInfo, extractor: string) => Promise<BoxInfo[]>;
|
|
76
|
-
/**
|
|
77
|
-
* delete extracted data from a specific block
|
|
78
|
-
* if a box is spend in this block mark it as unspent
|
|
79
|
-
* if a box is created in this block remove it from database
|
|
80
|
-
* @param block
|
|
81
|
-
* @param extractor
|
|
82
|
-
* @return deleted items and updated box ids
|
|
83
|
-
*/
|
|
84
|
-
deleteBlockBoxes: (block: string, extractor: string) => Promise<{
|
|
85
|
-
deletedData: ExtractedData[];
|
|
86
|
-
updatedData: BoxInfo[];
|
|
87
|
-
}>;
|
|
88
|
-
}
|
|
89
|
-
//# sourceMappingURL=abstractErgoExtractorAction.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"abstractErgoExtractorAction.d.ts","sourceRoot":"","sources":["../../lib/ergo/abstractErgoExtractorAction.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EACL,UAAU,EAEV,UAAU,EAEV,YAAY,EAEZ,WAAW,EACZ,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAG7D,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEnE,8BAAsB,2BAA2B,CAC/C,aAAa,SAAS,eAAe,EACrC,eAAe,SAAS,2BAA2B;IAEnD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC;IAC3D,OAAO,CAAC,IAAI,CAAgC;gBAG1C,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,YAAY,CAAC,eAAe,CAAC,EACnC,MAAM,CAAC,EAAE,cAAc;IAQzB;;OAEG;IACH,SAAS,CAAC,YAAY,GACpB,MAAM,aAAa,EAAE,EAAE,wDAAwD;IAC/E,OAAO,SAAS,EAAE,wDAAwD;IAC1E,WAAW,MAAM,KAChB,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,CAInC;IAEF;;OAEG;IACH,SAAS,CAAC,mBAAmB,GAC3B,UAAU,eAAe,EAAE,KAC1B,aAAa,EAAE,CAIhB;IAEF;;;;;;OAMG;IACH,SAAS,CAAC,cAAc,GACtB,aAAa,WAAW,EACxB,eAAe,KAAK,CAAC,aAAa,CAAC,EACnC,OAAO,SAAS,EAChB,WAAW,MAAM,mBAMjB;IAEF;;;;;;OAMG;IACH,SAAS,CAAC,YAAY,GACpB,aAAa,WAAW,EACxB,WAAW,aAAa,EACxB,OAAO,SAAS,EAChB,WAAW,MAAM,mBAWjB;IAEF;;;;;;OAMG;IACH,SAAS,CAAC,mBAAmB,GAC3B,aAAa,WAAW,EACxB,WAAW,MAAM,EACjB,OAAO,MAAM,KACZ,OAAO,CAAC,aAAa,EAAE,CAAC,CAazB;IAEF;;;;;;OAMG;IACH,SAAS,CAAC,mBAAmB,GAC3B,aAAa,WAAW,EACxB,WAAW,MAAM,EACjB,OAAO,MAAM,KACZ,OAAO,CAAC,eAAe,EAAE,CAAC,CAsB3B;IAEF;;;;;;;;OAQG;IACH,UAAU,GACR,OAAO,KAAK,CAAC,aAAa,CAAC,EAC3B,OAAO,SAAS,EAChB,WAAW,MAAM,KAChB,OAAO,CAAC,OAAO,CAAC,CA6CjB;IAEF;;;;;;;;;;OAUG;IACH,UAAU,GACR,YAAY,KAAK,CAAC,SAAS,CAAC,EAC5B,OAAO,SAAS,EAChB,WAAW,MAAM,KAChB,OAAO,CAAC,OAAO,EAAE,CAAC,CA8BnB;IAEF;;;;;;;OAOG;IACH,gBAAgB,GACd,OAAO,MAAM,EACb,WAAW,MAAM,KAChB,OAAO,CAAC;QAAE,WAAW,EAAE,aAAa,EAAE,CAAC;QAAC,WAAW,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,CAiClE;CACH"}
|
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
import { chunk, difference, pick } from 'lodash-es';
|
|
2
|
-
import { DummyLogger } from '@rosen-bridge/abstract-logger';
|
|
3
|
-
import { In, Not, } from '@rosen-bridge/extended-typeorm';
|
|
4
|
-
import JsonBigInt from '@rosen-bridge/json-bigint';
|
|
5
|
-
import { DB_CHUNK_SIZE } from '../constants';
|
|
6
|
-
export class AbstractErgoExtractorAction {
|
|
7
|
-
datasource;
|
|
8
|
-
logger;
|
|
9
|
-
repository;
|
|
10
|
-
repo;
|
|
11
|
-
constructor(dataSource, repo, logger) {
|
|
12
|
-
this.datasource = dataSource;
|
|
13
|
-
this.logger = logger ? logger : new DummyLogger();
|
|
14
|
-
this.repository = this.datasource.getRepository(repo);
|
|
15
|
-
this.repo = repo;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* create the database entity from extracted data and block information
|
|
19
|
-
*/
|
|
20
|
-
createEntity = (data, // eslint-disable-line @typescript-eslint/no-unused-vars
|
|
21
|
-
block, // eslint-disable-line @typescript-eslint/no-unused-vars
|
|
22
|
-
extractor) => {
|
|
23
|
-
throw Error('You must implement `createEntity` or override `insertEntities` and `updateEntities`');
|
|
24
|
-
};
|
|
25
|
-
/**
|
|
26
|
-
* convert the database entity back to raw data
|
|
27
|
-
*/
|
|
28
|
-
convertEntityToData = (entities) => {
|
|
29
|
-
throw Error('You must implement `convertEntityToData` or override `deleteBlockEntities`');
|
|
30
|
-
};
|
|
31
|
-
/**
|
|
32
|
-
* insert entities extracted from a block to database
|
|
33
|
-
* @param queryRunner
|
|
34
|
-
* @param boxesToInsert
|
|
35
|
-
* @param block
|
|
36
|
-
* @param extractor
|
|
37
|
-
*/
|
|
38
|
-
insertEntities = async (queryRunner, boxesToInsert, block, extractor) => {
|
|
39
|
-
const repository = queryRunner.manager.getRepository(this.repo);
|
|
40
|
-
await repository.insert(this.createEntity(boxesToInsert, block, extractor));
|
|
41
|
-
};
|
|
42
|
-
/**
|
|
43
|
-
* update entities related to a box
|
|
44
|
-
* @param queryRunner
|
|
45
|
-
* @param updateBox
|
|
46
|
-
* @param block
|
|
47
|
-
* @param extractor
|
|
48
|
-
*/
|
|
49
|
-
updateEntity = async (queryRunner, updateBox, block, extractor) => {
|
|
50
|
-
const repository = queryRunner.manager.getRepository(this.repo);
|
|
51
|
-
const box = this.createEntity([updateBox], block, extractor)[0];
|
|
52
|
-
await repository.update({
|
|
53
|
-
boxId: box.boxId,
|
|
54
|
-
extractor: extractor,
|
|
55
|
-
}, box);
|
|
56
|
-
};
|
|
57
|
-
/**
|
|
58
|
-
* delete all data extracted from a block
|
|
59
|
-
* @param queryRunner
|
|
60
|
-
* @param extractor
|
|
61
|
-
* @param block
|
|
62
|
-
* @returns
|
|
63
|
-
*/
|
|
64
|
-
deleteBlockEntities = async (queryRunner, extractor, block) => {
|
|
65
|
-
const repository = queryRunner.manager.getRepository(this.repo);
|
|
66
|
-
const deletedData = await repository.find({
|
|
67
|
-
where: {
|
|
68
|
-
extractor: extractor,
|
|
69
|
-
block: block,
|
|
70
|
-
},
|
|
71
|
-
});
|
|
72
|
-
await repository.delete({
|
|
73
|
-
extractor: extractor,
|
|
74
|
-
block: block,
|
|
75
|
-
});
|
|
76
|
-
return this.convertEntityToData(deletedData);
|
|
77
|
-
};
|
|
78
|
-
/**
|
|
79
|
-
* delete all data extracted from a block
|
|
80
|
-
* @param queryRunner
|
|
81
|
-
* @param extractor
|
|
82
|
-
* @param block
|
|
83
|
-
* @returns
|
|
84
|
-
*/
|
|
85
|
-
updateBlockEntities = async (queryRunner, extractor, block) => {
|
|
86
|
-
const repository = this.datasource.getRepository(this.repo);
|
|
87
|
-
const updatedData = await repository.find({
|
|
88
|
-
where: {
|
|
89
|
-
extractor: extractor,
|
|
90
|
-
spendBlock: block,
|
|
91
|
-
block: Not(block),
|
|
92
|
-
},
|
|
93
|
-
});
|
|
94
|
-
await repository.update({
|
|
95
|
-
spendBlock: block,
|
|
96
|
-
extractor: extractor,
|
|
97
|
-
}, {
|
|
98
|
-
spendBlock: null,
|
|
99
|
-
spendHeight: 0,
|
|
100
|
-
});
|
|
101
|
-
return updatedData;
|
|
102
|
-
};
|
|
103
|
-
/**
|
|
104
|
-
* insert all extracted box data in an atomic transaction
|
|
105
|
-
* update the data if a box with the same id is already stored in db
|
|
106
|
-
* @param boxes
|
|
107
|
-
* @param block
|
|
108
|
-
* @param extractor
|
|
109
|
-
* @return inserted items and updated box ids
|
|
110
|
-
* returns undefined in case of any problem
|
|
111
|
-
*/
|
|
112
|
-
storeBoxes = async (boxes, block, extractor) => {
|
|
113
|
-
let boxesToInsert = [], boxesToUpdate = [];
|
|
114
|
-
const queryRunner = this.datasource.createQueryRunner();
|
|
115
|
-
await queryRunner.connect();
|
|
116
|
-
await queryRunner.startTransaction();
|
|
117
|
-
try {
|
|
118
|
-
const repository = queryRunner.manager.getRepository(this.repo);
|
|
119
|
-
const dbBoxIds = (await repository.findBy({
|
|
120
|
-
boxId: In(boxes.map((item) => item.boxId)),
|
|
121
|
-
extractor: extractor,
|
|
122
|
-
})).map((box) => box.boxId);
|
|
123
|
-
if (dbBoxIds.length > 0)
|
|
124
|
-
this.logger.debug(`Found stored boxes with same boxId`, dbBoxIds);
|
|
125
|
-
boxesToUpdate = boxes.filter((box) => dbBoxIds.includes(box.boxId));
|
|
126
|
-
boxesToInsert = difference(boxes, boxesToUpdate);
|
|
127
|
-
if (boxesToInsert.length > 0) {
|
|
128
|
-
this.logger.debug(`Inserting boxes`);
|
|
129
|
-
await this.insertEntities(queryRunner, boxesToInsert, block, extractor);
|
|
130
|
-
}
|
|
131
|
-
if (boxesToUpdate.length > 0)
|
|
132
|
-
this.logger.info(`Updating boxes with following Ids in the database: [${boxesToUpdate
|
|
133
|
-
.map((col) => col.boxId)
|
|
134
|
-
.join(', ')}]`);
|
|
135
|
-
for (const box of boxesToUpdate) {
|
|
136
|
-
this.logger.debug(`Updating boxes in database [${JsonBigInt.stringify(box)}]`);
|
|
137
|
-
await this.updateEntity(queryRunner, box, block, extractor);
|
|
138
|
-
}
|
|
139
|
-
await queryRunner.commitTransaction();
|
|
140
|
-
return true;
|
|
141
|
-
}
|
|
142
|
-
catch (e) {
|
|
143
|
-
this.logger.error(`An error occurred during store boxes action: ${e}`);
|
|
144
|
-
await queryRunner.rollbackTransaction();
|
|
145
|
-
return false;
|
|
146
|
-
}
|
|
147
|
-
finally {
|
|
148
|
-
await queryRunner.release();
|
|
149
|
-
}
|
|
150
|
-
};
|
|
151
|
-
/**
|
|
152
|
-
* update spending information of stored boxes
|
|
153
|
-
* chunk spendInfos to prevent large database queries
|
|
154
|
-
* Note: It only updates the spendHeight and spendBlock fields. If updating
|
|
155
|
-
* anything else is required, override this implementation to include the
|
|
156
|
-
* additional fields.
|
|
157
|
-
* @param spendInfos
|
|
158
|
-
* @param block
|
|
159
|
-
* @param extractor
|
|
160
|
-
* @returns spent box ids
|
|
161
|
-
*/
|
|
162
|
-
spendBoxes = async (spendInfos, block, extractor) => {
|
|
163
|
-
const spentData = [];
|
|
164
|
-
const spendInfoChunks = chunk(spendInfos, DB_CHUNK_SIZE);
|
|
165
|
-
for (const spendInfoChunk of spendInfoChunks) {
|
|
166
|
-
const boxIds = spendInfoChunk.map((info) => info.boxId);
|
|
167
|
-
const updateResult = await this.repository.update({
|
|
168
|
-
boxId: In(boxIds),
|
|
169
|
-
extractor: extractor,
|
|
170
|
-
}, {
|
|
171
|
-
spendBlock: block.hash,
|
|
172
|
-
spendHeight: block.height,
|
|
173
|
-
});
|
|
174
|
-
if (updateResult.affected && updateResult.affected > 0) {
|
|
175
|
-
const spentRows = await this.repository.findBy({
|
|
176
|
-
boxId: In(boxIds),
|
|
177
|
-
spendBlock: block.hash,
|
|
178
|
-
});
|
|
179
|
-
spentData.push(...spentRows);
|
|
180
|
-
for (const row of spentRows) {
|
|
181
|
-
this.logger.debug(`Spent box with boxId [${row.boxId}] at height ${block.height}`);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
return spentData.map((data) => pick(data, 'boxId'));
|
|
186
|
-
};
|
|
187
|
-
/**
|
|
188
|
-
* delete extracted data from a specific block
|
|
189
|
-
* if a box is spend in this block mark it as unspent
|
|
190
|
-
* if a box is created in this block remove it from database
|
|
191
|
-
* @param block
|
|
192
|
-
* @param extractor
|
|
193
|
-
* @return deleted items and updated box ids
|
|
194
|
-
*/
|
|
195
|
-
deleteBlockBoxes = async (block, extractor) => {
|
|
196
|
-
const queryRunner = this.datasource.createQueryRunner();
|
|
197
|
-
await queryRunner.connect();
|
|
198
|
-
await queryRunner.startTransaction();
|
|
199
|
-
try {
|
|
200
|
-
this.logger.info(`Deleting boxes in block ${block} and extractor ${extractor}`);
|
|
201
|
-
const updatedData = await this.updateBlockEntities(queryRunner, extractor, block);
|
|
202
|
-
const deletedData = await this.deleteBlockEntities(queryRunner, extractor, block);
|
|
203
|
-
await queryRunner.commitTransaction();
|
|
204
|
-
return {
|
|
205
|
-
deletedData,
|
|
206
|
-
updatedData: updatedData.map((data) => pick(data, 'boxId')),
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
catch (error) {
|
|
210
|
-
await queryRunner.rollbackTransaction();
|
|
211
|
-
this.logger.error(`An error occurred while deleting data extracted from block ${block}`, error);
|
|
212
|
-
throw error;
|
|
213
|
-
}
|
|
214
|
-
finally {
|
|
215
|
-
await queryRunner.release();
|
|
216
|
-
}
|
|
217
|
-
};
|
|
218
|
-
}
|
|
219
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RFcmdvRXh0cmFjdG9yQWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2VyZ28vYWJzdHJhY3RFcmdvRXh0cmFjdG9yQWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVwRCxPQUFPLEVBQWtCLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVFLE9BQU8sRUFFTCxFQUFFLEVBRUYsR0FBRyxHQUlKLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxVQUFVLE1BQU0sMkJBQTJCLENBQUM7QUFHbkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUk3QyxNQUFNLE9BQWdCLDJCQUEyQjtJQUk5QixVQUFVLENBQWE7SUFDL0IsTUFBTSxDQUFpQjtJQUNiLFVBQVUsQ0FBOEI7SUFDbkQsSUFBSSxDQUFnQztJQUU1QyxZQUNFLFVBQXNCLEVBQ3RCLElBQW1DLEVBQ25DLE1BQXVCO1FBRXZCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksV0FBVyxFQUFFLENBQUM7UUFDbEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDTyxZQUFZLEdBQUcsQ0FDdkIsSUFBcUIsRUFBRSx3REFBd0Q7SUFDL0UsS0FBZ0IsRUFBRSx3REFBd0Q7SUFDMUUsU0FBaUIsRUFDbUIsRUFBRTtRQUN0QyxNQUFNLEtBQUssQ0FDVCxxRkFBcUYsQ0FDdEYsQ0FBQztJQUNKLENBQUMs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Q0FDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNodW5rLCBkaWZmZXJlbmNlLCBwaWNrIH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHsgQWJzdHJhY3RMb2dnZXIsIER1bW15TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHtcbiAgRGF0YVNvdXJjZSxcbiAgSW4sXG4gIFJlcG9zaXRvcnksXG4gIE5vdCxcbiAgRW50aXR5VGFyZ2V0LFxuICBGaW5kT3B0aW9uc1doZXJlLFxuICBRdWVyeVJ1bm5lcixcbn0gZnJvbSAnQHJvc2VuLWJyaWRnZS9leHRlbmRlZC10eXBlb3JtJztcbmltcG9ydCBKc29uQmlnSW50IGZyb20gJ0Byb3Nlbi1icmlkZ2UvanNvbi1iaWdpbnQnO1xuaW1wb3J0IHsgQmxvY2tJbmZvIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyLWludGVyZmFjZXMnO1xuXG5pbXBvcnQgeyBEQl9DSFVOS19TSVpFIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IEFic3RyYWN0RXJnb0V4dHJhY3RvckVudGl0eSB9IGZyb20gJy4vYWJzdHJhY3RFcmdvRXh0cmFjdG9yRW50aXR5JztcbmltcG9ydCB7IEFic3RyYWN0Qm94RGF0YSwgQm94SW5mbywgU3BlbmRJbmZvIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RXJnb0V4dHJhY3RvckFjdGlvbjxcbiAgRXh0cmFjdGVkRGF0YSBleHRlbmRzIEFic3RyYWN0Qm94RGF0YSxcbiAgRXh0cmFjdG9yRW50aXR5IGV4dGVuZHMgQWJzdHJhY3RFcmdvRXh0cmFjdG9yRW50aXR5LFxuPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YXNvdXJjZTogRGF0YVNvdXJjZTtcbiAgcmVhZG9ubHkgbG9nZ2VyOiBBYnN0cmFjdExvZ2dlcjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlcG9zaXRvcnk6IFJlcG9zaXRvcnk8RXh0cmFjdG9yRW50aXR5PjtcbiAgcHJpdmF0ZSByZXBvOiBFbnRpdHlUYXJnZXQ8RXh0cmFjdG9yRW50aXR5PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBkYXRhU291cmNlOiBEYXRhU291cmNlLFxuICAgIHJlcG86IEVudGl0eVRhcmdldDxFeHRyYWN0b3JFbnRpdHk+LFxuICAgIGxvZ2dlcj86IEFic3RyYWN0TG9nZ2VyLFxuICApIHtcbiAgICB0aGlzLmRhdGFzb3VyY2UgPSBkYXRhU291cmNlO1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyID8gbG9nZ2VyIDogbmV3IER1bW15TG9nZ2VyKCk7XG4gICAgdGhpcy5yZXBvc2l0b3J5ID0gdGhpcy5kYXRhc291cmNlLmdldFJlcG9zaXRvcnkocmVwbyk7XG4gICAgdGhpcy5yZXBvID0gcmVwbztcbiAgfVxuXG4gIC8qKlxuICAgKiBjcmVhdGUgdGhlIGRhdGFiYXNlIGVudGl0eSBmcm9tIGV4dHJhY3RlZCBkYXRhIGFuZCBibG9jayBpbmZvcm1hdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZUVudGl0eSA9IChcbiAgICBkYXRhOiBFeHRyYWN0ZWREYXRhW10sIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgYmxvY2s6IEJsb2NrSW5mbywgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBleHRyYWN0b3I6IHN0cmluZywgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgKTogQXJyYXk8T21pdDxFeHRyYWN0b3JFbnRpdHksICdpZCc+PiA9PiB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICAnWW91IG11c3QgaW1wbGVtZW50IGBjcmVhdGVFbnRpdHlgIG9yIG92ZXJyaWRlIGBpbnNlcnRFbnRpdGllc2AgYW5kIGB1cGRhdGVFbnRpdGllc2AnLFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIGNvbnZlcnQgdGhlIGRhdGFiYXNlIGVudGl0eSBiYWNrIHRvIHJhdyBkYXRhXG4gICAqL1xuICBwcm90ZWN0ZWQgY29udmVydEVudGl0eVRvRGF0YSA9IChcbiAgICBlbnRpdGllczogRXh0cmFjdG9yRW50aXR5W10sIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICk6IEV4dHJhY3RlZERhdGFbXSA9PiB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICAnWW91IG11c3QgaW1wbGVtZW50IGBjb252ZXJ0RW50aXR5VG9EYXRhYCBvciBvdmVycmlkZSBgZGVsZXRlQmxvY2tFbnRpdGllc2AnLFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIGluc2VydCBlbnRpdGllcyBleHRyYWN0ZWQgZnJvbSBhIGJsb2NrIHRvIGRhdGFiYXNlXG4gICAqIEBwYXJhbSBxdWVyeVJ1bm5lclxuICAgKiBAcGFyYW0gYm94ZXNUb0luc2VydFxuICAgKiBAcGFyYW0gYmxvY2tcbiAgICogQHBhcmFtIGV4dHJhY3RvclxuICAgKi9cbiAgcHJvdGVjdGVkIGluc2VydEVudGl0aWVzID0gYXN5bmMgKFxuICAgIHF1ZXJ5UnVubmVyOiBRdWVyeVJ1bm5lcixcbiAgICBib3hlc1RvSW5zZXJ0OiBBcnJheTxFeHRyYWN0ZWREYXRhPixcbiAgICBibG9jazogQmxvY2tJbmZvLFxuICAgIGV4dHJhY3Rvcjogc3RyaW5nLFxuICApID0+IHtcbiAgICBjb25zdCByZXBvc2l0b3J5ID0gcXVlcnlSdW5uZXIubWFuYWdlci5nZXRSZXBvc2l0b3J5KHRoaXMucmVwbyk7XG4gICAgYXdhaXQgcmVwb3NpdG9yeS5pbnNlcnQoXG4gICAgICB0aGlzLmNyZWF0ZUVudGl0eShib3hlc1RvSW5zZXJ0LCBibG9jaywgZXh0cmFjdG9yKSBhcyBhbnksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHVwZGF0ZSBlbnRpdGllcyByZWxhdGVkIHRvIGEgYm94XG4gICAqIEBwYXJhbSBxdWVyeVJ1bm5lclxuICAgKiBAcGFyYW0gdXBkYXRlQm94XG4gICAqIEBwYXJhbSBibG9ja1xuICAgKiBAcGFyYW0gZXh0cmFjdG9yXG4gICAqL1xuICBwcm90ZWN0ZWQgdXBkYXRlRW50aXR5ID0gYXN5bmMgKFxuICAgIHF1ZXJ5UnVubmVyOiBRdWVyeVJ1bm5lcixcbiAgICB1cGRhdGVCb3g6IEV4dHJhY3RlZERhdGEsXG4gICAgYmxvY2s6IEJsb2NrSW5mbyxcbiAgICBleHRyYWN0b3I6IHN0cmluZyxcbiAgKSA9PiB7XG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IHF1ZXJ5UnVubmVyLm1hbmFnZXIuZ2V0UmVwb3NpdG9yeSh0aGlzLnJlcG8pO1xuICAgIGNvbnN0IGJveCA9IHRoaXMuY3JlYXRlRW50aXR5KFt1cGRhdGVCb3hdLCBibG9jaywgZXh0cmFjdG9yKVswXTtcbiAgICBhd2FpdCByZXBvc2l0b3J5LnVwZGF0ZShcbiAgICAgIHtcbiAgICAgICAgYm94SWQ6IGJveC5ib3hJZCxcbiAgICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgICB9IGFzIEZpbmRPcHRpb25zV2hlcmU8RXh0cmFjdG9yRW50aXR5PixcbiAgICAgIGJveCBhcyBhbnksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIGRlbGV0ZSBhbGwgZGF0YSBleHRyYWN0ZWQgZnJvbSBhIGJsb2NrXG4gICAqIEBwYXJhbSBxdWVyeVJ1bm5lclxuICAgKiBAcGFyYW0gZXh0cmFjdG9yXG4gICAqIEBwYXJhbSBibG9ja1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHJvdGVjdGVkIGRlbGV0ZUJsb2NrRW50aXRpZXMgPSBhc3luYyAoXG4gICAgcXVlcnlSdW5uZXI6IFF1ZXJ5UnVubmVyLFxuICAgIGV4dHJhY3Rvcjogc3RyaW5nLFxuICAgIGJsb2NrOiBzdHJpbmcsXG4gICk6IFByb21pc2U8RXh0cmFjdGVkRGF0YVtdPiA9PiB7XG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IHF1ZXJ5UnVubmVyLm1hbmFnZXIuZ2V0UmVwb3NpdG9yeSh0aGlzLnJlcG8pO1xuICAgIGNvbnN0IGRlbGV0ZWREYXRhID0gYXdhaXQgcmVwb3NpdG9yeS5maW5kKHtcbiAgICAgIHdoZXJlOiB7XG4gICAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgICAgICBibG9jazogYmxvY2ssXG4gICAgICB9IGFzIEZpbmRPcHRpb25zV2hlcmU8RXh0cmFjdG9yRW50aXR5PixcbiAgICB9KTtcbiAgICBhd2FpdCByZXBvc2l0b3J5LmRlbGV0ZSh7XG4gICAgICBleHRyYWN0b3I6IGV4dHJhY3RvcixcbiAgICAgIGJsb2NrOiBibG9jayxcbiAgICB9IGFzIHVua25vd24gYXMgRmluZE9wdGlvbnNXaGVyZTxFeHRyYWN0b3JFbnRpdHk+KTtcbiAgICByZXR1cm4gdGhpcy5jb252ZXJ0RW50aXR5VG9EYXRhKGRlbGV0ZWREYXRhKTtcbiAgfTtcblxuICAvKipcbiAgICogZGVsZXRlIGFsbCBkYXRhIGV4dHJhY3RlZCBmcm9tIGEgYmxvY2tcbiAgICogQHBhcmFtIHF1ZXJ5UnVubmVyXG4gICAqIEBwYXJhbSBleHRyYWN0b3JcbiAgICogQHBhcmFtIGJsb2NrXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwcm90ZWN0ZWQgdXBkYXRlQmxvY2tFbnRpdGllcyA9IGFzeW5jIChcbiAgICBxdWVyeVJ1bm5lcjogUXVlcnlSdW5uZXIsXG4gICAgZXh0cmFjdG9yOiBzdHJpbmcsXG4gICAgYmxvY2s6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxFeHRyYWN0b3JFbnRpdHlbXT4gPT4ge1xuICAgIGNvbnN0IHJlcG9zaXRvcnkgPSB0aGlzLmRhdGFzb3VyY2UuZ2V0UmVwb3NpdG9yeShcbiAgICAgIHRoaXMucmVwbyBhcyBFbnRpdHlUYXJnZXQ8bmV3ICgpID0+IEV4dHJhY3RvckVudGl0eT4sXG4gICAgKTtcbiAgICBjb25zdCB1cGRhdGVkRGF0YSA9IGF3YWl0IHJlcG9zaXRvcnkuZmluZCh7XG4gICAgICB3aGVyZToge1xuICAgICAgICBleHRyYWN0b3I6IGV4dHJhY3RvcixcbiAgICAgICAgc3BlbmRCbG9jazogYmxvY2ssXG4gICAgICAgIGJsb2NrOiBOb3QoYmxvY2spLFxuICAgICAgfSBhcyB1bmtub3duIGFzIEZpbmRPcHRpb25zV2hlcmU8RXh0cmFjdG9yRW50aXR5PixcbiAgICB9KTtcbiAgICBhd2FpdCByZXBvc2l0b3J5LnVwZGF0ZShcbiAgICAgIHtcbiAgICAgICAgc3BlbmRCbG9jazogYmxvY2ssXG4gICAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgICAgfSBhcyB1bmtub3duIGFzIEZpbmRPcHRpb25zV2hlcmU8RXh0cmFjdG9yRW50aXR5PixcbiAgICAgIHtcbiAgICAgICAgc3BlbmRCbG9jazogbnVsbCxcbiAgICAgICAgc3BlbmRIZWlnaHQ6IDAsXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIHVwZGF0ZWREYXRhIGFzIHVua25vd24gYXMgRXh0cmFjdG9yRW50aXR5W107XG4gIH07XG5cbiAgLyoqXG4gICAqIGluc2VydCBhbGwgZXh0cmFjdGVkIGJveCBkYXRhIGluIGFuIGF0b21pYyB0cmFuc2FjdGlvblxuICAgKiB1cGRhdGUgdGhlIGRhdGEgaWYgYSBib3ggd2l0aCB0aGUgc2FtZSBpZCBpcyBhbHJlYWR5IHN0b3JlZCBpbiBkYlxuICAgKiBAcGFyYW0gYm94ZXNcbiAgICogQHBhcmFtIGJsb2NrXG4gICAqIEBwYXJhbSBleHRyYWN0b3JcbiAgICogQHJldHVybiBpbnNlcnRlZCBpdGVtcyBhbmQgdXBkYXRlZCBib3ggaWRzXG4gICAqIHJldHVybnMgdW5kZWZpbmVkIGluIGNhc2Ugb2YgYW55IHByb2JsZW1cbiAgICovXG4gIHN0b3JlQm94ZXMgPSBhc3luYyAoXG4gICAgYm94ZXM6IEFycmF5PEV4dHJhY3RlZERhdGE+LFxuICAgIGJsb2NrOiBCbG9ja0luZm8sXG4gICAgZXh0cmFjdG9yOiBzdHJpbmcsXG4gICk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIGxldCBib3hlc1RvSW5zZXJ0OiBFeHRyYWN0ZWREYXRhW10gPSBbXSxcbiAgICAgIGJveGVzVG9VcGRhdGU6IEV4dHJhY3RlZERhdGFbXSA9IFtdO1xuICAgIGNvbnN0IHF1ZXJ5UnVubmVyID0gdGhpcy5kYXRhc291cmNlLmNyZWF0ZVF1ZXJ5UnVubmVyKCk7XG4gICAgYXdhaXQgcXVlcnlSdW5uZXIuY29ubmVjdCgpO1xuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVwb3NpdG9yeSA9IHF1ZXJ5UnVubmVyLm1hbmFnZXIuZ2V0UmVwb3NpdG9yeSh0aGlzLnJlcG8pO1xuICAgICAgY29uc3QgZGJCb3hJZHMgPSAoXG4gICAgICAgIGF3YWl0IHJlcG9zaXRvcnkuZmluZEJ5KHtcbiAgICAgICAgICBib3hJZDogSW4oYm94ZXMubWFwKChpdGVtKSA9PiBpdGVtLmJveElkKSksXG4gICAgICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgICAgIH0gYXMgRmluZE9wdGlvbnNXaGVyZTxFeHRyYWN0b3JFbnRpdHk+KVxuICAgICAgKS5tYXAoKGJveCkgPT4gYm94LmJveElkKTtcbiAgICAgIGlmIChkYkJveElkcy5sZW5ndGggPiAwKVxuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgRm91bmQgc3RvcmVkIGJveGVzIHdpdGggc2FtZSBib3hJZGAsIGRiQm94SWRzKTtcblxuICAgICAgYm94ZXNUb1VwZGF0ZSA9IGJveGVzLmZpbHRlcigoYm94KSA9PiBkYkJveElkcy5pbmNsdWRlcyhib3guYm94SWQpKTtcbiAgICAgIGJveGVzVG9JbnNlcnQgPSBkaWZmZXJlbmNlKGJveGVzLCBib3hlc1RvVXBkYXRlKTtcblxuICAgICAgaWYgKGJveGVzVG9JbnNlcnQubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgSW5zZXJ0aW5nIGJveGVzYCk7XG4gICAgICAgIGF3YWl0IHRoaXMuaW5zZXJ0RW50aXRpZXMocXVlcnlSdW5uZXIsIGJveGVzVG9JbnNlcnQsIGJsb2NrLCBleHRyYWN0b3IpO1xuICAgICAgfVxuICAgICAgaWYgKGJveGVzVG9VcGRhdGUubGVuZ3RoID4gMClcbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhcbiAgICAgICAgICBgVXBkYXRpbmcgYm94ZXMgd2l0aCBmb2xsb3dpbmcgSWRzIGluIHRoZSBkYXRhYmFzZTogWyR7Ym94ZXNUb1VwZGF0ZVxuICAgICAgICAgICAgLm1hcCgoY29sKSA9PiBjb2wuYm94SWQpXG4gICAgICAgICAgICAuam9pbignLCAnKX1dYCxcbiAgICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgYm94IG9mIGJveGVzVG9VcGRhdGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgYFVwZGF0aW5nIGJveGVzIGluIGRhdGFiYXNlIFske0pzb25CaWdJbnQuc3RyaW5naWZ5KGJveCl9XWAsXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlRW50aXR5KHF1ZXJ5UnVubmVyLCBib3gsIGJsb2NrLCBleHRyYWN0b3IpO1xuICAgICAgfVxuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGBBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgc3RvcmUgYm94ZXMgYWN0aW9uOiAke2V9YCk7XG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJlbGVhc2UoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIHVwZGF0ZSBzcGVuZGluZyBpbmZvcm1hdGlvbiBvZiBzdG9yZWQgYm94ZXNcbiAgICogY2h1bmsgc3BlbmRJbmZvcyB0byBwcmV2ZW50IGxhcmdlIGRhdGFiYXNlIHF1ZXJpZXNcbiAgICogTm90ZTogSXQgb25seSB1cGRhdGVzIHRoZSBzcGVuZEhlaWdodCBhbmQgc3BlbmRCbG9jayBmaWVsZHMuIElmIHVwZGF0aW5nXG4gICAqIGFueXRoaW5nIGVsc2UgaXMgcmVxdWlyZWQsIG92ZXJyaWRlIHRoaXMgaW1wbGVtZW50YXRpb24gdG8gaW5jbHVkZSB0aGVcbiAgICogYWRkaXRpb25hbCBmaWVsZHMuXG4gICAqIEBwYXJhbSBzcGVuZEluZm9zXG4gICAqIEBwYXJhbSBibG9ja1xuICAgKiBAcGFyYW0gZXh0cmFjdG9yXG4gICAqIEByZXR1cm5zIHNwZW50IGJveCBpZHNcbiAgICovXG4gIHNwZW5kQm94ZXMgPSBhc3luYyAoXG4gICAgc3BlbmRJbmZvczogQXJyYXk8U3BlbmRJbmZvPixcbiAgICBibG9jazogQmxvY2tJbmZvLFxuICAgIGV4dHJhY3Rvcjogc3RyaW5nLFxuICApOiBQcm9taXNlPEJveEluZm9bXT4gPT4ge1xuICAgIGNvbnN0IHNwZW50RGF0YSA9IFtdO1xuICAgIGNvbnN0IHNwZW5kSW5mb0NodW5rcyA9IGNodW5rKHNwZW5kSW5mb3MsIERCX0NIVU5LX1NJWkUpO1xuICAgIGZvciAoY29uc3Qgc3BlbmRJbmZvQ2h1bmsgb2Ygc3BlbmRJbmZvQ2h1bmtzKSB7XG4gICAgICBjb25zdCBib3hJZHMgPSBzcGVuZEluZm9DaHVuay5tYXAoKGluZm8pID0+IGluZm8uYm94SWQpO1xuICAgICAgY29uc3QgdXBkYXRlUmVzdWx0ID0gYXdhaXQgdGhpcy5yZXBvc2l0b3J5LnVwZGF0ZShcbiAgICAgICAge1xuICAgICAgICAgIGJveElkOiBJbihib3hJZHMpLFxuICAgICAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgICAgICB9IGFzIEZpbmRPcHRpb25zV2hlcmU8RXh0cmFjdG9yRW50aXR5PixcbiAgICAgICAge1xuICAgICAgICAgIHNwZW5kQmxvY2s6IGJsb2NrLmhhc2gsXG4gICAgICAgICAgc3BlbmRIZWlnaHQ6IGJsb2NrLmhlaWdodCxcbiAgICAgICAgfSBhcyBhbnksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgKTtcblxuICAgICAgaWYgKHVwZGF0ZVJlc3VsdC5hZmZlY3RlZCAmJiB1cGRhdGVSZXN1bHQuYWZmZWN0ZWQgPiAwKSB7XG4gICAgICAgIGNvbnN0IHNwZW50Um93cyA9IGF3YWl0IHRoaXMucmVwb3NpdG9yeS5maW5kQnkoe1xuICAgICAgICAgIGJveElkOiBJbihib3hJZHMpLFxuICAgICAgICAgIHNwZW5kQmxvY2s6IGJsb2NrLmhhc2gsXG4gICAgICAgIH0gYXMgRmluZE9wdGlvbnNXaGVyZTxFeHRyYWN0b3JFbnRpdHk+KTtcbiAgICAgICAgc3BlbnREYXRhLnB1c2goLi4uc3BlbnRSb3dzKTtcbiAgICAgICAgZm9yIChjb25zdCByb3cgb2Ygc3BlbnRSb3dzKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgU3BlbnQgYm94IHdpdGggYm94SWQgWyR7cm93LmJveElkfV0gYXQgaGVpZ2h0ICR7YmxvY2suaGVpZ2h0fWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3BlbnREYXRhLm1hcCgoZGF0YSkgPT4gcGljayhkYXRhLCAnYm94SWQnKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIGRlbGV0ZSBleHRyYWN0ZWQgZGF0YSBmcm9tIGEgc3BlY2lmaWMgYmxvY2tcbiAgICogaWYgYSBib3ggaXMgc3BlbmQgaW4gdGhpcyBibG9jayBtYXJrIGl0IGFzIHVuc3BlbnRcbiAgICogaWYgYSBib3ggaXMgY3JlYXRlZCBpbiB0aGlzIGJsb2NrIHJlbW92ZSBpdCBmcm9tIGRhdGFiYXNlXG4gICAqIEBwYXJhbSBibG9ja1xuICAgKiBAcGFyYW0gZXh0cmFjdG9yXG4gICAqIEByZXR1cm4gZGVsZXRlZCBpdGVtcyBhbmQgdXBkYXRlZCBib3ggaWRzXG4gICAqL1xuICBkZWxldGVCbG9ja0JveGVzID0gYXN5bmMgKFxuICAgIGJsb2NrOiBzdHJpbmcsXG4gICAgZXh0cmFjdG9yOiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBkZWxldGVkRGF0YTogRXh0cmFjdGVkRGF0YVtdOyB1cGRhdGVkRGF0YTogQm94SW5mb1tdIH0+ID0+IHtcbiAgICBjb25zdCBxdWVyeVJ1bm5lciA9IHRoaXMuZGF0YXNvdXJjZS5jcmVhdGVRdWVyeVJ1bm5lcigpO1xuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbm5lY3QoKTtcbiAgICBhd2FpdCBxdWVyeVJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgIGBEZWxldGluZyBib3hlcyBpbiBibG9jayAke2Jsb2NrfSBhbmQgZXh0cmFjdG9yICR7ZXh0cmFjdG9yfWAsXG4gICAgICApO1xuICAgICAgY29uc3QgdXBkYXRlZERhdGEgPSBhd2FpdCB0aGlzLnVwZGF0ZUJsb2NrRW50aXRpZXMoXG4gICAgICAgIHF1ZXJ5UnVubmVyLFxuICAgICAgICBleHRyYWN0b3IsXG4gICAgICAgIGJsb2NrLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRlbGV0ZWREYXRhID0gYXdhaXQgdGhpcy5kZWxldGVCbG9ja0VudGl0aWVzKFxuICAgICAgICBxdWVyeVJ1bm5lcixcbiAgICAgICAgZXh0cmFjdG9yLFxuICAgICAgICBibG9jayxcbiAgICAgICk7XG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGVsZXRlZERhdGEsXG4gICAgICAgIHVwZGF0ZWREYXRhOiB1cGRhdGVkRGF0YS5tYXAoKGRhdGEpID0+IHBpY2soZGF0YSwgJ2JveElkJykpLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgIGBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBkZWxldGluZyBkYXRhIGV4dHJhY3RlZCBmcm9tIGJsb2NrICR7YmxvY2t9YCxcbiAgICAgICAgZXJyb3IsXG4gICAgICApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJlbGVhc2UoKTtcbiAgICB9XG4gIH07XG59XG4iXX0=
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export declare abstract class AbstractErgoExtractorEntity {
|
|
2
|
-
id: number;
|
|
3
|
-
boxId: string;
|
|
4
|
-
block: string;
|
|
5
|
-
height: number;
|
|
6
|
-
spendBlock?: string | null;
|
|
7
|
-
spendHeight?: number | null;
|
|
8
|
-
extractor: string;
|
|
9
|
-
serialized: string;
|
|
10
|
-
}
|
|
11
|
-
//# sourceMappingURL=abstractErgoExtractorEntity.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"abstractErgoExtractorEntity.d.ts","sourceRoot":"","sources":["../../lib/ergo/abstractErgoExtractorEntity.ts"],"names":[],"mappings":"AAMA,8BACsB,2BAA2B;IAE/C,EAAE,EAAE,MAAM,CAAC;IAGX,KAAK,EAAE,MAAM,CAAC;IAGd,KAAK,EAAE,MAAM,CAAC;IAGd,MAAM,EAAE,MAAM,CAAC;IAGf,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAG3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAG5B,SAAS,EAAE,MAAM,CAAC;IAGlB,UAAU,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -1,57 +0,0 @@
|
|
|
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, PrimaryGeneratedColumn, Unique, } from '@rosen-bridge/extended-typeorm';
|
|
11
|
-
let AbstractErgoExtractorEntity = class AbstractErgoExtractorEntity {
|
|
12
|
-
id;
|
|
13
|
-
boxId;
|
|
14
|
-
block;
|
|
15
|
-
height;
|
|
16
|
-
spendBlock;
|
|
17
|
-
spendHeight;
|
|
18
|
-
extractor;
|
|
19
|
-
serialized;
|
|
20
|
-
};
|
|
21
|
-
__decorate([
|
|
22
|
-
PrimaryGeneratedColumn(),
|
|
23
|
-
__metadata("design:type", Number)
|
|
24
|
-
], AbstractErgoExtractorEntity.prototype, "id", void 0);
|
|
25
|
-
__decorate([
|
|
26
|
-
Column({ type: 'varchar' }),
|
|
27
|
-
__metadata("design:type", String)
|
|
28
|
-
], AbstractErgoExtractorEntity.prototype, "boxId", void 0);
|
|
29
|
-
__decorate([
|
|
30
|
-
Column({ type: 'varchar' }),
|
|
31
|
-
__metadata("design:type", String)
|
|
32
|
-
], AbstractErgoExtractorEntity.prototype, "block", void 0);
|
|
33
|
-
__decorate([
|
|
34
|
-
Column({ type: 'int' }),
|
|
35
|
-
__metadata("design:type", Number)
|
|
36
|
-
], AbstractErgoExtractorEntity.prototype, "height", void 0);
|
|
37
|
-
__decorate([
|
|
38
|
-
Column({ nullable: true, type: 'varchar' }),
|
|
39
|
-
__metadata("design:type", Object)
|
|
40
|
-
], AbstractErgoExtractorEntity.prototype, "spendBlock", void 0);
|
|
41
|
-
__decorate([
|
|
42
|
-
Column({ nullable: true, type: 'int' }),
|
|
43
|
-
__metadata("design:type", Object)
|
|
44
|
-
], AbstractErgoExtractorEntity.prototype, "spendHeight", void 0);
|
|
45
|
-
__decorate([
|
|
46
|
-
Column({ type: 'varchar' }),
|
|
47
|
-
__metadata("design:type", String)
|
|
48
|
-
], AbstractErgoExtractorEntity.prototype, "extractor", void 0);
|
|
49
|
-
__decorate([
|
|
50
|
-
Column({ type: 'varchar' }),
|
|
51
|
-
__metadata("design:type", String)
|
|
52
|
-
], AbstractErgoExtractorEntity.prototype, "serialized", void 0);
|
|
53
|
-
AbstractErgoExtractorEntity = __decorate([
|
|
54
|
-
Unique(['boxId', 'extractor'])
|
|
55
|
-
], AbstractErgoExtractorEntity);
|
|
56
|
-
export { AbstractErgoExtractorEntity };
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RFcmdvRXh0cmFjdG9yRW50aXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2VyZ28vYWJzdHJhY3RFcmdvRXh0cmFjdG9yRW50aXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFDTCxNQUFNLEVBQ04sc0JBQXNCLEVBQ3RCLE1BQU0sR0FDUCxNQUFNLGdDQUFnQyxDQUFDO0FBR2pDLElBQWUsMkJBQTJCLEdBQTFDLE1BQWUsMkJBQTJCO0lBRS9DLEVBQUUsQ0FBUztJQUdYLEtBQUssQ0FBUztJQUdkLEtBQUssQ0FBUztJQUdkLE1BQU0sQ0FBUztJQUdmLFVBQVUsQ0FBaUI7SUFHM0IsV0FBVyxDQUFpQjtJQUc1QixTQUFTLENBQVM7SUFHbEIsVUFBVSxDQUFTO0NBQ3BCLENBQUE7QUF0QkM7SUFEQyxzQkFBc0IsRUFBRTs7dURBQ2Q7QUFHWDtJQURDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7MERBQ2Q7QUFHZDtJQURDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7MERBQ2Q7QUFHZDtJQURDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7MkRBQ1Q7QUFHZjtJQURDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOzsrREFDakI7QUFHM0I7SUFEQyxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7Z0VBQ1o7QUFHNUI7SUFEQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7OzhEQUNWO0FBR2xCO0lBREMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDOzsrREFDVDtBQXZCQywyQkFBMkI7SUFEaEQsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0dBQ1QsMkJBQTJCLENBd0JoRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbHVtbixcbiAgUHJpbWFyeUdlbmVyYXRlZENvbHVtbixcbiAgVW5pcXVlLFxufSBmcm9tICdAcm9zZW4tYnJpZGdlL2V4dGVuZGVkLXR5cGVvcm0nO1xuXG5AVW5pcXVlKFsnYm94SWQnLCAnZXh0cmFjdG9yJ10pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFcmdvRXh0cmFjdG9yRW50aXR5IHtcbiAgQFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuICBpZDogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndmFyY2hhcicgfSlcbiAgYm94SWQ6IHN0cmluZztcblxuICBAQ29sdW1uKHsgdHlwZTogJ3ZhcmNoYXInIH0pXG4gIGJsb2NrOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICdpbnQnIH0pXG4gIGhlaWdodDogbnVtYmVyO1xuXG4gIEBDb2x1bW4oeyBudWxsYWJsZTogdHJ1ZSwgdHlwZTogJ3ZhcmNoYXInIH0pXG4gIHNwZW5kQmxvY2s/OiBzdHJpbmcgfCBudWxsO1xuXG4gIEBDb2x1bW4oeyBudWxsYWJsZTogdHJ1ZSwgdHlwZTogJ2ludCcgfSlcbiAgc3BlbmRIZWlnaHQ/OiBudW1iZXIgfCBudWxsO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAndmFyY2hhcicgfSlcbiAgZXh0cmFjdG9yOiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IHR5cGU6ICd2YXJjaGFyJyB9KVxuICBzZXJpYWxpemVkOiBzdHJpbmc7XG59XG4iXX0=
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { AbstractLogger } from '@rosen-bridge/abstract-logger';
|
|
2
|
-
import { BlockInfo, ErgoNetworkType } from '@rosen-bridge/scanner-interfaces';
|
|
3
|
-
import { AbstractErgoExtractor } from '../abstractErgoExtractor';
|
|
4
|
-
import { AbstractErgoExtractorEntity } from '../abstractErgoExtractorEntity';
|
|
5
|
-
import { AbstractBoxData } from '../interfaces';
|
|
6
|
-
import { AbstractInitializableErgoExtractorAction } from './abstractInitializableAction';
|
|
7
|
-
export declare abstract class AbstractInitializableErgoExtractor<ExtractedData extends AbstractBoxData, ExtractorEntity extends AbstractErgoExtractorEntity> extends AbstractErgoExtractor<ExtractedData, ExtractorEntity> {
|
|
8
|
-
protected initialize: boolean;
|
|
9
|
-
private address;
|
|
10
|
-
protected abstract actions: AbstractInitializableErgoExtractorAction<ExtractedData, ExtractorEntity>;
|
|
11
|
-
private network;
|
|
12
|
-
constructor(type: ErgoNetworkType, url: string, address: string, logger?: AbstractLogger, initialize?: boolean);
|
|
13
|
-
/**
|
|
14
|
-
* Initialize extractor using Explorer network
|
|
15
|
-
* @param initialBlock
|
|
16
|
-
*/
|
|
17
|
-
private initializeWithExplorer;
|
|
18
|
-
/**
|
|
19
|
-
* Get the total tx count from Node network
|
|
20
|
-
* @returns total tx count of the address
|
|
21
|
-
*/
|
|
22
|
-
private getTotalTxCount;
|
|
23
|
-
/**
|
|
24
|
-
* Initialize extractor using Node network
|
|
25
|
-
* @param initialBlock
|
|
26
|
-
*/
|
|
27
|
-
private initializeWithNode;
|
|
28
|
-
/**
|
|
29
|
-
* Process a batch of transactions
|
|
30
|
-
* group txs into blocks and process them using `processTransactions`
|
|
31
|
-
* @param txs
|
|
32
|
-
*/
|
|
33
|
-
private processTransactionBatch;
|
|
34
|
-
/**
|
|
35
|
-
* Initialize the extractor with retrial on any unexpected problem
|
|
36
|
-
* its the common part of initialize with Node and Explorer network
|
|
37
|
-
* @param job
|
|
38
|
-
*/
|
|
39
|
-
private initWithRetrial;
|
|
40
|
-
/**
|
|
41
|
-
* initialize extractor database with data created below the initial height
|
|
42
|
-
* ignore initialization if this feature is off
|
|
43
|
-
* try to get data multiple times to pass accidental network problems
|
|
44
|
-
* @param initialBlock
|
|
45
|
-
*/
|
|
46
|
-
initializeBoxes: (initialBlock: BlockInfo) => Promise<void>;
|
|
47
|
-
}
|
|
48
|
-
//# sourceMappingURL=abstractInitializable.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"abstractInitializable.d.ts","sourceRoot":"","sources":["../../../lib/ergo/initializable/abstractInitializable.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAG9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,2BAA2B,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAuB,MAAM,eAAe,CAAC;AAGrE,OAAO,EAAE,wCAAwC,EAAE,MAAM,+BAA+B,CAAC;AAEzF,8BAAsB,kCAAkC,CACtD,aAAa,SAAS,eAAe,EACrC,eAAe,SAAS,2BAA2B,CACnD,SAAQ,qBAAqB,CAAC,aAAa,EAAE,eAAe,CAAC;IAC7D,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,wCAAwC,CAClE,aAAa,EACb,eAAe,CAChB,CAAC;IAEF,OAAO,CAAC,OAAO,CAAgC;gBAG7C,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,cAAc,EACvB,UAAU,UAAO;IAkBnB;;;OAGG;IACH,OAAO,CAAC,sBAAsB,CA6C5B;IAEF;;;OAGG;IACH,OAAO,CAAC,eAAe,CAKrB;IAEF;;;OAGG;IACH,OAAO,CAAC,kBAAkB,CAuCxB;IAEF;;;;OAIG;IACH,OAAO,CAAC,uBAAuB,CAoB7B;IAEF;;;;OAIG;IACH,OAAO,CAAC,eAAe,CA+BrB;IAEF;;;;;OAKG;IACH,eAAe,EAAE,CAAC,YAAY,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D"}
|