@rosen-bridge/abstract-extractor 2.1.0 → 2.1.2-82c56984

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 (165) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/ergo/{AbstractErgoExtractor.d.ts → abstractErgoExtractor.d.ts} +3 -3
  3. package/dist/ergo/abstractErgoExtractor.d.ts.map +1 -0
  4. package/dist/ergo/{AbstractErgoExtractor.js → abstractErgoExtractor.js} +3 -3
  5. package/dist/ergo/{AbstractErgoExtractorAction.d.ts → abstractErgoExtractorAction.d.ts} +6 -4
  6. package/dist/ergo/abstractErgoExtractorAction.d.ts.map +1 -0
  7. package/dist/ergo/abstractErgoExtractorAction.js +219 -0
  8. package/dist/ergo/{AbstractErgoExtractorEntity.d.ts → abstractErgoExtractorEntity.d.ts} +1 -1
  9. package/dist/ergo/{AbstractErgoExtractorEntity.d.ts.map → abstractErgoExtractorEntity.d.ts.map} +1 -1
  10. package/dist/ergo/{AbstractErgoExtractorEntity.js → abstractErgoExtractorEntity.js} +1 -1
  11. package/dist/ergo/index.d.ts +6 -6
  12. package/dist/ergo/index.js +7 -7
  13. package/dist/ergo/initializable/{AbstractInitializable.d.ts → abstractInitializable.d.ts} +4 -4
  14. package/dist/ergo/initializable/{AbstractInitializable.d.ts.map → abstractInitializable.d.ts.map} +1 -1
  15. package/dist/ergo/initializable/abstractInitializable.js +162 -0
  16. package/dist/ergo/initializable/{AbstractInitializableAction.d.ts → abstractInitializableAction.d.ts} +4 -4
  17. package/dist/ergo/initializable/abstractInitializableAction.d.ts.map +1 -0
  18. package/dist/ergo/initializable/{AbstractInitializableAction.js → abstractInitializableAction.js} +2 -2
  19. package/dist/ergo/initializable/index.d.ts +2 -2
  20. package/dist/ergo/initializable/index.js +3 -3
  21. package/dist/{lib/ergo/network/AbstractNetwork.d.ts → ergo/network/abstractNetwork.d.ts} +1 -1
  22. package/dist/ergo/network/{AbstractNetwork.d.ts.map → abstractNetwork.d.ts.map} +1 -1
  23. package/dist/ergo/network/{AbstractNetwork.js → abstractNetwork.js} +1 -1
  24. package/dist/{lib/ergo/network/ExplorerNetwork.d.ts → ergo/network/explorerNetwork.d.ts} +2 -2
  25. package/dist/ergo/network/explorerNetwork.d.ts.map +1 -0
  26. package/dist/ergo/network/{ExplorerNetwork.js → explorerNetwork.js} +3 -3
  27. package/dist/ergo/network/{NodeNetwork.d.ts → nodeNetwork.d.ts} +2 -2
  28. package/dist/ergo/network/nodeNetwork.d.ts.map +1 -0
  29. package/dist/ergo/network/nodeNetwork.js +131 -0
  30. package/dist/ergo/utils.d.ts.map +1 -1
  31. package/dist/ergo/utils.js +1 -1
  32. package/package.json +24 -16
  33. package/.eslintignore +0 -1
  34. package/dist/ergo/AbstractErgoExtractor.d.ts.map +0 -1
  35. package/dist/ergo/AbstractErgoExtractorAction.d.ts.map +0 -1
  36. package/dist/ergo/AbstractErgoExtractorAction.js +0 -222
  37. package/dist/ergo/initializable/AbstractInitializable.js +0 -163
  38. package/dist/ergo/initializable/AbstractInitializableAction.d.ts.map +0 -1
  39. package/dist/ergo/network/AbstractNetwork.d.ts +0 -26
  40. package/dist/ergo/network/ExplorerNetwork.d.ts +0 -74
  41. package/dist/ergo/network/ExplorerNetwork.d.ts.map +0 -1
  42. package/dist/ergo/network/NodeNetwork.d.ts.map +0 -1
  43. package/dist/ergo/network/NodeNetwork.js +0 -131
  44. package/dist/lib/abstractExtractor.d.ts +0 -25
  45. package/dist/lib/abstractExtractor.d.ts.map +0 -1
  46. package/dist/lib/abstractExtractor.js +0 -3
  47. package/dist/lib/constants.d.ts +0 -4
  48. package/dist/lib/constants.d.ts.map +0 -1
  49. package/dist/lib/constants.js +0 -4
  50. package/dist/lib/ergo/AbstractErgoExtractor.d.ts +0 -80
  51. package/dist/lib/ergo/AbstractErgoExtractor.d.ts.map +0 -1
  52. package/dist/lib/ergo/AbstractErgoExtractor.js +0 -142
  53. package/dist/lib/ergo/AbstractErgoExtractorAction.d.ts +0 -92
  54. package/dist/lib/ergo/AbstractErgoExtractorAction.d.ts.map +0 -1
  55. package/dist/lib/ergo/AbstractErgoExtractorAction.js +0 -222
  56. package/dist/lib/ergo/AbstractErgoExtractorEntity.d.ts +0 -11
  57. package/dist/lib/ergo/AbstractErgoExtractorEntity.d.ts.map +0 -1
  58. package/dist/lib/ergo/AbstractErgoExtractorEntity.js +0 -57
  59. package/dist/lib/ergo/index.d.ts +0 -10
  60. package/dist/lib/ergo/index.d.ts.map +0 -1
  61. package/dist/lib/ergo/index.js +0 -10
  62. package/dist/lib/ergo/initializable/AbstractInitializable.d.ts +0 -48
  63. package/dist/lib/ergo/initializable/AbstractInitializable.d.ts.map +0 -1
  64. package/dist/lib/ergo/initializable/AbstractInitializable.js +0 -163
  65. package/dist/lib/ergo/initializable/AbstractInitializableAction.d.ts +0 -14
  66. package/dist/lib/ergo/initializable/AbstractInitializableAction.d.ts.map +0 -1
  67. package/dist/lib/ergo/initializable/AbstractInitializableAction.js +0 -16
  68. package/dist/lib/ergo/initializable/index.d.ts +0 -3
  69. package/dist/lib/ergo/initializable/index.d.ts.map +0 -1
  70. package/dist/lib/ergo/initializable/index.js +0 -3
  71. package/dist/lib/ergo/interfaces.d.ts +0 -47
  72. package/dist/lib/ergo/interfaces.d.ts.map +0 -1
  73. package/dist/lib/ergo/interfaces.js +0 -8
  74. package/dist/lib/ergo/network/AbstractNetwork.d.ts.map +0 -1
  75. package/dist/lib/ergo/network/AbstractNetwork.js +0 -3
  76. package/dist/lib/ergo/network/ExplorerNetwork.d.ts.map +0 -1
  77. package/dist/lib/ergo/network/ExplorerNetwork.js +0 -185
  78. package/dist/lib/ergo/network/NodeNetwork.d.ts +0 -60
  79. package/dist/lib/ergo/network/NodeNetwork.d.ts.map +0 -1
  80. package/dist/lib/ergo/network/NodeNetwork.js +0 -131
  81. package/dist/lib/ergo/utils.d.ts +0 -8
  82. package/dist/lib/ergo/utils.d.ts.map +0 -1
  83. package/dist/lib/ergo/utils.js +0 -16
  84. package/dist/lib/index.d.ts +0 -4
  85. package/dist/lib/index.d.ts.map +0 -1
  86. package/dist/lib/index.js +0 -4
  87. package/dist/tests/AbstractErgoExtractor.mock.d.ts +0 -11
  88. package/dist/tests/AbstractErgoExtractor.mock.d.ts.map +0 -1
  89. package/dist/tests/AbstractErgoExtractor.mock.js +0 -11
  90. package/dist/tests/AbstractErgoExtractor.spec.d.ts +0 -2
  91. package/dist/tests/AbstractErgoExtractor.spec.d.ts.map +0 -1
  92. package/dist/tests/AbstractErgoExtractor.spec.js +0 -240
  93. package/dist/tests/AbstractErgoExtractorAction.mock.d.ts +0 -15
  94. package/dist/tests/AbstractErgoExtractorAction.mock.d.ts.map +0 -1
  95. package/dist/tests/AbstractErgoExtractorAction.mock.js +0 -27
  96. package/dist/tests/AbstractErgoExtractorAction.spec.d.ts +0 -2
  97. package/dist/tests/AbstractErgoExtractorAction.spec.d.ts.map +0 -1
  98. package/dist/tests/AbstractErgoExtractorAction.spec.js +0 -221
  99. package/dist/tests/initializable/AbstractInitializable.mock.d.ts +0 -61
  100. package/dist/tests/initializable/AbstractInitializable.mock.d.ts.map +0 -1
  101. package/dist/tests/initializable/AbstractInitializable.mock.js +0 -18
  102. package/dist/tests/initializable/AbstractInitializable.spec.d.ts +0 -2
  103. package/dist/tests/initializable/AbstractInitializable.spec.d.ts.map +0 -1
  104. package/dist/tests/initializable/AbstractInitializable.spec.js +0 -299
  105. package/dist/tests/initializable/AbstractInitializableAction.mock.d.ts +0 -15
  106. package/dist/tests/initializable/AbstractInitializableAction.mock.d.ts.map +0 -1
  107. package/dist/tests/initializable/AbstractInitializableAction.mock.js +0 -27
  108. package/dist/tests/initializable/AbstractInitializableAction.spec.d.ts +0 -2
  109. package/dist/tests/initializable/AbstractInitializableAction.spec.d.ts.map +0 -1
  110. package/dist/tests/initializable/AbstractInitializableAction.spec.js +0 -54
  111. package/dist/tests/initializable/testData.d.ts +0 -94
  112. package/dist/tests/initializable/testData.d.ts.map +0 -1
  113. package/dist/tests/initializable/testData.js +0 -235
  114. package/dist/tests/network/ExplorerNetwork.spec.d.ts +0 -2
  115. package/dist/tests/network/ExplorerNetwork.spec.d.ts.map +0 -1
  116. package/dist/tests/network/ExplorerNetwork.spec.js +0 -61
  117. package/dist/tests/network/NodeNetwork.spec.d.ts +0 -2
  118. package/dist/tests/network/NodeNetwork.spec.d.ts.map +0 -1
  119. package/dist/tests/network/NodeNetwork.spec.js +0 -48
  120. package/dist/tests/network/testData.d.ts +0 -752
  121. package/dist/tests/network/testData.d.ts.map +0 -1
  122. package/dist/tests/network/testData.js +0 -1401
  123. package/dist/tests/testData.d.ts +0 -32
  124. package/dist/tests/testData.d.ts.map +0 -1
  125. package/dist/tests/testData.js +0 -121
  126. package/dist/tests/testUtils.d.ts +0 -9
  127. package/dist/tests/testUtils.d.ts.map +0 -1
  128. package/dist/tests/testUtils.js +0 -31
  129. package/dist/tsconfig.tsbuildinfo +0 -1
  130. package/dist/vitest.config.d.ts +0 -3
  131. package/dist/vitest.config.d.ts.map +0 -1
  132. package/dist/vitest.config.js +0 -18
  133. package/lib/abstractExtractor.ts +0 -31
  134. package/lib/constants.ts +0 -3
  135. package/lib/ergo/AbstractErgoExtractor.ts +0 -227
  136. package/lib/ergo/AbstractErgoExtractorAction.ts +0 -319
  137. package/lib/ergo/AbstractErgoExtractorEntity.ts +0 -32
  138. package/lib/ergo/index.ts +0 -9
  139. package/lib/ergo/initializable/AbstractInitializable.ts +0 -228
  140. package/lib/ergo/initializable/AbstractInitializableAction.ts +0 -33
  141. package/lib/ergo/initializable/index.ts +0 -2
  142. package/lib/ergo/interfaces.ts +0 -51
  143. package/lib/ergo/network/AbstractNetwork.ts +0 -29
  144. package/lib/ergo/network/ExplorerNetwork.ts +0 -237
  145. package/lib/ergo/network/NodeNetwork.ts +0 -169
  146. package/lib/ergo/utils.ts +0 -15
  147. package/lib/index.ts +0 -3
  148. package/tests/AbstractErgoExtractor.mock.ts +0 -33
  149. package/tests/AbstractErgoExtractor.spec.ts +0 -284
  150. package/tests/AbstractErgoExtractorAction.mock.ts +0 -45
  151. package/tests/AbstractErgoExtractorAction.spec.ts +0 -268
  152. package/tests/initializable/AbstractInitializable.mock.ts +0 -44
  153. package/tests/initializable/AbstractInitializable.spec.ts +0 -386
  154. package/tests/initializable/AbstractInitializableAction.mock.ts +0 -45
  155. package/tests/initializable/AbstractInitializableAction.spec.ts +0 -64
  156. package/tests/initializable/testData.ts +0 -283
  157. package/tests/network/ExplorerNetwork.spec.ts +0 -73
  158. package/tests/network/NodeNetwork.spec.ts +0 -56
  159. package/tests/network/testData.ts +0 -1708
  160. package/tests/testData.ts +0 -140
  161. package/tests/testUtils.ts +0 -22
  162. package/tsconfig.build.json +0 -9
  163. package/tsconfig.build.tsbuildinfo +0 -1
  164. package/tsconfig.json +0 -9
  165. package/vitest.config.ts +0 -18
