@my-packages-changeit/watcher-data-extractor 13.0.10
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 +394 -0
- package/README.md +74 -0
- package/dist/actions/collateralAction.d.ts +25 -0
- package/dist/actions/collateralAction.d.ts.map +1 -0
- package/dist/actions/collateralAction.js +34 -0
- package/dist/actions/commitmentAction.d.ts +43 -0
- package/dist/actions/commitmentAction.d.ts.map +1 -0
- package/dist/actions/commitmentAction.js +138 -0
- package/dist/actions/eventTriggerAction.d.ts +29 -0
- package/dist/actions/eventTriggerAction.d.ts.map +1 -0
- package/dist/actions/eventTriggerAction.js +101 -0
- package/dist/actions/permitAction.d.ts +73 -0
- package/dist/actions/permitAction.d.ts.map +1 -0
- package/dist/actions/permitAction.js +187 -0
- package/dist/constants.d.ts +4 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +4 -0
- package/dist/entities/collateralEntity.d.ts +8 -0
- package/dist/entities/collateralEntity.d.ts.map +1 -0
- package/dist/entities/collateralEntity.js +34 -0
- package/dist/entities/commitmentEntity.d.ts +19 -0
- package/dist/entities/commitmentEntity.d.ts.map +1 -0
- package/dist/entities/commitmentEntity.js +93 -0
- package/dist/entities/eventTriggerEntity.d.ts +24 -0
- package/dist/entities/eventTriggerEntity.d.ts.map +1 -0
- package/dist/entities/eventTriggerEntity.js +113 -0
- package/dist/entities/permitEntity.d.ts +14 -0
- package/dist/entities/permitEntity.d.ts.map +1 -0
- package/dist/entities/permitEntity.js +68 -0
- package/dist/extractor/collateralExtractor.d.ts +31 -0
- package/dist/extractor/collateralExtractor.d.ts.map +1 -0
- package/dist/extractor/collateralExtractor.js +72 -0
- package/dist/extractor/commitmentExtractor.d.ts +46 -0
- package/dist/extractor/commitmentExtractor.d.ts.map +1 -0
- package/dist/extractor/commitmentExtractor.js +125 -0
- package/dist/extractor/eventTriggerExtractor.d.ts +57 -0
- package/dist/extractor/eventTriggerExtractor.d.ts.map +1 -0
- package/dist/extractor/eventTriggerExtractor.js +215 -0
- package/dist/extractor/permitExtractor.d.ts +150 -0
- package/dist/extractor/permitExtractor.d.ts.map +1 -0
- package/dist/extractor/permitExtractor.js +235 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/interfaces/extractedCollateral.d.ts +9 -0
- package/dist/interfaces/extractedCollateral.d.ts.map +1 -0
- package/dist/interfaces/extractedCollateral.js +2 -0
- package/dist/interfaces/extractedCommitment.d.ts +11 -0
- package/dist/interfaces/extractedCommitment.d.ts.map +1 -0
- package/dist/interfaces/extractedCommitment.js +2 -0
- package/dist/interfaces/extractedEventTrigger.d.ts +22 -0
- package/dist/interfaces/extractedEventTrigger.d.ts.map +1 -0
- package/dist/interfaces/extractedEventTrigger.js +2 -0
- package/dist/interfaces/extractedPermit.d.ts +12 -0
- package/dist/interfaces/extractedPermit.d.ts.map +1 -0
- package/dist/interfaces/extractedPermit.js +2 -0
- package/dist/interfaces/types.d.ts +25 -0
- package/dist/interfaces/types.d.ts.map +1 -0
- package/dist/interfaces/types.js +2 -0
- package/dist/migrations/index.d.ts +7 -0
- package/dist/migrations/index.d.ts.map +1 -0
- package/dist/migrations/index.js +45 -0
- package/dist/migrations/postgres/1688554842087-migration.d.ts +7 -0
- package/dist/migrations/postgres/1688554842087-migration.d.ts.map +1 -0
- package/dist/migrations/postgres/1688554842087-migration.js +82 -0
- package/dist/migrations/postgres/1689175974257-migration.d.ts +7 -0
- package/dist/migrations/postgres/1689175974257-migration.d.ts.map +1 -0
- package/dist/migrations/postgres/1689175974257-migration.js +50 -0
- package/dist/migrations/postgres/1699874447928-migration.d.ts +7 -0
- package/dist/migrations/postgres/1699874447928-migration.d.ts.map +1 -0
- package/dist/migrations/postgres/1699874447928-migration.js +36 -0
- package/dist/migrations/postgres/1706610773315-migration.d.ts +7 -0
- package/dist/migrations/postgres/1706610773315-migration.d.ts.map +1 -0
- package/dist/migrations/postgres/1706610773315-migration.js +69 -0
- package/dist/migrations/postgres/1709388482275-migration.d.ts +7 -0
- package/dist/migrations/postgres/1709388482275-migration.d.ts.map +1 -0
- package/dist/migrations/postgres/1709388482275-migration.js +29 -0
- package/dist/migrations/postgres/1737785036299-migration.d.ts +7 -0
- package/dist/migrations/postgres/1737785036299-migration.d.ts.map +1 -0
- package/dist/migrations/postgres/1737785036299-migration.js +32 -0
- package/dist/migrations/postgres/1746354253000-migration.d.ts +7 -0
- package/dist/migrations/postgres/1746354253000-migration.d.ts.map +1 -0
- package/dist/migrations/postgres/1746354253000-migration.js +15 -0
- package/dist/migrations/postgres/1758958886549-migration.d.ts +7 -0
- package/dist/migrations/postgres/1758958886549-migration.d.ts.map +1 -0
- package/dist/migrations/postgres/1758958886549-migration.js +30 -0
- package/dist/migrations/postgres/1766843825000-migration.d.ts +7 -0
- package/dist/migrations/postgres/1766843825000-migration.d.ts.map +1 -0
- package/dist/migrations/postgres/1766843825000-migration.js +42 -0
- package/dist/migrations/sqlite/1688555766601-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1688555766601-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1688555766601-migration.js +79 -0
- package/dist/migrations/sqlite/1689175103163-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1689175103163-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1689175103163-migration.js +392 -0
- package/dist/migrations/sqlite/1699872205117-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1699872205117-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1699872205117-migration.js +192 -0
- package/dist/migrations/sqlite/1706610773176-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1706610773176-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1706610773176-migration.js +421 -0
- package/dist/migrations/sqlite/1709388134975-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1709388134975-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1709388134975-migration.js +28 -0
- package/dist/migrations/sqlite/1737547743177-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1737547743177-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1737547743177-migration.js +204 -0
- package/dist/migrations/sqlite/1746354254000-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1746354254000-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1746354254000-migration.js +15 -0
- package/dist/migrations/sqlite/1761774736153-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1761774736153-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1761774736153-migration.js +204 -0
- package/dist/migrations/sqlite/1762768664031-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1762768664031-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1762768664031-migration.js +204 -0
- package/dist/migrations/sqlite/1766843824000-migration.d.ts +7 -0
- package/dist/migrations/sqlite/1766843824000-migration.d.ts.map +1 -0
- package/dist/migrations/sqlite/1766843824000-migration.js +109 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/utils.d.ts +25 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +29 -0
- package/package.json +50 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import * as wasm from 'ergo-lib-wasm-nodejs';
|
|
2
|
+
import { AbstractExtractor } from '@rosen-bridge/abstract-extractor';
|
|
3
|
+
import { DummyLogger } from '@rosen-bridge/abstract-logger';
|
|
4
|
+
import CommitmentAction from '../actions/commitmentAction';
|
|
5
|
+
import { JsonBI } from '../utils';
|
|
6
|
+
class CommitmentExtractor extends AbstractExtractor {
|
|
7
|
+
logger;
|
|
8
|
+
id;
|
|
9
|
+
dataSource;
|
|
10
|
+
commitmentsErgoTrees;
|
|
11
|
+
RWTId;
|
|
12
|
+
actions;
|
|
13
|
+
tokenMap;
|
|
14
|
+
constructor(id, addresses, RWTId, dataSource, tokens, logger) {
|
|
15
|
+
super();
|
|
16
|
+
this.id = id;
|
|
17
|
+
this.dataSource = dataSource;
|
|
18
|
+
this.commitmentsErgoTrees = addresses.map((address) => wasm.Address.from_base58(address).to_ergo_tree().to_base16_bytes());
|
|
19
|
+
this.RWTId = RWTId;
|
|
20
|
+
this.logger = logger ? logger : new DummyLogger();
|
|
21
|
+
this.actions = new CommitmentAction(dataSource, this.logger.child('CommitmentAction'));
|
|
22
|
+
this.tokenMap = tokens;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* get Id for current extractor
|
|
26
|
+
*/
|
|
27
|
+
getId = () => this.id;
|
|
28
|
+
/**
|
|
29
|
+
* gets block id and transactions corresponding to the block and saves if they are valid rosen
|
|
30
|
+
* transactions and in case of success return true and in case of failure returns false
|
|
31
|
+
* @param txs
|
|
32
|
+
* @param block
|
|
33
|
+
*/
|
|
34
|
+
processTransactions = (txs, block) => {
|
|
35
|
+
return new Promise((resolve, reject) => {
|
|
36
|
+
try {
|
|
37
|
+
const commitments = [];
|
|
38
|
+
const spendIds = [];
|
|
39
|
+
txs.forEach((transaction) => {
|
|
40
|
+
// process outputs
|
|
41
|
+
for (const output of transaction.outputs) {
|
|
42
|
+
if (output.assets &&
|
|
43
|
+
output.additionalRegisters &&
|
|
44
|
+
output.assets.length > 0 &&
|
|
45
|
+
output.assets[0].tokenId === this.RWTId &&
|
|
46
|
+
this.commitmentsErgoTrees.indexOf(output.ergoTree) !== -1) {
|
|
47
|
+
try {
|
|
48
|
+
const decodedBox = wasm.ErgoBox.from_json(JsonBI.stringify(output));
|
|
49
|
+
const R4 = decodedBox.register_value(wasm.NonMandatoryRegisterId.R4);
|
|
50
|
+
const R5 = decodedBox.register_value(wasm.NonMandatoryRegisterId.R5);
|
|
51
|
+
const R6 = decodedBox.register_value(wasm.NonMandatoryRegisterId.R6);
|
|
52
|
+
if (R4 && R5 && R6) {
|
|
53
|
+
const R4Value = R4.to_byte_array();
|
|
54
|
+
const R5Value = R5.to_byte_array();
|
|
55
|
+
const R6Value = R6.to_byte_array();
|
|
56
|
+
const WID = Buffer.from(R4Value).toString('hex');
|
|
57
|
+
const requestId = Buffer.from(R5Value).toString('hex');
|
|
58
|
+
const eventDigest = Buffer.from(R6Value).toString('hex');
|
|
59
|
+
commitments.push({
|
|
60
|
+
txId: transaction.id,
|
|
61
|
+
WID: WID,
|
|
62
|
+
commitment: eventDigest,
|
|
63
|
+
eventId: requestId,
|
|
64
|
+
boxId: output.boxId,
|
|
65
|
+
boxSerialized: Buffer.from(decodedBox.sigma_serialize_bytes()).toString('base64'),
|
|
66
|
+
rwtCount: this.tokenMap
|
|
67
|
+
.wrapAmount(this.RWTId, BigInt(output.assets[0].amount), 'ergo')
|
|
68
|
+
.amount.toString(),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// empty
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// process inputs
|
|
78
|
+
for (let i = 0; i < transaction.inputs.length; i++) {
|
|
79
|
+
spendIds.push({
|
|
80
|
+
boxId: transaction.inputs[i].boxId,
|
|
81
|
+
txId: transaction.id,
|
|
82
|
+
index: i,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
// process save commitments
|
|
87
|
+
this.actions
|
|
88
|
+
.storeCommitments(commitments, block, this.id)
|
|
89
|
+
.then(() => {
|
|
90
|
+
this.actions.spendCommitments(spendIds, block, this.id).then(() => {
|
|
91
|
+
resolve(true);
|
|
92
|
+
});
|
|
93
|
+
})
|
|
94
|
+
.catch((e) => reject(e));
|
|
95
|
+
}
|
|
96
|
+
catch (e) {
|
|
97
|
+
this.logger.error(`Error in soring permits of the block ${block}: ${e}`);
|
|
98
|
+
reject(e);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
/**
|
|
103
|
+
* fork one block and remove all stored information for this block
|
|
104
|
+
* @param hash: block hash
|
|
105
|
+
*/
|
|
106
|
+
forkBlock = async (hash) => {
|
|
107
|
+
await this.actions.deleteBlock(hash, this.getId());
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Extractor box initialization
|
|
111
|
+
* No action needed for commitment extractor
|
|
112
|
+
*/
|
|
113
|
+
initializeData = async () => {
|
|
114
|
+
return;
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Builds a query that returns used blocks by selecting the `block` column from the `CommitmentEntity` repository,
|
|
118
|
+
* filtered by the provided `extractorId`
|
|
119
|
+
*
|
|
120
|
+
* @returns A query builder selecting used blocks
|
|
121
|
+
*/
|
|
122
|
+
createUsedBlocksQuery = () => this.actions.createUsedBlocksQuery(this.getId());
|
|
123
|
+
}
|
|
124
|
+
export default CommitmentExtractor;
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWl0bWVudEV4dHJhY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9leHRyYWN0b3IvY29tbWl0bWVudEV4dHJhY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssSUFBSSxNQUFNLHNCQUFzQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBa0IsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFLNUUsT0FBTyxnQkFBZ0IsTUFBTSw2QkFBNkIsQ0FBQztBQUkzRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRWxDLE1BQU0sbUJBQW9CLFNBQVEsaUJBR2pDO0lBQ1UsTUFBTSxDQUFpQjtJQUNoQyxFQUFFLENBQVM7SUFDTSxVQUFVLENBQWE7SUFDdkIsb0JBQW9CLENBQWdCO0lBQ3BDLEtBQUssQ0FBUztJQUNkLE9BQU8sQ0FBbUI7SUFDMUIsUUFBUSxDQUFXO0lBRXBDLFlBQ0UsRUFBVSxFQUNWLFNBQXdCLEVBQ3hCLEtBQWEsRUFDYixVQUFzQixFQUN0QixNQUFnQixFQUNoQixNQUF1QjtRQUV2QixLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUNwRCxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxlQUFlLEVBQUUsQ0FDbkUsQ0FBQztRQUNGLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FB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QUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZix3Q0FBd0MsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUN0RCxDQUFDO2dCQUNGLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNaLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGOzs7T0FHRztJQUNILFNBQVMsR0FBRyxLQUFLLEVBQUUsSUFBWSxFQUFpQixFQUFFO1FBQ2hELE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQztJQUVGOzs7T0FHRztJQUNILGNBQWMsR0FBRyxLQUFLLElBQUksRUFBRTtRQUMxQixPQUFPO0lBQ1QsQ0FBQyxDQUFDO0lBRUY7Ozs7O09BS0c7SUFDSCxxQkFBcUIsR0FBRyxHQUF5QyxFQUFFLENBQ2pFLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7Q0FDcEQ7QUFFRCxlQUFlLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgd2FzbSBmcm9tICdlcmdvLWxpYi13YXNtLW5vZGVqcyc7XG5cbmltcG9ydCB7IEFic3RyYWN0RXh0cmFjdG9yIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1leHRyYWN0b3InO1xuaW1wb3J0IHsgQWJzdHJhY3RMb2dnZXIsIER1bW15TG9nZ2VyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1sb2dnZXInO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSwgU2VsZWN0UXVlcnlCdWlsZGVyIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9leHRlbmRlZC10eXBlb3JtJztcbmltcG9ydCB7IEJsb2NrSW5mbywgVHJhbnNhY3Rpb24gfSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBUb2tlbk1hcCB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvdG9rZW5zJztcblxuaW1wb3J0IENvbW1pdG1lbnRBY3Rpb24gZnJvbSAnLi4vYWN0aW9ucy9jb21taXRtZW50QWN0aW9uJztcbmltcG9ydCBDb21taXRtZW50RW50aXR5IGZyb20gJy4uL2VudGl0aWVzL2NvbW1pdG1lbnRFbnRpdHknO1xuaW1wb3J0IHsgZXh0cmFjdGVkQ29tbWl0bWVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZXh0cmFjdGVkQ29tbWl0bWVudCc7XG5pbXBvcnQgeyBTcGVuZEluZm8gfSBmcm9tICcuLi9pbnRlcmZhY2VzL3R5cGVzJztcbmltcG9ydCB7IEpzb25CSSB9IGZyb20gJy4uL3V0aWxzJztcblxuY2xhc3MgQ29tbWl0bWVudEV4dHJhY3RvciBleHRlbmRzIEFic3RyYWN0RXh0cmFjdG9yPFxuICBUcmFuc2FjdGlvbixcbiAgQ29tbWl0bWVudEVudGl0eVxuPiB7XG4gIHJlYWRvbmx5IGxvZ2dlcjogQWJzdHJhY3RMb2dnZXI7XG4gIGlkOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YVNvdXJjZTogRGF0YVNvdXJjZTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb21taXRtZW50c0VyZ29UcmVlczogQXJyYXk8c3RyaW5nPjtcbiAgcHJpdmF0ZSByZWFkb25seSBSV1RJZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGFjdGlvbnM6IENvbW1pdG1lbnRBY3Rpb247XG4gIHByaXZhdGUgcmVhZG9ubHkgdG9rZW5NYXA6IFRva2VuTWFwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgYWRkcmVzc2VzOiBBcnJheTxzdHJpbmc+LFxuICAgIFJXVElkOiBzdHJpbmcsXG4gICAgZGF0YVNvdXJjZTogRGF0YVNvdXJjZSxcbiAgICB0b2tlbnM6IFRva2VuTWFwLFxuICAgIGxvZ2dlcj86IEFic3RyYWN0TG9nZ2VyLFxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLmRhdGFTb3VyY2UgPSBkYXRhU291cmNlO1xuICAgIHRoaXMuY29tbWl0bWVudHNFcmdvVHJlZXMgPSBhZGRyZXNzZXMubWFwKChhZGRyZXNzKSA9PlxuICAgICAgd2FzbS5BZGRyZXNzLmZyb21fYmFzZTU4KGFkZHJlc3MpLnRvX2VyZ29fdHJlZSgpLnRvX2Jhc2UxNl9ieXRlcygpLFxuICAgICk7XG4gICAgdGhpcy5SV1RJZCA9IFJXVElkO1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyID8gbG9nZ2VyIDogbmV3IER1bW15TG9nZ2VyKCk7XG4gICAgdGhpcy5hY3Rpb25zID0gbmV3IENvbW1pdG1lbnRBY3Rpb24oXG4gICAgICBkYXRhU291cmNlLFxuICAgICAgdGhpcy5sb2dnZXIuY2hpbGQoJ0NvbW1pdG1lbnRBY3Rpb24nKSxcbiAgICApO1xuICAgIHRoaXMudG9rZW5NYXAgPSB0b2tlbnM7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IElkIGZvciBjdXJyZW50IGV4dHJhY3RvclxuICAgKi9cbiAgZ2V0SWQgPSAoKSA9PiB0aGlzLmlkO1xuXG4gIC8qKlxuICAgKiBnZXRzIGJsb2NrIGlkIGFuZCB0cmFuc2FjdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGUgYmxvY2sgYW5kIHNhdmVzIGlmIHRoZXkgYXJlIHZhbGlkIHJvc2VuXG4gICAqICB0cmFuc2FjdGlvbnMgYW5kIGluIGNhc2Ugb2Ygc3VjY2VzcyByZXR1cm4gdHJ1ZSBhbmQgaW4gY2FzZSBvZiBmYWlsdXJlIHJldHVybnMgZmFsc2VcbiAgICogQHBhcmFtIHR4c1xuICAgKiBAcGFyYW0gYmxvY2tcbiAgICovXG4gIHByb2Nlc3NUcmFuc2FjdGlvbnMgPSAoXG4gICAgdHhzOiBBcnJheTxUcmFuc2FjdGlvbj4sXG4gICAgYmxvY2s6IEJsb2NrSW5mbyxcbiAgKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbW1pdG1lbnRzOiBBcnJheTxleHRyYWN0ZWRDb21taXRtZW50PiA9IFtdO1xuICAgICAgICBjb25zdCBzcGVuZElkczogQXJyYXk8U3BlbmRJbmZvPiA9IFtdO1xuICAgICAgICB0eHMuZm9yRWFjaCgodHJhbnNhY3Rpb24pID0+IHtcbiAgICAgICAgICAvLyBwcm9jZXNzIG91dHB1dHNcbiAgICAgICAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiB0cmFuc2FjdGlvbi5vdXRwdXRzKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIG91dHB1dC5hc3NldHMgJiZcbiAgICAgICAgICAgICAgb3V0cHV0LmFkZGl0aW9uYWxSZWdpc3RlcnMgJiZcbiAgICAgICAgICAgICAgb3V0cHV0LmFzc2V0cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgIG91dHB1dC5hc3NldHNbMF0udG9rZW5JZCA9PT0gdGhpcy5SV1RJZCAmJlxuICAgICAgICAgICAgICB0aGlzLmNvbW1pdG1lbnRzRXJnb1RyZWVzLmluZGV4T2Yob3V0cHV0LmVyZ29UcmVlKSAhPT0gLTFcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29kZWRCb3ggPSB3YXNtLkVyZ29Cb3guZnJvbV9qc29uKFxuICAgICAgICAgICAgICAgICAgSnNvbkJJLnN0cmluZ2lmeShvdXRwdXQpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgUjQgPSBkZWNvZGVkQm94LnJlZ2lzdGVyX3ZhbHVlKFxuICAgICAgICAgICAgICAgICAgd2FzbS5Ob25NYW5kYXRvcnlSZWdpc3RlcklkLlI0LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgUjUgPSBkZWNvZGVkQm94LnJlZ2lzdGVyX3ZhbHVlKFxuICAgICAgICAgICAgICAgICAgd2FzbS5Ob25NYW5kYXRvcnlSZWdpc3RlcklkLlI1LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgUjYgPSBkZWNvZGVkQm94LnJlZ2lzdGVyX3ZhbHVlKFxuICAgICAgICAgICAgICAgICAgd2FzbS5Ob25NYW5kYXRvcnlSZWdpc3RlcklkLlI2LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKFI0ICYmIFI1ICYmIFI2KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBSNFZhbHVlID0gUjQudG9fYnl0ZV9hcnJheSgpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgUjVWYWx1ZSA9IFI1LnRvX2J5dGVfYXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IFI2VmFsdWUgPSBSNi50b19ieXRlX2FycmF5KCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBXSUQgPSBCdWZmZXIuZnJvbShSNFZhbHVlKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSBCdWZmZXIuZnJvbShSNVZhbHVlKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBldmVudERpZ2VzdCA9IEJ1ZmZlci5mcm9tKFI2VmFsdWUpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgICAgICAgICAgIGNvbW1pdG1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICB0eElkOiB0cmFuc2FjdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgV0lEOiBXSUQsXG4gICAgICAgICAgICAgICAgICAgIGNvbW1pdG1lbnQ6IGV2ZW50RGlnZXN0LFxuICAgICAgICAgICAgICAgICAgICBldmVudElkOiByZXF1ZXN0SWQsXG4gICAgICAgICAgICAgICAgICAgIGJveElkOiBvdXRwdXQuYm94SWQsXG4gICAgICAgICAgICAgICAgICAgIGJveFNlcmlhbGl6ZWQ6IEJ1ZmZlci5mcm9tKFxuICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRCb3guc2lnbWFfc2VyaWFsaXplX2J5dGVzKCksXG4gICAgICAgICAgICAgICAgICAgICkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgICAgICAgICAgICAgICAgICByd3RDb3VudDogdGhpcy50b2tlbk1hcFxuICAgICAgICAgICAgICAgICAgICAgIC53cmFwQW1vdW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5SV1RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludChvdXRwdXQuYXNzZXRzWzBdLmFtb3VudCksXG4gICAgICAgICAgICAgICAgICAgICAgICAnZXJnbycsXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIC5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgLy8gZW1wdHlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBwcm9jZXNzIGlucHV0c1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHJhbnNhY3Rpb24uaW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzcGVuZElkcy5wdXNoKHtcbiAgICAgICAgICAgICAgYm94SWQ6IHRyYW5zYWN0aW9uLmlucHV0c1tpXS5ib3hJZCxcbiAgICAgICAgICAgICAgdHhJZDogdHJhbnNhY3Rpb24uaWQsXG4gICAgICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gcHJvY2VzcyBzYXZlIGNvbW1pdG1lbnRzXG4gICAgICAgIHRoaXMuYWN0aW9uc1xuICAgICAgICAgIC5zdG9yZUNvbW1pdG1lbnRzKGNvbW1pdG1lbnRzLCBibG9jaywgdGhpcy5pZClcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbnMuc3BlbmRDb21taXRtZW50cyhzcGVuZElkcywgYmxvY2ssIHRoaXMuaWQpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGUpID0+IHJlamVjdChlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBFcnJvciBpbiBzb3JpbmcgcGVybWl0cyBvZiB0aGUgYmxvY2sgJHtibG9ja306ICR7ZX1gLFxuICAgICAgICApO1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIGZvcmsgb25lIGJsb2NrIGFuZCByZW1vdmUgYWxsIHN0b3JlZCBpbmZvcm1hdGlvbiBmb3IgdGhpcyBibG9ja1xuICAgKiBAcGFyYW0gaGFzaDogYmxvY2sgaGFzaFxuICAgKi9cbiAgZm9ya0Jsb2NrID0gYXN5bmMgKGhhc2g6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGF3YWl0IHRoaXMuYWN0aW9ucy5kZWxldGVCbG9jayhoYXNoLCB0aGlzLmdldElkKCkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFeHRyYWN0b3IgYm94IGluaXRpYWxpemF0aW9uXG4gICAqIE5vIGFjdGlvbiBuZWVkZWQgZm9yIGNvbW1pdG1lbnQgZXh0cmFjdG9yXG4gICAqL1xuICBpbml0aWFsaXplRGF0YSA9IGFzeW5jICgpID0+IHtcbiAgICByZXR1cm47XG4gIH07XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHF1ZXJ5IHRoYXQgcmV0dXJucyB1c2VkIGJsb2NrcyBieSBzZWxlY3RpbmcgdGhlIGBibG9ja2AgY29sdW1uIGZyb20gdGhlIGBDb21taXRtZW50RW50aXR5YCByZXBvc2l0b3J5LFxuICAgKiBmaWx0ZXJlZCBieSB0aGUgcHJvdmlkZWQgYGV4dHJhY3RvcklkYFxuICAgKlxuICAgKiBAcmV0dXJucyBBIHF1ZXJ5IGJ1aWxkZXIgc2VsZWN0aW5nIHVzZWQgYmxvY2tzXG4gICAqL1xuICBjcmVhdGVVc2VkQmxvY2tzUXVlcnkgPSAoKTogU2VsZWN0UXVlcnlCdWlsZGVyPENvbW1pdG1lbnRFbnRpdHk+ID0+XG4gICAgdGhpcy5hY3Rpb25zLmNyZWF0ZVVzZWRCbG9ja3NRdWVyeSh0aGlzLmdldElkKCkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBDb21taXRtZW50RXh0cmFjdG9yO1xuIl19
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { AbstractErgoBoxExtractor } from '@rosen-bridge/abstract-extractor';
|
|
2
|
+
import { AbstractLogger } from '@rosen-bridge/abstract-logger';
|
|
3
|
+
import { DataSource } from '@rosen-bridge/extended-typeorm';
|
|
4
|
+
import { BlockInfo, ErgoNetworkType, OutputBox, Transaction } from '@rosen-bridge/scanner-interfaces';
|
|
5
|
+
import EventTriggerAction from '../actions/eventTriggerAction';
|
|
6
|
+
import EventTriggerEntity from '../entities/eventTriggerEntity';
|
|
7
|
+
import { ExtractedEventTrigger } from '../interfaces/extractedEventTrigger';
|
|
8
|
+
import { EventResult } from '../types';
|
|
9
|
+
declare class EventTriggerExtractor extends AbstractErgoBoxExtractor<ExtractedEventTrigger, EventTriggerEntity> {
|
|
10
|
+
id: string;
|
|
11
|
+
protected readonly actions: EventTriggerAction;
|
|
12
|
+
private readonly eventTriggerErgoTree;
|
|
13
|
+
private readonly permitErgoTree;
|
|
14
|
+
private readonly fraudErgoTree;
|
|
15
|
+
private readonly RWT;
|
|
16
|
+
constructor(id: string, dataSource: DataSource, type: ErgoNetworkType, url: string, address: string, RWT: string, permitAddress: string, fraudAddress: string, logger?: AbstractLogger, initialize?: boolean);
|
|
17
|
+
/**
|
|
18
|
+
* get Id for current extractor
|
|
19
|
+
*/
|
|
20
|
+
getId: () => string;
|
|
21
|
+
/**
|
|
22
|
+
* check proper data format in the box
|
|
23
|
+
* - box ergoTree
|
|
24
|
+
* - RWT in first token place
|
|
25
|
+
* - widListHash in R4
|
|
26
|
+
* - event data in R5
|
|
27
|
+
* - widCount in R7
|
|
28
|
+
* @param box
|
|
29
|
+
* @return true if the box has the required data and false otherwise
|
|
30
|
+
*/
|
|
31
|
+
hasBoxData: (box: OutputBox) => boolean;
|
|
32
|
+
/**
|
|
33
|
+
* extract box data to proper format (not including spending information)
|
|
34
|
+
* @param box
|
|
35
|
+
* @return extracted data in proper format
|
|
36
|
+
*/
|
|
37
|
+
extractBoxData: (box: OutputBox) => Omit<ExtractedEventTrigger, "spendBlock" | "spendHeight"> | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* gets block id and transactions corresponding to the block and saves if they are valid rosen
|
|
40
|
+
* transactions and in case of success return true and in case of failure returns false
|
|
41
|
+
* @param block
|
|
42
|
+
* @param txs
|
|
43
|
+
*/
|
|
44
|
+
processTransactions: (txs: Array<Transaction>, block: BlockInfo) => Promise<boolean>;
|
|
45
|
+
/**
|
|
46
|
+
* extracts result and paymentTxId from a transaction
|
|
47
|
+
* returns 'unknown' as result when tx is neither fraud or successful
|
|
48
|
+
* @param transaction
|
|
49
|
+
* @returns
|
|
50
|
+
*/
|
|
51
|
+
protected extractEventResult: (transaction: Transaction) => {
|
|
52
|
+
result: EventResult;
|
|
53
|
+
paymentTxId: string;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export default EventTriggerExtractor;
|
|
57
|
+
//# sourceMappingURL=eventTriggerExtractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventTriggerExtractor.d.ts","sourceRoot":"","sources":["../../lib/extractor/eventTriggerExtractor.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,wBAAwB,EAGzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EACL,SAAS,EACT,eAAe,EACf,SAAS,EACT,WAAW,EACZ,MAAM,kCAAkC,CAAC;AAE1C,OAAO,kBAAkB,MAAM,+BAA+B,CAAC;AAC/D,OAAO,kBAAkB,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGvC,cAAM,qBAAsB,SAAQ,wBAAwB,CAC1D,qBAAqB,EACrB,kBAAkB,CACnB;IACC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IAC/C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;gBAG3B,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,eAAe,EACrB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,cAAc,EACvB,UAAU,UAAO;IAoBnB;;OAEG;IACH,KAAK,eAAiB;IAEtB;;;;;;;;;OASG;IACH,UAAU,GAAI,KAAK,SAAS,KAAG,OAAO,CA2BpC;IAEF;;;;OAIG;IACH,cAAc,GACZ,KAAK,SAAS,KACb,IAAI,CAAC,qBAAqB,EAAE,YAAY,GAAG,aAAa,CAAC,GAAG,SAAS,CAwDtE;IAEF;;;;;OAKG;IACH,mBAAmB,GACjB,KAAK,KAAK,CAAC,WAAW,CAAC,EACvB,OAAO,SAAS,KACf,OAAO,CAAC,OAAO,CAAC,CAyDjB;IAEF;;;;;OAKG;IACH,SAAS,CAAC,kBAAkB,GAAI,aAAa,WAAW;;;MA0CtD;CACH;AAED,eAAe,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { blake2b } from 'blakejs';
|
|
2
|
+
import * as wasm from 'ergo-lib-wasm-nodejs';
|
|
3
|
+
import { AbstractErgoBoxExtractor, CallbackType, } from '@rosen-bridge/abstract-extractor';
|
|
4
|
+
import EventTriggerAction from '../actions/eventTriggerAction';
|
|
5
|
+
import { EventResult } from '../types';
|
|
6
|
+
import { JsonBI } from '../utils';
|
|
7
|
+
class EventTriggerExtractor extends AbstractErgoBoxExtractor {
|
|
8
|
+
id;
|
|
9
|
+
actions;
|
|
10
|
+
eventTriggerErgoTree;
|
|
11
|
+
permitErgoTree;
|
|
12
|
+
fraudErgoTree;
|
|
13
|
+
RWT;
|
|
14
|
+
constructor(id, dataSource, type, url, address, RWT, permitAddress, fraudAddress, logger, initialize = true) {
|
|
15
|
+
super({ type, url, address, active: initialize }, logger);
|
|
16
|
+
this.id = id;
|
|
17
|
+
this.eventTriggerErgoTree = wasm.Address.from_base58(address)
|
|
18
|
+
.to_ergo_tree()
|
|
19
|
+
.to_base16_bytes();
|
|
20
|
+
this.permitErgoTree = wasm.Address.from_base58(permitAddress)
|
|
21
|
+
.to_ergo_tree()
|
|
22
|
+
.to_base16_bytes();
|
|
23
|
+
this.fraudErgoTree = wasm.Address.from_base58(fraudAddress)
|
|
24
|
+
.to_ergo_tree()
|
|
25
|
+
.to_base16_bytes();
|
|
26
|
+
this.RWT = RWT;
|
|
27
|
+
this.actions = new EventTriggerAction(dataSource, this.logger.child('EventTriggerAction'));
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* get Id for current extractor
|
|
31
|
+
*/
|
|
32
|
+
getId = () => this.id;
|
|
33
|
+
/**
|
|
34
|
+
* check proper data format in the box
|
|
35
|
+
* - box ergoTree
|
|
36
|
+
* - RWT in first token place
|
|
37
|
+
* - widListHash in R4
|
|
38
|
+
* - event data in R5
|
|
39
|
+
* - widCount in R7
|
|
40
|
+
* @param box
|
|
41
|
+
* @return true if the box has the required data and false otherwise
|
|
42
|
+
*/
|
|
43
|
+
hasBoxData = (box) => {
|
|
44
|
+
try {
|
|
45
|
+
if (box.additionalRegisters &&
|
|
46
|
+
box.additionalRegisters.R4 &&
|
|
47
|
+
box.additionalRegisters.R5 &&
|
|
48
|
+
box.additionalRegisters.R7 &&
|
|
49
|
+
box.assets &&
|
|
50
|
+
box.assets.length > 0 &&
|
|
51
|
+
box.assets[0].tokenId === this.RWT &&
|
|
52
|
+
box.ergoTree === this.eventTriggerErgoTree) {
|
|
53
|
+
const parsedBox = wasm.ErgoBox.from_json(JsonBI.stringify(box));
|
|
54
|
+
const R4Serialized = parsedBox
|
|
55
|
+
.register_value(wasm.NonMandatoryRegisterId.R4)
|
|
56
|
+
.to_byte_array();
|
|
57
|
+
const R5Serialized = parsedBox
|
|
58
|
+
.register_value(wasm.NonMandatoryRegisterId.R5)
|
|
59
|
+
.to_coll_coll_byte();
|
|
60
|
+
if (R4Serialized.length >= 1 && R5Serialized.length >= 12)
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
this.logger.warn(`Unexpected error occurred while checking the proper trigger data format for box ${box.boxId}: ${e}`);
|
|
66
|
+
}
|
|
67
|
+
return false;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* extract box data to proper format (not including spending information)
|
|
71
|
+
* @param box
|
|
72
|
+
* @return extracted data in proper format
|
|
73
|
+
*/
|
|
74
|
+
extractBoxData = (box) => {
|
|
75
|
+
try {
|
|
76
|
+
const parsedBox = wasm.ErgoBox.from_json(JsonBI.stringify(box));
|
|
77
|
+
const R4Serialized = parsedBox
|
|
78
|
+
.register_value(wasm.NonMandatoryRegisterId.R4)
|
|
79
|
+
.to_byte_array();
|
|
80
|
+
const R5Serialized = parsedBox
|
|
81
|
+
.register_value(wasm.NonMandatoryRegisterId.R5)
|
|
82
|
+
.to_coll_coll_byte();
|
|
83
|
+
const WIDsCount = parsedBox
|
|
84
|
+
.register_value(wasm.NonMandatoryRegisterId.R7)
|
|
85
|
+
.to_i32();
|
|
86
|
+
const WIDsHash = Buffer.from(R4Serialized).toString('hex');
|
|
87
|
+
const sourceTxId = Buffer.from(R5Serialized[0]).toString();
|
|
88
|
+
const eventId = Buffer.from(blake2b(sourceTxId, undefined, 32)).toString('hex');
|
|
89
|
+
return {
|
|
90
|
+
eventId: eventId,
|
|
91
|
+
txId: box.transactionId,
|
|
92
|
+
identifier: box.boxId,
|
|
93
|
+
serialized: Buffer.from(parsedBox.sigma_serialize_bytes()).toString('base64'),
|
|
94
|
+
toChain: Buffer.from(R5Serialized[2]).toString(),
|
|
95
|
+
toAddress: Buffer.from(R5Serialized[4]).toString(),
|
|
96
|
+
networkFee: BigInt('0x' + Buffer.from(R5Serialized[7]).toString('hex')).toString(10),
|
|
97
|
+
bridgeFee: BigInt('0x' + Buffer.from(R5Serialized[6]).toString('hex')).toString(10),
|
|
98
|
+
amount: BigInt('0x' + Buffer.from(R5Serialized[5]).toString('hex')).toString(10),
|
|
99
|
+
sourceChainTokenId: Buffer.from(R5Serialized[8]).toString(),
|
|
100
|
+
targetChainTokenId: Buffer.from(R5Serialized[9]).toString(),
|
|
101
|
+
sourceTxId: sourceTxId,
|
|
102
|
+
fromChain: Buffer.from(R5Serialized[1]).toString(),
|
|
103
|
+
fromAddress: Buffer.from(R5Serialized[3]).toString(),
|
|
104
|
+
sourceBlockId: Buffer.from(R5Serialized[10]).toString(),
|
|
105
|
+
WIDsCount: WIDsCount,
|
|
106
|
+
WIDsHash: WIDsHash,
|
|
107
|
+
sourceChainHeight: Number(BigInt('0x' + Buffer.from(R5Serialized[11]).toString('hex')).toString(10)),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
this.logger.warn(`Unexpected error occurred while extracting trigger data for box ${box.boxId}: ${e}`);
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* gets block id and transactions corresponding to the block and saves if they are valid rosen
|
|
117
|
+
* transactions and in case of success return true and in case of failure returns false
|
|
118
|
+
* @param block
|
|
119
|
+
* @param txs
|
|
120
|
+
*/
|
|
121
|
+
processTransactions = async (txs, block) => {
|
|
122
|
+
try {
|
|
123
|
+
const boxes = [];
|
|
124
|
+
const spendInfoArray = [];
|
|
125
|
+
txs.forEach((transaction) => {
|
|
126
|
+
// extract event result
|
|
127
|
+
const { result, paymentTxId } = this.extractEventResult(transaction);
|
|
128
|
+
for (const output of transaction.outputs) {
|
|
129
|
+
// extract output box data
|
|
130
|
+
if (this.hasBoxData(output)) {
|
|
131
|
+
this.logger.debug(`Trying to extract data from box ${output.boxId} at height ${block.height}`);
|
|
132
|
+
const data = this.extractBoxData(output);
|
|
133
|
+
if (data) {
|
|
134
|
+
this.logger.debug(`Extracted data ${JsonBI.stringify(data)} from box ${output.boxId}`);
|
|
135
|
+
boxes.push(data);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// process inputs
|
|
140
|
+
for (let index = 0; index < transaction.inputs.length; index++)
|
|
141
|
+
spendInfoArray.push({
|
|
142
|
+
txId: transaction.id,
|
|
143
|
+
boxId: transaction.inputs[index].boxId,
|
|
144
|
+
index: index,
|
|
145
|
+
extras: { result, paymentTxId },
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
if (boxes.length > 0) {
|
|
149
|
+
if (!(await this.actions.storeEntities(boxes, block, this.getId()))) {
|
|
150
|
+
this.logger.warn(`Data insertion failed at height ${block.height} for extractor ${this.id}`);
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
this.triggerCallbacks(CallbackType.Insert, boxes);
|
|
154
|
+
}
|
|
155
|
+
const spentData = await this.actions.spendBoxes(spendInfoArray, block, this.id);
|
|
156
|
+
this.triggerCallbacks(CallbackType.Spend, spentData);
|
|
157
|
+
}
|
|
158
|
+
catch (e) {
|
|
159
|
+
this.logger.error(`Error in storing data in ${this.getId()} of the block ${block.height}: ${e}`);
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
return true;
|
|
163
|
+
};
|
|
164
|
+
/**
|
|
165
|
+
* extracts result and paymentTxId from a transaction
|
|
166
|
+
* returns 'unknown' as result when tx is neither fraud or successful
|
|
167
|
+
* @param transaction
|
|
168
|
+
* @returns
|
|
169
|
+
*/
|
|
170
|
+
extractEventResult = (transaction) => {
|
|
171
|
+
let result = EventResult.unknown;
|
|
172
|
+
let paymentTxId = '';
|
|
173
|
+
if (transaction.outputs[0].ergoTree === this.fraudErgoTree)
|
|
174
|
+
result = EventResult.fraud;
|
|
175
|
+
else if (transaction.outputs[0].ergoTree === this.permitErgoTree) {
|
|
176
|
+
result = EventResult.successful;
|
|
177
|
+
// find first non-watcher box with R4 value
|
|
178
|
+
for (const box of transaction.outputs) {
|
|
179
|
+
// if it's watcher box, skip it
|
|
180
|
+
if (box.ergoTree === this.permitErgoTree)
|
|
181
|
+
continue;
|
|
182
|
+
const outputParsed = wasm.ErgoBox.from_json(JsonBI.stringify(box));
|
|
183
|
+
try {
|
|
184
|
+
const R4Serialized = outputParsed
|
|
185
|
+
.register_value(wasm.NonMandatoryRegisterId.R4)
|
|
186
|
+
?.to_byte_array();
|
|
187
|
+
if (R4Serialized !== undefined) {
|
|
188
|
+
let txId = Buffer.from(R4Serialized).toString();
|
|
189
|
+
// we assumed txId only includes these characters
|
|
190
|
+
if (!txId.match(/^[0-9a-zA-Z\-_.]+$/)) {
|
|
191
|
+
// backward compatibility
|
|
192
|
+
txId = Buffer.from(R4Serialized).toString('hex');
|
|
193
|
+
}
|
|
194
|
+
paymentTxId = txId;
|
|
195
|
+
if (txId === '') {
|
|
196
|
+
paymentTxId = transaction.id;
|
|
197
|
+
this.logger.debug(`successful event is spent. tx [${transaction.id}] is both payment and reward distribution tx`);
|
|
198
|
+
}
|
|
199
|
+
// paymentTxId is extracted. no need to process next boxes
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return {
|
|
209
|
+
result,
|
|
210
|
+
paymentTxId,
|
|
211
|
+
};
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
export default EventTriggerExtractor;
|
|
215
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRUcmlnZ2VyRXh0cmFjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2V4dHJhY3Rvci9ldmVudFRyaWdnZXJFeHRyYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEtBQUssSUFBSSxNQUFNLHNCQUFzQixDQUFDO0FBRTdDLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsWUFBWSxHQUViLE1BQU0sa0NBQWtDLENBQUM7QUFVMUMsT0FBTyxrQkFBa0IsTUFBTSwrQkFBK0IsQ0FBQztBQUcvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFbEMsTUFBTSxxQkFBc0IsU0FBUSx3QkFHbkM7SUFDQyxFQUFFLENBQVM7SUFDUSxPQUFPLENBQXFCO0lBQzlCLG9CQUFvQixDQUFTO0lBQzdCLGNBQWMsQ0FBUztJQUN2QixhQUFhLENBQVM7SUFDdEIsR0FBRyxDQUFTO0lBRTdCLFlBQ0UsRUFBVSxFQUNWLFVBQXNCLEVBQ3RCLElBQXFCLEVBQ3JCLEdBQVcsRUFDWCxPQUFlLEVBQ2YsR0FBVyxFQUNYLGFBQXFCLEVBQ3JCLFlBQW9CLEVBQ3BCLE1BQXVCLEVBQ3ZCLFVBQVUsR0FBRyxJQUFJO1FBRWpCLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUM7YUFDMUQsWUFBWSxFQUFFO2FBQ2QsZUFBZSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLGNBQWMs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dEMseUJBQXlCOzRCQUN6QixJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ25ELENBQUM7d0JBQ0QsV0FBVyxHQUFHLElBQUksQ0FBQzt3QkFDbkIsSUFBSSxJQUFJLEtBQUssRUFBRSxFQUFFLENBQUM7NEJBQ2hCLFdBQVcsR0FBRyxXQUFXLENBQUMsRUFBRSxDQUFDOzRCQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDZixrQ0FBa0MsV0FBVyxDQUFDLEVBQUUsOENBQThDLENBQy9GLENBQUM7d0JBQ0osQ0FBQzt3QkFDRCwwREFBMEQ7d0JBQzFELE1BQU07b0JBQ1IsQ0FBQztnQkFDSCxDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCxTQUFTO2dCQUNYLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU87WUFDTCxNQUFNO1lBQ04sV0FBVztTQUNaLENBQUM7SUFDSixDQUFDLENBQUM7Q0FDSDtBQUVELGVBQWUscUJBQXFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBibGFrZTJiIH0gZnJvbSAnYmxha2Vqcyc7XG5pbXBvcnQgKiBhcyB3YXNtIGZyb20gJ2VyZ28tbGliLXdhc20tbm9kZWpzJztcblxuaW1wb3J0IHtcbiAgQWJzdHJhY3RFcmdvQm94RXh0cmFjdG9yLFxuICBDYWxsYmFja1R5cGUsXG4gIFNwZW5kSW5mbyxcbn0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1leHRyYWN0b3InO1xuaW1wb3J0IHsgQWJzdHJhY3RMb2dnZXIgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2Fic3RyYWN0LWxvZ2dlcic7XG5pbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9leHRlbmRlZC10eXBlb3JtJztcbmltcG9ydCB7XG4gIEJsb2NrSW5mbyxcbiAgRXJnb05ldHdvcmtUeXBlLFxuICBPdXRwdXRCb3gsXG4gIFRyYW5zYWN0aW9uLFxufSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5cbmltcG9ydCBFdmVudFRyaWdnZXJBY3Rpb24gZnJvbSAnLi4vYWN0aW9ucy9ldmVudFRyaWdnZXJBY3Rpb24nO1xuaW1wb3J0IEV2ZW50VHJpZ2dlckVudGl0eSBmcm9tICcuLi9lbnRpdGllcy9ldmVudFRyaWdnZXJFbnRpdHknO1xuaW1wb3J0IHsgRXh0cmFjdGVkRXZlbnRUcmlnZ2VyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9leHRyYWN0ZWRFdmVudFRyaWdnZXInO1xuaW1wb3J0IHsgRXZlbnRSZXN1bHQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBKc29uQkkgfSBmcm9tICcuLi91dGlscyc7XG5cbmNsYXNzIEV2ZW50VHJpZ2dlckV4dHJhY3RvciBleHRlbmRzIEFic3RyYWN0RXJnb0JveEV4dHJhY3RvcjxcbiAgRXh0cmFjdGVkRXZlbnRUcmlnZ2VyLFxuICBFdmVudFRyaWdnZXJFbnRpdHlcbj4ge1xuICBpZDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWN0aW9uczogRXZlbnRUcmlnZ2VyQWN0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50VHJpZ2dlckVyZ29UcmVlOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVybWl0RXJnb1RyZWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBmcmF1ZEVyZ29UcmVlOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgUldUOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBkYXRhU291cmNlOiBEYXRhU291cmNlLFxuICAgIHR5cGU6IEVyZ29OZXR3b3JrVHlwZSxcbiAgICB1cmw6IHN0cmluZyxcbiAgICBhZGRyZXNzOiBzdHJpbmcsXG4gICAgUldUOiBzdHJpbmcsXG4gICAgcGVybWl0QWRkcmVzczogc3RyaW5nLFxuICAgIGZyYXVkQWRkcmVzczogc3RyaW5nLFxuICAgIGxvZ2dlcj86IEFic3RyYWN0TG9nZ2VyLFxuICAgIGluaXRpYWxpemUgPSB0cnVlLFxuICApIHtcbiAgICBzdXBlcih7IHR5cGUsIHVybCwgYWRkcmVzcywgYWN0aXZlOiBpbml0aWFsaXplIH0sIGxvZ2dlcik7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMuZXZlbnRUcmlnZ2VyRXJnb1RyZWUgPSB3YXNtLkFkZHJlc3MuZnJvbV9iYXNlNTgoYWRkcmVzcylcbiAgICAgIC50b19lcmdvX3RyZWUoKVxuICAgICAgLnRvX2Jhc2UxNl9ieXRlcygpO1xuICAgIHRoaXMucGVybWl0RXJnb1RyZWUgPSB3YXNtLkFkZHJlc3MuZnJvbV9iYXNlNTgocGVybWl0QWRkcmVzcylcbiAgICAgIC50b19lcmdvX3RyZWUoKVxuICAgICAgLnRvX2Jhc2UxNl9ieXRlcygpO1xuICAgIHRoaXMuZnJhdWRFcmdvVHJlZSA9IHdhc20uQWRkcmVzcy5mcm9tX2Jhc2U1OChmcmF1ZEFkZHJlc3MpXG4gICAgICAudG9fZXJnb190cmVlKClcbiAgICAgIC50b19iYXNlMTZfYnl0ZXMoKTtcbiAgICB0aGlzLlJXVCA9IFJXVDtcbiAgICB0aGlzLmFjdGlvbnMgPSBuZXcgRXZlbnRUcmlnZ2VyQWN0aW9uKFxuICAgICAgZGF0YVNvdXJjZSxcbiAgICAgIHRoaXMubG9nZ2VyLmNoaWxkKCdFdmVudFRyaWdnZXJBY3Rpb24nKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCBJZCBmb3IgY3VycmVudCBleHRyYWN0b3JcbiAgICovXG4gIGdldElkID0gKCkgPT4gdGhpcy5pZDtcblxuICAvKipcbiAgICogY2hlY2sgcHJvcGVyIGRhdGEgZm9ybWF0IGluIHRoZSBib3hcbiAgICogIC0gYm94IGVyZ29UcmVlXG4gICAqICAtIFJXVCBpbiBmaXJzdCB0b2tlbiBwbGFjZVxuICAgKiAgLSB3aWRMaXN0SGFzaCBpbiBSNFxuICAgKiAgLSBldmVudCBkYXRhIGluIFI1XG4gICAqICAtIHdpZENvdW50IGluIFI3XG4gICAqIEBwYXJhbSBib3hcbiAgICogQHJldHVybiB0cnVlIGlmIHRoZSBib3ggaGFzIHRoZSByZXF1aXJlZCBkYXRhIGFuZCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIGhhc0JveERhdGEgPSAoYm94OiBPdXRwdXRCb3gpOiBib29sZWFuID0+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKFxuICAgICAgICBib3guYWRkaXRpb25hbFJlZ2lzdGVycyAmJlxuICAgICAgICBib3guYWRkaXRpb25hbFJlZ2lzdGVycy5SNCAmJlxuICAgICAgICBib3guYWRkaXRpb25hbFJlZ2lzdGVycy5SNSAmJlxuICAgICAgICBib3guYWRkaXRpb25hbFJlZ2lzdGVycy5SNyAmJlxuICAgICAgICBib3guYXNzZXRzICYmXG4gICAgICAgIGJveC5hc3NldHMubGVuZ3RoID4gMCAmJlxuICAgICAgICBib3guYXNzZXRzWzBdLnRva2VuSWQgPT09IHRoaXMuUldUICYmXG4gICAgICAgIGJveC5lcmdvVHJlZSA9PT0gdGhpcy5ldmVudFRyaWdnZXJFcmdvVHJlZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZEJveCA9IHdhc20uRXJnb0JveC5mcm9tX2pzb24oSnNvbkJJLnN0cmluZ2lmeShib3gpKTtcbiAgICAgICAgY29uc3QgUjRTZXJpYWxpemVkID0gcGFyc2VkQm94XG4gICAgICAgICAgLnJlZ2lzdGVyX3ZhbHVlKHdhc20uTm9uTWFuZGF0b3J5UmVnaXN0ZXJJZC5SNCkhXG4gICAgICAgICAgLnRvX2J5dGVfYXJyYXkoKTtcbiAgICAgICAgY29uc3QgUjVTZXJpYWxpemVkID0gcGFyc2VkQm94XG4gICAgICAgICAgLnJlZ2lzdGVyX3ZhbHVlKHdhc20uTm9uTWFuZGF0b3J5UmVnaXN0ZXJJZC5SNSkhXG4gICAgICAgICAgLnRvX2NvbGxfY29sbF9ieXRlKCk7XG4gICAgICAgIGlmIChSNFNlcmlhbGl6ZWQubGVuZ3RoID49IDEgJiYgUjVTZXJpYWxpemVkLmxlbmd0aCA+PSAxMikgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgYFVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQgd2hpbGUgY2hlY2tpbmcgdGhlIHByb3BlciB0cmlnZ2VyIGRhdGEgZm9ybWF0IGZvciBib3ggJHtib3guYm94SWR9OiAke2V9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogZXh0cmFjdCBib3ggZGF0YSB0byBwcm9wZXIgZm9ybWF0IChub3QgaW5jbHVkaW5nIHNwZW5kaW5nIGluZm9ybWF0aW9uKVxuICAgKiBAcGFyYW0gYm94XG4gICAqIEByZXR1cm4gZXh0cmFjdGVkIGRhdGEgaW4gcHJvcGVyIGZvcm1hdFxuICAgKi9cbiAgZXh0cmFjdEJveERhdGEgPSAoXG4gICAgYm94OiBPdXRwdXRCb3gsXG4gICk6IE9taXQ8RXh0cmFjdGVkRXZlbnRUcmlnZ2VyLCAnc3BlbmRCbG9jaycgfCAnc3BlbmRIZWlnaHQnPiB8IHVuZGVmaW5lZCA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZEJveCA9IHdhc20uRXJnb0JveC5mcm9tX2pzb24oSnNvbkJJLnN0cmluZ2lmeShib3gpKTtcbiAgICAgIGNvbnN0IFI0U2VyaWFsaXplZCA9IHBhcnNlZEJveFxuICAgICAgICAucmVnaXN0ZXJfdmFsdWUod2FzbS5Ob25NYW5kYXRvcnlSZWdpc3RlcklkLlI0KSFcbiAgICAgICAgLnRvX2J5dGVfYXJyYXkoKTtcbiAgICAgIGNvbnN0IFI1U2VyaWFsaXplZCA9IHBhcnNlZEJveFxuICAgICAgICAucmVnaXN0ZXJfdmFsdWUod2FzbS5Ob25NYW5kYXRvcnlSZWdpc3RlcklkLlI1KSFcbiAgICAgICAgLnRvX2NvbGxfY29sbF9ieXRlKCk7XG5cbiAgICAgIGNvbnN0IFdJRHNDb3VudCA9IHBhcnNlZEJveFxuICAgICAgICAucmVnaXN0ZXJfdmFsdWUod2FzbS5Ob25NYW5kYXRvcnlSZWdpc3RlcklkLlI3KSFcbiAgICAgICAgLnRvX2kzMigpO1xuICAgICAgY29uc3QgV0lEc0hhc2ggPSBCdWZmZXIuZnJvbShSNFNlcmlhbGl6ZWQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IHNvdXJjZVR4SWQgPSBCdWZmZXIuZnJvbShSNVNlcmlhbGl6ZWRbMF0pLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBldmVudElkID0gQnVmZmVyLmZyb20oYmxha2UyYihzb3VyY2VUeElkLCB1bmRlZmluZWQsIDMyKSkudG9TdHJpbmcoXG4gICAgICAgICdoZXgnLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGV2ZW50SWQ6IGV2ZW50SWQsXG4gICAgICAgIHR4SWQ6IGJveC50cmFuc2FjdGlvbklkLFxuICAgICAgICBpZGVudGlmaWVyOiBib3guYm94SWQsXG4gICAgICAgIHNlcmlhbGl6ZWQ6IEJ1ZmZlci5mcm9tKHBhcnNlZEJveC5zaWdtYV9zZXJpYWxpemVfYnl0ZXMoKSkudG9TdHJpbmcoXG4gICAgICAgICAgJ2Jhc2U2NCcsXG4gICAgICAgICksXG4gICAgICAgIHRvQ2hhaW46IEJ1ZmZlci5mcm9tKFI1U2VyaWFsaXplZFsyXSkudG9TdHJpbmcoKSxcbiAgICAgICAgdG9BZGRyZXNzOiBCdWZmZXIuZnJvbShSNVNlcmlhbGl6ZWRbNF0pLnRvU3RyaW5nKCksXG4gICAgICAgIG5ldHdvcmtGZWU6IEJpZ0ludChcbiAgICAgICAgICAnMHgnICsgQnVmZmVyLmZyb20oUjVTZXJpYWxpemVkWzddKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICkudG9TdHJpbmcoMTApLFxuICAgICAgICBicmlkZ2VGZWU6IEJpZ0ludChcbiAgICAgICAgICAnMHgnICsgQnVmZmVyLmZyb20oUjVTZXJpYWxpemVkWzZdKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICkudG9TdHJpbmcoMTApLFxuICAgICAgICBhbW91bnQ6IEJpZ0ludChcbiAgICAgICAgICAnMHgnICsgQnVmZmVyLmZyb20oUjVTZXJpYWxpemVkWzVdKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICkudG9TdHJpbmcoMTApLFxuICAgICAgICBzb3VyY2VDaGFpblRva2VuSWQ6IEJ1ZmZlci5mcm9tKFI1U2VyaWFsaXplZFs4XSkudG9TdHJpbmcoKSxcbiAgICAgICAgdGFyZ2V0Q2hhaW5Ub2tlbklkOiBCdWZmZXIuZnJvbShSNVNlcmlhbGl6ZWRbOV0pLnRvU3RyaW5nKCksXG4gICAgICAgIHNvdXJjZVR4SWQ6IHNvdXJjZVR4SWQsXG4gICAgICAgIGZyb21DaGFpbjogQnVmZmVyLmZyb20oUjVTZXJpYWxpemVkWzFdKS50b1N0cmluZygpLFxuICAgICAgICBmcm9tQWRkcmVzczogQnVmZmVyLmZyb20oUjVTZXJpYWxpemVkWzNdKS50b1N0cmluZygpLFxuICAgICAgICBzb3VyY2VCbG9ja0lkOiBCdWZmZXIuZnJvbShSNVNlcmlhbGl6ZWRbMTBdKS50b1N0cmluZygpLFxuICAgICAgICBXSURzQ291bnQ6IFdJRHNDb3VudCxcbiAgICAgICAgV0lEc0hhc2g6IFdJRHNIYXNoLFxuICAgICAgICBzb3VyY2VDaGFpbkhlaWdodDogTnVtYmVyKFxuICAgICAgICAgIEJpZ0ludCgnMHgnICsgQnVmZmVyLmZyb20oUjVTZXJpYWxpemVkWzExXSkudG9TdHJpbmcoJ2hleCcpKS50b1N0cmluZyhcbiAgICAgICAgICAgIDEwLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgIGBVbmV4cGVjdGVkIGVycm9yIG9jY3VycmVkIHdoaWxlIGV4dHJhY3RpbmcgdHJpZ2dlciBkYXRhIGZvciBib3ggJHtib3guYm94SWR9OiAke2V9YCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogZ2V0cyBibG9jayBpZCBhbmQgdHJhbnNhY3Rpb25zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJsb2NrIGFuZCBzYXZlcyBpZiB0aGV5IGFyZSB2YWxpZCByb3NlblxuICAgKiAgdHJhbnNhY3Rpb25zIGFuZCBpbiBjYXNlIG9mIHN1Y2Nlc3MgcmV0dXJuIHRydWUgYW5kIGluIGNhc2Ugb2YgZmFpbHVyZSByZXR1cm5zIGZhbHNlXG4gICAqIEBwYXJhbSBibG9ja1xuICAgKiBAcGFyYW0gdHhzXG4gICAqL1xuICBwcm9jZXNzVHJhbnNhY3Rpb25zID0gYXN5bmMgKFxuICAgIHR4czogQXJyYXk8VHJhbnNhY3Rpb24+LFxuICAgIGJsb2NrOiBCbG9ja0luZm8sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBib3hlczogQXJyYXk8RXh0cmFjdGVkRXZlbnRUcmlnZ2VyPiA9IFtdO1xuICAgICAgY29uc3Qgc3BlbmRJbmZvQXJyYXk6IEFycmF5PFNwZW5kSW5mbz4gPSBbXTtcbiAgICAgIHR4cy5mb3JFYWNoKCh0cmFuc2FjdGlvbikgPT4ge1xuICAgICAgICAvLyBleHRyYWN0IGV2ZW50IHJlc3VsdFxuICAgICAgICBjb25zdCB7IHJlc3VsdCwgcGF5bWVudFR4SWQgfSA9IHRoaXMuZXh0cmFjdEV2ZW50UmVzdWx0KHRyYW5zYWN0aW9uKTtcbiAgICAgICAgZm9yIChjb25zdCBvdXRwdXQgb2YgdHJhbnNhY3Rpb24ub3V0cHV0cykge1xuICAgICAgICAgIC8vIGV4dHJhY3Qgb3V0cHV0IGJveCBkYXRhXG4gICAgICAgICAgaWYgKHRoaXMuaGFzQm94RGF0YShvdXRwdXQpKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgYFRyeWluZyB0byBleHRyYWN0IGRhdGEgZnJvbSBib3ggJHtvdXRwdXQuYm94SWR9IGF0IGhlaWdodCAke2Jsb2NrLmhlaWdodH1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmV4dHJhY3RCb3hEYXRhKG91dHB1dCk7XG4gICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICBgRXh0cmFjdGVkIGRhdGEgJHtKc29uQkkuc3RyaW5naWZ5KGRhdGEpfSBmcm9tIGJveCAke1xuICAgICAgICAgICAgICAgICAgb3V0cHV0LmJveElkXG4gICAgICAgICAgICAgICAgfWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGJveGVzLnB1c2goZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHByb2Nlc3MgaW5wdXRzXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0cmFuc2FjdGlvbi5pbnB1dHMubGVuZ3RoOyBpbmRleCsrKVxuICAgICAgICAgIHNwZW5kSW5mb0FycmF5LnB1c2goe1xuICAgICAgICAgICAgdHhJZDogdHJhbnNhY3Rpb24uaWQsXG4gICAgICAgICAgICBib3hJZDogdHJhbnNhY3Rpb24uaW5wdXRzW2luZGV4XS5ib3hJZCxcbiAgICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICAgIGV4dHJhczogeyByZXN1bHQsIHBheW1lbnRUeElkIH0sXG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGlmIChib3hlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmICghKGF3YWl0IHRoaXMuYWN0aW9ucy5zdG9yZUVudGl0aWVzKGJveGVzLCBibG9jaywgdGhpcy5nZXRJZCgpKSkpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYERhdGEgaW5zZXJ0aW9uIGZhaWxlZCBhdCBoZWlnaHQgJHtibG9jay5oZWlnaHR9IGZvciBleHRyYWN0b3IgJHt0aGlzLmlkfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50cmlnZ2VyQ2FsbGJhY2tzKENhbGxiYWNrVHlwZS5JbnNlcnQsIGJveGVzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNwZW50RGF0YSA9IGF3YWl0IHRoaXMuYWN0aW9ucy5zcGVuZEJveGVzKFxuICAgICAgICBzcGVuZEluZm9BcnJheSxcbiAgICAgICAgYmxvY2ssXG4gICAgICAgIHRoaXMuaWQsXG4gICAgICApO1xuICAgICAgdGhpcy50cmlnZ2VyQ2FsbGJhY2tzKENhbGxiYWNrVHlwZS5TcGVuZCwgc3BlbnREYXRhKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZ2dlci5lcnJvcihcbiAgICAgICAgYEVycm9yIGluIHN0b3JpbmcgZGF0YSBpbiAke3RoaXMuZ2V0SWQoKX0gb2YgdGhlIGJsb2NrICR7XG4gICAgICAgICAgYmxvY2suaGVpZ2h0XG4gICAgICAgIH06ICR7ZX1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIGV4dHJhY3RzIHJlc3VsdCBhbmQgcGF5bWVudFR4SWQgZnJvbSBhIHRyYW5zYWN0aW9uXG4gICAqIHJldHVybnMgJ3Vua25vd24nIGFzIHJlc3VsdCB3aGVuIHR4IGlzIG5laXRoZXIgZnJhdWQgb3Igc3VjY2Vzc2Z1bFxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnNcbiAgICovXG4gIHByb3RlY3RlZCBleHRyYWN0RXZlbnRSZXN1bHQgPSAodHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKSA9PiB7XG4gICAgbGV0IHJlc3VsdCA9IEV2ZW50UmVzdWx0LnVua25vd247XG4gICAgbGV0IHBheW1lbnRUeElkID0gJyc7XG4gICAgaWYgKHRyYW5zYWN0aW9uLm91dHB1dHNbMF0uZXJnb1RyZWUgPT09IHRoaXMuZnJhdWRFcmdvVHJlZSlcbiAgICAgIHJlc3VsdCA9IEV2ZW50UmVzdWx0LmZyYXVkO1xuICAgIGVsc2UgaWYgKHRyYW5zYWN0aW9uLm91dHB1dHNbMF0uZXJnb1RyZWUgPT09IHRoaXMucGVybWl0RXJnb1RyZWUpIHtcbiAgICAgIHJlc3VsdCA9IEV2ZW50UmVzdWx0LnN1Y2Nlc3NmdWw7XG4gICAgICAvLyBmaW5kIGZpcnN0IG5vbi13YXRjaGVyIGJveCB3aXRoIFI0IHZhbHVlXG4gICAgICBmb3IgKGNvbnN0IGJveCBvZiB0cmFuc2FjdGlvbi5vdXRwdXRzKSB7XG4gICAgICAgIC8vIGlmIGl0J3Mgd2F0Y2hlciBib3gsIHNraXAgaXRcbiAgICAgICAgaWYgKGJveC5lcmdvVHJlZSA9PT0gdGhpcy5wZXJtaXRFcmdvVHJlZSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IG91dHB1dFBhcnNlZCA9IHdhc20uRXJnb0JveC5mcm9tX2pzb24oSnNvbkJJLnN0cmluZ2lmeShib3gpKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBSNFNlcmlhbGl6ZWQgPSBvdXRwdXRQYXJzZWRcbiAgICAgICAgICAgIC5yZWdpc3Rlcl92YWx1ZSh3YXNtLk5vbk1hbmRhdG9yeVJlZ2lzdGVySWQuUjQpXG4gICAgICAgICAgICA/LnRvX2J5dGVfYXJyYXkoKTtcbiAgICAgICAgICBpZiAoUjRTZXJpYWxpemVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCB0eElkID0gQnVmZmVyLmZyb20oUjRTZXJpYWxpemVkKS50b1N0cmluZygpO1xuICAgICAgICAgICAgLy8gd2UgYXNzdW1lZCB0eElkIG9ubHkgaW5jbHVkZXMgdGhlc2UgY2hhcmFjdGVyc1xuICAgICAgICAgICAgaWYgKCF0eElkLm1hdGNoKC9eWzAtOWEtekEtWlxcLV8uXSskLykpIHtcbiAgICAgICAgICAgICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgICB0eElkID0gQnVmZmVyLmZyb20oUjRTZXJpYWxpemVkKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXltZW50VHhJZCA9IHR4SWQ7XG4gICAgICAgICAgICBpZiAodHhJZCA9PT0gJycpIHtcbiAgICAgICAgICAgICAgcGF5bWVudFR4SWQgPSB0cmFuc2FjdGlvbi5pZDtcbiAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgYHN1Y2Nlc3NmdWwgZXZlbnQgaXMgc3BlbnQuIHR4IFske3RyYW5zYWN0aW9uLmlkfV0gaXMgYm90aCBwYXltZW50IGFuZCByZXdhcmQgZGlzdHJpYnV0aW9uIHR4YCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHBheW1lbnRUeElkIGlzIGV4dHJhY3RlZC4gbm8gbmVlZCB0byBwcm9jZXNzIG5leHQgYm94ZXNcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3VsdCxcbiAgICAgIHBheW1lbnRUeElkLFxuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IEV2ZW50VHJpZ2dlckV4dHJhY3RvcjtcbiJdfQ==
|