@the-situation/indexer 0.13.0 → 0.15.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 (92) hide show
  1. package/README.md +21 -0
  2. package/dist/__tests__/performance/perf-fixtures.d.ts +26 -0
  3. package/dist/__tests__/performance/perf-fixtures.d.ts.map +1 -0
  4. package/dist/__tests__/performance/perf-fixtures.js +172 -0
  5. package/dist/__tests__/performance/perf-fixtures.js.map +1 -0
  6. package/dist/__tests__/performance/perf-utils.d.ts +42 -0
  7. package/dist/__tests__/performance/perf-utils.d.ts.map +1 -0
  8. package/dist/__tests__/performance/perf-utils.js +91 -0
  9. package/dist/__tests__/performance/perf-utils.js.map +1 -0
  10. package/dist/api/app.d.ts +6 -6
  11. package/dist/api/routes/admin-subscriptions.d.ts +6 -6
  12. package/dist/api/routes/admin.d.ts.map +1 -1
  13. package/dist/api/routes/admin.js +4 -0
  14. package/dist/api/routes/admin.js.map +1 -1
  15. package/dist/api/routes/market-events.d.ts.map +1 -1
  16. package/dist/api/routes/market-events.js +8 -0
  17. package/dist/api/routes/market-events.js.map +1 -1
  18. package/dist/api/routes/markets.d.ts.map +1 -1
  19. package/dist/api/routes/markets.js +8 -0
  20. package/dist/api/routes/markets.js.map +1 -1
  21. package/dist/api/routes/trader-events.d.ts.map +1 -1
  22. package/dist/api/routes/trader-events.js +8 -0
  23. package/dist/api/routes/trader-events.js.map +1 -1
  24. package/dist/db/connection.d.ts.map +1 -1
  25. package/dist/db/connection.js +4 -0
  26. package/dist/db/connection.js.map +1 -1
  27. package/dist/db/repositories/activity-feed.d.ts +3 -0
  28. package/dist/db/repositories/activity-feed.d.ts.map +1 -1
  29. package/dist/db/repositories/activity-feed.js +33 -18
  30. package/dist/db/repositories/activity-feed.js.map +1 -1
  31. package/dist/db/repositories/event.d.ts +22 -0
  32. package/dist/db/repositories/event.d.ts.map +1 -1
  33. package/dist/db/repositories/event.js +139 -75
  34. package/dist/db/repositories/event.js.map +1 -1
  35. package/dist/db/repositories/lp-position.d.ts +2 -10
  36. package/dist/db/repositories/lp-position.d.ts.map +1 -1
  37. package/dist/db/repositories/lp-position.js +54 -52
  38. package/dist/db/repositories/lp-position.js.map +1 -1
  39. package/dist/db/repositories/market-state.d.ts +10 -0
  40. package/dist/db/repositories/market-state.d.ts.map +1 -1
  41. package/dist/db/repositories/market-state.js +16 -5
  42. package/dist/db/repositories/market-state.js.map +1 -1
  43. package/dist/db/repositories/market.d.ts +7 -0
  44. package/dist/db/repositories/market.d.ts.map +1 -1
  45. package/dist/db/repositories/market.js +32 -24
  46. package/dist/db/repositories/market.js.map +1 -1
  47. package/dist/db/repositories/multinoulli-snapshots.d.ts +1 -0
  48. package/dist/db/repositories/multinoulli-snapshots.d.ts.map +1 -1
  49. package/dist/db/repositories/multinoulli-snapshots.js +7 -5
  50. package/dist/db/repositories/multinoulli-snapshots.js.map +1 -1
  51. package/dist/db/repositories/position.d.ts +1 -0
  52. package/dist/db/repositories/position.d.ts.map +1 -1
  53. package/dist/db/repositories/position.js +9 -0
  54. package/dist/db/repositories/position.js.map +1 -1
  55. package/dist/db/schema.d.ts.map +1 -1
  56. package/dist/db/schema.js +114 -5
  57. package/dist/db/schema.js.map +1 -1
  58. package/dist/etl/decoder.js +16 -0
  59. package/dist/etl/decoder.js.map +1 -1
  60. package/dist/etl/event-indexer.d.ts +6 -2
  61. package/dist/etl/event-indexer.d.ts.map +1 -1
  62. package/dist/etl/event-indexer.js +175 -79
  63. package/dist/etl/event-indexer.js.map +1 -1
  64. package/dist/etl/lp-position-refresher.d.ts +8 -2
  65. package/dist/etl/lp-position-refresher.d.ts.map +1 -1
  66. package/dist/etl/lp-position-refresher.js +74 -21
  67. package/dist/etl/lp-position-refresher.js.map +1 -1
  68. package/dist/etl/position-refresher.d.ts +9 -3
  69. package/dist/etl/position-refresher.d.ts.map +1 -1
  70. package/dist/etl/position-refresher.js +44 -36
  71. package/dist/etl/position-refresher.js.map +1 -1
  72. package/dist/etl/state-refresher.d.ts +8 -3
  73. package/dist/etl/state-refresher.d.ts.map +1 -1
  74. package/dist/etl/state-refresher.js +154 -16
  75. package/dist/etl/state-refresher.js.map +1 -1
  76. package/dist/layers/ChainReaderLive.d.ts.map +1 -1
  77. package/dist/layers/ChainReaderLive.js +180 -26
  78. package/dist/layers/ChainReaderLive.js.map +1 -1
  79. package/dist/services/ChainReader.d.ts +34 -1
  80. package/dist/services/ChainReader.d.ts.map +1 -1
  81. package/dist/services/ChainReader.js.map +1 -1
  82. package/dist/services/VoyagerRateLimit.d.ts +13 -1
  83. package/dist/services/VoyagerRateLimit.d.ts.map +1 -1
  84. package/dist/services/VoyagerRateLimit.js +20 -3
  85. package/dist/services/VoyagerRateLimit.js.map +1 -1
  86. package/dist/types/api.d.ts +28 -0
  87. package/dist/types/api.d.ts.map +1 -1
  88. package/dist/types/event.d.ts +24 -0
  89. package/dist/types/event.d.ts.map +1 -1
  90. package/dist/types/market.d.ts +16 -0
  91. package/dist/types/market.d.ts.map +1 -1
  92. package/package.json +3 -1
