@the-situation/indexer 0.11.0 → 0.11.2

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 (108) hide show
  1. package/README.md +5 -1
  2. package/dist/api/app.d.ts +40 -0
  3. package/dist/api/app.d.ts.map +1 -1
  4. package/dist/api/app.js +2 -1
  5. package/dist/api/app.js.map +1 -1
  6. package/dist/api/routes/admin.d.ts.map +1 -1
  7. package/dist/api/routes/admin.js +16 -0
  8. package/dist/api/routes/admin.js.map +1 -1
  9. package/dist/api/routes/index.d.ts +1 -0
  10. package/dist/api/routes/index.d.ts.map +1 -1
  11. package/dist/api/routes/index.js +1 -0
  12. package/dist/api/routes/index.js.map +1 -1
  13. package/dist/api/routes/market-events.d.ts.map +1 -1
  14. package/dist/api/routes/market-events.js.map +1 -1
  15. package/dist/api/routes/market-traders.d.ts.map +1 -1
  16. package/dist/api/routes/market-traders.js +1 -0
  17. package/dist/api/routes/market-traders.js.map +1 -1
  18. package/dist/api/routes/multinoulli-snapshots.d.ts +78 -0
  19. package/dist/api/routes/multinoulli-snapshots.d.ts.map +1 -0
  20. package/dist/api/routes/multinoulli-snapshots.js +33 -0
  21. package/dist/api/routes/multinoulli-snapshots.js.map +1 -0
  22. package/dist/api/routes/positions.d.ts.map +1 -1
  23. package/dist/api/routes/positions.js +1 -0
  24. package/dist/api/routes/positions.js.map +1 -1
  25. package/dist/api/routes/trader-events.d.ts.map +1 -1
  26. package/dist/api/routes/trader-events.js.map +1 -1
  27. package/dist/client/IndexerClient.d.ts +2 -1
  28. package/dist/client/IndexerClient.d.ts.map +1 -1
  29. package/dist/client/IndexerClient.js.map +1 -1
  30. package/dist/client/IndexerClientLive.d.ts.map +1 -1
  31. package/dist/client/IndexerClientLive.js +7 -0
  32. package/dist/client/IndexerClientLive.js.map +1 -1
  33. package/dist/client/convenience.d.ts +1 -0
  34. package/dist/client/convenience.d.ts.map +1 -1
  35. package/dist/client/convenience.js +1 -0
  36. package/dist/client/convenience.js.map +1 -1
  37. package/dist/client/index.d.ts +2 -2
  38. package/dist/client/index.d.ts.map +1 -1
  39. package/dist/client/index.js +1 -1
  40. package/dist/client/index.js.map +1 -1
  41. package/dist/client/trader-stats.d.ts +2 -0
  42. package/dist/client/trader-stats.d.ts.map +1 -1
  43. package/dist/client/trader-stats.js +5 -1
  44. package/dist/client/trader-stats.js.map +1 -1
  45. package/dist/config.d.ts.map +1 -1
  46. package/dist/config.js +3 -2
  47. package/dist/config.js.map +1 -1
  48. package/dist/db/repositories/event.d.ts +2 -1
  49. package/dist/db/repositories/event.d.ts.map +1 -1
  50. package/dist/db/repositories/event.js +16 -12
  51. package/dist/db/repositories/event.js.map +1 -1
  52. package/dist/db/repositories/market-state.d.ts +2 -0
  53. package/dist/db/repositories/market-state.d.ts.map +1 -1
  54. package/dist/db/repositories/market-state.js +5 -3
  55. package/dist/db/repositories/market-state.js.map +1 -1
  56. package/dist/db/repositories/multinoulli-snapshots.d.ts +44 -0
  57. package/dist/db/repositories/multinoulli-snapshots.d.ts.map +1 -0
  58. package/dist/db/repositories/multinoulli-snapshots.js +54 -0
  59. package/dist/db/repositories/multinoulli-snapshots.js.map +1 -0
  60. package/dist/db/repositories/position.d.ts.map +1 -1
  61. package/dist/db/repositories/position.js +10 -3
  62. package/dist/db/repositories/position.js.map +1 -1
  63. package/dist/db/schema.d.ts.map +1 -1
  64. package/dist/db/schema.js +142 -1
  65. package/dist/db/schema.js.map +1 -1
  66. package/dist/etl/decoder.d.ts.map +1 -1
  67. package/dist/etl/decoder.js +195 -29
  68. package/dist/etl/decoder.js.map +1 -1
  69. package/dist/etl/event-indexer.d.ts +1 -1
  70. package/dist/etl/event-indexer.d.ts.map +1 -1
  71. package/dist/etl/event-indexer.js +16 -0
  72. package/dist/etl/event-indexer.js.map +1 -1
  73. package/dist/etl/position-refresher.d.ts +2 -2
  74. package/dist/etl/position-refresher.d.ts.map +1 -1
  75. package/dist/etl/position-refresher.js +80 -4
  76. package/dist/etl/position-refresher.js.map +1 -1
  77. package/dist/etl/state-refresher.d.ts +1 -1
  78. package/dist/etl/state-refresher.d.ts.map +1 -1
  79. package/dist/etl/state-refresher.js +18 -2
  80. package/dist/etl/state-refresher.js.map +1 -1
  81. package/dist/index.js +4 -175
  82. package/dist/index.js.map +1 -1
  83. package/dist/layers/ChainReaderLive.d.ts +2 -0
  84. package/dist/layers/ChainReaderLive.d.ts.map +1 -1
  85. package/dist/layers/ChainReaderLive.js +256 -63
  86. package/dist/layers/ChainReaderLive.js.map +1 -1
  87. package/dist/layers/DatabaseLive.d.ts.map +1 -1
  88. package/dist/layers/DatabaseLive.js +2 -0
  89. package/dist/layers/DatabaseLive.js.map +1 -1
  90. package/dist/layers/index.d.ts +1 -1
  91. package/dist/layers/index.d.ts.map +1 -1
  92. package/dist/layers/index.js +1 -1
  93. package/dist/layers/index.js.map +1 -1
  94. package/dist/services/ChainReader.d.ts +11 -3
  95. package/dist/services/ChainReader.d.ts.map +1 -1
  96. package/dist/services/ChainReader.js.map +1 -1
  97. package/dist/services/Database.d.ts +2 -0
  98. package/dist/services/Database.d.ts.map +1 -1
  99. package/dist/services/Database.js.map +1 -1
  100. package/dist/types/api.d.ts +12 -0
  101. package/dist/types/api.d.ts.map +1 -1
  102. package/dist/types/event.d.ts +16 -1
  103. package/dist/types/event.d.ts.map +1 -1
  104. package/dist/types/market.d.ts +7 -1
  105. package/dist/types/market.d.ts.map +1 -1
  106. package/dist/types/position.d.ts +10 -0
  107. package/dist/types/position.d.ts.map +1 -1
  108. package/package.json +3 -1
