@the-situation/indexer 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/README.md +21 -0
  2. package/dist/__tests__/performance/perf-fixtures.d.ts +26 -0
  3. package/dist/__tests__/performance/perf-fixtures.d.ts.map +1 -0
  4. package/dist/__tests__/performance/perf-fixtures.js +172 -0
  5. package/dist/__tests__/performance/perf-fixtures.js.map +1 -0
  6. package/dist/__tests__/performance/perf-utils.d.ts +42 -0
  7. package/dist/__tests__/performance/perf-utils.d.ts.map +1 -0
  8. package/dist/__tests__/performance/perf-utils.js +91 -0
  9. package/dist/__tests__/performance/perf-utils.js.map +1 -0
  10. package/dist/api/app.d.ts +1 -1
  11. package/dist/api/routes/admin-subscriptions.d.ts +1 -1
  12. package/dist/api/routes/admin.d.ts.map +1 -1
  13. package/dist/api/routes/admin.js +4 -0
  14. package/dist/api/routes/admin.js.map +1 -1
  15. package/dist/api/routes/market-events.d.ts.map +1 -1
  16. package/dist/api/routes/market-events.js +8 -0
  17. package/dist/api/routes/market-events.js.map +1 -1
  18. package/dist/api/routes/markets.d.ts.map +1 -1
  19. package/dist/api/routes/markets.js +8 -0
  20. package/dist/api/routes/markets.js.map +1 -1
  21. package/dist/api/routes/trader-events.d.ts.map +1 -1
  22. package/dist/api/routes/trader-events.js +8 -0
  23. package/dist/api/routes/trader-events.js.map +1 -1
  24. package/dist/db/connection.d.ts.map +1 -1
  25. package/dist/db/connection.js +4 -0
  26. package/dist/db/connection.js.map +1 -1
  27. package/dist/db/repositories/activity-feed.d.ts +3 -0
  28. package/dist/db/repositories/activity-feed.d.ts.map +1 -1
  29. package/dist/db/repositories/activity-feed.js +33 -18
  30. package/dist/db/repositories/activity-feed.js.map +1 -1
  31. package/dist/db/repositories/event.d.ts +22 -0
  32. package/dist/db/repositories/event.d.ts.map +1 -1
  33. package/dist/db/repositories/event.js +139 -75
  34. package/dist/db/repositories/event.js.map +1 -1
  35. package/dist/db/repositories/lp-position.d.ts +2 -10
  36. package/dist/db/repositories/lp-position.d.ts.map +1 -1
  37. package/dist/db/repositories/lp-position.js +54 -52
  38. package/dist/db/repositories/lp-position.js.map +1 -1
  39. package/dist/db/repositories/market-state.d.ts +10 -0
  40. package/dist/db/repositories/market-state.d.ts.map +1 -1
  41. package/dist/db/repositories/market-state.js +16 -5
  42. package/dist/db/repositories/market-state.js.map +1 -1
  43. package/dist/db/repositories/market.d.ts +7 -0
  44. package/dist/db/repositories/market.d.ts.map +1 -1
  45. package/dist/db/repositories/market.js +32 -24
  46. package/dist/db/repositories/market.js.map +1 -1
  47. package/dist/db/repositories/multinoulli-snapshots.d.ts +1 -0
  48. package/dist/db/repositories/multinoulli-snapshots.d.ts.map +1 -1
  49. package/dist/db/repositories/multinoulli-snapshots.js +7 -5
  50. package/dist/db/repositories/multinoulli-snapshots.js.map +1 -1
  51. package/dist/db/repositories/position.d.ts +1 -0
  52. package/dist/db/repositories/position.d.ts.map +1 -1
  53. package/dist/db/repositories/position.js +9 -0
  54. package/dist/db/repositories/position.js.map +1 -1
  55. package/dist/db/schema.d.ts.map +1 -1
  56. package/dist/db/schema.js +114 -5
  57. package/dist/db/schema.js.map +1 -1
  58. package/dist/etl/decoder.js +16 -0
  59. package/dist/etl/decoder.js.map +1 -1
  60. package/dist/etl/event-indexer.d.ts.map +1 -1
  61. package/dist/etl/event-indexer.js +138 -74
  62. package/dist/etl/event-indexer.js.map +1 -1
  63. package/dist/etl/lp-position-refresher.d.ts +9 -3
  64. package/dist/etl/lp-position-refresher.d.ts.map +1 -1
  65. package/dist/etl/lp-position-refresher.js +74 -21
  66. package/dist/etl/lp-position-refresher.js.map +1 -1
  67. package/dist/etl/position-refresher.d.ts +9 -3
  68. package/dist/etl/position-refresher.d.ts.map +1 -1
  69. package/dist/etl/position-refresher.js +44 -36
  70. package/dist/etl/position-refresher.js.map +1 -1
  71. package/dist/etl/state-refresher.d.ts +8 -3
  72. package/dist/etl/state-refresher.d.ts.map +1 -1
  73. package/dist/etl/state-refresher.js +137 -12
  74. package/dist/etl/state-refresher.js.map +1 -1
  75. package/dist/layers/ChainReaderLive.d.ts.map +1 -1
  76. package/dist/layers/ChainReaderLive.js +69 -22
  77. package/dist/layers/ChainReaderLive.js.map +1 -1
  78. package/dist/services/ChainReader.d.ts +21 -0
  79. package/dist/services/ChainReader.d.ts.map +1 -1
  80. package/dist/services/ChainReader.js.map +1 -1
  81. package/dist/types/api.d.ts +28 -0
  82. package/dist/types/api.d.ts.map +1 -1
  83. package/dist/types/event.d.ts +24 -0
  84. package/dist/types/event.d.ts.map +1 -1
  85. package/dist/types/market.d.ts +16 -0
  86. package/dist/types/market.d.ts.map +1 -1
  87. package/package.json +3 -1
