@the-situation/indexer 0.9.3 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/README.md +5 -1
  2. package/dist/api/app.d.ts +42 -0
  3. package/dist/api/app.d.ts.map +1 -1
  4. package/dist/api/app.js +3 -2
  5. package/dist/api/app.js.map +1 -1
  6. package/dist/api/middleware/admin-auth.d.ts.map +1 -1
  7. package/dist/api/middleware/admin-auth.js +6 -4
  8. package/dist/api/middleware/admin-auth.js.map +1 -1
  9. package/dist/api/middleware/error-handler.d.ts.map +1 -1
  10. package/dist/api/middleware/error-handler.js +0 -1
  11. package/dist/api/middleware/error-handler.js.map +1 -1
  12. package/dist/api/routes/admin.d.ts +2 -0
  13. package/dist/api/routes/admin.d.ts.map +1 -1
  14. package/dist/api/routes/admin.js +27 -6
  15. package/dist/api/routes/admin.js.map +1 -1
  16. package/dist/api/routes/index.d.ts +4 -3
  17. package/dist/api/routes/index.d.ts.map +1 -1
  18. package/dist/api/routes/index.js +4 -3
  19. package/dist/api/routes/index.js.map +1 -1
  20. package/dist/api/routes/market-events.d.ts.map +1 -1
  21. package/dist/api/routes/market-events.js +12 -8
  22. package/dist/api/routes/market-events.js.map +1 -1
  23. package/dist/api/routes/market-traders.d.ts.map +1 -1
  24. package/dist/api/routes/market-traders.js +1 -1
  25. package/dist/api/routes/market-traders.js.map +1 -1
  26. package/dist/api/routes/markets.d.ts.map +1 -1
  27. package/dist/api/routes/markets.js +18 -9
  28. package/dist/api/routes/markets.js.map +1 -1
  29. package/dist/api/routes/multinoulli-snapshots.d.ts +78 -0
  30. package/dist/api/routes/multinoulli-snapshots.d.ts.map +1 -0
  31. package/dist/api/routes/multinoulli-snapshots.js +33 -0
  32. package/dist/api/routes/multinoulli-snapshots.js.map +1 -0
  33. package/dist/api/routes/rankings.d.ts.map +1 -1
  34. package/dist/api/routes/rankings.js +2 -1
  35. package/dist/api/routes/rankings.js.map +1 -1
  36. package/dist/api/routes/trader-events.d.ts +1 -1
  37. package/dist/api/routes/trader-events.d.ts.map +1 -1
  38. package/dist/api/routes/trader-events.js +9 -6
  39. package/dist/api/routes/trader-events.js.map +1 -1
  40. package/dist/api/routes/ws.d.ts.map +1 -1
  41. package/dist/api/routes/ws.js +4 -3
  42. package/dist/api/routes/ws.js.map +1 -1
  43. package/dist/client/IndexerClient.d.ts +2 -1
  44. package/dist/client/IndexerClient.d.ts.map +1 -1
  45. package/dist/client/IndexerClient.js.map +1 -1
  46. package/dist/client/IndexerClientLive.d.ts.map +1 -1
  47. package/dist/client/IndexerClientLive.js +24 -9
  48. package/dist/client/IndexerClientLive.js.map +1 -1
  49. package/dist/client/convenience.d.ts +3 -2
  50. package/dist/client/convenience.d.ts.map +1 -1
  51. package/dist/client/convenience.js +1 -0
  52. package/dist/client/convenience.js.map +1 -1
  53. package/dist/client/index.d.ts +5 -5
  54. package/dist/client/index.d.ts.map +1 -1
  55. package/dist/client/index.js +4 -4
  56. package/dist/client/index.js.map +1 -1
  57. package/dist/client/trader-stats.d.ts +2 -2
  58. package/dist/client/trader-stats.d.ts.map +1 -1
  59. package/dist/client/trader-stats.js +1 -1
  60. package/dist/client/trader-stats.js.map +1 -1
  61. package/dist/config.d.ts.map +1 -1
  62. package/dist/config.js +5 -4
  63. package/dist/config.js.map +1 -1
  64. package/dist/db/repositories/event.d.ts +3 -2
  65. package/dist/db/repositories/event.d.ts.map +1 -1
  66. package/dist/db/repositories/event.js +17 -15
  67. package/dist/db/repositories/event.js.map +1 -1
  68. package/dist/db/repositories/index.d.ts +3 -3
  69. package/dist/db/repositories/index.d.ts.map +1 -1
  70. package/dist/db/repositories/index.js +3 -3
  71. package/dist/db/repositories/index.js.map +1 -1
  72. package/dist/db/repositories/market-state.d.ts.map +1 -1
  73. package/dist/db/repositories/market-state.js +1 -3
  74. package/dist/db/repositories/market-state.js.map +1 -1
  75. package/dist/db/repositories/market.d.ts +1 -1
  76. package/dist/db/repositories/market.d.ts.map +1 -1
  77. package/dist/db/repositories/market.js +22 -24
  78. package/dist/db/repositories/market.js.map +1 -1
  79. package/dist/db/repositories/multinoulli-snapshots.d.ts +44 -0
  80. package/dist/db/repositories/multinoulli-snapshots.d.ts.map +1 -0
  81. package/dist/db/repositories/multinoulli-snapshots.js +54 -0
  82. package/dist/db/repositories/multinoulli-snapshots.js.map +1 -0
  83. package/dist/db/repositories/position.d.ts +2 -1
  84. package/dist/db/repositories/position.d.ts.map +1 -1
  85. package/dist/db/repositories/position.js +6 -0
  86. package/dist/db/repositories/position.js.map +1 -1
  87. package/dist/db/schema.d.ts.map +1 -1
  88. package/dist/db/schema.js +127 -1
  89. package/dist/db/schema.js.map +1 -1
  90. package/dist/etl/decoder.d.ts +1 -1
  91. package/dist/etl/decoder.d.ts.map +1 -1
  92. package/dist/etl/decoder.js +233 -63
  93. package/dist/etl/decoder.js.map +1 -1
  94. package/dist/etl/event-indexer.d.ts +1 -1
  95. package/dist/etl/event-indexer.d.ts.map +1 -1
  96. package/dist/etl/event-indexer.js +36 -11
  97. package/dist/etl/event-indexer.js.map +1 -1
  98. package/dist/etl/position-refresher.d.ts +2 -2
  99. package/dist/etl/position-refresher.d.ts.map +1 -1
  100. package/dist/etl/position-refresher.js +15 -8
  101. package/dist/etl/position-refresher.js.map +1 -1
  102. package/dist/etl/scheduler.d.ts +2 -2
  103. package/dist/etl/scheduler.d.ts.map +1 -1
  104. package/dist/etl/scheduler.js +19 -23
  105. package/dist/etl/scheduler.js.map +1 -1
  106. package/dist/etl/state-refresher.d.ts +2 -2
  107. package/dist/etl/state-refresher.d.ts.map +1 -1
  108. package/dist/etl/state-refresher.js +17 -5
  109. package/dist/etl/state-refresher.js.map +1 -1
  110. package/dist/index.d.ts +3 -0
  111. package/dist/index.d.ts.map +1 -1
  112. package/dist/index.js +15 -189
  113. package/dist/index.js.map +1 -1
  114. package/dist/layers/ChainReaderLive.d.ts +2 -0
  115. package/dist/layers/ChainReaderLive.d.ts.map +1 -1
  116. package/dist/layers/ChainReaderLive.js +222 -65
  117. package/dist/layers/ChainReaderLive.js.map +1 -1
  118. package/dist/layers/DatabaseLive.d.ts +1 -1
  119. package/dist/layers/DatabaseLive.d.ts.map +1 -1
  120. package/dist/layers/DatabaseLive.js +3 -1
  121. package/dist/layers/DatabaseLive.js.map +1 -1
  122. package/dist/layers/EventBusLive.d.ts.map +1 -1
  123. package/dist/layers/EventBusLive.js +2 -2
  124. package/dist/layers/EventBusLive.js.map +1 -1
  125. package/dist/layers/VoyagerClientLive.d.ts.map +1 -1
  126. package/dist/layers/VoyagerClientLive.js +10 -6
  127. package/dist/layers/VoyagerClientLive.js.map +1 -1
  128. package/dist/layers/index.d.ts +2 -2
  129. package/dist/layers/index.d.ts.map +1 -1
  130. package/dist/layers/index.js +2 -2
  131. package/dist/layers/index.js.map +1 -1
  132. package/dist/services/ChainReader.d.ts +3 -3
  133. package/dist/services/ChainReader.d.ts.map +1 -1
  134. package/dist/services/ChainReader.js.map +1 -1
  135. package/dist/services/Database.d.ts +4 -2
  136. package/dist/services/Database.d.ts.map +1 -1
  137. package/dist/services/Database.js.map +1 -1
  138. package/dist/services/EventBus.d.ts.map +1 -1
  139. package/dist/services/EventBus.js.map +1 -1
  140. package/dist/services/VoyagerRateLimit.d.ts.map +1 -1
  141. package/dist/services/VoyagerRateLimit.js +5 -6
  142. package/dist/services/VoyagerRateLimit.js.map +1 -1
  143. package/dist/services/index.d.ts +4 -4
  144. package/dist/services/index.d.ts.map +1 -1
  145. package/dist/services/index.js +2 -2
  146. package/dist/services/index.js.map +1 -1
  147. package/dist/types/api.d.ts +11 -0
  148. package/dist/types/api.d.ts.map +1 -1
  149. package/dist/types/event.d.ts +16 -1
  150. package/dist/types/event.d.ts.map +1 -1
  151. package/dist/types/index.d.ts +4 -4
  152. package/dist/types/index.d.ts.map +1 -1
  153. package/dist/types/market.d.ts +1 -1
  154. package/dist/types/market.d.ts.map +1 -1
  155. package/package.json +6 -6
