@the-situation/indexer 0.11.3 → 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.js +4 -4
- 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
|
@@ -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);
|