@rosen-bridge/tx-pot 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/.eslintignore +1 -0
  2. package/README.md +36 -0
  3. package/dist/db/entities/TransactionEntity.d.ts +15 -0
  4. package/dist/db/entities/TransactionEntity.d.ts.map +1 -0
  5. package/dist/db/entities/TransactionEntity.js +81 -0
  6. package/dist/db/migrations/index.d.ts +7 -0
  7. package/dist/db/migrations/index.d.ts.map +1 -0
  8. package/dist/db/migrations/index.js +7 -0
  9. package/dist/db/migrations/postgres/1706350644686-migration.d.ts +7 -0
  10. package/dist/db/migrations/postgres/1706350644686-migration.d.ts.map +1 -0
  11. package/dist/db/migrations/postgres/1706350644686-migration.js +28 -0
  12. package/dist/db/migrations/sqlite/1706007154531-migration.d.ts +7 -0
  13. package/dist/db/migrations/sqlite/1706007154531-migration.d.ts.map +1 -0
  14. package/dist/db/migrations/sqlite/1706007154531-migration.js +28 -0
  15. package/dist/index.d.ts +6 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +6 -0
  18. package/dist/network/AbstractPotChainManager.d.ts +36 -0
  19. package/dist/network/AbstractPotChainManager.d.ts.map +1 -0
  20. package/dist/network/AbstractPotChainManager.js +3 -0
  21. package/dist/transaction/TxPot.d.ts +164 -0
  22. package/dist/transaction/TxPot.d.ts.map +1 -0
  23. package/dist/transaction/TxPot.js +386 -0
  24. package/dist/transaction/types.d.ts +35 -0
  25. package/dist/transaction/types.d.ts.map +1 -0
  26. package/dist/transaction/types.js +21 -0
  27. package/dist/transaction/utils.d.ts +8 -0
  28. package/dist/transaction/utils.d.ts.map +1 -0
  29. package/dist/transaction/utils.js +56 -0
  30. package/lib/db/entities/TransactionEntity.ts +44 -0
  31. package/lib/db/migrations/index.ts +7 -0
  32. package/lib/db/migrations/postgres/1706350644686-migration.ts +31 -0
  33. package/lib/db/migrations/sqlite/1706007154531-migration.ts +31 -0
  34. package/lib/index.ts +5 -0
  35. package/lib/network/AbstractPotChainManager.ts +44 -0
  36. package/lib/transaction/TxPot.ts +519 -0
  37. package/lib/transaction/types.ts +46 -0
  38. package/lib/transaction/utils.ts +59 -0
  39. package/package.json +39 -0
  40. package/tests/.gitkeep +0 -0
  41. package/tests/db/dataSource.mock.ts +18 -0
  42. package/tests/network/TestPotChainManager.ts +23 -0
  43. package/tests/transaction/TestTxPot.ts +32 -0
  44. package/tests/transaction/TxPot.spec.ts +1517 -0
  45. package/tests/transaction/testData.ts +84 -0
  46. package/tsconfig.build.json +8 -0
  47. package/tsconfig.build.tsbuildinfo +1 -0
  48. package/tsconfig.json +9 -0
  49. package/vitest.config.ts +13 -0