@@ -66,13 +66,17 @@ export const getFullTraderProfile = (trader) => Effect.flatMap(IndexerClient, (c
66
66
  rankings: client.getRankings({ limit: 200 }),
67
67
  activity: getTraderActivity(trader).pipe(Effect.provideService(IndexerClient, client)),
68
68
  }, { concurrency: 'unbounded' }).pipe(Effect.map(({ stats, positions, rankings, activity }) => {
69
- const ranking = rankings.find((r) => r.trader.toLowerCase() === trader.toLowerCase()) ?? null;
69
+ const rankingsArray = rankings;
70
+ const rankIndex = rankingsArray.findIndex((r) => r.trader.toLowerCase() === trader.toLowerCase());
71
+ const ranking = rankIndex >= 0 ? rankingsArray[rankIndex] : null;
72
+ const rank = rankIndex >= 0 ? rankIndex + 1 : null;
70
73
  const pnlHistory = computePnlHistory(activity);
71
74
  return {
72
75
  trader,
73
76
  stats,
74
77
  positions,
75
78
  ranking,
79
+ rank,
76
80
  recentActivity: activity,
77
81
  pnlHistory,
78
82
  };
@@ -1 +1 @@
1
- {"version":3,"file":"trader-stats.js","sourceRoot":"","sources":["../../src/client/trader-stats.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trader-stats.js","sourceRoot":"","sources":["../../src/client/trader-stats.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,2BAA2B,EAAE,MAAM,CAAC;CAC9C;AAED,wBAAgB,UAAU,IAAI,aAAa,CAkB1C"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,2BAA2B,EAAE,MAAM,CAAC;CAC9C;AAED,wBAAgB,UAAU,IAAI,aAAa,CAqB1C"}
package/dist/config.js CHANGED
@@ -4,12 +4,13 @@
4
4
  export function loadConfig() {
5
5
  const voyagerApiKey = requireEnv('VOYAGER_API_KEY');
6
6
  const adminApiKey = requireEnv('ADMIN_API_KEY');
7
+ const env = process.env;
7
8
  return {
8
9
  voyagerApiKey,
9
10
  adminApiKey,
10
- dbPath: process.env['DB_PATH'] ?? './data/indexer.db',
11
+ dbPath: env.DB_PATH ?? './data/indexer.db',
11
12
  port: envInt('PORT', 3000),
12
- starknetRpcUrl: process.env['STARKNET_RPC_URL'] ?? 'https://api.cartridge.gg/x/starknet/sepolia',
13
+ starknetRpcUrl: env.STARKNET_RPC_URL ?? 'https://api.cartridge.gg/x/starknet/sepolia',
13
14
  eventPollIntervalMs: envInt('EVENT_POLL_INTERVAL_MS', 15000),
14
15
  statePollIntervalMs: envInt('STATE_POLL_INTERVAL_MS', 30000),
15
16
  positionPollIntervalMs: envInt('POSITION_POLL_INTERVAL_MS', 60000),
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,MAAM,UAAU,UAAU;IACxB,MAAM,aAAa,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAEhD,OAAO;QACL,aAAa;QACb,WAAW;QACX,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,mBAAmB;QACrD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;QAC1B,cAAc,EACZ,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,6CAA6C;QAClF,mBAAmB,EAAE,MAAM,CAAC,wBAAwB,EAAE,KAAK,CAAC;QAC5D,mBAAmB,EAAE,MAAM,CAAC,wBAAwB,EAAE,KAAK,CAAC;QAC5D,sBAAsB,EAAE,MAAM,CAAC,2BAA2B,EAAE,KAAK,CAAC;QAClE,iBAAiB,EAAE,MAAM,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACnD,kBAAkB,EAAE,MAAM,CAAC,uBAAuB,EAAE,IAAI,CAAC;QACzD,2BAA2B,EAAE,MAAM,CAAC,iCAAiC,EAAE,GAAG,CAAC;KAC5E,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,MAAM,CAAC,IAAY,EAAE,QAAgB;IAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,MAAM,GAAG,GAAG,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,MAAM,UAAU,UAAU;IACxB,MAAM,aAAa,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,OAAO,CAAC,GAGnB,CAAC;IAEF,OAAO;QACL,aAAa;QACb,WAAW;QACX,MAAM,EAAE,GAAG,CAAC,OAAO,IAAI,mBAAmB;QAC1C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;QAC1B,cAAc,EAAE,GAAG,CAAC,gBAAgB,IAAI,6CAA6C;QACrF,mBAAmB,EAAE,MAAM,CAAC,wBAAwB,EAAE,KAAK,CAAC;QAC5D,mBAAmB,EAAE,MAAM,CAAC,wBAAwB,EAAE,KAAK,CAAC;QAC5D,sBAAsB,EAAE,MAAM,CAAC,2BAA2B,EAAE,KAAK,CAAC;QAClE,iBAAiB,EAAE,MAAM,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACnD,kBAAkB,EAAE,MAAM,CAAC,uBAAuB,EAAE,IAAI,CAAC;QACzD,2BAA2B,EAAE,MAAM,CAAC,iCAAiC,EAAE,GAAG,CAAC;KAC5E,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,0CAA0C,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,MAAM,CAAC,IAAY,EAAE,QAAgB;IAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,MAAM,GAAG,GAAG,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,11 +1,12 @@
1
1
  /**
2
- * Event insert (dedup by tx_hash UNIQUE) + queries.
2
+ * Event insert (dedup by event_uid UNIQUE) + queries.
3
3
  */
4
4
  import type { Database } from 'bun:sqlite';
5
5
  import type { InsertEventInput, MarketEventRow } from '../../types';
6
6
  export declare class EventRepository {
7
7
  private readonly db;
8
8
  constructor(db: Database);
9
+ private runInsert;
9
10
  insert(input: InsertEventInput): boolean;
10
11
  insertBatch(inputs: readonly InsertEventInput[]): number;
11
12
  findByMarket(marketAddress: string, options?: {
@@ -1 +1 @@
1
- {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../../src/db/repositories/event.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEpE,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEzC,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO;IAuCxC,WAAW,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,GAAG,MAAM;IA2CxD,YAAY,CACV,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE;QACP,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC5B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACnC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC7B,GACL,cAAc,EAAE;IA0BnB,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;IAO5C,UAAU,IAAI,MAAM;IAKpB,YAAY,CACV,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;QACP,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC5B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACnC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC7B,GACL,CAAC,cAAc,GAAG;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE;IA4BhD,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAOrC,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE;CAUrD"}
1
+ {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../../src/db/repositories/event.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEpE,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEzC,OAAO,CAAC,SAAS;IA6BjB,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO;IAmBxC,WAAW,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,GAAG,MAAM;IAuBxD,YAAY,CACV,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE;QACP,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC5B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACnC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC7B,GACL,cAAc,EAAE;IA0BnB,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;IAO5C,UAAU,IAAI,MAAM;IAKpB,YAAY,CACV,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;QACP,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC5B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACnC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC7B,GACL,CAAC,cAAc,GAAG;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE;IA4BhD,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAOrC,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE;CAUrD"}
@@ -3,17 +3,21 @@ export class EventRepository {
3
3
  constructor(db) {
4
4
  this.db = db;
5
5
  }
6
+ runInsert(stmt, input) {
7
+ const result = stmt.run(input.market_address, input.event_uid, input.tx_hash, input.block_number, input.timestamp, input.event_type, input.trader, input.mean, input.std_dev, input.lower_bound, input.upper_bound, input.old_mean, input.old_std_dev, input.collateral_posted, input.raw_data, input.outcome_count ?? null, input.min_outcome_index ?? null, input.is_position_sell != null ? (input.is_position_sell ? 1 : 0) : null, input.settlement_outcome_index ?? null, input.settlement_outcomes_json ?? null, input.settlement_value ?? null, input.settlement_x1 ?? null, input.settlement_x2 ?? null);
8
+ return result.changes;
9
+ }
6
10
  insert(input) {
7
11
  try {
8
- this.db
9
- .query(`INSERT OR IGNORE INTO market_events
10
- (market_address, tx_hash, block_number, timestamp, event_type,
12
+ const stmt = this.db.query(`INSERT OR IGNORE INTO market_events
13
+ (market_address, event_uid, tx_hash, block_number, timestamp, event_type,
11
14
  trader, mean, std_dev, lower_bound, upper_bound,
12
15
  old_mean, old_std_dev, collateral_posted, raw_data,
13
16
  outcome_count, min_outcome_index, is_position_sell,
14
- settlement_outcome_index, settlement_outcomes_json)
15
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
16
- .run(input.market_address, input.tx_hash, input.block_number, input.timestamp, input.event_type, input.trader, input.mean, input.std_dev, input.lower_bound, input.upper_bound, input.old_mean, input.old_std_dev, input.collateral_posted, input.raw_data, input.outcome_count ?? null, input.min_outcome_index ?? null, input.is_position_sell != null ? (input.is_position_sell ? 1 : 0) : null, input.settlement_outcome_index ?? null, input.settlement_outcomes_json ?? null);
17
+ settlement_outcome_index, settlement_outcomes_json,
18
+ settlement_value, settlement_x1, settlement_x2)
19
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
20
+ this.runInsert(stmt, input);
17
21
  return true;
18
22
  }
19
23
  catch {
@@ -23,16 +27,16 @@ export class EventRepository {
23
27
  insertBatch(inputs) {
24
28
  let inserted = 0;
25
29
  const stmt = this.db.query(`INSERT OR IGNORE INTO market_events
26
- (market_address, tx_hash, block_number, timestamp, event_type,
30
+ (market_address, event_uid, tx_hash, block_number, timestamp, event_type,
27
31
  trader, mean, std_dev, lower_bound, upper_bound,
28
32
  old_mean, old_std_dev, collateral_posted, raw_data,
29
33
  outcome_count, min_outcome_index, is_position_sell,
30
- settlement_outcome_index, settlement_outcomes_json)
31
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
34
+ settlement_outcome_index, settlement_outcomes_json,
35
+ settlement_value, settlement_x1, settlement_x2)
36
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
32
37
  const tx = this.db.transaction(() => {
33
38
  for (const input of inputs) {
34
- const result = stmt.run(input.market_address, input.tx_hash, input.block_number, input.timestamp, input.event_type, input.trader, input.mean, input.std_dev, input.lower_bound, input.upper_bound, input.old_mean, input.old_std_dev, input.collateral_posted, input.raw_data, input.outcome_count ?? null, input.min_outcome_index ?? null, input.is_position_sell != null ? (input.is_position_sell ? 1 : 0) : null, input.settlement_outcome_index ?? null, input.settlement_outcomes_json ?? null);
35
- inserted += result.changes;
39
+ inserted += this.runInsert(stmt, input);
36
40
  }
37
41
  });
38
42
  tx();
@@ -54,7 +58,7 @@ export class EventRepository {
54
58
  return this.db
55
59
  .query(`SELECT * FROM market_events
56
60
  WHERE ${conditions.join(' AND ')}
57
- ORDER BY block_number ASC, timestamp ASC
61
+ ORDER BY block_number ASC, timestamp ASC, id ASC
58
62
  LIMIT ? OFFSET ?`)
59
63
  .all(...params);
60
64
  }
@@ -1 +1 @@
1
- {"version":3,"file":"event.js","sourceRoot":"","sources":["../../../src/db/repositories/event.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"event.js","sourceRoot":"","sources":["../../../src/db/repositories/event.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,8 @@ export interface UpsertMarketStateInput {
17
17
  readonly mean_raw: string | null;
18
18
  readonly sigma_raw: string | null;
19
19
  readonly variance_raw: string | null;
20
+ readonly k: number | null;
21
+ readonly effective_k: number | null;
20
22
  }
21
23
  export declare class MarketStateRepository {
22
24
  private readonly db;
@@ -1 +1 @@
1
- {"version":3,"file":"market-state.d.ts","sourceRoot":"","sources":["../../../src/db/repositories/market-state.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AAED,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEzC,MAAM,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI;IAwC3C,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAQ1D,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC;CAQ5C"}
1
+ {"version":3,"file":"market-state.d.ts","sourceRoot":"","sources":["../../../src/db/repositories/market-state.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEzC,MAAM,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI;IA4C3C,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAQ1D,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC;CAQ5C"}
@@ -8,8 +8,8 @@ export class MarketStateRepository {
8
8
  .query(`INSERT INTO market_state
9
9
  (market_address, mean, sigma, variance, is_initialized, is_paused,
10
10
  is_settled, settlement_value, total_shares, total_backing,
11
- mean_raw, sigma_raw, variance_raw, fetched_at)
12
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, unixepoch())
11
+ mean_raw, sigma_raw, variance_raw, k, effective_k, fetched_at)
12
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, unixepoch())
13
13
  ON CONFLICT(market_address) DO UPDATE SET
14
14
  mean = excluded.mean,
15
15
  sigma = excluded.sigma,
@@ -23,8 +23,10 @@ export class MarketStateRepository {
23
23
  mean_raw = excluded.mean_raw,
24
24
  sigma_raw = excluded.sigma_raw,
25
25
  variance_raw = excluded.variance_raw,
26
+ k = excluded.k,
27
+ effective_k = excluded.effective_k,
26
28
  fetched_at = unixepoch()`)
27
- .run(input.market_address, input.mean, input.sigma, input.variance, input.is_initialized ? 1 : 0, input.is_paused ? 1 : 0, input.is_settled ? 1 : 0, input.settlement_value, input.total_shares, input.total_backing, input.mean_raw, input.sigma_raw, input.variance_raw);
29
+ .run(input.market_address, input.mean, input.sigma, input.variance, input.is_initialized ? 1 : 0, input.is_paused ? 1 : 0, input.is_settled ? 1 : 0, input.settlement_value, input.total_shares, input.total_backing, input.mean_raw, input.sigma_raw, input.variance_raw, input.k, input.effective_k);
28
30
  }
29
31
  findByMarket(marketAddress) {
30
32
  return (this.db
@@ -1 +1 @@
1
- {"version":3,"file":"market-state.js","sourceRoot":"","sources":["../../../src/db/repositories/market-state.ts"],"names":[],"mappings":"AAsBA,MAAM,OAAO,qBAAqB;IACH;IAA7B,YAA6B,EAAY;QAAZ,OAAE,GAAF,EAAE,CAAU;IAAG,CAAC;IAE7C,MAAM,CAAC,KAA6B;QAClC,IAAI,CAAC,EAAE;aACJ,KAAK,CACJ;;;;;;;;;;;;;;;;;;oCAkB4B,CAC7B;aACA,GAAG,CACF,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC5B,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACvB,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACxB,KAAK,CAAC,gBAAgB,EACtB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,YAAY,CACnB,CAAC;IACN,CAAC;IAED,YAAY,CAAC,aAAqB;QAChC,OAAO,CACJ,IAAI,CAAC,EAAE;aACL,KAAK,CAAC,qDAAqD,CAAC;aAC5D,GAAG,CAAC,aAAa,CAA2B,IAAI,IAAI,CACxD,CAAC;IACJ,CAAC;IAED,YAAY;QACV,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,GAAG,EAAsB,CAAC;QACnF,MAAM,GAAG,GAAG,IAAI,GAAG,EAA0B,CAAC;QAC9C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
1
+ {"version":3,"file":"market-state.js","sourceRoot":"","sources":["../../../src/db/repositories/market-state.ts"],"names":[],"mappings":"AAwBA,MAAM,OAAO,qBAAqB;IACH;IAA7B,YAA6B,EAAY;QAAZ,OAAE,GAAF,EAAE,CAAU;IAAG,CAAC;IAE7C,MAAM,CAAC,KAA6B;QAClC,IAAI,CAAC,EAAE;aACJ,KAAK,CACJ;;;;;;;;;;;;;;;;;;;;oCAoB4B,CAC7B;aACA,GAAG,CACF,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC5B,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACvB,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACxB,KAAK,CAAC,gBAAgB,EACtB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,CAAC,EACP,KAAK,CAAC,WAAW,CAClB,CAAC;IACN,CAAC;IAED,YAAY,CAAC,aAAqB;QAChC,OAAO,CACJ,IAAI,CAAC,EAAE;aACL,KAAK,CAAC,qDAAqD,CAAC;aAC5D,GAAG,CAAC,aAAa,CAA2B,IAAI,IAAI,CACxD,CAAC;IACJ,CAAC;IAED,YAAY;QACV,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,GAAG,EAAsB,CAAC;QACnF,MAAM,GAAG,GAAG,IAAI,GAAG,EAA0B,CAAC;QAC9C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Multinoulli state snapshots — historical probability vectors for time series.
3
+ *
4
+ * A new row is inserted each time the state refresher detects a probability
5
+ * change (via probs_hash), giving the frontend a time series of probability
6
+ * vectors without needing per-event RPC calls.
7
+ */
8
+ import type { Database } from 'bun:sqlite';
9
+ export interface MultinoulliSnapshotRow {
10
+ readonly id: number;
11
+ readonly market_address: string;
12
+ readonly timestamp: number;
13
+ readonly probs_json: string;
14
+ readonly probs_hash: string;
15
+ readonly outcome_count: number;
16
+ readonly matrix_rows: number;
17
+ readonly matrix_cols: number;
18
+ }
19
+ export interface InsertSnapshotInput {
20
+ readonly market_address: string;
21
+ readonly probs_json: string;
22
+ readonly probs_hash: string;
23
+ readonly outcome_count: number;
24
+ readonly matrix_rows: number;
25
+ readonly matrix_cols: number;
26
+ }
27
+ export declare class MultinoulliSnapshotsRepository {
28
+ private readonly db;
29
+ constructor(db: Database);
30
+ /**
31
+ * Insert a snapshot only if the probs have changed since the last one.
32
+ * Uses probs_hash to deduplicate — if the hash matches the latest
33
+ * snapshot for this market, the insert is skipped.
34
+ */
35
+ insertIfChanged(input: InsertSnapshotInput): boolean;
36
+ /**
37
+ * Get all snapshots for a market, ordered by timestamp ascending.
38
+ * Optionally limited to the most recent N snapshots.
39
+ */
40
+ findByMarket(marketAddress: string, limit?: number): MultinoulliSnapshotRow[];
41
+ /** Count snapshots for a market */
42
+ countByMarket(marketAddress: string): number;
43
+ }
44
+ //# sourceMappingURL=multinoulli-snapshots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multinoulli-snapshots.d.ts","sourceRoot":"","sources":["../../../src/db/repositories/multinoulli-snapshots.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,qBAAa,8BAA8B;IAC7B,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEzC;;;;OAIG;IACH,eAAe,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO;IA+BpD;;;OAGG;IACH,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,sBAAsB,EAAE;IAiB7E,mCAAmC;IACnC,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;CAM7C"}
@@ -0,0 +1,54 @@
1
+ export class MultinoulliSnapshotsRepository {
2
+ db;
3
+ constructor(db) {
4
+ this.db = db;
5
+ }
6
+ /**
7
+ * Insert a snapshot only if the probs have changed since the last one.
8
+ * Uses probs_hash to deduplicate — if the hash matches the latest
9
+ * snapshot for this market, the insert is skipped.
10
+ */
11
+ insertIfChanged(input) {
12
+ const latest = this.db
13
+ .query(`SELECT probs_hash FROM multinoulli_state_snapshots
14
+ WHERE market_address = ?
15
+ ORDER BY timestamp DESC LIMIT 1`)
16
+ .get(input.market_address);
17
+ if (latest?.probs_hash === input.probs_hash) {
18
+ return false; // No change — skip
19
+ }
20
+ this.db
21
+ .query(`INSERT INTO multinoulli_state_snapshots
22
+ (market_address, probs_json, probs_hash, outcome_count, matrix_rows, matrix_cols)
23
+ VALUES (?, ?, ?, ?, ?, ?)`)
24
+ .run(input.market_address, input.probs_json, input.probs_hash, input.outcome_count, input.matrix_rows, input.matrix_cols);
25
+ return true;
26
+ }
27
+ /**
28
+ * Get all snapshots for a market, ordered by timestamp ascending.
29
+ * Optionally limited to the most recent N snapshots.
30
+ */
31
+ findByMarket(marketAddress, limit) {
32
+ const sql = limit
33
+ ? `SELECT * FROM (
34
+ SELECT * FROM multinoulli_state_snapshots
35
+ WHERE market_address = ?
36
+ ORDER BY timestamp DESC
37
+ LIMIT ?
38
+ ) sub ORDER BY timestamp ASC`
39
+ : `SELECT * FROM multinoulli_state_snapshots
40
+ WHERE market_address = ?
41
+ ORDER BY timestamp ASC`;
42
+ return limit
43
+ ? this.db.query(sql).all(marketAddress, limit)
44
+ : this.db.query(sql).all(marketAddress);
45
+ }
46
+ /** Count snapshots for a market */
47
+ countByMarket(marketAddress) {
48
+ const row = this.db
49
+ .query('SELECT COUNT(*) as count FROM multinoulli_state_snapshots WHERE market_address = ?')
50
+ .get(marketAddress);
51
+ return row.count;
52
+ }
53
+ }
54
+ //# sourceMappingURL=multinoulli-snapshots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multinoulli-snapshots.js","sourceRoot":"","sources":["../../../src/db/repositories/multinoulli-snapshots.ts"],"names":[],"mappings":"AA6BA,MAAM,OAAO,8BAA8B;IACZ;IAA7B,YAA6B,EAAY;QAAZ,OAAE,GAAF,EAAE,CAAU;IAAG,CAAC;IAE7C;;;;OAIG;IACH,eAAe,CAAC,KAA0B;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;aACnB,KAAK,CACJ;;yCAEiC,CAClC;aACA,GAAG,CAAC,KAAK,CAAC,cAAc,CAAkC,CAAC;QAE9D,IAAI,MAAM,EAAE,UAAU,KAAK,KAAK,CAAC,UAAU,EAAE,CAAC;YAC5C,OAAO,KAAK,CAAC,CAAC,mBAAmB;QACnC,CAAC;QAED,IAAI,CAAC,EAAE;aACJ,KAAK,CACJ;;mCAE2B,CAC5B;aACA,GAAG,CACF,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,WAAW,CAClB,CAAC;QAEJ,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,aAAqB,EAAE,KAAc;QAChD,MAAM,GAAG,GAAG,KAAK;YACf,CAAC,CAAC;;;;;sCAK8B;YAChC,CAAC,CAAC;;gCAEwB,CAAC;QAE7B,OAAO,KAAK;YACV,CAAC,CAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAA8B;YAC5E,CAAC,CAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,aAAa,CAA8B,CAAC;IAC1E,CAAC;IAED,mCAAmC;IACnC,aAAa,CAAC,aAAqB;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE;aAChB,KAAK,CAAC,oFAAoF,CAAC;aAC3F,GAAG,CAAC,aAAa,CAAsB,CAAC;QAC3C,OAAO,GAAG,CAAC,KAAK,CAAC;IACnB,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"position.d.ts","sourceRoot":"","sources":["../../../src/db/repositories/position.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAExE,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEzC,MAAM,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IA4CxC,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IASzD,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,eAAe,EAAE;IAUtD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,EAAE;IAU/C,OAAO,IAAI,eAAe,EAAE;IAM5B,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;CAM9C"}
1
+ {"version":3,"file":"position.d.ts","sourceRoot":"","sources":["../../../src/db/repositories/position.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAExE,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEzC,MAAM,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI;IAwDxC,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IASzD,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,eAAe,EAAE;IAUtD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,EAAE;IAU/C,OAAO,IAAI,eAAe,EAAE;IAM5B,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;CAM9C"}
@@ -9,8 +9,10 @@ export class PositionRepository {
9
9
  (market_address, trader, has_position, collateral_locked,
10
10
  mean, sigma, variance, settlement_state, unrealized_pnl,
11
11
  delta_count, claimed, position_type, outcome_count,
12
- original_probs_json, collateral_locked_raw, fetched_at)
13
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, unixepoch())
12
+ original_probs_json, collateral_locked_raw,
13
+ expected_value, effective_mean, effective_sigma, effective_variance,
14
+ effective_probs_json, fetched_at)
15
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, unixepoch())
14
16
  ON CONFLICT(market_address, trader) DO UPDATE SET
15
17
  has_position = excluded.has_position,
16
18
  collateral_locked = excluded.collateral_locked,
@@ -25,8 +27,13 @@ export class PositionRepository {
25
27
  outcome_count = excluded.outcome_count,
26
28
  original_probs_json = excluded.original_probs_json,
27
29
  collateral_locked_raw = excluded.collateral_locked_raw,
30
+ expected_value = excluded.expected_value,
31
+ effective_mean = excluded.effective_mean,
32
+ effective_sigma = excluded.effective_sigma,
33
+ effective_variance = excluded.effective_variance,
34
+ effective_probs_json = excluded.effective_probs_json,
28
35
  fetched_at = unixepoch()`)
29
- .run(input.market_address, input.trader, input.has_position ? 1 : 0, input.collateral_locked ?? null, input.mean ?? null, input.sigma ?? null, input.variance ?? null, input.settlement_state ?? 'unknown', input.unrealized_pnl ?? null, input.delta_count ?? 0, input.claimed ? 1 : 0, input.position_type ?? 'normal', input.outcome_count ?? null, input.original_probs_json ?? null, input.collateral_locked_raw ?? null);
36
+ .run(input.market_address, input.trader, input.has_position ? 1 : 0, input.collateral_locked ?? null, input.mean ?? null, input.sigma ?? null, input.variance ?? null, input.settlement_state ?? 'unknown', input.unrealized_pnl ?? null, input.delta_count ?? 0, input.claimed ? 1 : 0, input.position_type ?? 'normal', input.outcome_count ?? null, input.original_probs_json ?? null, input.collateral_locked_raw ?? null, input.expected_value ?? null, input.effective_mean ?? null, input.effective_sigma ?? null, input.effective_variance ?? null, input.effective_probs_json ?? null);
30
37
  }
31
38
  ensureTrader(marketAddress, trader) {
32
39
  this.db
@@ -1 +1 @@
1
- {"version":3,"file":"position.js","sourceRoot":"","sources":["../../../src/db/repositories/position.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,kBAAkB;IACA;IAA7B,YAA6B,EAAY;QAAZ,OAAE,GAAF,EAAE,CAAU;IAAG,CAAC;IAE7C,MAAM,CAAC,KAA0B;QAC/B,IAAI,CAAC,EAAE;aACJ,KAAK,CACJ;;;;;;;;;;;;;;;;;;;;oCAoB4B,CAC7B;aACA,GAAG,CACF,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC1B,KAAK,CAAC,iBAAiB,IAAI,IAAI,EAC/B,KAAK,CAAC,IAAI,IAAI,IAAI,EAClB,KAAK,CAAC,KAAK,IAAI,IAAI,EACnB,KAAK,CAAC,QAAQ,IAAI,IAAI,EACtB,KAAK,CAAC,gBAAgB,IAAI,SAAS,EACnC,KAAK,CAAC,cAAc,IAAI,IAAI,EAC5B,KAAK,CAAC,WAAW,IAAI,CAAC,EACtB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACrB,KAAK,CAAC,aAAa,IAAI,QAAQ,EAC/B,KAAK,CAAC,aAAa,IAAI,IAAI,EAC3B,KAAK,CAAC,mBAAmB,IAAI,IAAI,EACjC,KAAK,CAAC,qBAAqB,IAAI,IAAI,CACpC,CAAC;IACN,CAAC;IAED,YAAY,CAAC,aAAqB,EAAE,MAAc;QAChD,IAAI,CAAC,EAAE;aACJ,KAAK,CACJ;uBACe,CAChB;aACA,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,YAAY,CAAC,aAAqB;QAChC,OAAO,IAAI,CAAC,EAAE;aACX,KAAK,CACJ;;yBAEiB,CAClB;aACA,GAAG,CAAC,aAAa,CAAsB,CAAC;IAC7C,CAAC;IAED,YAAY,CAAC,MAAc;QACzB,OAAO,IAAI,CAAC,EAAE;aACX,KAAK,CACJ;;iCAEyB,CAC1B;aACA,GAAG,CAAC,MAAM,CAAsB,CAAC;IACtC,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,EAAE;aACX,KAAK,CAAC,8DAA8D,CAAC;aACrE,GAAG,EAAuB,CAAC;IAChC,CAAC;IAED,cAAc,CAAC,aAAqB;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;aACnB,KAAK,CAAC,qDAAqD,CAAC;aAC5D,GAAG,CAAC,aAAa,CAAC,CAAC;QACtB,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;CACF"}
1
+ {"version":3,"file":"position.js","sourceRoot":"","sources":["../../../src/db/repositories/position.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,kBAAkB;IACA;IAA7B,YAA6B,EAAY;QAAZ,OAAE,GAAF,EAAE,CAAU;IAAG,CAAC;IAE7C,MAAM,CAAC,KAA0B;QAC/B,IAAI,CAAC,EAAE;aACJ,KAAK,CACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;oCA2B4B,CAC7B;aACA,GAAG,CACF,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC1B,KAAK,CAAC,iBAAiB,IAAI,IAAI,EAC/B,KAAK,CAAC,IAAI,IAAI,IAAI,EAClB,KAAK,CAAC,KAAK,IAAI,IAAI,EACnB,KAAK,CAAC,QAAQ,IAAI,IAAI,EACtB,KAAK,CAAC,gBAAgB,IAAI,SAAS,EACnC,KAAK,CAAC,cAAc,IAAI,IAAI,EAC5B,KAAK,CAAC,WAAW,IAAI,CAAC,EACtB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACrB,KAAK,CAAC,aAAa,IAAI,QAAQ,EAC/B,KAAK,CAAC,aAAa,IAAI,IAAI,EAC3B,KAAK,CAAC,mBAAmB,IAAI,IAAI,EACjC,KAAK,CAAC,qBAAqB,IAAI,IAAI,EACnC,KAAK,CAAC,cAAc,IAAI,IAAI,EAC5B,KAAK,CAAC,cAAc,IAAI,IAAI,EAC5B,KAAK,CAAC,eAAe,IAAI,IAAI,EAC7B,KAAK,CAAC,kBAAkB,IAAI,IAAI,EAChC,KAAK,CAAC,oBAAoB,IAAI,IAAI,CACnC,CAAC;IACN,CAAC;IAED,YAAY,CAAC,aAAqB,EAAE,MAAc;QAChD,IAAI,CAAC,EAAE;aACJ,KAAK,CACJ;uBACe,CAChB;aACA,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,YAAY,CAAC,aAAqB;QAChC,OAAO,IAAI,CAAC,EAAE;aACX,KAAK,CACJ;;yBAEiB,CAClB;aACA,GAAG,CAAC,aAAa,CAAsB,CAAC;IAC7C,CAAC;IAED,YAAY,CAAC,MAAc;QACzB,OAAO,IAAI,CAAC,EAAE;aACX,KAAK,CACJ;;iCAEyB,CAC1B;aACA,GAAG,CAAC,MAAM,CAAsB,CAAC;IACtC,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,EAAE;aACX,KAAK,CAAC,8DAA8D,CAAC;aACrE,GAAG,EAAuB,CAAC;IAChC,CAAC;IAED,cAAc,CAAC,aAAqB;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;aACnB,KAAK,CAAC,qDAAqD,CAAC;aAC5D,GAAG,CAAC,aAAa,CAAC,CAAC;QACtB,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAwI3C,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAsBnD"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA4R3C,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAsCnD"}
package/dist/db/schema.js CHANGED
@@ -31,6 +31,8 @@ CREATE TABLE IF NOT EXISTS market_state (
31
31
  mean_raw TEXT,
32
32
  sigma_raw TEXT,
33
33
  variance_raw TEXT,
34
+ k REAL,
35
+ effective_k REAL,
34
36
  fetched_at INTEGER NOT NULL DEFAULT (unixepoch())
35
37
  );
36
38
 
@@ -56,7 +58,8 @@ CREATE TABLE IF NOT EXISTS multinoulli_market_state (
56
58
  CREATE TABLE IF NOT EXISTS market_events (
57
59
  id INTEGER PRIMARY KEY AUTOINCREMENT,
58
60
  market_address TEXT NOT NULL REFERENCES markets(address),
59
- tx_hash TEXT NOT NULL UNIQUE,
61
+ event_uid TEXT NOT NULL UNIQUE,
62
+ tx_hash TEXT NOT NULL,
60
63
  block_number INTEGER NOT NULL,
61
64
  timestamp INTEGER NOT NULL,
62
65
  event_type TEXT NOT NULL,
@@ -74,6 +77,9 @@ CREATE TABLE IF NOT EXISTS market_events (
74
77
  is_position_sell INTEGER,
75
78
  settlement_outcome_index INTEGER,
76
79
  settlement_outcomes_json TEXT,
80
+ settlement_value REAL,
81
+ settlement_x1 REAL,
82
+ settlement_x2 REAL,
77
83
  created_at INTEGER NOT NULL DEFAULT (unixepoch())
78
84
  );
79
85
 
@@ -83,6 +89,9 @@ CREATE INDEX IF NOT EXISTS idx_events_market_block
83
89
  CREATE INDEX IF NOT EXISTS idx_events_trader
84
90
  ON market_events(trader) WHERE trader IS NOT NULL;
85
91
 
92
+ CREATE INDEX IF NOT EXISTS idx_events_trader_ts
93
+ ON market_events(trader, timestamp DESC) WHERE trader IS NOT NULL;
94
+
86
95
  CREATE INDEX IF NOT EXISTS idx_events_market_ts
87
96
  ON market_events(market_address, timestamp);
88
97
 
@@ -102,6 +111,11 @@ CREATE TABLE IF NOT EXISTS user_positions (
102
111
  outcome_count INTEGER,
103
112
  original_probs_json TEXT,
104
113
  collateral_locked_raw TEXT,
114
+ expected_value REAL,
115
+ effective_mean REAL,
116
+ effective_sigma REAL,
117
+ effective_variance REAL,
118
+ effective_probs_json TEXT,
105
119
  fetched_at INTEGER NOT NULL DEFAULT (unixepoch()),
106
120
  PRIMARY KEY (market_address, trader)
107
121
  );
@@ -112,6 +126,20 @@ CREATE INDEX IF NOT EXISTS idx_positions_trader
112
126
  CREATE INDEX IF NOT EXISTS idx_markets_active
113
127
  ON markets(is_active) WHERE is_active = 1;
114
128
 
129
+ CREATE TABLE IF NOT EXISTS multinoulli_state_snapshots (
130
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
131
+ market_address TEXT NOT NULL REFERENCES markets(address),
132
+ timestamp INTEGER NOT NULL DEFAULT (unixepoch()),
133
+ probs_json TEXT NOT NULL,
134
+ probs_hash TEXT NOT NULL,
135
+ outcome_count INTEGER NOT NULL,
136
+ matrix_rows INTEGER DEFAULT 0,
137
+ matrix_cols INTEGER DEFAULT 0
138
+ );
139
+
140
+ CREATE INDEX IF NOT EXISTS idx_multinoulli_snapshots_market_ts
141
+ ON multinoulli_state_snapshots(market_address, timestamp);
142
+
115
143
  CREATE TABLE IF NOT EXISTS indexer_cursors (
116
144
  market_address TEXT PRIMARY KEY REFERENCES markets(address),
117
145
  last_block_number INTEGER NOT NULL DEFAULT 0,
@@ -131,19 +159,130 @@ function safeAddColumn(db, table, column, definition) {
131
159
  // Column already exists — ignore
132
160
  }
133
161
  }
162
+ function tableColumns(db, table) {
163
+ const rows = db.query(`PRAGMA table_info(${table})`).all();
164
+ return new Set(rows.map((r) => r.name));
165
+ }
166
+ function hasUniqueSingleColumnIndex(db, table, column) {
167
+ const indexes = db.query(`PRAGMA index_list(${table})`).all();
168
+ for (const idx of indexes) {
169
+ if (idx.unique !== 1) {
170
+ continue;
171
+ }
172
+ const cols = db.query(`PRAGMA index_info(${idx.name})`).all();
173
+ if (cols.length === 1 && cols[0]?.name === column) {
174
+ return true;
175
+ }
176
+ }
177
+ return false;
178
+ }
179
+ function migrateMarketEventsTable(db) {
180
+ const columns = tableColumns(db, 'market_events');
181
+ const hasEventUid = columns.has('event_uid');
182
+ const hasLegacyUniqueTxHash = hasUniqueSingleColumnIndex(db, 'market_events', 'tx_hash');
183
+ if (hasEventUid && !hasLegacyUniqueTxHash) {
184
+ return;
185
+ }
186
+ const hasSettlementValue = columns.has('settlement_value');
187
+ const hasSettlementX1 = columns.has('settlement_x1');
188
+ const hasSettlementX2 = columns.has('settlement_x2');
189
+ const eventUidExpr = hasEventUid
190
+ ? "COALESCE(event_uid, tx_hash || ':' || CAST(id AS TEXT))"
191
+ : "tx_hash || ':' || CAST(id AS TEXT)";
192
+ const settlementValueExpr = hasSettlementValue ? 'settlement_value' : 'NULL';
193
+ const settlementX1Expr = hasSettlementX1 ? 'settlement_x1' : 'NULL';
194
+ const settlementX2Expr = hasSettlementX2 ? 'settlement_x2' : 'NULL';
195
+ db.exec('PRAGMA foreign_keys = OFF');
196
+ db.exec('BEGIN');
197
+ try {
198
+ db.exec(`
199
+ CREATE TABLE IF NOT EXISTS market_events_v2 (
200
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
201
+ market_address TEXT NOT NULL REFERENCES markets(address),
202
+ event_uid TEXT NOT NULL UNIQUE,
203
+ tx_hash TEXT NOT NULL,
204
+ block_number INTEGER NOT NULL,
205
+ timestamp INTEGER NOT NULL,
206
+ event_type TEXT NOT NULL,
207
+ trader TEXT,
208
+ mean REAL NOT NULL,
209
+ std_dev REAL NOT NULL,
210
+ lower_bound REAL NOT NULL,
211
+ upper_bound REAL NOT NULL,
212
+ old_mean REAL,
213
+ old_std_dev REAL,
214
+ collateral_posted TEXT,
215
+ raw_data TEXT,
216
+ outcome_count INTEGER,
217
+ min_outcome_index INTEGER,
218
+ is_position_sell INTEGER,
219
+ settlement_outcome_index INTEGER,
220
+ settlement_outcomes_json TEXT,
221
+ settlement_value REAL,
222
+ settlement_x1 REAL,
223
+ settlement_x2 REAL,
224
+ created_at INTEGER NOT NULL DEFAULT (unixepoch())
225
+ );
226
+ `);
227
+ db.exec(`
228
+ INSERT INTO market_events_v2 (
229
+ id, market_address, event_uid, tx_hash, block_number, timestamp, event_type,
230
+ trader, mean, std_dev, lower_bound, upper_bound,
231
+ old_mean, old_std_dev, collateral_posted, raw_data,
232
+ outcome_count, min_outcome_index, is_position_sell,
233
+ settlement_outcome_index, settlement_outcomes_json,
234
+ settlement_value, settlement_x1, settlement_x2, created_at
235
+ )
236
+ SELECT
237
+ id, market_address, ${eventUidExpr}, tx_hash, block_number, timestamp, event_type,
238
+ trader, mean, std_dev, lower_bound, upper_bound,
239
+ old_mean, old_std_dev, collateral_posted, raw_data,
240
+ outcome_count, min_outcome_index, is_position_sell,
241
+ settlement_outcome_index, settlement_outcomes_json,
242
+ ${settlementValueExpr}, ${settlementX1Expr}, ${settlementX2Expr}, created_at
243
+ FROM market_events;
244
+ `);
245
+ db.exec('DROP TABLE market_events');
246
+ db.exec('ALTER TABLE market_events_v2 RENAME TO market_events');
247
+ db.exec('CREATE INDEX IF NOT EXISTS idx_events_market_block ON market_events(market_address, block_number)');
248
+ db.exec('CREATE INDEX IF NOT EXISTS idx_events_trader ON market_events(trader) WHERE trader IS NOT NULL');
249
+ db.exec('CREATE INDEX IF NOT EXISTS idx_events_trader_ts ON market_events(trader, timestamp DESC) WHERE trader IS NOT NULL');
250
+ db.exec('CREATE INDEX IF NOT EXISTS idx_events_market_ts ON market_events(market_address, timestamp)');
251
+ db.exec('COMMIT');
252
+ }
253
+ catch (error) {
254
+ db.exec('ROLLBACK');
255
+ throw error;
256
+ }
257
+ finally {
258
+ db.exec('PRAGMA foreign_keys = ON');
259
+ }
260
+ }
134
261
  export function initializeSchema(db) {
135
262
  db.exec(SCHEMA_DDL);
136
263
  // Migrations for existing databases
137
264
  safeAddColumn(db, 'markets', 'market_type', "TEXT NOT NULL DEFAULT 'normal'");
265
+ safeAddColumn(db, 'market_events', 'event_uid', 'TEXT');
138
266
  safeAddColumn(db, 'market_events', 'outcome_count', 'INTEGER');
139
267
  safeAddColumn(db, 'market_events', 'min_outcome_index', 'INTEGER');
140
268
  safeAddColumn(db, 'market_events', 'is_position_sell', 'INTEGER');
141
269
  safeAddColumn(db, 'market_events', 'settlement_outcome_index', 'INTEGER');
142
270
  safeAddColumn(db, 'market_events', 'settlement_outcomes_json', 'TEXT');
271
+ safeAddColumn(db, 'market_events', 'settlement_value', 'REAL');
272
+ safeAddColumn(db, 'market_events', 'settlement_x1', 'REAL');
273
+ safeAddColumn(db, 'market_events', 'settlement_x2', 'REAL');
143
274
  safeAddColumn(db, 'user_positions', 'position_type', "TEXT DEFAULT 'normal'");
144
275
  safeAddColumn(db, 'user_positions', 'outcome_count', 'INTEGER');
145
276
  safeAddColumn(db, 'user_positions', 'original_probs_json', 'TEXT');
146
277
  safeAddColumn(db, 'user_positions', 'collateral_locked_raw', 'TEXT');
278
+ // Leaderboard: expected value and effective distribution columns
279
+ safeAddColumn(db, 'user_positions', 'expected_value', 'REAL');
280
+ safeAddColumn(db, 'user_positions', 'effective_mean', 'REAL');
281
+ safeAddColumn(db, 'user_positions', 'effective_sigma', 'REAL');
282
+ safeAddColumn(db, 'user_positions', 'effective_variance', 'REAL');
283
+ safeAddColumn(db, 'user_positions', 'effective_probs_json', 'TEXT');
284
+ safeAddColumn(db, 'market_state', 'k', 'REAL');
285
+ safeAddColumn(db, 'market_state', 'effective_k', 'REAL');
147
286
  // Rich market metadata columns
148
287
  safeAddColumn(db, 'markets', 'x_axis_label', 'TEXT DEFAULT NULL');
149
288
  safeAddColumn(db, 'markets', 'x_axis_unit', 'TEXT DEFAULT NULL');
@@ -151,5 +290,7 @@ export function initializeSchema(db) {
151
290
  safeAddColumn(db, 'markets', 'row_labels', 'TEXT DEFAULT NULL');
152
291
  safeAddColumn(db, 'markets', 'col_labels', 'TEXT DEFAULT NULL');
153
292
  safeAddColumn(db, 'markets', 'resolution_source', 'TEXT DEFAULT NULL');
293
+ // Rebuild event table when upgrading from legacy tx_hash-unique schema.
294
+ migrateMarketEventsTable(db);
154
295
  }
155
296
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyHlB,CAAC;AAEF;;GAEG;AACH,SAAS,aAAa,CAAC,EAAY,EAAE,KAAa,EAAE,MAAc,EAAE,UAAkB;IACpF,IAAI,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,eAAe,KAAK,eAAe,MAAM,IAAI,UAAU,EAAE,CAAC,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,iCAAiC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAY;IAC3C,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEpB,oCAAoC;IACpC,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,gCAAgC,CAAC,CAAC;IAC9E,aAAa,CAAC,EAAE,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;IAC/D,aAAa,CAAC,EAAE,EAAE,eAAe,EAAE,mBAAmB,EAAE,SAAS,CAAC,CAAC;IACnE,aAAa,CAAC,EAAE,EAAE,eAAe,EAAE,kBAAkB,EAAE,SAAS,CAAC,CAAC;IAClE,aAAa,CAAC,EAAE,EAAE,eAAe,EAAE,0BAA0B,EAAE,SAAS,CAAC,CAAC;IAC1E,aAAa,CAAC,EAAE,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,CAAC,CAAC;IACvE,aAAa,CAAC,EAAE,EAAE,gBAAgB,EAAE,eAAe,EAAE,uBAAuB,CAAC,CAAC;IAC9E,aAAa,CAAC,EAAE,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;IAChE,aAAa,CAAC,EAAE,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,CAAC,CAAC;IACnE,aAAa,CAAC,EAAE,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,CAAC,CAAC;IAErE,+BAA+B;IAC/B,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,mBAAmB,CAAC,CAAC;IAClE,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,mBAAmB,CAAC,CAAC;IACjE,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;IACpE,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;IAChE,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;IAChE,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;AACzE,CAAC"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"decoder.d.ts","sourceRoot":"","sources":["../../src/etl/decoder.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EACV,YAAY,EAKZ,UAAU,EACV,YAAY,EACb,MAAM,UAAU,CAAC;AAsClB,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAkC7F;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,UAAU,CAAC,EAAE,UAAU,GACtB,YAAY,EAAE,CAYhB"}
1
+ {"version":3,"file":"decoder.d.ts","sourceRoot":"","sources":["../../src/etl/decoder.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EACV,YAAY,EAKZ,UAAU,EACV,YAAY,EACb,MAAM,UAAU,CAAC;AAkDlB,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CA2B7F;AAoCD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,UAAU,CAAC,EAAE,UAAU,GACtB,YAAY,EAAE,CAYhB"}