@rosen-bridge/fraud-extractor 2.2.3 → 3.0.0-7b38188a

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.
@@ -1,146 +1,39 @@
1
- import { AbstractExtractor } from '@rosen-bridge/abstract-extractor';
1
+ import { AbstractErgoBoxExtractor, InitializeOptions, TxExtra } from '@rosen-bridge/abstract-extractor';
2
2
  import { AbstractLogger } from '@rosen-bridge/abstract-logger';
3
3
  import { DataSource } from '@rosen-bridge/extended-typeorm';
4
- import { Block, BlockInfo, Transaction } from '@rosen-bridge/scanner-interfaces';
5
- import { V1 } from '@rosen-clients/ergo-explorer';
4
+ import { InputExtension, OutputBox, Transaction } from '@rosen-bridge/scanner-interfaces';
5
+ import { FraudAction } from '../actions/fraudAction';
6
+ import { FraudEntity } from '../entities/fraudEntity';
6
7
  import { ExtractedFraud } from '../interfaces/types';
7
- export declare class FraudExtractor implements AbstractExtractor<Transaction> {
8
- private readonly logger;
9
- private readonly actions;
8
+ export declare class FraudExtractor extends AbstractErgoBoxExtractor<ExtractedFraud, FraudEntity> {
9
+ readonly actions: FraudAction;
10
10
  private readonly id;
11
11
  private readonly ergoTree;
12
12
  private readonly rwt;
13
- readonly api: {
14
- v0: {
15
- getApiV0AddressesP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0AddressesP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").AddressInfo>;
16
- getApiV0AddressesP1Transactions: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0AddressesP1TransactionsParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").ItemsTransactionInfo>;
17
- getApiV0AddressesAssetholdersP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0AddressesAssetholdersP1Params) => Promise<string[]>;
18
- getApiV0AddressesBalances: (params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0AddressesBalancesParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").ItemsBalanceInfo>;
19
- getApiV0AssetsIssuingboxes: (params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0AssetsIssuingboxesParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").ItemsOutputInfo>;
20
- getApiV0AssetsP1Issuingbox: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").OutputInfo[]>;
21
- getApiV0Blocks: (params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0BlocksParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").ItemsBlockInfo>;
22
- getApiV0BlocksP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").BlockSummary>;
23
- getApiV0BlocksAtP1: (p1: number) => Promise<string[]>;
24
- getApiV0DexTokensP1Unspentsellorders: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0DexTokensP1UnspentsellordersParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").DexSellOrderInfo[]>;
25
- getApiV0DexTokensP1Unspentbuyorders: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0DexTokensP1UnspentbuyordersParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").DexBuyOrderInfo[]>;
26
- getApiV0TransactionsP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").TransactionSummary>;
27
- getApiV0TransactionsUnconfirmedP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").UTransactionSummary>;
28
- getApiV0TransactionsUnconfirmedByaddressP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0TransactionsUnconfirmedByaddressP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").ItemsUTransactionInfo>;
29
- getApiV0TransactionsUnconfirmed: (params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0TransactionsUnconfirmedParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").ItemsUTransactionInfo>;
30
- getApiV0TransactionsSinceP1: (p1: number, params?: import("@rosen-clients/ergo-explorer/dist/v0/types").GetApiV0TransactionsSinceP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").TransactionInfo[]>;
31
- postApiV0TransactionsSend: (postApiV0TransactionsSendBody: import("@rosen-clients/ergo-explorer/dist/v0/types").PostApiV0TransactionsSendBody) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").TxIdResponse>;
32
- getApiV0TransactionsBoxesP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").OutputInfo>;
33
- getApiV0TransactionsBoxesByergotreeP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").OutputInfo[]>;
34
- getApiV0TransactionsBoxesByergotreeUnspentP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").OutputInfo[]>;
35
- getApiV0TransactionsBoxesByaddressP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").OutputInfo[]>;
36
- getApiV0TransactionsBoxesByaddressUnspentP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").OutputInfo[]>;
37
- getApiV0Info: () => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").BlockChainInfo>;
38
- getApiV0InfoSupply: () => Promise<string>;
39
- getApiV0Stats: () => Promise<import("@rosen-clients/ergo-explorer/dist/v0/types").StatsSummary>;
40
- getApiV0DocsOpenapi: () => Promise<string>;
41
- };
42
- v1: {
43
- getApiV1TransactionsP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").TransactionInfo>;
44
- getApiV1TransactionsByinputsscripttemplatehashP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1TransactionsByinputsscripttemplatehashP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsTransactionInfo>;
45
- getApiV1TransactionsByglobalindexStream: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1TransactionsByglobalindexStreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListTransactionInfo>;
46
- getApiV1BoxesUnspentBylastepochsStream: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentBylastepochsStreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListOutputInfo>;
47
- getApiV1BoxesUnspentByglobalindexStream: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentByglobalindexStreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListOutputInfo>;
48
- getApiV1BoxesUnspentStream: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentStreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListOutputInfo>;
49
- getApiV1BoxesByergotreetemplatehashP1Stream: (p1: string, params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesByergotreetemplatehashP1StreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListOutputInfo>;
50
- getApiV1BoxesUnspentByergotreetemplatehashP1Stream: (p1: string, params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentByergotreetemplatehashP1StreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListOutputInfo>;
51
- getApiV1BoxesUnspentBytokenidP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentBytokenidP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
52
- getApiV1BoxesBytokenidP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesBytokenidP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
53
- getApiV1BoxesP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").OutputInfo>;
54
- getApiV1BoxesByergotreeP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesByergotreeP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
55
- getApiV1BoxesByergotreetemplatehashP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesByergotreetemplatehashP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
56
- getApiV1BoxesUnspentByergotreeP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentByergotreeP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
57
- getApiV1BoxesUnspentByergotreetemplatehashP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentByergotreetemplatehashP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
58
- getApiV1BoxesByaddressP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesByaddressP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
59
- getApiV1BoxesUnspentUnconfirmedByaddressP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentUnconfirmedByaddressP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").MOutputInfo[]>;
60
- getApiV1BoxesUnspentByaddressP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesUnspentByaddressP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
61
- getApiV1BoxesByglobalindexStream: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BoxesByglobalindexStreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListOutputInfo>;
62
- postApiV1BoxesUnspentSearchUnion: (boxAssetsQuery: import("@rosen-clients/ergo-explorer/dist/v1/types").BoxAssetsQuery, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").PostApiV1BoxesUnspentSearchUnionParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
63
- postApiV1BoxesUnspentSearch: (boxQuery: import("@rosen-clients/ergo-explorer/dist/v1/types").BoxQuery, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").PostApiV1BoxesUnspentSearchParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
64
- postApiV1BoxesSearch: (boxQuery: import("@rosen-clients/ergo-explorer/dist/v1/types").BoxQuery, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").PostApiV1BoxesSearchParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsOutputInfo>;
65
- getApiV1Tokens: (params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1TokensParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsTokenInfo>;
66
- getApiV1TokensSearch: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1TokensSearchParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsTokenInfo>;
67
- getApiV1TokensBysymbolP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").TokenInfo[]>;
68
- getApiV1TokensP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").TokenInfo>;
69
- getApiV1Assets: (params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1AssetsParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsTokenInfo>;
70
- getApiV1AssetsSearchBytokenid: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1AssetsSearchBytokenidParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsAssetInfo>;
71
- getApiV1EpochsParams: () => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").EpochInfo>;
72
- getApiV1AddressesP1Transactions: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1AddressesP1TransactionsParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsTransactionInfo>;
73
- getApiV1AddressesP1BalanceConfirmed: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1AddressesP1BalanceConfirmedParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").Balance>;
74
- getApiV1AddressesP1BalanceTotal: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").TotalBalance>;
75
- getApiV1Blocks: (params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BlocksParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsBlockInfo>;
76
- getApiV1BlocksP1: (p1: string) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").BlockSummary>;
77
- getApiV1BlocksHeaders: (params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BlocksHeadersParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsBlockHeader>;
78
- getApiV1BlocksByglobalindexStream: (params: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BlocksByglobalindexStreamParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListBlockInfo>;
79
- getApiV1BlocksStreamSummary: (params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1BlocksStreamSummaryParams) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListBlockSummaryV1>;
80
- postApiV1MempoolTransactionsSubmit: (postApiV1MempoolTransactionsSubmitBody: import("@rosen-clients/ergo-explorer/dist/v1/types").PostApiV1MempoolTransactionsSubmitBody) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").TxIdResponse>;
81
- getApiV1MempoolTransactionsByaddressP1: (p1: string, params?: import("@rosen-clients/ergo-explorer/dist/v1/types").GetApiV1MempoolTransactionsByaddressP1Params) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ItemsUTransactionInfo>;
82
- getApiV1MempoolBoxesUnspent: () => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ListOutputInfo>;
83
- getApiV1Info: () => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").NetworkState>;
84
- getApiV1Networkstate: () => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").NetworkState>;
85
- getApiV1Networkstats: () => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").NetworkStats>;
86
- postApiV1ErgotreeConvert: (ergoTreeConversionRequest: import("@rosen-clients/ergo-explorer/dist/v1/types").ErgoTreeConversionRequest) => Promise<import("@rosen-clients/ergo-explorer/dist/v1/types").ErgoTreeHuman>;
87
- };
88
- };
89
- constructor(dataSource: DataSource, id: string, explorerUrl: string, fraudAddress: string, rwt: string, logger?: AbstractLogger);
13
+ constructor(dataSource: DataSource, id: string, rwt: string, initializeOptions: InitializeOptions, logger?: AbstractLogger);
90
14
  /**
91
15
  * get Id for current extractor
92
16
  */
93
17
  getId: () => string;
94
18
  /**
95
- * Extract fraud boxes in the specified block transactions
96
- * @param txs
97
- * @param block
19
+ * check proper data format in the box
20
+ * @param box
21
+ * @return true if the box has the required data and false otherwise
98
22
  */
99
- processTransactions: (txs: Array<Transaction>, block: Block) => Promise<boolean>;
23
+ hasBoxData: (box: OutputBox) => boolean;
100
24
  /**
101
- * fork one block and remove all stored information for this block
102
- * @param hash: block hash
25
+ * extract transaction extra information
26
+ * @param tx
27
+ * @returns transaction extra data containing trigger box id
103
28
  */
104
- forkBlock: (hash: string) => Promise<void>;
29
+ getTransactionExtraData: (tx: Transaction) => TxExtra;
105
30
  /**
106
- * Initializes the database with older frauds
31
+ * extract box data to proper format (not including spending information)
32
+ * @param box
33
+ * @param inputExtensions all input box extensions in transaction
34
+ * @param txExtra transaction extra data containing trigger box id
35
+ * @return extracted data in proper format
107
36
  */
108
- initializeBoxes: (initialBlock: BlockInfo) => Promise<void>;
109
- /**
110
- * Validate all remaining boxes in the database
111
- * update the correct ones and remove the invalid ones
112
- * @param unchangedStoredBoxIds
113
- * @param initialHeight
114
- */
115
- validateOldStoredFrauds: (unchangedStoredBoxIds: Array<string>, initialHeight: number) => Promise<void>;
116
- /**
117
- * Return extracted information of a fraud with its boxId
118
- * @param boxId
119
- */
120
- getFraudInfoWithBoxId: (boxId: string) => Promise<ExtractedFraud | undefined>;
121
- /**
122
- * Get unspent frauds created bellow the initial height
123
- * @param initialHeight
124
- * @returns
125
- */
126
- getUnspentFrauds: (initialHeight: number) => Promise<Array<ExtractedFraud>>;
127
- /**
128
- * Returns block information of tx
129
- * @param txId
130
- */
131
- getTxBlock: (txId: string) => Promise<{
132
- id: string;
133
- height: number;
134
- }>;
135
- /**
136
- * Returns trigger boxId from fraud transaction id
137
- * @param txId
138
- */
139
- getTriggerBoxId: (txId: string) => Promise<string | undefined>;
140
- /**
141
- * Extract needed information for storing in database from api json outputs
142
- * @param boxes
143
- */
144
- extractBoxData: (boxes: Array<V1.OutputInfo>) => Promise<ExtractedFraud[]>;
37
+ extractBoxData: (box: OutputBox, _inputExtensions: InputExtension[], txExtra?: TxExtra) => ExtractedFraud | undefined;
145
38
  }
146
39
  //# sourceMappingURL=fraudExtractor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fraudExtractor.d.ts","sourceRoot":"","sources":["../../lib/extractor/fraudExtractor.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAe,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE5D,OAAO,EACL,KAAK,EACL,SAAS,EACT,WAAW,EACZ,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAAE,EAAE,EAAE,MAAM,8BAA8B,CAAC;AAIlD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,qBAAa,cAAe,YAAW,iBAAiB,CAAC,WAAW,CAAC;IACnE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,QAAQ,CAAC,GAAG;;oDAtBZ,CAAC;gEAES,CAAC;gEAMsB,CAAC;8CAEa,CAAC;+CAIJ,CAAC;;mCAO7C,CAAC;;;qEAcG,CAAJ;oEAIsB,CAAC;;;2EAmBL,CAAC;oDAIP,CAAA;4DAIoB,CAAC;;;;;;;;;;;;;;iFAiCK,CAAC;;;;;;;gEA6ClC,CAAA;yDAIK,CAAC;;0DAKK,CAAC;sEAGO,CAAC;iEAII,CAAC;6EAIY,CAAC;yDAMU,CAAC;2EAIR,CAAC;gEAO9C,CAAF;;0IAU+B,CAAA;yHAGoE,CAAC;kHAO3F,CAAD;mCAGyE,CAAC;;;;mCAkBtE,CAAC;;;gEAeR,CAAC;oEAKkB,CAAC;;mCASpB,CAAF;;0CAOiB,CAAC;;gDAeH,CAAA;;uEAgBH,CAAC;;;;;;;MA3QF;gBAGX,UAAU,EAAE,UAAU,EACtB,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,cAAc;IAYzB;;OAEG;IACH,KAAK,eAAsB;IAE3B;;;;OAIG;IACH,mBAAmB,GACjB,KAAK,KAAK,CAAC,WAAW,CAAC,EACvB,OAAO,KAAK,KACX,OAAO,CAAC,OAAO,CAAC,CA2EjB;IAEF;;;OAGG;IACH,SAAS,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC,CAE7C;IAEF;;OAEG;IACH,eAAe,GAAU,cAAc,SAAS,mBAkC9C;IAEF;;;;;OAKG;IACH,uBAAuB,GACrB,uBAAuB,KAAK,CAAC,MAAM,CAAC,EACpC,eAAe,MAAM,mBA2BrB;IAEF;;;OAGG;IACH,qBAAqB,GACnB,OAAO,MAAM,KACZ,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC,CAQpC;IAEF;;;;OAIG;IACH,gBAAgB,GACd,eAAe,MAAM,KACpB,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CA+B/B;IAEF;;;OAGG;IACH,UAAU,GAAU,MAAM,MAAM;;;OAM9B;IAEF;;;OAGG;IACH,eAAe,GAAU,MAAM,MAAM,iCAGnC;IAEF;;;OAGG;IACH,cAAc,GAAU,OAAO,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,+BAoDjD;CACH"}
1
+ {"version":3,"file":"fraudExtractor.d.ts","sourceRoot":"","sources":["../../lib/extractor/fraudExtractor.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,OAAO,EACR,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE5D,OAAO,EACL,cAAc,EACd,SAAS,EACT,WAAW,EACZ,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,qBAAa,cAAe,SAAQ,wBAAwB,CAC1D,cAAc,EACd,WAAW,CACZ;IACC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;gBAG3B,UAAU,EAAE,UAAU,EACtB,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,MAAM,EACX,iBAAiB,EAAE,iBAAiB,EACpC,MAAM,CAAC,EAAE,cAAc;IAczB;;OAEG;IACH,KAAK,eAAsB;IAE3B;;;;OAIG;IACH,UAAU,GAAI,KAAK,SAAS,KAAG,OAAO,CAmBpC;IAEF;;;;OAIG;IACH,uBAAuB,GAAI,IAAI,WAAW,KAAG,OAAO,CAEjD;IAEH;;;;;;OAMG;IACH,cAAc,GACZ,KAAK,SAAS,EACd,kBAAkB,cAAc,EAAE,EAClC,UAAU,OAAO,KAChB,cAAc,GAAG,SAAS,CAuB3B;CACH"}
@@ -1,262 +1,81 @@
1
1
  import { Buffer } from 'buffer';
2
2
  import * as wasm from 'ergo-lib-wasm-nodejs';
3
- import { difference } from 'lodash-es';
4
- import { DummyLogger } from '@rosen-bridge/abstract-logger';
3
+ import { AbstractErgoBoxExtractor, } from '@rosen-bridge/abstract-extractor';
5
4
  import JsonBI from '@rosen-bridge/json-bigint';
6
- import ergoExplorerClientFactory from '@rosen-clients/ergo-explorer';
7
5
  import { FraudAction } from '../actions/fraudAction';
8
- import { DefaultApiLimit } from '../constants';
9
- export class FraudExtractor {
10
- logger;
6
+ export class FraudExtractor extends AbstractErgoBoxExtractor {
11
7
  actions;
12
8
  id;
13
9
  ergoTree;
14
10
  rwt;
15
- api;
16
- constructor(dataSource, id, explorerUrl, fraudAddress, rwt, logger) {
11
+ constructor(dataSource, id, rwt, initializeOptions, logger) {
12
+ super(initializeOptions, logger);
17
13
  this.id = id;
18
- this.ergoTree = wasm.Address.from_base58(fraudAddress)
14
+ this.ergoTree = wasm.Address.from_base58(initializeOptions.address)
19
15
  .to_ergo_tree()
20
16
  .to_base16_bytes();
21
17
  this.rwt = rwt;
22
- this.logger = logger ? logger : new DummyLogger();
23
- this.actions = new FraudAction(dataSource, this.logger);
24
- this.api = ergoExplorerClientFactory(explorerUrl);
18
+ this.actions = new FraudAction(dataSource, this.logger.child('FraudAction'));
25
19
  }
26
20
  /**
27
21
  * get Id for current extractor
28
22
  */
29
23
  getId = () => `${this.id}`;
30
24
  /**
31
- * Extract fraud boxes in the specified block transactions
32
- * @param txs
33
- * @param block
25
+ * check proper data format in the box
26
+ * @param box
27
+ * @return true if the box has the required data and false otherwise
34
28
  */
35
- processTransactions = (txs, block) => {
36
- return new Promise((resolve, reject) => {
37
- try {
38
- const newFrauds = [];
39
- const txSpendIds = [];
40
- txs.forEach((transaction) => {
41
- for (const output of transaction.outputs) {
42
- if (output.ergoTree !== this.ergoTree ||
43
- !output.assets ||
44
- output.assets[0].tokenId !== this.rwt) {
45
- continue;
46
- }
47
- const boxOutput = wasm.ErgoBox.from_json(JsonBI.stringify(output));
48
- const r4 = boxOutput
49
- .register_value(wasm.NonMandatoryRegisterId.R4)
50
- ?.to_coll_coll_byte();
51
- if (!r4) {
52
- this.logger.debug(`A new fraud box found without correct wid format at height ${block.height}`);
53
- continue;
54
- }
55
- const newFraud = {
56
- boxId: output.boxId,
57
- txId: transaction.id,
58
- triggerBoxId: transaction.inputs[0].boxId,
59
- wid: Buffer.from(r4[0]).toString('hex'),
60
- rwtCount: output.assets[0].amount.toString(),
61
- serialized: Buffer.from(wasm.ErgoBox.from_json(JsonBI.stringify(output)).sigma_serialize_bytes()).toString('base64'),
62
- };
63
- newFrauds.push(newFraud);
64
- this.logger.debug(`new fraud found [${newFraud}] at height ${block.height}`);
65
- }
66
- txSpendIds.push({
67
- txId: transaction.id,
68
- spendBoxes: transaction.inputs.map((box) => box.boxId),
69
- });
70
- });
71
- this.actions
72
- .storeBlockFrauds(newFrauds, block, this.getId())
73
- .then(async (status) => {
74
- if (status) {
75
- if (newFrauds.length > 0)
76
- this.logger.debug(`successfully stored new frauds at hight ${block.height}`);
77
- for (const spendIds of txSpendIds)
78
- await this.actions.spendFrauds(spendIds.spendBoxes, block, this.getId(), spendIds.txId);
79
- }
80
- resolve(status);
81
- })
82
- .catch((e) => {
83
- this.logger.error(`An error occurred in processing frauds in block [${block.hash}]: ${e}`);
84
- reject(e);
85
- });
86
- }
87
- catch (e) {
88
- reject(e);
89
- }
90
- });
91
- };
92
- /**
93
- * fork one block and remove all stored information for this block
94
- * @param hash: block hash
95
- */
96
- forkBlock = async (hash) => {
97
- await this.actions.deleteBlock(hash, this.getId());
98
- };
99
- /**
100
- * Initializes the database with older frauds
101
- */
102
- initializeBoxes = async (initialBlock) => {
103
- // Getting unspent boxes
104
- this.logger.debug(`Initializing fraud table. storing fraud boxes created bellow height ${initialBlock.height}.`);
105
- const unspentFrauds = await this.getUnspentFrauds(initialBlock.height);
106
- const unspentBoxIds = unspentFrauds.map((box) => box.boxId);
107
- this.logger.debug(`Unspent fraud boxIds ${unspentBoxIds}`);
108
- // Storing extracted boxes
109
- let allStoredBoxIds = await this.actions.getAllBoxIds(this.getId());
110
- for (const fraud of unspentFrauds) {
111
- if (allStoredBoxIds.includes(fraud.boxId)) {
112
- await this.actions.updateFraud(fraud, this.getId());
113
- this.logger.info(`Updated the existing unspent fraud with boxId, [${fraud.boxId}]`);
114
- this.logger.debug(`Updated fraud: [${JSON.stringify(fraud)}]`);
115
- }
116
- else {
117
- await this.actions.insertFraud(fraud, this.getId());
118
- this.logger.info(`Inserted new unspent fraud with boxId, [${fraud.boxId}]`);
119
- this.logger.debug(`Inserted fraud: [${JSON.stringify(fraud)}]`);
120
- }
29
+ hasBoxData = (box) => {
30
+ if (box.ergoTree !== this.ergoTree ||
31
+ box.assets.length === 0 ||
32
+ box.assets[0].tokenId !== this.rwt) {
33
+ return false;
121
34
  }
122
- // Remove updated box ids from existing boxes in database
123
- allStoredBoxIds = difference(allStoredBoxIds, unspentBoxIds);
124
- // Validating remained boxes
125
- this.logger.debug(`Validating and updating stored fraud boxes with boxIds ${allStoredBoxIds}`);
126
- await this.validateOldStoredFrauds(allStoredBoxIds, initialBlock.height);
127
- };
128
- /**
129
- * Validate all remaining boxes in the database
130
- * update the correct ones and remove the invalid ones
131
- * @param unchangedStoredBoxIds
132
- * @param initialHeight
133
- */
134
- validateOldStoredFrauds = async (unchangedStoredBoxIds, initialHeight) => {
135
- for (const boxId of unchangedStoredBoxIds) {
136
- const box = await this.getFraudInfoWithBoxId(boxId);
137
- if (box && box.spendBlock && box.spendHeight) {
138
- if (box.spendHeight < initialHeight) {
139
- this.logger.debug(`updating spending information of fraud with boxId [${box.boxId}] spent at height [${box.spendHeight}]`);
140
- await this.actions.updateSpendBlock(boxId, this.getId(), box.spendBlock, box.spendHeight);
141
- }
142
- else {
143
- this.logger.debug(`fraud with boxId [${box.boxId}] has been spent after the initialization height, updating spending information skipped.`);
144
- }
145
- }
146
- else {
147
- await this.actions.removeFraud(boxId, this.getId());
148
- this.logger.info(`Removed invalid fraud [${boxId}] in initialization validation`);
149
- }
150
- }
151
- };
152
- /**
153
- * Return extracted information of a fraud with its boxId
154
- * @param boxId
155
- */
156
- getFraudInfoWithBoxId = async (boxId) => {
35
+ // Check if R4 register exists and is valid
157
36
  try {
158
- const box = await this.api.v1.getApiV1BoxesP1(boxId);
159
- return (await this.extractBoxData([box]))[0];
37
+ const ergoBox = wasm.ErgoBox.from_json(JsonBI.stringify(box));
38
+ const r4 = ergoBox
39
+ .register_value(wasm.NonMandatoryRegisterId.R4)
40
+ ?.to_byte_array();
41
+ return r4 != null;
160
42
  }
161
43
  catch {
162
- this.logger.warn(`Box with id [${boxId}] does not exists`);
163
- return undefined;
44
+ return false;
164
45
  }
165
46
  };
166
47
  /**
167
- * Get unspent frauds created bellow the initial height
168
- * @param initialHeight
169
- * @returns
48
+ * extract transaction extra information
49
+ * @param tx
50
+ * @returns transaction extra data containing trigger box id
170
51
  */
171
- getUnspentFrauds = async (initialHeight) => {
172
- let allBoxes = [];
173
- let offset = 0, total = DefaultApiLimit, boxes;
174
- while (offset < total) {
175
- boxes = await this.api.v1.getApiV1BoxesUnspentByergotreeP1(this.ergoTree, {
176
- offset: offset,
177
- limit: DefaultApiLimit,
178
- });
179
- if (!boxes.items) {
180
- throw new Error('Explorer api output items should not be undefined.');
181
- }
182
- allBoxes = [
183
- ...allBoxes,
184
- ...(await this.extractBoxData(boxes.items.filter((box) => box.creationHeight < initialHeight &&
185
- box.assets &&
186
- box.assets[0].tokenId == this.rwt))),
187
- ];
188
- total = boxes.total;
189
- offset += DefaultApiLimit;
190
- }
191
- return allBoxes;
192
- };
52
+ getTransactionExtraData = (tx) => ({
53
+ triggerBoxId: tx.inputs[0].boxId,
54
+ });
193
55
  /**
194
- * Returns block information of tx
195
- * @param txId
56
+ * extract box data to proper format (not including spending information)
57
+ * @param box
58
+ * @param inputExtensions all input box extensions in transaction
59
+ * @param txExtra transaction extra data containing trigger box id
60
+ * @return extracted data in proper format
196
61
  */
197
- getTxBlock = async (txId) => {
198
- const tx = await this.api.v1.getApiV1TransactionsP1(txId);
62
+ extractBoxData = (box, _inputExtensions, txExtra) => {
63
+ const triggerBoxId = txExtra?.triggerBoxId;
64
+ if (!triggerBoxId) {
65
+ throw new Error(`ImpossibleBehaviour: Trigger boxId is missing for box ${box.boxId}, txExtra: ${JSON.stringify(txExtra)}`);
66
+ }
67
+ const ergoBox = wasm.ErgoBox.from_json(JsonBI.stringify(box));
68
+ const r4 = ergoBox
69
+ .register_value(wasm.NonMandatoryRegisterId.R4)
70
+ ?.to_byte_array();
199
71
  return {
200
- id: tx.blockId,
201
- height: tx.inclusionHeight,
72
+ identifier: ergoBox.box_id().to_str(),
73
+ triggerBoxId,
74
+ txId: box.transactionId,
75
+ wid: Buffer.from(r4).toString('hex'),
76
+ rwtCount: box.assets[0].amount.toString(),
77
+ serialized: Buffer.from(ergoBox.sigma_serialize_bytes()).toString('base64'),
202
78
  };
203
79
  };
204
- /**
205
- * Returns trigger boxId from fraud transaction id
206
- * @param txId
207
- */
208
- getTriggerBoxId = async (txId) => {
209
- const tx = await this.api.v1.getApiV1TransactionsP1(txId);
210
- return tx.inputs?.[0].boxId;
211
- };
212
- /**
213
- * Extract needed information for storing in database from api json outputs
214
- * @param boxes
215
- */
216
- extractBoxData = async (boxes) => {
217
- const extractedFrauds = [];
218
- for (const box of boxes) {
219
- try {
220
- this.logger.debug(`Extracting box fraud information from box with boxId [${box.boxId}]`);
221
- let spendBlock, spendHeight;
222
- // Extract spending information
223
- if (box.spentTransactionId) {
224
- const block = await this.getTxBlock(box.spentTransactionId);
225
- spendBlock = block.id;
226
- spendHeight = block.height;
227
- }
228
- // Extract WID
229
- const ergoBox = wasm.ErgoBox.from_json(JsonBI.stringify(box));
230
- const r4 = ergoBox
231
- .register_value(wasm.NonMandatoryRegisterId.R4)
232
- ?.to_coll_coll_byte();
233
- // Extract trigger boxId
234
- const triggerBoxId = await this.getTriggerBoxId(box.transactionId);
235
- if (!r4 || !triggerBoxId) {
236
- this.logger.warn(`Skipping storing fraud with boxId [${box.boxId}], wid or trigger box id is undefined`);
237
- continue;
238
- }
239
- const extractedFraud = {
240
- boxId: ergoBox.box_id().to_str(),
241
- triggerBoxId: triggerBoxId,
242
- wid: Buffer.from(r4[0]).toString('hex'),
243
- rwtCount: box.assets[0].amount.toString(),
244
- serialized: Buffer.from(ergoBox.sigma_serialize_bytes()).toString('base64'),
245
- blockId: box.blockId,
246
- height: box.settlementHeight,
247
- txId: box.transactionId,
248
- spendBlock: spendBlock,
249
- spendHeight: spendHeight,
250
- spendTxId: box.spentTransactionId,
251
- };
252
- extractedFrauds.push(extractedFraud);
253
- this.logger.debug(`Extracted fraud: [${extractedFraud}]`);
254
- }
255
- catch (e) {
256
- this.logger.error(`Extracting fraud information failed for box [${box.boxId}] with error: ${e}`);
257
- }
258
- }
259
- return extractedFrauds;
260
- };
261
80
  }
262
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhdWRFeHRyYWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZXh0cmFjdG9yL2ZyYXVkRXh0cmFjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDaEMsT0FBTyxLQUFLLElBQUksTUFBTSxzQkFBc0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBR3ZDLE9BQU8sRUFBa0IsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFNUUsT0FBTyxNQUFNLE1BQU0sMkJBQTJCLENBQUM7QUFNL0MsT0FBTyx5QkFBeUIsTUFBTSw4QkFBOEIsQ0FBQztBQUdyRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUcvQyxNQUFNLE9BQU8sY0FBYztJQUNSLE1BQU0sQ0FBaUI7SUFDdkIsT0FBTyxDQUFjO0lBQ3JCLEVBQUUsQ0FBUztJQUNYLFFBQVEsQ0FBUztJQUNqQixHQUFHLENBQVM7SUFDcEIsR0FBRyxDQUFDO0lBRWIsWUFDRSxVQUFzQixFQUN0QixFQUFVLEVBQ1YsV0FBbUIsRUFDbkIsWUFBb0IsRUFDcEIsR0FBVyxFQUNYLE1BQXVCO1FBRXZCLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUM7YUFDbkQsWUFBWSxFQUFFO2FBQ2QsZUFBZSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2xELElB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QUFDLEVBQUUsQ0FDOUUsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQyxDQUFDO0NBQ0giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0ICogYXMgd2FzbSBmcm9tICdlcmdvLWxpYi13YXNtLW5vZGVqcyc7XG5pbXBvcnQgeyBkaWZmZXJlbmNlIH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHsgQWJzdHJhY3RFeHRyYWN0b3IgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2Fic3RyYWN0LWV4dHJhY3Rvcic7XG5pbXBvcnQgeyBBYnN0cmFjdExvZ2dlciwgRHVtbXlMb2dnZXIgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2Fic3RyYWN0LWxvZ2dlcic7XG5pbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9leHRlbmRlZC10eXBlb3JtJztcbmltcG9ydCBKc29uQkkgZnJvbSAnQHJvc2VuLWJyaWRnZS9qc29uLWJpZ2ludCc7XG5pbXBvcnQge1xuICBCbG9jayxcbiAgQmxvY2tJbmZvLFxuICBUcmFuc2FjdGlvbixcbn0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyLWludGVyZmFjZXMnO1xuaW1wb3J0IGVyZ29FeHBsb3JlckNsaWVudEZhY3RvcnkgZnJvbSAnQHJvc2VuLWNsaWVudHMvZXJnby1leHBsb3Jlcic7XG5pbXBvcnQgeyBWMSB9IGZyb20gJ0Byb3Nlbi1jbGllbnRzL2VyZ28tZXhwbG9yZXInO1xuXG5pbXBvcnQgeyBGcmF1ZEFjdGlvbiB9IGZyb20gJy4uL2FjdGlvbnMvZnJhdWRBY3Rpb24nO1xuaW1wb3J0IHsgRGVmYXVsdEFwaUxpbWl0IH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IEV4dHJhY3RlZEZyYXVkIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBGcmF1ZEV4dHJhY3RvciBpbXBsZW1lbnRzIEFic3RyYWN0RXh0cmFjdG9yPFRyYW5zYWN0aW9uPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBBYnN0cmFjdExvZ2dlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBhY3Rpb25zOiBGcmF1ZEFjdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSBpZDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGVyZ29UcmVlOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcnd0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFwaTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBkYXRhU291cmNlOiBEYXRhU291cmNlLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgZXhwbG9yZXJVcmw6IHN0cmluZyxcbiAgICBmcmF1ZEFkZHJlc3M6IHN0cmluZyxcbiAgICByd3Q6IHN0cmluZyxcbiAgICBsb2dnZXI/OiBBYnN0cmFjdExvZ2dlcixcbiAgKSB7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMuZXJnb1RyZWUgPSB3YXNtLkFkZHJlc3MuZnJvbV9iYXNlNTgoZnJhdWRBZGRyZXNzKVxuICAgICAgLnRvX2VyZ29fdHJlZSgpXG4gICAgICAudG9fYmFzZTE2X2J5dGVzKCk7XG4gICAgdGhpcy5yd3QgPSByd3Q7XG4gICAgdGhpcy5sb2dnZXIgPSBsb2dnZXIgPyBsb2dnZXIgOiBuZXcgRHVtbXlMb2dnZXIoKTtcbiAgICB0aGlzLmFjdGlvbnMgPSBuZXcgRnJhdWRBY3Rpb24oZGF0YVNvdXJjZSwgdGhpcy5sb2dnZXIpO1xuICAgIHRoaXMuYXBpID0gZXJnb0V4cGxvcmVyQ2xpZW50RmFjdG9yeShleHBsb3JlclVybCk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IElkIGZvciBjdXJyZW50IGV4dHJhY3RvclxuICAgKi9cbiAgZ2V0SWQgPSAoKSA9PiBgJHt0aGlzLmlkfWA7XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgZnJhdWQgYm94ZXMgaW4gdGhlIHNwZWNpZmllZCBibG9jayB0cmFuc2FjdGlvbnNcbiAgICogQHBhcmFtIHR4c1xuICAgKiBAcGFyYW0gYmxvY2tcbiAgICovXG4gIHByb2Nlc3NUcmFuc2FjdGlvbnMgPSAoXG4gICAgdHhzOiBBcnJheTxUcmFuc2FjdGlvbj4sXG4gICAgYmxvY2s6IEJsb2NrLFxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbmV3RnJhdWRzOiBBcnJheTxFeHRyYWN0ZWRGcmF1ZD4gPSBbXTtcbiAgICAgICAgY29uc3QgdHhTcGVuZElkczogQXJyYXk8eyB0eElkOiBzdHJpbmc7IHNwZW5kQm94ZXM6IEFycmF5PHN0cmluZz4gfT4gPVxuICAgICAgICAgIFtdO1xuICAgICAgICB0eHMuZm9yRWFjaCgodHJhbnNhY3Rpb24pID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiB0cmFuc2FjdGlvbi5vdXRwdXRzKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIG91dHB1dC5lcmdvVHJlZSAhPT0gdGhpcy5lcmdvVHJlZSB8fFxuICAgICAgICAgICAgICAhb3V0cHV0LmFzc2V0cyB8fFxuICAgICAgICAgICAgICBvdXRwdXQuYXNzZXRzWzBdLnRva2VuSWQgIT09IHRoaXMucnd0XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBib3hPdXRwdXQgPSB3YXNtLkVyZ29Cb3guZnJvbV9qc29uKEpzb25CSS5zdHJpbmdpZnkob3V0cHV0KSk7XG4gICAgICAgICAgICBjb25zdCByNCA9IGJveE91dHB1dFxuICAgICAgICAgICAgICAucmVnaXN0ZXJfdmFsdWUod2FzbS5Ob25NYW5kYXRvcnlSZWdpc3RlcklkLlI0KVxuICAgICAgICAgICAgICA/LnRvX2NvbGxfY29sbF9ieXRlKCk7XG4gICAgICAgICAgICBpZiAoIXI0KSB7XG4gICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgIGBBIG5ldyBmcmF1ZCBib3ggZm91bmQgd2l0aG91dCBjb3JyZWN0IHdpZCBmb3JtYXQgYXQgaGVpZ2h0ICR7YmxvY2suaGVpZ2h0fWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmV3RnJhdWQgPSB7XG4gICAgICAgICAgICAgIGJveElkOiBvdXRwdXQuYm94SWQsXG4gICAgICAgICAgICAgIHR4SWQ6IHRyYW5zYWN0aW9uLmlkLFxuICAgICAgICAgICAgICB0cmlnZ2VyQm94SWQ6IHRyYW5zYWN0aW9uLmlucHV0c1swXS5ib3hJZCxcbiAgICAgICAgICAgICAgd2lkOiBCdWZmZXIuZnJvbShyNFswXSkudG9TdHJpbmcoJ2hleCcpLFxuICAgICAgICAgICAgICByd3RDb3VudDogb3V0cHV0LmFzc2V0c1swXS5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgc2VyaWFsaXplZDogQnVmZmVyLmZyb20oXG4gICAgICAgICAgICAgICAgd2FzbS5FcmdvQm94LmZyb21fanNvbihcbiAgICAgICAgICAgICAgICAgIEpzb25CSS5zdHJpbmdpZnkob3V0cHV0KSxcbiAgICAgICAgICAgICAgICApLnNpZ21hX3NlcmlhbGl6ZV9ieXRlcygpLFxuICAgICAgICAgICAgICApLnRvU3RyaW5nKCdiYXNlNjQnKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBuZXdGcmF1ZHMucHVzaChuZXdGcmF1ZCk7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgYG5ldyBmcmF1ZCBmb3VuZCBbJHtuZXdGcmF1ZH1dIGF0IGhlaWdodCAke2Jsb2NrLmhlaWdodH1gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHhTcGVuZElkcy5wdXNoKHtcbiAgICAgICAgICAgIHR4SWQ6IHRyYW5zYWN0aW9uLmlkLFxuICAgICAgICAgICAgc3BlbmRCb3hlczogdHJhbnNhY3Rpb24uaW5wdXRzLm1hcCgoYm94KSA9PiBib3guYm94SWQpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hY3Rpb25zXG4gICAgICAgICAgLnN0b3JlQmxvY2tGcmF1ZHMobmV3RnJhdWRzLCBibG9jaywgdGhpcy5nZXRJZCgpKVxuICAgICAgICAgIC50aGVuKGFzeW5jIChzdGF0dXMpID0+IHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgICAgaWYgKG5ld0ZyYXVkcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgYHN1Y2Nlc3NmdWxseSBzdG9yZWQgbmV3IGZyYXVkcyBhdCBoaWdodCAke2Jsb2NrLmhlaWdodH1gLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGZvciAoY29uc3Qgc3BlbmRJZHMgb2YgdHhTcGVuZElkcylcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFjdGlvbnMuc3BlbmRGcmF1ZHMoXG4gICAgICAgICAgICAgICAgICBzcGVuZElkcy5zcGVuZEJveGVzLFxuICAgICAgICAgICAgICAgICAgYmxvY2ssXG4gICAgICAgICAgICAgICAgICB0aGlzLmdldElkKCksXG4gICAgICAgICAgICAgICAgICBzcGVuZElkcy50eElkLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKHN0YXR1cyk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICBgQW4gZXJyb3Igb2NjdXJyZWQgaW4gcHJvY2Vzc2luZyBmcmF1ZHMgaW4gYmxvY2sgWyR7YmxvY2suaGFzaH1dOiAke2V9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogZm9yayBvbmUgYmxvY2sgYW5kIHJlbW92ZSBhbGwgc3RvcmVkIGluZm9ybWF0aW9uIGZvciB0aGlzIGJsb2NrXG4gICAqIEBwYXJhbSBoYXNoOiBibG9jayBoYXNoXG4gICAqL1xuICBmb3JrQmxvY2sgPSBhc3luYyAoaGFzaDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXdhaXQgdGhpcy5hY3Rpb25zLmRlbGV0ZUJsb2NrKGhhc2gsIHRoaXMuZ2V0SWQoKSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBkYXRhYmFzZSB3aXRoIG9sZGVyIGZyYXVkc1xuICAgKi9cbiAgaW5pdGlhbGl6ZUJveGVzID0gYXN5bmMgKGluaXRpYWxCbG9jazogQmxvY2tJbmZvKSA9PiB7XG4gICAgLy8gR2V0dGluZyB1bnNwZW50IGJveGVzXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBgSW5pdGlhbGl6aW5nIGZyYXVkIHRhYmxlLiBzdG9yaW5nIGZyYXVkIGJveGVzIGNyZWF0ZWQgYmVsbG93IGhlaWdodCAke2luaXRpYWxCbG9jay5oZWlnaHR9LmAsXG4gICAgKTtcbiAgICBjb25zdCB1bnNwZW50RnJhdWRzID0gYXdhaXQgdGhpcy5nZXRVbnNwZW50RnJhdWRzKGluaXRpYWxCbG9jay5oZWlnaHQpO1xuICAgIGNvbnN0IHVuc3BlbnRCb3hJZHMgPSB1bnNwZW50RnJhdWRzLm1hcCgoYm94KSA9PiBib3guYm94SWQpO1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBVbnNwZW50IGZyYXVkIGJveElkcyAke3Vuc3BlbnRCb3hJZHN9YCk7XG5cbiAgICAvLyBTdG9yaW5nIGV4dHJhY3RlZCBib3hlc1xuICAgIGxldCBhbGxTdG9yZWRCb3hJZHMgPSBhd2FpdCB0aGlzLmFjdGlvbnMuZ2V0QWxsQm94SWRzKHRoaXMuZ2V0SWQoKSk7XG4gICAgZm9yIChjb25zdCBmcmF1ZCBvZiB1bnNwZW50RnJhdWRzKSB7XG4gICAgICBpZiAoYWxsU3RvcmVkQm94SWRzLmluY2x1ZGVzKGZyYXVkLmJveElkKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFjdGlvbnMudXBkYXRlRnJhdWQoZnJhdWQsIHRoaXMuZ2V0SWQoKSk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgICAgYFVwZGF0ZWQgdGhlIGV4aXN0aW5nIHVuc3BlbnQgZnJhdWQgd2l0aCBib3hJZCwgWyR7ZnJhdWQuYm94SWR9XWAsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKGBVcGRhdGVkIGZyYXVkOiBbJHtKU09OLnN0cmluZ2lmeShmcmF1ZCl9XWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hY3Rpb25zLmluc2VydEZyYXVkKGZyYXVkLCB0aGlzLmdldElkKCkpO1xuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBJbnNlcnRlZCBuZXcgdW5zcGVudCBmcmF1ZCB3aXRoIGJveElkLCBbJHtmcmF1ZC5ib3hJZH1dYCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoYEluc2VydGVkIGZyYXVkOiBbJHtKU09OLnN0cmluZ2lmeShmcmF1ZCl9XWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSB1cGRhdGVkIGJveCBpZHMgZnJvbSBleGlzdGluZyBib3hlcyBpbiBkYXRhYmFzZVxuICAgIGFsbFN0b3JlZEJveElkcyA9IGRpZmZlcmVuY2UoYWxsU3RvcmVkQm94SWRzLCB1bnNwZW50Qm94SWRzKTtcbiAgICAvLyBWYWxpZGF0aW5nIHJlbWFpbmVkIGJveGVzXG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBgVmFsaWRhdGluZyBhbmQgdXBkYXRpbmcgc3RvcmVkIGZyYXVkIGJveGVzIHdpdGggYm94SWRzICR7YWxsU3RvcmVkQm94SWRzfWAsXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlT2xkU3RvcmVkRnJhdWRzKGFsbFN0b3JlZEJveElkcywgaW5pdGlhbEJsb2NrLmhlaWdodCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGFsbCByZW1haW5pbmcgYm94ZXMgaW4gdGhlIGRhdGFiYXNlXG4gICAqIHVwZGF0ZSB0aGUgY29ycmVjdCBvbmVzIGFuZCByZW1vdmUgdGhlIGludmFsaWQgb25lc1xuICAgKiBAcGFyYW0gdW5jaGFuZ2VkU3RvcmVkQm94SWRzXG4gICAqIEBwYXJhbSBpbml0aWFsSGVpZ2h0XG4gICAqL1xuICB2YWxpZGF0ZU9sZFN0b3JlZEZyYXVkcyA9IGFzeW5jIChcbiAgICB1bmNoYW5nZWRTdG9yZWRCb3hJZHM6IEFycmF5PHN0cmluZz4sXG4gICAgaW5pdGlhbEhlaWdodDogbnVtYmVyLFxuICApID0+IHtcbiAgICBmb3IgKGNvbnN0IGJveElkIG9mIHVuY2hhbmdlZFN0b3JlZEJveElkcykge1xuICAgICAgY29uc3QgYm94ID0gYXdhaXQgdGhpcy5nZXRGcmF1ZEluZm9XaXRoQm94SWQoYm94SWQpO1xuICAgICAgaWYgKGJveCAmJiBib3guc3BlbmRCbG9jayAmJiBib3guc3BlbmRIZWlnaHQpIHtcbiAgICAgICAgaWYgKGJveC5zcGVuZEhlaWdodCA8IGluaXRpYWxIZWlnaHQpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGB1cGRhdGluZyBzcGVuZGluZyBpbmZvcm1hdGlvbiBvZiBmcmF1ZCB3aXRoIGJveElkIFske2JveC5ib3hJZH1dIHNwZW50IGF0IGhlaWdodCBbJHtib3guc3BlbmRIZWlnaHR9XWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFjdGlvbnMudXBkYXRlU3BlbmRCbG9jayhcbiAgICAgICAgICAgIGJveElkLFxuICAgICAgICAgICAgdGhpcy5nZXRJZCgpLFxuICAgICAgICAgICAgYm94LnNwZW5kQmxvY2ssXG4gICAgICAgICAgICBib3guc3BlbmRIZWlnaHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBmcmF1ZCB3aXRoIGJveElkIFske2JveC5ib3hJZH1dIGhhcyBiZWVuIHNwZW50IGFmdGVyIHRoZSBpbml0aWFsaXphdGlvbiBoZWlnaHQsIHVwZGF0aW5nIHNwZW5kaW5nIGluZm9ybWF0aW9uIHNraXBwZWQuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLmFjdGlvbnMucmVtb3ZlRnJhdWQoYm94SWQsIHRoaXMuZ2V0SWQoKSk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgICAgYFJlbW92ZWQgaW52YWxpZCBmcmF1ZCBbJHtib3hJZH1dIGluIGluaXRpYWxpemF0aW9uIHZhbGlkYXRpb25gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJuIGV4dHJhY3RlZCBpbmZvcm1hdGlvbiBvZiBhIGZyYXVkIHdpdGggaXRzIGJveElkXG4gICAqIEBwYXJhbSBib3hJZFxuICAgKi9cbiAgZ2V0RnJhdWRJbmZvV2l0aEJveElkID0gYXN5bmMgKFxuICAgIGJveElkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8RXh0cmFjdGVkRnJhdWQgfCB1bmRlZmluZWQ+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYm94ID0gYXdhaXQgdGhpcy5hcGkudjEuZ2V0QXBpVjFCb3hlc1AxKGJveElkKTtcbiAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5leHRyYWN0Qm94RGF0YShbYm94XSkpWzBdO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5sb2dnZXIud2FybihgQm94IHdpdGggaWQgWyR7Ym94SWR9XSBkb2VzIG5vdCBleGlzdHNgKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdW5zcGVudCBmcmF1ZHMgY3JlYXRlZCBiZWxsb3cgdGhlIGluaXRpYWwgaGVpZ2h0XG4gICAqIEBwYXJhbSBpbml0aWFsSGVpZ2h0XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRVbnNwZW50RnJhdWRzID0gYXN5bmMgKFxuICAgIGluaXRpYWxIZWlnaHQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTxBcnJheTxFeHRyYWN0ZWRGcmF1ZD4+ID0+IHtcbiAgICBsZXQgYWxsQm94ZXM6IEFycmF5PEV4dHJhY3RlZEZyYXVkPiA9IFtdO1xuICAgIGxldCBvZmZzZXQgPSAwLFxuICAgICAgdG90YWwgPSBEZWZhdWx0QXBpTGltaXQsXG4gICAgICBib3hlczogVjEuSXRlbXNPdXRwdXRJbmZvO1xuICAgIHdoaWxlIChvZmZzZXQgPCB0b3RhbCkge1xuICAgICAgYm94ZXMgPSBhd2FpdCB0aGlzLmFwaS52MS5nZXRBcGlWMUJveGVzVW5zcGVudEJ5ZXJnb3RyZWVQMShcbiAgICAgICAgdGhpcy5lcmdvVHJlZSxcbiAgICAgICAge1xuICAgICAgICAgIG9mZnNldDogb2Zmc2V0LFxuICAgICAgICAgIGxpbWl0OiBEZWZhdWx0QXBpTGltaXQsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgaWYgKCFib3hlcy5pdGVtcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGxvcmVyIGFwaSBvdXRwdXQgaXRlbXMgc2hvdWxkIG5vdCBiZSB1bmRlZmluZWQuJyk7XG4gICAgICB9XG4gICAgICBhbGxCb3hlcyA9IFtcbiAgICAgICAgLi4uYWxsQm94ZXMsXG4gICAgICAgIC4uLihhd2FpdCB0aGlzLmV4dHJhY3RCb3hEYXRhKFxuICAgICAgICAgIGJveGVzLml0ZW1zLmZpbHRlcihcbiAgICAgICAgICAgIChib3gpID0+XG4gICAgICAgICAgICAgIGJveC5jcmVhdGlvbkhlaWdodCA8IGluaXRpYWxIZWlnaHQgJiZcbiAgICAgICAgICAgICAgYm94LmFzc2V0cyAmJlxuICAgICAgICAgICAgICBib3guYXNzZXRzWzBdLnRva2VuSWQgPT0gdGhpcy5yd3QsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSksXG4gICAgICBdO1xuICAgICAgdG90YWwgPSBib3hlcy50b3RhbDtcbiAgICAgIG9mZnNldCArPSBEZWZhdWx0QXBpTGltaXQ7XG4gICAgfVxuICAgIHJldHVybiBhbGxCb3hlcztcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyBibG9jayBpbmZvcm1hdGlvbiBvZiB0eFxuICAgKiBAcGFyYW0gdHhJZFxuICAgKi9cbiAgZ2V0VHhCbG9jayA9IGFzeW5jICh0eElkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHRoaXMuYXBpLnYxLmdldEFwaVYxVHJhbnNhY3Rpb25zUDEodHhJZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0eC5ibG9ja0lkLFxuICAgICAgaGVpZ2h0OiB0eC5pbmNsdXNpb25IZWlnaHQsXG4gICAgfTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB0cmlnZ2VyIGJveElkIGZyb20gZnJhdWQgdHJhbnNhY3Rpb24gaWRcbiAgICogQHBhcmFtIHR4SWRcbiAgICovXG4gIGdldFRyaWdnZXJCb3hJZCA9IGFzeW5jICh0eElkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHRoaXMuYXBpLnYxLmdldEFwaVYxVHJhbnNhY3Rpb25zUDEodHhJZCk7XG4gICAgcmV0dXJuIHR4LmlucHV0cz8uWzBdLmJveElkO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFeHRyYWN0IG5lZWRlZCBpbmZvcm1hdGlvbiBmb3Igc3RvcmluZyBpbiBkYXRhYmFzZSBmcm9tIGFwaSBqc29uIG91dHB1dHNcbiAgICogQHBhcmFtIGJveGVzXG4gICAqL1xuICBleHRyYWN0Qm94RGF0YSA9IGFzeW5jIChib3hlczogQXJyYXk8VjEuT3V0cHV0SW5mbz4pID0+IHtcbiAgICBjb25zdCBleHRyYWN0ZWRGcmF1ZHM6IEFycmF5PEV4dHJhY3RlZEZyYXVkPiA9IFtdO1xuICAgIGZvciAoY29uc3QgYm94IG9mIGJveGVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBgRXh0cmFjdGluZyBib3ggZnJhdWQgaW5mb3JtYXRpb24gZnJvbSBib3ggd2l0aCBib3hJZCBbJHtib3guYm94SWR9XWAsXG4gICAgICAgICk7XG4gICAgICAgIGxldCBzcGVuZEJsb2NrLCBzcGVuZEhlaWdodDtcbiAgICAgICAgLy8gRXh0cmFjdCBzcGVuZGluZyBpbmZvcm1hdGlvblxuICAgICAgICBpZiAoYm94LnNwZW50VHJhbnNhY3Rpb25JZCkge1xuICAgICAgICAgIGNvbnN0IGJsb2NrID0gYXdhaXQgdGhpcy5nZXRUeEJsb2NrKGJveC5zcGVudFRyYW5zYWN0aW9uSWQpO1xuICAgICAgICAgIHNwZW5kQmxvY2sgPSBibG9jay5pZDtcbiAgICAgICAgICBzcGVuZEhlaWdodCA9IGJsb2NrLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFeHRyYWN0IFdJRFxuICAgICAgICBjb25zdCBlcmdvQm94ID0gd2FzbS5FcmdvQm94LmZyb21fanNvbihKc29uQkkuc3RyaW5naWZ5KGJveCkpO1xuICAgICAgICBjb25zdCByNCA9IGVyZ29Cb3hcbiAgICAgICAgICAucmVnaXN0ZXJfdmFsdWUod2FzbS5Ob25NYW5kYXRvcnlSZWdpc3RlcklkLlI0KVxuICAgICAgICAgID8udG9fY29sbF9jb2xsX2J5dGUoKTtcbiAgICAgICAgLy8gRXh0cmFjdCB0cmlnZ2VyIGJveElkXG4gICAgICAgIGNvbnN0IHRyaWdnZXJCb3hJZCA9IGF3YWl0IHRoaXMuZ2V0VHJpZ2dlckJveElkKGJveC50cmFuc2FjdGlvbklkKTtcbiAgICAgICAgaWYgKCFyNCB8fCAhdHJpZ2dlckJveElkKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICAgIGBTa2lwcGluZyBzdG9yaW5nIGZyYXVkIHdpdGggYm94SWQgWyR7Ym94LmJveElkfV0sIHdpZCBvciB0cmlnZ2VyIGJveCBpZCBpcyB1bmRlZmluZWRgLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHRyYWN0ZWRGcmF1ZCA9IHtcbiAgICAgICAgICBib3hJZDogZXJnb0JveC5ib3hfaWQoKS50b19zdHIoKSxcbiAgICAgICAgICB0cmlnZ2VyQm94SWQ6IHRyaWdnZXJCb3hJZCxcbiAgICAgICAgICB3aWQ6IEJ1ZmZlci5mcm9tKHI0WzBdKS50b1N0cmluZygnaGV4JyksXG4gICAgICAgICAgcnd0Q291bnQ6IGJveC5hc3NldHMhWzBdLmFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgIHNlcmlhbGl6ZWQ6IEJ1ZmZlci5mcm9tKGVyZ29Cb3guc2lnbWFfc2VyaWFsaXplX2J5dGVzKCkpLnRvU3RyaW5nKFxuICAgICAgICAgICAgJ2Jhc2U2NCcsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBibG9ja0lkOiBib3guYmxvY2tJZCxcbiAgICAgICAgICBoZWlnaHQ6IGJveC5zZXR0bGVtZW50SGVpZ2h0LFxuICAgICAgICAgIHR4SWQ6IGJveC50cmFuc2FjdGlvbklkLFxuICAgICAgICAgIHNwZW5kQmxvY2s6IHNwZW5kQmxvY2ssXG4gICAgICAgICAgc3BlbmRIZWlnaHQ6IHNwZW5kSGVpZ2h0LFxuICAgICAgICAgIHNwZW5kVHhJZDogYm94LnNwZW50VHJhbnNhY3Rpb25JZCxcbiAgICAgICAgfTtcbiAgICAgICAgZXh0cmFjdGVkRnJhdWRzLnB1c2goZXh0cmFjdGVkRnJhdWQpO1xuICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhgRXh0cmFjdGVkIGZyYXVkOiBbJHtleHRyYWN0ZWRGcmF1ZH1dYCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBFeHRyYWN0aW5nIGZyYXVkIGluZm9ybWF0aW9uIGZhaWxlZCBmb3IgYm94IFske2JveC5ib3hJZH1dIHdpdGggZXJyb3I6ICR7ZX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXh0cmFjdGVkRnJhdWRzO1xuICB9O1xufVxuIl19
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhdWRFeHRyYWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZXh0cmFjdG9yL2ZyYXVkRXh0cmFjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDaEMsT0FBTyxLQUFLLElBQUksTUFBTSxzQkFBc0IsQ0FBQztBQUU3QyxPQUFPLEVBQ0wsd0JBQXdCLEdBR3pCLE1BQU0sa0NBQWtDLENBQUM7QUFHMUMsT0FBTyxNQUFNLE1BQU0sMkJBQTJCLENBQUM7QUFPL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBSXJELE1BQU0sT0FBTyxjQUFlLFNBQVEsd0JBR25DO0lBQ1UsT0FBTyxDQUFjO0lBQ2IsRUFBRSxDQUFTO0lBQ1gsUUFBUSxDQUFTO0lBQ2pCLEdBQUcsQ0FBUztJQUU3QixZQUNFLFVBQXNCLEVBQ3RCLEVBQVUsRUFDVixHQUFXLEVBQ1gsaUJBQW9DLEVBQ3BDLE1BQXVCO1FBRXZCLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDO2FBQ2hFLFlBQVksRUFBRTthQUNkLGVBQWUsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FDNUIsVUFBVSxFQUNWLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUNqQyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBRTNCOzs7O09BSUc7SUFDSCxVQUFVLEdBQUcsQ0FBQyxHQUFjLEVBQVcsRUFBRTtRQUN2QyxJQUNFLEdBQUcsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLFFBQVE7WUFDOUIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUN2QixHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsR0FBRyxFQUNsQyxDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsMkNBQTJDO1FBQzNDLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM5RCxNQUFNLEVBQUUsR0FBRyxPQUFPO2lCQUNmLGNBQWMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDO2dCQUMvQyxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQztRQUNwQixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUY7Ozs7T0FJRztJQUNILHVCQUF1QixHQUFHLENBQUMsRUFBZSxFQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELFlBQVksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7S0FDakMsQ0FBQyxDQUFDO0lBRUg7Ozs7OztPQU1HO0lBQ0gsY0FBYyxHQUFHLENBQ2YsR0FBYyxFQUNkLGdCQUFrQyxFQUNsQyxPQUFpQixFQUNXLEVBQUU7UUFDOUIsTUFBTSxZQUFZLEdBQUcsT0FBTyxFQUFFLFlBQVksQ0FBQztRQUMzQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FDYix5REFBeUQsR0FBRyxDQUFDLEtBQUssY0FBYyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQzFHLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzlELE1BQU0sRUFBRSxHQUFHLE9BQU87YUFDZixjQUFjLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQztZQUMvQyxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBRXBCLE9BQU87WUFDTCxVQUFVLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRTtZQUNyQyxZQUFZO1lBQ1osSUFBSSxFQUFFLEdBQUcsQ0FBQyxhQUFhO1lBQ3ZCLEdBQUcsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDckMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtZQUN6QyxVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FDL0QsUUFBUSxDQUNUO1NBQ0YsQ0FBQztJQUNKLENBQUMsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCAqIGFzIHdhc20gZnJvbSAnZXJnby1saWItd2FzbS1ub2RlanMnO1xuXG5pbXBvcnQge1xuICBBYnN0cmFjdEVyZ29Cb3hFeHRyYWN0b3IsXG4gIEluaXRpYWxpemVPcHRpb25zLFxuICBUeEV4dHJhLFxufSBmcm9tICdAcm9zZW4tYnJpZGdlL2Fic3RyYWN0LWV4dHJhY3Rvcic7XG5pbXBvcnQgeyBBYnN0cmFjdExvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2V4dGVuZGVkLXR5cGVvcm0nO1xuaW1wb3J0IEpzb25CSSBmcm9tICdAcm9zZW4tYnJpZGdlL2pzb24tYmlnaW50JztcbmltcG9ydCB7XG4gIElucHV0RXh0ZW5zaW9uLFxuICBPdXRwdXRCb3gsXG4gIFRyYW5zYWN0aW9uLFxufSBmcm9tICdAcm9zZW4tYnJpZGdlL3NjYW5uZXItaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7IEZyYXVkQWN0aW9uIH0gZnJvbSAnLi4vYWN0aW9ucy9mcmF1ZEFjdGlvbic7XG5pbXBvcnQgeyBGcmF1ZEVudGl0eSB9IGZyb20gJy4uL2VudGl0aWVzL2ZyYXVkRW50aXR5JztcbmltcG9ydCB7IEV4dHJhY3RlZEZyYXVkIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBGcmF1ZEV4dHJhY3RvciBleHRlbmRzIEFic3RyYWN0RXJnb0JveEV4dHJhY3RvcjxcbiAgRXh0cmFjdGVkRnJhdWQsXG4gIEZyYXVkRW50aXR5XG4+IHtcbiAgcmVhZG9ubHkgYWN0aW9uczogRnJhdWRBY3Rpb247XG4gIHByaXZhdGUgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBlcmdvVHJlZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHJ3dDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsXG4gICAgaWQ6IHN0cmluZyxcbiAgICByd3Q6IHN0cmluZyxcbiAgICBpbml0aWFsaXplT3B0aW9uczogSW5pdGlhbGl6ZU9wdGlvbnMsXG4gICAgbG9nZ2VyPzogQWJzdHJhY3RMb2dnZXIsXG4gICkge1xuICAgIHN1cGVyKGluaXRpYWxpemVPcHRpb25zLCBsb2dnZXIpO1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLmVyZ29UcmVlID0gd2FzbS5BZGRyZXNzLmZyb21fYmFzZTU4KGluaXRpYWxpemVPcHRpb25zLmFkZHJlc3MpXG4gICAgICAudG9fZXJnb190cmVlKClcbiAgICAgIC50b19iYXNlMTZfYnl0ZXMoKTtcbiAgICB0aGlzLnJ3dCA9IHJ3dDtcbiAgICB0aGlzLmFjdGlvbnMgPSBuZXcgRnJhdWRBY3Rpb24oXG4gICAgICBkYXRhU291cmNlLFxuICAgICAgdGhpcy5sb2dnZXIuY2hpbGQoJ0ZyYXVkQWN0aW9uJyksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgSWQgZm9yIGN1cnJlbnQgZXh0cmFjdG9yXG4gICAqL1xuICBnZXRJZCA9ICgpID0+IGAke3RoaXMuaWR9YDtcblxuICAvKipcbiAgICogY2hlY2sgcHJvcGVyIGRhdGEgZm9ybWF0IGluIHRoZSBib3hcbiAgICogQHBhcmFtIGJveFxuICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGJveCBoYXMgdGhlIHJlcXVpcmVkIGRhdGEgYW5kIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgaGFzQm94RGF0YSA9IChib3g6IE91dHB1dEJveCk6IGJvb2xlYW4gPT4ge1xuICAgIGlmIChcbiAgICAgIGJveC5lcmdvVHJlZSAhPT0gdGhpcy5lcmdvVHJlZSB8fFxuICAgICAgYm94LmFzc2V0cy5sZW5ndGggPT09IDAgfHxcbiAgICAgIGJveC5hc3NldHNbMF0udG9rZW5JZCAhPT0gdGhpcy5yd3RcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBSNCByZWdpc3RlciBleGlzdHMgYW5kIGlzIHZhbGlkXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVyZ29Cb3ggPSB3YXNtLkVyZ29Cb3guZnJvbV9qc29uKEpzb25CSS5zdHJpbmdpZnkoYm94KSk7XG4gICAgICBjb25zdCByNCA9IGVyZ29Cb3hcbiAgICAgICAgLnJlZ2lzdGVyX3ZhbHVlKHdhc20uTm9uTWFuZGF0b3J5UmVnaXN0ZXJJZC5SNClcbiAgICAgICAgPy50b19ieXRlX2FycmF5KCk7XG4gICAgICByZXR1cm4gcjQgIT0gbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIGV4dHJhY3QgdHJhbnNhY3Rpb24gZXh0cmEgaW5mb3JtYXRpb25cbiAgICogQHBhcmFtIHR4XG4gICAqIEByZXR1cm5zIHRyYW5zYWN0aW9uIGV4dHJhIGRhdGEgY29udGFpbmluZyB0cmlnZ2VyIGJveCBpZFxuICAgKi9cbiAgZ2V0VHJhbnNhY3Rpb25FeHRyYURhdGEgPSAodHg6IFRyYW5zYWN0aW9uKTogVHhFeHRyYSA9PiAoe1xuICAgIHRyaWdnZXJCb3hJZDogdHguaW5wdXRzWzBdLmJveElkLFxuICB9KTtcblxuICAvKipcbiAgICogZXh0cmFjdCBib3ggZGF0YSB0byBwcm9wZXIgZm9ybWF0IChub3QgaW5jbHVkaW5nIHNwZW5kaW5nIGluZm9ybWF0aW9uKVxuICAgKiBAcGFyYW0gYm94XG4gICAqIEBwYXJhbSBpbnB1dEV4dGVuc2lvbnMgYWxsIGlucHV0IGJveCBleHRlbnNpb25zIGluIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB0eEV4dHJhIHRyYW5zYWN0aW9uIGV4dHJhIGRhdGEgY29udGFpbmluZyB0cmlnZ2VyIGJveCBpZFxuICAgKiBAcmV0dXJuIGV4dHJhY3RlZCBkYXRhIGluIHByb3BlciBmb3JtYXRcbiAgICovXG4gIGV4dHJhY3RCb3hEYXRhID0gKFxuICAgIGJveDogT3V0cHV0Qm94LFxuICAgIF9pbnB1dEV4dGVuc2lvbnM6IElucHV0RXh0ZW5zaW9uW10sXG4gICAgdHhFeHRyYT86IFR4RXh0cmEsXG4gICk6IEV4dHJhY3RlZEZyYXVkIHwgdW5kZWZpbmVkID0+IHtcbiAgICBjb25zdCB0cmlnZ2VyQm94SWQgPSB0eEV4dHJhPy50cmlnZ2VyQm94SWQ7XG4gICAgaWYgKCF0cmlnZ2VyQm94SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEltcG9zc2libGVCZWhhdmlvdXI6IFRyaWdnZXIgYm94SWQgaXMgbWlzc2luZyBmb3IgYm94ICR7Ym94LmJveElkfSwgdHhFeHRyYTogJHtKU09OLnN0cmluZ2lmeSh0eEV4dHJhKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBlcmdvQm94ID0gd2FzbS5FcmdvQm94LmZyb21fanNvbihKc29uQkkuc3RyaW5naWZ5KGJveCkpO1xuICAgIGNvbnN0IHI0ID0gZXJnb0JveFxuICAgICAgLnJlZ2lzdGVyX3ZhbHVlKHdhc20uTm9uTWFuZGF0b3J5UmVnaXN0ZXJJZC5SNClcbiAgICAgID8udG9fYnl0ZV9hcnJheSgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkZW50aWZpZXI6IGVyZ29Cb3guYm94X2lkKCkudG9fc3RyKCksXG4gICAgICB0cmlnZ2VyQm94SWQsXG4gICAgICB0eElkOiBib3gudHJhbnNhY3Rpb25JZCxcbiAgICAgIHdpZDogQnVmZmVyLmZyb20ocjQhKS50b1N0cmluZygnaGV4JyksXG4gICAgICByd3RDb3VudDogYm94LmFzc2V0c1swXS5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgIHNlcmlhbGl6ZWQ6IEJ1ZmZlci5mcm9tKGVyZ29Cb3guc2lnbWFfc2VyaWFsaXplX2J5dGVzKCkpLnRvU3RyaW5nKFxuICAgICAgICAnYmFzZTY0JyxcbiAgICAgICksXG4gICAgfTtcbiAgfTtcbn1cbiJdfQ==
@@ -1,15 +1,11 @@
1
- interface ExtractedFraud {
2
- boxId: string;
3
- serialized: string;
1
+ import { AbstractEntityData } from '@rosen-bridge/abstract-extractor';
2
+ export interface ExtractedFraud extends AbstractEntityData {
3
+ txId: string;
4
4
  triggerBoxId: string;
5
5
  wid: string;
6
6
  rwtCount: string;
7
- blockId?: string;
8
- height?: number;
9
- txId?: string;
10
- spendBlock?: string;
11
- spendHeight?: number;
12
- spendTxId?: string;
7
+ spendBlock?: string | null;
8
+ spendHeight?: number | null;
9
+ spendTxId?: string | null;
13
10
  }
14
- export { ExtractedFraud };
15
11
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../lib/interfaces/types.ts"],"names":[],"mappings":"AAAA,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../lib/interfaces/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE,MAAM,WAAW,cAAe,SAAQ,kBAAkB;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B"}
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaW50ZXJmYWNlcy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW50ZXJmYWNlIEV4dHJhY3RlZEZyYXVkIHtcbiAgYm94SWQ6IHN0cmluZztcbiAgc2VyaWFsaXplZDogc3RyaW5nO1xuICB0cmlnZ2VyQm94SWQ6IHN0cmluZztcbiAgd2lkOiBzdHJpbmc7XG4gIHJ3dENvdW50OiBzdHJpbmc7XG4gIGJsb2NrSWQ/OiBzdHJpbmc7XG4gIGhlaWdodD86IG51bWJlcjtcbiAgdHhJZD86IHN0cmluZztcbiAgc3BlbmRCbG9jaz86IHN0cmluZztcbiAgc3BlbmRIZWlnaHQ/OiBudW1iZXI7XG4gIHNwZW5kVHhJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IHsgRXh0cmFjdGVkRnJhdWQgfTtcbiJdfQ==
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaW50ZXJmYWNlcy90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3RFbnRpdHlEYXRhIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9hYnN0cmFjdC1leHRyYWN0b3InO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dHJhY3RlZEZyYXVkIGV4dGVuZHMgQWJzdHJhY3RFbnRpdHlEYXRhIHtcbiAgdHhJZDogc3RyaW5nO1xuICB0cmlnZ2VyQm94SWQ6IHN0cmluZztcbiAgd2lkOiBzdHJpbmc7XG4gIHJ3dENvdW50OiBzdHJpbmc7XG4gIHNwZW5kQmxvY2s/OiBzdHJpbmcgfCBudWxsO1xuICBzcGVuZEhlaWdodD86IG51bWJlciB8IG51bGw7XG4gIHNwZW5kVHhJZD86IHN0cmluZyB8IG51bGw7XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAE1E,eAAO,MAAM,UAAU;;;CAGtB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/migrations/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAE5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAG1E,eAAO,MAAM,UAAU;;;CAGtB,CAAC"}