@voidifydao/sdk 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 (115) hide show
  1. package/dist/cli/config/command.d.ts +2 -0
  2. package/dist/cli/config/command.js +91 -0
  3. package/dist/cli/config/init.d.ts +3 -0
  4. package/dist/cli/config/init.js +88 -0
  5. package/dist/cli/config/keypair.d.ts +4 -0
  6. package/dist/cli/config/keypair.js +35 -0
  7. package/dist/cli/config/loader.d.ts +11 -0
  8. package/dist/cli/config/loader.js +65 -0
  9. package/dist/cli/config/types.d.ts +50 -0
  10. package/dist/cli/config/types.js +33 -0
  11. package/dist/cli/deposit.d.ts +2 -0
  12. package/dist/cli/deposit.js +58 -0
  13. package/dist/cli/helpers.d.ts +12 -0
  14. package/dist/cli/helpers.js +53 -0
  15. package/dist/cli/note.d.ts +2 -0
  16. package/dist/cli/note.js +50 -0
  17. package/dist/cli/relayer.d.ts +2 -0
  18. package/dist/cli/relayer.js +60 -0
  19. package/dist/cli/substream.d.ts +2 -0
  20. package/dist/cli/substream.js +35 -0
  21. package/dist/cli/withdraw.d.ts +2 -0
  22. package/dist/cli/withdraw.js +23 -0
  23. package/dist/cli.d.ts +2 -0
  24. package/dist/cli.js +30 -0
  25. package/dist/context.d.ts +45 -0
  26. package/dist/context.js +77 -0
  27. package/dist/idl/voidify/idl.d.ts +1313 -0
  28. package/dist/idl/voidify/idl.js +1 -0
  29. package/dist/idl/voidify/idl.json +1307 -0
  30. package/dist/idl/voidify-staking/idl.d.ts +93 -0
  31. package/dist/idl/voidify-staking/idl.js +1 -0
  32. package/dist/idl/voidify-staking/idl.json +87 -0
  33. package/dist/index.d.ts +17 -0
  34. package/dist/index.js +10 -0
  35. package/dist/relayer/server/index.d.ts +6 -0
  36. package/dist/relayer/server/index.js +32 -0
  37. package/dist/relayer/server/server.d.ts +24 -0
  38. package/dist/relayer/server/server.js +158 -0
  39. package/dist/relayer/server/switchboard.d.ts +2 -0
  40. package/dist/relayer/server/switchboard.js +42 -0
  41. package/dist/relayer/types.d.ts +21 -0
  42. package/dist/relayer/types.js +1 -0
  43. package/dist/staking/commands.d.ts +3 -0
  44. package/dist/staking/commands.js +13 -0
  45. package/dist/staking/index.d.ts +2 -0
  46. package/dist/staking/index.js +2 -0
  47. package/dist/staking/program.d.ts +18 -0
  48. package/dist/staking/program.js +40 -0
  49. package/dist/substream/chain/events.d.ts +4 -0
  50. package/dist/substream/chain/events.js +50 -0
  51. package/dist/substream/chain/index.d.ts +24 -0
  52. package/dist/substream/chain/index.js +79 -0
  53. package/dist/substream/chain/registry.d.ts +44 -0
  54. package/dist/substream/chain/registry.js +28 -0
  55. package/dist/substream/chain/utils.d.ts +9 -0
  56. package/dist/substream/chain/utils.js +41 -0
  57. package/dist/substream/client.d.ts +27 -0
  58. package/dist/substream/client.js +28 -0
  59. package/dist/substream/database/indexeddb.d.ts +2 -0
  60. package/dist/substream/database/indexeddb.js +242 -0
  61. package/dist/substream/database/sqlite.d.ts +26 -0
  62. package/dist/substream/database/sqlite.js +275 -0
  63. package/dist/substream/modules/deposit.d.ts +14 -0
  64. package/dist/substream/modules/deposit.js +123 -0
  65. package/dist/substream/modules/index.d.ts +11 -0
  66. package/dist/substream/modules/index.js +7 -0
  67. package/dist/substream/modules/relayer.d.ts +10 -0
  68. package/dist/substream/modules/relayer.js +290 -0
  69. package/dist/substream/runtime.d.ts +38 -0
  70. package/dist/substream/runtime.js +163 -0
  71. package/dist/substream/server/event-listener.d.ts +18 -0
  72. package/dist/substream/server/event-listener.js +68 -0
  73. package/dist/substream/server/index.d.ts +3 -0
  74. package/dist/substream/server/index.js +30 -0
  75. package/dist/substream/server/server.d.ts +43 -0
  76. package/dist/substream/server/server.js +216 -0
  77. package/dist/substream/types.d.ts +94 -0
  78. package/dist/substream/types.js +1 -0
  79. package/dist/types/errors.d.ts +1 -0
  80. package/dist/types/errors.js +16 -0
  81. package/dist/types/events.d.ts +13 -0
  82. package/dist/types/events.js +1 -0
  83. package/dist/types/index.d.ts +3 -0
  84. package/dist/types/index.js +1 -0
  85. package/dist/utils/amount.d.ts +4 -0
  86. package/dist/utils/amount.js +41 -0
  87. package/dist/utils/anchor-events.d.ts +13 -0
  88. package/dist/utils/anchor-events.js +28 -0
  89. package/dist/utils/bytes.d.ts +10 -0
  90. package/dist/utils/bytes.js +29 -0
  91. package/dist/utils/idl-seed.d.ts +17 -0
  92. package/dist/utils/idl-seed.js +15 -0
  93. package/dist/utils/index.d.ts +2 -0
  94. package/dist/utils/index.js +2 -0
  95. package/dist/utils/logger.d.ts +3 -0
  96. package/dist/utils/logger.js +19 -0
  97. package/dist/utils/note.d.ts +19 -0
  98. package/dist/utils/note.js +83 -0
  99. package/dist/utils/proof.d.ts +11 -0
  100. package/dist/utils/proof.js +91 -0
  101. package/dist/utils/tx.d.ts +11 -0
  102. package/dist/utils/tx.js +62 -0
  103. package/dist/voidify/deposit.d.ts +10 -0
  104. package/dist/voidify/deposit.js +40 -0
  105. package/dist/voidify/index.d.ts +4 -0
  106. package/dist/voidify/index.js +4 -0
  107. package/dist/voidify/program.d.ts +36 -0
  108. package/dist/voidify/program.js +87 -0
  109. package/dist/voidify/relayer/index.d.ts +1 -0
  110. package/dist/voidify/relayer/index.js +1 -0
  111. package/dist/voidify/relayer/list.d.ts +5 -0
  112. package/dist/voidify/relayer/list.js +16 -0
  113. package/dist/voidify/withdraw.d.ts +16 -0
  114. package/dist/voidify/withdraw.js +188 -0
  115. package/package.json +79 -0
