@lido-nestjs/registry 1.0.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 (63) hide show
  1. package/LICENSE.txt +21 -0
  2. package/README.md +14 -0
  3. package/dist/fetch/interfaces/key.interface.d.ts +7 -0
  4. package/dist/fetch/interfaces/module.interface.d.ts +14 -0
  5. package/dist/fetch/interfaces/operator.interface.d.ts +10 -0
  6. package/dist/fetch/interfaces/overrides.interface.d.ts +10 -0
  7. package/dist/fetch/key.constants.d.ts +1 -0
  8. package/dist/fetch/key.constants.js +7 -0
  9. package/dist/fetch/key.fetch.d.ts +13 -0
  10. package/dist/fetch/key.fetch.js +49 -0
  11. package/dist/fetch/meta.fetch.d.ts +8 -0
  12. package/dist/fetch/meta.fetch.js +23 -0
  13. package/dist/fetch/operator.constants.d.ts +1 -0
  14. package/dist/fetch/operator.constants.js +7 -0
  15. package/dist/fetch/operator.fetch.d.ts +13 -0
  16. package/dist/fetch/operator.fetch.js +55 -0
  17. package/dist/fetch/registry-fetch.module.d.ts +8 -0
  18. package/dist/fetch/registry-fetch.module.js +79 -0
  19. package/dist/fetch/registry-fetch.service.d.ts +2 -0
  20. package/dist/fetch/registry-fetch.service.js +12 -0
  21. package/dist/index.d.ts +22 -0
  22. package/dist/index.js +96 -0
  23. package/dist/main/abstract-registry.d.ts +52 -0
  24. package/dist/main/abstract-registry.js +211 -0
  25. package/dist/main/constants.d.ts +1 -0
  26. package/dist/main/constants.js +7 -0
  27. package/dist/main/interfaces/module.interface.d.ts +11 -0
  28. package/dist/main/key-registry/key-registry.module.d.ts +8 -0
  29. package/dist/main/key-registry/key-registry.module.js +57 -0
  30. package/dist/main/key-registry/key-registry.service.d.ts +9 -0
  31. package/dist/main/key-registry/key-registry.service.js +22 -0
  32. package/dist/main/validator-registry/validator-registry.module.d.ts +8 -0
  33. package/dist/main/validator-registry/validator-registry.module.js +57 -0
  34. package/dist/main/validator-registry/validator-registry.service.d.ts +7 -0
  35. package/dist/main/validator-registry/validator-registry.service.js +18 -0
  36. package/dist/storage/interfaces/module.interface.d.ts +9 -0
  37. package/dist/storage/key.entity.d.ts +12 -0
  38. package/dist/storage/key.entity.js +41 -0
  39. package/dist/storage/key.repository.d.ts +4 -0
  40. package/dist/storage/key.repository.js +10 -0
  41. package/dist/storage/key.storage.d.ts +22 -0
  42. package/dist/storage/key.storage.js +59 -0
  43. package/dist/storage/meta.entity.d.ts +10 -0
  44. package/dist/storage/meta.entity.js +36 -0
  45. package/dist/storage/meta.repository.d.ts +4 -0
  46. package/dist/storage/meta.repository.js +10 -0
  47. package/dist/storage/meta.storage.d.ts +12 -0
  48. package/dist/storage/meta.storage.js +34 -0
  49. package/dist/storage/operator.entity.d.ts +14 -0
  50. package/dist/storage/operator.entity.js +56 -0
  51. package/dist/storage/operator.repository.d.ts +4 -0
  52. package/dist/storage/operator.repository.js +10 -0
  53. package/dist/storage/operator.storage.d.ts +18 -0
  54. package/dist/storage/operator.storage.js +48 -0
  55. package/dist/storage/registry-storage.module.d.ts +8 -0
  56. package/dist/storage/registry-storage.module.js +57 -0
  57. package/dist/storage/registry-storage.service.d.ts +8 -0
  58. package/dist/storage/registry-storage.service.js +25 -0
  59. package/dist/utils/meta.utils.d.ts +2 -0
  60. package/dist/utils/meta.utils.js +15 -0
  61. package/dist/utils/operator.utils.d.ts +2 -0
  62. package/dist/utils/operator.utils.js +17 -0
  63. package/package.json +56 -0
