@verana-labs/vs-agent-sdk 1.11.0-dev.8 → 1.11.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 (64) hide show
  1. package/README.md +172 -0
  2. package/build/agent/VsAgent.d.ts +8 -2
  3. package/build/agent/VsAgent.js +121 -41
  4. package/build/agent/VsAgent.js.map +1 -1
  5. package/build/agent/createVsAgent.d.ts +2 -0
  6. package/build/agent/createVsAgent.js +1 -0
  7. package/build/agent/createVsAgent.js.map +1 -1
  8. package/build/agent/index.d.ts +2 -0
  9. package/build/agent/index.js +19 -0
  10. package/build/agent/index.js.map +1 -0
  11. package/build/blockchain/IndexerWebSocketService.d.ts +39 -0
  12. package/build/blockchain/IndexerWebSocketService.js +217 -0
  13. package/build/blockchain/IndexerWebSocketService.js.map +1 -0
  14. package/build/blockchain/VeranaChainService.d.ts +32 -0
  15. package/build/blockchain/VeranaChainService.js +124 -0
  16. package/build/blockchain/VeranaChainService.js.map +1 -0
  17. package/build/blockchain/VeranaHelpers.d.ts +4 -0
  18. package/build/blockchain/VeranaHelpers.js +29 -0
  19. package/build/blockchain/VeranaHelpers.js.map +1 -0
  20. package/build/blockchain/VeranaIndexerService.d.ts +11 -0
  21. package/build/blockchain/VeranaIndexerService.js +43 -0
  22. package/build/blockchain/VeranaIndexerService.js.map +1 -0
  23. package/build/blockchain/handlers/IndexerHandlerRegistry.d.ts +25 -0
  24. package/build/blockchain/handlers/IndexerHandlerRegistry.js +34 -0
  25. package/build/blockchain/handlers/IndexerHandlerRegistry.js.map +1 -0
  26. package/build/blockchain/handlers/defaultHandlers.d.ts +6 -0
  27. package/build/blockchain/handlers/defaultHandlers.js +126 -0
  28. package/build/blockchain/handlers/defaultHandlers.js.map +1 -0
  29. package/build/blockchain/handlers/index.d.ts +3 -0
  30. package/build/blockchain/handlers/index.js +20 -0
  31. package/build/blockchain/handlers/index.js.map +1 -0
  32. package/build/blockchain/handlers/stateMutations.d.ts +12 -0
  33. package/build/blockchain/handlers/stateMutations.js +113 -0
  34. package/build/blockchain/handlers/stateMutations.js.map +1 -0
  35. package/build/blockchain/index.d.ts +6 -0
  36. package/build/blockchain/index.js +23 -0
  37. package/build/blockchain/index.js.map +1 -0
  38. package/build/blockchain/types.d.ts +158 -0
  39. package/build/blockchain/types.js +6 -0
  40. package/build/blockchain/types.js.map +1 -0
  41. package/build/did/WebDidRegistrar.d.ts +3 -1
  42. package/build/did/WebDidRegistrar.js +10 -1
  43. package/build/did/WebDidRegistrar.js.map +1 -1
  44. package/build/did/migrateWebVhLog.d.ts +34 -0
  45. package/build/did/migrateWebVhLog.js +230 -0
  46. package/build/did/migrateWebVhLog.js.map +1 -0
  47. package/build/index.d.ts +4 -5
  48. package/build/index.js +5 -5
  49. package/build/index.js.map +1 -1
  50. package/build/plugins/setupBaseDidComm.d.ts +2 -0
  51. package/build/plugins/setupBaseDidComm.js +9 -1
  52. package/build/plugins/setupBaseDidComm.js.map +1 -1
  53. package/build/transports/VsAgentWsInboundTransport.js +1 -1
  54. package/build/transports/VsAgentWsInboundTransport.js.map +1 -1
  55. package/build/utils/agent.d.ts +2 -1
  56. package/build/utils/agent.js +16 -10
  57. package/build/utils/agent.js.map +1 -1
  58. package/build/utils/setupSelfTr.d.ts +115 -0
  59. package/build/utils/setupSelfTr.js +452 -0
  60. package/build/utils/setupSelfTr.js.map +1 -0
  61. package/build/utils/trustCredentialStore.d.ts +18 -0
  62. package/build/utils/trustCredentialStore.js +196 -0
  63. package/build/utils/trustCredentialStore.js.map +1 -0
  64. package/package.json +18 -11
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.IndexerWebSocketService = void 0;
7
+ const ws_1 = __importDefault(require("ws"));
8
+ const VeranaHelpers_1 = require("./VeranaHelpers");
9
+ const VeranaIndexerService_1 = require("./VeranaIndexerService");
10
+ const handlers_1 = require("./handlers");
11
+ const MAX_RECONNECT_DELAY_MS = 300000;
12
+ const WS_PATHNAME = 'verana/indexer/v1/events';
13
+ const CREATES_WITHOUT_ID = new Set(['CreateNewTrustRegistry', 'CreateNewCredentialSchema']);
14
+ class IndexerWebSocketService {
15
+ constructor(options) {
16
+ var _a;
17
+ this.options = options;
18
+ this.ws = null;
19
+ this.reconnectAttempt = 0;
20
+ this.stopped = false;
21
+ this.syncing = false;
22
+ this.IndexerEventRecords = [];
23
+ this.indexer = new VeranaIndexerService_1.VeranaIndexerService({
24
+ baseUrl: options.indexerUrl,
25
+ logger: options.agent.config.logger,
26
+ });
27
+ this.handlerRegistry = (_a = options.handlerRegistry) !== null && _a !== void 0 ? _a : (0, handlers_1.buildDefaultIndexerHandlerRegistry)();
28
+ }
29
+ async start() {
30
+ this.stopped = false;
31
+ await this.connect();
32
+ }
33
+ stop() {
34
+ var _a;
35
+ this.stopped = true;
36
+ (_a = this.ws) === null || _a === void 0 ? void 0 : _a.close();
37
+ this.ws = null;
38
+ }
39
+ get logger() {
40
+ return this.options.agent.config.logger;
41
+ }
42
+ /**
43
+ * Connects to the indexer WebSocket, performs an initial sync via REST (use /events endpoint because it returns historical events in a single request)
44
+ * Finally, processes pending events received during the initial sync.
45
+ */
46
+ async connect() {
47
+ this.syncing = true;
48
+ this.IndexerEventRecords = [];
49
+ this.openWebSocket();
50
+ await this.syncRest();
51
+ this.syncing = false;
52
+ await this.drainIndexerEventRecords();
53
+ }
54
+ openWebSocket() {
55
+ const url = new URL(this.options.indexerUrl);
56
+ const wsProto = url.protocol === 'https:' ? 'wss:' : 'ws:';
57
+ if (!this.options.agent.did)
58
+ throw new Error('Agent does not have any defined public DID');
59
+ const wsUrl = `${wsProto}//${url.host}/${WS_PATHNAME}?did=${encodeURIComponent(this.options.agent.did)}`;
60
+ this.logger.info(`[IndexerWS] Connecting to ${wsUrl}`);
61
+ const ws = new ws_1.default(wsUrl);
62
+ this.ws = ws;
63
+ ws.on('open', () => {
64
+ this.logger.info(`[IndexerWS] Connected to indexer`);
65
+ this.reconnectAttempt = 0;
66
+ });
67
+ ws.on('message', (data) => {
68
+ var _a;
69
+ try {
70
+ const event = JSON.parse(data.toString());
71
+ if (event.type !== 'indexer-event')
72
+ return;
73
+ if (event.block_height <= 0)
74
+ return;
75
+ if (!((_a = event.payload) === null || _a === void 0 ? void 0 : _a.sender))
76
+ return;
77
+ if (this.syncing) {
78
+ this.IndexerEventRecords.push(event);
79
+ }
80
+ else {
81
+ this.processBlock(event).catch(err => this.logger.error(`[IndexerWS] Handler error: ${err.message}`));
82
+ }
83
+ }
84
+ catch (_b) {
85
+ this.logger.warn(`[IndexerWS] Failed to parse message: ${data}`);
86
+ }
87
+ });
88
+ ws.on('close', () => {
89
+ if (!this.stopped)
90
+ this.scheduleReconnect();
91
+ });
92
+ ws.on('error', (error) => {
93
+ this.logger.error(`[IndexerWS] Error: ${error.message}`);
94
+ });
95
+ }
96
+ async syncRest() {
97
+ this.logger.info(`[IndexerWS] Starting REST initial sync`);
98
+ try {
99
+ const { lastBlockHeight } = await (0, VeranaHelpers_1.loadSyncState)(this.options.agent);
100
+ const data = await this.fetchInitialEvents(lastBlockHeight);
101
+ for (const event of data.events) {
102
+ await this.processBlock(event);
103
+ }
104
+ this.logger.info(`[IndexerWS] Initial sync complete: ${data.events.length} event(s)`);
105
+ }
106
+ catch (error) {
107
+ this.logger.error(`[IndexerWS] REST initial sync failed: ${error.message}`);
108
+ }
109
+ }
110
+ async drainIndexerEventRecords() {
111
+ const { lastBlockHeight } = await (0, VeranaHelpers_1.loadSyncState)(this.options.agent);
112
+ const events = this.IndexerEventRecords.splice(0);
113
+ let processed = 0;
114
+ let skipped = 0;
115
+ for (const event of events) {
116
+ if (event.block_height <= lastBlockHeight) {
117
+ skipped++;
118
+ continue;
119
+ }
120
+ await this.processBlock(event);
121
+ processed++;
122
+ }
123
+ if (skipped + processed > 0) {
124
+ this.logger.info(`[IndexerWS] Drained: ${processed} processed, ${skipped} skipped`);
125
+ }
126
+ }
127
+ async processBlock(event) {
128
+ try {
129
+ const activity = CREATES_WITHOUT_ID.has(event.event_type)
130
+ ? await this.resolveCreateActivity(event)
131
+ : await this.fetchActivity(event);
132
+ if (activity) {
133
+ await this.applyChanges(event, activity);
134
+ }
135
+ }
136
+ catch (error) {
137
+ this.logger.error(`[IndexerWS] Failed to process event ${event.event_type} block=${event.block_height}: ${error.message}`);
138
+ }
139
+ }
140
+ /**
141
+ * TODO: Once the indexer emits consistent event_id for create events, we can remove this workaround
142
+ */
143
+ async resolveCreateActivity(event) {
144
+ const changes = await this.indexer.getChanges(event.block_height);
145
+ const expectedType = event.payload.entity_type;
146
+ const expectedAccount = event.payload.sender;
147
+ const matches = changes.activity.filter(a => a.entity_type === expectedType && a.account === expectedAccount);
148
+ return matches.length > 0 ? Object.assign(Object.assign({}, matches[0]), { msg: event.event_type }) : undefined;
149
+ }
150
+ async fetchActivity(event) {
151
+ var _a;
152
+ const entity_id = event.payload.entity_id;
153
+ if (!entity_id) {
154
+ this.logger.warn(`[IndexerWS] No entity_id for event ${event.event_type} — skipping`);
155
+ return undefined;
156
+ }
157
+ const changes = await this.fetchEntity(event.payload.entity_type, entity_id);
158
+ return {
159
+ timestamp: event.timestamp,
160
+ block_height: event.block_height,
161
+ entity_type: (_a = event.payload.entity_type) !== null && _a !== void 0 ? _a : '',
162
+ entity_id,
163
+ msg: event.event_type,
164
+ changes,
165
+ account: event.payload.sender,
166
+ };
167
+ }
168
+ async fetchEntity(entityType, id) {
169
+ switch (entityType) {
170
+ case 'TrustRegistry':
171
+ return (await this.indexer.getTrustRegistry(id));
172
+ case 'CredentialSchema':
173
+ return (await this.indexer.getCredentialSchema(id));
174
+ case 'Permission':
175
+ return (await this.indexer.getPermission(id));
176
+ default:
177
+ return {};
178
+ }
179
+ }
180
+ async applyChanges(event, activity) {
181
+ const state = await (0, VeranaHelpers_1.loadSyncState)(this.options.agent);
182
+ const { block_height } = event;
183
+ try {
184
+ await this.handlerRegistry.dispatch(activity, {
185
+ agent: this.options.agent,
186
+ block_height,
187
+ operatorAddress: event.payload.sender,
188
+ state,
189
+ });
190
+ }
191
+ catch (err) {
192
+ this.logger.error(`[IndexerWS] Handler ${event.event_type} failed at block ${event.block_height}: ${err.message}`);
193
+ }
194
+ state.lastBlockHeight = Math.max(state.lastBlockHeight, event.block_height);
195
+ await (0, VeranaHelpers_1.saveSyncState)(this.options.agent, state);
196
+ this.logger.debug(`[IndexerWS] Block ${event.block_height}: applied ${event.event_type}`);
197
+ }
198
+ scheduleReconnect() {
199
+ const delay = Math.min(1000 * 2 ** this.reconnectAttempt, MAX_RECONNECT_DELAY_MS);
200
+ this.reconnectAttempt++;
201
+ this.logger.info(`[IndexerWS] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempt})`);
202
+ setTimeout(() => {
203
+ if (!this.stopped)
204
+ this.connect();
205
+ }, delay);
206
+ }
207
+ async fetchInitialEvents(afterBlockHeight) {
208
+ this.logger.info(`[IndexerWS] Fetching initial events after block ${afterBlockHeight}`);
209
+ if (!this.options.agent.did)
210
+ throw new Error('Agent does not have any defined public DID');
211
+ const response = await this.indexer.getEvents(this.options.agent.did, afterBlockHeight);
212
+ this.logger.info(`[IndexerWS] Fetched: count=${response.count}, after_block_height=${response.after_block_height}`);
213
+ return response;
214
+ }
215
+ }
216
+ exports.IndexerWebSocketService = IndexerWebSocketService;
217
+ //# sourceMappingURL=IndexerWebSocketService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndexerWebSocketService.js","sourceRoot":"","sources":["../../src/blockchain/IndexerWebSocketService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import Long from 'long';
2
+ import { CreateOrUpdatePermissionSessionParams, SetPermissionVPToValidatedParams, StartPermissionVPParams, VeranaChainConfig } from './types';
3
+ export declare class VeranaChainService {
4
+ private readonly config;
5
+ private signingClient;
6
+ private operatorAddress;
7
+ private chainId;
8
+ private permQuery;
9
+ constructor(config: VeranaChainConfig);
10
+ get address(): string;
11
+ get getChainId(): string;
12
+ start(): Promise<void>;
13
+ getPermission(id: Long): Promise<unknown>;
14
+ findPermissionsWithDID(params: object): Promise<unknown[]>;
15
+ getPermissionSession(uuid: string): Promise<unknown>;
16
+ startPermissionVP(params: StartPermissionVPParams): Promise<{
17
+ txHash: string;
18
+ }>;
19
+ renewPermissionVP(id: Long): Promise<{
20
+ txHash: string;
21
+ }>;
22
+ setPermissionVPToValidated(params: SetPermissionVPToValidatedParams): Promise<{
23
+ txHash: string;
24
+ }>;
25
+ cancelPermissionVPLastRequest(id: Long): Promise<{
26
+ txHash: string;
27
+ }>;
28
+ createOrUpdatePermissionSession(params: CreateOrUpdatePermissionSessionParams): Promise<{
29
+ txHash: string;
30
+ }>;
31
+ private broadcastMsg;
32
+ }
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VeranaChainService = void 0;
4
+ /* eslint-disable @typescript-eslint/no-var-requires */
5
+ const proto_signing_1 = require("@cosmjs/proto-signing");
6
+ const stargate_1 = require("@cosmjs/stargate");
7
+ const tendermint_rpc_1 = require("@cosmjs/tendermint-rpc");
8
+ const verana_types_1 = require("@verana-labs/verana-types");
9
+ const types_1 = require("./types");
10
+ const { QueryClientImpl: PermQueryClientImpl, } = require('@verana-labs/verana-types/codec/verana/perm/v1/query');
11
+ const { MsgStartPermissionVP, MsgRenewPermissionVP, MsgSetPermissionVPToValidated, MsgCancelPermissionVPLastRequest, MsgCreateOrUpdatePermissionSession, } = require('@verana-labs/verana-types/codec/verana/perm/v1/tx');
12
+ class VeranaChainService {
13
+ constructor(config) {
14
+ this.config = config;
15
+ }
16
+ get address() {
17
+ return this.operatorAddress;
18
+ }
19
+ get getChainId() {
20
+ return this.chainId;
21
+ }
22
+ async start() {
23
+ const { rpcUrl, mnemonic, chainId, logger, gasPrice } = this.config;
24
+ const wallet = await proto_signing_1.DirectSecp256k1HdWallet.fromMnemonic(mnemonic, {
25
+ prefix: types_1.VERANA_BECH32_PREFIX,
26
+ });
27
+ const [account] = await wallet.getAccounts();
28
+ this.operatorAddress = account.address;
29
+ logger.info(`[VeranaChain] vs_operator address: ${this.operatorAddress} (fund this address with VNA to enable on-chain operations)`);
30
+ const cometClient = await (0, tendermint_rpc_1.connectComet)(rpcUrl);
31
+ this.signingClient = await stargate_1.SigningStargateClient.createWithSigner(cometClient, wallet, {
32
+ registry: (0, verana_types_1.createVeranaRegistry)(),
33
+ aminoTypes: (0, verana_types_1.createVeranaAminoTypes)(),
34
+ gasPrice: stargate_1.GasPrice.fromString(gasPrice !== null && gasPrice !== void 0 ? gasPrice : '0uvna'), // TODO: consider minium gas price
35
+ });
36
+ this.chainId = await this.signingClient.getChainId();
37
+ if (chainId && this.chainId !== chainId) {
38
+ throw new Error(`[VeranaChain] Chain ID mismatch: expected "${chainId}", got "${this.chainId}"`);
39
+ }
40
+ logger.info(`[VeranaChain] Connected to chain: ${this.chainId}`);
41
+ const queryClient = new stargate_1.QueryClient(cometClient);
42
+ const rpc = (0, stargate_1.createProtobufRpcClient)(queryClient);
43
+ this.permQuery = new PermQueryClientImpl(rpc);
44
+ }
45
+ // Query API (No signed)
46
+ async getPermission(id) {
47
+ return this.permQuery.GetPermission({ id });
48
+ }
49
+ async findPermissionsWithDID(params) {
50
+ var _a;
51
+ const result = await this.permQuery.FindPermissionsWithDID(params);
52
+ return (_a = result.permissions) !== null && _a !== void 0 ? _a : [];
53
+ }
54
+ async getPermissionSession(uuid) {
55
+ return this.permQuery.GetPermissionSession({ id: uuid });
56
+ }
57
+ // Transaction API (Signed)
58
+ async startPermissionVP(params) {
59
+ const value = MsgStartPermissionVP.fromPartial({
60
+ creator: this.operatorAddress,
61
+ type: params.type,
62
+ validatorPermId: params.validatorPermId,
63
+ country: params.country,
64
+ did: params.did,
65
+ validationFees: params.validationFees,
66
+ });
67
+ const result = await this.broadcastMsg(verana_types_1.veranaTypeUrls.MsgStartPermissionVP, value);
68
+ return { txHash: result.transactionHash };
69
+ }
70
+ async renewPermissionVP(id) {
71
+ const value = MsgRenewPermissionVP.fromPartial({
72
+ creator: this.operatorAddress,
73
+ id,
74
+ });
75
+ const result = await this.broadcastMsg(verana_types_1.veranaTypeUrls.MsgRenewPermissionVP, value);
76
+ return { txHash: result.transactionHash };
77
+ }
78
+ async setPermissionVPToValidated(params) {
79
+ const value = MsgSetPermissionVPToValidated.fromPartial({
80
+ creator: this.operatorAddress,
81
+ id: params.id,
82
+ effectiveUntil: params.effectiveUntil,
83
+ validationFees: params.validationFees,
84
+ issuanceFees: params.issuanceFees,
85
+ verificationFees: params.verificationFees,
86
+ country: params.country,
87
+ vpSummaryDigestSri: params.vpSummaryDigestSri,
88
+ issuanceFeeDiscount: params.issuanceFeeDiscount,
89
+ verificationFeeDiscount: params.verificationFeeDiscount,
90
+ });
91
+ const result = await this.broadcastMsg(verana_types_1.veranaTypeUrls.MsgSetPermissionVPToValidated, value);
92
+ return { txHash: result.transactionHash };
93
+ }
94
+ async cancelPermissionVPLastRequest(id) {
95
+ const value = MsgCancelPermissionVPLastRequest.fromPartial({
96
+ creator: this.operatorAddress,
97
+ id,
98
+ });
99
+ const result = await this.broadcastMsg(verana_types_1.veranaTypeUrls.MsgCancelPermissionVPLastRequest, value);
100
+ return { txHash: result.transactionHash };
101
+ }
102
+ async createOrUpdatePermissionSession(params) {
103
+ const value = MsgCreateOrUpdatePermissionSession.fromPartial({
104
+ creator: this.operatorAddress,
105
+ id: params.id,
106
+ issuerPermId: params.issuerPermId,
107
+ verifierPermId: params.verifierPermId,
108
+ agentPermId: params.agentPermId,
109
+ walletAgentPermId: params.walletAgentPermId,
110
+ });
111
+ const result = await this.broadcastMsg(verana_types_1.veranaTypeUrls.MsgCreateOrUpdatePermissionSession, value);
112
+ return { txHash: result.transactionHash };
113
+ }
114
+ async broadcastMsg(typeUrl, value) {
115
+ const msg = { typeUrl, value };
116
+ this.config.logger.debug(`[VeranaChain] Broadcasting ${typeUrl}`);
117
+ const result = await this.signingClient.signAndBroadcast(this.operatorAddress, [msg], 'auto');
118
+ (0, stargate_1.assertIsDeliverTxSuccess)(result);
119
+ this.config.logger.info(`[VeranaChain] Tx success: ${result.transactionHash}`);
120
+ return result;
121
+ }
122
+ }
123
+ exports.VeranaChainService = VeranaChainService;
124
+ //# sourceMappingURL=VeranaChainService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VeranaChainService.js","sourceRoot":"","sources":["../../src/blockchain/VeranaChainService.ts"],"names":[],"mappings":";;;AAAA,uDAAuD;AACvD,yDAA+D;AAC/D,+CAOyB;AACzB,2DAAqD;AACrD,4DAAwG;AAGxG,mCAOgB;AAEhB,MAAM,EACJ,eAAe,EAAE,mBAAmB,GACrC,GAAG,OAAO,CAAC,sDAAsD,CAAC,CAAA;AACnE,MAAM,EACJ,oBAAoB,EACpB,oBAAoB,EACpB,6BAA6B,EAC7B,gCAAgC,EAChC,kCAAkC,GACnC,GAAG,OAAO,CAAC,mDAAmD,CAAC,CAAA;AAEhE,MAAa,kBAAkB;IAO7B,YAA6B,MAAyB;QAAzB,WAAM,GAAN,MAAM,CAAmB;IAAG,CAAC;IAE1D,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,eAAe,CAAA;IAC7B,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,CAAA;QAEnE,MAAM,MAAM,GAAG,MAAM,uCAAuB,CAAC,YAAY,CAAC,QAAQ,EAAE;YAClE,MAAM,EAAE,4BAAoB;SAC7B,CAAC,CAAA;QACF,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAA;QAC5C,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,OAAO,CAAA;QACtC,MAAM,CAAC,IAAI,CACT,sCAAsC,IAAI,CAAC,eAAe,6DAA6D,CACxH,CAAA;QAED,MAAM,WAAW,GAAG,MAAM,IAAA,6BAAY,EAAC,MAAM,CAAC,CAAA;QAC9C,IAAI,CAAC,aAAa,GAAG,MAAM,gCAAqB,CAAC,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE;YACrF,QAAQ,EAAE,IAAA,mCAAoB,GAAE;YAChC,UAAU,EAAE,IAAA,qCAAsB,GAAE;YACpC,QAAQ,EAAE,mBAAQ,CAAC,UAAU,CAAC,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,OAAO,CAAC,EAAE,kCAAkC;SACvF,CAAC,CAAA;QAEF,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAA;QACpD,IAAI,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,8CAA8C,OAAO,WAAW,IAAI,CAAC,OAAO,GAAG,CAAC,CAAA;QAClG,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,qCAAqC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;QAEhE,MAAM,WAAW,GAAG,IAAI,sBAAW,CAAC,WAAW,CAAC,CAAA;QAChD,MAAM,GAAG,GAAG,IAAA,kCAAuB,EAAC,WAAW,CAAC,CAAA;QAChD,IAAI,CAAC,SAAS,GAAG,IAAI,mBAAmB,CAAC,GAAG,CAAoB,CAAA;IAClE,CAAC;IAED,wBAAwB;IACxB,KAAK,CAAC,aAAa,CAAC,EAAQ;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IAC7C,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,MAAc;;QACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAA;QAClE,OAAO,MAAA,MAAM,CAAC,WAAW,mCAAI,EAAE,CAAA;IACjC,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,IAAY;QACrC,OAAO,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1D,CAAC;IAED,2BAA2B;IAC3B,KAAK,CAAC,iBAAiB,CAAC,MAA+B;QACrD,MAAM,KAAK,GAAG,oBAAoB,CAAC,WAAW,CAAC;YAC7C,OAAO,EAAE,IAAI,CAAC,eAAe;YAC7B,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,cAAc,EAAE,MAAM,CAAC,cAAc;SACtC,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,6BAAc,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAA;QAClF,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,eAAe,EAAE,CAAA;IAC3C,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,EAAQ;QAC9B,MAAM,KAAK,GAAG,oBAAoB,CAAC,WAAW,CAAC;YAC7C,OAAO,EAAE,IAAI,CAAC,eAAe;YAC7B,EAAE;SACH,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,6BAAc,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAA;QAClF,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,eAAe,EAAE,CAAA;IAC3C,CAAC;IAED,KAAK,CAAC,0BAA0B,CAAC,MAAwC;QACvE,MAAM,KAAK,GAAG,6BAA6B,CAAC,WAAW,CAAC;YACtD,OAAO,EAAE,IAAI,CAAC,eAAe;YAC7B,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;YACzC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,kBAAkB,EAAE,MAAM,CAAC,kBAAkB;YAC7C,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;YAC/C,uBAAuB,EAAE,MAAM,CAAC,uBAAuB;SACxD,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,6BAAc,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAA;QAC3F,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,eAAe,EAAE,CAAA;IAC3C,CAAC;IAED,KAAK,CAAC,6BAA6B,CAAC,EAAQ;QAC1C,MAAM,KAAK,GAAG,gCAAgC,CAAC,WAAW,CAAC;YACzD,OAAO,EAAE,IAAI,CAAC,eAAe;YAC7B,EAAE;SACH,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,6BAAc,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAA;QAC9F,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,eAAe,EAAE,CAAA;IAC3C,CAAC;IAED,KAAK,CAAC,+BAA+B,CACnC,MAA6C;QAE7C,MAAM,KAAK,GAAG,kCAAkC,CAAC,WAAW,CAAC;YAC3D,OAAO,EAAE,IAAI,CAAC,eAAe;YAC7B,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;SAC5C,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,6BAAc,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAA;QAChG,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,eAAe,EAAE,CAAA;IAC3C,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,OAAe,EAAE,KAAa;QACvD,MAAM,GAAG,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;QAC9B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAA;QACjE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAA;QAC7F,IAAA,mCAAwB,EAAC,MAAM,CAAC,CAAA;QAChC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,MAAM,CAAC,eAAe,EAAE,CAAC,CAAA;QAC9E,OAAO,MAAM,CAAA;IACf,CAAC;CACF;AArID,gDAqIC"}
@@ -0,0 +1,4 @@
1
+ import { VsAgent } from '../agent/VsAgent';
2
+ import { VeranaSyncState } from './types';
3
+ export declare function loadSyncState(agent: VsAgent): Promise<VeranaSyncState>;
4
+ export declare function saveSyncState(agent: VsAgent, state: VeranaSyncState): Promise<void>;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadSyncState = loadSyncState;
4
+ exports.saveSyncState = saveSyncState;
5
+ const types_1 = require("./types");
6
+ const emptyState = () => ({
7
+ lastBlockHeight: 0,
8
+ trustRegistries: {},
9
+ credentialSchemas: {},
10
+ permissions: {},
11
+ });
12
+ async function loadSyncState(agent) {
13
+ var _a;
14
+ const record = await agent.genericRecords.findById(types_1.RECORD_ID);
15
+ if (!record)
16
+ return emptyState();
17
+ return (_a = record.content) !== null && _a !== void 0 ? _a : emptyState();
18
+ }
19
+ async function saveSyncState(agent, state) {
20
+ const existing = await agent.genericRecords.findById(types_1.RECORD_ID);
21
+ if (existing) {
22
+ existing.content = state;
23
+ await agent.genericRecords.update(existing);
24
+ }
25
+ else {
26
+ await agent.genericRecords.save({ id: types_1.RECORD_ID, content: state });
27
+ }
28
+ }
29
+ //# sourceMappingURL=VeranaHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VeranaHelpers.js","sourceRoot":"","sources":["../../src/blockchain/VeranaHelpers.ts"],"names":[],"mappings":";;AAaA,sCAIC;AAED,sCAQC;AAvBD,mCAAoD;AAEpD,MAAM,UAAU,GAAG,GAAoB,EAAE,CAAC,CAAC;IACzC,eAAe,EAAE,CAAC;IAClB,eAAe,EAAE,EAAE;IACnB,iBAAiB,EAAE,EAAE;IACrB,WAAW,EAAE,EAAE;CAChB,CAAC,CAAA;AAEK,KAAK,UAAU,aAAa,CAAC,KAAc;;IAChD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,iBAAS,CAAC,CAAA;IAC7D,IAAI,CAAC,MAAM;QAAE,OAAO,UAAU,EAAE,CAAA;IAChC,OAAO,MAAC,MAAM,CAAC,OAAsC,mCAAI,UAAU,EAAE,CAAA;AACvE,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,KAAc,EAAE,KAAsB;IACxE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,iBAAS,CAAC,CAAA;IAC/D,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,OAAO,GAAG,KAA8B,CAAA;QACjD,MAAM,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC7C,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,iBAAS,EAAE,OAAO,EAAE,KAA8B,EAAE,CAAC,CAAA;IAC7F,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { CredentialSchemaDto, IndexerChangesResponse, IndexerEventsResponse, PermissionDto, TrustRegistryDto, VeranaIdxConfig } from './types';
2
+ export declare class VeranaIndexerService {
3
+ private readonly config;
4
+ private readonly baseUrl;
5
+ constructor(config: VeranaIdxConfig);
6
+ getChanges(blockHeight: number): Promise<IndexerChangesResponse>;
7
+ getEvents(agentDid: string, afterBlockHeight?: number, limit?: number): Promise<IndexerEventsResponse>;
8
+ getTrustRegistry(id: string | number): Promise<TrustRegistryDto>;
9
+ getCredentialSchema(id: string | number): Promise<CredentialSchemaDto>;
10
+ getPermission(id: string | number): Promise<PermissionDto>;
11
+ }
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VeranaIndexerService = void 0;
4
+ const util_1 = require("../utils/util");
5
+ class VeranaIndexerService {
6
+ constructor(config) {
7
+ this.config = config;
8
+ this.baseUrl = config.baseUrl.replace(/\/$/, '');
9
+ }
10
+ async getChanges(blockHeight) {
11
+ var _a, _b;
12
+ this.config.logger.debug(`[VeranaIndexer] getChanges block=${blockHeight}`);
13
+ const url = `${this.baseUrl}/verana/indexer/v1/changes/${blockHeight}`;
14
+ const data = await (0, util_1.fetchJson)(url);
15
+ return {
16
+ block_height: Number((_a = data['block_height']) !== null && _a !== void 0 ? _a : blockHeight),
17
+ next_change_at: data['next_change_at'] != null ? Number(data['next_change_at']) : null,
18
+ activity: ((_b = data['activity']) !== null && _b !== void 0 ? _b : []),
19
+ };
20
+ }
21
+ async getEvents(agentDid, afterBlockHeight = 0, limit = 500) {
22
+ this.config.logger.debug(`[VeranaIndexer] getEvents after_block=${afterBlockHeight}`);
23
+ const url = `${this.baseUrl}/verana/indexer/v1/events?did=${encodeURIComponent(agentDid)}&after_block_height=${afterBlockHeight}&limit=${limit}`;
24
+ return (0, util_1.fetchJson)(url);
25
+ }
26
+ async getTrustRegistry(id) {
27
+ this.config.logger.debug(`[VeranaIndexer] getTrustRegistry id=${id}`);
28
+ const data = await (0, util_1.fetchJson)(`${this.baseUrl}/verana/tr/v1/get/${id}`);
29
+ return data.trust_registry;
30
+ }
31
+ async getCredentialSchema(id) {
32
+ this.config.logger.debug(`[VeranaIndexer] getCredentialSchema id=${id}`);
33
+ const data = await (0, util_1.fetchJson)(`${this.baseUrl}/verana/cs/v1/get/${id}`);
34
+ return data.schema;
35
+ }
36
+ async getPermission(id) {
37
+ this.config.logger.debug(`[VeranaIndexer] getPermission id=${id}`);
38
+ const data = await (0, util_1.fetchJson)(`${this.baseUrl}/verana/perm/v1/get/${id}`);
39
+ return data.permission;
40
+ }
41
+ }
42
+ exports.VeranaIndexerService = VeranaIndexerService;
43
+ //# sourceMappingURL=VeranaIndexerService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VeranaIndexerService.js","sourceRoot":"","sources":["../../src/blockchain/VeranaIndexerService.ts"],"names":[],"mappings":";;;AAAA,wCAAyC;AAYzC,MAAa,oBAAoB;IAG/B,YAA6B,MAAuB;QAAvB,WAAM,GAAN,MAAM,CAAiB;QAClD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAClD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,WAAmB;;QAClC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,WAAW,EAAE,CAAC,CAAA;QAC3E,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,8BAA8B,WAAW,EAAE,CAAA;QACtE,MAAM,IAAI,GAAG,MAAM,IAAA,gBAAS,EAA0B,GAAG,CAAC,CAAA;QAC1D,OAAO;YACL,YAAY,EAAE,MAAM,CAAC,MAAA,IAAI,CAAC,cAAc,CAAC,mCAAI,WAAW,CAAC;YACzD,cAAc,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;YACtF,QAAQ,EAAE,CAAC,MAAA,IAAI,CAAC,UAAU,CAAC,mCAAI,EAAE,CAAsB;SACxD,CAAA;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAgB,EAAE,gBAAgB,GAAG,CAAC,EAAE,KAAK,GAAG,GAAG;QACjE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,gBAAgB,EAAE,CAAC,CAAA;QACrF,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,iCAAiC,kBAAkB,CAAC,QAAQ,CAAC,uBAAuB,gBAAgB,UAAU,KAAK,EAAE,CAAA;QAChJ,OAAO,IAAA,gBAAS,EAAwB,GAAG,CAAC,CAAA;IAC9C,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,EAAmB;QACxC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,EAAE,CAAC,CAAA;QACrE,MAAM,IAAI,GAAG,MAAM,IAAA,gBAAS,EAC1B,GAAG,IAAI,CAAC,OAAO,qBAAqB,EAAE,EAAE,CACzC,CAAA;QACD,OAAO,IAAI,CAAC,cAAc,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,EAAmB;QAC3C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE,EAAE,CAAC,CAAA;QACxE,MAAM,IAAI,GAAG,MAAM,IAAA,gBAAS,EAAkC,GAAG,IAAI,CAAC,OAAO,qBAAqB,EAAE,EAAE,CAAC,CAAA;QACvG,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,EAAmB;QACrC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,EAAE,CAAC,CAAA;QAClE,MAAM,IAAI,GAAG,MAAM,IAAA,gBAAS,EAAgC,GAAG,IAAI,CAAC,OAAO,uBAAuB,EAAE,EAAE,CAAC,CAAA;QACvG,OAAO,IAAI,CAAC,UAAU,CAAA;IACxB,CAAC;CACF;AA3CD,oDA2CC"}
@@ -0,0 +1,25 @@
1
+ import { VsAgent } from '../../agent';
2
+ import { IndexerActivity, VeranaSyncState } from '../types';
3
+ interface IndexerHandlerContext {
4
+ agent: VsAgent;
5
+ block_height: number;
6
+ operatorAddress: string;
7
+ state: VeranaSyncState;
8
+ }
9
+ export interface IndexerEventHandler<TMsg extends string = string> {
10
+ readonly msg: TMsg;
11
+ handle(activity: IndexerActivity, ctx: IndexerHandlerContext): Promise<void>;
12
+ }
13
+ /**
14
+ * Registry for handlers of indexer events. Handlers can be registered/unregistered at runtime
15
+ * and are looked up by the `msg` field of indexer activities.
16
+ */
17
+ export declare class IndexerHandlerRegistry {
18
+ private handlers;
19
+ register(handler: IndexerEventHandler): void;
20
+ unregister(msg: string): void;
21
+ get(msg: string): IndexerEventHandler | undefined;
22
+ has(msg: string): boolean;
23
+ dispatch(activity: IndexerActivity, ctx: IndexerHandlerContext): Promise<void>;
24
+ }
25
+ export {};
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IndexerHandlerRegistry = void 0;
4
+ /**
5
+ * Registry for handlers of indexer events. Handlers can be registered/unregistered at runtime
6
+ * and are looked up by the `msg` field of indexer activities.
7
+ */
8
+ class IndexerHandlerRegistry {
9
+ constructor() {
10
+ this.handlers = new Map();
11
+ }
12
+ register(handler) {
13
+ this.handlers.set(handler.msg, handler);
14
+ }
15
+ unregister(msg) {
16
+ this.handlers.delete(msg);
17
+ }
18
+ get(msg) {
19
+ return this.handlers.get(msg);
20
+ }
21
+ has(msg) {
22
+ return this.handlers.has(msg);
23
+ }
24
+ async dispatch(activity, ctx) {
25
+ const h = this.handlers.get(activity.msg);
26
+ if (!h) {
27
+ ctx.agent.config.logger.debug(`[IndexerWS] No handler for msg=${activity.msg}`);
28
+ return;
29
+ }
30
+ await h.handle(activity, ctx);
31
+ }
32
+ }
33
+ exports.IndexerHandlerRegistry = IndexerHandlerRegistry;
34
+ //# sourceMappingURL=IndexerHandlerRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndexerHandlerRegistry.js","sourceRoot":"","sources":["../../../src/blockchain/handlers/IndexerHandlerRegistry.ts"],"names":[],"mappings":";;;AAeA;;;GAGG;AACH,MAAa,sBAAsB;IAAnC;QACU,aAAQ,GAAG,IAAI,GAAG,EAA+B,CAAA;IA0B3D,CAAC;IAxBC,QAAQ,CAAC,OAA4B;QACnC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IACzC,CAAC;IAED,UAAU,CAAC,GAAW;QACpB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC3B,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC/B,CAAC;IAED,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAyB,EAAE,GAA0B;QAClE,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QACzC,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAA;YAC/E,OAAM;QACR,CAAC;QACD,MAAM,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAC/B,CAAC;CACF;AA3BD,wDA2BC"}
@@ -0,0 +1,6 @@
1
+ import { IndexerEventHandler, IndexerHandlerRegistry } from './IndexerHandlerRegistry';
2
+ /**
3
+ * Default handlers for indexer events emitted by the Verana blockchain.
4
+ */
5
+ export declare const defaultHandlers: IndexerEventHandler[];
6
+ export declare function buildDefaultIndexerHandlerRegistry(): IndexerHandlerRegistry;