@@ -0,0 +1,275 @@
1
+ import Database from "better-sqlite3";
2
+ function ensureCursorsTable(db) {
3
+ db.exec(`
4
+ CREATE TABLE IF NOT EXISTS cursors (
5
+ scope_type TEXT NOT NULL,
6
+ scope_key TEXT NOT NULL,
7
+ last_index INTEGER,
8
+ last_signature TEXT,
9
+ last_sync_at INTEGER NOT NULL,
10
+ PRIMARY KEY (scope_type, scope_key)
11
+ )
12
+ `);
13
+ }
14
+ function readCursorSync(db, scope) {
15
+ const row = db
16
+ .prepare(`SELECT scope_type, scope_key, last_index, last_signature, last_sync_at
17
+ FROM cursors WHERE scope_type = ? AND scope_key = ?`)
18
+ .get(scope.scopeType, scope.scopeKey);
19
+ if (!row)
20
+ return null;
21
+ return {
22
+ scopeType: row.scope_type,
23
+ scopeKey: row.scope_key,
24
+ lastIndex: row.last_index === null ? null : BigInt(row.last_index),
25
+ lastSignature: row.last_signature,
26
+ lastSyncAt: row.last_sync_at,
27
+ };
28
+ }
29
+ function writeCursorSync(db, scope, event, lastSyncAt) {
30
+ db.prepare(`INSERT INTO cursors (scope_type, scope_key, last_index, last_signature, last_sync_at)
31
+ VALUES (?, ?, ?, ?, ?)
32
+ ON CONFLICT(scope_type, scope_key) DO UPDATE SET
33
+ last_index = excluded.last_index,
34
+ last_signature = excluded.last_signature,
35
+ last_sync_at = excluded.last_sync_at`).run(scope.scopeType, scope.scopeKey, eventIndexToNumber(event.eventIndex), event.signature, lastSyncAt);
36
+ }
37
+ function guardEvent(cursor, eventIndex) {
38
+ const last = cursor?.lastIndex ?? -1n;
39
+ if (eventIndex <= last)
40
+ return "duplicate";
41
+ if (eventIndex > last + 1n) {
42
+ return { kind: "gap", expected: last + 1n, got: eventIndex };
43
+ }
44
+ return "applied";
45
+ }
46
+ export class SQLiteEventStore {
47
+ db;
48
+ constructor(db) {
49
+ this.db = db;
50
+ }
51
+ async initialize() {
52
+ this.db.exec(`
53
+ CREATE TABLE IF NOT EXISTS events (
54
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
55
+ scope_type TEXT NOT NULL,
56
+ scope_key TEXT NOT NULL,
57
+ event_name TEXT NOT NULL,
58
+ event_index INTEGER NOT NULL,
59
+ signature TEXT NOT NULL,
60
+ slot INTEGER,
61
+ block_time INTEGER,
62
+ address TEXT NOT NULL,
63
+ payload_json TEXT NOT NULL,
64
+ created_at INTEGER NOT NULL,
65
+ UNIQUE(scope_type, scope_key, event_index)
66
+ );
67
+ CREATE INDEX IF NOT EXISTS idx_events_scope_index
68
+ ON events(scope_type, scope_key, event_index);
69
+ CREATE INDEX IF NOT EXISTS idx_events_name ON events(event_name);
70
+ CREATE INDEX IF NOT EXISTS idx_events_signature ON events(signature);
71
+ CREATE INDEX IF NOT EXISTS idx_events_address ON events(address);
72
+ `);
73
+ ensureCursorsTable(this.db);
74
+ }
75
+ async apply(scope, event) {
76
+ return this.applyBatch(scope, [event]);
77
+ }
78
+ async applyBatch(scope, events) {
79
+ if (events.length === 0) {
80
+ const cursor = await this.getCursor(scope);
81
+ return { kind: "applied", cursor: cursor?.lastIndex ?? -1n };
82
+ }
83
+ class GapError extends Error {
84
+ outcome;
85
+ constructor(outcome) {
86
+ super("gap");
87
+ this.outcome = outcome;
88
+ }
89
+ }
90
+ const sorted = [...events].sort(compareEvents);
91
+ const tx = this.db.transaction(() => {
92
+ let cursor = readCursorSync(this.db, scope);
93
+ let last = {
94
+ kind: "applied",
95
+ cursor: cursor?.lastIndex ?? -1n,
96
+ };
97
+ for (const event of sorted) {
98
+ const guard = guardEvent(cursor, event.eventIndex);
99
+ if (typeof guard !== "string")
100
+ throw new GapError(guard);
101
+ if (guard === "duplicate") {
102
+ last = { kind: "duplicate", cursor: cursor?.lastIndex ?? -1n };
103
+ continue;
104
+ }
105
+ insertEventSync(this.db, event);
106
+ const now = Date.now();
107
+ writeCursorSync(this.db, scope, event, now);
108
+ cursor = {
109
+ scopeType: scope.scopeType,
110
+ scopeKey: scope.scopeKey,
111
+ lastIndex: event.eventIndex,
112
+ lastSignature: event.signature,
113
+ lastSyncAt: now,
114
+ };
115
+ last = { kind: "applied", cursor: event.eventIndex };
116
+ }
117
+ return last;
118
+ });
119
+ try {
120
+ return tx();
121
+ }
122
+ catch (error) {
123
+ if (error instanceof GapError)
124
+ return error.outcome;
125
+ throw new Error("Failed to apply chain events", { cause: error });
126
+ }
127
+ }
128
+ async list(scope, opts) {
129
+ let query = `
130
+ SELECT * FROM events
131
+ WHERE scope_type = ? AND scope_key = ?
132
+ ORDER BY event_index DESC
133
+ `;
134
+ const params = [scope.scopeType, scope.scopeKey];
135
+ const { offset, limit } = opts ?? {};
136
+ if (limit !== undefined) {
137
+ query += " LIMIT ?";
138
+ params.push(limit);
139
+ if (offset !== undefined && offset > 0) {
140
+ query += " OFFSET ?";
141
+ params.push(offset);
142
+ }
143
+ }
144
+ else if (offset !== undefined && offset > 0) {
145
+ query += " LIMIT -1 OFFSET ?";
146
+ params.push(offset);
147
+ }
148
+ const rows = this.db.prepare(query).all(...params);
149
+ return rows.map(rowToEvent);
150
+ }
151
+ async getAfter(scope, afterIndex) {
152
+ let query = `
153
+ SELECT * FROM events
154
+ WHERE scope_type = ? AND scope_key = ?
155
+ `;
156
+ const params = [scope.scopeType, scope.scopeKey];
157
+ if (afterIndex !== undefined) {
158
+ query += " AND event_index > ?";
159
+ params.push(eventIndexToNumber(afterIndex));
160
+ }
161
+ query += " ORDER BY event_index ASC";
162
+ const rows = this.db.prepare(query).all(...params);
163
+ return rows.map(rowToEvent);
164
+ }
165
+ async count(scope) {
166
+ const row = this.db
167
+ .prepare(`SELECT COUNT(*) as count FROM events
168
+ WHERE scope_type = ? AND scope_key = ?`)
169
+ .get(scope.scopeType, scope.scopeKey);
170
+ return row?.count ?? 0;
171
+ }
172
+ async getCursor(scope) {
173
+ return readCursorSync(this.db, scope);
174
+ }
175
+ }
176
+ function insertEventSync(db, event) {
177
+ db.prepare(`INSERT INTO events
178
+ (scope_type, scope_key, event_name, event_index,
179
+ signature, slot, block_time, address, payload_json, created_at)
180
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(event.scopeType, event.scopeKey, event.eventName, eventIndexToNumber(event.eventIndex), event.signature, event.slot, event.blockTime, event.address, JSON.stringify(event.payload), event.createdAt);
181
+ }
182
+ function rowToEvent(row) {
183
+ return {
184
+ scopeType: row.scope_type,
185
+ scopeKey: row.scope_key,
186
+ eventName: row.event_name,
187
+ eventIndex: BigInt(row.event_index),
188
+ signature: row.signature,
189
+ slot: row.slot ?? null,
190
+ blockTime: row.block_time ?? null,
191
+ address: row.address,
192
+ payload: JSON.parse(row.payload_json),
193
+ createdAt: row.created_at,
194
+ };
195
+ }
196
+ function eventIndexToNumber(eventIndex) {
197
+ if (eventIndex < 0n || eventIndex > BigInt(Number.MAX_SAFE_INTEGER)) {
198
+ throw new RangeError(`Event index ${eventIndex.toString()} is outside the safe integer range`);
199
+ }
200
+ return Number(eventIndex);
201
+ }
202
+ function compareEvents(a, b) {
203
+ return a.eventIndex < b.eventIndex ? -1 : a.eventIndex > b.eventIndex ? 1 : 0;
204
+ }
205
+ export class SQLiteProjectionStore {
206
+ db;
207
+ constructor(db) {
208
+ this.db = db;
209
+ }
210
+ async initialize() {
211
+ this.db.exec(`
212
+ CREATE TABLE IF NOT EXISTS projection_states (
213
+ projection_id TEXT NOT NULL,
214
+ entity_key TEXT NOT NULL,
215
+ value_json TEXT NOT NULL,
216
+ updated_at INTEGER NOT NULL,
217
+ last_event_index INTEGER,
218
+ PRIMARY KEY (projection_id, entity_key)
219
+ );
220
+ CREATE INDEX IF NOT EXISTS idx_projection_states_projection
221
+ ON projection_states(projection_id);
222
+ `);
223
+ }
224
+ async get(projectionId, key) {
225
+ const row = this.db
226
+ .prepare(`SELECT * FROM projection_states
227
+ WHERE projection_id = ? AND entity_key = ?`)
228
+ .get(projectionId, key);
229
+ return row ? rowToProjectionState(row) : null;
230
+ }
231
+ async put(record) {
232
+ this.db
233
+ .prepare(`INSERT INTO projection_states
234
+ (projection_id, entity_key, value_json, updated_at, last_event_index)
235
+ VALUES (?, ?, ?, ?, ?)
236
+ ON CONFLICT(projection_id, entity_key) DO UPDATE SET
237
+ value_json = excluded.value_json,
238
+ updated_at = excluded.updated_at,
239
+ last_event_index = excluded.last_event_index`)
240
+ .run(record.projectionId, record.key, JSON.stringify(record.value), record.updatedAt, record.lastEventIndex === null
241
+ ? null
242
+ : eventIndexToNumber(record.lastEventIndex));
243
+ }
244
+ async list(projectionId) {
245
+ const rows = this.db
246
+ .prepare(`SELECT * FROM projection_states
247
+ WHERE projection_id = ?
248
+ ORDER BY entity_key ASC`)
249
+ .all(projectionId);
250
+ return rows.map(rowToProjectionState);
251
+ }
252
+ async clear(projectionId) {
253
+ this.db
254
+ .prepare("DELETE FROM projection_states WHERE projection_id = ?")
255
+ .run(projectionId);
256
+ }
257
+ }
258
+ function rowToProjectionState(row) {
259
+ return {
260
+ projectionId: row.projection_id,
261
+ key: row.entity_key,
262
+ value: JSON.parse(row.value_json),
263
+ updatedAt: row.updated_at,
264
+ lastEventIndex: row.last_event_index === null ? null : BigInt(row.last_event_index),
265
+ };
266
+ }
267
+ export function makeSQLiteStores(path, _programId) {
268
+ const db = new Database(path && path.length > 0 ? path : ":memory:");
269
+ const events = new SQLiteEventStore(db);
270
+ const projections = new SQLiteProjectionStore(db);
271
+ return {
272
+ events,
273
+ projections,
274
+ };
275
+ }
@@ -0,0 +1,14 @@
1
+ import type { DepositRecord, EventCursor, EventScope } from "../../substream/types.js";
2
+ import type { SubstreamModule } from "../../substream/chain/registry.js";
3
+ export interface DepositModuleApi {
4
+ sync(denomination: bigint): Promise<void>;
5
+ list(denomination: bigint, opts?: {
6
+ offset?: number;
7
+ limit?: number;
8
+ }): Promise<DepositRecord[]>;
9
+ getAfter(denomination: bigint, afterIndex?: bigint): Promise<DepositRecord[]>;
10
+ count(denomination: bigint): Promise<number>;
11
+ getCursor(denomination: bigint): Promise<EventCursor | null>;
12
+ }
13
+ export declare function depositScope(denomination: bigint): EventScope;
14
+ export declare const depositModule: SubstreamModule;
@@ -0,0 +1,123 @@
1
+ import { toBigInt } from "../../utils/anchor-events.js";
2
+ import { bytesToBigInt, bytesToHex } from "../../utils/bytes.js";
3
+ import { parseEventsFromLogs } from "../../utils/anchor-events.js";
4
+ import { syncTransactions } from "../../substream/chain/utils.js";
5
+ export function depositScope(denomination) {
6
+ return { scopeType: "deposit", scopeKey: denomination.toString() };
7
+ }
8
+ export const depositModule = {
9
+ id: "deposit",
10
+ scopeType: "deposit",
11
+ parseScopeKey(scopeKey) {
12
+ try {
13
+ return depositScope(BigInt(scopeKey));
14
+ }
15
+ catch {
16
+ return null;
17
+ }
18
+ },
19
+ createStream(ctx, voidify, scope) {
20
+ return createDepositStream(ctx, voidify, BigInt(scope.scopeKey));
21
+ },
22
+ liveEvents: [
23
+ {
24
+ eventName: "depositEvent",
25
+ async toRecord({ voidify, event, signature, slot }) {
26
+ const deposit = event;
27
+ return depositEventToChainEvent({
28
+ event: deposit,
29
+ signature,
30
+ slot,
31
+ address: voidify.pool(BigInt(String(deposit.denomination))),
32
+ });
33
+ },
34
+ },
35
+ ],
36
+ createClientApi(runtime) {
37
+ return {
38
+ async sync(denomination) {
39
+ await runtime.sync(depositScope(denomination));
40
+ },
41
+ async list(denomination, opts) {
42
+ const rows = await runtime.events.list(depositScope(denomination), opts);
43
+ return rows.map(depositRecordFromEvent);
44
+ },
45
+ async getAfter(denomination, afterIndex) {
46
+ const rows = await runtime.events.getAfter(depositScope(denomination), afterIndex);
47
+ return rows.map(depositRecordFromEvent);
48
+ },
49
+ async count(denomination) {
50
+ return runtime.events.count(depositScope(denomination));
51
+ },
52
+ async getCursor(denomination) {
53
+ return runtime.events.getCursor(depositScope(denomination));
54
+ },
55
+ };
56
+ },
57
+ };
58
+ function createDepositStream(ctx, voidify, denomination) {
59
+ const address = voidify.pool(denomination);
60
+ return {
61
+ id: "deposit",
62
+ scope: depositScope(denomination),
63
+ address,
64
+ getChainLastIndex: async () => {
65
+ const poolAccount = await voidify.program.account.pool.fetch(address);
66
+ return BigInt(poolAccount.merkleTree.nextIndex) - 1n;
67
+ },
68
+ collect: async (lastSignature) => {
69
+ const transactions = await syncTransactions(ctx.connection, address, lastSignature);
70
+ const records = [];
71
+ for (const tx of transactions) {
72
+ const decoded = parseEventsFromLogs(tx.logs, voidify.program.coder.events);
73
+ for (const item of decoded) {
74
+ if (item.name !== "depositEvent")
75
+ continue;
76
+ records.push(depositEventToChainEvent({
77
+ event: item.data,
78
+ signature: tx.signature,
79
+ slot: tx.slot,
80
+ blockTime: tx.blockTime,
81
+ address,
82
+ }));
83
+ }
84
+ }
85
+ return records;
86
+ },
87
+ };
88
+ }
89
+ function depositEventToChainEvent(args) {
90
+ const event = args.event;
91
+ const denomination = toBigInt(event.denomination);
92
+ const index = Number(event.index);
93
+ const commitmentBytes = Uint8Array.from(event.commitment);
94
+ const payload = {
95
+ denomination: denomination.toString(),
96
+ depositor: event.depositor.toString(),
97
+ commitment: bytesToBigInt(commitmentBytes).toString(),
98
+ commitmentHex: bytesToHex(commitmentBytes),
99
+ index,
100
+ timestamp: toBigInt(event.timestamp).toString(),
101
+ };
102
+ return {
103
+ ...depositScope(denomination),
104
+ eventName: "depositEvent",
105
+ eventIndex: BigInt(index),
106
+ signature: args.signature,
107
+ slot: args.slot ?? null,
108
+ blockTime: args.blockTime ?? null,
109
+ address: args.address.toBase58(),
110
+ payload,
111
+ createdAt: Date.now(),
112
+ };
113
+ }
114
+ function depositRecordFromEvent(event) {
115
+ return {
116
+ denomination: BigInt(String(event.payload.denomination)),
117
+ depositor: String(event.payload.depositor),
118
+ commitment: String(event.payload.commitment),
119
+ index: Number(event.payload.index),
120
+ timestamp: Number(BigInt(String(event.payload.timestamp))),
121
+ signature: event.signature,
122
+ };
123
+ }
@@ -0,0 +1,11 @@
1
+ import { SubstreamModuleRegistry } from "../../substream/chain/registry.js";
2
+ import { type DepositModuleApi } from "./deposit.js";
3
+ import { type RelayerModuleApi } from "./relayer.js";
4
+ export interface BuiltinSubstreamModuleApis {
5
+ deposit: DepositModuleApi;
6
+ relayer: RelayerModuleApi;
7
+ }
8
+ export declare const substreamModules: readonly [import("../../substream/chain/registry.js").SubstreamModule, import("../../substream/chain/registry.js").SubstreamModule];
9
+ export declare function createSubstreamRegistry(): SubstreamModuleRegistry;
10
+ export type { DepositModuleApi } from "./deposit.js";
11
+ export type { RelayerModuleApi } from "./relayer.js";
@@ -0,0 +1,7 @@
1
+ import { SubstreamModuleRegistry } from "../../substream/chain/registry.js";
2
+ import { depositModule } from "./deposit.js";
3
+ import { relayerModule } from "./relayer.js";
4
+ export const substreamModules = [depositModule, relayerModule];
5
+ export function createSubstreamRegistry() {
6
+ return new SubstreamModuleRegistry([...substreamModules]);
7
+ }
@@ -0,0 +1,10 @@
1
+ import type { EventScope, RelayerRecord } from "../../substream/types.js";
2
+ import type { SubstreamModule } from "../../substream/chain/registry.js";
3
+ export interface RelayerModuleApi {
4
+ sync(): Promise<void>;
5
+ list(): Promise<RelayerRecord[]>;
6
+ get(pubkey: string): Promise<RelayerRecord | null>;
7
+ rebuild(): Promise<void>;
8
+ }
9
+ export declare const RELAYER_SCOPE: EventScope;
10
+ export declare const relayerModule: SubstreamModule;