@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.
- package/README.md +21 -0
- package/dist/__tests__/performance/perf-fixtures.d.ts +26 -0
- package/dist/__tests__/performance/perf-fixtures.d.ts.map +1 -0
- package/dist/__tests__/performance/perf-fixtures.js +172 -0
- package/dist/__tests__/performance/perf-fixtures.js.map +1 -0
- package/dist/__tests__/performance/perf-utils.d.ts +42 -0
- package/dist/__tests__/performance/perf-utils.d.ts.map +1 -0
- package/dist/__tests__/performance/perf-utils.js +91 -0
- package/dist/__tests__/performance/perf-utils.js.map +1 -0
- package/dist/api/app.d.ts +6 -6
- package/dist/api/routes/admin-subscriptions.d.ts +6 -6
- package/dist/api/routes/admin.d.ts.map +1 -1
- package/dist/api/routes/admin.js +4 -0
- package/dist/api/routes/admin.js.map +1 -1
- package/dist/api/routes/market-events.d.ts.map +1 -1
- package/dist/api/routes/market-events.js +8 -0
- package/dist/api/routes/market-events.js.map +1 -1
- package/dist/api/routes/markets.d.ts.map +1 -1
- package/dist/api/routes/markets.js +8 -0
- package/dist/api/routes/markets.js.map +1 -1
- package/dist/api/routes/trader-events.d.ts.map +1 -1
- package/dist/api/routes/trader-events.js +8 -0
- package/dist/api/routes/trader-events.js.map +1 -1
- package/dist/db/connection.d.ts.map +1 -1
- package/dist/db/connection.js +4 -0
- package/dist/db/connection.js.map +1 -1
- package/dist/db/repositories/activity-feed.d.ts +3 -0
- package/dist/db/repositories/activity-feed.d.ts.map +1 -1
- package/dist/db/repositories/activity-feed.js +33 -18
- package/dist/db/repositories/activity-feed.js.map +1 -1
- package/dist/db/repositories/event.d.ts +22 -0
- package/dist/db/repositories/event.d.ts.map +1 -1
- package/dist/db/repositories/event.js +139 -75
- package/dist/db/repositories/event.js.map +1 -1
- package/dist/db/repositories/lp-position.d.ts +2 -10
- package/dist/db/repositories/lp-position.d.ts.map +1 -1
- package/dist/db/repositories/lp-position.js +54 -52
- package/dist/db/repositories/lp-position.js.map +1 -1
- package/dist/db/repositories/market-state.d.ts +10 -0
- package/dist/db/repositories/market-state.d.ts.map +1 -1
- package/dist/db/repositories/market-state.js +16 -5
- package/dist/db/repositories/market-state.js.map +1 -1
- package/dist/db/repositories/market.d.ts +7 -0
- package/dist/db/repositories/market.d.ts.map +1 -1
- package/dist/db/repositories/market.js +32 -24
- package/dist/db/repositories/market.js.map +1 -1
- package/dist/db/repositories/multinoulli-snapshots.d.ts +1 -0
- package/dist/db/repositories/multinoulli-snapshots.d.ts.map +1 -1
- package/dist/db/repositories/multinoulli-snapshots.js +7 -5
- package/dist/db/repositories/multinoulli-snapshots.js.map +1 -1
- package/dist/db/repositories/position.d.ts +1 -0
- package/dist/db/repositories/position.d.ts.map +1 -1
- package/dist/db/repositories/position.js +9 -0
- package/dist/db/repositories/position.js.map +1 -1
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +114 -5
- package/dist/db/schema.js.map +1 -1
- package/dist/etl/decoder.js +16 -0
- package/dist/etl/decoder.js.map +1 -1
- package/dist/etl/event-indexer.d.ts +6 -2
- package/dist/etl/event-indexer.d.ts.map +1 -1
- package/dist/etl/event-indexer.js +175 -79
- package/dist/etl/event-indexer.js.map +1 -1
- package/dist/etl/lp-position-refresher.d.ts +8 -2
- package/dist/etl/lp-position-refresher.d.ts.map +1 -1
- package/dist/etl/lp-position-refresher.js +74 -21
- package/dist/etl/lp-position-refresher.js.map +1 -1
- package/dist/etl/position-refresher.d.ts +9 -3
- package/dist/etl/position-refresher.d.ts.map +1 -1
- package/dist/etl/position-refresher.js +44 -36
- package/dist/etl/position-refresher.js.map +1 -1
- package/dist/etl/state-refresher.d.ts +8 -3
- package/dist/etl/state-refresher.d.ts.map +1 -1
- package/dist/etl/state-refresher.js +154 -16
- package/dist/etl/state-refresher.js.map +1 -1
- package/dist/layers/ChainReaderLive.d.ts.map +1 -1
- package/dist/layers/ChainReaderLive.js +180 -26
- package/dist/layers/ChainReaderLive.js.map +1 -1
- package/dist/services/ChainReader.d.ts +34 -1
- package/dist/services/ChainReader.d.ts.map +1 -1
- package/dist/services/ChainReader.js.map +1 -1
- package/dist/services/VoyagerRateLimit.d.ts +13 -1
- package/dist/services/VoyagerRateLimit.d.ts.map +1 -1
- package/dist/services/VoyagerRateLimit.js +20 -3
- package/dist/services/VoyagerRateLimit.js.map +1 -1
- package/dist/types/api.d.ts +28 -0
- package/dist/types/api.d.ts.map +1 -1
- package/dist/types/event.d.ts +24 -0
- package/dist/types/event.d.ts.map +1 -1
- package/dist/types/market.d.ts +16 -0
- package/dist/types/market.d.ts.map +1 -1
- 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
|
-
//
|
|
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
|
-
|
|
168
|
-
|
|
217
|
+
const isRateLimited = err.status === 429 || err.status === 503;
|
|
218
|
+
if (!isRateLimited) {
|
|
219
|
+
break;
|
|
169
220
|
}
|
|
170
|
-
|
|
171
|
-
|
|
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
|
|
179
|
-
const
|
|
180
|
-
|
|
181
|
-
|
|
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
|
-
|
|
185
|
-
|
|
186
|
-
|
|
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
|
-
|
|
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()
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
232
|
-
|
|
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:
|
|
309
|
+
return { marketAddress, newEvents: 0, lastBlock: maxProcessedBlock };
|
|
237
310
|
}
|
|
238
|
-
|
|
239
|
-
const
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
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
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
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
|
-
|
|
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
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
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
|
-
|
|
370
|
+
discoveredTraders.add(trader);
|
|
285
371
|
}
|
|
286
|
-
// LP provider discovery — recompute totals from events (idempotent)
|
|
287
372
|
if (isLPEvent(d)) {
|
|
288
|
-
|
|
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
|
-
|
|
297
|
-
|
|
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":"AAAA;;;;;GAKG;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,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAY7D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGzC,MAAM,SAAS,GAAG,GAAG,CAAC;AACtB,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,cAAc;IACd,YAAY;IACZ,eAAe;IACf,mBAAmB;IACnB,eAAe;IACf,oBAAoB;IACpB,gBAAgB;IAChB,kBAAkB;IAClB,iBAAiB;CAClB,CAAC,CAAC;AAEH,SAAS,uBAAuB,CAAC,CAAe;IAC9C,OAAO,CAAC,CAAC,SAAS,KAAK,4BAA4B,CAAC;AACtD,CAAC;AAED,SAAS,oBAAoB,CAAC,CAAe;IAC3C,OAAO,CAAC,CAAC,SAAS,KAAK,gBAAgB,CAAC;AAC1C,CAAC;AAED,SAAS,yBAAyB,CAAC,CAAe;IAChD,OAAO,CAAC,CAAC,SAAS,KAAK,sBAAsB,CAAC;AAChD,CAAC;AAED,SAAS,mBAAmB,CAAC,CAAe;IAC1C,OAAO,CACL,CAAC,CAAC,SAAS,KAAK,cAAc;QAC9B,CAAC,CAAC,SAAS,KAAK,aAAa;QAC7B,CAAC,CAAC,SAAS,KAAK,oBAAoB;QACpC,CAAC,CAAC,SAAS,KAAK,gBAAgB,CACjC,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,CAAe;IAChC,OAAO,CAAC,CAAC,SAAS,KAAK,iBAAiB,IAAI,CAAC,CAAC,SAAS,KAAK,mBAAmB,CAAC;AAClF,CAAC;AAED,SAAS,oBAAoB,CAAC,aAAqB,EAAE,CAAe;IAClE,IAAI,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,OAAO;YACL,cAAc,EAAE,aAAa;YAC7B,SAAS,EAAE,CAAC,CAAC,QAAQ;YACrB,OAAO,EAAE,CAAC,CAAC,MAAM;YACjB,YAAY,EAAE,CAAC,CAAC,WAAW;YAC3B,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,UAAU,EAAE,CAAC,CAAC,SAAS;YACvB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,IAAI,EAAE,CAAC;YACP,OAAO,EAAE,CAAC;YACV,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,CAAC;YACd,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,IAAI;YACnB,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,IAAI;YACnB,GAAG,EAAE,IAAI;YACT,OAAO,EAAE,IAAI;YACb,iBAAiB,EAAE,CAAC,CAAC,WAAW;YAChC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;YACnC,aAAa,EAAE,CAAC,CAAC,YAAY;YAC7B,iBAAiB,EAAE,CAAC,CAAC,eAAe;YACpC,gBAAgB,EAAE,CAAC,CAAC,cAAc;YAClC,gBAAgB,EAAE,IAAI;YACtB,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,IAAI;SACpB,CAAC;IACJ,CAAC;IAED,IAAI,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,cAAc,EAAE,aAAa;YAC7B,SAAS,EAAE,CAAC,CAAC,QAAQ;YACrB,OAAO,EAAE,CAAC,CAAC,MAAM;YACjB,YAAY,EAAE,CAAC,CAAC,WAAW;YAC3B,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,UAAU,EAAE,CAAC,CAAC,SAAS;YACvB,MAAM,EAAE,CAAC,CAAC,EAAE;YACZ,IAAI,EAAE,CAAC;YACP,OAAO,EAAE,CAAC;YACV,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,CAAC;YACd,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,IAAI;YACnB,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,IAAI;YACnB,GAAG,EAAE,IAAI;YACT,OAAO,EAAE,IAAI;YACb,iBAAiB,EAAE,IAAI;YACvB,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;YACnC,wBAAwB,EAAE,CAAC,CAAC,sBAAsB;YAClD,gBAAgB,EAAE,CAAC,CAAC,eAAe,IAAI,IAAI;YAC3C,aAAa,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI;YACrC,aAAa,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI;SACtC,CAAC;IACJ,CAAC;IAED,IAAI,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,OAAO;YACL,cAAc,EAAE,aAAa;YAC7B,SAAS,EAAE,CAAC,CAAC,QAAQ;YACrB,OAAO,EAAE,CAAC,CAAC,MAAM;YACjB,YAAY,EAAE,CAAC,CAAC,WAAW;YAC3B,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,UAAU,EAAE,CAAC,CAAC,SAAS;YACvB,MAAM,EAAE,CAAC,CAAC,EAAE;YACZ,IAAI,EAAE,CAAC;YACP,OAAO,EAAE,CAAC;YACV,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,CAAC;YACd,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,IAAI;YACnB,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,IAAI;YACnB,GAAG,EAAE,IAAI;YACT,OAAO,EAAE,IAAI;YACb,iBAAiB,EAAE,IAAI;YACvB,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;YACnC,wBAAwB,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;YACpD,gBAAgB,EAAE,IAAI;YACtB,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,IAAI;SACpB,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACjB,OAAO;YACL,cAAc,EAAE,aAAa;YAC7B,SAAS,EAAE,CAAC,CAAC,QAAQ;YACrB,OAAO,EAAE,CAAC,CAAC,MAAM;YACjB,YAAY,EAAE,CAAC,CAAC,WAAW;YAC3B,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,UAAU,EAAE,CAAC,CAAC,SAAS;YACvB,MAAM,EAAE,CAAC,CAAC,QAAQ;YAClB,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC;YACnD,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI;YACjC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI;YACvE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI;YAC/D,iBAAiB,EAAE,CAAC,CAAC,WAAW;YAChC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;YACnC,gBAAgB,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI;SACjE,CAAC;IACJ,CAAC;IAED,4CAA4C;IAC5C,MAAM,CAAC,GAAG,CAAuB,CAAC;IAClC,OAAO;QACL,cAAc,EAAE,aAAa;QAC7B,SAAS,EAAE,CAAC,CAAC,QAAQ;QACrB,OAAO,EAAE,CAAC,CAAC,MAAM;QACjB,YAAY,EAAE,CAAC,CAAC,WAAW;QAC3B,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,UAAU,EAAE,CAAC,CAAC,SAAS;QACvB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,OAAO,EAAE,CAAC,CAAC,MAAM;QACjB,WAAW,EAAE,CAAC,CAAC,UAAU;QACzB,WAAW,EAAE,CAAC,CAAC,UAAU;QACzB,QAAQ,EAAE,CAAC,CAAC,OAAO;QACnB,WAAW,EAAE,CAAC,CAAC,SAAS;QACxB,MAAM,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI;QACvB,SAAS,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI;QAC5B,aAAa,EAAE,CAAC,CAAC,WAAW,IAAI,IAAI;QACpC,aAAa,EAAE,CAAC,CAAC,WAAW,IAAI,IAAI;QACpC,UAAU,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI;QAC9B,aAAa,EAAE,CAAC,CAAC,UAAU,IAAI,IAAI;QACnC,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,IAAI;QAClB,OAAO,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI;QACzB,iBAAiB,EAAE,CAAC,CAAC,gBAAgB;QACrC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;QACnC,gBAAgB,EAAE,IAAI;QACtB,aAAa,EAAE,IAAI;QACnB,aAAa,EAAE,IAAI;KACpB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,aAAqB,EACrB,aAAyB,QAAQ,EACwE,EAAE;AAC3G,sHAAsH;AACtH,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC;IAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,gBAAgB,CAAC;IACxC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;IACpC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC;IAE/B,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,MAAM,EAAE,iBAAiB,IAAI,CAAC,CAAC;IAEjD,qEAAqE;IACrE,uEAAuE;IACvE,oEAAoE;IACpE,+CAA+C;IAC/C,MAAM,SAAS,GAAmB,EAAE,CAAC;IACrC,IAAI,iBAAiB,GAAG,SAAS,CAAC;IAClC,IAAI,qBAAqB,GAAG,MAAM,EAAE,cAAc,IAAI,CAAC,CAAC;IACxD,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,OAAO,OAAO,IAAI,WAAW,IAAI,SAAS,EAAE,CAAC;QAC3C,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CACtC,OAAO,CAAC,WAAW,CAAC,aAAa,EAAE,WAAW,EAAE,SAAS,CAAC,CAC3D,CAAC;QAEF,gEAAgE;QAChE,kEAAkE;QAClE,kEAAkE;QAClE,wCAAwC;QACxC,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC;YAC7B,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC;YAC/D,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM;YACR,CAAC;YAED,eAAe,GAAG,IAAI,CAAC;YACvB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CACpC,KAAK,CAAC,qBAAqB,CAAC,aAAa,EAAE,SAAS,GAAG,CAAC,EAAE,uBAAuB,CAAC,CACnF,CAAC;YACF,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC9B,6DAA6D;gBAC7D,MAAM;YACR,CAAC;YAED,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBACzC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACpC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,SAAS;gBACxC,IAAI,GAAG,CAAC,WAAW,IAAI,SAAS;oBAAE,SAAS;gBAC3C,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpB,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;gBACjE,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;YACzE,CAAC;YACD,mEAAmE;YACnE,gEAAgE;YAChE,6BAA6B;YAC7B,MAAM;QACR,CAAC;QAED,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;QAEhC,+DAA+D;QAC/D,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YACxC,IAAI,GAAG,CAAC,WAAW,IAAI,SAAS,EAAE,CAAC;gBACjC,WAAW,GAAG,IAAI,CAAC;gBACnB,SAAS;YACX,CAAC;YAED,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpB,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;YACjE,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QACzE,CAAC;QAED,sEAAsE;QACtE,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM;QACR,CAAC;QAED,OAAO,GAAG,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC;QACvC,WAAW,EAAE,CAAC;IAChB,CAAC;IACD,KAAK,eAAe,CAAC,CAAC,gCAAgC;IAEtD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,cAAc,GAAmB,EAAE,CAAC;IAE1C,kFAAkF;IAClF,iFAAiF;IACjF,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,iBAAiB,EAAE,CAAC;YACjD,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YAClD,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,oDAAoD;YACpD,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YAClE,IAAI,UAAU,IAAI,UAAU,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;gBAChD,8DAA8D;gBAC9D,IAAI,WAAW,GAAG,CAAC,CAAC;gBACpB,IAAI,CAAC;oBACH,+BAA+B;oBAC/B,sEAAsE;oBACtE,8CAA8C;oBAC9C,0CAA0C;oBAC1C,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;wBAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAE,CAAC,CAAC;wBAClC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAE,CAAC,CAAC;wBACnC,WAAW,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;oBACpD,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,mCAAmC;gBACrC,CAAC;gBACD,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,aAAa,EAAE,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YACjF,CAAC;YACD,SAAS;QACX,CAAC;QAED,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,sDAAsD;IACtD,MAAM,OAAO,GAAG,YAAY,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IACzD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,+EAA+E;QAC/E,iEAAiE;QACjE,IAAI,iBAAiB,GAAG,SAAS,EAAE,CAAC;YAClC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,CAAC,CAAC,CAAC;QAChF,CAAC;QACD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;IACvE,CAAC;IAED,MAAM,MAAM,GAAuB,EAAE,CAAC;IACtC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5C,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAU,CAAC;IACjD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,oBAAoB,GAAG,KAAK,CAAC;IAEjC,2DAA2D;IAC3D,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,KAAK,GAAG,oBAAoB,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QAEnD,qFAAqF;QACrF,+DAA+D;QAC/D,IACE,CAAC,KAAK,CAAC,UAAU,KAAK,gBAAgB,IAAI,KAAK,CAAC,UAAU,KAAK,sBAAsB,CAAC;YACtF,KAAK,CAAC,IAAI,KAAK,CAAC;YAChB,KAAK,CAAC,OAAO,KAAK,CAAC,EACnB,CAAC;YACD,IAAI,QAAQ,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC/D,oBAAoB,GAAG,IAAI,CAAC;gBAC5B,MAAM,aAAa,GAAG,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;gBACjE,IAAI,aAAa,EAAE,IAAI,IAAI,IAAI,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;oBAC5D,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC;oBAC9B,SAAS,GAAG,aAAa,CAAC,KAAK,IAAI,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;YAED,IAAI,QAAQ,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBACtC,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;YAC3D,CAAC;YAED,IAAI,SAAS,IAAI,IAAI,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;gBAC5C,KAAK,GAAG;oBACN,GAAG,KAAK;oBACR,MAAM,EAAE,SAAS;oBACjB,SAAS,EAAE,UAAU;oBACrB,aAAa,EAAE,MAAM,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBAC1D,aAAa,EAAE,MAAM,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBAC1D,GAAG,EAAE,OAAO;iBACb,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEnB,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;YAC5C,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC;YACtB,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC;QAC5B,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;YACpD,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;YACzB,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC;QAC/B,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;YACtB,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC;QACtB,CAAC;QAED,IAAI,MAAM,GAAkB,IAAI,CAAC;QACjC,IAAI,uBAAuB,CAAC,CAAC,CAAC,IAAI,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;QACpB,CAAC;aAAM,IAAI,oBAAoB,CAAC,CAAC,CAAC,IAAI,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QAChB,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;YACjB,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;QACD,2EAA2E;QAC3E,wEAAwE;QACxE,yEAAyE;QACzE,iDAAiD;QACjD,IAAI,CAAC,CAAC,SAAS,KAAK,oBAAoB,IAAI,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YAC/E,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,8DAA8D;IAC9D,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IACjD,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAE/C,KAAK,MAAM,MAAM,IAAI,iBAAiB,EAAE,CAAC;QACvC,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,sBAAsB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACrD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QACzD,CAAC;QACD,EAAE,CAAC,WAAW,CAAC,wBAAwB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IACpE,CAAC;IAED,2FAA2F;IAC3F,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,WAAW,EAAE,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAE3F,0CAA0C;IAC1C,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,GAAG,CAAC,SAAS,CAAC;YACZ,IAAI,EAAE,YAAY;YAClB,aAAa;YACb,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC,WAAW,EAAE;SAChE,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,aAAa;QACb,SAAS,EAAE,QAAQ;QACnB,SAAS,EAAE,WAAW,CAAC,WAAW;KACnC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACjD,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC;IAC9B,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,OAAO,GAAyB,EAAE,CAAC;IAEzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAe,CAAC;QAClE,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC,CAAC"}
|
|
@@ -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
|
-
|
|
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,
|
|
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
|
-
|
|
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 =
|
|
41
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
//
|
|
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.
|
|
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
|
-
|
|
107
|
-
|
|
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
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
|
|
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
|