@@ -0,0 +1,386 @@
1
+ import { TransactionEntity } from '../db/entities/TransactionEntity';
2
+ import { DummyLogger } from '@rosen-bridge/logger-interface';
3
+ import { SigningStatus, TransactionStatus, UnregisteredChain, } from './types';
4
+ import { txOptionToClause } from './utils';
5
+ export class TxPot {
6
+ static instance;
7
+ txRepository;
8
+ chains = new Map();
9
+ validators = new Map();
10
+ txTypeCallbacks = new Map();
11
+ logger;
12
+ constructor(dataSource, logger) {
13
+ this.txRepository = dataSource.getRepository(TransactionEntity);
14
+ this.logger = logger ?? new DummyLogger();
15
+ this.logger.debug('TxPot instantiated');
16
+ }
17
+ /**
18
+ * initiates TxPot
19
+ * @param dataSource typeorm data source
20
+ * @param logger
21
+ * @returns
22
+ */
23
+ static setup = (dataSource, logger) => {
24
+ TxPot.instance = new TxPot(dataSource, logger);
25
+ return TxPot.instance;
26
+ };
27
+ /**
28
+ * returns TxPot instance (throws error if none exists)
29
+ * @returns TxPot instance
30
+ */
31
+ static getInstance = () => {
32
+ if (!TxPot.instance)
33
+ throw Error(`TxPot instance doesn't exist`);
34
+ return TxPot.instance;
35
+ };
36
+ /**
37
+ * registers a chain to TxPot
38
+ * @param chain
39
+ * @param chainManager
40
+ */
41
+ registerChain = (chain, chainManager) => {
42
+ this.chains.set(chain, chainManager);
43
+ this.logger.debug(`A TxPot chain manager is registered for chain [${chain}]`);
44
+ };
45
+ /**
46
+ * registers a validator function
47
+ * @param chain
48
+ * @param txType
49
+ * @param validator
50
+ */
51
+ registerValidator = (chain, txType, validator) => {
52
+ let chainValidators = this.validators.get(chain);
53
+ if (!chainValidators) {
54
+ chainValidators = new Map();
55
+ this.validators.set(chain, chainValidators);
56
+ }
57
+ chainValidators.set(txType, validator);
58
+ this.logger.debug(`A tx validator function is registered for chain [${chain}] and type [${txType}]`);
59
+ };
60
+ /**
61
+ * registers a callback function
62
+ * the callback will be called when status of any transactions
63
+ * of given type changes to given status
64
+ * @param txType
65
+ * @param status
66
+ * @param callback
67
+ */
68
+ registerCallback = (txType, status, callback) => {
69
+ let typeCallbacks = this.txTypeCallbacks.get(txType);
70
+ if (!typeCallbacks) {
71
+ typeCallbacks = new Map();
72
+ this.txTypeCallbacks.set(txType, typeCallbacks);
73
+ }
74
+ typeCallbacks.set(status, callback);
75
+ this.logger.debug(`A tx status callback function is registered for type [${txType}] and status [${status}]`);
76
+ };
77
+ /**
78
+ * returns chain manager for given chain
79
+ * throws error if no manager is registered for it
80
+ * @param chain
81
+ */
82
+ getChainManager = (chain) => {
83
+ const manager = this.chains.get(chain);
84
+ if (!manager)
85
+ throw new UnregisteredChain(`No manager is registered for chain [${chain}]`);
86
+ return manager;
87
+ };
88
+ /**
89
+ * sets the tx as invalid if enough blocks is passed from last check
90
+ * @param tx
91
+ */
92
+ setTransactionAsInvalid = async (tx) => {
93
+ const manager = this.getChainManager(tx.chain);
94
+ const currentHeight = await manager.getHeight();
95
+ const requiredConfirmation = manager.getTxRequiredConfirmation(tx.txType);
96
+ if (currentHeight - tx.lastCheck >= requiredConfirmation) {
97
+ await this.setTxStatus(tx, TransactionStatus.INVALID);
98
+ this.logger.info(`Tx [${tx.txId}] is invalid`);
99
+ }
100
+ else {
101
+ this.logger.info(`Tx [${tx.txId}] seems invalid. Waiting for enough confirmation of this proposition [${currentHeight - tx.lastCheck}/${requiredConfirmation}]`);
102
+ }
103
+ };
104
+ /**
105
+ * validates a transaction
106
+ * returns true if no validator functions is set or tx is valid
107
+ * otherwise handle the tx as invalid and returns false
108
+ * @param tx
109
+ */
110
+ validateTx = async (tx) => {
111
+ const validator = this.validators.get(tx.chain)?.get(tx.txType);
112
+ if (validator === undefined) {
113
+ // tx is valid since no validator is found
114
+ this.logger.debug(`No validator function is found for chain [${tx.chain}] and type [${tx.txType}]`);
115
+ return true;
116
+ }
117
+ if (await validator(tx))
118
+ return true;
119
+ await this.setTransactionAsInvalid(tx);
120
+ return false;
121
+ };
122
+ /**
123
+ * updates the status of a tx
124
+ * @param txKey tx id and chain
125
+ * @param status new status
126
+ */
127
+ setTxStatus = async (tx, status) => {
128
+ await this.txRepository.update({
129
+ txId: tx.txId,
130
+ chain: tx.chain,
131
+ }, {
132
+ status: status,
133
+ lastStatusUpdate: this.currentTime(),
134
+ });
135
+ const callback = this.txTypeCallbacks.get(tx.txType)?.get(status);
136
+ if (callback)
137
+ callback(tx, status).catch((e) => {
138
+ this.logger.debug(`An error occurred while handling tx [${tx.txId}] status change: ${e}`);
139
+ if (e instanceof Error && e.stack)
140
+ this.logger.debug(e.stack);
141
+ });
142
+ else
143
+ this.logger.debug(`No callback function is set for type [${tx.txType}] and status [${status}]`);
144
+ };
145
+ /**
146
+ * @returns current timestamp in seconds and string format
147
+ */
148
+ currentTime = () => String(Math.round(Date.now() / 1000));
149
+ /**
150
+ * submits the signed transaction to the blockchain
151
+ * @param tx
152
+ */
153
+ processSignedTx = async (tx) => {
154
+ const manager = this.getChainManager(tx.chain);
155
+ try {
156
+ await manager.submitTransaction(tx.serializedTx);
157
+ }
158
+ catch (e) {
159
+ this.logger.warn(`Failed to submit tx [${tx.txId}] to chain [${tx.chain}]: ${e}`);
160
+ if (e instanceof Error && e.stack)
161
+ this.logger.warn(e.stack);
162
+ }
163
+ await this.setTxStatus(tx, TransactionStatus.SENT);
164
+ };
165
+ /**
166
+ * processes the sent transaction
167
+ * @param tx
168
+ */
169
+ processesSentTx = async (tx) => {
170
+ const manager = this.getChainManager(tx.chain);
171
+ const txConfirmation = await manager.getTxConfirmation(tx.txId);
172
+ const requiredConfirmation = manager.getTxRequiredConfirmation(tx.txType);
173
+ if (txConfirmation >= requiredConfirmation) {
174
+ // tx is confirmed enough
175
+ await this.setTxStatus(tx, TransactionStatus.COMPLETED);
176
+ }
177
+ else if (txConfirmation === -1) {
178
+ // tx is not mined, checking mempool...
179
+ if (await manager.isTxInMempool(tx.txId)) {
180
+ // tx is in mempool, updating last check...
181
+ const height = await manager.getHeight();
182
+ await this.updateTxLastCheck(tx.txId, tx.chain, height);
183
+ this.logger.info(`Tx [${tx.txId}] is in mempool`);
184
+ }
185
+ else {
186
+ // tx is not in mempool, checking if tx is still valid
187
+ const isValidTx = await manager.isTxValid(tx.serializedTx, SigningStatus.Signed);
188
+ const isValidToType = await this.validateTx(tx);
189
+ if (isValidTx && isValidToType) {
190
+ // tx is valid. resending...
191
+ this.logger.info(`Tx [${tx.txId}] is still valid. Resending tx...`);
192
+ await manager.submitTransaction(tx.serializedTx);
193
+ }
194
+ else {
195
+ // tx seems invalid. reset status if enough blocks past.
196
+ await this.setTransactionAsInvalid(tx);
197
+ }
198
+ }
199
+ }
200
+ else {
201
+ // tx is mined, but is not confirmed enough, updating last check...
202
+ const height = await manager.getHeight();
203
+ await this.updateTxLastCheck(tx.txId, tx.chain, height);
204
+ this.logger.info(`Tx [${tx.txId}] is in confirmation process [${txConfirmation}/${requiredConfirmation}]`);
205
+ }
206
+ };
207
+ /**
208
+ * runs all jobs of TxPot
209
+ * - process signed txs
210
+ * - process sent txs
211
+ */
212
+ update = async () => {
213
+ // process signed txs
214
+ const signedTxs = await this.getTxsByStatus(TransactionStatus.SIGNED);
215
+ for (const tx of signedTxs) {
216
+ try {
217
+ await this.processSignedTx(tx);
218
+ }
219
+ catch (e) {
220
+ this.logger.warn(`An error occurred while processing tx [${tx.txId}] with status [${TransactionStatus.SIGNED}]: ${e}`);
221
+ if (e instanceof Error && e.stack)
222
+ this.logger.warn(e.stack);
223
+ }
224
+ }
225
+ this.logger.debug(`Processed [${signedTxs.length}] txs with status [${TransactionStatus.SIGNED}]`);
226
+ // process sent txs
227
+ const sentTxs = await this.getTxsByStatus(TransactionStatus.SENT);
228
+ for (const tx of sentTxs) {
229
+ try {
230
+ await this.processesSentTx(tx);
231
+ }
232
+ catch (e) {
233
+ this.logger.warn(`An error occurred while processing tx [${tx.txId}] with status [${TransactionStatus.SENT}]: ${e}`);
234
+ if (e instanceof Error && e.stack)
235
+ this.logger.warn(e.stack);
236
+ }
237
+ }
238
+ this.logger.debug(`Processed [${sentTxs.length}] txs with status [${TransactionStatus.SENT}]`);
239
+ };
240
+ /**
241
+ * gets transactions by status
242
+ * @param status
243
+ * @param validate
244
+ * @returns
245
+ */
246
+ getTxsByStatus = async (status, validate = false) => {
247
+ const txs = await this.txRepository.find({
248
+ where: {
249
+ status: status,
250
+ },
251
+ });
252
+ if (!validate)
253
+ return txs;
254
+ // validate the transactions
255
+ const validTxs = [];
256
+ for (const tx of txs) {
257
+ if (await this.validateTx(tx))
258
+ validTxs.push(tx);
259
+ }
260
+ return validTxs;
261
+ };
262
+ /**
263
+ * inserts a new transaction into db
264
+ * @param txId
265
+ * @param chain
266
+ * @param txType
267
+ * @param requiredSign
268
+ * @param serializedTx
269
+ * @param initialStatus
270
+ * @param lastCheck
271
+ */
272
+ addTx = async (txId, chain, txType, requiredSign, serializedTx, initialStatus = TransactionStatus.APPROVED, lastCheck = 0) => {
273
+ await this.txRepository.insert({
274
+ txId: txId,
275
+ chain: chain,
276
+ txType: txType,
277
+ status: initialStatus,
278
+ requiredSign: requiredSign,
279
+ lastCheck: lastCheck,
280
+ lastStatusUpdate: this.currentTime(),
281
+ failedInSign: false,
282
+ signFailedCount: 0,
283
+ serializedTx: serializedTx,
284
+ });
285
+ };
286
+ /**
287
+ * updates the status of a tx
288
+ * @param txId
289
+ * @param chain
290
+ * @param status new status
291
+ */
292
+ setTxStatusById = async (txId, chain, status) => {
293
+ const tx = await this.txRepository.findOneOrFail({
294
+ where: { txId, chain },
295
+ });
296
+ await this.setTxStatus(tx, status);
297
+ };
298
+ /**
299
+ * updates tx info when failed in sign process
300
+ * @param txId
301
+ * @param chain
302
+ */
303
+ setTxAsSignFailed = async (txId, chain) => {
304
+ await this.txRepository.update({
305
+ txId: txId,
306
+ chain: chain,
307
+ status: TransactionStatus.IN_SIGN,
308
+ }, {
309
+ status: TransactionStatus.SIGN_FAILED,
310
+ lastStatusUpdate: this.currentTime(),
311
+ signFailedCount: () => '"signFailedCount" + 1',
312
+ failedInSign: true,
313
+ });
314
+ };
315
+ /**
316
+ * updates the tx and set status as signed
317
+ * @param txId
318
+ * @param chain
319
+ * @param serializedTx
320
+ * @param currentHeight current height of the blockchain
321
+ * @param extra
322
+ * @param extra2
323
+ */
324
+ setTxAsSigned = async (txId, chain, serializedTx, currentHeight, extra, extra2) => {
325
+ const updatedFields = {
326
+ serializedTx: serializedTx,
327
+ status: TransactionStatus.SIGNED,
328
+ lastStatusUpdate: this.currentTime(),
329
+ lastCheck: currentHeight,
330
+ };
331
+ if (extra)
332
+ updatedFields.extra = extra;
333
+ if (extra2)
334
+ updatedFields.extra2 = extra2;
335
+ await this.txRepository.update({ txId, chain }, updatedFields);
336
+ };
337
+ /**
338
+ * updates last check value of a tx
339
+ * @param txId
340
+ * @param chain
341
+ * @param currentHeight current height of the blockchain
342
+ */
343
+ updateTxLastCheck = async (txId, chain, currentHeight) => {
344
+ await this.txRepository.update({ txId, chain }, { lastCheck: currentHeight });
345
+ };
346
+ /**
347
+ * updates failedInSign field of a transaction to false
348
+ * @param txId
349
+ * @param chain
350
+ */
351
+ resetFailedInSign = async (txId, chain) => {
352
+ await this.txRepository.update({ txId, chain }, {
353
+ failedInSign: false,
354
+ });
355
+ };
356
+ /**
357
+ * updates requiredSign field of a transaction
358
+ * @param txId
359
+ * @param chain
360
+ * @param requiredSign
361
+ */
362
+ updateRequiredSign = async (txId, chain, requiredSign) => {
363
+ await this.txRepository.update({ txId, chain }, {
364
+ requiredSign: requiredSign,
365
+ });
366
+ };
367
+ /**
368
+ * gets the transaction by its id and chain
369
+ * @param txId
370
+ * @param chain
371
+ */
372
+ getTxByKey = async (txId, chain) => {
373
+ return await this.txRepository.findOne({
374
+ where: { txId, chain },
375
+ });
376
+ };
377
+ /**
378
+ * @returns the transactions with valid status
379
+ */
380
+ getTxsQuery = (options = []) => {
381
+ return this.txRepository.find({
382
+ where: options.map(txOptionToClause),
383
+ });
384
+ };
385
+ }
386
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHhQb3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdHJhbnNhY3Rpb24vVHhQb3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFrQixXQUFXLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RSxPQUFPLEVBRUwsYUFBYSxFQUNiLGlCQUFpQixFQUVqQixpQkFBaUIsR0FFbEIsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRzNDLE1BQU0sT0FBTyxLQUFLO0lBQ04sTUFBTSxDQUFDLFFBQVEsQ0FBUTtJQUNkLFlBQVksQ0FBZ0M7SUFDckQsTUFBTSxHQUFHLElBQUksR0FBRyxFQUFtQyxDQUFDO0lBQ3BELFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBMEMsQ0FBQztJQUMvRCxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBR2hDLENBQUM7SUFDTSxNQUFNLENBQWlCO0lBRWpDLFlBQXNCLFVBQXNCLEVBQUUsTUFBdUI7UUFDbkUsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLElBQUksSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FDcEIsVUFBc0IsRUFDdEIsTUFBdUIsRUFDaEIsRUFBRTtRQUNULEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQztJQUN4QixDQUFDLENBQUM7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QUN4QixJQUFZLEVBQ1osS0FBYSxFQUNiLFlBQW9CLEVBQ0wsRUFBRTtRQUNqQixNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUM1QixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFDZjtZQUNFLFlBQVksRUFBRSxZQUFZO1NBQzNCLENBQ0YsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGOzs7O09BSUc7SUFDSCxVQUFVLEdBQUcsS0FBSyxFQUNoQixJQUFZLEVBQ1osS0FBYSxFQUNzQixFQUFFO1FBQ3JDLE9BQU8sTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztZQUNyQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO1NBQ3ZCLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGOztPQUVHO0lBQ0gsV0FBVyxHQUFHLENBQ1osVUFBNEIsRUFBRSxFQUNBLEVBQUU7UUFDaEMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztZQUM1QixLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQztTQUNyQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhU291cmNlLCBSZXBvc2l0b3J5IH0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkVudGl0eSB9IGZyb20gJy4uL2RiL2VudGl0aWVzL1RyYW5zYWN0aW9uRW50aXR5JztcbmltcG9ydCB7IEFic3RyYWN0TG9nZ2VyLCBEdW1teUxvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvbG9nZ2VyLWludGVyZmFjZSc7XG5pbXBvcnQge1xuICBDYWxsYmFja0Z1bmN0aW9uLFxuICBTaWduaW5nU3RhdHVzLFxuICBUcmFuc2FjdGlvblN0YXR1cyxcbiAgVHhPcHRpb25zLFxuICBVbnJlZ2lzdGVyZWRDaGFpbixcbiAgVmFsaWRhdG9yRnVuY3Rpb24sXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgdHhPcHRpb25Ub0NsYXVzZSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgQWJzdHJhY3RQb3RDaGFpbk1hbmFnZXIgfSBmcm9tICcuLi9uZXR3b3JrL0Fic3RyYWN0UG90Q2hhaW5NYW5hZ2VyJztcblxuZXhwb3J0IGNsYXNzIFR4UG90IHtcbiAgcHJvdGVjdGVkIHN0YXRpYyBpbnN0YW5jZTogVHhQb3Q7XG4gIHByb3RlY3RlZCByZWFkb25seSB0eFJlcG9zaXRvcnk6IFJlcG9zaXRvcnk8VHJhbnNhY3Rpb25FbnRpdHk+O1xuICBwcm90ZWN0ZWQgY2hhaW5zID0gbmV3IE1hcDxzdHJpbmcsIEFic3RyYWN0UG90Q2hhaW5NYW5hZ2VyPigpO1xuICBwcm90ZWN0ZWQgdmFsaWRhdG9ycyA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBWYWxpZGF0b3JGdW5jdGlvbj4+KCk7XG4gIHByb3RlY3RlZCB0eFR5cGVDYWxsYmFja3MgPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICBNYXA8VHJhbnNhY3Rpb25TdGF0dXMsIENhbGxiYWNrRnVuY3Rpb24+XG4gID4oKTtcbiAgcHJvdGVjdGVkIGxvZ2dlcjogQWJzdHJhY3RMb2dnZXI7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsIGxvZ2dlcj86IEFic3RyYWN0TG9nZ2VyKSB7XG4gICAgdGhpcy50eFJlcG9zaXRvcnkgPSBkYXRhU291cmNlLmdldFJlcG9zaXRvcnkoVHJhbnNhY3Rpb25FbnRpdHkpO1xuICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyID8/IG5ldyBEdW1teUxvZ2dlcigpO1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdUeFBvdCBpbnN0YW50aWF0ZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBpbml0aWF0ZXMgVHhQb3RcbiAgICogQHBhcmFtIGRhdGFTb3VyY2UgdHlwZW9ybSBkYXRhIHNvdXJjZVxuICAgKiBAcGFyYW0gbG9nZ2VyXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNldHVwID0gKFxuICAgIGRhdGFTb3VyY2U6IERhdGFTb3VyY2UsXG4gICAgbG9nZ2VyPzogQWJzdHJhY3RMb2dnZXJcbiAgKTogVHhQb3QgPT4ge1xuICAgIFR4UG90Lmluc3RhbmNlID0gbmV3IFR4UG90KGRhdGFTb3VyY2UsIGxvZ2dlcik7XG4gICAgcmV0dXJuIFR4UG90Lmluc3RhbmNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiByZXR1cm5zIFR4UG90IGluc3RhbmNlICh0aHJvd3MgZXJyb3IgaWYgbm9uZSBleGlzdHMpXG4gICAqIEByZXR1cm5zIFR4UG90IGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlID0gKCk6IFR4UG90ID0+IHtcbiAgICBpZiAoIVR4UG90Lmluc3RhbmNlKSB0aHJvdyBFcnJvcihgVHhQb3QgaW5zdGFuY2UgZG9lc24ndCBleGlzdGApO1xuICAgIHJldHVybiBUeFBvdC5pbnN0YW5jZTtcbiAgfTtcblxuICAvKipcbiAgICogcmVnaXN0ZXJzIGEgY2hhaW4gdG8gVHhQb3RcbiAgICogQHBhcmFtIGNoYWluXG4gICAqIEBwYXJhbSBjaGFpbk1hbmFnZXJcbiAgICovXG4gIHJlZ2lzdGVyQ2hhaW4gPSAoXG4gICAgY2hhaW46IHN0cmluZyxcbiAgICBjaGFpbk1hbmFnZXI6IEFic3RyYWN0UG90Q2hhaW5NYW5hZ2VyXG4gICk6IHZvaWQgPT4ge1xuICAgIHRoaXMuY2hhaW5zLnNldChjaGFpbiwgY2hhaW5NYW5hZ2VyKTtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBBIFR4UG90IGNoYWluIG1hbmFnZXIgaXMgcmVnaXN0ZXJlZCBmb3IgY2hhaW4gWyR7Y2hhaW59XWBcbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiByZWdpc3RlcnMgYSB2YWxpZGF0b3IgZnVuY3Rpb25cbiAgICogQHBhcmFtIGNoYWluXG4gICAqIEBwYXJhbSB0eFR5cGVcbiAgICogQHBhcmFtIHZhbGlkYXRvclxuICAgKi9cbiAgcmVnaXN0ZXJWYWxpZGF0b3IgPSAoXG4gICAgY2hhaW46IHN0cmluZyxcbiAgICB0eFR5cGU6IHN0cmluZyxcbiAgICB2YWxpZGF0b3I6IFZhbGlkYXRvckZ1bmN0aW9uXG4gICk6IHZvaWQgPT4ge1xuICAgIGxldCBjaGFpblZhbGlkYXRvcnMgPSB0aGlzLnZhbGlkYXRvcnMuZ2V0KGNoYWluKTtcbiAgICBpZiAoIWNoYWluVmFsaWRhdG9ycykge1xuICAgICAgY2hhaW5WYWxpZGF0b3JzID0gbmV3IE1hcDxzdHJpbmcsIFZhbGlkYXRvckZ1bmN0aW9uPigpO1xuICAgICAgdGhpcy52YWxpZGF0b3JzLnNldChjaGFpbiwgY2hhaW5WYWxpZGF0b3JzKTtcbiAgICB9XG5cbiAgICBjaGFpblZhbGlkYXRvcnMuc2V0KHR4VHlwZSwgdmFsaWRhdG9yKTtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBBIHR4IHZhbGlkYXRvciBmdW5jdGlvbiBpcyByZWdpc3RlcmVkIGZvciBjaGFpbiBbJHtjaGFpbn1dIGFuZCB0eXBlIFske3R4VHlwZX1dYFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHJlZ2lzdGVycyBhIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqICB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2hlbiBzdGF0dXMgb2YgYW55IHRyYW5zYWN0aW9uc1xuICAgKiAgb2YgZ2l2ZW4gdHlwZSBjaGFuZ2VzIHRvIGdpdmVuIHN0YXR1c1xuICAgKiBAcGFyYW0gdHhUeXBlXG4gICAqIEBwYXJhbSBzdGF0dXNcbiAgICogQHBhcmFtIGNhbGxiYWNrXG4gICAqL1xuICByZWdpc3RlckNhbGxiYWNrID0gKFxuICAgIHR4VHlwZTogc3RyaW5nLFxuICAgIHN0YXR1czogVHJhbnNhY3Rpb25TdGF0dXMsXG4gICAgY2FsbGJhY2s6IENhbGxiYWNrRnVuY3Rpb25cbiAgKTogdm9pZCA9PiB7XG4gICAgbGV0IHR5cGVDYWxsYmFja3MgPSB0aGlzLnR4VHlwZUNhbGxiYWNrcy5nZXQodHhUeXBlKTtcbiAgICBpZiAoIXR5cGVDYWxsYmFja3MpIHtcbiAgICAgIHR5cGVDYWxsYmFja3MgPSBuZXcgTWFwPFRyYW5zYWN0aW9uU3RhdHVzLCBDYWxsYmFja0Z1bmN0aW9uPigpO1xuICAgICAgdGhpcy50eFR5cGVDYWxsYmFja3Muc2V0KHR4VHlwZSwgdHlwZUNhbGxiYWNrcyk7XG4gICAgfVxuXG4gICAgdHlwZUNhbGxiYWNrcy5zZXQoc3RhdHVzLCBjYWxsYmFjayk7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBgQSB0eCBzdGF0dXMgY2FsbGJhY2sgZnVuY3Rpb24gaXMgcmVnaXN0ZXJlZCBmb3IgdHlwZSBbJHt0eFR5cGV9XSBhbmQgc3RhdHVzIFske3N0YXR1c31dYFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHJldHVybnMgY2hhaW4gbWFuYWdlciBmb3IgZ2l2ZW4gY2hhaW5cbiAgICogIHRocm93cyBlcnJvciBpZiBubyBtYW5hZ2VyIGlzIHJlZ2lzdGVyZWQgZm9yIGl0XG4gICAqIEBwYXJhbSBjaGFpblxuICAgKi9cbiAgcHJvdGVjdGVkIGdldENoYWluTWFuYWdlciA9IChjaGFpbjogc3RyaW5nKTogQWJzdHJhY3RQb3RDaGFpbk1hbmFnZXIgPT4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLmNoYWlucy5nZXQoY2hhaW4pO1xuICAgIGlmICghbWFuYWdlcilcbiAgICAgIHRocm93IG5ldyBVbnJlZ2lzdGVyZWRDaGFpbihcbiAgICAgICAgYE5vIG1hbmFnZXIgaXMgcmVnaXN0ZXJlZCBmb3IgY2hhaW4gWyR7Y2hhaW59XWBcbiAgICAgICk7XG4gICAgcmV0dXJuIG1hbmFnZXI7XG4gIH07XG5cbiAgLyoqXG4gICAqIHNldHMgdGhlIHR4IGFzIGludmFsaWQgaWYgZW5vdWdoIGJsb2NrcyBpcyBwYXNzZWQgZnJvbSBsYXN0IGNoZWNrXG4gICAqIEBwYXJhbSB0eFxuICAgKi9cbiAgcHJvdGVjdGVkIHNldFRyYW5zYWN0aW9uQXNJbnZhbGlkID0gYXN5bmMgKFxuICAgIHR4OiBUcmFuc2FjdGlvbkVudGl0eVxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5nZXRDaGFpbk1hbmFnZXIodHguY2hhaW4pO1xuXG4gICAgY29uc3QgY3VycmVudEhlaWdodCA9IGF3YWl0IG1hbmFnZXIuZ2V0SGVpZ2h0KCk7XG4gICAgY29uc3QgcmVxdWlyZWRDb25maXJtYXRpb24gPSBtYW5hZ2VyLmdldFR4UmVxdWlyZWRDb25maXJtYXRpb24odHgudHhUeXBlKTtcblxuICAgIGlmIChjdXJyZW50SGVpZ2h0IC0gdHgubGFzdENoZWNrID49IHJlcXVpcmVkQ29uZmlybWF0aW9uKSB7XG4gICAgICBhd2FpdCB0aGlzLnNldFR4U3RhdHVzKHR4LCBUcmFuc2FjdGlvblN0YXR1cy5JTlZBTElEKTtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oYFR4IFske3R4LnR4SWR9XSBpcyBpbnZhbGlkYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nZ2VyLmluZm8oXG4gICAgICAgIGBUeCBbJHtcbiAgICAgICAgICB0eC50eElkXG4gICAgICAgIH1dIHNlZW1zIGludmFsaWQuIFdhaXRpbmcgZm9yIGVub3VnaCBjb25maXJtYXRpb24gb2YgdGhpcyBwcm9wb3NpdGlvbiBbJHtcbiAgICAgICAgICBjdXJyZW50SGVpZ2h0IC0gdHgubGFzdENoZWNrXG4gICAgICAgIH0vJHtyZXF1aXJlZENvbmZpcm1hdGlvbn1dYFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIHZhbGlkYXRlcyBhIHRyYW5zYWN0aW9uXG4gICAqIHJldHVybnMgdHJ1ZSBpZiBubyB2YWxpZGF0b3IgZnVuY3Rpb25zIGlzIHNldCBvciB0eCBpcyB2YWxpZFxuICAgKiBvdGhlcndpc2UgaGFuZGxlIHRoZSB0eCBhcyBpbnZhbGlkIGFuZCByZXR1cm5zIGZhbHNlXG4gICAqIEBwYXJhbSB0eFxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlVHggPSBhc3luYyAodHg6IFRyYW5zYWN0aW9uRW50aXR5KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy52YWxpZGF0b3JzLmdldCh0eC5jaGFpbik/LmdldCh0eC50eFR5cGUpO1xuICAgIGlmICh2YWxpZGF0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gdHggaXMgdmFsaWQgc2luY2Ugbm8gdmFsaWRhdG9yIGlzIGZvdW5kXG4gICAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYE5vIHZhbGlkYXRvciBmdW5jdGlvbiBpcyBmb3VuZCBmb3IgY2hhaW4gWyR7dHguY2hhaW59XSBhbmQgdHlwZSBbJHt0eC50eFR5cGV9XWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGF3YWl0IHZhbGlkYXRvcih0eCkpIHJldHVybiB0cnVlO1xuXG4gICAgYXdhaXQgdGhpcy5zZXRUcmFuc2FjdGlvbkFzSW52YWxpZCh0eCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qKlxuICAgKiB1cGRhdGVzIHRoZSBzdGF0dXMgb2YgYSB0eFxuICAgKiBAcGFyYW0gdHhLZXkgdHggaWQgYW5kIGNoYWluXG4gICAqIEBwYXJhbSBzdGF0dXMgbmV3IHN0YXR1c1xuICAgKi9cbiAgcHJvdGVjdGVkIHNldFR4U3RhdHVzID0gYXN5bmMgKFxuICAgIHR4OiBUcmFuc2FjdGlvbkVudGl0eSxcbiAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGF3YWl0IHRoaXMudHhSZXBvc2l0b3J5LnVwZGF0ZShcbiAgICAgIHtcbiAgICAgICAgdHhJZDogdHgudHhJZCxcbiAgICAgICAgY2hhaW46IHR4LmNoYWluLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc3RhdHVzOiBzdGF0dXMsXG4gICAgICAgIGxhc3RTdGF0dXNVcGRhdGU6IHRoaXMuY3VycmVudFRpbWUoKSxcbiAgICAgIH1cbiAgICApO1xuICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy50eFR5cGVDYWxsYmFja3MuZ2V0KHR4LnR4VHlwZSk/LmdldChzdGF0dXMpO1xuICAgIGlmIChjYWxsYmFjaylcbiAgICAgIGNhbGxiYWNrKHR4LCBzdGF0dXMpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIGBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0eCBbJHt0eC50eElkfV0gc3RhdHVzIGNoYW5nZTogJHtlfWBcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLnN0YWNrKSB0aGlzLmxvZ2dlci5kZWJ1ZyhlLnN0YWNrKTtcbiAgICAgIH0pO1xuICAgIGVsc2VcbiAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgTm8gY2FsbGJhY2sgZnVuY3Rpb24gaXMgc2V0IGZvciB0eXBlIFske3R4LnR4VHlwZX1dIGFuZCBzdGF0dXMgWyR7c3RhdHVzfV1gXG4gICAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBjdXJyZW50IHRpbWVzdGFtcCBpbiBzZWNvbmRzIGFuZCBzdHJpbmcgZm9ybWF0XG4gICAqL1xuICBwcm90ZWN0ZWQgY3VycmVudFRpbWUgPSAoKSA9PiBTdHJpbmcoTWF0aC5yb3VuZChEYXRlLm5vdygpIC8gMTAwMCkpO1xuXG4gIC8qKlxuICAgKiBzdWJtaXRzIHRoZSBzaWduZWQgdHJhbnNhY3Rpb24gdG8gdGhlIGJsb2NrY2hhaW5cbiAgICogQHBhcmFtIHR4XG4gICAqL1xuICBwcm90ZWN0ZWQgcHJvY2Vzc1NpZ25lZFR4ID0gYXN5bmMgKHR4OiBUcmFuc2FjdGlvbkVudGl0eSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLmdldENoYWluTWFuYWdlcih0eC5jaGFpbik7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG1hbmFnZXIuc3VibWl0VHJhbnNhY3Rpb24odHguc2VyaWFsaXplZFR4KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFxuICAgICAgICBgRmFpbGVkIHRvIHN1Ym1pdCB0eCBbJHt0eC50eElkfV0gdG8gY2hhaW4gWyR7dHguY2hhaW59XTogJHtlfWBcbiAgICAgICk7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUuc3RhY2spIHRoaXMubG9nZ2VyLndhcm4oZS5zdGFjayk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2V0VHhTdGF0dXModHgsIFRyYW5zYWN0aW9uU3RhdHVzLlNFTlQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBwcm9jZXNzZXMgdGhlIHNlbnQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHR4XG4gICAqL1xuICBwcm90ZWN0ZWQgcHJvY2Vzc2VzU2VudFR4ID0gYXN5bmMgKHR4OiBUcmFuc2FjdGlvbkVudGl0eSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLmdldENoYWluTWFuYWdlcih0eC5jaGFpbik7XG5cbiAgICBjb25zdCB0eENvbmZpcm1hdGlvbiA9IGF3YWl0IG1hbmFnZXIuZ2V0VHhDb25maXJtYXRpb24odHgudHhJZCk7XG4gICAgY29uc3QgcmVxdWlyZWRDb25maXJtYXRpb24gPSBtYW5hZ2VyLmdldFR4UmVxdWlyZWRDb25maXJtYXRpb24odHgudHhUeXBlKTtcblxuICAgIGlmICh0eENvbmZpcm1hdGlvbiA+PSByZXF1aXJlZENvbmZpcm1hdGlvbikge1xuICAgICAgLy8gdHggaXMgY29uZmlybWVkIGVub3VnaFxuICAgICAgYXdhaXQgdGhpcy5zZXRUeFN0YXR1cyh0eCwgVHJhbnNhY3Rpb25TdGF0dXMuQ09NUExFVEVEKTtcbiAgICB9IGVsc2UgaWYgKHR4Q29uZmlybWF0aW9uID09PSAtMSkge1xuICAgICAgLy8gdHggaXMgbm90IG1pbmVkLCBjaGVja2luZyBtZW1wb29sLi4uXG4gICAgICBpZiAoYXdhaXQgbWFuYWdlci5pc1R4SW5NZW1wb29sKHR4LnR4SWQpKSB7XG4gICAgICAgIC8vIHR4IGlzIGluIG1lbXBvb2wsIHVwZGF0aW5nIGxhc3QgY2hlY2suLi5cbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gYXdhaXQgbWFuYWdlci5nZXRIZWlnaHQoKTtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVUeExhc3RDaGVjayh0eC50eElkLCB0eC5jaGFpbiwgaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5sb2dnZXIuaW5mbyhgVHggWyR7dHgudHhJZH1dIGlzIGluIG1lbXBvb2xgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHR4IGlzIG5vdCBpbiBtZW1wb29sLCBjaGVja2luZyBpZiB0eCBpcyBzdGlsbCB2YWxpZFxuICAgICAgICBjb25zdCBpc1ZhbGlkVHggPSBhd2FpdCBtYW5hZ2VyLmlzVHhWYWxpZChcbiAgICAgICAgICB0eC5zZXJpYWxpemVkVHgsXG4gICAgICAgICAgU2lnbmluZ1N0YXR1cy5TaWduZWRcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaXNWYWxpZFRvVHlwZSA9IGF3YWl0IHRoaXMudmFsaWRhdGVUeCh0eCk7XG5cbiAgICAgICAgaWYgKGlzVmFsaWRUeCAmJiBpc1ZhbGlkVG9UeXBlKSB7XG4gICAgICAgICAgLy8gdHggaXMgdmFsaWQuIHJlc2VuZGluZy4uLlxuICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oYFR4IFske3R4LnR4SWR9XSBpcyBzdGlsbCB2YWxpZC4gUmVzZW5kaW5nIHR4Li4uYCk7XG4gICAgICAgICAgYXdhaXQgbWFuYWdlci5zdWJtaXRUcmFuc2FjdGlvbih0eC5zZXJpYWxpemVkVHgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHR4IHNlZW1zIGludmFsaWQuIHJlc2V0IHN0YXR1cyBpZiBlbm91Z2ggYmxvY2tzIHBhc3QuXG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXRUcmFuc2FjdGlvbkFzSW52YWxpZCh0eCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdHggaXMgbWluZWQsIGJ1dCBpcyBub3QgY29uZmlybWVkIGVub3VnaCwgdXBkYXRpbmcgbGFzdCBjaGVjay4uLlxuICAgICAgY29uc3QgaGVpZ2h0ID0gYXdhaXQgbWFuYWdlci5nZXRIZWlnaHQoKTtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlVHhMYXN0Q2hlY2sodHgudHhJZCwgdHguY2hhaW4sIGhlaWdodCk7XG4gICAgICB0aGlzLmxvZ2dlci5pbmZvKFxuICAgICAgICBgVHggWyR7dHgudHhJZH1dIGlzIGluIGNvbmZpcm1hdGlvbiBwcm9jZXNzIFske3R4Q29uZmlybWF0aW9ufS8ke3JlcXVpcmVkQ29uZmlybWF0aW9ufV1gXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogcnVucyBhbGwgam9icyBvZiBUeFBvdFxuICAgKiAtIHByb2Nlc3Mgc2lnbmVkIHR4c1xuICAgKiAtIHByb2Nlc3Mgc2VudCB0eHNcbiAgICovXG4gIHVwZGF0ZSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAvLyBwcm9jZXNzIHNpZ25lZCB0eHNcbiAgICBjb25zdCBzaWduZWRUeHMgPSBhd2FpdCB0aGlzLmdldFR4c0J5U3RhdHVzKFRyYW5zYWN0aW9uU3RhdHVzLlNJR05FRCk7XG4gICAgZm9yIChjb25zdCB0eCBvZiBzaWduZWRUeHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc1NpZ25lZFR4KHR4KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0eCBbJHt0eC50eElkfV0gd2l0aCBzdGF0dXMgWyR7VHJhbnNhY3Rpb25TdGF0dXMuU0lHTkVEfV06ICR7ZX1gXG4gICAgICAgICk7XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5zdGFjaykgdGhpcy5sb2dnZXIud2FybihlLnN0YWNrKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoXG4gICAgICBgUHJvY2Vzc2VkIFske3NpZ25lZFR4cy5sZW5ndGh9XSB0eHMgd2l0aCBzdGF0dXMgWyR7VHJhbnNhY3Rpb25TdGF0dXMuU0lHTkVEfV1gXG4gICAgKTtcblxuICAgIC8vIHByb2Nlc3Mgc2VudCB0eHNcbiAgICBjb25zdCBzZW50VHhzID0gYXdhaXQgdGhpcy5nZXRUeHNCeVN0YXR1cyhUcmFuc2FjdGlvblN0YXR1cy5TRU5UKTtcbiAgICBmb3IgKGNvbnN0IHR4IG9mIHNlbnRUeHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc2VzU2VudFR4KHR4KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIud2FybihcbiAgICAgICAgICBgQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0eCBbJHt0eC50eElkfV0gd2l0aCBzdGF0dXMgWyR7VHJhbnNhY3Rpb25TdGF0dXMuU0VOVH1dOiAke2V9YFxuICAgICAgICApO1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUuc3RhY2spIHRoaXMubG9nZ2VyLndhcm4oZS5zdGFjayk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubG9nZ2VyLmRlYnVnKFxuICAgICAgYFByb2Nlc3NlZCBbJHtzZW50VHhzLmxlbmd0aH1dIHR4cyB3aXRoIHN0YXR1cyBbJHtUcmFuc2FjdGlvblN0YXR1cy5TRU5UfV1gXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogZ2V0cyB0cmFuc2FjdGlvbnMgYnkgc3RhdHVzXG4gICAqIEBwYXJhbSBzdGF0dXNcbiAgICogQHBhcmFtIHZhbGlkYXRlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBnZXRUeHNCeVN0YXR1cyA9IGFzeW5jIChcbiAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzLFxuICAgIHZhbGlkYXRlID0gZmFsc2VcbiAgKTogUHJvbWlzZTxBcnJheTxUcmFuc2FjdGlvbkVudGl0eT4+ID0+IHtcbiAgICBjb25zdCB0eHMgPSBhd2FpdCB0aGlzLnR4UmVwb3NpdG9yeS5maW5kKHtcbiAgICAgIHdoZXJlOiB7XG4gICAgICAgIHN0YXR1czogc3RhdHVzLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBpZiAoIXZhbGlkYXRlKSByZXR1cm4gdHhzO1xuXG4gICAgLy8gdmFsaWRhdGUgdGhlIHRyYW5zYWN0aW9uc1xuICAgIGNvbnN0IHZhbGlkVHhzOiBBcnJheTxUcmFuc2FjdGlvbkVudGl0eT4gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHR4IG9mIHR4cykge1xuICAgICAgaWYgKGF3YWl0IHRoaXMudmFsaWRhdGVUeCh0eCkpIHZhbGlkVHhzLnB1c2godHgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsaWRUeHM7XG4gIH07XG5cbiAgLyoqXG4gICAqIGluc2VydHMgYSBuZXcgdHJhbnNhY3Rpb24gaW50byBkYlxuICAgKiBAcGFyYW0gdHhJZFxuICAgKiBAcGFyYW0gY2hhaW5cbiAgICogQHBhcmFtIHR4VHlwZVxuICAgKiBAcGFyYW0gcmVxdWlyZWRTaWduXG4gICAqIEBwYXJhbSBzZXJpYWxpemVkVHhcbiAgICogQHBhcmFtIGluaXRpYWxTdGF0dXNcbiAgICogQHBhcmFtIGxhc3RDaGVja1xuICAgKi9cbiAgYWRkVHggPSBhc3luYyAoXG4gICAgdHhJZDogc3RyaW5nLFxuICAgIGNoYWluOiBzdHJpbmcsXG4gICAgdHhUeXBlOiBzdHJpbmcsXG4gICAgcmVxdWlyZWRTaWduOiBudW1iZXIsXG4gICAgc2VyaWFsaXplZFR4OiBzdHJpbmcsXG4gICAgaW5pdGlhbFN0YXR1cyA9IFRyYW5zYWN0aW9uU3RhdHVzLkFQUFJPVkVELFxuICAgIGxhc3RDaGVjayA9IDBcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXdhaXQgdGhpcy50eFJlcG9zaXRvcnkuaW5zZXJ0KHtcbiAgICAgIHR4SWQ6IHR4SWQsXG4gICAgICBjaGFpbjogY2hhaW4sXG4gICAgICB0eFR5cGU6IHR4VHlwZSxcbiAgICAgIHN0YXR1czogaW5pdGlhbFN0YXR1cyxcbiAgICAgIHJlcXVpcmVkU2lnbjogcmVxdWlyZWRTaWduLFxuICAgICAgbGFzdENoZWNrOiBsYXN0Q2hlY2ssXG4gICAgICBsYXN0U3RhdHVzVXBkYXRlOiB0aGlzLmN1cnJlbnRUaW1lKCksXG4gICAgICBmYWlsZWRJblNpZ246IGZhbHNlLFxuICAgICAgc2lnbkZhaWxlZENvdW50OiAwLFxuICAgICAgc2VyaWFsaXplZFR4OiBzZXJpYWxpemVkVHgsXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHVwZGF0ZXMgdGhlIHN0YXR1cyBvZiBhIHR4XG4gICAqIEBwYXJhbSB0eElkXG4gICAqIEBwYXJhbSBjaGFpblxuICAgKiBAcGFyYW0gc3RhdHVzIG5ldyBzdGF0dXNcbiAgICovXG4gIHNldFR4U3RhdHVzQnlJZCA9IGFzeW5jIChcbiAgICB0eElkOiBzdHJpbmcsXG4gICAgY2hhaW46IHN0cmluZyxcbiAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzXG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdGhpcy50eFJlcG9zaXRvcnkuZmluZE9uZU9yRmFpbCh7XG4gICAgICB3aGVyZTogeyB0eElkLCBjaGFpbiB9LFxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMuc2V0VHhTdGF0dXModHgsIHN0YXR1cyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHVwZGF0ZXMgdHggaW5mbyB3aGVuIGZhaWxlZCBpbiBzaWduIHByb2Nlc3NcbiAgICogQHBhcmFtIHR4SWRcbiAgICogQHBhcmFtIGNoYWluXG4gICAqL1xuICBzZXRUeEFzU2lnbkZhaWxlZCA9IGFzeW5jICh0eElkOiBzdHJpbmcsIGNoYWluOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBhd2FpdCB0aGlzLnR4UmVwb3NpdG9yeS51cGRhdGUoXG4gICAgICB7XG4gICAgICAgIHR4SWQ6IHR4SWQsXG4gICAgICAgIGNoYWluOiBjaGFpbixcbiAgICAgICAgc3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1cy5JTl9TSUdOLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1cy5TSUdOX0ZBSUxFRCxcbiAgICAgICAgbGFzdFN0YXR1c1VwZGF0ZTogdGhpcy5jdXJyZW50VGltZSgpLFxuICAgICAgICBzaWduRmFpbGVkQ291bnQ6ICgpID0+ICdcInNpZ25GYWlsZWRDb3VudFwiICsgMScsXG4gICAgICAgIGZhaWxlZEluU2lnbjogdHJ1ZSxcbiAgICAgIH1cbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiB1cGRhdGVzIHRoZSB0eCBhbmQgc2V0IHN0YXR1cyBhcyBzaWduZWRcbiAgICogQHBhcmFtIHR4SWRcbiAgICogQHBhcmFtIGNoYWluXG4gICAqIEBwYXJhbSBzZXJpYWxpemVkVHhcbiAgICogQHBhcmFtIGN1cnJlbnRIZWlnaHQgY3VycmVudCBoZWlnaHQgb2YgdGhlIGJsb2NrY2hhaW5cbiAgICogQHBhcmFtIGV4dHJhXG4gICAqIEBwYXJhbSBleHRyYTJcbiAgICovXG4gIHNldFR4QXNTaWduZWQgPSBhc3luYyAoXG4gICAgdHhJZDogc3RyaW5nLFxuICAgIGNoYWluOiBzdHJpbmcsXG4gICAgc2VyaWFsaXplZFR4OiBzdHJpbmcsXG4gICAgY3VycmVudEhlaWdodDogbnVtYmVyLFxuICAgIGV4dHJhPzogc3RyaW5nLFxuICAgIGV4dHJhMj86IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCB1cGRhdGVkRmllbGRzOiBQYXJ0aWFsPFRyYW5zYWN0aW9uRW50aXR5PiA9IHtcbiAgICAgIHNlcmlhbGl6ZWRUeDogc2VyaWFsaXplZFR4LFxuICAgICAgc3RhdHVzOiBUcmFuc2FjdGlvblN0YXR1cy5TSUdORUQsXG4gICAgICBsYXN0U3RhdHVzVXBkYXRlOiB0aGlzLmN1cnJlbnRUaW1lKCksXG4gICAgICBsYXN0Q2hlY2s6IGN1cnJlbnRIZWlnaHQsXG4gICAgfTtcbiAgICBpZiAoZXh0cmEpIHVwZGF0ZWRGaWVsZHMuZXh0cmEgPSBleHRyYTtcbiAgICBpZiAoZXh0cmEyKSB1cGRhdGVkRmllbGRzLmV4dHJhMiA9IGV4dHJhMjtcblxuICAgIGF3YWl0IHRoaXMudHhSZXBvc2l0b3J5LnVwZGF0ZSh7IHR4SWQsIGNoYWluIH0sIHVwZGF0ZWRGaWVsZHMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiB1cGRhdGVzIGxhc3QgY2hlY2sgdmFsdWUgb2YgYSB0eFxuICAgKiBAcGFyYW0gdHhJZFxuICAgKiBAcGFyYW0gY2hhaW5cbiAgICogQHBhcmFtIGN1cnJlbnRIZWlnaHQgY3VycmVudCBoZWlnaHQgb2YgdGhlIGJsb2NrY2hhaW5cbiAgICovXG4gIHVwZGF0ZVR4TGFzdENoZWNrID0gYXN5bmMgKFxuICAgIHR4SWQ6IHN0cmluZyxcbiAgICBjaGFpbjogc3RyaW5nLFxuICAgIGN1cnJlbnRIZWlnaHQ6IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBhd2FpdCB0aGlzLnR4UmVwb3NpdG9yeS51cGRhdGUoXG4gICAgICB7IHR4SWQsIGNoYWluIH0sXG4gICAgICB7IGxhc3RDaGVjazogY3VycmVudEhlaWdodCB9XG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogdXBkYXRlcyBmYWlsZWRJblNpZ24gZmllbGQgb2YgYSB0cmFuc2FjdGlvbiB0byBmYWxzZVxuICAgKiBAcGFyYW0gdHhJZFxuICAgKiBAcGFyYW0gY2hhaW5cbiAgICovXG4gIHJlc2V0RmFpbGVkSW5TaWduID0gYXN5bmMgKHR4SWQ6IHN0cmluZywgY2hhaW46IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGF3YWl0IHRoaXMudHhSZXBvc2l0b3J5LnVwZGF0ZShcbiAgICAgIHsgdHhJZCwgY2hhaW4gfSxcbiAgICAgIHtcbiAgICAgICAgZmFpbGVkSW5TaWduOiBmYWxzZSxcbiAgICAgIH1cbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiB1cGRhdGVzIHJlcXVpcmVkU2lnbiBmaWVsZCBvZiBhIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB0eElkXG4gICAqIEBwYXJhbSBjaGFpblxuICAgKiBAcGFyYW0gcmVxdWlyZWRTaWduXG4gICAqL1xuICB1cGRhdGVSZXF1aXJlZFNpZ24gPSBhc3luYyAoXG4gICAgdHhJZDogc3RyaW5nLFxuICAgIGNoYWluOiBzdHJpbmcsXG4gICAgcmVxdWlyZWRTaWduOiBudW1iZXJcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXdhaXQgdGhpcy50eFJlcG9zaXRvcnkudXBkYXRlKFxuICAgICAgeyB0eElkLCBjaGFpbiB9LFxuICAgICAge1xuICAgICAgICByZXF1aXJlZFNpZ246IHJlcXVpcmVkU2lnbixcbiAgICAgIH1cbiAgICApO1xuICB9O1xuXG4gIC8qKlxuICAgKiBnZXRzIHRoZSB0cmFuc2FjdGlvbiBieSBpdHMgaWQgYW5kIGNoYWluXG4gICAqIEBwYXJhbSB0eElkXG4gICAqIEBwYXJhbSBjaGFpblxuICAgKi9cbiAgZ2V0VHhCeUtleSA9IGFzeW5jIChcbiAgICB0eElkOiBzdHJpbmcsXG4gICAgY2hhaW46IHN0cmluZ1xuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uRW50aXR5IHwgbnVsbD4gPT4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnR4UmVwb3NpdG9yeS5maW5kT25lKHtcbiAgICAgIHdoZXJlOiB7IHR4SWQsIGNoYWluIH0sXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRoZSB0cmFuc2FjdGlvbnMgd2l0aCB2YWxpZCBzdGF0dXNcbiAgICovXG4gIGdldFR4c1F1ZXJ5ID0gKFxuICAgIG9wdGlvbnM6IEFycmF5PFR4T3B0aW9ucz4gPSBbXVxuICApOiBQcm9taXNlPFRyYW5zYWN0aW9uRW50aXR5W10+ID0+IHtcbiAgICByZXR1cm4gdGhpcy50eFJlcG9zaXRvcnkuZmluZCh7XG4gICAgICB3aGVyZTogb3B0aW9ucy5tYXAodHhPcHRpb25Ub0NsYXVzZSksXG4gICAgfSk7XG4gIH07XG59XG4iXX0=
@@ -0,0 +1,35 @@
1
+ import { TransactionEntity } from '../db/entities/TransactionEntity';
2
+ export type ChainRequiredConfirmations = Record<string, number>;
3
+ export type RequiredConfirmations = Record<string, ChainRequiredConfirmations>;
4
+ export type ValidatorFunction = (tx: TransactionEntity) => Promise<boolean>;
5
+ export type CallbackFunction = (tx: TransactionEntity, newStatus: TransactionStatus) => Promise<void>;
6
+ export declare enum TransactionStatus {
7
+ APPROVED = "approved",
8
+ IN_SIGN = "in-sign",
9
+ SIGN_FAILED = "sign-failed",
10
+ SIGNED = "signed",
11
+ SENT = "sent",
12
+ INVALID = "invalid",
13
+ COMPLETED = "completed"
14
+ }
15
+ export declare enum SigningStatus {
16
+ Signed = 0,
17
+ UnSigned = 1
18
+ }
19
+ export type FieldValue<T> = T | Array<T>;
20
+ export interface FieldOption<T> {
21
+ not: boolean;
22
+ value: FieldValue<T>;
23
+ }
24
+ export interface TxOptions {
25
+ txId?: FieldValue<string>;
26
+ chain?: string;
27
+ txType?: string;
28
+ status?: FieldOption<TransactionStatus>;
29
+ failedInSign?: boolean;
30
+ extra?: FieldValue<string>;
31
+ }
32
+ export declare class UnregisteredChain extends Error {
33
+ constructor(msg: string);
34
+ }
35
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../lib/transaction/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAChE,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;AAE/E,MAAM,MAAM,iBAAiB,GAAG,CAAC,EAAE,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAC5E,MAAM,MAAM,gBAAgB,GAAG,CAC7B,EAAE,EAAE,iBAAiB,EACrB,SAAS,EAAE,iBAAiB,KACzB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,oBAAY,iBAAiB;IAC3B,QAAQ,aAAa;IACrB,OAAO,YAAY;IACnB,WAAW,gBAAgB;IAC3B,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,SAAS,cAAc;CACxB;AAED,oBAAY,aAAa;IACvB,MAAM,IAAA;IACN,QAAQ,IAAA;CACT;AAED,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AACzC,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC,iBAAiB,CAAC,CAAC;IACxC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,GAAG,EAAE,MAAM;CAGxB"}
@@ -0,0 +1,21 @@
1
+ export var TransactionStatus;
2
+ (function (TransactionStatus) {
3
+ TransactionStatus["APPROVED"] = "approved";
4
+ TransactionStatus["IN_SIGN"] = "in-sign";
5
+ TransactionStatus["SIGN_FAILED"] = "sign-failed";
6
+ TransactionStatus["SIGNED"] = "signed";
7
+ TransactionStatus["SENT"] = "sent";
8
+ TransactionStatus["INVALID"] = "invalid";
9
+ TransactionStatus["COMPLETED"] = "completed";
10
+ })(TransactionStatus || (TransactionStatus = {}));
11
+ export var SigningStatus;
12
+ (function (SigningStatus) {
13
+ SigningStatus[SigningStatus["Signed"] = 0] = "Signed";
14
+ SigningStatus[SigningStatus["UnSigned"] = 1] = "UnSigned";
15
+ })(SigningStatus || (SigningStatus = {}));
16
+ export class UnregisteredChain extends Error {
17
+ constructor(msg) {
18
+ super('UnregisteredChain: ' + msg);
19
+ }
20
+ }
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdHJhbnNhY3Rpb24vdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBV0EsTUFBTSxDQUFOLElBQVksaUJBUVg7QUFSRCxXQUFZLGlCQUFpQjtJQUMzQiwwQ0FBcUIsQ0FBQTtJQUNyQix3Q0FBbUIsQ0FBQTtJQUNuQixnREFBMkIsQ0FBQTtJQUMzQixzQ0FBaUIsQ0FBQTtJQUNqQixrQ0FBYSxDQUFBO0lBQ2Isd0NBQW1CLENBQUE7SUFDbkIsNENBQXVCLENBQUE7QUFDekIsQ0FBQyxFQVJXLGlCQUFpQixLQUFqQixpQkFBaUIsUUFRNUI7QUFFRCxNQUFNLENBQU4sSUFBWSxhQUdYO0FBSEQsV0FBWSxhQUFhO0lBQ3ZCLHFEQUFNLENBQUE7SUFDTix5REFBUSxDQUFBO0FBQ1YsQ0FBQyxFQUhXLGFBQWEsS0FBYixhQUFhLFFBR3hCO0FBaUJELE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxLQUFLO0lBQzFDLFlBQVksR0FBVztRQUNyQixLQUFLLENBQUMscUJBQXFCLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDckMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJhbnNhY3Rpb25FbnRpdHkgfSBmcm9tICcuLi9kYi9lbnRpdGllcy9UcmFuc2FjdGlvbkVudGl0eSc7XG5cbmV4cG9ydCB0eXBlIENoYWluUmVxdWlyZWRDb25maXJtYXRpb25zID0gUmVjb3JkPHN0cmluZywgbnVtYmVyPjsgLy8gdHggdHlwZSA9PiByZXF1aXJlZCBudW1iZXJcbmV4cG9ydCB0eXBlIFJlcXVpcmVkQ29uZmlybWF0aW9ucyA9IFJlY29yZDxzdHJpbmcsIENoYWluUmVxdWlyZWRDb25maXJtYXRpb25zPjtcblxuZXhwb3J0IHR5cGUgVmFsaWRhdG9yRnVuY3Rpb24gPSAodHg6IFRyYW5zYWN0aW9uRW50aXR5KSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuZXhwb3J0IHR5cGUgQ2FsbGJhY2tGdW5jdGlvbiA9IChcbiAgdHg6IFRyYW5zYWN0aW9uRW50aXR5LFxuICBuZXdTdGF0dXM6IFRyYW5zYWN0aW9uU3RhdHVzXG4pID0+IFByb21pc2U8dm9pZD47XG5cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uU3RhdHVzIHtcbiAgQVBQUk9WRUQgPSAnYXBwcm92ZWQnLFxuICBJTl9TSUdOID0gJ2luLXNpZ24nLFxuICBTSUdOX0ZBSUxFRCA9ICdzaWduLWZhaWxlZCcsXG4gIFNJR05FRCA9ICdzaWduZWQnLFxuICBTRU5UID0gJ3NlbnQnLFxuICBJTlZBTElEID0gJ2ludmFsaWQnLFxuICBDT01QTEVURUQgPSAnY29tcGxldGVkJyxcbn1cblxuZXhwb3J0IGVudW0gU2lnbmluZ1N0YXR1cyB7XG4gIFNpZ25lZCxcbiAgVW5TaWduZWQsXG59XG5cbmV4cG9ydCB0eXBlIEZpZWxkVmFsdWU8VD4gPSBUIHwgQXJyYXk8VD47XG5leHBvcnQgaW50ZXJmYWNlIEZpZWxkT3B0aW9uPFQ+IHtcbiAgbm90OiBib29sZWFuO1xuICB2YWx1ZTogRmllbGRWYWx1ZTxUPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeE9wdGlvbnMge1xuICB0eElkPzogRmllbGRWYWx1ZTxzdHJpbmc+O1xuICBjaGFpbj86IHN0cmluZztcbiAgdHhUeXBlPzogc3RyaW5nO1xuICBzdGF0dXM/OiBGaWVsZE9wdGlvbjxUcmFuc2FjdGlvblN0YXR1cz47XG4gIGZhaWxlZEluU2lnbj86IGJvb2xlYW47XG4gIGV4dHJhPzogRmllbGRWYWx1ZTxzdHJpbmc+O1xufVxuXG5leHBvcnQgY2xhc3MgVW5yZWdpc3RlcmVkQ2hhaW4gZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nKSB7XG4gICAgc3VwZXIoJ1VucmVnaXN0ZXJlZENoYWluOiAnICsgbXNnKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,8 @@
1
+ import { TxOptions } from './types';
2
+ /**
3
+ * converts options for fetching txs to typeorm clause
4
+ * @param options
5
+ * @returns
6
+ */
7
+ export declare const txOptionToClause: (options: TxOptions) => Record<string, any>;
8
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../lib/transaction/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,YAAa,SAAS,wBAkDlD,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { In, Not } from 'typeorm';
2
+ /**
3
+ * converts options for fetching txs to typeorm clause
4
+ * @param options
5
+ * @returns
6
+ */
7
+ export const txOptionToClause = (options) => {
8
+ const clause = {};
9
+ // add txId clause
10
+ if (typeof options.txId === 'string') {
11
+ clause.txId = options.txId;
12
+ }
13
+ else if (Array.isArray(options.txId)) {
14
+ clause.txId = In(options.txId);
15
+ }
16
+ // add chain clause
17
+ if (typeof options.chain === 'string') {
18
+ clause.chain = options.chain;
19
+ }
20
+ // add txType clause
21
+ if (typeof options.txType === 'string') {
22
+ clause.txType = options.txType;
23
+ }
24
+ // add status clause
25
+ if (options.status) {
26
+ if (typeof options.status.value === 'string') {
27
+ if (options.status.not) {
28
+ clause.status = Not(options.status.value);
29
+ }
30
+ else {
31
+ clause.status = options.status.value;
32
+ }
33
+ }
34
+ else if (Array.isArray(options.status.value)) {
35
+ if (options.status.not) {
36
+ clause.status = Not(In(options.status.value));
37
+ }
38
+ else {
39
+ clause.status = In(options.status.value);
40
+ }
41
+ }
42
+ }
43
+ // add failedInSign clause
44
+ if (typeof options.failedInSign === 'boolean') {
45
+ clause.failedInSign = options.failedInSign;
46
+ }
47
+ // add extra clause
48
+ if (typeof options.extra === 'string') {
49
+ clause.extra = options.extra;
50
+ }
51
+ else if (Array.isArray(options.extra)) {
52
+ clause.extra = In(options.extra);
53
+ }
54
+ return clause;
55
+ };
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdHJhbnNhY3Rpb24vdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFHbEM7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsT0FBa0IsRUFBRSxFQUFFO0lBQ3JELE1BQU0sTUFBTSxHQUF3QixFQUFFLENBQUM7SUFFdkMsa0JBQWtCO0lBQ2xCLElBQUksT0FBTyxPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztJQUM3QixDQUFDO1NBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsbUJBQW1CO0lBQ25CLElBQUksT0FBTyxPQUFPLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUMvQixDQUFDO0lBRUQsb0JBQW9CO0lBQ3BCLElBQUksT0FBTyxPQUFPLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUNqQyxDQUFDO0lBRUQsb0JBQW9CO0lBQ3BCLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ25CLElBQUksT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM3QyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDdkMsQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9DLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNoRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCwwQkFBMEI7SUFDMUIsSUFBSSxPQUFPLE9BQU8sQ0FBQyxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDOUMsTUFBTSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO0lBQzdDLENBQUM7SUFFRCxtQkFBbUI7SUFDbkIsSUFBSSxPQUFPLE9BQU8sQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdEMsTUFBTSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQy9CLENBQUM7U0FBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDeEMsTUFBTSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbiwgTm90IH0gZnJvbSAndHlwZW9ybSc7XG5pbXBvcnQgeyBUeE9wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBjb252ZXJ0cyBvcHRpb25zIGZvciBmZXRjaGluZyB0eHMgdG8gdHlwZW9ybSBjbGF1c2VcbiAqIEBwYXJhbSBvcHRpb25zXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgdHhPcHRpb25Ub0NsYXVzZSA9IChvcHRpb25zOiBUeE9wdGlvbnMpID0+IHtcbiAgY29uc3QgY2xhdXNlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG5cbiAgLy8gYWRkIHR4SWQgY2xhdXNlXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy50eElkID09PSAnc3RyaW5nJykge1xuICAgIGNsYXVzZS50eElkID0gb3B0aW9ucy50eElkO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucy50eElkKSkge1xuICAgIGNsYXVzZS50eElkID0gSW4ob3B0aW9ucy50eElkKTtcbiAgfVxuXG4gIC8vIGFkZCBjaGFpbiBjbGF1c2VcbiAgaWYgKHR5cGVvZiBvcHRpb25zLmNoYWluID09PSAnc3RyaW5nJykge1xuICAgIGNsYXVzZS5jaGFpbiA9IG9wdGlvbnMuY2hhaW47XG4gIH1cblxuICAvLyBhZGQgdHhUeXBlIGNsYXVzZVxuICBpZiAodHlwZW9mIG9wdGlvbnMudHhUeXBlID09PSAnc3RyaW5nJykge1xuICAgIGNsYXVzZS50eFR5cGUgPSBvcHRpb25zLnR4VHlwZTtcbiAgfVxuXG4gIC8vIGFkZCBzdGF0dXMgY2xhdXNlXG4gIGlmIChvcHRpb25zLnN0YXR1cykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zdGF0dXMudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAob3B0aW9ucy5zdGF0dXMubm90KSB7XG4gICAgICAgIGNsYXVzZS5zdGF0dXMgPSBOb3Qob3B0aW9ucy5zdGF0dXMudmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xhdXNlLnN0YXR1cyA9IG9wdGlvbnMuc3RhdHVzLnZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLnN0YXR1cy52YWx1ZSkpIHtcbiAgICAgIGlmIChvcHRpb25zLnN0YXR1cy5ub3QpIHtcbiAgICAgICAgY2xhdXNlLnN0YXR1cyA9IE5vdChJbihvcHRpb25zLnN0YXR1cy52YWx1ZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xhdXNlLnN0YXR1cyA9IEluKG9wdGlvbnMuc3RhdHVzLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBhZGQgZmFpbGVkSW5TaWduIGNsYXVzZVxuICBpZiAodHlwZW9mIG9wdGlvbnMuZmFpbGVkSW5TaWduID09PSAnYm9vbGVhbicpIHtcbiAgICBjbGF1c2UuZmFpbGVkSW5TaWduID0gb3B0aW9ucy5mYWlsZWRJblNpZ247XG4gIH1cblxuICAvLyBhZGQgZXh0cmEgY2xhdXNlXG4gIGlmICh0eXBlb2Ygb3B0aW9ucy5leHRyYSA9PT0gJ3N0cmluZycpIHtcbiAgICBjbGF1c2UuZXh0cmEgPSBvcHRpb25zLmV4dHJhO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucy5leHRyYSkpIHtcbiAgICBjbGF1c2UuZXh0cmEgPSBJbihvcHRpb25zLmV4dHJhKTtcbiAgfVxuXG4gIHJldHVybiBjbGF1c2U7XG59O1xuIl19
@@ -0,0 +1,44 @@
1
+ import { Column, Entity, PrimaryColumn } from 'typeorm';
2
+
3
+ @Entity()
4
+ export class TransactionEntity {
5
+ @PrimaryColumn('varchar')
6
+ txId: string;
7
+
8
+ @PrimaryColumn('varchar')
9
+ chain: string;
10
+
11
+ @Column('varchar')
12
+ txType: string;
13
+
14
+ @Column('varchar')
15
+ status: string;
16
+
17
+ @Column('integer')
18
+ requiredSign: number;
19
+
20
+ @Column('integer')
21
+ lastCheck: number;
22
+
23
+ @Column('varchar')
24
+ lastStatusUpdate: string;
25
+
26
+ @Column('boolean')
27
+ failedInSign: boolean;
28
+
29
+ @Column('integer')
30
+ signFailedCount: number;
31
+
32
+ @Column('varchar')
33
+ serializedTx: string;
34
+
35
+ @Column('varchar', {
36
+ nullable: true,
37
+ })
38
+ extra?: string;
39
+
40
+ @Column('varchar', {
41
+ nullable: true,
42
+ })
43
+ extra2?: string;
44
+ }
@@ -0,0 +1,7 @@
1
+ import { Migration1706350644686 } from './postgres/1706350644686-migration';
2
+ import { Migration1706007154531 } from './sqlite/1706007154531-migration';
3
+
4
+ export const migrations = {
5
+ sqlite: [Migration1706007154531],
6
+ postgres: [Migration1706350644686],
7
+ };