@the-situation/indexer 0.11.2 → 0.11.4
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/dist/api/app.d.ts +150 -0
- package/dist/api/app.d.ts.map +1 -1
- package/dist/api/app.js +3 -1
- package/dist/api/app.js.map +1 -1
- package/dist/api/routes/activity-feed.d.ts +54 -0
- package/dist/api/routes/activity-feed.d.ts.map +1 -0
- package/dist/api/routes/activity-feed.js +66 -0
- package/dist/api/routes/activity-feed.js.map +1 -0
- package/dist/api/routes/admin-subscriptions.d.ts +176 -0
- package/dist/api/routes/admin-subscriptions.d.ts.map +1 -0
- package/dist/api/routes/admin-subscriptions.js +69 -0
- package/dist/api/routes/admin-subscriptions.js.map +1 -0
- package/dist/api/routes/index.d.ts +2 -0
- package/dist/api/routes/index.d.ts.map +1 -1
- package/dist/api/routes/index.js +2 -0
- package/dist/api/routes/index.js.map +1 -1
- package/dist/client/IndexerClient.d.ts +8 -0
- package/dist/client/IndexerClient.d.ts.map +1 -1
- package/dist/client/IndexerClient.js.map +1 -1
- package/dist/client/IndexerClientLive.d.ts.map +1 -1
- package/dist/client/IndexerClientLive.js +28 -0
- package/dist/client/IndexerClientLive.js.map +1 -1
- package/dist/client/convenience.d.ts +2 -0
- package/dist/client/convenience.d.ts.map +1 -1
- package/dist/client/convenience.js +1 -0
- package/dist/client/convenience.js.map +1 -1
- package/dist/client/index.d.ts +2 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/db/repositories/activity-feed.d.ts +24 -0
- package/dist/db/repositories/activity-feed.d.ts.map +1 -0
- package/dist/db/repositories/activity-feed.js +76 -0
- package/dist/db/repositories/activity-feed.js.map +1 -0
- package/dist/db/repositories/index.d.ts +2 -0
- package/dist/db/repositories/index.d.ts.map +1 -1
- package/dist/db/repositories/index.js +2 -0
- package/dist/db/repositories/index.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 +10 -4
- package/dist/db/repositories/position.js.map +1 -1
- package/dist/db/repositories/ranking.d.ts.map +1 -1
- package/dist/db/repositories/ranking.js +18 -10
- package/dist/db/repositories/ranking.js.map +1 -1
- package/dist/db/repositories/subscription.d.ts +18 -0
- package/dist/db/repositories/subscription.d.ts.map +1 -0
- package/dist/db/repositories/subscription.js +73 -0
- package/dist/db/repositories/subscription.js.map +1 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +17 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/etl/event-indexer.d.ts +1 -1
- package/dist/etl/position-refresher.d.ts +1 -1
- package/dist/etl/position-refresher.d.ts.map +1 -1
- package/dist/etl/position-refresher.js +62 -20
- package/dist/etl/position-refresher.js.map +1 -1
- package/dist/etl/scheduler.d.ts.map +1 -1
- package/dist/etl/scheduler.js +79 -14
- package/dist/etl/scheduler.js.map +1 -1
- package/dist/etl/state-refresher.d.ts +1 -1
- package/dist/index.js +13 -1
- package/dist/index.js.map +1 -1
- package/dist/layers/ChainReaderLive.d.ts.map +1 -1
- package/dist/layers/ChainReaderLive.js +45 -33
- package/dist/layers/ChainReaderLive.js.map +1 -1
- package/dist/layers/DatabaseLive.d.ts.map +1 -1
- package/dist/layers/DatabaseLive.js +3 -1
- package/dist/layers/DatabaseLive.js.map +1 -1
- package/dist/logger.d.ts +13 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +29 -0
- package/dist/logger.js.map +1 -0
- package/dist/services/ActivityEnricher.d.ts +29 -0
- package/dist/services/ActivityEnricher.d.ts.map +1 -0
- package/dist/services/ActivityEnricher.js +90 -0
- package/dist/services/ActivityEnricher.js.map +1 -0
- package/dist/services/Database.d.ts +3 -1
- package/dist/services/Database.d.ts.map +1 -1
- package/dist/services/Database.js.map +1 -1
- package/dist/services/WebhookDispatcher.d.ts +14 -0
- package/dist/services/WebhookDispatcher.d.ts.map +1 -0
- package/dist/services/WebhookDispatcher.js +122 -0
- package/dist/services/WebhookDispatcher.js.map +1 -0
- package/dist/types/activity.d.ts +89 -0
- package/dist/types/activity.d.ts.map +1 -0
- package/dist/types/activity.js +28 -0
- package/dist/types/activity.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/position.d.ts +2 -0
- package/dist/types/position.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/db/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,GAAG
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,5 +8,5 @@ import { VoyagerClientTag } from '../services/VoyagerClient';
|
|
|
8
8
|
import type { MarketType } from '../types';
|
|
9
9
|
import type { IndexerCycleResult } from './types';
|
|
10
10
|
export declare const indexMarketEvents: (marketAddress: string, marketType?: MarketType) => Effect.Effect<IndexerCycleResult, never, DatabaseTag | VoyagerClientTag | EventBusTag>;
|
|
11
|
-
export declare const indexAllMarkets: Effect.Effect<IndexerCycleResult[], never, DatabaseTag |
|
|
11
|
+
export declare const indexAllMarkets: Effect.Effect<IndexerCycleResult[], never, DatabaseTag | VoyagerClientTag | EventBusTag>;
|
|
12
12
|
//# sourceMappingURL=event-indexer.d.ts.map
|
|
@@ -8,5 +8,5 @@ import { EventBusTag } from '../services/EventBus';
|
|
|
8
8
|
import type { MarketType } from '../types';
|
|
9
9
|
import type { PositionRefreshResult } from './types';
|
|
10
10
|
export declare const refreshPosition: (marketAddress: string, trader: string, marketType?: MarketType) => Effect.Effect<PositionRefreshResult, never, DatabaseTag | ChainReaderTag | EventBusTag>;
|
|
11
|
-
export declare const refreshAllPositions: Effect.Effect<PositionRefreshResult[], never,
|
|
11
|
+
export declare const refreshAllPositions: Effect.Effect<PositionRefreshResult[], never, DatabaseTag | EventBusTag | ChainReaderTag>;
|
|
12
12
|
//# sourceMappingURL=position-refresher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"position-refresher.d.ts","sourceRoot":"","sources":["../../src/etl/position-refresher.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"position-refresher.d.ts","sourceRoot":"","sources":["../../src/etl/position-refresher.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAMhC,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,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAwBrD,eAAO,MAAM,eAAe,GAC1B,eAAe,MAAM,EACrB,QAAQ,MAAM,EACd,aAAY,UAAqB,KAChC,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,KAAK,EAAE,WAAW,GAAG,cAAc,GAAG,WAAW,CAqMrF,CAAC;AAIL,eAAO,MAAM,mBAAmB,2FA2B9B,CAAC"}
|
|
@@ -2,10 +2,30 @@
|
|
|
2
2
|
* Position refresher — reads trader positions from chain and computes expected value.
|
|
3
3
|
*/
|
|
4
4
|
import { Effect } from 'effect';
|
|
5
|
-
import { computeMultinoulliPositionEV, computePositionEV } from '@the-situation/sdk';
|
|
5
|
+
import { computeMultinoulliPositionEV, computePositionEV, } from '@the-situation/sdk/valuation';
|
|
6
|
+
import { log } from '../logger';
|
|
6
7
|
import { ChainReaderTag } from '../services/ChainReader';
|
|
7
8
|
import { DatabaseTag } from '../services/Database';
|
|
8
9
|
import { EventBusTag } from '../services/EventBus';
|
|
10
|
+
/**
|
|
11
|
+
* Determine whether a position is "closed" — i.e. the market is settled
|
|
12
|
+
* and/or the position has been claimed or flattened.
|
|
13
|
+
*
|
|
14
|
+
* We check the MARKET state (not just the position flags) because the
|
|
15
|
+
* chain's tracksSettlementClaim flag is true for any active position that
|
|
16
|
+
* would receive a payout, which the ChainReader maps to 'pending_claim'.
|
|
17
|
+
*/
|
|
18
|
+
function isPositionClosed(positionState, claimed, marketIsSettled) {
|
|
19
|
+
if (claimed)
|
|
20
|
+
return true;
|
|
21
|
+
if (positionState === 'flat')
|
|
22
|
+
return true;
|
|
23
|
+
// Only treat pending_claim/early_settled as closed if the market itself is settled
|
|
24
|
+
if (marketIsSettled && (positionState === 'pending_claim' || positionState === 'early_settled')) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
9
29
|
export const refreshPosition = (marketAddress, trader, marketType = 'normal') => Effect.gen(function* () {
|
|
10
30
|
const db = yield* DatabaseTag;
|
|
11
31
|
const chain = yield* ChainReaderTag;
|
|
@@ -24,27 +44,32 @@ export const refreshPosition = (marketAddress, trader, marketType = 'normal') =>
|
|
|
24
44
|
// Compute expected value for multinoulli positions
|
|
25
45
|
let expectedValue = null;
|
|
26
46
|
let unrealizedPnl = null;
|
|
27
|
-
|
|
47
|
+
let realizedPnl = null;
|
|
48
|
+
const mState = db.multinoulliMarketState.findByMarket(marketAddress);
|
|
49
|
+
const marketIsSettled = mState?.is_settled === 1;
|
|
50
|
+
const isClosed = isPositionClosed(pos.settlementState, pos.claimed, marketIsSettled);
|
|
28
51
|
if (isClosed) {
|
|
29
52
|
expectedValue = 0;
|
|
30
53
|
unrealizedPnl = 0;
|
|
54
|
+
// Capture realized PnL: snapshot the last known unrealized_pnl before it zeroes out
|
|
55
|
+
const prev = db.positions.findOne(marketAddress, trader);
|
|
56
|
+
if (prev && prev.realized_pnl == null && prev.unrealized_pnl != null) {
|
|
57
|
+
realizedPnl = prev.unrealized_pnl;
|
|
58
|
+
}
|
|
31
59
|
}
|
|
32
|
-
else if (pos.exists && pos.effectiveProbs.length > 0) {
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
expectedValue = ev;
|
|
46
|
-
unrealizedPnl = ev - collateral;
|
|
47
|
-
}
|
|
60
|
+
else if (pos.exists && pos.effectiveProbs.length > 0 && mState && mState.k != null) {
|
|
61
|
+
const marketProbs = JSON.parse(mState.probs_json);
|
|
62
|
+
const collateral = pos.collateralLockedNumber;
|
|
63
|
+
const k = mState.effective_k ?? mState.k;
|
|
64
|
+
const ev = computeMultinoulliPositionEV({
|
|
65
|
+
effectiveProbs: pos.effectiveProbs,
|
|
66
|
+
originalProbs: pos.originalProbs,
|
|
67
|
+
collateralLocked: collateral,
|
|
68
|
+
k,
|
|
69
|
+
}, marketProbs);
|
|
70
|
+
if (Number.isFinite(ev)) {
|
|
71
|
+
expectedValue = ev;
|
|
72
|
+
unrealizedPnl = ev - collateral;
|
|
48
73
|
}
|
|
49
74
|
}
|
|
50
75
|
db.positions.upsert({
|
|
@@ -61,6 +86,7 @@ export const refreshPosition = (marketAddress, trader, marketType = 'normal') =>
|
|
|
61
86
|
effective_probs_json: pos.effectiveProbs.length > 0 ? JSON.stringify(pos.effectiveProbs) : null,
|
|
62
87
|
expected_value: expectedValue,
|
|
63
88
|
unrealized_pnl: unrealizedPnl,
|
|
89
|
+
realized_pnl: realizedPnl,
|
|
64
90
|
});
|
|
65
91
|
bus.broadcast({
|
|
66
92
|
type: 'position_update',
|
|
@@ -83,17 +109,24 @@ export const refreshPosition = (marketAddress, trader, marketType = 'normal') =>
|
|
|
83
109
|
// Compute expected value using SDK's Gaussian product integral formula
|
|
84
110
|
let expectedValue = null;
|
|
85
111
|
let unrealizedPnl = null;
|
|
86
|
-
|
|
112
|
+
let realizedPnl = null;
|
|
113
|
+
const marketState = db.marketState.findByMarket(marketAddress);
|
|
114
|
+
const marketIsSettled = marketState?.is_settled === 1;
|
|
115
|
+
const isClosed = isPositionClosed(pos.settlementState, pos.claimed, marketIsSettled);
|
|
87
116
|
if (isClosed) {
|
|
88
117
|
expectedValue = 0;
|
|
89
118
|
unrealizedPnl = 0;
|
|
119
|
+
// Capture realized PnL: snapshot the last known unrealized_pnl before it zeroes out
|
|
120
|
+
const prev = db.positions.findOne(marketAddress, trader);
|
|
121
|
+
if (prev && prev.realized_pnl == null && prev.unrealized_pnl != null) {
|
|
122
|
+
realizedPnl = prev.unrealized_pnl;
|
|
123
|
+
}
|
|
90
124
|
}
|
|
91
125
|
else if (pos.hasPosition &&
|
|
92
126
|
pos.effectiveMean != null &&
|
|
93
127
|
pos.effectiveSigma != null &&
|
|
94
128
|
pos.mean != null &&
|
|
95
129
|
pos.sigma != null) {
|
|
96
|
-
const marketState = db.marketState.findByMarket(marketAddress);
|
|
97
130
|
if (marketState?.mean != null && marketState?.sigma != null && marketState.k != null) {
|
|
98
131
|
const collateral = pos.collateralLockedNumber;
|
|
99
132
|
const k = marketState.effective_k ?? marketState.k;
|
|
@@ -120,6 +153,14 @@ export const refreshPosition = (marketAddress, trader, marketType = 'normal') =>
|
|
|
120
153
|
unrealizedPnl = ev - collateral;
|
|
121
154
|
}
|
|
122
155
|
}
|
|
156
|
+
else {
|
|
157
|
+
log.warn('position EV skipped: missing market state', {
|
|
158
|
+
market: marketAddress.slice(0, 16),
|
|
159
|
+
trader: trader.slice(0, 16),
|
|
160
|
+
hasMarketMean: marketState?.mean != null,
|
|
161
|
+
hasMarketK: marketState?.k != null,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
123
164
|
}
|
|
124
165
|
db.positions.upsert({
|
|
125
166
|
market_address: marketAddress,
|
|
@@ -138,6 +179,7 @@ export const refreshPosition = (marketAddress, trader, marketType = 'normal') =>
|
|
|
138
179
|
position_type: marketType,
|
|
139
180
|
expected_value: expectedValue,
|
|
140
181
|
unrealized_pnl: unrealizedPnl,
|
|
182
|
+
realized_pnl: realizedPnl,
|
|
141
183
|
});
|
|
142
184
|
bus.broadcast({
|
|
143
185
|
type: 'position_update',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"position-refresher.js","sourceRoot":"","sources":["../../src/etl/position-refresher.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,
|
|
1
|
+
{"version":3,"file":"position-refresher.js","sourceRoot":"","sources":["../../src/etl/position-refresher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/etl/scheduler.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/etl/scheduler.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EAAE,KAAK,kBAAkB,EAAkB,MAAM,yBAAyB,CAAC;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,OAAO,EAAE,KAAK,eAAe,EAAe,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,KAAK,oBAAoB,EAAoB,MAAM,2BAA2B,CAAC;AAKxF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;CAC3B;AAiCD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE;IACR,QAAQ,EAAE,eAAe,CAAC;IAC1B,aAAa,EAAE,oBAAoB,CAAC;IACpC,WAAW,EAAE,kBAAkB,CAAC;IAChC,QAAQ,EAAE,eAAe,CAAC;CAC3B,GACA,gBAAgB,CA2HlB"}
|
package/dist/etl/scheduler.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* the previous one finishes, preventing concurrent retry storms.
|
|
6
6
|
*/
|
|
7
7
|
import { Effect, Layer } from 'effect';
|
|
8
|
+
import { log } from '../logger';
|
|
8
9
|
import { ChainReaderTag } from '../services/ChainReader';
|
|
9
10
|
import { DatabaseTag } from '../services/Database';
|
|
10
11
|
import { EventBusTag } from '../services/EventBus';
|
|
@@ -47,42 +48,106 @@ export function startScheduler(config, services) {
|
|
|
47
48
|
const results = await run(indexAllMarkets);
|
|
48
49
|
const total = results.reduce((sum, r) => sum + r.newEvents, 0);
|
|
49
50
|
if (total > 0) {
|
|
50
|
-
|
|
51
|
+
log.info('event-indexer cycle', { newEvents: total, markets: results.length });
|
|
51
52
|
}
|
|
52
53
|
}
|
|
53
|
-
catch (
|
|
54
|
-
|
|
54
|
+
catch (err) {
|
|
55
|
+
log.error('event-indexer cycle failed', {
|
|
56
|
+
error: err instanceof Error ? err.message : String(err),
|
|
57
|
+
});
|
|
55
58
|
}
|
|
56
59
|
}, config.eventPollIntervalMs);
|
|
57
60
|
const cancelState = startNonOverlappingLoop(async () => {
|
|
58
61
|
try {
|
|
59
|
-
await run(refreshAllMarketStates);
|
|
62
|
+
const results = await run(refreshAllMarketStates);
|
|
63
|
+
const ok = results.filter((r) => r.success).length;
|
|
64
|
+
const failed = results.filter((r) => !r.success);
|
|
65
|
+
if (failed.length > 0) {
|
|
66
|
+
log.warn('state-refresh partial failure', {
|
|
67
|
+
ok,
|
|
68
|
+
failed: failed.length,
|
|
69
|
+
errors: failed.slice(0, 5).map((r) => ({
|
|
70
|
+
market: r.marketAddress.slice(0, 12),
|
|
71
|
+
error: r.error,
|
|
72
|
+
})),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
else if (ok > 0) {
|
|
76
|
+
log.info('state-refresh cycle', { ok, total: results.length });
|
|
77
|
+
}
|
|
60
78
|
}
|
|
61
|
-
catch (
|
|
62
|
-
|
|
79
|
+
catch (err) {
|
|
80
|
+
log.error('state-refresh cycle failed', {
|
|
81
|
+
error: err instanceof Error ? err.message : String(err),
|
|
82
|
+
});
|
|
63
83
|
}
|
|
64
84
|
}, config.statePollIntervalMs);
|
|
65
85
|
const cancelPositions = startNonOverlappingLoop(async () => {
|
|
66
86
|
try {
|
|
67
|
-
await run(refreshAllPositions);
|
|
87
|
+
const results = await run(refreshAllPositions);
|
|
88
|
+
const ok = results.filter((r) => r.success).length;
|
|
89
|
+
const failed = results.filter((r) => !r.success);
|
|
90
|
+
if (failed.length > 0) {
|
|
91
|
+
log.warn('position-refresh partial failure', {
|
|
92
|
+
ok,
|
|
93
|
+
failed: failed.length,
|
|
94
|
+
errors: failed.slice(0, 5).map((r) => ({
|
|
95
|
+
market: r.marketAddress.slice(0, 12),
|
|
96
|
+
trader: r.trader.slice(0, 12),
|
|
97
|
+
error: r.error,
|
|
98
|
+
})),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
else if (ok > 0) {
|
|
102
|
+
log.info('position-refresh cycle', { ok, total: results.length });
|
|
103
|
+
}
|
|
68
104
|
}
|
|
69
|
-
catch (
|
|
70
|
-
|
|
105
|
+
catch (err) {
|
|
106
|
+
log.error('position-refresh cycle failed', {
|
|
107
|
+
error: err instanceof Error ? err.message : String(err),
|
|
108
|
+
});
|
|
71
109
|
}
|
|
72
110
|
}, config.positionPollIntervalMs);
|
|
73
111
|
// Run immediately on start
|
|
74
112
|
void (async () => {
|
|
113
|
+
log.info('scheduler boot: starting initial sync');
|
|
75
114
|
try {
|
|
76
|
-
await run(indexAllMarkets);
|
|
77
|
-
|
|
78
|
-
|
|
115
|
+
const eventResults = await run(indexAllMarkets);
|
|
116
|
+
const newEvents = eventResults.reduce((sum, r) => sum + r.newEvents, 0);
|
|
117
|
+
log.info('scheduler boot: events indexed', { markets: eventResults.length, newEvents });
|
|
118
|
+
const stateResults = await run(refreshAllMarketStates);
|
|
119
|
+
const stateOk = stateResults.filter((r) => r.success).length;
|
|
120
|
+
const stateFailed = stateResults.filter((r) => !r.success);
|
|
121
|
+
log.info('scheduler boot: states refreshed', {
|
|
122
|
+
ok: stateOk,
|
|
123
|
+
failed: stateFailed.length,
|
|
124
|
+
errors: stateFailed.slice(0, 5).map((r) => ({
|
|
125
|
+
market: r.marketAddress.slice(0, 12),
|
|
126
|
+
error: r.error,
|
|
127
|
+
})),
|
|
128
|
+
});
|
|
129
|
+
const posResults = await run(refreshAllPositions);
|
|
130
|
+
const posOk = posResults.filter((r) => r.success).length;
|
|
131
|
+
const posFailed = posResults.filter((r) => !r.success);
|
|
132
|
+
log.info('scheduler boot: positions refreshed', {
|
|
133
|
+
ok: posOk,
|
|
134
|
+
failed: posFailed.length,
|
|
135
|
+
errors: posFailed.slice(0, 5).map((r) => ({
|
|
136
|
+
market: r.marketAddress.slice(0, 12),
|
|
137
|
+
error: r.error,
|
|
138
|
+
})),
|
|
139
|
+
});
|
|
140
|
+
log.info('scheduler boot: complete');
|
|
79
141
|
}
|
|
80
|
-
catch (
|
|
81
|
-
|
|
142
|
+
catch (err) {
|
|
143
|
+
log.error('scheduler boot failed', {
|
|
144
|
+
error: err instanceof Error ? err.message : String(err),
|
|
145
|
+
});
|
|
82
146
|
}
|
|
83
147
|
})();
|
|
84
148
|
return {
|
|
85
149
|
stop: () => {
|
|
150
|
+
log.info('scheduler stopping');
|
|
86
151
|
cancelEvents();
|
|
87
152
|
cancelState();
|
|
88
153
|
cancelPositions();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/etl/scheduler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,EAA2B,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAElF,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAwB,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAA6B,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAM3D;;;;GAIG;AACH,SAAS,uBAAuB,CAAC,EAAuB,EAAE,UAAkB;IAC1E,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,KAAK,GAAyC,IAAI,CAAC;IAEvD,KAAK,UAAU,IAAI;QACjB,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QACD,MAAM,EAAE,EAAE,CAAC;QACX,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QACD,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACvC,CAAC;IAED,gDAAgD;IAChD,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAErC,OAAO,GAAG,EAAE;QACV,OAAO,GAAG,IAAI,CAAC;QACf,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,MAAqB,EACrB,QAKC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAC1B,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAC7D,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,EAC5E,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,cAAc,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EACtE,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAC9D,CAAC;IAEF,MAAM,GAAG,GAAG,CACV,MAA8F,EAC9F,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAEtD,MAAM,YAAY,GAAG,uBAAuB,CAAC,KAAK,IAAI,EAAE;QACtD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAC/D,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/etl/scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,5 +8,5 @@ import { EventBusTag } from '../services/EventBus';
|
|
|
8
8
|
import type { MarketType } from '../types';
|
|
9
9
|
import type { StateRefreshResult } from './types';
|
|
10
10
|
export declare const refreshMarketState: (marketAddress: string, marketType?: MarketType) => Effect.Effect<StateRefreshResult, never, DatabaseTag | ChainReaderTag | EventBusTag>;
|
|
11
|
-
export declare const refreshAllMarketStates: Effect.Effect<StateRefreshResult[], never,
|
|
11
|
+
export declare const refreshAllMarketStates: Effect.Effect<StateRefreshResult[], never, DatabaseTag | EventBusTag | ChainReaderTag>;
|
|
12
12
|
//# sourceMappingURL=state-refresher.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -5,16 +5,20 @@ import { Duration, Effect, Schedule } from 'effect';
|
|
|
5
5
|
import { createApp } from './api/app';
|
|
6
6
|
import { loadConfig } from './config';
|
|
7
7
|
import { createDatabase } from './db/connection';
|
|
8
|
-
import { CursorRepository, EventRepository, MarketRepository, MarketStateRepository, MultinoulliMarketStateRepository, PositionRepository, RankingRepository, } from './db/repositories';
|
|
8
|
+
import { ActivityFeedRepository, CursorRepository, EventRepository, MarketRepository, MarketStateRepository, MultinoulliMarketStateRepository, PositionRepository, RankingRepository, SubscriptionRepository, } from './db/repositories';
|
|
9
9
|
import { MultinoulliSnapshotsRepository } from './db/repositories/multinoulli-snapshots';
|
|
10
10
|
import { initializeSchema } from './db/schema';
|
|
11
11
|
import { startScheduler } from './etl/scheduler';
|
|
12
|
+
import { createWebhookDispatcher } from './services/WebhookDispatcher';
|
|
12
13
|
import { createChainReaderService } from './layers/ChainReaderLive';
|
|
13
14
|
import { isRetryableVoyagerError, VoyagerApiError } from './services/VoyagerClient';
|
|
14
15
|
import { VoyagerRateLimitState } from './services/VoyagerRateLimit';
|
|
16
|
+
import { log } from './logger';
|
|
15
17
|
const config = loadConfig();
|
|
18
|
+
log.info('indexer starting', { dbPath: config.dbPath, rpcUrl: config.starknetRpcUrl });
|
|
16
19
|
const db = createDatabase(config.dbPath);
|
|
17
20
|
initializeSchema(db);
|
|
21
|
+
log.info('database initialized');
|
|
18
22
|
const databaseService = {
|
|
19
23
|
db,
|
|
20
24
|
markets: new MarketRepository(db),
|
|
@@ -25,6 +29,8 @@ const databaseService = {
|
|
|
25
29
|
positions: new PositionRepository(db),
|
|
26
30
|
cursors: new CursorRepository(db),
|
|
27
31
|
rankings: new RankingRepository(db),
|
|
32
|
+
activityFeed: new ActivityFeedRepository(db),
|
|
33
|
+
subscriptions: new SubscriptionRepository(db),
|
|
28
34
|
};
|
|
29
35
|
// ── Voyager rate-limit state (shared, observable) ───────────────────────────
|
|
30
36
|
const voyagerRateLimit = new VoyagerRateLimitState(config.voyagerMinRequestIntervalMs);
|
|
@@ -108,6 +114,9 @@ const eventBusService = {
|
|
|
108
114
|
};
|
|
109
115
|
},
|
|
110
116
|
};
|
|
117
|
+
// ── Start webhook dispatcher ──────────────────────────────────────────────
|
|
118
|
+
const webhookDispatcher = createWebhookDispatcher(databaseService, eventBusService);
|
|
119
|
+
webhookDispatcher.start();
|
|
111
120
|
// ── Start ETL scheduler ────────────────────────────────────────────────────
|
|
112
121
|
const scheduler = startScheduler(config, {
|
|
113
122
|
database: databaseService,
|
|
@@ -123,13 +132,16 @@ const app = createApp({
|
|
|
123
132
|
rateLimit: voyagerRateLimit,
|
|
124
133
|
});
|
|
125
134
|
app.listen({ port: config.port, hostname: '0.0.0.0' });
|
|
135
|
+
log.info('server listening', { port: config.port });
|
|
126
136
|
// ── Graceful shutdown ──────────────────────────────────────────────────────
|
|
127
137
|
process.on('SIGTERM', () => {
|
|
138
|
+
webhookDispatcher.stop();
|
|
128
139
|
scheduler.stop();
|
|
129
140
|
db.close();
|
|
130
141
|
process.exit(0);
|
|
131
142
|
});
|
|
132
143
|
process.on('SIGINT', () => {
|
|
144
|
+
webhookDispatcher.stop();
|
|
133
145
|
scheduler.stop();
|
|
134
146
|
db.close();
|
|
135
147
|
process.exit(0);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,gCAAgC,EAChC,kBAAkB,EAClB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChainReaderLive.d.ts","sourceRoot":"","sources":["../../src/layers/ChainReaderLive.ts"],"names":[],"mappings":"AASA,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,KAAK,EAAE,kBAAkB,EAAoC,MAAM,yBAAyB,CAAC;AACpG,OAAO,EAAkB,cAAc,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"ChainReaderLive.d.ts","sourceRoot":"","sources":["../../src/layers/ChainReaderLive.ts"],"names":[],"mappings":"AASA,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,KAAK,EAAE,kBAAkB,EAAoC,MAAM,yBAAyB,CAAC;AACpG,OAAO,EAAkB,cAAc,EAAE,MAAM,yBAAyB,CAAC;AA6QzE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAyP3E;AAED,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,KAAG,KAAK,CAAC,KAAK,CAAC,cAAc,CACS,CAAC"}
|
|
@@ -6,6 +6,10 @@ import { Effect, Layer } from 'effect';
|
|
|
6
6
|
import { Contract } from 'starknet';
|
|
7
7
|
import { ChainReadError, ChainReaderTag } from '../services/ChainReader';
|
|
8
8
|
const TWO_128 = 2n ** 128n;
|
|
9
|
+
/** JSON.stringify replacement that converts BigInts to strings. */
|
|
10
|
+
function jsonStringifyBigInt(value) {
|
|
11
|
+
return JSON.stringify(value, (_key, v) => (typeof v === 'bigint' ? v.toString() : v));
|
|
12
|
+
}
|
|
9
13
|
function toBigIntValue(value) {
|
|
10
14
|
if (typeof value === 'bigint') {
|
|
11
15
|
return value;
|
|
@@ -116,36 +120,36 @@ function continuousAbi(marketType) {
|
|
|
116
120
|
}
|
|
117
121
|
return NORMAL_AMM_ABI;
|
|
118
122
|
}
|
|
119
|
-
|
|
123
|
+
/**
|
|
124
|
+
* Extract original distribution fields from position compact record.
|
|
125
|
+
* Normal: originalMean/Variance/Sigma (flat)
|
|
126
|
+
* Lognormal: originalMu/Variance/Sigma (flat, mu instead of mean)
|
|
127
|
+
* Bivariate: originalDist.mu1/variance1 (nested)
|
|
128
|
+
*/
|
|
129
|
+
function projectedOriginalPositionFields(marketType, compact) {
|
|
120
130
|
if (marketType === 'normal') {
|
|
121
|
-
const mean = sq128ToNumber(
|
|
122
|
-
const variance = sq128ToNumber(
|
|
123
|
-
const sigma = sq128ToNumber(
|
|
131
|
+
const mean = sq128ToNumber(compact.originalMean);
|
|
132
|
+
const variance = sq128ToNumber(compact.originalVariance);
|
|
133
|
+
const sigma = sq128ToNumber(compact.originalSigma);
|
|
124
134
|
const fallbackSigma = variance === null ? null : Math.sqrt(Math.max(variance, 0));
|
|
125
|
-
return {
|
|
126
|
-
mean,
|
|
127
|
-
variance,
|
|
128
|
-
sigma: sigma ?? fallbackSigma,
|
|
129
|
-
};
|
|
135
|
+
return { mean, variance, sigma: sigma ?? fallbackSigma };
|
|
130
136
|
}
|
|
131
137
|
if (marketType === 'lognormal') {
|
|
132
|
-
const mean = sq128ToNumber(
|
|
133
|
-
const variance = sq128ToNumber(
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
sigma: variance === null ? null : Math.sqrt(Math.max(variance, 0)),
|
|
138
|
-
};
|
|
138
|
+
const mean = sq128ToNumber(compact.originalMu);
|
|
139
|
+
const variance = sq128ToNumber(compact.originalVariance);
|
|
140
|
+
const sigma = sq128ToNumber(compact.originalSigma);
|
|
141
|
+
const fallbackSigma = variance === null ? null : Math.sqrt(Math.max(variance, 0));
|
|
142
|
+
return { mean, variance, sigma: sigma ?? fallbackSigma };
|
|
139
143
|
}
|
|
140
144
|
// bivariate projection: first marginal (x1)
|
|
141
|
-
const
|
|
142
|
-
const
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
variance,
|
|
146
|
-
sigma: variance === null ? null : Math.sqrt(Math.max(variance, 0)),
|
|
147
|
-
};
|
|
145
|
+
const bivDist = compact.originalDist;
|
|
146
|
+
const mean = bivDist ? sq128ToNumber(bivDist.mu1) : null;
|
|
147
|
+
const variance = bivDist ? sq128ToNumber(bivDist.variance1) : null;
|
|
148
|
+
return { mean, variance, sigma: variance === null ? null : Math.sqrt(Math.max(variance, 0)) };
|
|
148
149
|
}
|
|
150
|
+
/**
|
|
151
|
+
* Extract effective (current) distribution fields from position compact record.
|
|
152
|
+
*/
|
|
149
153
|
function projectedEffectivePositionFields(marketType, compact) {
|
|
150
154
|
if (marketType === 'normal') {
|
|
151
155
|
const mean = sq128ToNumber(compact.effectiveMean);
|
|
@@ -155,9 +159,11 @@ function projectedEffectivePositionFields(marketType, compact) {
|
|
|
155
159
|
return { mean, variance, sigma: sigma ?? fallbackSigma };
|
|
156
160
|
}
|
|
157
161
|
if (marketType === 'lognormal') {
|
|
158
|
-
const mean = sq128ToNumber(compact.effectiveMu
|
|
162
|
+
const mean = sq128ToNumber(compact.effectiveMu);
|
|
159
163
|
const variance = sq128ToNumber(compact.effectiveVariance);
|
|
160
|
-
|
|
164
|
+
const sigma = sq128ToNumber(compact.effectiveSigma);
|
|
165
|
+
const fallbackSigma = variance === null ? null : Math.sqrt(Math.max(variance, 0));
|
|
166
|
+
return { mean, variance, sigma: sigma ?? fallbackSigma };
|
|
161
167
|
}
|
|
162
168
|
// bivariate projection: first marginal (x1)
|
|
163
169
|
const bivDist = compact.effectiveDist;
|
|
@@ -194,16 +200,23 @@ export function createChainReaderService(rpcUrl) {
|
|
|
194
200
|
readMarketState: (marketAddress, marketType = 'normal') => Effect.tryPromise({
|
|
195
201
|
try: async () => {
|
|
196
202
|
const contract = getContinuousContract(marketAddress, marketType);
|
|
197
|
-
const [rawDistribution, rawStatus, rawLpInfo
|
|
203
|
+
const [rawDistribution, rawStatus, rawLpInfo] = await Promise.all([
|
|
198
204
|
contract.call('get_distribution', []),
|
|
199
205
|
contract.call('get_market_status', []),
|
|
200
206
|
contract.call('get_lp_info', []),
|
|
201
|
-
contract.call('get_params', []),
|
|
202
207
|
]);
|
|
208
|
+
// get_params is best-effort — don't let it block the core state read
|
|
209
|
+
let rawParams = null;
|
|
210
|
+
try {
|
|
211
|
+
rawParams = await contract.call('get_params', []);
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
// Contract may not support get_params (older deployments)
|
|
215
|
+
}
|
|
203
216
|
const distribution = normalizeResponse(rawDistribution);
|
|
204
217
|
const status = normalizeResponse(rawStatus);
|
|
205
218
|
const lpInfo = normalizeResponse(rawLpInfo);
|
|
206
|
-
const params = normalizeResponse(rawParams);
|
|
219
|
+
const params = rawParams ? normalizeResponse(rawParams) : { k: undefined, backing: undefined };
|
|
207
220
|
const projected = projectedDistributionFields(marketType, distribution);
|
|
208
221
|
const mean = sq128ToNumber(projected.meanRaw);
|
|
209
222
|
const variance = sq128ToNumber(projected.varianceRaw);
|
|
@@ -219,9 +232,9 @@ export function createChainReaderService(rpcUrl) {
|
|
|
219
232
|
settlementValue: settlementValueFromStatus(status),
|
|
220
233
|
totalShares: sq128MagnitudeToString(lpInfo.totalShares),
|
|
221
234
|
totalBacking: sq128MagnitudeToString(lpInfo.totalBackingDeposited),
|
|
222
|
-
meanRaw: projected.meanRaw ?
|
|
223
|
-
sigmaRaw: projected.sigmaRaw ?
|
|
224
|
-
varianceRaw: projected.varianceRaw ?
|
|
235
|
+
meanRaw: projected.meanRaw ? jsonStringifyBigInt(projected.meanRaw) : null,
|
|
236
|
+
sigmaRaw: projected.sigmaRaw ? jsonStringifyBigInt(projected.sigmaRaw) : null,
|
|
237
|
+
varianceRaw: projected.varianceRaw ? jsonStringifyBigInt(projected.varianceRaw) : null,
|
|
225
238
|
k: sq128ToNumber(params.k),
|
|
226
239
|
effectiveK: sq128ToNumber(params.backing),
|
|
227
240
|
};
|
|
@@ -254,8 +267,7 @@ export function createChainReaderService(rpcUrl) {
|
|
|
254
267
|
claimed: false,
|
|
255
268
|
};
|
|
256
269
|
}
|
|
257
|
-
const
|
|
258
|
-
const projected = projectedPositionFields(marketType, originalDistribution);
|
|
270
|
+
const projected = projectedOriginalPositionFields(marketType, compact);
|
|
259
271
|
const effective = projectedEffectivePositionFields(marketType, compact);
|
|
260
272
|
const claimed = toBoolValue(summary.claimed);
|
|
261
273
|
const tracksSettlementClaim = toBoolValue(summary.tracksSettlementClaim);
|