@@ -1,13 +1,18 @@
1
1
  /**
2
2
  * Event indexer — polls Voyager, decodes, stores in SQLite.
3
+ *
4
+ * Falls back to Starknet RPC (`starknet_getEvents` via ChainReader) when
5
+ * Voyager returns 429/503 so events keep flowing during rate-limit windows.
3
6
  */
4
7
  import { Effect } from 'effect';
8
+ import { ChainReaderTag } from '../services/ChainReader';
5
9
  import { DatabaseTag } from '../services/Database';
6
10
  import { EventBusTag } from '../services/EventBus';
7
11
  import { VoyagerClientTag } from '../services/VoyagerClient';
8
12
  import { decodeEvents } from './decoder';
9
13
  const PAGE_SIZE = 100;
10
14
  const MAX_PAGES = 10;
15
+ const RPC_FALLBACK_CHUNK_SIZE = 200;
11
16
  const RELEVANT_NAMES = new Set([
12
17
  'bootstrapped',
13
18
  'trademoved',
@@ -53,6 +58,14 @@ function decodedEventToInsert(marketAddress, d) {
53
58
  upper_bound: 0,
54
59
  old_mean: null,
55
60
  old_std_dev: null,
61
+ mean_2: null,
62
+ std_dev_2: null,
63
+ lower_bound_2: null,
64
+ upper_bound_2: null,
65
+ old_mean_2: null,
66
+ old_std_dev_2: null,
67
+ rho: null,
68
+ old_rho: null,
56
69
  collateral_posted: d.tokenAmount,
57
70
  raw_data: JSON.stringify(d.rawData),
58
71
  outcome_count: d.outcomeCount,
@@ -78,6 +91,14 @@ function decodedEventToInsert(marketAddress, d) {
78
91
  upper_bound: 0,
79
92
  old_mean: null,
80
93
  old_std_dev: null,
94
+ mean_2: null,
95
+ std_dev_2: null,
96
+ lower_bound_2: null,
97
+ upper_bound_2: null,
98
+ old_mean_2: null,
99
+ old_std_dev_2: null,
100
+ rho: null,
101
+ old_rho: null,
81
102
  collateral_posted: null,
82
103
  raw_data: JSON.stringify(d.rawData),
83
104
  settlement_outcome_index: d.settlementOutcomeIndex,
@@ -101,6 +122,14 @@ function decodedEventToInsert(marketAddress, d) {
101
122
  upper_bound: 0,
102
123
  old_mean: null,
103
124
  old_std_dev: null,
125
+ mean_2: null,
126
+ std_dev_2: null,
127
+ lower_bound_2: null,
128
+ upper_bound_2: null,
129
+ old_mean_2: null,
130
+ old_std_dev_2: null,
131
+ rho: null,
132
+ old_rho: null,
104
133
  collateral_posted: null,
105
134
  raw_data: JSON.stringify(d.rawData),
106
135
  settlement_outcomes_json: JSON.stringify(d.outcomes),
@@ -120,6 +149,8 @@ function decodedEventToInsert(marketAddress, d) {
120
149
  trader: d.provider,
121
150
  mean: 0, std_dev: 0, lower_bound: 0, upper_bound: 0,
122
151
  old_mean: null, old_std_dev: null,
152
+ mean_2: null, std_dev_2: null, lower_bound_2: null, upper_bound_2: null,
153
+ old_mean_2: null, old_std_dev_2: null, rho: null, old_rho: null,
123
154
  collateral_posted: d.tokenAmount,
124
155
  raw_data: JSON.stringify(d.rawData),
125
156
  settlement_value: null, settlement_x1: null, settlement_x2: null,
@@ -141,6 +172,14 @@ function decodedEventToInsert(marketAddress, d) {
141
172
  upper_bound: n.upperBound,
142
173
  old_mean: n.oldMean,
143
174
  old_std_dev: n.oldStdDev,
175
+ mean_2: n.mean2 ?? null,
176
+ std_dev_2: n.stdDev2 ?? null,
177
+ lower_bound_2: n.lowerBound2 ?? null,
178
+ upper_bound_2: n.upperBound2 ?? null,
179
+ old_mean_2: n.oldMean2 ?? null,
180
+ old_std_dev_2: n.oldStdDev2 ?? null,
181
+ rho: n.rho ?? null,
182
+ old_rho: n.oldRho ?? null,
144
183
  collateral_posted: n.collateralPosted,
145
184
  raw_data: JSON.stringify(n.rawData),
146
185
  settlement_value: null,
@@ -153,37 +192,68 @@ export const indexMarketEvents = (marketAddress, marketType = 'normal') =>
153
192
  Effect.gen(function* () {
154
193
  const db = yield* DatabaseTag;
155
194
  const voyager = yield* VoyagerClientTag;
195
+ const chain = yield* ChainReaderTag;
156
196
  const bus = yield* EventBusTag;
157
197
  const cursor = db.cursors.get(marketAddress);
158
198
  const lastBlock = cursor?.last_block_number ?? 0;
159
- // Fetch all pages of events from Voyager
199
+ // Try Voyager first. If it returns a retryable error (429/503), fall
200
+ // back to direct Starknet RPC so events keep flowing during rate-limit
201
+ // windows. Non-retryable errors (400/404) are surfaced as-is — they
202
+ // indicate a real bug, not a transient outage.
160
203
  const allEvents = [];
204
+ let maxProcessedBlock = lastBlock;
205
+ let maxProcessedTimestamp = cursor?.last_timestamp ?? 0;
161
206
  let currentPage = 1;
162
207
  let hasMore = true;
208
+ let usedRpcFallback = false;
163
209
  while (hasMore && currentPage <= MAX_PAGES) {
164
210
  const batchResult = yield* Effect.either(voyager.fetchEvents(marketAddress, currentPage, PAGE_SIZE));
211
+ // ── RPC fallback path ────────────────────────────────────────
212
+ // Triggered on Voyager 429 or 503. We make ONE RPC call per cycle
213
+ // (chunked) and process whatever's there; the cursor advances for
214
+ // next cycle if there's more to ingest.
165
215
  if (batchResult._tag === 'Left') {
166
216
  const err = batchResult.left;
167
- if (err.status === 429 || err.status === 503) {
168
- // Retry budget exhausted under rate limiting.
217
+ const isRateLimited = err.status === 429 || err.status === 503;
218
+ if (!isRateLimited) {
219
+ break;
169
220
  }
170
- else {
171
- // Non-retryable fetch error.
221
+ usedRpcFallback = true;
222
+ const rpcResult = yield* Effect.either(chain.fetchEventsByContract(marketAddress, lastBlock + 1, RPC_FALLBACK_CHUNK_SIZE));
223
+ if (rpcResult._tag === 'Left') {
224
+ // RPC also failed — give up this cycle, try again next tick.
225
+ break;
172
226
  }
227
+ for (const raw of rpcResult.right.events) {
228
+ const name = raw.name.toLowerCase();
229
+ if (!RELEVANT_NAMES.has(name))
230
+ continue;
231
+ if (raw.blockNumber <= lastBlock)
232
+ continue;
233
+ allEvents.push(raw);
234
+ maxProcessedBlock = Math.max(maxProcessedBlock, raw.blockNumber);
235
+ maxProcessedTimestamp = Math.max(maxProcessedTimestamp, raw.timestamp);
236
+ }
237
+ // RPC chunk is single-shot per cycle — don't loop further. Voyager
238
+ // will recover later and the cursor we just persisted means the
239
+ // next call resumes cleanly.
173
240
  break;
174
241
  }
175
242
  const batch = batchResult.right;
176
- // Filter to relevant events after our cursor
243
+ // Filter to relevant events after our cursor in a single pass.
177
244
  let sawOldEvent = false;
178
- const relevant = batch.events.filter((e) => {
179
- const isRelevant = RELEVANT_NAMES.has(e.name.toLowerCase());
180
- const isNew = e.blockNumber > lastBlock;
181
- if (isRelevant && !isNew) {
245
+ for (const raw of batch.events) {
246
+ const name = raw.name.toLowerCase();
247
+ if (!RELEVANT_NAMES.has(name))
248
+ continue;
249
+ if (raw.blockNumber <= lastBlock) {
182
250
  sawOldEvent = true;
251
+ continue;
183
252
  }
184
- return isRelevant && isNew;
185
- });
186
- allEvents.push(...relevant);
253
+ allEvents.push(raw);
254
+ maxProcessedBlock = Math.max(maxProcessedBlock, raw.blockNumber);
255
+ maxProcessedTimestamp = Math.max(maxProcessedTimestamp, raw.timestamp);
256
+ }
187
257
  // Early exit: if we've reached events we already indexed, stop paging
188
258
  if (sawOldEvent) {
189
259
  break;
@@ -191,88 +261,104 @@ Effect.gen(function* () {
191
261
  hasMore = currentPage < batch.lastPage;
192
262
  currentPage++;
193
263
  }
264
+ void usedRpcFallback; // reserved for future telemetry
194
265
  if (allEvents.length === 0) {
195
266
  return { marketAddress, newEvents: 0, lastBlock };
196
267
  }
197
- // Handle PositionClaimed events — update LP claim status if the claimer is an LP
268
+ const eventsToDecode = [];
269
+ // Handle PositionClaimed events — update LP claim status if the claimer is an LP.
270
+ // Keep them out of decodeEvents because they are not persisted in market_events.
198
271
  for (const raw of allEvents) {
199
- if (raw.name.toLowerCase() !== 'positionclaimed')
200
- continue;
201
- const claimer = (raw.keys[1] ?? '').toLowerCase();
202
- if (!claimer)
203
- continue;
204
- // Check if the claimer has LP shares in this market
205
- const lpPosition = db.lpPositions.findOne(marketAddress, claimer);
206
- if (lpPosition && lpPosition.claimed_at == null) {
207
- // Parse token_payout from data if available (u256: low, high)
208
- let claimPayout = 0;
209
- try {
210
- // PositionClaimed data layout:
211
- // [0..4] positionValue (SQ128x128Raw: limb0,limb1,limb2,limb3,neg)
212
- // [5..9] collateralReturned (SQ128x128Raw)
213
- // [10,11] tokenPayout (u256: low, high)
214
- if (raw.data.length >= 12) {
215
- const low = BigInt(raw.data[10]);
216
- const high = BigInt(raw.data[11]);
217
- claimPayout = Number(low + (high << 128n)) / 1e18;
272
+ if (raw.name.toLowerCase() === 'positionclaimed') {
273
+ const claimer = (raw.keys[1] ?? '').toLowerCase();
274
+ if (!claimer)
275
+ continue;
276
+ // Check if the claimer has LP shares in this market
277
+ const lpPosition = db.lpPositions.findOne(marketAddress, claimer);
278
+ if (lpPosition && lpPosition.claimed_at == null) {
279
+ // Parse token_payout from data if available (u256: low, high)
280
+ let claimPayout = 0;
281
+ try {
282
+ // PositionClaimed data layout:
283
+ // [0..4] positionValue (SQ128x128Raw: limb0,limb1,limb2,limb3,neg)
284
+ // [5..9] collateralReturned (SQ128x128Raw)
285
+ // [10,11] tokenPayout (u256: low, high)
286
+ if (raw.data.length >= 12) {
287
+ const low = BigInt(raw.data[10]);
288
+ const high = BigInt(raw.data[11]);
289
+ claimPayout = Number(low + (high << 128n)) / 1e18;
290
+ }
218
291
  }
292
+ catch {
293
+ // Fallback: leave claimPayout as 0
294
+ }
295
+ db.lpPositions.markClaimed(marketAddress, claimer, raw.timestamp, claimPayout);
219
296
  }
220
- catch {
221
- // Fallback: leave claimPayout as 0
222
- }
223
- db.lpPositions.markClaimed(marketAddress, claimer, raw.timestamp, claimPayout);
297
+ continue;
224
298
  }
299
+ eventsToDecode.push(raw);
225
300
  }
226
301
  // Decode events (pass market type for discrimination)
227
- const decoded = decodeEvents(allEvents, marketType);
302
+ const decoded = decodeEvents(eventsToDecode, marketType);
228
303
  if (decoded.length === 0) {
229
304
  // Even if no decodable events, advance cursor past any raw events we processed
230
305
  // (e.g. PositionClaimed) to avoid re-processing them next cycle.
231
- const maxBlock = Math.max(...allEvents.map((e) => e.blockNumber));
232
- const maxTs = Math.max(...allEvents.map((e) => e.timestamp));
233
- if (maxBlock > lastBlock) {
234
- db.cursors.upsert(marketAddress, maxBlock, maxTs, 0);
306
+ if (maxProcessedBlock > lastBlock) {
307
+ db.cursors.upsert(marketAddress, maxProcessedBlock, maxProcessedTimestamp, 0);
235
308
  }
236
- return { marketAddress, newEvents: 0, lastBlock: maxBlock };
309
+ return { marketAddress, newEvents: 0, lastBlock: maxProcessedBlock };
237
310
  }
238
- // Build insert inputs
239
- const inputs = decoded.map((d) => decodedEventToInsert(marketAddress, d));
240
- // Settlement events have mean=0, sigma=0 — carry forward the last known distribution
241
- // so the time-series chart doesn't drop to zero on settlement.
242
- for (let idx = 0; idx < inputs.length; idx++) {
243
- const input = inputs[idx];
311
+ const inputs = [];
312
+ const discoveredTraders = new Set();
313
+ const lpProvidersToRecompute = new Set();
314
+ let lastMean = 0;
315
+ let lastSigma = 0;
316
+ let lastMean2 = null;
317
+ let lastSigma2 = null;
318
+ let lastRho = null;
319
+ let checkedStateFallback = false;
320
+ // Build insert inputs + discover participants in one pass.
321
+ for (const d of decoded) {
322
+ let input = decodedEventToInsert(marketAddress, d);
323
+ // Settlement events have mean=0, sigma=0 — carry forward the last known distribution
324
+ // so the time-series chart doesn't drop to zero on settlement.
244
325
  if ((input.event_type === 'market_settled' || input.event_type === 'market_settled_multi') &&
245
326
  input.mean === 0 &&
246
327
  input.std_dev === 0) {
247
- let lastMean = 0;
248
- let lastSigma = 0;
249
- // Look backwards in this batch for the last trade event
250
- for (let i = idx - 1; i >= 0; i--) {
251
- const prev = inputs[i];
252
- if (prev.mean !== 0 || prev.std_dev !== 0) {
253
- lastMean = prev.mean;
254
- lastSigma = prev.std_dev;
255
- break;
256
- }
257
- }
258
- // If not found in batch, try the DB
259
- if (lastMean === 0 && lastSigma === 0) {
260
- const state = db.marketState.findByMarket(marketAddress);
261
- if (state?.mean != null && state.mean !== 0) {
262
- lastMean = state.mean;
263
- lastSigma = state.sigma ?? 0;
328
+ if (lastMean === 0 && lastSigma === 0 && !checkedStateFallback) {
329
+ checkedStateFallback = true;
330
+ const stateFallback = db.marketState.findByMarket(marketAddress);
331
+ if (stateFallback?.mean != null && stateFallback.mean !== 0) {
332
+ lastMean = stateFallback.mean;
333
+ lastSigma = stateFallback.sigma ?? 0;
264
334
  }
265
335
  }
266
336
  if (lastMean !== 0 || lastSigma !== 0) {
267
- inputs[idx] = { ...input, mean: lastMean, std_dev: lastSigma };
337
+ input = { ...input, mean: lastMean, std_dev: lastSigma };
338
+ }
339
+ if (lastMean2 != null && lastSigma2 != null) {
340
+ input = {
341
+ ...input,
342
+ mean_2: lastMean2,
343
+ std_dev_2: lastSigma2,
344
+ lower_bound_2: Number((lastMean2 - lastSigma2).toFixed(2)),
345
+ upper_bound_2: Number((lastMean2 + lastSigma2).toFixed(2)),
346
+ rho: lastRho,
347
+ };
268
348
  }
269
349
  }
270
- }
271
- // Insert events + discover traders + update cursor atomically
272
- const lastDecoded = decoded[decoded.length - 1];
273
- const inserted = db.events.insertBatch(inputs);
274
- // Discover traders and LP providers, update cursor
275
- for (const d of decoded) {
350
+ inputs.push(input);
351
+ if (input.mean !== 0 || input.std_dev !== 0) {
352
+ lastMean = input.mean;
353
+ lastSigma = input.std_dev;
354
+ }
355
+ if (input.mean_2 != null && input.std_dev_2 != null) {
356
+ lastMean2 = input.mean_2;
357
+ lastSigma2 = input.std_dev_2;
358
+ }
359
+ if (input.rho != null) {
360
+ lastRho = input.rho;
361
+ }
276
362
  let trader = null;
277
363
  if (isMultinoulliTradeEvent(d) || isNormalMarketEvent(d)) {
278
364
  trader = d.trader;
@@ -281,21 +367,31 @@ Effect.gen(function* () {
281
367
  trader = d.by;
282
368
  }
283
369
  if (trader) {
284
- db.positions.ensureTrader(marketAddress, trader);
370
+ discoveredTraders.add(trader);
285
371
  }
286
- // LP provider discovery — recompute totals from events (idempotent)
287
372
  if (isLPEvent(d)) {
288
- db.lpPositions.ensureProvider(marketAddress, d.provider);
289
- db.lpPositions.recomputeFromEvents(marketAddress, d.provider);
373
+ lpProvidersToRecompute.add(d.provider);
290
374
  }
291
375
  // The bootstrapper LP enters via market_initialized (not liquidity_added).
292
376
  // The initializer address is in keys[1] of the MarketInitialized event,
293
377
  // surfaced as `d.trader` by the decoder. Create their LP position row so
294
378
  // they show up in the Market Participants table.
295
379
  if (d.eventType === 'market_initialized' && isNormalMarketEvent(d) && d.trader) {
296
- db.lpPositions.ensureProvider(marketAddress, d.trader);
297
- db.lpPositions.recomputeFromEvents(marketAddress, d.trader);
380
+ lpProvidersToRecompute.add(d.trader);
381
+ }
382
+ }
383
+ // Insert events + discover traders + update cursor atomically
384
+ const lastDecoded = decoded[decoded.length - 1];
385
+ const inserted = db.events.insertBatch(inputs);
386
+ for (const trader of discoveredTraders) {
387
+ db.positions.ensureTrader(marketAddress, trader);
388
+ }
389
+ if (lpProvidersToRecompute.size > 0) {
390
+ const providers = Array.from(lpProvidersToRecompute);
391
+ for (const provider of providers) {
392
+ db.lpPositions.ensureProvider(marketAddress, provider);
298
393
  }
394
+ db.lpPositions.recomputeFromEventsBatch(marketAddress, providers);
299
395
  }
300
396
  // Update cursor before broadcasting (crash-safe: cursor persisted before clients notified)
301
397
  db.cursors.upsert(marketAddress, lastDecoded.blockNumber, lastDecoded.timestamp, inserted);
@@ -1 +1 @@
1
- {"version":3,"file":"event-indexer.js","sourceRoot":"","sources":["../../src/etl/event-indexer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"event-indexer.js","sourceRoot":"","sources":["../../src/etl/event-indexer.ts"],"names":[],"mappings":"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"}
@@ -2,16 +2,22 @@
2
2
  * LP position refresher — reads LP shares from chain and computes current value.
3
3
  */
4
4
  import { Effect } from 'effect';
5
+ import type { LPPositionRow } from '../db/repositories';
5
6
  import { ChainReaderTag } from '../services/ChainReader';
6
7
  import { DatabaseTag } from '../services/Database';
7
- import type { MarketType } from '../types';
8
+ import type { MarketStateRow, MarketType } from '../types';
8
9
  interface LPRefreshResult {
9
10
  readonly marketAddress: string;
10
11
  readonly provider: string;
11
12
  readonly success: boolean;
12
13
  readonly error?: string;
13
14
  }
14
- export declare const refreshLPPosition: (marketAddress: string, provider: string, marketType?: MarketType) => Effect.Effect<LPRefreshResult, never, DatabaseTag | ChainReaderTag>;
15
+ interface LPRefreshContext {
16
+ readonly marketStateByMarket?: ReadonlyMap<string, MarketStateRow>;
17
+ readonly netTraderPnlByMarket?: ReadonlyMap<string, number>;
18
+ readonly existingLPByKey?: ReadonlyMap<string, LPPositionRow>;
19
+ }
20
+ export declare const refreshLPPosition: (marketAddress: string, provider: string, marketType?: MarketType, context?: LPRefreshContext) => Effect.Effect<LPRefreshResult, never, DatabaseTag | ChainReaderTag>;
15
21
  /**
16
22
  * Discover bootstrapper LPs that were missed because market_initialized events
17
23
  * weren't treated as LP events in older indexer versions. For each market, check
@@ -1 +1 @@
1
- {"version":3,"file":"lp-position-refresher.d.ts","sourceRoot":"","sources":["../../src/etl/lp-position-refresher.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAI3C,UAAU,eAAe;IACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,iBAAiB,GAC5B,eAAe,MAAM,EACrB,UAAU,MAAM,EAChB,aAAY,UAAqB,KAChC,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,WAAW,GAAG,cAAc,CAuFjE,CAAC;AAEL;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,2CAuBlC,CAAC;AAEH,eAAO,MAAM,qBAAqB,uEAqBhC,CAAC"}
1
+ {"version":3,"file":"lp-position-refresher.d.ts","sourceRoot":"","sources":["../../src/etl/lp-position-refresher.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAmB,MAAM,UAAU,CAAC;AAM5E,UAAU,eAAe;IACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,gBAAgB;IACxB,QAAQ,CAAC,mBAAmB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACnE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5D,QAAQ,CAAC,eAAe,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAC/D;AAcD,eAAO,MAAM,iBAAiB,GAC5B,eAAe,MAAM,EACrB,UAAU,MAAM,EAChB,aAAY,UAAqB,EACjC,UAAS,gBAAqB,KAC7B,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,WAAW,GAAG,cAAc,CAuFjE,CAAC;AAEL;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,2CAmClC,CAAC;AAEH,eAAO,MAAM,qBAAqB,uEAqEhC,CAAC"}
@@ -5,7 +5,19 @@ import { Effect } from 'effect';
5
5
  import { ChainReaderTag } from '../services/ChainReader';
6
6
  import { DatabaseTag } from '../services/Database';
7
7
  const TWO_128 = Number(2n ** 128n);
8
- export const refreshLPPosition = (marketAddress, provider, marketType = 'normal') => Effect.gen(function* () {
8
+ const RPC_CONCURRENCY = 5;
9
+ let bootstrapDiscoveryCursor = 0;
10
+ function lpPositionCacheKey(marketAddress, provider) {
11
+ return `${marketAddress}\u0000${provider}`;
12
+ }
13
+ function computeNetTraderPnl(positions) {
14
+ let netTraderPnl = 0;
15
+ for (const position of positions) {
16
+ netTraderPnl += (position.unrealized_pnl ?? 0) + (position.realized_pnl ?? 0);
17
+ }
18
+ return netTraderPnl;
19
+ }
20
+ export const refreshLPPosition = (marketAddress, provider, marketType = 'normal', context = {}) => Effect.gen(function* () {
9
21
  const db = yield* DatabaseTag;
10
22
  const chain = yield* ChainReaderTag;
11
23
  if (marketType === 'multinoulli') {
@@ -19,7 +31,7 @@ export const refreshLPPosition = (marketAddress, provider, marketType = 'normal'
19
31
  }
20
32
  const { shares, sharesNumber } = sharesResult.right;
21
33
  // Get pool totals from market state
22
- const marketState = db.marketState.findByMarket(marketAddress);
34
+ const marketState = context.marketStateByMarket?.get(marketAddress) ?? db.marketState.findByMarket(marketAddress);
23
35
  let currentValue = null;
24
36
  let totalShares = 0;
25
37
  let totalBacking = 0;
@@ -31,21 +43,19 @@ export const refreshLPPosition = (marketAddress, provider, marketType = 'normal'
31
43
  // IMPORTANT: the contract drains LP backing by amplifier × position_value
32
44
  // for each trader claim. Without the amplifier, this estimate is too high
33
45
  // on markets with payoutAmplifier > 1.
34
- const traderPositions = db.positions.findByMarket(marketAddress);
35
46
  // Sum unrealized + realized PnL. For settled markets, unrealized=0
36
47
  // and realized has the finalized value. For active, unrealized is live.
37
48
  // NOTE: these PnL values ALREADY include the payout amplifier (the
38
49
  // position refresher passes payoutAmplifier to computePositionValueAtPoint).
39
50
  // Do NOT multiply by payoutAmplifier again — that double-counts it.
40
- const netTraderPnl = traderPositions.reduce((sum, p) => {
41
- const pnl = (p.unrealized_pnl ?? 0) + (p.realized_pnl ?? 0);
42
- return sum + pnl;
43
- }, 0);
51
+ const netTraderPnl = context.netTraderPnlByMarket?.get(marketAddress) ??
52
+ computeNetTraderPnl(db.positions.findByMarket(marketAddress));
44
53
  const adjustedBacking = totalBacking - netTraderPnl;
45
54
  currentValue = (sharesNumber / totalShares) * adjustedBacking;
46
55
  }
47
56
  }
48
- const existing = db.lpPositions.findOne(marketAddress, provider);
57
+ const existing = context.existingLPByKey?.get(lpPositionCacheKey(marketAddress, provider)) ??
58
+ db.lpPositions.findOne(marketAddress, provider);
49
59
  let netDeposited = (existing?.total_deposited ?? 0) - (existing?.total_withdrawn ?? 0);
50
60
  // If shares value at par (ignoring trader PnL) exceeds tracked deposits,
51
61
  // the gap is from the market initialization bootstrap which doesn't appear
@@ -66,8 +76,7 @@ export const refreshLPPosition = (marketAddress, provider, marketType = 'normal'
66
76
  unrealized_pnl: unrealizedPnl,
67
77
  });
68
78
  // Backfill entry distribution if not yet populated
69
- const lpRow = db.lpPositions.findOne(marketAddress, provider);
70
- if (lpRow && lpRow.entry_mean == null && marketState) {
79
+ if (existing && existing.entry_mean == null && marketState) {
71
80
  db.lpPositions.upsertEntryDistribution(marketAddress, provider, marketState.mean ?? null, marketState.sigma ?? null, marketState.k ?? null);
72
81
  }
73
82
  return { marketAddress, provider, success: true };
@@ -80,17 +89,26 @@ export const refreshLPPosition = (marketAddress, provider, marketType = 'normal'
80
89
  */
81
90
  export const discoverBootstrapperLPs = Effect.gen(function* () {
82
91
  const db = yield* DatabaseTag;
83
- // Find market_initialized events where the initializer has no LP position
92
+ // Scan only newly indexed market_initialized events since the previous pass.
84
93
  const rawDb = db.db;
85
94
  const missing = rawDb
86
- .query(`SELECT DISTINCT me.market_address, LOWER(me.trader) AS provider
95
+ .query(`SELECT DISTINCT me.id AS event_id, me.market_address, LOWER(me.trader) AS provider
87
96
  FROM market_events me
88
97
  LEFT JOIN lp_positions lp
89
98
  ON lp.market_address = me.market_address AND lp.provider = LOWER(me.trader)
90
- WHERE me.event_type = 'market_initialized'
99
+ WHERE me.id > ?
100
+ AND me.event_type = 'market_initialized'
91
101
  AND me.trader IS NOT NULL
92
102
  AND lp.provider IS NULL`)
93
- .all();
103
+ .all(bootstrapDiscoveryCursor);
104
+ const maxSeenRow = rawDb
105
+ .query(`SELECT MAX(id) AS max_id
106
+ FROM market_events
107
+ WHERE event_type = 'market_initialized'`)
108
+ .get();
109
+ if (maxSeenRow.max_id != null) {
110
+ bootstrapDiscoveryCursor = Math.max(bootstrapDiscoveryCursor, maxSeenRow.max_id);
111
+ }
94
112
  for (const row of missing) {
95
113
  db.lpPositions.ensureProvider(row.market_address, row.provider);
96
114
  db.lpPositions.recomputeFromEvents(row.market_address, row.provider);
@@ -102,15 +120,50 @@ export const refreshAllLPPositions = Effect.gen(function* () {
102
120
  // First, discover any bootstrapper LPs that were missed historically
103
121
  yield* discoverBootstrapperLPs;
104
122
  const allLP = db.lpPositions.findAll();
123
+ if (allLP.length === 0)
124
+ return [];
105
125
  const markets = db.markets.findAll(true);
106
- const marketTypeMap = new Map(markets.map((m) => [m.address, (m.market_type ?? 'normal')]));
107
- const activeLPs = allLP.filter((lp) => marketTypeMap.has(lp.market_address));
126
+ if (markets.length === 0)
127
+ return [];
128
+ const marketTypeMap = new Map();
129
+ for (const market of markets) {
130
+ marketTypeMap.set(market.address, (market.market_type ?? 'normal'));
131
+ }
132
+ const activeLPs = [];
133
+ for (const lp of allLP) {
134
+ if (marketTypeMap.has(lp.market_address)) {
135
+ activeLPs.push(lp);
136
+ }
137
+ }
108
138
  if (activeLPs.length === 0)
109
139
  return [];
110
- const effects = activeLPs.map((lp) => {
111
- const mt = marketTypeMap.get(lp.market_address) ?? 'normal';
112
- return refreshLPPosition(lp.market_address, lp.provider, mt);
113
- });
114
- return yield* Effect.all(effects, { concurrency: 5 });
140
+ const netTraderPnlByMarket = new Map();
141
+ for (const marketAddress of marketTypeMap.keys()) {
142
+ netTraderPnlByMarket.set(marketAddress, 0);
143
+ }
144
+ const activeMarketAddresses = Array.from(marketTypeMap.keys());
145
+ if (activeMarketAddresses.length > 0) {
146
+ const placeholders = activeMarketAddresses.map(() => '?').join(', ');
147
+ const pnlRows = db.db
148
+ .query(`SELECT market_address,
149
+ COALESCE(SUM(COALESCE(unrealized_pnl, 0) + COALESCE(realized_pnl, 0)), 0) AS net_pnl
150
+ FROM user_positions
151
+ WHERE market_address IN (${placeholders})
152
+ GROUP BY market_address`)
153
+ .all(...activeMarketAddresses);
154
+ for (const row of pnlRows) {
155
+ netTraderPnlByMarket.set(row.market_address, row.net_pnl);
156
+ }
157
+ }
158
+ const existingLPByKey = new Map();
159
+ for (const lp of activeLPs) {
160
+ existingLPByKey.set(lpPositionCacheKey(lp.market_address, lp.provider), lp);
161
+ }
162
+ const refreshContext = {
163
+ marketStateByMarket: db.marketState.findAllAsMap(),
164
+ netTraderPnlByMarket,
165
+ existingLPByKey,
166
+ };
167
+ return yield* Effect.forEach(activeLPs, (lp) => refreshLPPosition(lp.market_address, lp.provider, marketTypeMap.get(lp.market_address) ?? 'normal', refreshContext), { concurrency: RPC_CONCURRENCY });
115
168
  });
116
169
  //# sourceMappingURL=lp-position-refresher.js.map