@rosen-bridge/watcher-data-extractor 5.0.0 → 5.0.1
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/dist/actions/collateralAction.d.ts +70 -0
- package/dist/actions/collateralAction.d.ts.map +1 -0
- package/dist/actions/collateralAction.js +168 -0
- package/dist/entities/CollateralEntity.d.ts +15 -0
- package/dist/entities/CollateralEntity.d.ts.map +1 -0
- package/dist/entities/CollateralEntity.js +74 -0
- package/dist/extractor/collateralExtractor.d.ts +69 -0
- package/dist/extractor/collateralExtractor.d.ts.map +1 -0
- package/dist/extractor/collateralExtractor.js +215 -0
- package/dist/interfaces/extractedCollateral.d.ts +12 -0
- package/dist/interfaces/extractedCollateral.d.ts.map +1 -0
- package/dist/interfaces/extractedCollateral.js +2 -0
- package/dist/migrations/index.d.ts +2 -2
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/postgres/1708189757400-migration.d.ts +7 -0
- package/dist/migrations/postgres/1708189757400-migration.d.ts.map +1 -0
- package/dist/migrations/postgres/1708189757400-migration.js +28 -0
- package/dist/migrations/sqlite/1708175020320-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1708175020320-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1708175020320-migration.js +27 -0
- package/dist/transformers.d.ts +17 -0
- package/dist/transformers.d.ts.map +1 -0
- package/dist/transformers.js +21 -0
- package/dist/utils.js +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { AbstractLogger } from '@rosen-bridge/abstract-logger';
|
|
2
|
+
import { BlockEntity } from '@rosen-bridge/scanner';
|
|
3
|
+
import { DataSource, DeleteResult } from 'typeorm';
|
|
4
|
+
import CollateralEntity from '../entities/CollateralEntity';
|
|
5
|
+
import { ExtractedCollateral } from '../interfaces/extractedCollateral';
|
|
6
|
+
declare class CollateralAction {
|
|
7
|
+
private readonly dataSource;
|
|
8
|
+
readonly logger: AbstractLogger;
|
|
9
|
+
private readonly collateralRepository;
|
|
10
|
+
constructor(dataSource: DataSource, logger?: AbstractLogger);
|
|
11
|
+
/**
|
|
12
|
+
* saves (upserts) a collateral into the database
|
|
13
|
+
*
|
|
14
|
+
* @param {ExtractedCollateral} collateral
|
|
15
|
+
* @param {string} extractor
|
|
16
|
+
* @memberof CollateralAction
|
|
17
|
+
*/
|
|
18
|
+
saveCollateral: (collateral: Partial<ExtractedCollateral> & Pick<ExtractedCollateral, 'boxId'>, extractor: string) => Promise<{
|
|
19
|
+
extractor: string;
|
|
20
|
+
boxId: string;
|
|
21
|
+
boxSerialized: string | undefined;
|
|
22
|
+
wId: string | undefined;
|
|
23
|
+
rwtCount: bigint | undefined;
|
|
24
|
+
txId: string | undefined;
|
|
25
|
+
block: string | undefined;
|
|
26
|
+
height: number | undefined;
|
|
27
|
+
spendBlock: string | undefined;
|
|
28
|
+
spendHeight: number | undefined;
|
|
29
|
+
id?: number | undefined;
|
|
30
|
+
} & CollateralEntity>;
|
|
31
|
+
/**
|
|
32
|
+
* stores list of collaterals
|
|
33
|
+
*
|
|
34
|
+
* @param {Array<ExtractedCollateral>} collaterals
|
|
35
|
+
* @param {BlockEntity} block
|
|
36
|
+
* @param {string} extractor
|
|
37
|
+
* @return {Promise<boolean>}
|
|
38
|
+
* @memberof CollateralAction
|
|
39
|
+
*/
|
|
40
|
+
storeCollaterals: (collaterals: Array<ExtractedCollateral>, block: BlockEntity, extractor: string) => Promise<boolean>;
|
|
41
|
+
/**
|
|
42
|
+
* Update spendBlock and spendHeight of collaterals spent in the block
|
|
43
|
+
*
|
|
44
|
+
* @param {Array<string>} spentBoxIds
|
|
45
|
+
* @param {BlockEntity} block
|
|
46
|
+
* @param {string} extractor
|
|
47
|
+
* @return {Promise<void>}
|
|
48
|
+
* @memberof CollateralAction
|
|
49
|
+
*/
|
|
50
|
+
spendCollaterals: (spentBoxIds: Array<string>, block: BlockEntity, extractor: string) => Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Returns all stored unspent collateral box IDs
|
|
53
|
+
*
|
|
54
|
+
* @param {string} extractor
|
|
55
|
+
* @return {Promise<Array<string>>}
|
|
56
|
+
* @memberof CollateralAction
|
|
57
|
+
*/
|
|
58
|
+
getUnspentCollateralBoxIds: (extractor: string) => Promise<Array<string>>;
|
|
59
|
+
/**
|
|
60
|
+
* deletes the specified collateral box from database
|
|
61
|
+
*
|
|
62
|
+
* @param {string} boxId
|
|
63
|
+
* @param {string} extractor
|
|
64
|
+
* @return {Promise<DeleteResult>}
|
|
65
|
+
* @memberof CollateralAction
|
|
66
|
+
*/
|
|
67
|
+
deleteCollateral: (boxId: string, extractor: string) => Promise<DeleteResult>;
|
|
68
|
+
}
|
|
69
|
+
export default CollateralAction;
|
|
70
|
+
//# sourceMappingURL=collateralAction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collateralAction.d.ts","sourceRoot":"","sources":["../../lib/actions/collateralAction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,YAAY,EAA0B,MAAM,SAAS,CAAC;AAE3E,OAAO,gBAAgB,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAGxE,cAAM,gBAAgB;IAIlB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,QAAQ,CAAC,MAAM,EAAE,cAAc;IAJjC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA+B;gBAGjD,UAAU,EAAE,UAAU,EAC9B,MAAM,GAAE,cAAkC;IAKrD;;;;;;OAMG;IACH,cAAc,eACA,QAAQ,mBAAmB,CAAC,GACtC,KAAK,mBAAmB,EAAE,OAAO,CAAC,aACzB,MAAM;;;;;;;;;;;;0BA6BjB;IAEF;;;;;;;;OAQG;IACH,gBAAgB,gBACD,MAAM,mBAAmB,CAAC,SAChC,WAAW,aACP,MAAM,KAChB,QAAQ,OAAO,CAAC,CAmEjB;IAEF;;;;;;;;OAQG;IACH,gBAAgB,gBACD,MAAM,MAAM,CAAC,SACnB,WAAW,aACP,MAAM,KAChB,QAAQ,IAAI,CAAC,CAoBd;IAEF;;;;;;OAMG;IACH,0BAA0B,cACb,MAAM,KAChB,QAAQ,MAAM,MAAM,CAAC,CAAC,CAWvB;IAEF;;;;;;;OAOG;IACH,gBAAgB,UACP,MAAM,aACF,MAAM,KAChB,QAAQ,YAAY,CAAC,CAKtB;CACH;AAED,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { DummyLogger } from '@rosen-bridge/abstract-logger';
|
|
2
|
+
import { chunk } from 'lodash-es';
|
|
3
|
+
import { In, IsNull } from 'typeorm';
|
|
4
|
+
import { dbIdChunkSize } from '../constants';
|
|
5
|
+
import CollateralEntity from '../entities/CollateralEntity';
|
|
6
|
+
class CollateralAction {
|
|
7
|
+
dataSource;
|
|
8
|
+
logger;
|
|
9
|
+
collateralRepository;
|
|
10
|
+
constructor(dataSource, logger = new DummyLogger()) {
|
|
11
|
+
this.dataSource = dataSource;
|
|
12
|
+
this.logger = logger;
|
|
13
|
+
this.collateralRepository = this.dataSource.getRepository(CollateralEntity);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* saves (upserts) a collateral into the database
|
|
17
|
+
*
|
|
18
|
+
* @param {ExtractedCollateral} collateral
|
|
19
|
+
* @param {string} extractor
|
|
20
|
+
* @memberof CollateralAction
|
|
21
|
+
*/
|
|
22
|
+
saveCollateral = async (collateral, extractor) => {
|
|
23
|
+
const id = (await this.collateralRepository.findOne({
|
|
24
|
+
where: {
|
|
25
|
+
boxId: collateral.boxId,
|
|
26
|
+
extractor,
|
|
27
|
+
},
|
|
28
|
+
select: {
|
|
29
|
+
id: true,
|
|
30
|
+
},
|
|
31
|
+
}))?.id;
|
|
32
|
+
const collateralEntity = {
|
|
33
|
+
...(id != undefined && { id }),
|
|
34
|
+
extractor,
|
|
35
|
+
boxId: collateral.boxId,
|
|
36
|
+
boxSerialized: collateral.boxSerialized,
|
|
37
|
+
wId: collateral.wId,
|
|
38
|
+
rwtCount: collateral.rwtCount,
|
|
39
|
+
txId: collateral.txId,
|
|
40
|
+
block: collateral.block,
|
|
41
|
+
height: collateral.height,
|
|
42
|
+
spendBlock: collateral.spendBlock,
|
|
43
|
+
spendHeight: collateral.spendHeight,
|
|
44
|
+
};
|
|
45
|
+
return await this.collateralRepository.save(collateralEntity);
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* stores list of collaterals
|
|
49
|
+
*
|
|
50
|
+
* @param {Array<ExtractedCollateral>} collaterals
|
|
51
|
+
* @param {BlockEntity} block
|
|
52
|
+
* @param {string} extractor
|
|
53
|
+
* @return {Promise<boolean>}
|
|
54
|
+
* @memberof CollateralAction
|
|
55
|
+
*/
|
|
56
|
+
storeCollaterals = async (collaterals, block, extractor) => {
|
|
57
|
+
const collateralEntities = collaterals.map((col) => ({
|
|
58
|
+
extractor: extractor,
|
|
59
|
+
boxId: col.boxId,
|
|
60
|
+
boxSerialized: col.boxSerialized,
|
|
61
|
+
wId: col.wId,
|
|
62
|
+
rwtCount: col.rwtCount,
|
|
63
|
+
txId: col.txId,
|
|
64
|
+
block: block.hash,
|
|
65
|
+
height: col.height != undefined ? col.height : block.height,
|
|
66
|
+
}));
|
|
67
|
+
const queryRunner = this.dataSource.createQueryRunner();
|
|
68
|
+
await queryRunner.connect();
|
|
69
|
+
await queryRunner.startTransaction();
|
|
70
|
+
try {
|
|
71
|
+
const repository = await queryRunner.manager.getRepository(CollateralEntity);
|
|
72
|
+
const boxIdToId = new Map();
|
|
73
|
+
(await repository.find({
|
|
74
|
+
where: {
|
|
75
|
+
boxId: In(collateralEntities.map((box) => box.boxId)),
|
|
76
|
+
extractor: extractor,
|
|
77
|
+
},
|
|
78
|
+
select: {
|
|
79
|
+
id: true,
|
|
80
|
+
boxId: true,
|
|
81
|
+
},
|
|
82
|
+
})).forEach((col) => boxIdToId.set(col.boxId, col.id));
|
|
83
|
+
const collateralsToUpdate = collateralEntities
|
|
84
|
+
.filter((col) => boxIdToId.has(col.boxId))
|
|
85
|
+
.map((col) => ({ ...col, id: boxIdToId.get(col.boxId) }));
|
|
86
|
+
const collateralsToInsert = collateralEntities.filter((col) => !boxIdToId.has(col.boxId));
|
|
87
|
+
this.logger.info(`Saving boxes with following IDs into the database: [${collateralEntities
|
|
88
|
+
.map((col) => col.boxId)
|
|
89
|
+
.join(', ')}]`);
|
|
90
|
+
const savedCollaterals = await repository.save([
|
|
91
|
+
...collateralsToInsert,
|
|
92
|
+
...collateralsToUpdate,
|
|
93
|
+
]);
|
|
94
|
+
await queryRunner.commitTransaction();
|
|
95
|
+
this.logger.debug(`Saved boxes with following IDs into the database: [${savedCollaterals
|
|
96
|
+
.map((col) => col.boxId)
|
|
97
|
+
.join(', ')}]`);
|
|
98
|
+
}
|
|
99
|
+
catch (e) {
|
|
100
|
+
await queryRunner.rollbackTransaction();
|
|
101
|
+
this.logger.error(`An error occurred during storeCollaterals action: ${e}`);
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
finally {
|
|
105
|
+
await queryRunner.release();
|
|
106
|
+
}
|
|
107
|
+
return true;
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Update spendBlock and spendHeight of collaterals spent in the block
|
|
111
|
+
*
|
|
112
|
+
* @param {Array<string>} spentBoxIds
|
|
113
|
+
* @param {BlockEntity} block
|
|
114
|
+
* @param {string} extractor
|
|
115
|
+
* @return {Promise<void>}
|
|
116
|
+
* @memberof CollateralAction
|
|
117
|
+
*/
|
|
118
|
+
spendCollaterals = async (spentBoxIds, block, extractor) => {
|
|
119
|
+
const spentBoxIdChunks = chunk(spentBoxIds, dbIdChunkSize);
|
|
120
|
+
for (const spendIdChunk of spentBoxIdChunks) {
|
|
121
|
+
const updateResult = await this.collateralRepository.update({ boxId: In(spendIdChunk), extractor: extractor }, { spendBlock: block.hash, spendHeight: block.height });
|
|
122
|
+
if (updateResult.affected && updateResult.affected > 0) {
|
|
123
|
+
const updatedRows = await this.collateralRepository.findBy({
|
|
124
|
+
boxId: In(spendIdChunk),
|
|
125
|
+
spendBlock: block.hash,
|
|
126
|
+
});
|
|
127
|
+
for (const row of updatedRows) {
|
|
128
|
+
this.logger.debug(`Spent collateral with boxId [${row.boxId}] belonging to watcher with WID [${row.wId}] at height ${block.height}`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
/**
|
|
134
|
+
* Returns all stored unspent collateral box IDs
|
|
135
|
+
*
|
|
136
|
+
* @param {string} extractor
|
|
137
|
+
* @return {Promise<Array<string>>}
|
|
138
|
+
* @memberof CollateralAction
|
|
139
|
+
*/
|
|
140
|
+
getUnspentCollateralBoxIds = async (extractor) => {
|
|
141
|
+
const boxIds = await this.collateralRepository.find({
|
|
142
|
+
where: {
|
|
143
|
+
extractor: extractor,
|
|
144
|
+
spendBlock: IsNull(),
|
|
145
|
+
},
|
|
146
|
+
select: {
|
|
147
|
+
boxId: true,
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
return boxIds.map((box) => box.boxId);
|
|
151
|
+
};
|
|
152
|
+
/**
|
|
153
|
+
* deletes the specified collateral box from database
|
|
154
|
+
*
|
|
155
|
+
* @param {string} boxId
|
|
156
|
+
* @param {string} extractor
|
|
157
|
+
* @return {Promise<DeleteResult>}
|
|
158
|
+
* @memberof CollateralAction
|
|
159
|
+
*/
|
|
160
|
+
deleteCollateral = async (boxId, extractor) => {
|
|
161
|
+
return await this.collateralRepository.delete({
|
|
162
|
+
boxId: boxId,
|
|
163
|
+
extractor: extractor,
|
|
164
|
+
});
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
export default CollateralAction;
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGF0ZXJhbEFjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9hY3Rpb25zL2NvbGxhdGVyYWxBY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFrQixXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU1RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBNEIsRUFBRSxFQUFFLE1BQU0sRUFBYyxNQUFNLFNBQVMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sZ0JBQWdCLE1BQU0sOEJBQThCLENBQUM7QUFJNUQsTUFBTSxnQkFBZ0I7SUFJRDtJQUNSO0lBSk0sb0JBQW9CLENBQStCO0lBRXBFLFlBQ21CLFVBQXNCLEVBQzlCLFNBQXlCLElBQUksV0FBVyxFQUFFO1FBRGxDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDOUIsV0FBTSxHQUFOLE1BQU0sQ0FBb0M7UUFFbkQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGNBQWMsR0FBRyxLQUFLLEVBQ3BCLFVBQ29DLEVBQ3BDLFNBQWlCLEVBQ2pCLEVBQUU7UUFDRixNQUFNLEVBQUUsR0FBRyxDQUNULE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQztZQUN0QyxLQUFLLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLO2dCQUN2QixTQUFTO2FBQ1Y7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLElBQUk7YUFDVDtTQUNGLENBQUMsQ0FDSCxFQUFFLEVBQUUsQ0FBQztRQUVOLE1BQU0sZ0JBQWdCLEdBQUc7WUFDdkIsR0FBRyxDQUFDLEVBQUUsSUFBSSxTQUFTLElBQUks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LENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQyxDQUFDO0lBRUY7Ozs7Ozs7T0FPRztJQUNILGdCQUFnQixHQUFHLEtBQUssRUFDdEIsS0FBYSxFQUNiLFNBQWlCLEVBQ00sRUFBRTtRQUN6QixPQUFPLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQztZQUM1QyxLQUFLLEVBQUUsS0FBSztZQUNaLFNBQVMsRUFBRSxTQUFTO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztDQUNIO0FBRUQsZUFBZSxnQkFBZ0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0TG9nZ2VyLCBEdW1teUxvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcbmltcG9ydCB7IEJsb2NrRW50aXR5IH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyJztcbmltcG9ydCB7IGNodW5rIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IERhdGFTb3VyY2UsIERlbGV0ZVJlc3VsdCwgSW4sIElzTnVsbCwgUmVwb3NpdG9yeSB9IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0IHsgZGJJZENodW5rU2l6ZSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgQ29sbGF0ZXJhbEVudGl0eSBmcm9tICcuLi9lbnRpdGllcy9Db2xsYXRlcmFsRW50aXR5JztcbmltcG9ydCB7IEV4dHJhY3RlZENvbGxhdGVyYWwgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2V4dHJhY3RlZENvbGxhdGVyYWwnO1xuaW1wb3J0IHsgSnNvbkJJIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5jbGFzcyBDb2xsYXRlcmFsQWN0aW9uIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb2xsYXRlcmFsUmVwb3NpdG9yeTogUmVwb3NpdG9yeTxDb2xsYXRlcmFsRW50aXR5PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsXG4gICAgcmVhZG9ubHkgbG9nZ2VyOiBBYnN0cmFjdExvZ2dlciA9IG5ldyBEdW1teUxvZ2dlcigpXG4gICkge1xuICAgIHRoaXMuY29sbGF0ZXJhbFJlcG9zaXRvcnkgPSB0aGlzLmRhdGFTb3VyY2UuZ2V0UmVwb3NpdG9yeShDb2xsYXRlcmFsRW50aXR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzYXZlcyAodXBzZXJ0cykgYSBjb2xsYXRlcmFsIGludG8gdGhlIGRhdGFiYXNlXG4gICAqXG4gICAqIEBwYXJhbSB7RXh0cmFjdGVkQ29sbGF0ZXJhbH0gY29sbGF0ZXJhbFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0cmFjdG9yXG4gICAqIEBtZW1iZXJvZiBDb2xsYXRlcmFsQWN0aW9uXG4gICAqL1xuICBzYXZlQ29sbGF0ZXJhbCA9IGFzeW5jIChcbiAgICBjb2xsYXRlcmFsOiBQYXJ0aWFsPEV4dHJhY3RlZENvbGxhdGVyYWw+ICZcbiAgICAgIFBpY2s8RXh0cmFjdGVkQ29sbGF0ZXJhbCwgJ2JveElkJz4sXG4gICAgZXh0cmFjdG9yOiBzdHJpbmdcbiAgKSA9PiB7XG4gICAgY29uc3QgaWQgPSAoXG4gICAgICBhd2FpdCB0aGlzLmNvbGxhdGVyYWxSZXBvc2l0b3J5LmZpbmRPbmUoe1xuICAgICAgICB3aGVyZToge1xuICAgICAgICAgIGJveElkOiBjb2xsYXRlcmFsLmJveElkLFxuICAgICAgICAgIGV4dHJhY3RvcixcbiAgICAgICAgfSxcbiAgICAgICAgc2VsZWN0OiB7XG4gICAgICAgICAgaWQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICk/LmlkO1xuXG4gICAgY29uc3QgY29sbGF0ZXJhbEVudGl0eSA9IHtcbiAgICAgIC4uLihpZCAhPSB1bmRlZmluZWQgJiYgeyBpZCB9KSxcbiAgICAgIGV4dHJhY3RvcixcbiAgICAgIGJveElkOiBjb2xsYXRlcmFsLmJveElkLFxuICAgICAgYm94U2VyaWFsaXplZDogY29sbGF0ZXJhbC5ib3hTZXJpYWxpemVkLFxuICAgICAgd0lkOiBjb2xsYXRlcmFsLndJZCxcbiAgICAgIHJ3dENvdW50OiBjb2xsYXRlcmFsLnJ3dENvdW50LFxuICAgICAgdHhJZDogY29sbGF0ZXJhbC50eElkLFxuICAgICAgYmxvY2s6IGNvbGxhdGVyYWwuYmxvY2ssXG4gICAgICBoZWlnaHQ6IGNvbGxhdGVyYWwuaGVpZ2h0LFxuICAgICAgc3BlbmRCbG9jazogY29sbGF0ZXJhbC5zcGVuZEJsb2NrLFxuICAgICAgc3BlbmRIZWlnaHQ6IGNvbGxhdGVyYWwuc3BlbmRIZWlnaHQsXG4gICAgfTtcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbGxhdGVyYWxSZXBvc2l0b3J5LnNhdmUoY29sbGF0ZXJhbEVudGl0eSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHN0b3JlcyBsaXN0IG9mIGNvbGxhdGVyYWxzXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8RXh0cmFjdGVkQ29sbGF0ZXJhbD59IGNvbGxhdGVyYWxzXG4gICAqIEBwYXJhbSB7QmxvY2tFbnRpdHl9IGJsb2NrXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHRyYWN0b3JcbiAgICogQHJldHVybiB7UHJvbWlzZTxib29sZWFuPn1cbiAgICogQG1lbWJlcm9mIENvbGxhdGVyYWxBY3Rpb25cbiAgICovXG4gIHN0b3JlQ29sbGF0ZXJhbHMgPSBhc3luYyAoXG4gICAgY29sbGF0ZXJhbHM6IEFycmF5PEV4dHJhY3RlZENvbGxhdGVyYWw+LFxuICAgIGJsb2NrOiBCbG9ja0VudGl0eSxcbiAgICBleHRyYWN0b3I6IHN0cmluZ1xuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCBjb2xsYXRlcmFsRW50aXRpZXMgPSBjb2xsYXRlcmFscy5tYXAoKGNvbCkgPT4gKHtcbiAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgICAgYm94SWQ6IGNvbC5ib3hJZCxcbiAgICAgIGJveFNlcmlhbGl6ZWQ6IGNvbC5ib3hTZXJpYWxpemVkLFxuICAgICAgd0lkOiBjb2wud0lkLFxuICAgICAgcnd0Q291bnQ6IGNvbC5yd3RDb3VudCxcbiAgICAgIHR4SWQ6IGNvbC50eElkLFxuICAgICAgYmxvY2s6IGJsb2NrLmhhc2gsXG4gICAgICBoZWlnaHQ6IGNvbC5oZWlnaHQgIT0gdW5kZWZpbmVkID8gY29sLmhlaWdodCA6IGJsb2NrLmhlaWdodCxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBxdWVyeVJ1bm5lciA9IHRoaXMuZGF0YVNvdXJjZS5jcmVhdGVRdWVyeVJ1bm5lcigpO1xuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbm5lY3QoKTtcbiAgICBhd2FpdCBxdWVyeVJ1bm5lci5zdGFydFRyYW5zYWN0aW9uKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcG9zaXRvcnkgPSBhd2FpdCBxdWVyeVJ1bm5lci5tYW5hZ2VyLmdldFJlcG9zaXRvcnkoXG4gICAgICAgIENvbGxhdGVyYWxFbnRpdHlcbiAgICAgICk7XG4gICAgICBjb25zdCBib3hJZFRvSWQgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAgICAgKFxuICAgICAgICBhd2FpdCByZXBvc2l0b3J5LmZpbmQoe1xuICAgICAgICAgIHdoZXJlOiB7XG4gICAgICAgICAgICBib3hJZDogSW4oY29sbGF0ZXJhbEVudGl0aWVzLm1hcCgoYm94KSA9PiBib3guYm94SWQpKSxcbiAgICAgICAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2VsZWN0OiB7XG4gICAgICAgICAgICBpZDogdHJ1ZSxcbiAgICAgICAgICAgIGJveElkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApLmZvckVhY2goKGNvbCkgPT4gYm94SWRUb0lkLnNldChjb2wuYm94SWQsIGNvbC5pZCkpO1xuXG4gICAgICBjb25zdCBjb2xsYXRlcmFsc1RvVXBkYXRlID0gY29sbGF0ZXJhbEVudGl0aWVzXG4gICAgICAgIC5maWx0ZXIoKGNvbCkgPT4gYm94SWRUb0lkLmhhcyhjb2wuYm94SWQpKVxuICAgICAgICAubWFwKChjb2wpID0+ICh7IC4uLmNvbCwgaWQ6IGJveElkVG9JZC5nZXQoY29sLmJveElkKSB9KSk7XG5cbiAgICAgIGNvbnN0IGNvbGxhdGVyYWxzVG9JbnNlcnQgPSBjb2xsYXRlcmFsRW50aXRpZXMuZmlsdGVyKFxuICAgICAgICAoY29sKSA9PiAhYm94SWRUb0lkLmhhcyhjb2wuYm94SWQpXG4gICAgICApO1xuXG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICBgU2F2aW5nIGJveGVzIHdpdGggZm9sbG93aW5nIElEcyBpbnRvIHRoZSBkYXRhYmFzZTogWyR7Y29sbGF0ZXJhbEVudGl0aWVzXG4gICAgICAgICAgLm1hcCgoY29sKSA9PiBjb2wuYm94SWQpXG4gICAgICAgICAgLmpvaW4oJywgJyl9XWBcbiAgICAgICk7XG4gICAgICBjb25zdCBzYXZlZENvbGxhdGVyYWxzID0gYXdhaXQgcmVwb3NpdG9yeS5zYXZlKFtcbiAgICAgICAgLi4uY29sbGF0ZXJhbHNUb0luc2VydCxcbiAgICAgICAgLi4uY29sbGF0ZXJhbHNUb1VwZGF0ZSxcbiAgICAgIF0pO1xuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuY29tbWl0VHJhbnNhY3Rpb24oKTtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgU2F2ZWQgYm94ZXMgd2l0aCBmb2xsb3dpbmcgSURzIGludG8gdGhlIGRhdGFiYXNlOiBbJHtzYXZlZENvbGxhdGVyYWxzXG4gICAgICAgICAgLm1hcCgoY29sKSA9PiBjb2wuYm94SWQpXG4gICAgICAgICAgLmpvaW4oJywgJyl9XWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpO1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgIGBBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgc3RvcmVDb2xsYXRlcmFscyBhY3Rpb246ICR7ZX1gXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yZWxlYXNlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBzcGVuZEJsb2NrIGFuZCBzcGVuZEhlaWdodCBvZiBjb2xsYXRlcmFscyBzcGVudCBpbiB0aGUgYmxvY2tcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBzcGVudEJveElkc1xuICAgKiBAcGFyYW0ge0Jsb2NrRW50aXR5fSBibG9ja1xuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0cmFjdG9yXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqIEBtZW1iZXJvZiBDb2xsYXRlcmFsQWN0aW9uXG4gICAqL1xuICBzcGVuZENvbGxhdGVyYWxzID0gYXN5bmMgKFxuICAgIHNwZW50Qm94SWRzOiBBcnJheTxzdHJpbmc+LFxuICAgIGJsb2NrOiBCbG9ja0VudGl0eSxcbiAgICBleHRyYWN0b3I6IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBzcGVudEJveElkQ2h1bmtzID0gY2h1bmsoc3BlbnRCb3hJZHMsIGRiSWRDaHVua1NpemUpO1xuICAgIGZvciAoY29uc3Qgc3BlbmRJZENodW5rIG9mIHNwZW50Qm94SWRDaHVua3MpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZVJlc3VsdCA9IGF3YWl0IHRoaXMuY29sbGF0ZXJhbFJlcG9zaXRvcnkudXBkYXRlKFxuICAgICAgICB7IGJveElkOiBJbihzcGVuZElkQ2h1bmspLCBleHRyYWN0b3I6IGV4dHJhY3RvciB9LFxuICAgICAgICB7IHNwZW5kQmxvY2s6IGJsb2NrLmhhc2gsIHNwZW5kSGVpZ2h0OiBibG9jay5oZWlnaHQgfVxuICAgICAgKTtcblxuICAgICAgaWYgKHVwZGF0ZVJlc3VsdC5hZmZlY3RlZCAmJiB1cGRhdGVSZXN1bHQuYWZmZWN0ZWQgPiAwKSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRSb3dzID0gYXdhaXQgdGhpcy5jb2xsYXRlcmFsUmVwb3NpdG9yeS5maW5kQnkoe1xuICAgICAgICAgIGJveElkOiBJbihzcGVuZElkQ2h1bmspLFxuICAgICAgICAgIHNwZW5kQmxvY2s6IGJsb2NrLmhhc2gsXG4gICAgICAgIH0pO1xuICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiB1cGRhdGVkUm93cykge1xuICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFNwZW50IGNvbGxhdGVyYWwgd2l0aCBib3hJZCBbJHtyb3cuYm94SWR9XSBiZWxvbmdpbmcgdG8gd2F0Y2hlciB3aXRoIFdJRCBbJHtyb3cud0lkfV0gYXQgaGVpZ2h0ICR7YmxvY2suaGVpZ2h0fWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFsbCBzdG9yZWQgdW5zcGVudCBjb2xsYXRlcmFsIGJveCBJRHNcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dHJhY3RvclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5PHN0cmluZz4+fVxuICAgKiBAbWVtYmVyb2YgQ29sbGF0ZXJhbEFjdGlvblxuICAgKi9cbiAgZ2V0VW5zcGVudENvbGxhdGVyYWxCb3hJZHMgPSBhc3luYyAoXG4gICAgZXh0cmFjdG9yOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiA9PiB7XG4gICAgY29uc3QgYm94SWRzID0gYXdhaXQgdGhpcy5jb2xsYXRlcmFsUmVwb3NpdG9yeS5maW5kKHtcbiAgICAgIHdoZXJlOiB7XG4gICAgICAgIGV4dHJhY3RvcjogZXh0cmFjdG9yLFxuICAgICAgICBzcGVuZEJsb2NrOiBJc051bGwoKSxcbiAgICAgIH0sXG4gICAgICBzZWxlY3Q6IHtcbiAgICAgICAgYm94SWQ6IHRydWUsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBib3hJZHMubWFwKChib3gpID0+IGJveC5ib3hJZCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIGRlbGV0ZXMgdGhlIHNwZWNpZmllZCBjb2xsYXRlcmFsIGJveCBmcm9tIGRhdGFiYXNlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBib3hJZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0cmFjdG9yXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RGVsZXRlUmVzdWx0Pn1cbiAgICogQG1lbWJlcm9mIENvbGxhdGVyYWxBY3Rpb25cbiAgICovXG4gIGRlbGV0ZUNvbGxhdGVyYWwgPSBhc3luYyAoXG4gICAgYm94SWQ6IHN0cmluZyxcbiAgICBleHRyYWN0b3I6IHN0cmluZ1xuICApOiBQcm9taXNlPERlbGV0ZVJlc3VsdD4gPT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbGxhdGVyYWxSZXBvc2l0b3J5LmRlbGV0ZSh7XG4gICAgICBib3hJZDogYm94SWQsXG4gICAgICBleHRyYWN0b3I6IGV4dHJhY3RvcixcbiAgICB9KTtcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29sbGF0ZXJhbEFjdGlvbjtcbiJdfQ==
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
declare class CollateralEntity {
|
|
2
|
+
id: number;
|
|
3
|
+
extractor: string;
|
|
4
|
+
boxId: string;
|
|
5
|
+
boxSerialized: string;
|
|
6
|
+
wId: string;
|
|
7
|
+
rwtCount: bigint;
|
|
8
|
+
txId: string;
|
|
9
|
+
block?: string;
|
|
10
|
+
height?: number;
|
|
11
|
+
spendBlock?: string;
|
|
12
|
+
spendHeight?: number;
|
|
13
|
+
}
|
|
14
|
+
export default CollateralEntity;
|
|
15
|
+
//# sourceMappingURL=CollateralEntity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CollateralEntity.d.ts","sourceRoot":"","sources":["../../lib/entities/CollateralEntity.ts"],"names":[],"mappings":"AAGA,cAEM,gBAAgB;IAEpB,EAAE,EAAE,MAAM,CAAC;IAGX,SAAS,EAAE,MAAM,CAAC;IAGlB,KAAK,EAAE,MAAM,CAAC;IAGd,aAAa,EAAE,MAAM,CAAC;IAGtB,GAAG,EAAE,MAAM,CAAC;IAGZ,QAAQ,EAAE,MAAM,CAAC;IAGjB,IAAI,EAAE,MAAM,CAAC;IAGb,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
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, Unique } from 'typeorm';
|
|
11
|
+
import { bigintTransformer } from '../transformers';
|
|
12
|
+
let CollateralEntity = class CollateralEntity {
|
|
13
|
+
id;
|
|
14
|
+
extractor;
|
|
15
|
+
boxId;
|
|
16
|
+
boxSerialized;
|
|
17
|
+
wId;
|
|
18
|
+
rwtCount;
|
|
19
|
+
txId;
|
|
20
|
+
block;
|
|
21
|
+
height;
|
|
22
|
+
spendBlock;
|
|
23
|
+
spendHeight;
|
|
24
|
+
};
|
|
25
|
+
__decorate([
|
|
26
|
+
PrimaryGeneratedColumn(),
|
|
27
|
+
__metadata("design:type", Number)
|
|
28
|
+
], CollateralEntity.prototype, "id", void 0);
|
|
29
|
+
__decorate([
|
|
30
|
+
Column(),
|
|
31
|
+
__metadata("design:type", String)
|
|
32
|
+
], CollateralEntity.prototype, "extractor", void 0);
|
|
33
|
+
__decorate([
|
|
34
|
+
Column(),
|
|
35
|
+
__metadata("design:type", String)
|
|
36
|
+
], CollateralEntity.prototype, "boxId", void 0);
|
|
37
|
+
__decorate([
|
|
38
|
+
Column(),
|
|
39
|
+
__metadata("design:type", String)
|
|
40
|
+
], CollateralEntity.prototype, "boxSerialized", void 0);
|
|
41
|
+
__decorate([
|
|
42
|
+
Column(),
|
|
43
|
+
__metadata("design:type", String)
|
|
44
|
+
], CollateralEntity.prototype, "wId", void 0);
|
|
45
|
+
__decorate([
|
|
46
|
+
Column({ type: 'bigint', transformer: bigintTransformer }),
|
|
47
|
+
__metadata("design:type", BigInt)
|
|
48
|
+
], CollateralEntity.prototype, "rwtCount", void 0);
|
|
49
|
+
__decorate([
|
|
50
|
+
Column(),
|
|
51
|
+
__metadata("design:type", String)
|
|
52
|
+
], CollateralEntity.prototype, "txId", void 0);
|
|
53
|
+
__decorate([
|
|
54
|
+
Column({ nullable: true }),
|
|
55
|
+
__metadata("design:type", String)
|
|
56
|
+
], CollateralEntity.prototype, "block", void 0);
|
|
57
|
+
__decorate([
|
|
58
|
+
Column({ nullable: true }),
|
|
59
|
+
__metadata("design:type", Number)
|
|
60
|
+
], CollateralEntity.prototype, "height", void 0);
|
|
61
|
+
__decorate([
|
|
62
|
+
Column({ nullable: true, type: 'text' }),
|
|
63
|
+
__metadata("design:type", String)
|
|
64
|
+
], CollateralEntity.prototype, "spendBlock", void 0);
|
|
65
|
+
__decorate([
|
|
66
|
+
Column({ nullable: true }),
|
|
67
|
+
__metadata("design:type", Number)
|
|
68
|
+
], CollateralEntity.prototype, "spendHeight", void 0);
|
|
69
|
+
CollateralEntity = __decorate([
|
|
70
|
+
Entity('collateral_entity'),
|
|
71
|
+
Unique(['boxId', 'extractor'])
|
|
72
|
+
], CollateralEntity);
|
|
73
|
+
export default CollateralEntity;
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sbGF0ZXJhbEVudGl0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9lbnRpdGllcy9Db2xsYXRlcmFsRW50aXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUlwRCxJQUFNLGdCQUFnQixHQUF0QixNQUFNLGdCQUFnQjtJQUVwQixFQUFFLENBQVM7SUFHWCxTQUFTLENBQVM7SUFHbEIsS0FBSyxDQUFTO0lBR2QsYUFBYSxDQUFTO0lBR3RCLEdBQUcsQ0FBUztJQUdaLFFBQVEsQ0FBUztJQUdqQixJQUFJLENBQVM7SUFHYixLQUFLLENBQVU7SUFHZixNQUFNLENBQVU7SUFHaEIsVUFBVSxDQUFVO0lBR3BCLFdBQVcsQ0FBVTtDQUN0QixDQUFBO0FBaENDO0lBQUMsc0JBQXNCLEVBQUU7OzRDQUNkO0FBRVg7SUFBQyxNQUFNLEVBQUU7O21EQUNTO0FBRWxCO0lBQUMsTUFBTSxFQUFFOzsrQ0FDSztBQUVkO0lBQUMsTUFBTSxFQUFFOzt1REFDYTtBQUV0QjtJQUFDLE1BQU0sRUFBRTs7NkNBQ0c7QUFFWjtJQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLENBQUM7O2tEQUMxQztBQUVqQjtJQUFDLE1BQU0sRUFBRTs7OENBQ0k7QUFFYjtJQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7K0NBQ1o7QUFFZjtJQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7Z0RBQ1g7QUFFaEI7SUFBQyxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7b0RBQ3JCO0FBRXBCO0lBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDOztxREFDTjtBQWhDakIsZ0JBQWdCO0lBRnJCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztJQUMzQixNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7R0FDekIsZ0JBQWdCLENBaUNyQjtBQUVELGVBQWUsZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb2x1bW4sIEVudGl0eSwgUHJpbWFyeUdlbmVyYXRlZENvbHVtbiwgVW5pcXVlIH0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBiaWdpbnRUcmFuc2Zvcm1lciB9IGZyb20gJy4uL3RyYW5zZm9ybWVycyc7XG5cbkBFbnRpdHkoJ2NvbGxhdGVyYWxfZW50aXR5JylcbkBVbmlxdWUoWydib3hJZCcsICdleHRyYWN0b3InXSlcbmNsYXNzIENvbGxhdGVyYWxFbnRpdHkge1xuICBAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG4gIGlkOiBudW1iZXI7XG5cbiAgQENvbHVtbigpXG4gIGV4dHJhY3Rvcjogc3RyaW5nO1xuXG4gIEBDb2x1bW4oKVxuICBib3hJZDogc3RyaW5nO1xuXG4gIEBDb2x1bW4oKVxuICBib3hTZXJpYWxpemVkOiBzdHJpbmc7XG5cbiAgQENvbHVtbigpXG4gIHdJZDogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyB0eXBlOiAnYmlnaW50JywgdHJhbnNmb3JtZXI6IGJpZ2ludFRyYW5zZm9ybWVyIH0pXG4gIHJ3dENvdW50OiBiaWdpbnQ7XG5cbiAgQENvbHVtbigpXG4gIHR4SWQ6IHN0cmluZztcblxuICBAQ29sdW1uKHsgbnVsbGFibGU6IHRydWUgfSlcbiAgYmxvY2s/OiBzdHJpbmc7XG5cbiAgQENvbHVtbih7IG51bGxhYmxlOiB0cnVlIH0pXG4gIGhlaWdodD86IG51bWJlcjtcblxuICBAQ29sdW1uKHsgbnVsbGFibGU6IHRydWUsIHR5cGU6ICd0ZXh0JyB9KVxuICBzcGVuZEJsb2NrPzogc3RyaW5nO1xuXG4gIEBDb2x1bW4oeyBudWxsYWJsZTogdHJ1ZSB9KVxuICBzcGVuZEhlaWdodD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29sbGF0ZXJhbEVudGl0eTtcbiJdfQ==
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { AbstractLogger } from '@rosen-bridge/abstract-logger';
|
|
2
|
+
import { AbstractExtractor, BlockEntity, Transaction } from '@rosen-bridge/scanner';
|
|
3
|
+
import { DataSource } from 'typeorm';
|
|
4
|
+
import CollateralAction from '../actions/collateralAction';
|
|
5
|
+
export declare class CollateralExtractor extends AbstractExtractor<Transaction> {
|
|
6
|
+
private readonly id;
|
|
7
|
+
private readonly awcNft;
|
|
8
|
+
private readonly address;
|
|
9
|
+
private readonly dataSource;
|
|
10
|
+
private readonly logger;
|
|
11
|
+
private readonly ergoTree;
|
|
12
|
+
readonly action: CollateralAction;
|
|
13
|
+
private explorerApi;
|
|
14
|
+
constructor(id: string, awcNft: string, address: string, dataSource: DataSource, explorerUrl: string, logger?: AbstractLogger);
|
|
15
|
+
/**
|
|
16
|
+
* get id for extractor. This id must be unique over all extractors.
|
|
17
|
+
*
|
|
18
|
+
* @return {string}
|
|
19
|
+
*/
|
|
20
|
+
getId: () => string;
|
|
21
|
+
/**
|
|
22
|
+
* process a list of transactions and store collateral box details
|
|
23
|
+
*
|
|
24
|
+
* @param {Transaction[]} txs list of transaction for block
|
|
25
|
+
* @param {BlockEntity} block block id for transactions as hex encoded
|
|
26
|
+
* @return {Promise<boolean>} Promise<boolean> if no error occurred return
|
|
27
|
+
* true. otherwise, return false
|
|
28
|
+
*/
|
|
29
|
+
processTransactions: (txs: Transaction[], block: BlockEntity) => Promise<boolean>;
|
|
30
|
+
private isCollateralBox;
|
|
31
|
+
forkBlock: (hash: string) => Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
* Initializes the database with older collaterals
|
|
34
|
+
*
|
|
35
|
+
* @param {number} initialHeight
|
|
36
|
+
* @return {Promise<void>}
|
|
37
|
+
* @memberof CollateralExtractor
|
|
38
|
+
*/
|
|
39
|
+
initializeBoxes: (initialHeight: number) => Promise<void>;
|
|
40
|
+
/**
|
|
41
|
+
* removes or updates stored collateral boxes before initializing boxes
|
|
42
|
+
*
|
|
43
|
+
* @private
|
|
44
|
+
* @param {number} initialHeight
|
|
45
|
+
* @param {string[]} collateralBoxIds
|
|
46
|
+
* @return {Promise<void>}
|
|
47
|
+
* @memberof CollateralExtractor
|
|
48
|
+
*/
|
|
49
|
+
private tidyUpStoredCollaterals;
|
|
50
|
+
/**
|
|
51
|
+
* gets all unspent collaterals from Ergo explorer api
|
|
52
|
+
*
|
|
53
|
+
* @private
|
|
54
|
+
* @param {number} initialHeight
|
|
55
|
+
* @return {Promise<Array<ExtractedCollateral>>}
|
|
56
|
+
* @memberof CollateralExtractor
|
|
57
|
+
*/
|
|
58
|
+
private getAllUnspentCollaterals;
|
|
59
|
+
/**
|
|
60
|
+
* converts output box information to an ExtractedCollateral object
|
|
61
|
+
*
|
|
62
|
+
* @private
|
|
63
|
+
* @param {(OutputInfo | OutputBox)} box
|
|
64
|
+
* @return {ExtractedCollateral}
|
|
65
|
+
* @memberof CollateralExtractor
|
|
66
|
+
*/
|
|
67
|
+
private toExtractedCollateral;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=collateralExtractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collateralExtractor.d.ts","sourceRoot":"","sources":["../../lib/extractor/collateralExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EACL,iBAAiB,EACjB,WAAW,EAEX,WAAW,EACZ,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,gBAAgB,MAAM,6BAA6B,CAAC;AAK3D,qBAAa,mBAAoB,SAAQ,iBAAiB,CAAC,WAAW,CAAC;IAMnE,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAE3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAVzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,OAAO,CAAC,WAAW,CAAC;gBAGD,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,UAAU,EACvC,WAAW,EAAE,MAAM,EACF,MAAM,GAAE,cAAkC;IAU7D;;;;OAIG;IACH,KAAK,QAAO,MAAM,CAAY;IAE9B;;;;;;;OAOG;IACH,mBAAmB,QACZ,WAAW,EAAE,SACX,WAAW,KACjB,QAAQ,OAAO,CAAC,CAyBjB;IAEF,OAAO,CAAC,eAAe;IASvB,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3C;;;;;;OAMG;IACH,eAAe,kBAAyB,MAAM,KAAG,QAAQ,IAAI,CAAC,CA+B5D;IAEF;;;;;;;;OAQG;YACW,uBAAuB;IA6CrC;;;;;;;OAOG;IACH,OAAO,CAAC,wBAAwB,CA8B9B;IAEF;;;;;;;OAOG;IACH,OAAO,CAAC,qBAAqB,CAwD3B;CACH"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { DummyLogger } from '@rosen-bridge/abstract-logger';
|
|
2
|
+
import { AbstractExtractor, } from '@rosen-bridge/scanner';
|
|
3
|
+
import ergoExplorerClientFactory from '@rosen-clients/ergo-explorer';
|
|
4
|
+
import * as ergoLib from 'ergo-lib-wasm-nodejs';
|
|
5
|
+
import CollateralAction from '../actions/collateralAction';
|
|
6
|
+
import { DefaultApiLimit } from '../constants';
|
|
7
|
+
import { JsonBI, uint8ArrayToHex } from '../utils';
|
|
8
|
+
export class CollateralExtractor extends AbstractExtractor {
|
|
9
|
+
id;
|
|
10
|
+
awcNft;
|
|
11
|
+
address;
|
|
12
|
+
dataSource;
|
|
13
|
+
logger;
|
|
14
|
+
ergoTree;
|
|
15
|
+
action;
|
|
16
|
+
explorerApi;
|
|
17
|
+
constructor(id, awcNft, address, dataSource, explorerUrl, logger = new DummyLogger()) {
|
|
18
|
+
super();
|
|
19
|
+
this.id = id;
|
|
20
|
+
this.awcNft = awcNft;
|
|
21
|
+
this.address = address;
|
|
22
|
+
this.dataSource = dataSource;
|
|
23
|
+
this.logger = logger;
|
|
24
|
+
this.ergoTree = ergoLib.Address.from_base58(this.address)
|
|
25
|
+
.to_ergo_tree()
|
|
26
|
+
.to_base16_bytes();
|
|
27
|
+
this.action = new CollateralAction(this.dataSource, this.logger);
|
|
28
|
+
this.explorerApi = ergoExplorerClientFactory(explorerUrl);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* get id for extractor. This id must be unique over all extractors.
|
|
32
|
+
*
|
|
33
|
+
* @return {string}
|
|
34
|
+
*/
|
|
35
|
+
getId = () => this.id;
|
|
36
|
+
/**
|
|
37
|
+
* process a list of transactions and store collateral box details
|
|
38
|
+
*
|
|
39
|
+
* @param {Transaction[]} txs list of transaction for block
|
|
40
|
+
* @param {BlockEntity} block block id for transactions as hex encoded
|
|
41
|
+
* @return {Promise<boolean>} Promise<boolean> if no error occurred return
|
|
42
|
+
* true. otherwise, return false
|
|
43
|
+
*/
|
|
44
|
+
processTransactions = async (txs, block) => {
|
|
45
|
+
const boxes = [];
|
|
46
|
+
const spendBoxIds = [];
|
|
47
|
+
for (const tx of txs) {
|
|
48
|
+
for (const outputBox of tx.outputs) {
|
|
49
|
+
if (!this.isCollateralBox(outputBox)) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
boxes.push(this.toExtractedCollateral(outputBox));
|
|
53
|
+
}
|
|
54
|
+
spendBoxIds.push(...tx.inputs.map((box) => box.boxId));
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
await this.action.storeCollaterals(boxes, block, this.getId());
|
|
58
|
+
await this.action.spendCollaterals(spendBoxIds, block, this.getId());
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
this.logger.error(`Error in storing collaterals of the block ${block}: ${e}`);
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
return true;
|
|
65
|
+
};
|
|
66
|
+
isCollateralBox(outputBox) {
|
|
67
|
+
const awcNft = outputBox.assets?.at(0)?.tokenId;
|
|
68
|
+
return (awcNft != undefined &&
|
|
69
|
+
awcNft === this.awcNft &&
|
|
70
|
+
outputBox.ergoTree === this.ergoTree);
|
|
71
|
+
}
|
|
72
|
+
forkBlock;
|
|
73
|
+
/**
|
|
74
|
+
* Initializes the database with older collaterals
|
|
75
|
+
*
|
|
76
|
+
* @param {number} initialHeight
|
|
77
|
+
* @return {Promise<void>}
|
|
78
|
+
* @memberof CollateralExtractor
|
|
79
|
+
*/
|
|
80
|
+
initializeBoxes = async (initialHeight) => {
|
|
81
|
+
const unspentCollaterals = await this.getAllUnspentCollaterals(initialHeight);
|
|
82
|
+
this.logger.debug(`unspent collateral box info with following IDs gotten form Ergo network: [${unspentCollaterals
|
|
83
|
+
.map((box) => box.boxId)
|
|
84
|
+
.join(', ')}]`);
|
|
85
|
+
const storedUnspentCollateralBoxIds = await this.action.getUnspentCollateralBoxIds(this.getId());
|
|
86
|
+
const unspentCollateralBoxIds = new Set(unspentCollaterals.map((box) => box.boxId));
|
|
87
|
+
await this.tidyUpStoredCollaterals(initialHeight, storedUnspentCollateralBoxIds.filter((boxId) => !unspentCollateralBoxIds.has(boxId)));
|
|
88
|
+
for (const collateral of unspentCollaterals) {
|
|
89
|
+
this.logger.debug(`saving unspent collateral with boxId=[${collateral.boxId}] to database for initialization`);
|
|
90
|
+
await this.action.saveCollateral(collateral, this.getId());
|
|
91
|
+
this.logger.debug(`saved unspent collateral with boxId=[${collateral.boxId}] to database for initialization`);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* removes or updates stored collateral boxes before initializing boxes
|
|
96
|
+
*
|
|
97
|
+
* @private
|
|
98
|
+
* @param {number} initialHeight
|
|
99
|
+
* @param {string[]} collateralBoxIds
|
|
100
|
+
* @return {Promise<void>}
|
|
101
|
+
* @memberof CollateralExtractor
|
|
102
|
+
*/
|
|
103
|
+
async tidyUpStoredCollaterals(initialHeight, collateralBoxIds) {
|
|
104
|
+
for (const boxId of collateralBoxIds) {
|
|
105
|
+
let boxInfo;
|
|
106
|
+
try {
|
|
107
|
+
boxInfo = await this.explorerApi.v1.getApiV1BoxesP1(boxId);
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
if (e?.response?.status === 404) {
|
|
111
|
+
this.action.deleteCollateral(boxId, this.getId());
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
throw new Error(`something went wrong when trying to get box=[${boxId}] from Ergo network: ${e?.message}`);
|
|
115
|
+
}
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (boxInfo?.spentTransactionId != null) {
|
|
119
|
+
try {
|
|
120
|
+
const transactionInfo = await this.explorerApi.v1.getApiV1TransactionsP1(boxInfo.spentTransactionId);
|
|
121
|
+
if (transactionInfo.inclusionHeight < initialHeight) {
|
|
122
|
+
this.action.saveCollateral({
|
|
123
|
+
boxId: boxId,
|
|
124
|
+
spendHeight: transactionInfo.inclusionHeight,
|
|
125
|
+
spendBlock: transactionInfo.blockId,
|
|
126
|
+
}, this.getId());
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch (e) {
|
|
130
|
+
throw new Error(`something went wrong when trying to get transaction=[${boxInfo.spentTransactionId}] from Ergo network: ${e?.message}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* gets all unspent collaterals from Ergo explorer api
|
|
137
|
+
*
|
|
138
|
+
* @private
|
|
139
|
+
* @param {number} initialHeight
|
|
140
|
+
* @return {Promise<Array<ExtractedCollateral>>}
|
|
141
|
+
* @memberof CollateralExtractor
|
|
142
|
+
*/
|
|
143
|
+
getAllUnspentCollaterals = async (initialHeight) => {
|
|
144
|
+
const extractedBoxes = [];
|
|
145
|
+
let offset = 0;
|
|
146
|
+
let total = 1;
|
|
147
|
+
while (offset < total) {
|
|
148
|
+
const boxes = await this.explorerApi.v1.getApiV1BoxesUnspentByergotreeP1(this.ergoTree, { offset: offset, limit: DefaultApiLimit });
|
|
149
|
+
if (!boxes.items) {
|
|
150
|
+
throw new Error('Explorer api output items should not be undefined.');
|
|
151
|
+
}
|
|
152
|
+
extractedBoxes.push(...boxes.items
|
|
153
|
+
.filter((box) => box.creationHeight &&
|
|
154
|
+
box.creationHeight < initialHeight &&
|
|
155
|
+
this.isCollateralBox(box))
|
|
156
|
+
.map((box) => this.toExtractedCollateral(box)));
|
|
157
|
+
total = boxes.total;
|
|
158
|
+
offset += DefaultApiLimit;
|
|
159
|
+
}
|
|
160
|
+
return extractedBoxes;
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* converts output box information to an ExtractedCollateral object
|
|
164
|
+
*
|
|
165
|
+
* @private
|
|
166
|
+
* @param {(OutputInfo | OutputBox)} box
|
|
167
|
+
* @return {ExtractedCollateral}
|
|
168
|
+
* @memberof CollateralExtractor
|
|
169
|
+
*/
|
|
170
|
+
toExtractedCollateral = (box) => {
|
|
171
|
+
const ergoOutputBox = ergoLib.ErgoBox.from_json(JsonBI.stringify(box));
|
|
172
|
+
let r4;
|
|
173
|
+
try {
|
|
174
|
+
r4 = ergoOutputBox
|
|
175
|
+
.register_value(ergoLib.NonMandatoryRegisterId.R4)
|
|
176
|
+
?.to_byte_array();
|
|
177
|
+
}
|
|
178
|
+
catch (e) {
|
|
179
|
+
throw new Error(`collateral box with boxId=${box.boxId} skipped: ${e}`);
|
|
180
|
+
}
|
|
181
|
+
if (r4 == undefined) {
|
|
182
|
+
throw new Error(`collateral box with boxId=${box.boxId} skipped, because of an invalid R4 register`);
|
|
183
|
+
}
|
|
184
|
+
const wId = uint8ArrayToHex(r4);
|
|
185
|
+
this.logger.debug(`Extracted WID=[${wId}] from R4 register of box=${ergoOutputBox
|
|
186
|
+
.box_id()
|
|
187
|
+
.to_str()}`);
|
|
188
|
+
let r5;
|
|
189
|
+
try {
|
|
190
|
+
r5 = ergoOutputBox
|
|
191
|
+
.register_value(ergoLib.NonMandatoryRegisterId.R5)
|
|
192
|
+
?.to_i64()
|
|
193
|
+
.to_str();
|
|
194
|
+
}
|
|
195
|
+
catch (e) {
|
|
196
|
+
throw new Error(`collateral box with boxId=${box.boxId} skipped: ${e}`);
|
|
197
|
+
}
|
|
198
|
+
if (r5 == undefined) {
|
|
199
|
+
throw new Error(`collateral box with boxId=${box.boxId} skipped, because of an invalid R5 register`);
|
|
200
|
+
}
|
|
201
|
+
const rwtCount = BigInt(r5);
|
|
202
|
+
this.logger.debug(`Extracted rwtCount=[${rwtCount}] from R5 register of box=${ergoOutputBox
|
|
203
|
+
.box_id()
|
|
204
|
+
.to_str()}`);
|
|
205
|
+
return {
|
|
206
|
+
boxId: box.boxId,
|
|
207
|
+
boxSerialized: Buffer.from(ergoOutputBox.sigma_serialize_bytes()).toString('base64'),
|
|
208
|
+
wId: wId,
|
|
209
|
+
rwtCount: rwtCount,
|
|
210
|
+
txId: box.transactionId,
|
|
211
|
+
height: Number(box.creationHeight),
|
|
212
|
+
};
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGF0ZXJhbEV4dHJhY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9leHRyYWN0b3IvY29sbGF0ZXJhbEV4dHJhY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtCLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVFLE9BQU8sRUFDTCxpQkFBaUIsR0FJbEIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLHlCQUF5QixNQUFNLDhCQUE4QixDQUFDO0FBR3JFLE9BQU8sS0FBSyxPQUFPLE1BQU0sc0JBQXNCLENBQUM7QUFFaEQsT0FBTyxnQkFBZ0IsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRS9DLE9BQU8sRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRW5ELE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxpQkFBOEI7SUFNbEQ7SUFDQTtJQUNBO0lBQ0E7SUFFQTtJQVZGLFFBQVEsQ0FBUztJQUN6QixNQUFNLENBQW1CO0lBQzFCLFdBQVcsQ0FBQztJQUVwQixZQUNtQixFQUFVLEVBQ1YsTUFBYyxFQUNkLE9BQWUsRUFDZixVQUFzQixFQUN2QyxXQUFtQixFQUNGLFNBQXlCLElBQUksV0FBVyxFQUFFO1FBRTNELEtBQUssRUFBRSxDQUFDO1FBUFMsT0FBRSxHQUFGLEVBQUUsQ0FBUTtRQUNWLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUV0QixXQUFNLEdBQU4sTUFBTSxDQUFvQztRQUczRCxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7YUFDdEQsWUFBWSxFQUFFO2FBQ2QsZUFBZSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxXQUFXLEdBQUcseUJBQXlCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLEdBQUcsR0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUU5Qjs7Ozs7OztPQU9HO0lBQ0gsbUJBQW1CLEdBQUcsS0FBSyxFQUN6QixHQUFrQixFQUNsQixLQUFrQixFQUNBLEVBQUU7UUFDcEIsTUFBTSxLQUFLLEdBQStCLEVBQUUsQ0FBQztRQUM3QyxNQUFNLFdBQVcsR0FBa0IsRUFBRSxDQUFDO1FBQ3RDLEtBQUssTUFBTSxFQUFFLElBQUksR0FBRyxFQUFFO1lBQ3BCLEtBQUssTUFBTSxTQUFTLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRTtnQkFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLEVBQUU7b0JBQ3BDLFNBQVM7aUJBQ1Y7Z0JBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzthQUNuRDtZQUVELFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDeEQ7UUFFRCxJQUFJO1lBQ0YsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDL0QsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDdEU7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLDZDQUE2QyxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQzNELENBQUM7WUFDRixPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUM7SUFFTSxlQUFlLENBQUMsU0FBb0I7UUFDMUMsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDO1FBQ2hELE9BQU8sQ0FDTCxNQUFNLElBQUksU0FBUztZQUNuQixNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU07WUFDdEIsU0FBUyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUNyQyxDQUFDO0lBQ0osQ0FBQztJQUVELFNBQVMsQ0FBa0M7SUFFM0M7Ozs7OztPQU1HO0lBQ0gsZUFBZSxHQUFHLEtBQUssRUFBRSxhQUFxQixFQUFpQixFQUFFO1FBQy9ELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQzVELGFBQWEsQ0FDZCxDQUFDO1FBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQ2YsNkVBQTZFLGtCQUFrQjthQUM1RixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7YUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2pCLENBQUM7UUFFRixNQUFNLDZCQUE2QixHQUNqQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDN0QsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsQ0FDckMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQzNDLENBQUM7UUFDRixNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FDaEMsYUFBYSxFQUNiLDZCQUE2QixDQUFDLE1BQU0sQ0FDbEMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUMvQyxDQUNGLENBQUM7UUFFRixLQUFLLE1BQU0sVUFBVSxJQUFJLGtCQUFrQixFQUFFO1lBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLHlDQUF5QyxVQUFVLENBQUMsS0FBSyxrQ0FBa0MsQ0FDNUYsQ0FBQztZQUNGLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLHdDQUF3QyxVQUFVLENBQUMsS0FBSyxrQ0FBa0MsQ0FDM0YsQ0FBQztTQUNIO0lBQ0gsQ0FBQyxDQUFDO0lBRUY7Ozs7Ozs7O09BUUc7SUFDSyxLQUFLLENBQUMsdUJBQXVCLENBQ25DLGFBQXFCLEVBQ3JCLGdCQUEwQjtRQUUxQixLQUFLLE1BQU0sS0FBSyxJQUFJLGdCQUFnQixFQUFFO1lBQ3BDLElBQUksT0FBbUIsQ0FBQztZQUN4QixJQUFJO2dCQUNGLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM1RDtZQUFDLE9BQU8sQ0FBTSxFQUFFO2dCQUNmLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEtBQUssR0FBRyxFQUFFO29CQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztpQkFDbkQ7cUJBQU07b0JBQ0wsTUFBTSxJQUFJLEtBQUssQ0FDYixnREFBZ0QsS0FBSyx3QkFBd0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUMxRixDQUFDO2lCQUNIO2dCQUNELE9BQU87YUFDUjtZQUVELElBQUksT0FBTyxFQUFFLGtCQUFrQixJQUFJLElBQUksRUFBRTtnQkFDdkMsSUFBSTtvQkFDRixNQUFNLGVBQWUsR0FDbkIsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxzQkFBc0IsQ0FDOUMsT0FBTyxDQUFDLGtCQUFrQixDQUMzQixDQUFDO29CQUVKLElBQUksZUFBZSxDQUFDLGVBQWUsR0FBRyxhQUFhLEVBQUU7d0JBQ25ELElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUN4Qjs0QkFDRSxLQUFLLEVBQUUsS0FBSzs0QkFDWixXQUFXLEVBQUUsZUFBZSxDQUFDLGVBQWU7NEJBQzVDLFVBQVUsRUFBRSxlQUFlLENBQUMsT0FBTzt5QkFDcEMsRUFDRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQ2IsQ0FBQztxQkFDSDtpQkFDRjtnQkFBQyxPQUFPLENBQU0sRUFBRTtvQkFDZixNQUFNLElBQUksS0FBSyxDQUNiLHdEQUF3RCxPQUFPLENBQUMsa0JBQWtCLHdCQUF3QixDQUFDLEVBQUUsT0FBTyxFQUFFLENBQ3ZILENBQUM7aUJBQ0g7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyx3QkFBd0IsR0FBRyxLQUFLLEVBQ3RDLGFBQXFCLEVBQ2dCLEVBQUU7UUFDdkMsTUFBTSxjQUFjLEdBQStCLEVBQUUsQ0FBQztRQUN0RCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDZixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxPQUFPLE1BQU0sR0FBRyxLQUFLLEVBQUU7WUFDckIsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FDdEUsSUFBSSxDQUFDLFFBQVEsRUFDYixFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxDQUMzQyxDQUFDO1lBRUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUU7Z0JBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQzthQUN2RTtZQUVELGNBQWMsQ0FBQyxJQUFJLENBQ2pCLEdBQUcsS0FBSyxDQUFDLEtBQUs7aUJBQ1gsTUFBTSxDQUNMLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FDTixHQUFHLENBQUMsY0FBYztnQkFDbEIsR0FBRyxDQUFDLGNBQWMsR0FBRyxhQUFhO2dCQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUM1QjtpQkFDQSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUNqRCxDQUFDO1lBQ0YsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDcEIsTUFBTSxJQUFJLGVBQWUsQ0FBQztTQUMzQjtRQUNELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUMsQ0FBQztJQUVGOzs7Ozs7O09BT0c7SUFDSyxxQkFBcUIsR0FBRyxDQUM5QixHQUEyQixFQUNOLEVBQUU7UUFDdkIsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXZFLElBQUksRUFBMEIsQ0FBQztRQUMvQixJQUFJO1lBQ0YsRUFBRSxHQUFHLGFBQWE7aUJBQ2YsY0FBYyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xELEVBQUUsYUFBYSxFQUFFLENBQUM7U0FDckI7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLEdBQUcsQ0FBQyxLQUFLLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN6RTtRQUNELElBQUksRUFBRSxJQUFJLFNBQVMsRUFBRTtZQUNuQixNQUFNLElBQUksS0FBSyxDQUNiLDZCQUE2QixHQUFHLENBQUMsS0FBSyw2Q0FBNkMsQ0FDcEYsQ0FBQztTQUNIO1FBQ0QsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLGtCQUFrQixHQUFHLDZCQUE2QixhQUFhO2FBQzVELE1BQU0sRUFBRTthQUNSLE1BQU0sRUFBRSxFQUFFLENBQ2QsQ0FBQztRQUVGLElBQUksRUFBc0IsQ0FBQztRQUMzQixJQUFJO1lBQ0YsRUFBRSxHQUFHLGFBQWE7aUJBQ2YsY0FBYyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xELEVBQUUsTUFBTSxFQUFFO2lCQUNULE1BQU0sRUFBRSxDQUFDO1NBQ2I7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLEdBQUcsQ0FBQyxLQUFLLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN6RTtRQUNELElBQUksRUFBRSxJQUFJLFNBQVMsRUFBRTtZQUNuQixNQUFNLElBQUksS0FBSyxDQUNiLDZCQUE2QixHQUFHLENBQUMsS0FBSyw2Q0FBNkMsQ0FDcEYsQ0FBQztTQUNIO1FBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUNmLHVCQUF1QixRQUFRLDZCQUE2QixhQUFhO2FBQ3RFLE1BQU0sRUFBRTthQUNSLE1BQU0sRUFBRSxFQUFFLENBQ2QsQ0FBQztRQUVGLE9BQU87WUFDTCxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUs7WUFDaEIsYUFBYSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQ3hCLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUN0QyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDcEIsR0FBRyxFQUFFLEdBQUc7WUFDUixRQUFRLEVBQUUsUUFBUTtZQUNsQixJQUFJLEVBQUUsR0FBRyxDQUFDLGFBQWE7WUFDdkIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDO1NBQ25DLENBQUM7SUFDSixDQUFDLENBQUM7Q0FDSCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFic3RyYWN0TG9nZ2VyLCBEdW1teUxvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcbmltcG9ydCB7XG4gIEFic3RyYWN0RXh0cmFjdG9yLFxuICBCbG9ja0VudGl0eSxcbiAgT3V0cHV0Qm94LFxuICBUcmFuc2FjdGlvbixcbn0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyJztcbmltcG9ydCBlcmdvRXhwbG9yZXJDbGllbnRGYWN0b3J5IGZyb20gJ0Byb3Nlbi1jbGllbnRzL2VyZ28tZXhwbG9yZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25JbmZvIH0gZnJvbSAnQHJvc2VuLWNsaWVudHMvZXJnby1leHBsb3Jlci9kaXN0L3NyYy92MS90eXBlcyc7XG5pbXBvcnQgeyBPdXRwdXRJbmZvIH0gZnJvbSAnQHJvc2VuLWNsaWVudHMvZXJnby1leHBsb3Jlci9kaXN0L3NyYy92MS90eXBlcy9vdXRwdXRJbmZvJztcbmltcG9ydCAqIGFzIGVyZ29MaWIgZnJvbSAnZXJnby1saWItd2FzbS1ub2RlanMnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJ3R5cGVvcm0nO1xuaW1wb3J0IENvbGxhdGVyYWxBY3Rpb24gZnJvbSAnLi4vYWN0aW9ucy9jb2xsYXRlcmFsQWN0aW9uJztcbmltcG9ydCB7IERlZmF1bHRBcGlMaW1pdCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBFeHRyYWN0ZWRDb2xsYXRlcmFsIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9leHRyYWN0ZWRDb2xsYXRlcmFsJztcbmltcG9ydCB7IEpzb25CSSwgdWludDhBcnJheVRvSGV4IH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQ29sbGF0ZXJhbEV4dHJhY3RvciBleHRlbmRzIEFic3RyYWN0RXh0cmFjdG9yPFRyYW5zYWN0aW9uPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXJnb1RyZWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYWN0aW9uOiBDb2xsYXRlcmFsQWN0aW9uO1xuICBwcml2YXRlIGV4cGxvcmVyQXBpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGF3Y05mdDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWRkcmVzczogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICBleHBsb3JlclVybDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBBYnN0cmFjdExvZ2dlciA9IG5ldyBEdW1teUxvZ2dlcigpXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5lcmdvVHJlZSA9IGVyZ29MaWIuQWRkcmVzcy5mcm9tX2Jhc2U1OCh0aGlzLmFkZHJlc3MpXG4gICAgICAudG9fZXJnb190cmVlKClcbiAgICAgIC50b19iYXNlMTZfYnl0ZXMoKTtcbiAgICB0aGlzLmFjdGlvbiA9IG5ldyBDb2xsYXRlcmFsQWN0aW9uKHRoaXMuZGF0YVNvdXJjZSwgdGhpcy5sb2dnZXIpO1xuICAgIHRoaXMuZXhwbG9yZXJBcGkgPSBlcmdvRXhwbG9yZXJDbGllbnRGYWN0b3J5KGV4cGxvcmVyVXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgaWQgZm9yIGV4dHJhY3Rvci4gVGhpcyBpZCBtdXN0IGJlIHVuaXF1ZSBvdmVyIGFsbCBleHRyYWN0b3JzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXRJZCA9ICgpOiBzdHJpbmcgPT4gdGhpcy5pZDtcblxuICAvKipcbiAgICogcHJvY2VzcyBhIGxpc3Qgb2YgdHJhbnNhY3Rpb25zIGFuZCBzdG9yZSBjb2xsYXRlcmFsIGJveCBkZXRhaWxzXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25bXX0gdHhzIGxpc3Qgb2YgdHJhbnNhY3Rpb24gZm9yIGJsb2NrXG4gICAqIEBwYXJhbSB7QmxvY2tFbnRpdHl9IGJsb2NrIGJsb2NrIGlkIGZvciB0cmFuc2FjdGlvbnMgYXMgaGV4IGVuY29kZWRcbiAgICogQHJldHVybiB7UHJvbWlzZTxib29sZWFuPn0gUHJvbWlzZTxib29sZWFuPiBpZiBubyBlcnJvciBvY2N1cnJlZCByZXR1cm5cbiAgICogdHJ1ZS4gb3RoZXJ3aXNlLCByZXR1cm4gZmFsc2VcbiAgICovXG4gIHByb2Nlc3NUcmFuc2FjdGlvbnMgPSBhc3luYyAoXG4gICAgdHhzOiBUcmFuc2FjdGlvbltdLFxuICAgIGJsb2NrOiBCbG9ja0VudGl0eVxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCBib3hlczogQXJyYXk8RXh0cmFjdGVkQ29sbGF0ZXJhbD4gPSBbXTtcbiAgICBjb25zdCBzcGVuZEJveElkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGZvciAoY29uc3QgdHggb2YgdHhzKSB7XG4gICAgICBmb3IgKGNvbnN0IG91dHB1dEJveCBvZiB0eC5vdXRwdXRzKSB7XG4gICAgICAgIGlmICghdGhpcy5pc0NvbGxhdGVyYWxCb3gob3V0cHV0Qm94KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGJveGVzLnB1c2godGhpcy50b0V4dHJhY3RlZENvbGxhdGVyYWwob3V0cHV0Qm94KSk7XG4gICAgICB9XG5cbiAgICAgIHNwZW5kQm94SWRzLnB1c2goLi4udHguaW5wdXRzLm1hcCgoYm94KSA9PiBib3guYm94SWQpKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5hY3Rpb24uc3RvcmVDb2xsYXRlcmFscyhib3hlcywgYmxvY2ssIHRoaXMuZ2V0SWQoKSk7XG4gICAgICBhd2FpdCB0aGlzLmFjdGlvbi5zcGVuZENvbGxhdGVyYWxzKHNwZW5kQm94SWRzLCBibG9jaywgdGhpcy5nZXRJZCgpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYEVycm9yIGluIHN0b3JpbmcgY29sbGF0ZXJhbHMgb2YgdGhlIGJsb2NrICR7YmxvY2t9OiAke2V9YFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBwcml2YXRlIGlzQ29sbGF0ZXJhbEJveChvdXRwdXRCb3g6IE91dHB1dEJveCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGF3Y05mdCA9IG91dHB1dEJveC5hc3NldHM/LmF0KDApPy50b2tlbklkO1xuICAgIHJldHVybiAoXG4gICAgICBhd2NOZnQgIT0gdW5kZWZpbmVkICYmXG4gICAgICBhd2NOZnQgPT09IHRoaXMuYXdjTmZ0ICYmXG4gICAgICBvdXRwdXRCb3guZXJnb1RyZWUgPT09IHRoaXMuZXJnb1RyZWVcbiAgICApO1xuICB9XG5cbiAgZm9ya0Jsb2NrOiAoaGFzaDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgZGF0YWJhc2Ugd2l0aCBvbGRlciBjb2xsYXRlcmFsc1xuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5pdGlhbEhlaWdodFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKiBAbWVtYmVyb2YgQ29sbGF0ZXJhbEV4dHJhY3RvclxuICAgKi9cbiAgaW5pdGlhbGl6ZUJveGVzID0gYXN5bmMgKGluaXRpYWxIZWlnaHQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHVuc3BlbnRDb2xsYXRlcmFscyA9IGF3YWl0IHRoaXMuZ2V0QWxsVW5zcGVudENvbGxhdGVyYWxzKFxuICAgICAgaW5pdGlhbEhlaWdodFxuICAgICk7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBgdW5zcGVudCBjb2xsYXRlcmFsIGJveCBpbmZvIHdpdGggZm9sbG93aW5nIElEcyBnb3R0ZW4gZm9ybSBFcmdvIG5ldHdvcms6IFske3Vuc3BlbnRDb2xsYXRlcmFsc1xuICAgICAgICAubWFwKChib3gpID0+IGJveC5ib3hJZClcbiAgICAgICAgLmpvaW4oJywgJyl9XWBcbiAgICApO1xuXG4gICAgY29uc3Qgc3RvcmVkVW5zcGVudENvbGxhdGVyYWxCb3hJZHMgPVxuICAgICAgYXdhaXQgdGhpcy5hY3Rpb24uZ2V0VW5zcGVudENvbGxhdGVyYWxCb3hJZHModGhpcy5nZXRJZCgpKTtcbiAgICBjb25zdCB1bnNwZW50Q29sbGF0ZXJhbEJveElkcyA9IG5ldyBTZXQoXG4gICAgICB1bnNwZW50Q29sbGF0ZXJhbHMubWFwKChib3gpID0+IGJveC5ib3hJZClcbiAgICApO1xuICAgIGF3YWl0IHRoaXMudGlkeVVwU3RvcmVkQ29sbGF0ZXJhbHMoXG4gICAgICBpbml0aWFsSGVpZ2h0LFxuICAgICAgc3RvcmVkVW5zcGVudENvbGxhdGVyYWxCb3hJZHMuZmlsdGVyKFxuICAgICAgICAoYm94SWQpID0+ICF1bnNwZW50Q29sbGF0ZXJhbEJveElkcy5oYXMoYm94SWQpXG4gICAgICApXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgY29sbGF0ZXJhbCBvZiB1bnNwZW50Q29sbGF0ZXJhbHMpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgc2F2aW5nIHVuc3BlbnQgY29sbGF0ZXJhbCB3aXRoIGJveElkPVske2NvbGxhdGVyYWwuYm94SWR9XSB0byBkYXRhYmFzZSBmb3IgaW5pdGlhbGl6YXRpb25gXG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5hY3Rpb24uc2F2ZUNvbGxhdGVyYWwoY29sbGF0ZXJhbCwgdGhpcy5nZXRJZCgpKTtcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgc2F2ZWQgdW5zcGVudCBjb2xsYXRlcmFsIHdpdGggYm94SWQ9WyR7Y29sbGF0ZXJhbC5ib3hJZH1dIHRvIGRhdGFiYXNlIGZvciBpbml0aWFsaXphdGlvbmBcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiByZW1vdmVzIG9yIHVwZGF0ZXMgc3RvcmVkIGNvbGxhdGVyYWwgYm94ZXMgYmVmb3JlIGluaXRpYWxpemluZyBib3hlc1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5pdGlhbEhlaWdodFxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBjb2xsYXRlcmFsQm94SWRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqIEBtZW1iZXJvZiBDb2xsYXRlcmFsRXh0cmFjdG9yXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHRpZHlVcFN0b3JlZENvbGxhdGVyYWxzKFxuICAgIGluaXRpYWxIZWlnaHQ6IG51bWJlcixcbiAgICBjb2xsYXRlcmFsQm94SWRzOiBzdHJpbmdbXVxuICApIHtcbiAgICBmb3IgKGNvbnN0IGJveElkIG9mIGNvbGxhdGVyYWxCb3hJZHMpIHtcbiAgICAgIGxldCBib3hJbmZvOiBPdXRwdXRJbmZvO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYm94SW5mbyA9IGF3YWl0IHRoaXMuZXhwbG9yZXJBcGkudjEuZ2V0QXBpVjFCb3hlc1AxKGJveElkKTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBpZiAoZT8ucmVzcG9uc2U/LnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgdGhpcy5hY3Rpb24uZGVsZXRlQ29sbGF0ZXJhbChib3hJZCwgdGhpcy5nZXRJZCgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgc29tZXRoaW5nIHdlbnQgd3Jvbmcgd2hlbiB0cnlpbmcgdG8gZ2V0IGJveD1bJHtib3hJZH1dIGZyb20gRXJnbyBuZXR3b3JrOiAke2U/Lm1lc3NhZ2V9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoYm94SW5mbz8uc3BlbnRUcmFuc2FjdGlvbklkICE9IG51bGwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB0cmFuc2FjdGlvbkluZm86IFRyYW5zYWN0aW9uSW5mbyA9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmV4cGxvcmVyQXBpLnYxLmdldEFwaVYxVHJhbnNhY3Rpb25zUDEoXG4gICAgICAgICAgICAgIGJveEluZm8uc3BlbnRUcmFuc2FjdGlvbklkXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHRyYW5zYWN0aW9uSW5mby5pbmNsdXNpb25IZWlnaHQgPCBpbml0aWFsSGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbi5zYXZlQ29sbGF0ZXJhbChcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGJveElkOiBib3hJZCxcbiAgICAgICAgICAgICAgICBzcGVuZEhlaWdodDogdHJhbnNhY3Rpb25JbmZvLmluY2x1c2lvbkhlaWdodCxcbiAgICAgICAgICAgICAgICBzcGVuZEJsb2NrOiB0cmFuc2FjdGlvbkluZm8uYmxvY2tJZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdGhpcy5nZXRJZCgpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHNvbWV0aGluZyB3ZW50IHdyb25nIHdoZW4gdHJ5aW5nIHRvIGdldCB0cmFuc2FjdGlvbj1bJHtib3hJbmZvLnNwZW50VHJhbnNhY3Rpb25JZH1dIGZyb20gRXJnbyBuZXR3b3JrOiAke2U/Lm1lc3NhZ2V9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZ2V0cyBhbGwgdW5zcGVudCBjb2xsYXRlcmFscyBmcm9tIEVyZ28gZXhwbG9yZXIgYXBpXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBpbml0aWFsSGVpZ2h0XG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8RXh0cmFjdGVkQ29sbGF0ZXJhbD4+fVxuICAgKiBAbWVtYmVyb2YgQ29sbGF0ZXJhbEV4dHJhY3RvclxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBbGxVbnNwZW50Q29sbGF0ZXJhbHMgPSBhc3luYyAoXG4gICAgaW5pdGlhbEhlaWdodDogbnVtYmVyXG4gICk6IFByb21pc2U8QXJyYXk8RXh0cmFjdGVkQ29sbGF0ZXJhbD4+ID0+IHtcbiAgICBjb25zdCBleHRyYWN0ZWRCb3hlczogQXJyYXk8RXh0cmFjdGVkQ29sbGF0ZXJhbD4gPSBbXTtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICBsZXQgdG90YWwgPSAxO1xuICAgIHdoaWxlIChvZmZzZXQgPCB0b3RhbCkge1xuICAgICAgY29uc3QgYm94ZXMgPSBhd2FpdCB0aGlzLmV4cGxvcmVyQXBpLnYxLmdldEFwaVYxQm94ZXNVbnNwZW50QnllcmdvdHJlZVAxKFxuICAgICAgICB0aGlzLmVyZ29UcmVlLFxuICAgICAgICB7IG9mZnNldDogb2Zmc2V0LCBsaW1pdDogRGVmYXVsdEFwaUxpbWl0IH1cbiAgICAgICk7XG5cbiAgICAgIGlmICghYm94ZXMuaXRlbXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBsb3JlciBhcGkgb3V0cHV0IGl0ZW1zIHNob3VsZCBub3QgYmUgdW5kZWZpbmVkLicpO1xuICAgICAgfVxuXG4gICAgICBleHRyYWN0ZWRCb3hlcy5wdXNoKFxuICAgICAgICAuLi5ib3hlcy5pdGVtc1xuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAoYm94KSA9PlxuICAgICAgICAgICAgICBib3guY3JlYXRpb25IZWlnaHQgJiZcbiAgICAgICAgICAgICAgYm94LmNyZWF0aW9uSGVpZ2h0IDwgaW5pdGlhbEhlaWdodCAmJlxuICAgICAgICAgICAgICB0aGlzLmlzQ29sbGF0ZXJhbEJveChib3gpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAoKGJveCkgPT4gdGhpcy50b0V4dHJhY3RlZENvbGxhdGVyYWwoYm94KSlcbiAgICAgICk7XG4gICAgICB0b3RhbCA9IGJveGVzLnRvdGFsO1xuICAgICAgb2Zmc2V0ICs9IERlZmF1bHRBcGlMaW1pdDtcbiAgICB9XG4gICAgcmV0dXJuIGV4dHJhY3RlZEJveGVzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBjb252ZXJ0cyBvdXRwdXQgYm94IGluZm9ybWF0aW9uIHRvIGFuIEV4dHJhY3RlZENvbGxhdGVyYWwgb2JqZWN0XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7KE91dHB1dEluZm8gfCBPdXRwdXRCb3gpfSBib3hcbiAgICogQHJldHVybiB7RXh0cmFjdGVkQ29sbGF0ZXJhbH1cbiAgICogQG1lbWJlcm9mIENvbGxhdGVyYWxFeHRyYWN0b3JcbiAgICovXG4gIHByaXZhdGUgdG9FeHRyYWN0ZWRDb2xsYXRlcmFsID0gKFxuICAgIGJveDogT3V0cHV0SW5mbyB8IE91dHB1dEJveFxuICApOiBFeHRyYWN0ZWRDb2xsYXRlcmFsID0+IHtcbiAgICBjb25zdCBlcmdvT3V0cHV0Qm94ID0gZXJnb0xpYi5FcmdvQm94LmZyb21fanNvbihKc29uQkkuc3RyaW5naWZ5KGJveCkpO1xuXG4gICAgbGV0IHI0OiBVaW50OEFycmF5IHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICByNCA9IGVyZ29PdXRwdXRCb3hcbiAgICAgICAgLnJlZ2lzdGVyX3ZhbHVlKGVyZ29MaWIuTm9uTWFuZGF0b3J5UmVnaXN0ZXJJZC5SNClcbiAgICAgICAgPy50b19ieXRlX2FycmF5KCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb2xsYXRlcmFsIGJveCB3aXRoIGJveElkPSR7Ym94LmJveElkfSBza2lwcGVkOiAke2V9YCk7XG4gICAgfVxuICAgIGlmIChyNCA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGNvbGxhdGVyYWwgYm94IHdpdGggYm94SWQ9JHtib3guYm94SWR9IHNraXBwZWQsIGJlY2F1c2Ugb2YgYW4gaW52YWxpZCBSNCByZWdpc3RlcmBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHdJZCA9IHVpbnQ4QXJyYXlUb0hleChyNCk7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBgRXh0cmFjdGVkIFdJRD1bJHt3SWR9XSBmcm9tIFI0IHJlZ2lzdGVyIG9mIGJveD0ke2VyZ29PdXRwdXRCb3hcbiAgICAgICAgLmJveF9pZCgpXG4gICAgICAgIC50b19zdHIoKX1gXG4gICAgKTtcblxuICAgIGxldCByNTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICByNSA9IGVyZ29PdXRwdXRCb3hcbiAgICAgICAgLnJlZ2lzdGVyX3ZhbHVlKGVyZ29MaWIuTm9uTWFuZGF0b3J5UmVnaXN0ZXJJZC5SNSlcbiAgICAgICAgPy50b19pNjQoKVxuICAgICAgICAudG9fc3RyKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb2xsYXRlcmFsIGJveCB3aXRoIGJveElkPSR7Ym94LmJveElkfSBza2lwcGVkOiAke2V9YCk7XG4gICAgfVxuICAgIGlmIChyNSA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGNvbGxhdGVyYWwgYm94IHdpdGggYm94SWQ9JHtib3guYm94SWR9IHNraXBwZWQsIGJlY2F1c2Ugb2YgYW4gaW52YWxpZCBSNSByZWdpc3RlcmBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHJ3dENvdW50ID0gQmlnSW50KHI1KTtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBFeHRyYWN0ZWQgcnd0Q291bnQ9WyR7cnd0Q291bnR9XSBmcm9tIFI1IHJlZ2lzdGVyIG9mIGJveD0ke2VyZ29PdXRwdXRCb3hcbiAgICAgICAgLmJveF9pZCgpXG4gICAgICAgIC50b19zdHIoKX1gXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICBib3hJZDogYm94LmJveElkLFxuICAgICAgYm94U2VyaWFsaXplZDogQnVmZmVyLmZyb20oXG4gICAgICAgIGVyZ29PdXRwdXRCb3guc2lnbWFfc2VyaWFsaXplX2J5dGVzKClcbiAgICAgICkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgd0lkOiB3SWQsXG4gICAgICByd3RDb3VudDogcnd0Q291bnQsXG4gICAgICB0eElkOiBib3gudHJhbnNhY3Rpb25JZCxcbiAgICAgIGhlaWdodDogTnVtYmVyKGJveC5jcmVhdGlvbkhlaWdodCksXG4gICAgfTtcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface ExtractedCollateral {
|
|
2
|
+
boxId: string;
|
|
3
|
+
boxSerialized: string;
|
|
4
|
+
wId: string;
|
|
5
|
+
rwtCount: bigint;
|
|
6
|
+
txId: string;
|
|
7
|
+
block?: string;
|
|
8
|
+
height?: number;
|
|
9
|
+
spendBlock?: string;
|
|
10
|
+
spendHeight?: number;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=extractedCollateral.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractedCollateral.d.ts","sourceRoot":"","sources":["../../lib/interfaces/extractedCollateral.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0cmFjdGVkQ29sbGF0ZXJhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9pbnRlcmZhY2VzL2V4dHJhY3RlZENvbGxhdGVyYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgRXh0cmFjdGVkQ29sbGF0ZXJhbCB7XG4gIGJveElkOiBzdHJpbmc7XG4gIGJveFNlcmlhbGl6ZWQ6IHN0cmluZztcbiAgd0lkOiBzdHJpbmc7XG4gIHJ3dENvdW50OiBiaWdpbnQ7XG4gIHR4SWQ6IHN0cmluZztcbiAgYmxvY2s/OiBzdHJpbmc7XG4gIGhlaWdodD86IG51bWJlcjtcbiAgc3BlbmRCbG9jaz86IHN0cmluZztcbiAgc3BlbmRIZWlnaHQ/OiBudW1iZXI7XG59XG4iXX0=
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { migration1706610773315 } from './postgres/1706610773315-migration';
|
|
2
2
|
import { migration1706610773176 } from './sqlite/1706610773176-migration';
|
|
3
3
|
export declare const migrations: {
|
|
4
4
|
sqlite: (typeof migration1706610773176)[];
|
|
5
|
-
postgres: (typeof
|
|
5
|
+
postgres: (typeof migration1706610773315)[];
|
|
6
6
|
};
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/migrations/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/migrations/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAI5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAE1E,eAAO,MAAM,UAAU;;;CAatB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { MigrationInterface, QueryRunner } from 'typeorm';
|
|
2
|
+
export declare class Migration1708189757400 implements MigrationInterface {
|
|
3
|
+
name: string;
|
|
4
|
+
up(queryRunner: QueryRunner): Promise<void>;
|
|
5
|
+
down(queryRunner: QueryRunner): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=1708189757400-migration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"1708189757400-migration.d.ts","sourceRoot":"","sources":["../../../lib/migrations/postgres/1708189757400-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;IAoB3C,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAK3D"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export class Migration1708189757400 {
|
|
2
|
+
name = 'Migration1708189757400';
|
|
3
|
+
async up(queryRunner) {
|
|
4
|
+
await queryRunner.query(`
|
|
5
|
+
CREATE TABLE "collateral_entity" (
|
|
6
|
+
"id" SERIAL NOT NULL,
|
|
7
|
+
"extractor" character varying NOT NULL,
|
|
8
|
+
"boxId" character varying NOT NULL,
|
|
9
|
+
"boxSerialized" character varying NOT NULL,
|
|
10
|
+
"wId" character varying NOT NULL,
|
|
11
|
+
"rwtCount" bigint NOT NULL,
|
|
12
|
+
"txId" character varying NOT NULL,
|
|
13
|
+
"block" character varying,
|
|
14
|
+
"height" integer,
|
|
15
|
+
"spendBlock" text,
|
|
16
|
+
"spendHeight" integer,
|
|
17
|
+
CONSTRAINT "UQ_2d4abc2071df9a2300a5e1b4616" UNIQUE ("boxId", "extractor"),
|
|
18
|
+
CONSTRAINT "PK_e8506252c52632f4741c8415c3f" PRIMARY KEY ("id")
|
|
19
|
+
)
|
|
20
|
+
`);
|
|
21
|
+
}
|
|
22
|
+
async down(queryRunner) {
|
|
23
|
+
await queryRunner.query(`
|
|
24
|
+
DROP TABLE "collateral_entity"
|
|
25
|
+
`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcwODE4OTc1NzQwMC1taWdyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvbWlncmF0aW9ucy9wb3N0Z3Jlcy8xNzA4MTg5NzU3NDAwLW1pZ3JhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDLElBQUksR0FBRyx3QkFBd0IsQ0FBQztJQUV6QixLQUFLLENBQUMsRUFBRSxDQUFDLFdBQXdCO1FBQ3RDLE1BQU0sV0FBVyxDQUFDLEtBQUssQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztTQWdCbkIsQ0FBQyxDQUFDO0lBQ1QsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBd0I7UUFDeEMsTUFBTSxXQUFXLENBQUMsS0FBSyxDQUFDOztTQUVuQixDQUFDLENBQUM7SUFDVCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNaWdyYXRpb25JbnRlcmZhY2UsIFF1ZXJ5UnVubmVyIH0gZnJvbSAndHlwZW9ybSc7XG5cbmV4cG9ydCBjbGFzcyBNaWdyYXRpb24xNzA4MTg5NzU3NDAwIGltcGxlbWVudHMgTWlncmF0aW9uSW50ZXJmYWNlIHtcbiAgbmFtZSA9ICdNaWdyYXRpb24xNzA4MTg5NzU3NDAwJztcblxuICBwdWJsaWMgYXN5bmMgdXAocXVlcnlSdW5uZXI6IFF1ZXJ5UnVubmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgcXVlcnlSdW5uZXIucXVlcnkoYFxuICAgICAgICAgICAgQ1JFQVRFIFRBQkxFIFwiY29sbGF0ZXJhbF9lbnRpdHlcIiAoXG4gICAgICAgICAgICAgICAgXCJpZFwiIFNFUklBTCBOT1QgTlVMTCxcbiAgICAgICAgICAgICAgICBcImV4dHJhY3RvclwiIGNoYXJhY3RlciB2YXJ5aW5nIE5PVCBOVUxMLFxuICAgICAgICAgICAgICAgIFwiYm94SWRcIiBjaGFyYWN0ZXIgdmFyeWluZyBOT1QgTlVMTCxcbiAgICAgICAgICAgICAgICBcImJveFNlcmlhbGl6ZWRcIiBjaGFyYWN0ZXIgdmFyeWluZyBOT1QgTlVMTCxcbiAgICAgICAgICAgICAgICBcIndJZFwiIGNoYXJhY3RlciB2YXJ5aW5nIE5PVCBOVUxMLFxuICAgICAgICAgICAgICAgIFwicnd0Q291bnRcIiBiaWdpbnQgTk9UIE5VTEwsXG4gICAgICAgICAgICAgICAgXCJ0eElkXCIgY2hhcmFjdGVyIHZhcnlpbmcgTk9UIE5VTEwsXG4gICAgICAgICAgICAgICAgXCJibG9ja1wiIGNoYXJhY3RlciB2YXJ5aW5nLFxuICAgICAgICAgICAgICAgIFwiaGVpZ2h0XCIgaW50ZWdlcixcbiAgICAgICAgICAgICAgICBcInNwZW5kQmxvY2tcIiB0ZXh0LFxuICAgICAgICAgICAgICAgIFwic3BlbmRIZWlnaHRcIiBpbnRlZ2VyLFxuICAgICAgICAgICAgICAgIENPTlNUUkFJTlQgXCJVUV8yZDRhYmMyMDcxZGY5YTIzMDBhNWUxYjQ2MTZcIiBVTklRVUUgKFwiYm94SWRcIiwgXCJleHRyYWN0b3JcIiksXG4gICAgICAgICAgICAgICAgQ09OU1RSQUlOVCBcIlBLX2U4NTA2MjUyYzUyNjMyZjQ3NDFjODQxNWMzZlwiIFBSSU1BUlkgS0VZIChcImlkXCIpXG4gICAgICAgICAgICApXG4gICAgICAgIGApO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRvd24ocXVlcnlSdW5uZXI6IFF1ZXJ5UnVubmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgcXVlcnlSdW5uZXIucXVlcnkoYFxuICAgICAgICAgICAgRFJPUCBUQUJMRSBcImNvbGxhdGVyYWxfZW50aXR5XCJcbiAgICAgICAgYCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { MigrationInterface, QueryRunner } from 'typeorm';
|
|
2
|
+
export declare class Migration1708175020320 implements MigrationInterface {
|
|
3
|
+
name: string;
|
|
4
|
+
up(queryRunner: QueryRunner): Promise<void>;
|
|
5
|
+
down(queryRunner: QueryRunner): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=1708175020320-migration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"1708175020320-migration.d.ts","sourceRoot":"","sources":["../../../lib/migrations/sqlite/1708175020320-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;IAmB3C,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAK3D"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export class Migration1708175020320 {
|
|
2
|
+
name = 'Migration1708175020320';
|
|
3
|
+
async up(queryRunner) {
|
|
4
|
+
await queryRunner.query(`
|
|
5
|
+
CREATE TABLE "collateral_entity" (
|
|
6
|
+
"id" integer PRIMARY KEY AUTOINCREMENT NOT NULL,
|
|
7
|
+
"extractor" varchar NOT NULL,
|
|
8
|
+
"boxId" varchar NOT NULL,
|
|
9
|
+
"boxSerialized" varchar NOT NULL,
|
|
10
|
+
"wId" varchar NOT NULL,
|
|
11
|
+
"rwtCount" bigint NOT NULL,
|
|
12
|
+
"txId" varchar NOT NULL,
|
|
13
|
+
"block" varchar,
|
|
14
|
+
"height" integer,
|
|
15
|
+
"spendBlock" text,
|
|
16
|
+
"spendHeight" integer,
|
|
17
|
+
CONSTRAINT "UQ_2d4abc2071df9a2300a5e1b4616" UNIQUE ("boxId", "extractor")
|
|
18
|
+
)
|
|
19
|
+
`);
|
|
20
|
+
}
|
|
21
|
+
async down(queryRunner) {
|
|
22
|
+
await queryRunner.query(`
|
|
23
|
+
DROP TABLE "collateral_entity"
|
|
24
|
+
`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcwODE3NTAyMDMyMC1taWdyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvbWlncmF0aW9ucy9zcWxpdGUvMTcwODE3NTAyMDMyMC1taWdyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFPLHNCQUFzQjtJQUNqQyxJQUFJLEdBQUcsd0JBQXdCLENBQUM7SUFFekIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxXQUF3QjtRQUN0QyxNQUFNLFdBQVcsQ0FBQyxLQUFLLENBQUM7Ozs7Ozs7Ozs7Ozs7OztTQWVuQixDQUFDLENBQUM7SUFDVCxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUksQ0FBQyxXQUF3QjtRQUN4QyxNQUFNLFdBQVcsQ0FBQyxLQUFLLENBQUM7O1NBRW5CLENBQUMsQ0FBQztJQUNULENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1pZ3JhdGlvbkludGVyZmFjZSwgUXVlcnlSdW5uZXIgfSBmcm9tICd0eXBlb3JtJztcblxuZXhwb3J0IGNsYXNzIE1pZ3JhdGlvbjE3MDgxNzUwMjAzMjAgaW1wbGVtZW50cyBNaWdyYXRpb25JbnRlcmZhY2Uge1xuICBuYW1lID0gJ01pZ3JhdGlvbjE3MDgxNzUwMjAzMjAnO1xuXG4gIHB1YmxpYyBhc3luYyB1cChxdWVyeVJ1bm5lcjogUXVlcnlSdW5uZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBxdWVyeVJ1bm5lci5xdWVyeShgXG4gICAgICAgICAgICBDUkVBVEUgVEFCTEUgXCJjb2xsYXRlcmFsX2VudGl0eVwiIChcbiAgICAgICAgICAgICAgICBcImlkXCIgaW50ZWdlciBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5UIE5PVCBOVUxMLFxuICAgICAgICAgICAgICAgIFwiZXh0cmFjdG9yXCIgdmFyY2hhciBOT1QgTlVMTCxcbiAgICAgICAgICAgICAgICBcImJveElkXCIgdmFyY2hhciBOT1QgTlVMTCxcbiAgICAgICAgICAgICAgICBcImJveFNlcmlhbGl6ZWRcIiB2YXJjaGFyIE5PVCBOVUxMLFxuICAgICAgICAgICAgICAgIFwid0lkXCIgdmFyY2hhciBOT1QgTlVMTCxcbiAgICAgICAgICAgICAgICBcInJ3dENvdW50XCIgYmlnaW50IE5PVCBOVUxMLFxuICAgICAgICAgICAgICAgIFwidHhJZFwiIHZhcmNoYXIgTk9UIE5VTEwsXG4gICAgICAgICAgICAgICAgXCJibG9ja1wiIHZhcmNoYXIsXG4gICAgICAgICAgICAgICAgXCJoZWlnaHRcIiBpbnRlZ2VyLFxuICAgICAgICAgICAgICAgIFwic3BlbmRCbG9ja1wiIHRleHQsXG4gICAgICAgICAgICAgICAgXCJzcGVuZEhlaWdodFwiIGludGVnZXIsXG4gICAgICAgICAgICAgICAgQ09OU1RSQUlOVCBcIlVRXzJkNGFiYzIwNzFkZjlhMjMwMGE1ZTFiNDYxNlwiIFVOSVFVRSAoXCJib3hJZFwiLCBcImV4dHJhY3RvclwiKVxuICAgICAgICAgICAgKVxuICAgICAgICBgKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkb3duKHF1ZXJ5UnVubmVyOiBRdWVyeVJ1bm5lcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnF1ZXJ5KGBcbiAgICAgICAgICAgIERST1AgVEFCTEUgXCJjb2xsYXRlcmFsX2VudGl0eVwiXG4gICAgICAgIGApO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare const bigintTransformer: {
|
|
2
|
+
/**
|
|
3
|
+
* converts data from string in database to bigint in code
|
|
4
|
+
*
|
|
5
|
+
* @param {string} value
|
|
6
|
+
* @return {bigint}
|
|
7
|
+
*/
|
|
8
|
+
from(value: string): bigint;
|
|
9
|
+
/**
|
|
10
|
+
* converts data from bigint in code to string in database
|
|
11
|
+
*
|
|
12
|
+
* @param {bigint} value
|
|
13
|
+
* @return {string}
|
|
14
|
+
*/
|
|
15
|
+
to(value: bigint): string;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=transformers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transformers.d.ts","sourceRoot":"","sources":["../lib/transformers.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB;IAC5B;;;;;OAKG;gBACS,MAAM;IAGlB;;;;;OAKG;cACO,MAAM;CAGjB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export const bigintTransformer = {
|
|
2
|
+
/**
|
|
3
|
+
* converts data from string in database to bigint in code
|
|
4
|
+
*
|
|
5
|
+
* @param {string} value
|
|
6
|
+
* @return {bigint}
|
|
7
|
+
*/
|
|
8
|
+
from(value) {
|
|
9
|
+
return BigInt(value);
|
|
10
|
+
},
|
|
11
|
+
/**
|
|
12
|
+
* converts data from bigint in code to string in database
|
|
13
|
+
*
|
|
14
|
+
* @param {bigint} value
|
|
15
|
+
* @return {string}
|
|
16
|
+
*/
|
|
17
|
+
to(value) {
|
|
18
|
+
return value.toString();
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL3RyYW5zZm9ybWVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRztJQUMvQjs7Ozs7T0FLRztJQUNILElBQUksQ0FBQyxLQUFhO1FBQ2hCLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFDRDs7Ozs7T0FLRztJQUNILEVBQUUsQ0FBQyxLQUFhO1FBQ2QsT0FBTyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDMUIsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgYmlnaW50VHJhbnNmb3JtZXIgPSB7XG4gIC8qKlxuICAgKiBjb252ZXJ0cyBkYXRhIGZyb20gc3RyaW5nIGluIGRhdGFiYXNlIHRvIGJpZ2ludCBpbiBjb2RlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtiaWdpbnR9XG4gICAqL1xuICBmcm9tKHZhbHVlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gQmlnSW50KHZhbHVlKTtcbiAgfSxcbiAgLyoqXG4gICAqIGNvbnZlcnRzIGRhdGEgZnJvbSBiaWdpbnQgaW4gY29kZSB0byBzdHJpbmcgaW4gZGF0YWJhc2VcbiAgICpcbiAgICogQHBhcmFtIHtiaWdpbnR9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIHRvKHZhbHVlOiBiaWdpbnQpIHtcbiAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTtcbiAgfSxcbn07XG4iXX0=
|
package/dist/utils.js
CHANGED
|
@@ -10,11 +10,11 @@ const JsonBI = JSONBigInt({
|
|
|
10
10
|
*/
|
|
11
11
|
const getWidInfo = (WIDs) => {
|
|
12
12
|
const WIDsArray = WIDs.split(',');
|
|
13
|
-
const hash = Buffer.from(blake2b(WIDsArray.join(''), undefined, 32)).toString('hex');
|
|
13
|
+
const hash = Buffer.from(blake2b(Buffer.from(WIDsArray.join(''), 'hex'), undefined, 32)).toString('hex');
|
|
14
14
|
return {
|
|
15
15
|
WIDsHash: hash,
|
|
16
16
|
WIDsCount: WIDsArray.length,
|
|
17
17
|
};
|
|
18
18
|
};
|
|
19
19
|
export { JsonBI, getWidInfo };
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLFVBQVUsTUFBTSxhQUFhLENBQUM7QUFFckMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDO0lBQ3hCLGVBQWUsRUFBRSxJQUFJO0NBQ3RCLENBQUMsQ0FBQztBQUVIOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFO0lBQ2xDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FDdEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQy9ELENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWxCLE9BQU87UUFDTCxRQUFRLEVBQUUsSUFBSTtRQUNkLFNBQVMsRUFBRSxTQUFTLENBQUMsTUFBTTtLQUM1QixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJsYWtlMmIgfSBmcm9tICdibGFrZWpzJztcbmltcG9ydCBKU09OQmlnSW50IGZyb20gJ2pzb24tYmlnaW50JztcblxuY29uc3QgSnNvbkJJID0gSlNPTkJpZ0ludCh7XG4gIHVzZU5hdGl2ZUJpZ0ludDogdHJ1ZSxcbn0pO1xuXG4vKipcbiAqIGNhbGN1bGF0ZXMgaGFzaCBvZiBXSURzXG4gKiBAcGFyYW0gV0lEc1xuICogQHJldHVybnMgcmV0dXJucyBXSURzSGFzaCB3aXRoIGl0J3MgY291bnRcbiAqL1xuY29uc3QgZ2V0V2lkSW5mbyA9IChXSURzOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgV0lEc0FycmF5ID0gV0lEcy5zcGxpdCgnLCcpO1xuICBjb25zdCBoYXNoID0gQnVmZmVyLmZyb20oXG4gICAgYmxha2UyYihCdWZmZXIuZnJvbShXSURzQXJyYXkuam9pbignJyksICdoZXgnKSwgdW5kZWZpbmVkLCAzMilcbiAgKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgcmV0dXJuIHtcbiAgICBXSURzSGFzaDogaGFzaCxcbiAgICBXSURzQ291bnQ6IFdJRHNBcnJheS5sZW5ndGgsXG4gIH07XG59O1xuXG5leHBvcnQgeyBKc29uQkksIGdldFdpZEluZm8gfTtcbiJdfQ==
|