package/dist/index.js CHANGED
@@ -1,22 +1,18 @@
1
1
  /**
2
2
  * Indexer entry point — boots DB, ETL scheduler, and Elysia server.
3
3
  */
4
+ import { Duration, Effect, Schedule } from 'effect';
5
+ import { createApp } from './api/app';
4
6
  import { loadConfig } from './config';
5
7
  import { createDatabase } from './db/connection';
8
+ import { CursorRepository, EventRepository, MarketRepository, MarketStateRepository, MultinoulliMarketStateRepository, PositionRepository, RankingRepository, } from './db/repositories';
9
+ import { MultinoulliSnapshotsRepository } from './db/repositories/multinoulli-snapshots';
6
10
  import { initializeSchema } from './db/schema';
7
- import { MarketRepository, EventRepository, MarketStateRepository, MultinoulliMarketStateRepository, PositionRepository, CursorRepository, RankingRepository, } from './db/repositories';
8
- import { VoyagerApiError, isRetryableVoyagerError } from './services/VoyagerClient';
9
- import { ChainReadError } from './services/ChainReader';
10
- import { VoyagerRateLimitState } from './services/VoyagerRateLimit';
11
11
  import { startScheduler } from './etl/scheduler';
12
- import { createApp } from './api/app';
13
- import { Duration, Effect, Schedule } from 'effect';
14
- import { AMM_ABI, MULTINOULLI_AMM_ABI } from '@the-situation/artifacts';
15
- import { AMMContract, MultinoulliAMMContract, createProvider } from '@the-situation/starknet';
16
- import { SQ128x128 } from '@the-situation/core';
12
+ import { createChainReaderService } from './layers/ChainReaderLive';
13
+ import { isRetryableVoyagerError, VoyagerApiError } from './services/VoyagerClient';
14
+ import { VoyagerRateLimitState } from './services/VoyagerRateLimit';
17
15
  const config = loadConfig();