@@ -1,3 +0,0 @@
1
- declare const _default: import("vite").UserConfig;
2
- export default _default;
3
- //# sourceMappingURL=vitest.config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vitest.config.d.ts","sourceRoot":"","sources":["../vitest.config.ts"],"names":[],"mappings":";AAEA,wBAeG"}
@@ -1,18 +0,0 @@
1
- import { defineConfig } from 'vitest/config';
2
- export default defineConfig({
3
- test: {
4
- globals: true,
5
- coverage: {
6
- all: true,
7
- provider: 'istanbul',
8
- reporter: 'cobertura',
9
- },
10
- passWithNoTests: true,
11
- poolOptions: {
12
- threads: {
13
- singleThread: true,
14
- },
15
- },
16
- },
17
- });
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZXN0LmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3ZpdGVzdC5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3QyxlQUFlLFlBQVksQ0FBQztJQUMxQixJQUFJLEVBQUU7UUFDSixPQUFPLEVBQUUsSUFBSTtRQUNiLFFBQVEsRUFBRTtZQUNSLEdBQUcsRUFBRSxJQUFJO1lBQ1QsUUFBUSxFQUFFLFVBQVU7WUFDcEIsUUFBUSxFQUFFLFdBQVc7U0FDdEI7UUFDRCxlQUFlLEVBQUUsSUFBSTtRQUNyQixXQUFXLEVBQUU7WUFDWCxPQUFPLEVBQUU7Z0JBQ1AsWUFBWSxFQUFFLElBQUk7YUFDbkI7U0FDRjtLQUNGO0NBQ0YsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZXN0L2NvbmZpZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XG4gIHRlc3Q6IHtcbiAgICBnbG9iYWxzOiB0cnVlLFxuICAgIGNvdmVyYWdlOiB7XG4gICAgICBhbGw6IHRydWUsXG4gICAgICBwcm92aWRlcjogJ2lzdGFuYnVsJyxcbiAgICAgIHJlcG9ydGVyOiAnY29iZXJ0dXJhJyxcbiAgICB9LFxuICAgIHBhc3NXaXRoTm9UZXN0czogdHJ1ZSxcbiAgICBwb29sT3B0aW9uczoge1xuICAgICAgdGhyZWFkczoge1xuICAgICAgICBzaW5nbGVUaHJlYWQ6IHRydWUsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KTtcbiJdfQ==
@@ -1,31 +0,0 @@
1
- import { BlockInfo, Block } from '@rosen-bridge/scanner-interfaces';
2
-
3
- export abstract class AbstractExtractor<TransactionType> {
4
- /**
5
- * process a list of transactions in a block and store required information
6
- * @param txs list of transactions in the block
7
- * @param block
8
- * @return true if the process is completed successfully and false otherwise
9
- */
10
- abstract processTransactions: (
11
- txs: Array<TransactionType>,
12
- block: Block,
13
- ) => Promise<boolean>;
14
-
15
- /**
16
- * return extractor id. This id must be unique over all extractors.
17
- */
18
- abstract getId: () => string;
19
-
20
- /**
21
- * fork one block and remove all stored information for this block
22
- * @param hash block hash
23
- */
24
- abstract forkBlock: (hash: string) => Promise<void>;
25
-
26
- /**
27
- * initialize extractor database with data created below the initial height
28
- * @param initialBlock
29
- */
30
- abstract initializeBoxes: (initialBlock: BlockInfo) => Promise<void>;
31
- }
package/lib/constants.ts DELETED
@@ -1,3 +0,0 @@
1
- export const API_LIMIT = 100;
2
- export const RETRIAL_COUNT = 10;
3
- export const DB_CHUNK_SIZE = 100;
@@ -1,227 +0,0 @@
1
- import { AbstractLogger, DummyLogger } from '@rosen-bridge/abstract-logger';
2
- import JsonBigInt from '@rosen-bridge/json-bigint';
3
- import { Mutex } from 'await-semaphore';
4
- import { v4 as uuidv4 } from 'uuid';
5
- import {
6
- Transaction,
7
- OutputBox,
8
- InputExtension,
9
- BlockInfo,
10
- } from '@rosen-bridge/scanner-interfaces';
11
-
12
- import { AbstractExtractor } from '../abstractExtractor';
13
- import { AbstractErgoExtractorAction } from './AbstractErgoExtractorAction';
14
- import {
15
- AbstractBoxData,
16
- SpendInfo,
17
- CallbackType,
18
- CallbackMap,
19
- CallbackDataMap,
20
- TxExtra,
21
- } from './interfaces';
22
- import { AbstractErgoExtractorEntity } from './AbstractErgoExtractorEntity';
23
-
24
- export abstract class AbstractErgoExtractor<
25
- ExtractedData extends AbstractBoxData,
26
- ExtractorEntity extends AbstractErgoExtractorEntity,
27
- > extends AbstractExtractor<Transaction> {
28
- protected abstract actions: AbstractErgoExtractorAction<
29
- ExtractedData,
30
- ExtractorEntity
31
- >;
32
- protected logger: AbstractLogger;
33
- protected callbacks: {
34
- [K in CallbackType]: Map<string, CallbackMap<ExtractedData>[K]>;
35
- } = {
36
- [CallbackType.Update]: new Map(),
37
- [CallbackType.Insert]: new Map(),
38
- [CallbackType.Delete]: new Map(),
39
- [CallbackType.Spend]: new Map(),
40
- };
41
- private callbackMutex = new Mutex();
42
-
43
- constructor(logger = new DummyLogger()) {
44
- super();
45
- this.logger = logger;
46
- }
47
-
48
- /**
49
- * hook a new callback on a callback type
50
- * @param type
51
- * @param id
52
- * @param callback
53
- * @returns callback registered id
54
- */
55
- hook = async <T extends CallbackType>(
56
- type: T,
57
- callback: CallbackMap<ExtractedData>[T],
58
- ): Promise<string> => {
59
- const release = await this.callbackMutex.acquire();
60
- const callbackMap = this.callbacks[type];
61
- const id = uuidv4();
62
- callbackMap.set(id, callback);
63
- release();
64
- return id;
65
- };
66
-
67
- /**
68
- * unhook a callback on a type
69
- * returns false if there is no registered callback with the id
70
- * @param type
71
- * @param id
72
- * @returns success status
73
- */
74
- unhook = async (type: CallbackType, id: string): Promise<boolean> => {
75
- const release = await this.callbackMutex.acquire();
76
- const callbackMap = this.callbacks[type];
77
- if (!callbackMap.has(id)) {
78
- this.logger.warn(
79
- `Callback with Id [${id}] is not registered for type [${type}].`,
80
- );
81
- return false;
82
- }
83
- callbackMap.delete(id);
84
- release();
85
- return true;
86
- };
87
-
88
- /**
89
- * trigger all callbacks registered on a specific type with the provided data
90
- * @param type
91
- * @param data
92
- */
93
- protected triggerCallbacks<T extends CallbackType>(
94
- type: T,
95
- data: CallbackDataMap<ExtractedData>[T],
96
- ): void {
97
- const callbackMap = this.callbacks[type];
98
- callbackMap.forEach((callback) => {
99
- callback(data);
100
- });
101
- }
102
-
103
- /**
104
- * extract box data to proper format (not including spending information)
105
- * @param box
106
- * @param inputExtensions all input box extensions in transaction
107
- * @return extracted data in proper format
108
- */
109
- abstract extractBoxData: (
110
- box: OutputBox,
111
- inputExtensions: InputExtension[],
112
- txExtra?: TxExtra,
113
- ) => ExtractedData | undefined;
114
-
115
- /**
116
- * check proper data format in the box
117
- * @param box
118
- * @return true if the box has the required data and false otherwise
119
- */
120
- abstract hasData: (box: OutputBox) => boolean;
121
-
122
- /**
123
- * create spend info array for the transaction
124
- * @param tx
125
- * @returns spend info array of the transaction
126
- */
127
- getTransactionSpendInfo = (tx: Transaction) => {
128
- let boxIndex = 1;
129
- const spendInfoArray = [];
130
- for (const input of tx.inputs) {
131
- spendInfoArray.push({ txId: tx.id, boxId: input.boxId, index: boxIndex });
132
- boxIndex += 1;
133
- }
134
- return spendInfoArray;
135
- };
136
-
137
- /**
138
- * extract transaction extra information
139
- * override this function if there is extra needed information
140
- * @param tx
141
- * @returns
142
- */
143
- getTransactionExtraData = (
144
- tx: Transaction, // eslint-disable-line @typescript-eslint/no-unused-vars
145
- ): TxExtra => {
146
- return {};
147
- };
148
-
149
- /**
150
- * process a list of transactions in a block and store required information
151
- * @param txs list of transactions in the block
152
- * @param block
153
- * @return true if the process is completed successfully and false otherwise
154
- */
155
- processTransactions = async (
156
- txs: Transaction[],
157
- block: BlockInfo,
158
- ): Promise<boolean> => {
159
- try {
160
- const boxes: Array<ExtractedData> = [];
161
- const spentInfos: Array<SpendInfo> = [];
162
- for (const tx of txs) {
163
- const inputExtensions = tx.inputs.map((input) => input.extension || {});
164
- for (const output of tx.outputs) {
165
- if (!this.hasData(output)) {
166
- continue;
167
- }
168
- this.logger.debug(`Trying to extract data from box ${output.boxId}`);
169
- const extractedData = this.extractBoxData(
170
- output,
171
- inputExtensions,
172
- this.getTransactionExtraData(tx),
173
- );
174
- if (extractedData) {
175
- this.logger.debug(
176
- `Extracted data ${JsonBigInt.stringify(extractedData)} from box ${
177
- output.boxId
178
- }`,
179
- );
180
- boxes.push(extractedData);
181
- }
182
- }
183
- spentInfos.push(...this.getTransactionSpendInfo(tx));
184
- }
185
-
186
- if (boxes.length > 0) {
187
- if (!(await this.actions.storeBoxes(boxes, block, this.getId()))) {
188
- this.logger.warn(
189
- `Data insertion failed for ${this.getId()} at the block ${
190
- block.height
191
- }`,
192
- );
193
- return false;
194
- }
195
- this.triggerCallbacks(CallbackType.Insert, boxes);
196
- }
197
- const spentData = await this.actions.spendBoxes(
198
- spentInfos,
199
- block,
200
- this.getId(),
201
- );
202
- if (spentData.length > 0) {
203
- this.triggerCallbacks(CallbackType.Spend, spentData);
204
- }
205
- } catch (e) {
206
- this.logger.error(
207
- `Processing transactions failed for ${this.getId()} at the block ${
208
- block.height
209
- } with error: ${e}`,
210
- );
211
- return false;
212
- }
213
- return true;
214
- };
215
-
216
- /**
217
- * fork one block and remove all stored information for this block
218
- * @param hash block hash
219
- */
220
- forkBlock = async (hash: string): Promise<void> => {
221
- const result = await this.actions.deleteBlockBoxes(hash, this.getId());
222
- if (result.deletedData.length > 0)
223
- this.triggerCallbacks(CallbackType.Delete, result.deletedData);
224
- if (result.updatedData.length > 0)
225
- this.triggerCallbacks(CallbackType.Update, result.updatedData);
226
- };
227
- }
@@ -1,319 +0,0 @@
1
- import {
2
- DataSource,
3
- In,
4
- Repository,
5
- Not,
6
- EntityTarget,
7
- FindOptionsWhere,
8
- QueryRunner,
9
- } from '@rosen-bridge/extended-typeorm';
10
- import { chunk, difference, pick } from 'lodash-es';
11
- import { AbstractLogger, DummyLogger } from '@rosen-bridge/abstract-logger';
12
- import JsonBigInt from '@rosen-bridge/json-bigint';
13
- import { BlockInfo } from '@rosen-bridge/scanner-interfaces';
14
-
15
- import { AbstractBoxData, BoxInfo, SpendInfo } from './interfaces';
16
- import { DB_CHUNK_SIZE } from '../constants';
17
- import { AbstractErgoExtractorEntity } from './AbstractErgoExtractorEntity';
18
-
19
- export abstract class AbstractErgoExtractorAction<
20
- ExtractedData extends AbstractBoxData,
21
- ExtractorEntity extends AbstractErgoExtractorEntity,
22
- > {
23
- private readonly datasource: DataSource;
24
- readonly logger: AbstractLogger;
25
- protected readonly repository: Repository<ExtractorEntity>;
26
- private repo: EntityTarget<ExtractorEntity>;
27
-
28
- constructor(
29
- dataSource: DataSource,
30
- repo: EntityTarget<ExtractorEntity>,
31
- logger?: AbstractLogger,
32
- ) {
33
- this.datasource = dataSource;
34
- this.logger = logger ? logger : new DummyLogger();
35
- this.repository = this.datasource.getRepository(repo);
36
- this.repo = repo;
37
- }
38
-
39
- /**
40
- * create the database entity from extracted data and block information
41
- */
42
- protected createEntity = (
43
- data: ExtractedData[], // eslint-disable-line @typescript-eslint/no-unused-vars
44
- block: BlockInfo, // eslint-disable-line @typescript-eslint/no-unused-vars
45
- extractor: string, // eslint-disable-line @typescript-eslint/no-unused-vars
46
- ): Array<Omit<ExtractorEntity, 'id'>> => {
47
- throw Error(
48
- 'You must implement `createEntity` or override `insertEntities` and `updateEntities`',
49
- );
50
- };
51
-
52
- /**
53
- * convert the database entity back to raw data
54
- */
55
- protected convertEntityToData = (
56
- entities: ExtractorEntity[], // eslint-disable-line @typescript-eslint/no-unused-vars
57
- ): ExtractedData[] => {
58
- throw Error(
59
- 'You must implement `convertEntityToData` or override `deleteBlockEntities`',
60
- );
61
- };
62
-
63
- /**
64
- * insert entities extracted from a block to database
65
- * @param queryRunner
66
- * @param boxesToInsert
67
- * @param block
68
- * @param extractor
69
- */
70
- protected insertEntities = async (
71
- queryRunner: QueryRunner,
72
- boxesToInsert: Array<ExtractedData>,
73
- block: BlockInfo,
74
- extractor: string,
75
- ) => {
76
- const repository = queryRunner.manager.getRepository(this.repo);
77
- await repository.insert(
78
- this.createEntity(boxesToInsert, block, extractor) as any, // eslint-disable-line @typescript-eslint/no-explicit-any
79
- );
80
- };
81
-
82
- /**
83
- * update entities related to a box
84
- * @param queryRunner
85
- * @param updateBox
86
- * @param block
87
- * @param extractor
88
- */
89
- protected updateEntity = async (
90
- queryRunner: QueryRunner,
91
- updateBox: ExtractedData, // eslint-disable-line @typescript-eslint/no-unused-vars
92
- block: BlockInfo, // eslint-disable-line @typescript-eslint/no-unused-vars
93
- extractor: string,
94
- ) => {
95
- const repository = queryRunner.manager.getRepository(this.repo);
96
- const box = this.createEntity([updateBox], block, extractor)[0];
97
- await repository.update(
98
- {
99
- boxId: box.boxId,
100
- extractor: extractor,
101
- } as FindOptionsWhere<ExtractorEntity>,
102
- box as any, // eslint-disable-line @typescript-eslint/no-explicit-any
103
- );
104
- };
105
-
106
- /**
107
- * delete all data extracted from a block
108
- * @param queryRunner
109
- * @param extractor
110
- * @param block
111
- * @returns
112
- */
113
- protected deleteBlockEntities = async (
114
- queryRunner: QueryRunner,
115
- extractor: string,
116
- block: string,
117
- ): Promise<ExtractedData[]> => {
118
- const repository = queryRunner.manager.getRepository(this.repo);
119
- const deletedData = await repository.find({
120
- where: {
121
- extractor: extractor,
122
- block: block,
123
- } as FindOptionsWhere<ExtractorEntity>,
124
- });
125
- await repository.delete({
126
- extractor: extractor,
127
- block: block,
128
- } as unknown as FindOptionsWhere<ExtractorEntity>);
129
- return this.convertEntityToData(deletedData);
130
- };
131
-
132
- /**
133
- * delete all data extracted from a block
134
- * @param queryRunner
135
- * @param extractor
136
- * @param block
137
- * @returns
138
- */
139
- protected updateBlockEntities = async (
140
- queryRunner: QueryRunner, // eslint-disable-line @typescript-eslint/no-unused-vars
141
- extractor: string,
142
- block: string,
143
- ): Promise<ExtractorEntity[]> => {
144
- const repository = this.datasource.getRepository(
145
- this.repo as EntityTarget<new () => ExtractorEntity>,
146
- );
147
- const updatedData = await repository.find({
148
- where: {
149
- extractor: extractor,
150
- spendBlock: block,
151
- block: Not(block),
152
- } as unknown as FindOptionsWhere<ExtractorEntity>,
153
- });
154
- await repository.update(
155
- {
156
- spendBlock: block,
157
- extractor: extractor,
158
- } as unknown as FindOptionsWhere<ExtractorEntity>,
159
- {
160
- spendBlock: null,
161
- spendHeight: 0,
162
- },
163
- );
164
- return updatedData as unknown as ExtractorEntity[];
165
- };
166
-
167
- /**
168
- * insert all extracted box data in an atomic transaction
169
- * update the data if a box with the same id is already stored in db
170
- * @param boxes
171
- * @param block
172
- * @param extractor
173
- * @return inserted items and updated box ids
174
- * returns undefined in case of any problem
175
- */
176
- storeBoxes = async (
177
- boxes: Array<ExtractedData>,
178
- block: BlockInfo,
179
- extractor: string,
180
- ): Promise<boolean> => {
181
- let boxesToInsert: ExtractedData[] = [],
182
- boxesToUpdate: ExtractedData[] = [];
183
- const queryRunner = this.datasource.createQueryRunner();
184
- await queryRunner.connect();
185
- await queryRunner.startTransaction();
186
- try {
187
- const repository = queryRunner.manager.getRepository(this.repo);
188
- const dbBoxIds = (
189
- await repository.findBy({
190
- boxId: In(boxes.map((item) => item.boxId)),
191
- extractor: extractor,
192
- } as FindOptionsWhere<ExtractorEntity>)
193
- ).map((box) => box.boxId);
194
- if (dbBoxIds.length > 0)
195
- this.logger.debug(`Found stored boxes with same boxId`, dbBoxIds);
196
-
197
- boxesToUpdate = boxes.filter((box) => dbBoxIds.includes(box.boxId));
198
- boxesToInsert = difference(boxes, boxesToUpdate);
199
-
200
- if (boxesToInsert.length > 0) {
201
- this.logger.debug(`Inserting boxes`);
202
- await this.insertEntities(queryRunner, boxesToInsert, block, extractor);
203
- }
204
- if (boxesToUpdate.length > 0)
205
- this.logger.info(
206
- `Updating boxes with following Ids in the database: [${boxesToUpdate
207
- .map((col) => col.boxId)
208
- .join(', ')}]`,
209
- );
210
- for (const box of boxesToUpdate) {
211
- this.logger.debug(
212
- `Updating boxes in database [${JsonBigInt.stringify(box)}]`,
213
- );
214
- await this.updateEntity(queryRunner, box, block, extractor);
215
- }
216
- await queryRunner.commitTransaction();
217
- return true;
218
- } catch (e) {
219
- this.logger.error(`An error occurred during store boxes action: ${e}`);
220
- await queryRunner.rollbackTransaction();
221
- return false;
222
- } finally {
223
- await queryRunner.release();
224
- }
225
- };
226
-
227
- /**
228
- * update spending information of stored boxes
229
- * chunk spendInfos to prevent large database queries
230
- * Note: It only updates the spendHeight and spendBlock fields. If updating
231
- * anything else is required, override this implementation to include the
232
- * additional fields.
233
- * @param spendInfos
234
- * @param block
235
- * @param extractor
236
- * @returns spent box ids
237
- */
238
- spendBoxes = async (
239
- spendInfos: Array<SpendInfo>,
240
- block: BlockInfo,
241
- extractor: string,
242
- ): Promise<BoxInfo[]> => {
243
- const spentData = [];
244
- const spendInfoChunks = chunk(spendInfos, DB_CHUNK_SIZE);
245
- for (const spendInfoChunk of spendInfoChunks) {
246
- const boxIds = spendInfoChunk.map((info) => info.boxId);
247
- const updateResult = await this.repository.update(
248
- {
249
- boxId: In(boxIds),
250
- extractor: extractor,
251
- } as FindOptionsWhere<ExtractorEntity>,
252
- {
253
- spendBlock: block.hash,
254
- spendHeight: block.height,
255
- } as any, // eslint-disable-line @typescript-eslint/no-explicit-any
256
- );
257
-
258
- if (updateResult.affected && updateResult.affected > 0) {
259
- const spentRows = await this.repository.findBy({
260
- boxId: In(boxIds),
261
- spendBlock: block.hash,
262
- } as FindOptionsWhere<ExtractorEntity>);
263
- spentData.push(...spentRows);
264
- for (const row of spentRows) {
265
- this.logger.debug(
266
- `Spent box with boxId [${row.boxId}] at height ${block.height}`,
267
- );
268
- }
269
- }
270
- }
271
- return spentData.map((data) => pick(data, 'boxId'));
272
- };
273
-
274
- /**
275
- * delete extracted data from a specific block
276
- * if a box is spend in this block mark it as unspent
277
- * if a box is created in this block remove it from database
278
- * @param block
279
- * @param extractor
280
- * @return deleted items and updated box ids
281
- */
282
- deleteBlockBoxes = async (
283
- block: string,
284
- extractor: string,
285
- ): Promise<{ deletedData: ExtractedData[]; updatedData: BoxInfo[] }> => {
286
- const queryRunner = this.datasource.createQueryRunner();
287
- await queryRunner.connect();
288
- await queryRunner.startTransaction();
289
- try {
290
- this.logger.info(
291
- `Deleting boxes in block ${block} and extractor ${extractor}`,
292
- );
293
- const updatedData = await this.updateBlockEntities(
294
- queryRunner,
295
- extractor,
296
- block,
297
- );
298
- const deletedData = await this.deleteBlockEntities(
299
- queryRunner,
300
- extractor,
301
- block,
302
- );
303
- await queryRunner.commitTransaction();
304
- return {
305
- deletedData,
306
- updatedData: updatedData.map((data) => pick(data, 'boxId')),
307
- };
308
- } catch (error) {
309
- await queryRunner.rollbackTransaction();
310
- this.logger.error(
311
- `An error occurred while deleting data extracted from block ${block}`,
312
- error,
313
- );
314
- throw error;
315
- } finally {
316
- await queryRunner.release();
317
- }
318
- };
319
- }
@@ -1,32 +0,0 @@
1
- import {
2
- Column,
3
- PrimaryGeneratedColumn,
4
- Unique,
5
- } from '@rosen-bridge/extended-typeorm';
6
-
7
- @Unique(['boxId', 'extractor'])
8
- export abstract class AbstractErgoExtractorEntity {
9
- @PrimaryGeneratedColumn()
10
- id: number;
11
-
12
- @Column({ type: 'varchar' })
13
- boxId: string;
14
-
15
- @Column({ type: 'varchar' })
16
- block: string;
17
-
18
- @Column({ type: 'int' })
19
- height: number;
20
-
21
- @Column({ nullable: true, type: 'varchar' })
22
- spendBlock?: string | null;
23
-
24
- @Column({ nullable: true, type: 'int' })
25
- spendHeight?: number | null;
26
-
27
- @Column({ type: 'varchar' })
28
- extractor: string;
29
-
30
- @Column({ type: 'varchar' })
31
- serialized: string;
32
- }
package/lib/ergo/index.ts DELETED
@@ -1,9 +0,0 @@
1
- export * from './AbstractErgoExtractor';
2
- export * from './AbstractErgoExtractorAction';
3
- export * from './interfaces';
4
- export * from './network/ExplorerNetwork';
5
- export * from './network/NodeNetwork';
6
- export * from './network/AbstractNetwork';
7
- export * from './initializable';
8
- export * from './utils';
9
- export * from './AbstractErgoExtractorEntity';