@@ -0,0 +1,211 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var tslib = require('tslib');
6
+ var common = require('@nestjs/common');
7
+ var contracts = require('@lido-nestjs/contracts');
8
+ var sqlite = require('@mikro-orm/sqlite');
9
+ var logger = require('@lido-nestjs/logger');
10
+ var decorators = require('@lido-nestjs/decorators');
11
+ var EventEmitter = require('events');
12
+ var cron = require('cron');
13
+ var meta_fetch = require('../fetch/meta.fetch.js');
14
+ var key_fetch = require('../fetch/key.fetch.js');
15
+ var operator_fetch = require('../fetch/operator.fetch.js');
16
+ var meta_storage = require('../storage/meta.storage.js');
17
+ var key_storage = require('../storage/key.storage.js');
18
+ var operator_storage = require('../storage/operator.storage.js');
19
+ var meta_entity = require('../storage/meta.entity.js');
20
+ var key_entity = require('../storage/key.entity.js');
21
+ var operator_entity = require('../storage/operator.entity.js');
22
+ var meta_utils = require('../utils/meta.utils.js');
23
+ var operator_utils = require('../utils/operator.utils.js');
24
+ var constants = require('./constants.js');
25
+
26
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
27
+
28
+ var EventEmitter__default = /*#__PURE__*/_interopDefaultLegacy(EventEmitter);
29
+
30
+ exports.AbstractRegistryService = class AbstractRegistryService {
31
+ constructor(registryContract, logger, metaFetch, metaStorage, keyFetch, keyStorage, operatorFetch, operatorStorage, entityManager, options) {
32
+ this.registryContract = registryContract;
33
+ this.logger = logger;
34
+ this.metaFetch = metaFetch;
35
+ this.metaStorage = metaStorage;
36
+ this.keyFetch = keyFetch;
37
+ this.keyStorage = keyStorage;
38
+ this.operatorFetch = operatorFetch;
39
+ this.operatorStorage = operatorStorage;
40
+ this.entityManager = entityManager;
41
+ this.options = options;
42
+ this.eventEmitter = new EventEmitter__default["default"]();
43
+ this.cronJob = new cron.CronJob((options === null || options === void 0 ? void 0 : options.subscribeInterval) || '*/10 * * * * *', this.cronHandler);
44
+ }
45
+ async cronHandler() {
46
+ try {
47
+ const result = await this.update('latest');
48
+ if (!result)
49
+ return;
50
+ this.eventEmitter.emit('result', result);
51
+ }
52
+ catch (error) {
53
+ this.eventEmitter.emit('error', error);
54
+ }
55
+ }
56
+ collectListenerCount() {
57
+ return (this.eventEmitter.listenerCount('result') +
58
+ this.eventEmitter.listenerCount('error'));
59
+ }
60
+ subscribe(cb) {
61
+ this.cronJob.start();
62
+ const resultCb = (result) => cb(null, result);
63
+ this.eventEmitter.addListener('result', resultCb);
64
+ this.eventEmitter.addListener('error', cb);
65
+ return () => {
66
+ this.eventEmitter.off('result', resultCb);
67
+ this.eventEmitter.off('error', cb);
68
+ if (!this.collectListenerCount()) {
69
+ this.cronJob.stop();
70
+ }
71
+ };
72
+ }
73
+ /** collects changed data from the contract and store it to the db */
74
+ async update(blockHashOrBlockTag) {
75
+ var _a, _b, _c, _d, _e;
76
+ const prevMeta = await this.getMetaDataFromStorage();
77
+ const currMeta = await this.getMetaDataFromContract(blockHashOrBlockTag);
78
+ const isSameContractState = meta_utils.compareMeta(prevMeta, currMeta);
79
+ this.logger.log('Collected metadata', { prevMeta, currMeta });
80
+ const previousBlockNumber = (_a = prevMeta === null || prevMeta === void 0 ? void 0 : prevMeta.blockNumber) !== null && _a !== void 0 ? _a : -1;
81
+ const currentBlockNumber = currMeta.blockNumber;
82
+ if (previousBlockNumber > currentBlockNumber) {
83
+ this.logger.warn('Previous data is newer than current data');
84
+ return;
85
+ }
86
+ if (isSameContractState) {
87
+ (_c = (_b = this.logger).debug) === null || _c === void 0 ? void 0 : _c.call(_b, 'Same state, no data update required', { currMeta });
88
+ await this.metaStorage.save(currMeta);
89
+ (_e = (_d = this.logger).debug) === null || _e === void 0 ? void 0 : _e.call(_d, 'Updated metadata in the DB', { currMeta });
90
+ return;
91
+ }
92
+ const blockHash = currMeta.blockHash;
93
+ const previousOperators = await this.getOperatorsFromStorage();
94
+ const currentOperators = await this.getOperatorsFromContract(blockHash);
95
+ this.logger.log('Collected operators', {
96
+ previousOperators: previousOperators.length,
97
+ currentOperators: currentOperators.length,
98
+ });
99
+ const updatedKeys = await this.getUpdatedKeysFromContract(previousOperators, currentOperators, blockHash);
100
+ this.logger.log('Fetched updated keys', {
101
+ updatedKeys: updatedKeys.length,
102
+ });
103
+ // save all data in a transaction
104
+ await this.entityManager.transactional(async (entityManager) => {
105
+ updatedKeys.forEach(async (operatorKey) => {
106
+ const instance = new key_entity.RegistryKey(operatorKey);
107
+ entityManager.persist(instance);
108
+ });
109
+ currentOperators.forEach(async (operator) => {
110
+ const instance = new operator_entity.RegistryOperator(operator);
111
+ entityManager.persist(instance);
112
+ });
113
+ const meta = new meta_entity.RegistryMeta(currMeta);
114
+ entityManager.persist(meta);
115
+ });
116
+ this.logger.log('Saved data to the DB', {
117
+ operators: currentOperators.length,
118
+ updatedKeys: updatedKeys.length,
119
+ currMeta,
120
+ });
121
+ return updatedKeys;
122
+ }
123
+ /** contract */
124
+ /** returns the meta data from the contract */
125
+ async getMetaDataFromContract(blockHashOrBlockTag) {
126
+ const { provider } = this.registryContract;
127
+ const block = await provider.getBlock(blockHashOrBlockTag);
128
+ const blockHash = block.hash;
129
+ const blockTag = { blockHash };
130
+ const keysOpIndex = await this.metaFetch.fetchKeysOpIndex({ blockTag });
131
+ return {
132
+ blockNumber: block.number,
133
+ blockHash,
134
+ keysOpIndex,
135
+ timestamp: block.timestamp,
136
+ };
137
+ }
138
+ /** returns operators from the contract */
139
+ async getOperatorsFromContract(blockHash) {
140
+ const overrides = { blockTag: { blockHash } };
141
+ return await this.operatorFetch.fetch(0, -1, overrides);
142
+ }
143
+ /** returns updated keys from the contract */
144
+ async getUpdatedKeysFromContract(previousOperators, currentOperators, blockHash) {
145
+ /**
146
+ * TODO: optimize a number of queries
147
+ * it's possible to update keys faster by using different strategies depending on the reason for the update
148
+ */
149
+ const keysByOperator = await Promise.all(currentOperators.map(async (currOperator, currentIndex) => {
150
+ var _a;
151
+ // check if the operator in the registry has changed since the last update
152
+ const prevOperator = (_a = previousOperators[currentIndex]) !== null && _a !== void 0 ? _a : null;
153
+ const isSameOperator = operator_utils.compareOperators(prevOperator, currOperator);
154
+ // skip updating keys from 0 to `usedSigningKeys` of previous collected data
155
+ // since the contract guarantees that these keys cannot be changed
156
+ const unchangedKeysMaxIndex = isSameOperator
157
+ ? prevOperator.usedSigningKeys
158
+ : 0;
159
+ const fromIndex = unchangedKeysMaxIndex;
160
+ const toIndex = this.getToIndex(currOperator);
161
+ const operatorIndex = currOperator.index;
162
+ const overrides = { blockTag: { blockHash } };
163
+ const result = await this.keyFetch.fetch(operatorIndex, fromIndex, toIndex, overrides);
164
+ this.logger.log('Keys fetched', {
165
+ operatorIndex,
166
+ fromIndex,
167
+ toIndex,
168
+ fetchedKeys: result.length,
169
+ });
170
+ return result;
171
+ }));
172
+ return keysByOperator.flat();
173
+ }
174
+ /** storage */
175
+ /** returns the latest meta data from the db */
176
+ async getMetaDataFromStorage() {
177
+ return await this.metaStorage.get();
178
+ }
179
+ /** returns the latest operators data from the db */
180
+ async getOperatorsFromStorage() {
181
+ return await this.operatorStorage.findAll();
182
+ }
183
+ /** clears the db */
184
+ async clear() {
185
+ await this.entityManager.transactional(async (entityManager) => {
186
+ entityManager.nativeDelete(key_entity.RegistryKey, {});
187
+ entityManager.nativeDelete(operator_entity.RegistryOperator, {});
188
+ entityManager.nativeDelete(meta_entity.RegistryMeta, {});
189
+ });
190
+ }
191
+ };
192
+ tslib.__decorate([
193
+ decorators.OneAtTime(),
194
+ tslib.__metadata("design:type", Function),
195
+ tslib.__metadata("design:paramtypes", []),
196
+ tslib.__metadata("design:returntype", Promise)
197
+ ], exports.AbstractRegistryService.prototype, "cronHandler", null);
198
+ exports.AbstractRegistryService = tslib.__decorate([
199
+ common.Injectable(),
200
+ tslib.__param(0, common.Inject(contracts.REGISTRY_CONTRACT_TOKEN)),
201
+ tslib.__param(1, common.Inject(logger.LOGGER_PROVIDER)),
202
+ tslib.__param(9, common.Optional()),
203
+ tslib.__param(9, common.Inject(constants.REGISTRY_GLOBAL_OPTIONS_TOKEN)),
204
+ tslib.__metadata("design:paramtypes", [Object, Object, meta_fetch.RegistryMetaFetchService,
205
+ meta_storage.RegistryMetaStorageService,
206
+ key_fetch.RegistryKeyFetchService,
207
+ key_storage.RegistryKeyStorageService,
208
+ operator_fetch.RegistryOperatorFetchService,
209
+ operator_storage.RegistryOperatorStorageService,
210
+ sqlite.EntityManager, Object])
211
+ ], exports.AbstractRegistryService);
@@ -0,0 +1 @@
1
+ export declare const REGISTRY_GLOBAL_OPTIONS_TOKEN: unique symbol;
@@ -0,0 +1,7 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ const REGISTRY_GLOBAL_OPTIONS_TOKEN = Symbol('registryGlobalOptions');
6
+
7
+ exports.REGISTRY_GLOBAL_OPTIONS_TOKEN = REGISTRY_GLOBAL_OPTIONS_TOKEN;
@@ -0,0 +1,11 @@
1
+ import { ModuleMetadata } from '@nestjs/common';
2
+ import { RegistryFetchOptions } from '../../fetch/interfaces/module.interface';
3
+ export interface RegistryOptions extends RegistryFetchOptions {
4
+ subscribeInterval?: string;
5
+ }
6
+ export interface RegistryModuleSyncOptions extends Pick<ModuleMetadata, 'imports'>, RegistryOptions {
7
+ }
8
+ export interface RegistryModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
9
+ useFactory: (...args: any[]) => Promise<RegistryOptions>;
10
+ inject?: any[];
11
+ }
@@ -0,0 +1,8 @@
1
+ import { DynamicModule } from '@nestjs/common';
2
+ import { RegistryModuleSyncOptions, RegistryModuleAsyncOptions } from '../interfaces/module.interface';
3
+ export declare class KeyRegistryModule {
4
+ static forRoot(options?: RegistryModuleSyncOptions): DynamicModule;
5
+ static forRootAsync(options: RegistryModuleAsyncOptions): DynamicModule;
6
+ static forFeature(options?: RegistryModuleSyncOptions): DynamicModule;
7
+ static forFeatureAsync(options: RegistryModuleAsyncOptions): DynamicModule;
8
+ }
@@ -0,0 +1,57 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var tslib = require('tslib');
6
+ var common = require('@nestjs/common');
7
+ var keyRegistry_service = require('./key-registry.service.js');
8
+ var registryStorage_module = require('../../storage/registry-storage.module.js');
9
+ var registryFetch_module = require('../../fetch/registry-fetch.module.js');
10
+ var constants = require('../constants.js');
11
+
12
+ var KeyRegistryModule_1;
13
+ exports.KeyRegistryModule = KeyRegistryModule_1 = class KeyRegistryModule {
14
+ static forRoot(options) {
15
+ return Object.assign({ global: true }, this.forFeature(options));
16
+ }
17
+ static forRootAsync(options) {
18
+ return Object.assign({ global: true }, this.forFeatureAsync(options));
19
+ }
20
+ static forFeature(options) {
21
+ return {
22
+ module: KeyRegistryModule_1,
23
+ imports: [
24
+ ...((options === null || options === void 0 ? void 0 : options.imports) || []),
25
+ registryFetch_module.RegistryFetchModule.forFeature(options),
26
+ ],
27
+ providers: [
28
+ {
29
+ provide: constants.REGISTRY_GLOBAL_OPTIONS_TOKEN,
30
+ useValue: options,
31
+ },
32
+ ],
33
+ };
34
+ }
35
+ static forFeatureAsync(options) {
36
+ return {
37
+ module: KeyRegistryModule_1,
38
+ imports: [
39
+ ...(options.imports || []),
40
+ registryFetch_module.RegistryFetchModule.forFeatureAsync(options),
41
+ ],
42
+ providers: [
43
+ {
44
+ provide: constants.REGISTRY_GLOBAL_OPTIONS_TOKEN,
45
+ useFactory: options.useFactory,
46
+ },
47
+ ],
48
+ };
49
+ }
50
+ };
51
+ exports.KeyRegistryModule = KeyRegistryModule_1 = tslib.__decorate([
52
+ common.Module({
53
+ imports: [registryStorage_module.RegistryStorageModule],
54
+ providers: [keyRegistry_service.KeyRegistryService],
55
+ exports: [keyRegistry_service.KeyRegistryService],
56
+ })
57
+ ], exports.KeyRegistryModule);
@@ -0,0 +1,9 @@
1
+ import { RegistryOperator } from '../../storage/operator.entity';
2
+ import { AbstractRegistryService } from '../abstract-registry';
3
+ export declare class KeyRegistryService extends AbstractRegistryService {
4
+ getToIndex(currOperator: RegistryOperator): number;
5
+ /** returns all operators keys from the db */
6
+ getAllKeysFromStorage(): Promise<import("../..").RegistryKey[]>;
7
+ /** returns used keys from the db */
8
+ getUsedKeysFromStorage(): Promise<import("../..").RegistryKey[]>;
9
+ }
@@ -0,0 +1,22 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var abstractRegistry = require('../abstract-registry.js');
6
+
7
+ class KeyRegistryService extends abstractRegistry.AbstractRegistryService {
8
+ getToIndex(currOperator) {
9
+ // the right border for updating range is all operator keys
10
+ return currOperator.totalSigningKeys;
11
+ }
12
+ /** returns all operators keys from the db */
13
+ async getAllKeysFromStorage() {
14
+ return await this.keyStorage.findAll();
15
+ }
16
+ /** returns used keys from the db */
17
+ async getUsedKeysFromStorage() {
18
+ return await this.keyStorage.findUsed();
19
+ }
20
+ }
21
+
22
+ exports.KeyRegistryService = KeyRegistryService;
@@ -0,0 +1,8 @@
1
+ import { DynamicModule } from '@nestjs/common';
2
+ import { RegistryModuleSyncOptions, RegistryModuleAsyncOptions } from '../interfaces/module.interface';
3
+ export declare class ValidatorRegistryModule {
4
+ static forRoot(options?: RegistryModuleSyncOptions): DynamicModule;
5
+ static forRootAsync(options: RegistryModuleAsyncOptions): DynamicModule;
6
+ static forFeature(options?: RegistryModuleSyncOptions): DynamicModule;
7
+ static forFeatureAsync(options: RegistryModuleAsyncOptions): DynamicModule;
8
+ }
@@ -0,0 +1,57 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var tslib = require('tslib');
6
+ var common = require('@nestjs/common');
7
+ var validatorRegistry_service = require('./validator-registry.service.js');
8
+ var registryStorage_module = require('../../storage/registry-storage.module.js');
9
+ var registryFetch_module = require('../../fetch/registry-fetch.module.js');
10
+ var constants = require('../constants.js');
11
+
12
+ var ValidatorRegistryModule_1;
13
+ exports.ValidatorRegistryModule = ValidatorRegistryModule_1 = class ValidatorRegistryModule {
14
+ static forRoot(options) {
15
+ return Object.assign({ global: true }, this.forFeature(options));
16
+ }
17
+ static forRootAsync(options) {
18
+ return Object.assign({ global: true }, this.forFeatureAsync(options));
19
+ }
20
+ static forFeature(options) {
21
+ return {
22
+ module: ValidatorRegistryModule_1,
23
+ imports: [
24
+ ...((options === null || options === void 0 ? void 0 : options.imports) || []),
25
+ registryFetch_module.RegistryFetchModule.forFeature(options),
26
+ ],
27
+ providers: [
28
+ {
29
+ provide: constants.REGISTRY_GLOBAL_OPTIONS_TOKEN,
30
+ useValue: options,
31
+ },
32
+ ],
33
+ };
34
+ }
35
+ static forFeatureAsync(options) {
36
+ return {
37
+ module: ValidatorRegistryModule_1,
38
+ imports: [
39
+ ...(options.imports || []),
40
+ registryFetch_module.RegistryFetchModule.forFeatureAsync(options),
41
+ ],
42
+ providers: [
43
+ {
44
+ provide: constants.REGISTRY_GLOBAL_OPTIONS_TOKEN,
45
+ useFactory: options.useFactory,
46
+ },
47
+ ],
48
+ };
49
+ }
50
+ };
51
+ exports.ValidatorRegistryModule = ValidatorRegistryModule_1 = tslib.__decorate([
52
+ common.Module({
53
+ imports: [registryStorage_module.RegistryStorageModule],
54
+ providers: [validatorRegistry_service.ValidatorRegistryService],
55
+ exports: [validatorRegistry_service.ValidatorRegistryService],
56
+ })
57
+ ], exports.ValidatorRegistryModule);
@@ -0,0 +1,7 @@
1
+ import { RegistryOperator } from '../../storage/operator.entity';
2
+ import { AbstractRegistryService } from '../abstract-registry';
3
+ export declare class ValidatorRegistryService extends AbstractRegistryService {
4
+ getToIndex(currOperator: RegistryOperator): number;
5
+ /** returns used keys from the db */
6
+ getValidatorsKeysFromStorage(): Promise<import("../..").RegistryKey[]>;
7
+ }
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var abstractRegistry = require('../abstract-registry.js');
6
+
7
+ class ValidatorRegistryService extends abstractRegistry.AbstractRegistryService {
8
+ getToIndex(currOperator) {
9
+ // the right border for updating range is used keys
10
+ return currOperator.usedSigningKeys;
11
+ }
12
+ /** returns used keys from the db */
13
+ async getValidatorsKeysFromStorage() {
14
+ return await this.keyStorage.findUsed();
15
+ }
16
+ }
17
+
18
+ exports.ValidatorRegistryService = ValidatorRegistryService;
@@ -0,0 +1,9 @@
1
+ import { ModuleMetadata } from '@nestjs/common';
2
+ export interface RegistryStorageOptions {
3
+ }
4
+ export interface RegistryStorageModuleSyncOptions extends Pick<ModuleMetadata, 'imports'>, RegistryStorageOptions {
5
+ }
6
+ export interface RegistryStorageModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
7
+ useFactory: (...args: any[]) => Promise<RegistryStorageOptions>;
8
+ inject?: any[];
9
+ }
@@ -0,0 +1,12 @@
1
+ import { EntityRepositoryType, PrimaryKeyType } from '@mikro-orm/core';
2
+ import { RegistryKeyRepository } from './key.repository';
3
+ export declare class RegistryKey {
4
+ [EntityRepositoryType]?: RegistryKeyRepository;
5
+ [PrimaryKeyType]?: [number, number];
6
+ constructor(operatorKey: RegistryKey);
7
+ index: number;
8
+ operatorIndex: number;
9
+ key: string;
10
+ depositSignature: string;
11
+ used: boolean;
12
+ }
@@ -0,0 +1,41 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var tslib = require('tslib');
6
+ var core = require('@mikro-orm/core');
7
+ var key_repository = require('./key.repository.js');
8
+
9
+ exports.RegistryKey = class RegistryKey {
10
+ constructor(operatorKey) {
11
+ this.index = operatorKey.index;
12
+ this.operatorIndex = operatorKey.operatorIndex;
13
+ this.key = operatorKey.key.toLocaleLowerCase();
14
+ this.depositSignature = operatorKey.depositSignature.toLocaleLowerCase();
15
+ this.used = operatorKey.used;
16
+ }
17
+ };
18
+ tslib.__decorate([
19
+ core.PrimaryKey(),
20
+ tslib.__metadata("design:type", Number)
21
+ ], exports.RegistryKey.prototype, "index", void 0);
22
+ tslib.__decorate([
23
+ core.PrimaryKey(),
24
+ tslib.__metadata("design:type", Number)
25
+ ], exports.RegistryKey.prototype, "operatorIndex", void 0);
26
+ tslib.__decorate([
27
+ core.Property({ length: 98 }),
28
+ tslib.__metadata("design:type", String)
29
+ ], exports.RegistryKey.prototype, "key", void 0);
30
+ tslib.__decorate([
31
+ core.Property({ length: 194 }),
32
+ tslib.__metadata("design:type", String)
33
+ ], exports.RegistryKey.prototype, "depositSignature", void 0);
34
+ tslib.__decorate([
35
+ core.Property(),
36
+ tslib.__metadata("design:type", Boolean)
37
+ ], exports.RegistryKey.prototype, "used", void 0);
38
+ exports.RegistryKey = tslib.__decorate([
39
+ core.Entity({ customRepository: () => key_repository.RegistryKeyRepository }),
40
+ tslib.__metadata("design:paramtypes", [exports.RegistryKey])
41
+ ], exports.RegistryKey);
@@ -0,0 +1,4 @@
1
+ import { EntityRepository } from '@mikro-orm/sqlite';
2
+ import { RegistryKey } from './key.entity';
3
+ export declare class RegistryKeyRepository extends EntityRepository<RegistryKey> {
4
+ }
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var sqlite = require('@mikro-orm/sqlite');
6
+
7
+ class RegistryKeyRepository extends sqlite.EntityRepository {
8
+ }
9
+
10
+ exports.RegistryKeyRepository = RegistryKeyRepository;
@@ -0,0 +1,22 @@
1
+ import { RegistryKey } from './key.entity';
2
+ import { RegistryKeyRepository } from './key.repository';
3
+ export declare class RegistryKeyStorageService {
4
+ private readonly repository;
5
+ constructor(repository: RegistryKeyRepository);
6
+ /** find all keys */
7
+ findAll(): Promise<RegistryKey[]>;
8
+ /** find used keys */
9
+ findUsed(): Promise<RegistryKey[]>;
10
+ /** find all keys by operator */
11
+ findByOperatorIndex(operatorIndex: number): Promise<RegistryKey[]>;
12
+ /** find key by index */
13
+ findOneByIndex(operatorIndex: number, keyIndex: number): Promise<RegistryKey | null>;
14
+ /** removes key by index */
15
+ removeOneByIndex(operatorIndex: number, keyIndex: number): Promise<number>;
16
+ /** removes all keys */
17
+ removeAll(): Promise<number>;
18
+ /** saves key to storage */
19
+ saveOne(operatorKey: RegistryKey): Promise<void>;
20
+ /** saves multiply keys to storage */
21
+ save(operatorKeys: RegistryKey[]): Promise<import("@mikro-orm/core").EntityManager<import("@mikro-orm/core").IDatabaseDriver<import("@mikro-orm/core").Connection>>[]>;
22
+ }
@@ -0,0 +1,59 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var tslib = require('tslib');
6
+ var common = require('@nestjs/common');
7
+ var key_entity = require('./key.entity.js');
8
+ var key_repository = require('./key.repository.js');
9
+
10
+ exports.RegistryKeyStorageService = class RegistryKeyStorageService {
11
+ constructor(repository) {
12
+ this.repository = repository;
13
+ }
14
+ /** find all keys */
15
+ async findAll() {
16
+ return await this.repository.findAll();
17
+ }
18
+ /** find used keys */
19
+ async findUsed() {
20
+ return await this.repository.find({ used: true });
21
+ }
22
+ /** find all keys by operator */
23
+ async findByOperatorIndex(operatorIndex) {
24
+ return await this.repository.find({ operatorIndex });
25
+ }
26
+ /** find key by index */
27
+ async findOneByIndex(operatorIndex, keyIndex) {
28
+ return await this.repository.findOne({ operatorIndex, index: keyIndex });
29
+ }
30
+ /** removes key by index */
31
+ async removeOneByIndex(operatorIndex, keyIndex) {
32
+ return await this.repository.nativeDelete({
33
+ operatorIndex,
34
+ index: keyIndex,
35
+ });
36
+ }
37
+ /** removes all keys */
38
+ async removeAll() {
39
+ return await this.repository.nativeDelete({});
40
+ }
41
+ /** saves key to storage */
42
+ async saveOne(operatorKey) {
43
+ const key = new key_entity.RegistryKey(operatorKey);
44
+ return await this.repository.persistAndFlush(key);
45
+ }
46
+ /** saves multiply keys to storage */
47
+ async save(operatorKeys) {
48
+ const result = await Promise.all(operatorKeys.map(async (operatorKey) => {
49
+ const instance = new key_entity.RegistryKey(operatorKey);
50
+ return await this.repository.persist(instance);
51
+ }));
52
+ this.repository.flush();
53
+ return result;
54
+ }
55
+ };
56
+ exports.RegistryKeyStorageService = tslib.__decorate([
57
+ common.Injectable(),
58
+ tslib.__metadata("design:paramtypes", [key_repository.RegistryKeyRepository])
59
+ ], exports.RegistryKeyStorageService);
@@ -0,0 +1,10 @@
1
+ import { EntityRepositoryType } from '@mikro-orm/core';
2
+ import { RegistryMetaRepository } from './meta.repository';
3
+ export declare class RegistryMeta {
4
+ [EntityRepositoryType]?: RegistryMetaRepository;
5
+ constructor(meta: RegistryMeta);
6
+ blockNumber: number;
7
+ blockHash: string;
8
+ keysOpIndex: number;
9
+ timestamp: number;
10
+ }
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var tslib = require('tslib');
6
+ var core = require('@mikro-orm/core');
7
+ var meta_repository = require('./meta.repository.js');
8
+
9
+ exports.RegistryMeta = class RegistryMeta {
10
+ constructor(meta) {
11
+ this.blockNumber = meta.blockNumber;
12
+ this.blockHash = meta.blockHash.toLocaleLowerCase();
13
+ this.keysOpIndex = meta.keysOpIndex;
14
+ this.timestamp = meta.timestamp;
15
+ }
16
+ };
17
+ tslib.__decorate([
18
+ core.PrimaryKey(),
19
+ tslib.__metadata("design:type", Number)
20
+ ], exports.RegistryMeta.prototype, "blockNumber", void 0);
21
+ tslib.__decorate([
22
+ core.Property({ length: 66 }),
23
+ tslib.__metadata("design:type", String)
24
+ ], exports.RegistryMeta.prototype, "blockHash", void 0);
25
+ tslib.__decorate([
26
+ core.Property(),
27
+ tslib.__metadata("design:type", Number)
28
+ ], exports.RegistryMeta.prototype, "keysOpIndex", void 0);
29
+ tslib.__decorate([
30
+ core.Property(),
31
+ tslib.__metadata("design:type", Number)
32
+ ], exports.RegistryMeta.prototype, "timestamp", void 0);
33
+ exports.RegistryMeta = tslib.__decorate([
34
+ core.Entity({ customRepository: () => meta_repository.RegistryMetaRepository }),
35
+ tslib.__metadata("design:paramtypes", [exports.RegistryMeta])
36
+ ], exports.RegistryMeta);
@@ -0,0 +1,4 @@
1
+ import { EntityRepository } from '@mikro-orm/sqlite';
2
+ import { RegistryMeta } from './meta.entity';
3
+ export declare class RegistryMetaRepository extends EntityRepository<RegistryMeta> {
4
+ }
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var sqlite = require('@mikro-orm/sqlite');
6
+
7
+ class RegistryMetaRepository extends sqlite.EntityRepository {
8
+ }
9
+
10
+ exports.RegistryMetaRepository = RegistryMetaRepository;