18
- // ── Database ────────────────────────────────────────────────────────────────
19
- console.log(`[Indexer] Opening database at ${config.dbPath}`);
20
16
  const db = createDatabase(config.dbPath);
21
17
  initializeSchema(db);
22
18
  const databaseService = {
@@ -25,6 +21,7 @@ const databaseService = {
25
21
  events: new EventRepository(db),
26
22
  marketState: new MarketStateRepository(db),
27
23
  multinoulliMarketState: new MultinoulliMarketStateRepository(db),
24
+ multinoulliSnapshots: new MultinoulliSnapshotsRepository(db),
28
25
  positions: new PositionRepository(db),
29
26
  cursors: new CursorRepository(db),
30
27
  rankings: new RankingRepository(db),
@@ -68,19 +65,21 @@ const voyagerClientService = {
68
65
  return { events: data.items, lastPage: data.lastPage };
69
66
  },
70
67
  catch: (e) => {
71
- if (e instanceof VoyagerApiError)
68
+ if (e instanceof VoyagerApiError) {
72
69
  return e;
70
+ }
73
71
  return new VoyagerApiError(e instanceof Error ? e.message : 'Unknown Voyager API error');
74
72
  },
75
73
  });
76
74
  return fetchOnce.pipe(Effect.retry({
77
75
  schedule: voyagerRetrySchedule,
78
76
  while: (error) => {
79
- if (voyagerRateLimit.isLimited())
77
+ if (voyagerRateLimit.isLimited()) {
80
78
  return false;
79
+ }
81
80
  const shouldRetry = isRetryableVoyagerError(error);
82
81
  if (shouldRetry) {
83
- console.warn(`[VoyagerClient] Retrying after ${error.status} for contract=${contractAddress} page=${page}`);
82
+ // Retry continues according to configured schedule.
84
83
  }
85
84
  return shouldRetry;
86
85
  },
@@ -88,173 +87,7 @@ const voyagerClientService = {
88
87
  },
89
88
  };
90
89
  // ── Chain reader ────────────────────────────────────────────────────────────
91
- const provider = createProvider({
92
- name: 'custom',
93
- chainId: 'SN_SEPOLIA',
94
- rpcUrl: config.starknetRpcUrl,
95
- });
96
- const ammCache = new Map();
97
- const multinoulliAmmCache = new Map();
98
- function getAmm(address) {
99
- let amm = ammCache.get(address);
100
- if (!amm) {
101
- amm = new AMMContract({ address, abi: AMM_ABI, provider });
102
- ammCache.set(address, amm);
103
- }
104
- return amm;
105
- }
106
- function getMultinoulliAmm(address) {
107
- let amm = multinoulliAmmCache.get(address);
108
- if (!amm) {
109
- amm = new MultinoulliAMMContract({ address, abi: MULTINOULLI_AMM_ABI, provider });
110
- multinoulliAmmCache.set(address, amm);
111
- }
112
- return amm;
113
- }
114
- const chainReaderService = {
115
- readMarketState: (marketAddress) => Effect.tryPromise({
116
- try: async () => {
117
- const amm = getAmm(marketAddress);
118
- const [distribution, status, lpInfo] = await Promise.all([
119
- amm.getDistribution(),
120
- amm.getMarketStatus(),
121
- amm.getLPInfo(),
122
- ]);
123
- return {
124
- mean: distribution?.mean.toNumber() ?? null,
125
- sigma: distribution?.sigma.toNumber() ?? null,
126
- variance: distribution?.variance.toNumber() ?? null,
127
- isInitialized: status.isInitialized,
128
- isPaused: status.isPaused,
129
- isSettled: status.isSettled,
130
- settlementValue: status.settlementValue?.toNumber() ?? null,
131
- totalShares: lpInfo?.totalShares.toRaw().limb0.toString() ?? null,
132
- totalBacking: lpInfo?.totalBackingDeposited.toRaw().limb0.toString() ?? null,
133
- meanRaw: distribution
134
- ? JSON.stringify({
135
- mag: distribution.mean.toRaw().limb0.toString(),
136
- sign: distribution.mean.toRaw().neg,
137
- })
138
- : null,
139
- sigmaRaw: distribution
140
- ? JSON.stringify({
141
- mag: distribution.sigma.toRaw().limb0.toString(),
142
- sign: false,
143
- })
144
- : null,
145
- varianceRaw: distribution
146
- ? JSON.stringify({
147
- mag: distribution.variance.toRaw().limb0.toString(),
148
- sign: distribution.variance.toRaw().neg,
149
- })
150
- : null,
151
- };
152
- },
153
- catch: (e) => new ChainReadError(`Failed to read market state: ${e instanceof Error ? e.message : 'Unknown'}`, e),
154
- }),
155
- readPosition: (marketAddress, trader) => Effect.tryPromise({
156
- try: async () => {
157
- const amm = getAmm(marketAddress);
158
- const [position, extended] = await Promise.all([
159
- amm.getPositionCompact(trader),
160
- amm.getPositionSummary(trader),
161
- ]);
162
- if (!position || !extended) {
163
- return {
164
- hasPosition: false,
165
- collateralLocked: null,
166
- mean: null,
167
- sigma: null,
168
- variance: null,
169
- settlementState: 'never_traded',
170
- deltaCount: 0,
171
- claimed: false,
172
- };
173
- }
174
- return {
175
- hasPosition: position.exists,
176
- collateralLocked: extended.totalCollateralLocked?.toRaw().limb0.toString() ?? null,
177
- mean: position.originalMean?.toNumber() ?? null,
178
- sigma: position.originalSigma?.toNumber() ?? null,
179
- variance: position.originalVariance?.toNumber() ?? null,
180
- settlementState: extended.claimed ? 'claimed' : extended.tracksSettlementClaim ? 'pending_claim' : 'active',
181
- deltaCount: 0,
182
- claimed: extended.claimed,
183
- };
184
- },
185
- catch: (e) => new ChainReadError(`Failed to read position: ${e instanceof Error ? e.message : 'Unknown'}`, e),
186
- }),
187
- readMultinoulliMarketState: (marketAddress) => Effect.tryPromise({
188
- try: async () => {
189
- const amm = getMultinoulliAmm(marketAddress);
190
- const [distribution, status, params, lpInfo, settlements, matrix] = await Promise.all([
191
- amm.getDistribution(),
192
- amm.getMarketStatus(),
193
- amm.getParams(),
194
- amm.getLPInfo(),
195
- amm.getSettlementOutcomes(),
196
- amm.getMatrixConstraints(),
197
- ]);
198
- const probs = distribution.probs.map((raw) => {
199
- const parsed = SQ128x128.fromRaw(raw);
200
- return parsed?.toNumber() ?? 0;
201
- });
202
- return {
203
- outcomeCount: probs.length,
204
- probs,
205
- k: params?.k.toNumber() ?? null,
206
- effectiveK: params?.backing.toNumber() ?? null,
207
- totalShares: lpInfo?.totalShares.toRaw().limb0.toString() ?? null,
208
- totalBacking: lpInfo?.totalBackingDeposited.toRaw().limb0.toString() ?? null,
209
- isInitialized: status.isInitialized,
210
- isPaused: status.isPaused,
211
- isSettled: status.isSettled,
212
- settlementOutcomes: settlements,
213
- matrixEnabled: matrix.enabled,
214
- matrixRows: matrix.rowCount,
215
- matrixCols: matrix.colCount,
216
- matrixEnforceFullRow: matrix.enforceFullRowAssignmentSettlement,
217
- };
218
- },
219
- catch: (e) => new ChainReadError(`Failed to read multinoulli market state: ${e instanceof Error ? e.message : 'Unknown'}`, e),
220
- }),
221
- readMultinoulliPosition: (marketAddress, trader) => Effect.tryPromise({
222
- try: async () => {
223
- const amm = getMultinoulliAmm(marketAddress);
224
- const [summary, compact] = await Promise.all([
225
- amm.getPositionSummary(trader),
226
- amm.getPositionCompact(trader),
227
- ]);
228
- if (!summary || !compact) {
229
- return {
230
- exists: false,
231
- claimed: false,
232
- totalCollateralLocked: null,
233
- outcomeCount: 0,
234
- originalProbs: [],
235
- settlementState: 'never_traded',
236
- };
237
- }
238
- const originalProbs = compact.originalDistribution.probs.map((raw) => {
239
- const parsed = SQ128x128.fromRaw(raw);
240
- return parsed?.toNumber() ?? 0;
241
- });
242
- return {
243
- exists: summary.exists,
244
- claimed: summary.claimed,
245
- totalCollateralLocked: summary.totalCollateralLocked.toRaw().limb0.toString(),
246
- outcomeCount: summary.outcomeCount,
247
- originalProbs,
248
- settlementState: summary.claimed
249
- ? 'claimed'
250
- : summary.tracksSettlementClaim
251
- ? 'pending_claim'
252
- : 'active',
253
- };
254
- },
255
- catch: (e) => new ChainReadError(`Failed to read multinoulli position: ${e instanceof Error ? e.message : 'Unknown'}`, e),
256
- }),
257
- };
90
+ const chainReaderService = createChainReaderService(config.starknetRpcUrl);
258
91
  // ── Event bus ───────────────────────────────────────────────────────────────
259
92
  const busHandlers = new Set();
260
93
  const eventBusService = {
@@ -263,8 +96,7 @@ const eventBusService = {
263
96
  try {
264
97
  handler(event);
265
98
  }
266
- catch (err) {
267
- console.error('[EventBus] handler error, removing dead handler:', err);
99
+ catch (_err) {
268
100
  busHandlers.delete(handler);
269
101
  }
270
102
  }
@@ -291,19 +123,13 @@ const app = createApp({
291
123
  rateLimit: voyagerRateLimit,
292
124
  });
293
125
  app.listen({ port: config.port, hostname: '0.0.0.0' });
294
- console.log(`[Indexer] Server running at http://localhost:${config.port}`);
295
- console.log(`[Indexer] Event poll: ${config.eventPollIntervalMs}ms`);
296
- console.log(`[Indexer] State poll: ${config.statePollIntervalMs}ms`);
297
- console.log(`[Indexer] Position poll: ${config.positionPollIntervalMs}ms`);
298
126
  // ── Graceful shutdown ──────────────────────────────────────────────────────
299
127
  process.on('SIGTERM', () => {
300
- console.log('[Indexer] SIGTERM received, shutting down...');
301
128
  scheduler.stop();
302
129
  db.close();
303
130
  process.exit(0);
304
131
  });
305
132
  process.on('SIGINT', () => {
306
- console.log('[Indexer] SIGINT received, shutting down...');
307
133
  scheduler.stop();
308
134
  db.close();
309
135
  process.exit(0);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  import { Layer } from 'effect';
2
+ import type { ChainReaderService } from '../services/ChainReader';
2
3
  import { ChainReaderTag } from '../services/ChainReader';
4
+ export declare function createChainReaderService(rpcUrl: string): ChainReaderService;
3
5
  export declare const ChainReaderLive: (rpcUrl: string) => Layer.Layer<ChainReaderTag>;
4
6
  //# sourceMappingURL=ChainReaderLive.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChainReaderLive.d.ts","sourceRoot":"","sources":["../../src/layers/ChainReaderLive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,EAAE,MAAM,QAAQ,CAAC;AAIvC,OAAO,EAAE,cAAc,EAAkB,MAAM,yBAAyB,CAAC;AAIzE,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,KAAG,KAAK,CAAC,KAAK,CAAC,cAAc,CA+M1E,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;AAmNzE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CA8N3E;AAED,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,KAAG,KAAK,CAAC,KAAK,CAAC,cAAc,CACS,CAAC"}
@@ -1,19 +1,167 @@
1
- import { Effect, Layer } from 'effect';
2
- import { AMM_ABI, MULTINOULLI_AMM_ABI } from '@the-situation/artifacts';
3
- import { AMMContract, MultinoulliAMMContract, createProvider } from '@the-situation/starknet';
1
+ import { BIVARIATE_AMM_ABI, LOGNORMAL_AMM_ABI, MULTINOULLI_AMM_ABI, NORMAL_AMM_ABI, } from '@the-situation/artifacts';
4
2
  import { SQ128x128 } from '@the-situation/core';
5
- import { ChainReaderTag, ChainReadError } from '../services/ChainReader';
6
- export const ChainReaderLive = (rpcUrl) => {
3
+ import { createProvider, MultinoulliAMMContract } from '@the-situation/starknet';
4
+ import { normalizeResponse } from '@the-situation/utils';
5
+ import { Effect, Layer } from 'effect';
6
+ import { Contract } from 'starknet';
7
+ import { ChainReadError, ChainReaderTag } from '../services/ChainReader';
8
+ const TWO_128 = 2n ** 128n;
9
+ function toBigIntValue(value) {
10
+ if (typeof value === 'bigint') {
11
+ return value;
12
+ }
13
+ if (typeof value === 'number' && Number.isFinite(value)) {
14
+ return BigInt(Math.trunc(value));
15
+ }
16
+ if (typeof value === 'string') {
17
+ try {
18
+ return BigInt(value);
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ }
24
+ return null;
25
+ }
26
+ function toBoolValue(value) {
27
+ if (typeof value === 'boolean') {
28
+ return value;
29
+ }
30
+ if (typeof value === 'bigint') {
31
+ return value !== 0n;
32
+ }
33
+ if (typeof value === 'number') {
34
+ return value !== 0;
35
+ }
36
+ if (typeof value === 'string') {
37
+ return value !== '0' && value !== '0x0' && value !== '';
38
+ }
39
+ return false;
40
+ }
41
+ function toSQ128x128Raw(value) {
42
+ if (typeof value !== 'object' || value === null) {
43
+ return null;
44
+ }
45
+ const raw = value;
46
+ const limb0 = toBigIntValue(raw.limb0);
47
+ const limb1 = toBigIntValue(raw.limb1);
48
+ const limb2 = toBigIntValue(raw.limb2);
49
+ const limb3 = toBigIntValue(raw.limb3);
50
+ if (limb0 === null || limb1 === null || limb2 === null || limb3 === null) {
51
+ return null;
52
+ }
53
+ return {
54
+ limb0,
55
+ limb1,
56
+ limb2,
57
+ limb3,
58
+ neg: toBoolValue(raw.neg),
59
+ };
60
+ }
61
+ function sq128ToNumber(value) {
62
+ const raw = toSQ128x128Raw(value);
63
+ if (!raw) {
64
+ return null;
65
+ }
66
+ const magnitude = raw.limb0 + (raw.limb1 << 64n) + (raw.limb2 << 128n) + (raw.limb3 << 192n);
67
+ const abs = Number(magnitude) / Number(TWO_128);
68
+ return raw.neg ? -abs : abs;
69
+ }
70
+ function sq128MagnitudeToString(value) {
71
+ const raw = toSQ128x128Raw(value);
72
+ if (!raw) {
73
+ return null;
74
+ }
75
+ const magnitude = raw.limb0 + (raw.limb1 << 64n) + (raw.limb2 << 128n) + (raw.limb3 << 192n);
76
+ return magnitude.toString();
77
+ }
78
+ function projectedDistributionFields(marketType, distribution) {
79
+ if (marketType === 'normal') {
80
+ return {
81
+ meanRaw: distribution.mean,
82
+ varianceRaw: distribution.variance,
83
+ sigmaRaw: distribution.sigma,
84
+ };
85
+ }
86
+ if (marketType === 'lognormal') {
87
+ return {
88
+ meanRaw: distribution.mu,
89
+ varianceRaw: distribution.variance,
90
+ sigmaRaw: null,
91
+ };
92
+ }
93
+ // bivariate projection: first marginal (x1)
94
+ return {
95
+ meanRaw: distribution.mu1,
96
+ varianceRaw: distribution.variance1,
97
+ sigmaRaw: null,
98
+ };
99
+ }
100
+ function settlementValueFromStatus(status) {
101
+ if (status.settlementValue !== undefined) {
102
+ return sq128ToNumber(status.settlementValue);
103
+ }
104
+ if (status.settlementPoint && typeof status.settlementPoint === 'object') {
105
+ const point = status.settlementPoint;
106
+ return sq128ToNumber(point.x1);
107
+ }
108
+ return null;
109
+ }
110
+ function continuousAbi(marketType) {
111
+ if (marketType === 'lognormal') {
112
+ return LOGNORMAL_AMM_ABI;
113
+ }
114
+ if (marketType === 'bivariate') {
115
+ return BIVARIATE_AMM_ABI;
116
+ }
117
+ return NORMAL_AMM_ABI;
118
+ }
119
+ function projectedPositionFields(marketType, originalDistribution) {
120
+ if (marketType === 'normal') {
121
+ const mean = sq128ToNumber(originalDistribution.mean);
122
+ const variance = sq128ToNumber(originalDistribution.variance);
123
+ const sigma = sq128ToNumber(originalDistribution.sigma);
124
+ const fallbackSigma = variance === null ? null : Math.sqrt(Math.max(variance, 0));
125
+ return {
126
+ mean,
127
+ variance,
128
+ sigma: sigma ?? fallbackSigma,
129
+ };
130
+ }
131
+ if (marketType === 'lognormal') {
132
+ const mean = sq128ToNumber(originalDistribution.mu);
133
+ const variance = sq128ToNumber(originalDistribution.variance);
134
+ return {
135
+ mean,
136
+ variance,
137
+ sigma: variance === null ? null : Math.sqrt(Math.max(variance, 0)),
138
+ };
139
+ }
140
+ // bivariate projection: first marginal (x1)
141
+ const mean = sq128ToNumber(originalDistribution.mu1);
142
+ const variance = sq128ToNumber(originalDistribution.variance1);
143
+ return {
144
+ mean,
145
+ variance,
146
+ sigma: variance === null ? null : Math.sqrt(Math.max(variance, 0)),
147
+ };
148
+ }
149
+ export function createChainReaderService(rpcUrl) {
7
150
  const provider = createProvider({ name: 'custom', chainId: 'SN_SEPOLIA', rpcUrl });
8
- const ammCache = new Map();
151
+ const continuousCache = new Map();
9
152
  const multinoulliAmmCache = new Map();
10
- function getAmm(address) {
11
- let amm = ammCache.get(address);
12
- if (!amm) {
13
- amm = new AMMContract({ address, abi: AMM_ABI, provider });
14
- ammCache.set(address, amm);
153
+ function getContinuousContract(address, marketType) {
154
+ const key = `${marketType}:${address.toLowerCase()}`;
155
+ let contract = continuousCache.get(key);
156
+ if (!contract) {
157
+ contract = new Contract({
158
+ abi: continuousAbi(marketType),
159
+ address,
160
+ providerOrAccount: provider,
161
+ });
162
+ continuousCache.set(key, contract);
15
163
  }
16
- return amm;
164
+ return contract;
17
165
  }
18
166
  function getMultinoulliAmm(address) {
19
167
  let amm = multinoulliAmmCache.get(address);
@@ -23,55 +171,51 @@ export const ChainReaderLive = (rpcUrl) => {
23
171
  }
24
172
  return amm;
25
173
  }
26
- return Layer.succeed(ChainReaderTag, ChainReaderTag.of({
27
- readMarketState: (marketAddress) => Effect.tryPromise({
174
+ return {
175
+ readMarketState: (marketAddress, marketType = 'normal') => Effect.tryPromise({
28
176
  try: async () => {
29
- const amm = getAmm(marketAddress);
30
- const [distribution, status, lpInfo] = await Promise.all([
31
- amm.getDistribution(),
32
- amm.getMarketStatus(),
33
- amm.getLPInfo(),
177
+ const contract = getContinuousContract(marketAddress, marketType);
178
+ const [rawDistribution, rawStatus, rawLpInfo] = await Promise.all([
179
+ contract.call('get_distribution', []),
180
+ contract.call('get_market_status', []),
181
+ contract.call('get_lp_info', []),
34
182
  ]);
183
+ const distribution = normalizeResponse(rawDistribution);
184
+ const status = normalizeResponse(rawStatus);
185
+ const lpInfo = normalizeResponse(rawLpInfo);
186
+ const projected = projectedDistributionFields(marketType, distribution);
187
+ const mean = sq128ToNumber(projected.meanRaw);
188
+ const variance = sq128ToNumber(projected.varianceRaw);
189
+ const directSigma = sq128ToNumber(projected.sigmaRaw);
190
+ const sigma = directSigma ?? (variance === null ? null : Math.sqrt(Math.max(variance, 0)));
35
191
  return {
36
- mean: distribution?.mean.toNumber() ?? null,
37
- sigma: distribution?.sigma.toNumber() ?? null,
38
- variance: distribution?.variance.toNumber() ?? null,
39
- isInitialized: status.isInitialized,
40
- isPaused: status.isPaused,
41
- isSettled: status.isSettled,
42
- settlementValue: status.settlementValue?.toNumber() ?? null,
43
- totalShares: lpInfo?.totalShares.toRaw().limb0.toString() ?? null,
44
- totalBacking: lpInfo?.totalBackingDeposited.toRaw().limb0.toString() ?? null,
45
- meanRaw: distribution
46
- ? JSON.stringify({
47
- mag: distribution.mean.toRaw().limb0.toString(),
48
- sign: distribution.mean.toRaw().neg,
49
- })
50
- : null,
51
- sigmaRaw: distribution
52
- ? JSON.stringify({
53
- mag: distribution.sigma.toRaw().limb0.toString(),
54
- sign: false,
55
- })
56
- : null,
57
- varianceRaw: distribution
58
- ? JSON.stringify({
59
- mag: distribution.variance.toRaw().limb0.toString(),
60
- sign: distribution.variance.toRaw().neg,
61
- })
62
- : null,
192
+ mean,
193
+ sigma,
194
+ variance,
195
+ isInitialized: toBoolValue(status.isInitialized),
196
+ isPaused: toBoolValue(status.isPaused),
197
+ isSettled: toBoolValue(status.isSettled),
198
+ settlementValue: settlementValueFromStatus(status),
199
+ totalShares: sq128MagnitudeToString(lpInfo.totalShares),
200
+ totalBacking: sq128MagnitudeToString(lpInfo.totalBackingDeposited),
201
+ meanRaw: projected.meanRaw ? JSON.stringify(projected.meanRaw) : null,
202
+ sigmaRaw: projected.sigmaRaw ? JSON.stringify(projected.sigmaRaw) : null,
203
+ varianceRaw: projected.varianceRaw ? JSON.stringify(projected.varianceRaw) : null,
63
204
  };
64
205
  },
65
206
  catch: (e) => new ChainReadError(`Failed to read market state: ${e instanceof Error ? e.message : 'Unknown'}`, e),
66
207
  }),
67
- readPosition: (marketAddress, trader) => Effect.tryPromise({
208
+ readPosition: (marketAddress, trader, marketType = 'normal') => Effect.tryPromise({
68
209
  try: async () => {
69
- const amm = getAmm(marketAddress);
70
- const [position, extended] = await Promise.all([
71
- amm.getPositionCompact(trader),
72
- amm.getPositionSummary(trader),
210
+ const contract = getContinuousContract(marketAddress, marketType);
211
+ const [rawCompact, rawSummary] = await Promise.all([
212
+ contract.call('get_position_compact', [trader]),
213
+ contract.call('get_position_summary', [trader]),
73
214
  ]);
74
- if (!position || !extended) {
215
+ const compact = normalizeResponse(rawCompact);
216
+ const summary = normalizeResponse(rawSummary);
217
+ const exists = toBoolValue(compact.exists ?? summary.exists);
218
+ if (!exists) {
75
219
  return {
76
220
  hasPosition: false,
77
221
  collateralLocked: null,
@@ -83,15 +227,23 @@ export const ChainReaderLive = (rpcUrl) => {
83
227
  claimed: false,
84
228
  };
85
229
  }
230
+ const originalDistribution = compact.originalDistribution ?? {};
231
+ const projected = projectedPositionFields(marketType, originalDistribution);
232
+ const claimed = toBoolValue(summary.claimed);
233
+ const tracksSettlementClaim = toBoolValue(summary.tracksSettlementClaim);
86
234
  return {
87
- hasPosition: position.exists,
88
- collateralLocked: extended.totalCollateralLocked?.toRaw().limb0.toString() ?? null,
89
- mean: position.originalMean?.toNumber() ?? null,
90
- sigma: position.originalSigma?.toNumber() ?? null,
91
- variance: position.originalVariance?.toNumber() ?? null,
92
- settlementState: extended.claimed ? 'claimed' : extended.tracksSettlementClaim ? 'pending_claim' : 'active',
235
+ hasPosition: true,
236
+ collateralLocked: sq128MagnitudeToString(summary.totalCollateralLocked),
237
+ mean: projected.mean,
238
+ sigma: projected.sigma,
239
+ variance: projected.variance,
240
+ settlementState: claimed
241
+ ? 'claimed'
242
+ : tracksSettlementClaim
243
+ ? 'pending_claim'
244
+ : 'active',
93
245
  deltaCount: 0,
94
- claimed: extended.claimed,
246
+ claimed,
95
247
  };
96
248
  },
97
249
  catch: (e) => new ChainReadError(`Failed to read position: ${e instanceof Error ? e.message : 'Unknown'}`, e),
@@ -116,8 +268,12 @@ export const ChainReaderLive = (rpcUrl) => {
116
268
  probs,
117
269
  k: params?.k.toNumber() ?? null,
118
270
  effectiveK: params?.backing.toNumber() ?? null,
119
- totalShares: lpInfo?.totalShares.toRaw().limb0.toString() ?? null,
120
- totalBacking: lpInfo?.totalBackingDeposited.toRaw().limb0.toString() ?? null,
271
+ totalShares: lpInfo?.totalShares
272
+ ? sq128MagnitudeToString(lpInfo.totalShares.toRaw())
273
+ : null,
274
+ totalBacking: lpInfo?.totalBackingDeposited
275
+ ? sq128MagnitudeToString(lpInfo.totalBackingDeposited.toRaw())
276
+ : null,
121
277
  isInitialized: status.isInitialized,
122
278
  isPaused: status.isPaused,
123
279
  isSettled: status.isSettled,
@@ -137,7 +293,7 @@ export const ChainReaderLive = (rpcUrl) => {
137
293
  amm.getPositionSummary(trader),
138
294
  amm.getPositionCompact(trader),
139
295
  ]);
140
- if (!summary || !compact) {
296
+ if (!(summary && compact)) {
141
297
  return {
142
298
  exists: false,
143
299
  claimed: false,
@@ -154,7 +310,7 @@ export const ChainReaderLive = (rpcUrl) => {
154
310
  return {
155
311
  exists: summary.exists,
156
312
  claimed: summary.claimed,
157
- totalCollateralLocked: summary.totalCollateralLocked.toRaw().limb0.toString(),
313
+ totalCollateralLocked: sq128MagnitudeToString(summary.totalCollateralLocked.toRaw()),
158
314
  outcomeCount: summary.outcomeCount,
159
315
  originalProbs,
160
316
  settlementState: summary.claimed
@@ -166,6 +322,7 @@ export const ChainReaderLive = (rpcUrl) => {
166
322
  },
167
323
  catch: (e) => new ChainReadError(`Failed to read multinoulli position: ${e instanceof Error ? e.message : 'Unknown'}`, e),
168
324
  }),
169
- }));
170
- };
325
+ };
326
+ }
327
+ export const ChainReaderLive = (rpcUrl) => Layer.succeed(ChainReaderTag, ChainReaderTag.of(createChainReaderService(rpcUrl)));
171
328
  //# sourceMappingURL=ChainReaderLive.js.map