@@ -17,7 +17,10 @@ export interface ActivityFeedQueryOptions {
17
17
  }
18
18
  export declare class ActivityFeedRepository {
19
19
  private readonly db;
20
+ private static readonly MAX_CACHED_STATEMENTS;
21
+ private readonly statementCache;
20
22
  constructor(db: Database);
23
+ private getStatement;
21
24
  findAll(options?: ActivityFeedQueryOptions): EnrichedEventRow[];
22
25
  count(options?: ActivityFeedQueryOptions): number;
23
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"activity-feed.d.ts","sourceRoot":"","sources":["../../../src/db/repositories/activity-feed.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAC/D,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACzD,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C;AA0DD,qBAAa,sBAAsB;IACrB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEzC,OAAO,CAAC,OAAO,GAAE,wBAA6B,GAAG,gBAAgB,EAAE;IAqBnE,KAAK,CAAC,OAAO,GAAE,wBAA6B,GAAG,MAAM;CActD"}
1
+ {"version":3,"file":"activity-feed.d.ts","sourceRoot":"","sources":["../../../src/db/repositories/activity-feed.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAC/D,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACzD,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C;AA0DD,qBAAa,sBAAsB;IAIrB,OAAO,CAAC,QAAQ,CAAC,EAAE;IAH/B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAO;IACpD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoD;gBAEtD,EAAE,EAAE,QAAQ;IAEzC,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,OAAO,GAAE,wBAA6B,GAAG,gBAAgB,EAAE;IAkBnE,KAAK,CAAC,OAAO,GAAE,wBAA6B,GAAG,MAAM;CAUtD"}
@@ -42,34 +42,49 @@ function buildWhereClause(options) {
42
42
  }
43
43
  export class ActivityFeedRepository {
44
44
  db;
45
+ static MAX_CACHED_STATEMENTS = 128;
46
+ statementCache = new Map();
45
47
  constructor(db) {
46
48
  this.db = db;
47
49
  }
50
+ getStatement(sql) {
51
+ const cached = this.statementCache.get(sql);
52
+ if (cached) {
53
+ return cached;
54
+ }
55
+ const stmt = this.db.query(sql);
56
+ if (this.statementCache.size >= ActivityFeedRepository.MAX_CACHED_STATEMENTS) {
57
+ const oldestKey = this.statementCache.keys().next().value;
58
+ if (oldestKey) {
59
+ this.statementCache.delete(oldestKey);
60
+ }
61
+ }
62
+ this.statementCache.set(sql, stmt);
63
+ return stmt;
64
+ }
48
65
  findAll(options = {}) {
49
66
  const limit = Math.min(Math.max(1, options.limit ?? 50), 200);
50
67
  const offset = Math.max(0, options.offset ?? 0);
51
68
  const { where, params } = buildWhereClause(options);
52
- return this.db
53
- .query(`SELECT
54
- e.id, e.market_address, e.tx_hash, e.block_number, e.timestamp,
55
- e.event_type, e.trader, e.mean, e.std_dev, e.old_mean, e.old_std_dev,
56
- e.collateral_posted, e.settlement_value, e.settlement_outcomes_json,
57
- m.title as market_title, m.category as market_category, m.market_type
58
- FROM market_events e
59
- JOIN markets m ON e.market_address = m.address
60
- ${where}
61
- ORDER BY e.timestamp DESC, e.id DESC
62
- LIMIT ? OFFSET ?`)
63
- .all(...params, limit, offset);
69
+ const sql = `SELECT
70
+ e.id, e.market_address, e.tx_hash, e.block_number, e.timestamp,
71
+ e.event_type, e.trader, e.mean, e.std_dev, e.old_mean, e.old_std_dev,
72
+ e.collateral_posted, e.settlement_value, e.settlement_outcomes_json,
73
+ m.title as market_title, m.category as market_category, m.market_type
74
+ FROM market_events e
75
+ JOIN markets m ON e.market_address = m.address
76
+ ${where}
77
+ ORDER BY e.timestamp DESC, e.id DESC
78
+ LIMIT ? OFFSET ?`;
79
+ return this.getStatement(sql).all(...params, limit, offset);
64
80
  }
65
81
  count(options = {}) {
66
82
  const { where, params } = buildWhereClause(options);
67
- const result = this.db
68
- .query(`SELECT COUNT(*) as total
69
- FROM market_events e
70
- JOIN markets m ON e.market_address = m.address
71
- ${where}`)
72
- .get(...params);
83
+ const sql = `SELECT COUNT(*) as total
84
+ FROM market_events e
85
+ JOIN markets m ON e.market_address = m.address
86
+ ${where}`;
87
+ const result = this.getStatement(sql).get(...params);
73
88
  return result.total;
74
89
  }
75
90
  }
@@ -1 +1 @@
1
- {"version":3,"file":"activity-feed.js","sourceRoot":"","sources":["../../../src/db/repositories/activity-feed.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"activity-feed.js","sourceRoot":"","sources":["../../../src/db/repositories/activity-feed.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,22 @@ 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
+ private readonly insertStmt;
9
+ private readonly findByMarketStmt;
10
+ private readonly findByMarketFromStmt;
11
+ private readonly findByMarketToStmt;
12
+ private readonly findByMarketRangeStmt;
13
+ private readonly findByMarketForLPReplayStmt;
14
+ private readonly countByMarketStmt;
15
+ private readonly totalCountStmt;
16
+ private readonly findByTraderStmt;
17
+ private readonly findByTraderFromStmt;
18
+ private readonly findByTraderToStmt;
19
+ private readonly findByTraderRangeStmt;
20
+ private readonly countByTraderStmt;
21
+ private readonly findTradersByMarketStmt;
22
+ private readonly firstTradeByMarketLowerTraderStmt;
23
+ private readonly lastTradeByMarketLowerTraderStmt;
8
24
  constructor(db: Database);
9
25
  private runInsert;
10
26
  insert(input: InsertEventInput): boolean;
@@ -28,5 +44,11 @@ export declare class EventRepository {
28
44
  })[];
29
45
  countByTrader(trader: string): number;
30
46
  findTradersByMarket(marketAddress: string): string[];
47
+ findTradeBoundsByMarketAndTrader(marketAddress: string, trader: string): {
48
+ first_old_mean: number | null;
49
+ first_old_std_dev: number | null;
50
+ last_mean: number;
51
+ last_std_dev: number;
52
+ } | null;
31
53
  }
32
54
  //# sourceMappingURL=event.d.ts.map
@@ -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,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;IA2BnB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,cAAc,EAAE;IAoBhE,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;IAkBd,OAAO,CAAC,QAAQ,CAAC,EAAE;IAjB/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;IAC3D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAgC;IACjE,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAgC;IACrE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAgC;IACnE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAgC;IACtE,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAgC;IAC5E,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAgC;IAClE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgC;IAC/D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAgC;IACjE,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAgC;IACrE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAgC;IACnE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAgC;IACtE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAgC;IAClE,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAgC;IACxE,OAAO,CAAC,QAAQ,CAAC,iCAAiC,CAAgC;IAClF,OAAO,CAAC,QAAQ,CAAC,gCAAgC,CAAgC;gBAEpD,EAAE,EAAE,QAAQ;IA+HzC,OAAO,CAAC,SAAS;IAqCjB,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO;IASxC,WAAW,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,GAAG,MAAM;IAaxD,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;IAqBnB,uBAAuB,CAAC,aAAa,EAAE,MAAM,GAAG,cAAc,EAAE;IAIhE,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;IAK5C,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;IAiChD,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAKrC,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE;IAKpD,gCAAgC,CAC9B,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,GACb;QACD,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;KACtB,GAAG,IAAI;CAqBT"}
@@ -1,23 +1,121 @@
1
1
  export class EventRepository {
2
2
  db;
3
+ insertStmt;
4
+ findByMarketStmt;
5
+ findByMarketFromStmt;
6
+ findByMarketToStmt;
7
+ findByMarketRangeStmt;
8
+ findByMarketForLPReplayStmt;
9
+ countByMarketStmt;
10
+ totalCountStmt;
11
+ findByTraderStmt;
12
+ findByTraderFromStmt;
13
+ findByTraderToStmt;
14
+ findByTraderRangeStmt;
15
+ countByTraderStmt;
16
+ findTradersByMarketStmt;
17
+ firstTradeByMarketLowerTraderStmt;
18
+ lastTradeByMarketLowerTraderStmt;
3
19
  constructor(db) {
4
20
  this.db = db;
21
+ this.insertStmt = this.db.query(`INSERT OR IGNORE INTO market_events
22
+ (market_address, event_uid, tx_hash, block_number, timestamp, event_type,
23
+ trader, mean, std_dev, lower_bound, upper_bound,
24
+ old_mean, old_std_dev, mean_2, std_dev_2, lower_bound_2, upper_bound_2,
25
+ old_mean_2, old_std_dev_2, rho, old_rho, collateral_posted, raw_data,
26
+ outcome_count, min_outcome_index, is_position_sell,
27
+ settlement_outcome_index, settlement_outcomes_json,
28
+ settlement_value, settlement_x1, settlement_x2)
29
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
30
+ this.findByMarketStmt = this.db.query(`SELECT * FROM market_events
31
+ WHERE market_address = ?
32
+ AND event_type NOT IN ('liquidity_added', 'liquidity_removed')
33
+ ORDER BY block_number ASC, timestamp ASC, id ASC
34
+ LIMIT ? OFFSET ?`);
35
+ this.findByMarketFromStmt = this.db.query(`SELECT * FROM market_events
36
+ WHERE market_address = ?
37
+ AND event_type NOT IN ('liquidity_added', 'liquidity_removed')
38
+ AND timestamp >= ?
39
+ ORDER BY block_number ASC, timestamp ASC, id ASC
40
+ LIMIT ? OFFSET ?`);
41
+ this.findByMarketToStmt = this.db.query(`SELECT * FROM market_events
42
+ WHERE market_address = ?
43
+ AND event_type NOT IN ('liquidity_added', 'liquidity_removed')
44
+ AND timestamp <= ?
45
+ ORDER BY block_number ASC, timestamp ASC, id ASC
46
+ LIMIT ? OFFSET ?`);
47
+ this.findByMarketRangeStmt = this.db.query(`SELECT * FROM market_events
48
+ WHERE market_address = ?
49
+ AND event_type NOT IN ('liquidity_added', 'liquidity_removed')
50
+ AND timestamp >= ?
51
+ AND timestamp <= ?
52
+ ORDER BY block_number ASC, timestamp ASC, id ASC
53
+ LIMIT ? OFFSET ?`);
54
+ this.findByMarketForLPReplayStmt = this.db.query(`SELECT *
55
+ FROM market_events
56
+ WHERE market_address = ?
57
+ AND event_type IN (
58
+ 'bootstrapped',
59
+ 'trade_moved',
60
+ 'market_initialized',
61
+ 'trade_executed',
62
+ 'market_settled',
63
+ 'liquidity_added',
64
+ 'liquidity_removed'
65
+ )
66
+ ORDER BY block_number ASC, timestamp ASC, id ASC`);
67
+ this.countByMarketStmt = this.db.query("SELECT COUNT(*) as cnt FROM market_events WHERE market_address = ? AND event_type NOT IN ('liquidity_added', 'liquidity_removed')");
68
+ this.totalCountStmt = this.db.query('SELECT COUNT(*) as cnt FROM market_events');
69
+ this.findByTraderStmt = this.db.query(`SELECT e.*, m.title as market_title
70
+ FROM market_events e
71
+ JOIN markets m ON e.market_address = m.address
72
+ WHERE e.trader = ?
73
+ ORDER BY e.timestamp DESC, e.id DESC
74
+ LIMIT ? OFFSET ?`);
75
+ this.findByTraderFromStmt = this.db.query(`SELECT e.*, m.title as market_title
76
+ FROM market_events e
77
+ JOIN markets m ON e.market_address = m.address
78
+ WHERE e.trader = ?
79
+ AND e.timestamp >= ?
80
+ ORDER BY e.timestamp DESC, e.id DESC
81
+ LIMIT ? OFFSET ?`);
82
+ this.findByTraderToStmt = this.db.query(`SELECT e.*, m.title as market_title
83
+ FROM market_events e
84
+ JOIN markets m ON e.market_address = m.address
85
+ WHERE e.trader = ?
86
+ AND e.timestamp <= ?
87
+ ORDER BY e.timestamp DESC, e.id DESC
88
+ LIMIT ? OFFSET ?`);
89
+ this.findByTraderRangeStmt = this.db.query(`SELECT e.*, m.title as market_title
90
+ FROM market_events e
91
+ JOIN markets m ON e.market_address = m.address
92
+ WHERE e.trader = ?
93
+ AND e.timestamp >= ?
94
+ AND e.timestamp <= ?
95
+ ORDER BY e.timestamp DESC, e.id DESC
96
+ LIMIT ? OFFSET ?`);
97
+ this.countByTraderStmt = this.db.query('SELECT COUNT(*) as cnt FROM market_events WHERE trader = ?');
98
+ this.findTradersByMarketStmt = this.db.query(`SELECT DISTINCT trader FROM market_events
99
+ WHERE market_address = ? AND trader IS NOT NULL
100
+ ORDER BY trader`);
101
+ this.firstTradeByMarketLowerTraderStmt = this.db.query(`SELECT old_mean, old_std_dev
102
+ FROM market_events
103
+ WHERE market_address = ? AND LOWER(trader) = ? AND event_type = 'trade_executed'
104
+ ORDER BY timestamp ASC, id ASC
105
+ LIMIT 1`);
106
+ this.lastTradeByMarketLowerTraderStmt = this.db.query(`SELECT mean, std_dev
107
+ FROM market_events
108
+ WHERE market_address = ? AND LOWER(trader) = ? AND event_type = 'trade_executed'
109
+ ORDER BY timestamp DESC, id DESC
110
+ LIMIT 1`);
5
111
  }
6
112
  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);
113
+ 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.mean_2 ?? null, input.std_dev_2 ?? null, input.lower_bound_2 ?? null, input.upper_bound_2 ?? null, input.old_mean_2 ?? null, input.old_std_dev_2 ?? null, input.rho ?? null, input.old_rho ?? null, 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
114
  return result.changes;
9
115
  }
10
116
  insert(input) {
11
117
  try {
12
- const stmt = this.db.query(`INSERT OR IGNORE INTO market_events
13
- (market_address, event_uid, tx_hash, block_number, timestamp, event_type,
14
- trader, mean, std_dev, lower_bound, upper_bound,
15
- old_mean, old_std_dev, collateral_posted, raw_data,
16
- outcome_count, min_outcome_index, is_position_sell,
17
- settlement_outcome_index, settlement_outcomes_json,
18
- settlement_value, settlement_x1, settlement_x2)
19
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
20
- this.runInsert(stmt, input);
118
+ this.runInsert(this.insertStmt, input);
21
119
  return true;
22
120
  }
23
121
  catch {
@@ -26,17 +124,9 @@ export class EventRepository {
26
124
  }
27
125
  insertBatch(inputs) {
28
126
  let inserted = 0;
29
- const stmt = this.db.query(`INSERT OR IGNORE INTO market_events
30
- (market_address, event_uid, tx_hash, block_number, timestamp, event_type,
31
- trader, mean, std_dev, lower_bound, upper_bound,
32
- old_mean, old_std_dev, collateral_posted, raw_data,
33
- outcome_count, min_outcome_index, is_position_sell,
34
- settlement_outcome_index, settlement_outcomes_json,
35
- settlement_value, settlement_x1, settlement_x2)
36
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
37
127
  const tx = this.db.transaction(() => {
38
128
  for (const input of inputs) {
39
- inserted += this.runInsert(stmt, input);
129
+ inserted += this.runInsert(this.insertStmt, input);
40
130
  }
41
131
  });
42
132
  tx();
@@ -44,87 +134,61 @@ export class EventRepository {
44
134
  }
45
135
  findByMarket(marketAddress, options = {}) {
46
136
  const { limit = 100, offset = 0, fromTimestamp, toTimestamp } = options;
47
- // Exclude LP events from time-series queries they carry no distribution data
48
- const conditions = ['market_address = ?', "event_type NOT IN ('liquidity_added', 'liquidity_removed')"];
49
- const params = [marketAddress];
137
+ if (fromTimestamp !== undefined && toTimestamp !== undefined) {
138
+ return this.findByMarketRangeStmt.all(marketAddress, fromTimestamp, toTimestamp, limit, offset);
139
+ }
50
140
  if (fromTimestamp !== undefined) {
51
- conditions.push('timestamp >= ?');
52
- params.push(fromTimestamp);
141
+ return this.findByMarketFromStmt.all(marketAddress, fromTimestamp, limit, offset);
53
142
  }
54
143
  if (toTimestamp !== undefined) {
55
- conditions.push('timestamp <= ?');
56
- params.push(toTimestamp);
144
+ return this.findByMarketToStmt.all(marketAddress, toTimestamp, limit, offset);
57
145
  }
58
- params.push(limit, offset);
59
- return this.db
60
- .query(`SELECT * FROM market_events
61
- WHERE ${conditions.join(' AND ')}
62
- ORDER BY block_number ASC, timestamp ASC, id ASC
63
- LIMIT ? OFFSET ?`)
64
- .all(...params);
146
+ return this.findByMarketStmt.all(marketAddress, limit, offset);
65
147
  }
66
148
  findByMarketForLPReplay(marketAddress) {
67
- return this.db
68
- .query(`SELECT *
69
- FROM market_events
70
- WHERE market_address = ?
71
- AND event_type IN (
72
- 'bootstrapped',
73
- 'trade_moved',
74
- 'market_initialized',
75
- 'trade_executed',
76
- 'market_settled',
77
- 'liquidity_added',
78
- 'liquidity_removed'
79
- )
80
- ORDER BY block_number ASC, timestamp ASC, id ASC`)
81
- .all(marketAddress);
149
+ return this.findByMarketForLPReplayStmt.all(marketAddress);
82
150
  }
83
151
  countByMarket(marketAddress) {
84
- const row = this.db
85
- .query("SELECT COUNT(*) as cnt FROM market_events WHERE market_address = ? AND event_type NOT IN ('liquidity_added', 'liquidity_removed')")
86
- .get(marketAddress);
152
+ const row = this.countByMarketStmt.get(marketAddress);
87
153
  return row.cnt;
88
154
  }
89
155
  totalCount() {
90
- const row = this.db.query('SELECT COUNT(*) as cnt FROM market_events').get();
156
+ const row = this.totalCountStmt.get();
91
157
  return row.cnt;
92
158
  }
93
159
  findByTrader(trader, options = {}) {
94
160
  const { limit = 100, offset = 0, fromTimestamp, toTimestamp } = options;
95
- const conditions = ['e.trader = ?'];
96
- const params = [trader];
161
+ if (fromTimestamp !== undefined && toTimestamp !== undefined) {
162
+ return this.findByTraderRangeStmt.all(trader, fromTimestamp, toTimestamp, limit, offset);
163
+ }
97
164
  if (fromTimestamp !== undefined) {
98
- conditions.push('e.timestamp >= ?');
99
- params.push(fromTimestamp);
165
+ return this.findByTraderFromStmt.all(trader, fromTimestamp, limit, offset);
100
166
  }
101
167
  if (toTimestamp !== undefined) {
102
- conditions.push('e.timestamp <= ?');
103
- params.push(toTimestamp);
168
+ return this.findByTraderToStmt.all(trader, toTimestamp, limit, offset);
104
169
  }
105
- params.push(limit, offset);
106
- return this.db
107
- .query(`SELECT e.*, m.title as market_title
108
- FROM market_events e
109
- JOIN markets m ON e.market_address = m.address
110
- WHERE ${conditions.join(' AND ')}
111
- ORDER BY e.timestamp DESC
112
- LIMIT ? OFFSET ?`)
113
- .all(...params);
170
+ return this.findByTraderStmt.all(trader, limit, offset);
114
171
  }
115
172
  countByTrader(trader) {
116
- const row = this.db
117
- .query('SELECT COUNT(*) as cnt FROM market_events WHERE trader = ?')
118
- .get(trader);
173
+ const row = this.countByTraderStmt.get(trader);
119
174
  return row.cnt;
120
175
  }
121
176
  findTradersByMarket(marketAddress) {
122
- const rows = this.db
123
- .query(`SELECT DISTINCT trader FROM market_events
124
- WHERE market_address = ? AND trader IS NOT NULL
125
- ORDER BY trader`)
126
- .all(marketAddress);
177
+ const rows = this.findTradersByMarketStmt.all(marketAddress);
127
178
  return rows.map((r) => r.trader);
128
179
  }
180
+ findTradeBoundsByMarketAndTrader(marketAddress, trader) {
181
+ const first = this.firstTradeByMarketLowerTraderStmt.get(marketAddress.toLowerCase(), trader.toLowerCase());
182
+ const last = this.lastTradeByMarketLowerTraderStmt.get(marketAddress.toLowerCase(), trader.toLowerCase());
183
+ if (!first || !last) {
184
+ return null;
185
+ }
186
+ return {
187
+ first_old_mean: first.old_mean ?? null,
188
+ first_old_std_dev: first.old_std_dev ?? null,
189
+ last_mean: last.mean,
190
+ last_std_dev: last.std_dev,
191
+ };
192
+ }
129
193
  }
130
194
  //# sourceMappingURL=event.js.map
@@ -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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"}
@@ -39,16 +39,8 @@ export declare class LPPositionRepository {
39
39
  /** Recompute deposit/withdrawal totals from market_events. Idempotent — safe
40
40
  * to call on every event cycle without double-counting. */
41
41
  recomputeFromEvents(marketAddress: string, provider: string): void;
42
- /**
43
- * If entry_mean is null, populate entry distribution + component_lambda from market_state.
44
- *
45
- * Lambda formula: `k × √(2σ√π)` — the AMM's full-pool lambda for the distribution.
46
- * This is the full lambda, not scaled by share fraction. Consumers must scale by
47
- * `shares / totalShares` to get the per-LP component lambda. We store the full value
48
- * because the share fraction at LP-entry time isn't readily available in this context,
49
- * and the consumer already has the shares data from `getLPShares`.
50
- */
51
- private populateEntryDistributionIfMissing;
42
+ /** Recompute LP aggregates for multiple providers in one DB pass. */
43
+ recomputeFromEventsBatch(marketAddress: string, providers: readonly string[]): void;
52
44
  /** Set entry distribution fields if not yet populated. */
53
45
  upsertEntryDistribution(marketAddress: string, provider: string, mean: number | null, sigma: number | null, k: number | null): void;
54
46
  /** Mark an LP position as claimed (called when a position_claimed event is processed). */
@@ -1 +1 @@
1
- {"version":3,"file":"lp-position.d.ts","sourceRoot":"","sources":["../../../src/db/repositories/lp-position.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lp-position.d.ts","sourceRoot":"","sources":["../../../src/db/repositories/lp-position.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC;AAED,qBAAa,oBAAoB;IACnB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEzC,8DAA8D;IAC9D,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAS7D;gEAC4D;IAC5D,mBAAmB,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIlE,qEAAqE;IACrE,wBAAwB,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IA4GnF,0DAA0D;IAC1D,uBAAuB,CACrB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,CAAC,EAAE,MAAM,GAAG,IAAI,GACf,IAAI;IAaP,0FAA0F;IAC1F,WAAW,CACT,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,IAAI;IAWP,qDAAqD;IACrD,MAAM,CAAC,KAAK,EAAE,qBAAqB,GAAG,IAAI;IAqB1C,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,aAAa,EAAE;IAMpD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,EAAE;IAMjD,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAQtE,OAAO,IAAI,aAAa,EAAE;IAI1B,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM;CAK9C"}
@@ -13,10 +13,20 @@ export class LPPositionRepository {
13
13
  /** Recompute deposit/withdrawal totals from market_events. Idempotent — safe
14
14
  * to call on every event cycle without double-counting. */
15
15
  recomputeFromEvents(marketAddress, provider) {
16
+ this.recomputeFromEventsBatch(marketAddress, [provider]);
17
+ }
18
+ /** Recompute LP aggregates for multiple providers in one DB pass. */
19
+ recomputeFromEventsBatch(marketAddress, providers) {
16
20
  const mAddr = marketAddress.toLowerCase();
17
- const pAddr = provider.toLowerCase();
18
- const row = this.db
21
+ const normalizedProviders = Array.from(new Set(providers
22
+ .map((provider) => provider.toLowerCase().trim())
23
+ .filter((provider) => provider.length > 0)));
24
+ if (normalizedProviders.length === 0)
25
+ return;
26
+ const placeholders = normalizedProviders.map(() => '?').join(', ');
27
+ const rows = this.db
19
28
  .query(`SELECT
29
+ LOWER(trader) AS provider,
20
30
  COALESCE(SUM(CASE WHEN event_type IN ('liquidity_added', 'market_initialized')
21
31
  THEN CAST(collateral_posted AS REAL) / 1e18 ELSE 0 END), 0) AS total_deposited,
22
32
  COALESCE(SUM(CASE WHEN event_type = 'liquidity_removed'
@@ -26,58 +36,50 @@ export class LPPositionRepository {
26
36
  MIN(CASE WHEN event_type IN ('liquidity_added', 'market_initialized') THEN timestamp END) AS first_deposit_at,
27
37
  MAX(timestamp) AS last_activity_at
28
38
  FROM market_events
29
- WHERE market_address = ? AND LOWER(trader) = ?
30
- AND event_type IN ('liquidity_added', 'liquidity_removed', 'market_initialized')`)
31
- .get(mAddr, pAddr);
32
- if (!row)
33
- return;
34
- this.db
35
- .query(`UPDATE lp_positions
36
- SET total_deposited = ?,
37
- total_withdrawn = ?,
38
- deposit_count = ?,
39
- withdrawal_count = ?,
40
- first_deposit_at = ?,
41
- last_activity_at = ?
42
- WHERE market_address = ? AND provider = ?`)
43
- .run(row.total_deposited, row.total_withdrawn, row.deposit_count, row.withdrawal_count, row.first_deposit_at, row.last_activity_at, mAddr, pAddr);
44
- // Populate entry distribution from market_state if not yet set.
45
- // The initial LP sets the market distribution, so their entry distribution
46
- // equals the market's initial distribution at the time of their first deposit.
47
- this.populateEntryDistributionIfMissing(mAddr, pAddr);
48
- }
49
- /**
50
- * If entry_mean is null, populate entry distribution + component_lambda from market_state.
51
- *
52
- * Lambda formula: `k × √(2σ√π)` — the AMM's full-pool lambda for the distribution.
53
- * This is the full lambda, not scaled by share fraction. Consumers must scale by
54
- * `shares / totalShares` to get the per-LP component lambda. We store the full value
55
- * because the share fraction at LP-entry time isn't readily available in this context,
56
- * and the consumer already has the shares data from `getLPShares`.
57
- */
58
- populateEntryDistributionIfMissing(marketAddress, provider) {
59
- const existing = this.db
60
- .query('SELECT entry_mean FROM lp_positions WHERE market_address = ? AND provider = ?')
61
- .get(marketAddress, provider);
62
- if (existing?.entry_mean != null)
63
- return; // already populated
64
- // Use the market's current distribution as fallback (works for the bootstrapper LP
65
- // who set the initial distribution, and is a reasonable approximation for later LPs).
39
+ WHERE market_address = ?
40
+ AND event_type IN ('liquidity_added', 'liquidity_removed', 'market_initialized')
41
+ AND LOWER(trader) IN (${placeholders})
42
+ GROUP BY LOWER(trader)`)
43
+ .all(mAddr, ...normalizedProviders);
44
+ const aggregatesByProvider = new Map(rows.map((row) => [row.provider, row]));
45
+ const updateStats = this.db.query(`UPDATE lp_positions
46
+ SET total_deposited = ?,
47
+ total_withdrawn = ?,
48
+ deposit_count = ?,
49
+ withdrawal_count = ?,
50
+ first_deposit_at = ?,
51
+ last_activity_at = ?
52
+ WHERE market_address = ? AND provider = ?`);
66
53
  const state = this.db
67
54
  .query('SELECT mean, sigma, k FROM market_state WHERE market_address = ?')
68
- .get(marketAddress);
69
- if (!state || state.mean == null || state.sigma == null || state.k == null)
70
- return;
71
- // Lambda = k × √(2σ√π) — the AMM's invariant-derived scaling factor.
72
- const lambda = state.k * Math.sqrt(2 * state.sigma * Math.sqrt(Math.PI));
73
- this.db
74
- .query(`UPDATE lp_positions
75
- SET entry_mean = ?,
76
- entry_sigma = ?,
77
- entry_k = ?,
78
- component_lambda = ?
79
- WHERE market_address = ? AND provider = ?`)
80
- .run(state.mean, state.sigma, state.k, lambda, marketAddress, provider);
55
+ .get(mAddr);
56
+ const entryState = state != null && state.mean != null && state.sigma != null && state.k != null
57
+ ? { mean: state.mean, sigma: state.sigma, k: state.k }
58
+ : null;
59
+ // Lambda = k × sqrt(2σsqrt(pi)) for the full pool; LP consumers scale by share fraction.
60
+ const lambda = entryState
61
+ ? entryState.k * Math.sqrt(2 * entryState.sigma * Math.sqrt(Math.PI))
62
+ : null;
63
+ const updateEntryDistribution = entryState
64
+ ? this.db.query(`UPDATE lp_positions
65
+ SET entry_mean = ?,
66
+ entry_sigma = ?,
67
+ entry_k = ?,
68
+ component_lambda = ?
69
+ WHERE market_address = ? AND provider = ? AND entry_mean IS NULL`)
70
+ : null;
71
+ const tx = this.db.transaction(() => {
72
+ for (const provider of normalizedProviders) {
73
+ const row = aggregatesByProvider.get(provider);
74
+ updateStats.run(row?.total_deposited ?? 0, row?.total_withdrawn ?? 0, row?.deposit_count ?? 0, row?.withdrawal_count ?? 0, row?.first_deposit_at ?? null, row?.last_activity_at ?? null, mAddr, provider);
75
+ // The initial LP sets the market distribution, so their entry distribution
76
+ // equals the market's initial distribution at the time of their first deposit.
77
+ if (updateEntryDistribution && entryState && lambda != null) {
78
+ updateEntryDistribution.run(entryState.mean, entryState.sigma, entryState.k, lambda, mAddr, provider);
79
+ }
80
+ }
81
+ });
82
+ tx();
81
83
  }
82
84
  /** Set entry distribution fields if not yet populated. */
83
85
  upsertEntryDistribution(marketAddress, provider, mean, sigma, k) {