@the-situation/indexer 0.1.0-alpha.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 (206) hide show
  1. package/README.md +236 -0
  2. package/dist/api/app.d.ts +380 -0
  3. package/dist/api/app.d.ts.map +1 -0
  4. package/dist/api/app.js +23 -0
  5. package/dist/api/app.js.map +1 -0
  6. package/dist/api/middleware/admin-auth.d.ts +37 -0
  7. package/dist/api/middleware/admin-auth.d.ts.map +1 -0
  8. package/dist/api/middleware/admin-auth.js +18 -0
  9. package/dist/api/middleware/admin-auth.js.map +1 -0
  10. package/dist/api/middleware/error-handler.d.ts +37 -0
  11. package/dist/api/middleware/error-handler.d.ts.map +1 -0
  12. package/dist/api/middleware/error-handler.js +15 -0
  13. package/dist/api/middleware/error-handler.js.map +1 -0
  14. package/dist/api/routes/admin.d.ts +140 -0
  15. package/dist/api/routes/admin.d.ts.map +1 -0
  16. package/dist/api/routes/admin.js +51 -0
  17. package/dist/api/routes/admin.js.map +1 -0
  18. package/dist/api/routes/health.d.ts +47 -0
  19. package/dist/api/routes/health.d.ts.map +1 -0
  20. package/dist/api/routes/health.js +27 -0
  21. package/dist/api/routes/health.js.map +1 -0
  22. package/dist/api/routes/index.d.ts +11 -0
  23. package/dist/api/routes/index.d.ts.map +1 -0
  24. package/dist/api/routes/index.js +11 -0
  25. package/dist/api/routes/index.js.map +1 -0
  26. package/dist/api/routes/market-events.d.ts +64 -0
  27. package/dist/api/routes/market-events.d.ts.map +1 -0
  28. package/dist/api/routes/market-events.js +41 -0
  29. package/dist/api/routes/market-events.js.map +1 -0
  30. package/dist/api/routes/market-traders.d.ts +64 -0
  31. package/dist/api/routes/market-traders.d.ts.map +1 -0
  32. package/dist/api/routes/market-traders.js +25 -0
  33. package/dist/api/routes/market-traders.js.map +1 -0
  34. package/dist/api/routes/markets.d.ts +78 -0
  35. package/dist/api/routes/markets.d.ts.map +1 -0
  36. package/dist/api/routes/markets.js +57 -0
  37. package/dist/api/routes/markets.js.map +1 -0
  38. package/dist/api/routes/positions.d.ts +62 -0
  39. package/dist/api/routes/positions.d.ts.map +1 -0
  40. package/dist/api/routes/positions.js +25 -0
  41. package/dist/api/routes/positions.js.map +1 -0
  42. package/dist/api/routes/rankings.d.ts +48 -0
  43. package/dist/api/routes/rankings.d.ts.map +1 -0
  44. package/dist/api/routes/rankings.js +9 -0
  45. package/dist/api/routes/rankings.js.map +1 -0
  46. package/dist/api/routes/trader-events.d.ts +64 -0
  47. package/dist/api/routes/trader-events.d.ts.map +1 -0
  48. package/dist/api/routes/trader-events.js +43 -0
  49. package/dist/api/routes/trader-events.js.map +1 -0
  50. package/dist/api/routes/trader-stats.d.ts +63 -0
  51. package/dist/api/routes/trader-stats.d.ts.map +1 -0
  52. package/dist/api/routes/trader-stats.js +8 -0
  53. package/dist/api/routes/trader-stats.js.map +1 -0
  54. package/dist/api/routes/ws.d.ts +44 -0
  55. package/dist/api/routes/ws.d.ts.map +1 -0
  56. package/dist/api/routes/ws.js +27 -0
  57. package/dist/api/routes/ws.js.map +1 -0
  58. package/dist/client/IndexerClient.d.ts +39 -0
  59. package/dist/client/IndexerClient.d.ts.map +1 -0
  60. package/dist/client/IndexerClient.js +11 -0
  61. package/dist/client/IndexerClient.js.map +1 -0
  62. package/dist/client/IndexerClientLive.d.ts +10 -0
  63. package/dist/client/IndexerClientLive.d.ts.map +1 -0
  64. package/dist/client/IndexerClientLive.js +70 -0
  65. package/dist/client/IndexerClientLive.js.map +1 -0
  66. package/dist/client/convenience.d.ts +40 -0
  67. package/dist/client/convenience.d.ts.map +1 -0
  68. package/dist/client/convenience.js +53 -0
  69. package/dist/client/convenience.js.map +1 -0
  70. package/dist/client/index.d.ts +11 -0
  71. package/dist/client/index.d.ts.map +1 -0
  72. package/dist/client/index.js +14 -0
  73. package/dist/client/index.js.map +1 -0
  74. package/dist/client/trader-stats.d.ts +52 -0
  75. package/dist/client/trader-stats.d.ts.map +1 -0
  76. package/dist/client/trader-stats.js +80 -0
  77. package/dist/client/trader-stats.js.map +1 -0
  78. package/dist/config.d.ts +15 -0
  79. package/dist/config.d.ts.map +1 -0
  80. package/dist/config.js +26 -0
  81. package/dist/config.js.map +1 -0
  82. package/dist/db/connection.d.ts +7 -0
  83. package/dist/db/connection.d.ts.map +1 -0
  84. package/dist/db/connection.js +22 -0
  85. package/dist/db/connection.js.map +1 -0
  86. package/dist/db/repositories/cursor.d.ts +12 -0
  87. package/dist/db/repositories/cursor.d.ts.map +1 -0
  88. package/dist/db/repositories/cursor.js +24 -0
  89. package/dist/db/repositories/cursor.js.map +1 -0
  90. package/dist/db/repositories/event.d.ts +30 -0
  91. package/dist/db/repositories/event.d.ts.map +1 -0
  92. package/dist/db/repositories/event.js +106 -0
  93. package/dist/db/repositories/event.js.map +1 -0
  94. package/dist/db/repositories/index.d.ts +7 -0
  95. package/dist/db/repositories/index.d.ts.map +1 -0
  96. package/dist/db/repositories/index.js +7 -0
  97. package/dist/db/repositories/index.js.map +1 -0
  98. package/dist/db/repositories/market-state.d.ts +27 -0
  99. package/dist/db/repositories/market-state.d.ts.map +1 -0
  100. package/dist/db/repositories/market-state.js +35 -0
  101. package/dist/db/repositories/market-state.js.map +1 -0
  102. package/dist/db/repositories/market.d.ts +16 -0
  103. package/dist/db/repositories/market.d.ts.map +1 -0
  104. package/dist/db/repositories/market.js +59 -0
  105. package/dist/db/repositories/market.js.map +1 -0
  106. package/dist/db/repositories/position.d.ts +15 -0
  107. package/dist/db/repositories/position.d.ts.map +1 -0
  108. package/dist/db/repositories/position.js +52 -0
  109. package/dist/db/repositories/position.js.map +1 -0
  110. package/dist/db/repositories/ranking.d.ts +12 -0
  111. package/dist/db/repositories/ranking.d.ts.map +1 -0
  112. package/dist/db/repositories/ranking.js +54 -0
  113. package/dist/db/repositories/ranking.js.map +1 -0
  114. package/dist/db/schema.d.ts +6 -0
  115. package/dist/db/schema.d.ts.map +1 -0
  116. package/dist/db/schema.js +88 -0
  117. package/dist/db/schema.js.map +1 -0
  118. package/dist/etl/decoder.d.ts +11 -0
  119. package/dist/etl/decoder.d.ts.map +1 -0
  120. package/dist/etl/decoder.js +242 -0
  121. package/dist/etl/decoder.js.map +1 -0
  122. package/dist/etl/event-indexer.d.ts +11 -0
  123. package/dist/etl/event-indexer.d.ts.map +1 -0
  124. package/dist/etl/event-indexer.js +102 -0
  125. package/dist/etl/event-indexer.js.map +1 -0
  126. package/dist/etl/position-refresher.d.ts +11 -0
  127. package/dist/etl/position-refresher.d.ts.map +1 -0
  128. package/dist/etl/position-refresher.js +52 -0
  129. package/dist/etl/position-refresher.js.map +1 -0
  130. package/dist/etl/scheduler.d.ts +15 -0
  131. package/dist/etl/scheduler.d.ts.map +1 -0
  132. package/dist/etl/scheduler.js +69 -0
  133. package/dist/etl/scheduler.js.map +1 -0
  134. package/dist/etl/state-refresher.d.ts +11 -0
  135. package/dist/etl/state-refresher.d.ts.map +1 -0
  136. package/dist/etl/state-refresher.js +50 -0
  137. package/dist/etl/state-refresher.js.map +1 -0
  138. package/dist/etl/types.d.ts +20 -0
  139. package/dist/etl/types.d.ts.map +1 -0
  140. package/dist/etl/types.js +5 -0
  141. package/dist/etl/types.js.map +1 -0
  142. package/dist/index.d.ts +2 -0
  143. package/dist/index.d.ts.map +1 -0
  144. package/dist/index.js +193 -0
  145. package/dist/index.js.map +1 -0
  146. package/dist/layers/ChainReaderLive.d.ts +4 -0
  147. package/dist/layers/ChainReaderLive.d.ts.map +1 -0
  148. package/dist/layers/ChainReaderLive.js +87 -0
  149. package/dist/layers/ChainReaderLive.js.map +1 -0
  150. package/dist/layers/DatabaseLive.d.ts +5 -0
  151. package/dist/layers/DatabaseLive.d.ts.map +1 -0
  152. package/dist/layers/DatabaseLive.js +13 -0
  153. package/dist/layers/DatabaseLive.js.map +1 -0
  154. package/dist/layers/EventBusLive.d.ts +4 -0
  155. package/dist/layers/EventBusLive.d.ts.map +1 -0
  156. package/dist/layers/EventBusLive.js +24 -0
  157. package/dist/layers/EventBusLive.js.map +1 -0
  158. package/dist/layers/VoyagerClientLive.d.ts +4 -0
  159. package/dist/layers/VoyagerClientLive.d.ts.map +1 -0
  160. package/dist/layers/VoyagerClientLive.js +30 -0
  161. package/dist/layers/VoyagerClientLive.js.map +1 -0
  162. package/dist/layers/index.d.ts +5 -0
  163. package/dist/layers/index.d.ts.map +1 -0
  164. package/dist/layers/index.js +5 -0
  165. package/dist/layers/index.js.map +1 -0
  166. package/dist/services/ChainReader.d.ts +40 -0
  167. package/dist/services/ChainReader.d.ts.map +1 -0
  168. package/dist/services/ChainReader.js +13 -0
  169. package/dist/services/ChainReader.js.map +1 -0
  170. package/dist/services/Database.d.ts +17 -0
  171. package/dist/services/Database.d.ts.map +1 -0
  172. package/dist/services/Database.js +4 -0
  173. package/dist/services/Database.js.map +1 -0
  174. package/dist/services/EventBus.d.ts +16 -0
  175. package/dist/services/EventBus.d.ts.map +1 -0
  176. package/dist/services/EventBus.js +4 -0
  177. package/dist/services/EventBus.js.map +1 -0
  178. package/dist/services/VoyagerClient.d.ts +20 -0
  179. package/dist/services/VoyagerClient.d.ts.map +1 -0
  180. package/dist/services/VoyagerClient.js +13 -0
  181. package/dist/services/VoyagerClient.js.map +1 -0
  182. package/dist/services/index.d.ts +5 -0
  183. package/dist/services/index.d.ts.map +1 -0
  184. package/dist/services/index.js +5 -0
  185. package/dist/services/index.js.map +1 -0
  186. package/dist/types/api.d.ts +117 -0
  187. package/dist/types/api.d.ts.map +1 -0
  188. package/dist/types/api.js +5 -0
  189. package/dist/types/api.js.map +1 -0
  190. package/dist/types/event.d.ts +88 -0
  191. package/dist/types/event.d.ts.map +1 -0
  192. package/dist/types/event.js +5 -0
  193. package/dist/types/event.js.map +1 -0
  194. package/dist/types/index.d.ts +5 -0
  195. package/dist/types/index.d.ts.map +1 -0
  196. package/dist/types/index.js +2 -0
  197. package/dist/types/index.js.map +1 -0
  198. package/dist/types/market.d.ts +44 -0
  199. package/dist/types/market.d.ts.map +1 -0
  200. package/dist/types/market.js +5 -0
  201. package/dist/types/market.js.map +1 -0
  202. package/dist/types/position.d.ts +39 -0
  203. package/dist/types/position.d.ts.map +1 -0
  204. package/dist/types/position.js +5 -0
  205. package/dist/types/position.js.map +1 -0
  206. package/package.json +42 -0
@@ -0,0 +1,106 @@
1
+ export class EventRepository {
2
+ db;
3
+ constructor(db) {
4
+ this.db = db;
5
+ }
6
+ insert(input) {
7
+ try {
8
+ this.db
9
+ .query(`INSERT OR IGNORE INTO market_events
10
+ (market_address, tx_hash, block_number, timestamp, event_type,
11
+ trader, mean, std_dev, lower_bound, upper_bound,
12
+ old_mean, old_std_dev, collateral_posted, raw_data)
13
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
14
+ .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);
15
+ return true;
16
+ }
17
+ catch {
18
+ return false;
19
+ }
20
+ }
21
+ insertBatch(inputs) {
22
+ let inserted = 0;
23
+ const stmt = this.db.query(`INSERT OR IGNORE INTO market_events
24
+ (market_address, tx_hash, block_number, timestamp, event_type,
25
+ trader, mean, std_dev, lower_bound, upper_bound,
26
+ old_mean, old_std_dev, collateral_posted, raw_data)
27
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
28
+ const tx = this.db.transaction(() => {
29
+ for (const input of inputs) {
30
+ 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);
31
+ inserted += result.changes;
32
+ }
33
+ });
34
+ tx();
35
+ return inserted;
36
+ }
37
+ findByMarket(marketAddress, options = {}) {
38
+ const { limit = 100, offset = 0, fromTimestamp, toTimestamp } = options;
39
+ const conditions = ['market_address = ?'];
40
+ const params = [marketAddress];
41
+ if (fromTimestamp !== undefined) {
42
+ conditions.push('timestamp >= ?');
43
+ params.push(fromTimestamp);
44
+ }
45
+ if (toTimestamp !== undefined) {
46
+ conditions.push('timestamp <= ?');
47
+ params.push(toTimestamp);
48
+ }
49
+ params.push(limit, offset);
50
+ return this.db
51
+ .query(`SELECT * FROM market_events
52
+ WHERE ${conditions.join(' AND ')}
53
+ ORDER BY block_number ASC, timestamp ASC
54
+ LIMIT ? OFFSET ?`)
55
+ .all(...params);
56
+ }
57
+ countByMarket(marketAddress) {
58
+ const row = this.db
59
+ .query('SELECT COUNT(*) as cnt FROM market_events WHERE market_address = ?')
60
+ .get(marketAddress);
61
+ return row.cnt;
62
+ }
63
+ totalCount() {
64
+ const row = this.db
65
+ .query('SELECT COUNT(*) as cnt FROM market_events')
66
+ .get();
67
+ return row.cnt;
68
+ }
69
+ findByTrader(trader, options = {}) {
70
+ const { limit = 100, offset = 0, fromTimestamp, toTimestamp } = options;
71
+ const conditions = ['e.trader = ?'];
72
+ const params = [trader];
73
+ if (fromTimestamp !== undefined) {
74
+ conditions.push('e.timestamp >= ?');
75
+ params.push(fromTimestamp);
76
+ }
77
+ if (toTimestamp !== undefined) {
78
+ conditions.push('e.timestamp <= ?');
79
+ params.push(toTimestamp);
80
+ }
81
+ params.push(limit, offset);
82
+ return this.db
83
+ .query(`SELECT e.*, m.title as market_title
84
+ FROM market_events e
85
+ JOIN markets m ON e.market_address = m.address
86
+ WHERE ${conditions.join(' AND ')}
87
+ ORDER BY e.timestamp DESC
88
+ LIMIT ? OFFSET ?`)
89
+ .all(...params);
90
+ }
91
+ countByTrader(trader) {
92
+ const row = this.db
93
+ .query('SELECT COUNT(*) as cnt FROM market_events WHERE trader = ?')
94
+ .get(trader);
95
+ return row.cnt;
96
+ }
97
+ findTradersByMarket(marketAddress) {
98
+ const rows = this.db
99
+ .query(`SELECT DISTINCT trader FROM market_events
100
+ WHERE market_address = ? AND trader IS NOT NULL
101
+ ORDER BY trader`)
102
+ .all(marketAddress);
103
+ return rows.map((r) => r.trader);
104
+ }
105
+ }
106
+ //# sourceMappingURL=event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.js","sourceRoot":"","sources":["../../../src/db/repositories/event.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { MarketRepository } from './market';
2
+ export { EventRepository } from './event';
3
+ export { MarketStateRepository, type UpsertMarketStateInput } from './market-state';
4
+ export { PositionRepository } from './position';
5
+ export { CursorRepository } from './cursor';
6
+ export { RankingRepository } from './ranking';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/db/repositories/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { MarketRepository } from './market';
2
+ export { EventRepository } from './event';
3
+ export { MarketStateRepository } from './market-state';
4
+ export { PositionRepository } from './position';
5
+ export { CursorRepository } from './cursor';
6
+ export { RankingRepository } from './ranking';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/repositories/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAA+B,MAAM,gBAAgB,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Market state upsert — stores latest on-chain snapshot.
3
+ */
4
+ import type { Database } from 'bun:sqlite';
5
+ import type { MarketStateRow } from '../../types';
6
+ export interface UpsertMarketStateInput {
7
+ readonly market_address: string;
8
+ readonly mean: number | null;
9
+ readonly sigma: number | null;
10
+ readonly variance: number | null;
11
+ readonly is_initialized: boolean;
12
+ readonly is_paused: boolean;
13
+ readonly is_settled: boolean;
14
+ readonly settlement_value: number | null;
15
+ readonly total_shares: string | null;
16
+ readonly total_backing: string | null;
17
+ readonly mean_raw: string | null;
18
+ readonly sigma_raw: string | null;
19
+ readonly variance_raw: string | null;
20
+ }
21
+ export declare class MarketStateRepository {
22
+ private readonly db;
23
+ constructor(db: Database);
24
+ upsert(input: UpsertMarketStateInput): void;
25
+ findByMarket(marketAddress: string): MarketStateRow | null;
26
+ }
27
+ //# sourceMappingURL=market-state.d.ts.map
@@ -0,0 +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;CAO3D"}
@@ -0,0 +1,35 @@
1
+ export class MarketStateRepository {
2
+ db;
3
+ constructor(db) {
4
+ this.db = db;
5
+ }
6
+ upsert(input) {
7
+ this.db
8
+ .query(`INSERT INTO market_state
9
+ (market_address, mean, sigma, variance, is_initialized, is_paused,
10
+ is_settled, settlement_value, total_shares, total_backing,
11
+ mean_raw, sigma_raw, variance_raw, fetched_at)
12
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, unixepoch())
13
+ ON CONFLICT(market_address) DO UPDATE SET
14
+ mean = excluded.mean,
15
+ sigma = excluded.sigma,
16
+ variance = excluded.variance,
17
+ is_initialized = excluded.is_initialized,
18
+ is_paused = excluded.is_paused,
19
+ is_settled = excluded.is_settled,
20
+ settlement_value = excluded.settlement_value,
21
+ total_shares = excluded.total_shares,
22
+ total_backing = excluded.total_backing,
23
+ mean_raw = excluded.mean_raw,
24
+ sigma_raw = excluded.sigma_raw,
25
+ variance_raw = excluded.variance_raw,
26
+ 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);
28
+ }
29
+ findByMarket(marketAddress) {
30
+ return (this.db
31
+ .query('SELECT * FROM market_state WHERE market_address = ?')
32
+ .get(marketAddress) ?? null);
33
+ }
34
+ }
35
+ //# sourceMappingURL=market-state.js.map
@@ -0,0 +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;CACF"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Market registry CRUD.
3
+ */
4
+ import type { Database } from 'bun:sqlite';
5
+ import type { MarketRow, CreateMarketInput, UpdateMarketInput } from '../../types';
6
+ export declare class MarketRepository {
7
+ private readonly db;
8
+ constructor(db: Database);
9
+ findAll(activeOnly?: boolean): MarketRow[];
10
+ findByAddress(address: string): MarketRow | null;
11
+ create(input: CreateMarketInput): MarketRow;
12
+ update(address: string, input: UpdateMarketInput): MarketRow | null;
13
+ softDelete(address: string): boolean;
14
+ count(): number;
15
+ }
16
+ //# sourceMappingURL=market.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"market.d.ts","sourceRoot":"","sources":["../../../src/db/repositories/market.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EACV,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAErB,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEzC,OAAO,CAAC,UAAU,UAAQ,GAAG,SAAS,EAAE;IAOxC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAQhD,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,SAAS;IAiB3C,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,SAAS,GAAG,IAAI;IA8BnE,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IASpC,KAAK,IAAI,MAAM;CAMhB"}
@@ -0,0 +1,59 @@
1
+ export class MarketRepository {
2
+ db;
3
+ constructor(db) {
4
+ this.db = db;
5
+ }
6
+ findAll(activeOnly = false) {
7
+ const sql = activeOnly
8
+ ? 'SELECT * FROM markets WHERE is_active = 1 ORDER BY created_at DESC'
9
+ : 'SELECT * FROM markets ORDER BY created_at DESC';
10
+ return this.db.query(sql).all();
11
+ }
12
+ findByAddress(address) {
13
+ return (this.db
14
+ .query('SELECT * FROM markets WHERE address = ?')
15
+ .get(address) ?? null);
16
+ }
17
+ create(input) {
18
+ const topics = JSON.stringify(input.topics ?? []);
19
+ this.db
20
+ .query(`INSERT INTO markets (address, title, description, category, topics)
21
+ VALUES (?, ?, ?, ?, ?)`)
22
+ .run(input.address.toLowerCase(), input.title, input.description ?? '', input.category ?? '', topics);
23
+ return this.findByAddress(input.address.toLowerCase());
24
+ }
25
+ update(address, input) {
26
+ const existing = this.findByAddress(address);
27
+ if (!existing)
28
+ return null;
29
+ const title = input.title ?? existing.title;
30
+ const description = input.description ?? existing.description;
31
+ const category = input.category ?? existing.category;
32
+ const topics = input.topics !== undefined
33
+ ? JSON.stringify(input.topics)
34
+ : existing.topics;
35
+ const isActive = input.is_active !== undefined
36
+ ? input.is_active
37
+ ? 1
38
+ : 0
39
+ : existing.is_active;
40
+ this.db
41
+ .query(`UPDATE markets
42
+ SET title = ?, description = ?, category = ?, topics = ?,
43
+ is_active = ?, updated_at = unixepoch()
44
+ WHERE address = ?`)
45
+ .run(title, description, category, topics, isActive, address);
46
+ return this.findByAddress(address);
47
+ }
48
+ softDelete(address) {
49
+ const result = this.db
50
+ .query('UPDATE markets SET is_active = 0, updated_at = unixepoch() WHERE address = ?')
51
+ .run(address);
52
+ return result.changes > 0;
53
+ }
54
+ count() {
55
+ const row = this.db.query('SELECT COUNT(*) as cnt FROM markets').get();
56
+ return row.cnt;
57
+ }
58
+ }
59
+ //# sourceMappingURL=market.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"market.js","sourceRoot":"","sources":["../../../src/db/repositories/market.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,EAAY;QAAZ,OAAE,GAAF,EAAE,CAAU;IAAG,CAAC;IAE7C,OAAO,CAAC,UAAU,GAAG,KAAK;QACxB,MAAM,GAAG,GAAG,UAAU;YACpB,CAAC,CAAC,oEAAoE;YACtE,CAAC,CAAC,gDAAgD,CAAC;QACrD,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAiB,CAAC;IACjD,CAAC;IAED,aAAa,CAAC,OAAe;QAC3B,OAAO,CACJ,IAAI,CAAC,EAAE;aACL,KAAK,CAAC,yCAAyC,CAAC;aAChD,GAAG,CAAC,OAAO,CAAsB,IAAI,IAAI,CAC7C,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,KAAwB;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,EAAE;aACJ,KAAK,CACJ;gCACwB,CACzB;aACA,GAAG,CACF,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,EAC3B,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,WAAW,IAAI,EAAE,EACvB,KAAK,CAAC,QAAQ,IAAI,EAAE,EACpB,MAAM,CACP,CAAC;QACJ,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAE,CAAC;IAC1D,CAAC;IAED,MAAM,CAAC,OAAe,EAAE,KAAwB;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE3B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC;QAC5C,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,CAAC;QAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC;QACrD,MAAM,MAAM,GACV,KAAK,CAAC,MAAM,KAAK,SAAS;YACxB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;YAC9B,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QACtB,MAAM,QAAQ,GACZ,KAAK,CAAC,SAAS,KAAK,SAAS;YAC3B,CAAC,CAAC,KAAK,CAAC,SAAS;gBACf,CAAC,CAAC,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;QAEzB,IAAI,CAAC,EAAE;aACJ,KAAK,CACJ;;;2BAGmB,CACpB;aACA,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEhE,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,UAAU,CAAC,OAAe;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;aACnB,KAAK,CACJ,8EAA8E,CAC/E;aACA,GAAG,CAAC,OAAO,CAAC,CAAC;QAChB,OAAO,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,GAAG,EAEnE,CAAC;QACF,OAAO,GAAG,CAAC,GAAG,CAAC;IACjB,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Trader position upsert + queries.
3
+ */
4
+ import type { Database } from 'bun:sqlite';
5
+ import type { UserPositionRow, UpsertPositionInput } from '../../types';
6
+ export declare class PositionRepository {
7
+ private readonly db;
8
+ constructor(db: Database);
9
+ upsert(input: UpsertPositionInput): void;
10
+ ensureTrader(marketAddress: string, trader: string): void;
11
+ findByMarket(marketAddress: string): UserPositionRow[];
12
+ findByTrader(trader: string): UserPositionRow[];
13
+ findAll(): UserPositionRow[];
14
+ }
15
+ //# sourceMappingURL=position.d.ts.map
@@ -0,0 +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,eAAe,EAAE,mBAAmB,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;IAmCxC,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;CAK7B"}
@@ -0,0 +1,52 @@
1
+ export class PositionRepository {
2
+ db;
3
+ constructor(db) {
4
+ this.db = db;
5
+ }
6
+ upsert(input) {
7
+ this.db
8
+ .query(`INSERT INTO user_positions
9
+ (market_address, trader, has_position, collateral_locked,
10
+ mean, sigma, variance, settlement_state, unrealized_pnl,
11
+ delta_count, claimed, fetched_at)
12
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, unixepoch())
13
+ ON CONFLICT(market_address, trader) DO UPDATE SET
14
+ has_position = excluded.has_position,
15
+ collateral_locked = excluded.collateral_locked,
16
+ mean = excluded.mean,
17
+ sigma = excluded.sigma,
18
+ variance = excluded.variance,
19
+ settlement_state = excluded.settlement_state,
20
+ unrealized_pnl = excluded.unrealized_pnl,
21
+ delta_count = excluded.delta_count,
22
+ claimed = excluded.claimed,
23
+ fetched_at = unixepoch()`)
24
+ .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);
25
+ }
26
+ ensureTrader(marketAddress, trader) {
27
+ this.db
28
+ .query(`INSERT OR IGNORE INTO user_positions (market_address, trader)
29
+ VALUES (?, ?)`)
30
+ .run(marketAddress, trader);
31
+ }
32
+ findByMarket(marketAddress) {
33
+ return this.db
34
+ .query(`SELECT * FROM user_positions
35
+ WHERE market_address = ?
36
+ ORDER BY trader`)
37
+ .all(marketAddress);
38
+ }
39
+ findByTrader(trader) {
40
+ return this.db
41
+ .query(`SELECT * FROM user_positions
42
+ WHERE trader = ?
43
+ ORDER BY market_address`)
44
+ .all(trader);
45
+ }
46
+ findAll() {
47
+ return this.db
48
+ .query('SELECT * FROM user_positions ORDER BY market_address, trader')
49
+ .all();
50
+ }
51
+ }
52
+ //# sourceMappingURL=position.js.map
@@ -0,0 +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;;;;;;;;;;;;;;;oCAe4B,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,CACtB,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;CACF"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * PnL aggregation queries for the leaderboard.
3
+ */
4
+ import type { Database } from 'bun:sqlite';
5
+ import type { RankingEntry, TraderStatsResponse } from '../../types';
6
+ export declare class RankingRepository {
7
+ private readonly db;
8
+ constructor(db: Database);
9
+ getLeaderboard(limit?: number): RankingEntry[];
10
+ getTraderStats(trader: string): TraderStatsResponse;
11
+ }
12
+ //# sourceMappingURL=ranking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ranking.d.ts","sourceRoot":"","sources":["../../../src/db/repositories/ranking.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAErE,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEzC,cAAc,CAAC,KAAK,SAAK,GAAG,YAAY,EAAE;IAiB1C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB;CA+CpD"}
@@ -0,0 +1,54 @@
1
+ export class RankingRepository {
2
+ db;
3
+ constructor(db) {
4
+ this.db = db;
5
+ }
6
+ getLeaderboard(limit = 50) {
7
+ return this.db
8
+ .query(`SELECT
9
+ trader,
10
+ COALESCE(SUM(unrealized_pnl), 0) as totalPnl,
11
+ COUNT(DISTINCT market_address) as marketsTraded,
12
+ SUM(delta_count) as totalTrades
13
+ FROM user_positions
14
+ WHERE has_position = 1 OR delta_count > 0
15
+ GROUP BY trader
16
+ ORDER BY totalPnl DESC
17
+ LIMIT ?`)
18
+ .all(limit);
19
+ }
20
+ getTraderStats(trader) {
21
+ const eventStats = this.db
22
+ .query(`SELECT
23
+ COUNT(*) as totalTrades,
24
+ COUNT(DISTINCT market_address) as marketsTraded,
25
+ MIN(timestamp) as firstTradeAt,
26
+ MAX(timestamp) as lastTradeAt
27
+ FROM market_events
28
+ WHERE trader = ?`)
29
+ .get(trader);
30
+ const pnlStats = this.db
31
+ .query(`SELECT
32
+ COALESCE(SUM(unrealized_pnl), 0) as totalPnl,
33
+ COALESCE(MAX(unrealized_pnl), 0) as biggestWin
34
+ FROM user_positions
35
+ WHERE trader = ? AND unrealized_pnl IS NOT NULL`)
36
+ .get(trader);
37
+ const unrealizedPnl = this.db
38
+ .query(`SELECT COALESCE(SUM(unrealized_pnl), 0) as unrealizedPnl
39
+ FROM user_positions
40
+ WHERE trader = ? AND has_position = 1 AND unrealized_pnl IS NOT NULL`)
41
+ .get(trader);
42
+ return {
43
+ trader,
44
+ totalPnl: pnlStats.totalPnl,
45
+ unrealizedPnl: unrealizedPnl.unrealizedPnl,
46
+ biggestWin: pnlStats.biggestWin,
47
+ totalTrades: eventStats.totalTrades,
48
+ marketsTraded: eventStats.marketsTraded,
49
+ firstTradeAt: eventStats.firstTradeAt,
50
+ lastTradeAt: eventStats.lastTradeAt,
51
+ };
52
+ }
53
+ }
54
+ //# sourceMappingURL=ranking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ranking.js","sourceRoot":"","sources":["../../../src/db/repositories/ranking.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,iBAAiB;IACC;IAA7B,YAA6B,EAAY;QAAZ,OAAE,GAAF,EAAE,CAAU;IAAG,CAAC;IAE7C,cAAc,CAAC,KAAK,GAAG,EAAE;QACvB,OAAO,IAAI,CAAC,EAAE;aACX,KAAK,CACJ;;;;;;;;;iBASS,CACV;aACA,GAAG,CAAC,KAAK,CAAmB,CAAC;IAClC,CAAC;IAED,cAAc,CAAC,MAAc;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE;aACvB,KAAK,CACJ;;;;;;0BAMkB,CACnB;aACA,GAAG,CAAC,MAAM,CAKZ,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE;aACrB,KAAK,CACJ;;;;yDAIiD,CAClD;aACA,GAAG,CAAC,MAAM,CAA6C,CAAC;QAE3D,MAAM,aAAa,GAAG,IAAI,CAAC,EAAE;aAC1B,KAAK,CACJ;;8EAEsE,CACvE;aACA,GAAG,CAAC,MAAM,CAA8B,CAAC;QAE5C,OAAO;YACL,MAAM;YACN,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,aAAa,EAAE,aAAa,CAAC,aAAa;YAC1C,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,WAAW,EAAE,UAAU,CAAC,WAAW;YACnC,aAAa,EAAE,UAAU,CAAC,aAAa;YACvC,YAAY,EAAE,UAAU,CAAC,YAAY;YACrC,WAAW,EAAE,UAAU,CAAC,WAAW;SACpC,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * SQLite schema DDL — run on startup.
3
+ */
4
+ import type { Database } from 'bun:sqlite';
5
+ export declare function initializeSchema(db: Database): void;
6
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +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;AAuF3C,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAEnD"}
@@ -0,0 +1,88 @@
1
+ const SCHEMA_DDL = `
2
+ CREATE TABLE IF NOT EXISTS markets (
3
+ address TEXT PRIMARY KEY,
4
+ title TEXT NOT NULL,
5
+ description TEXT NOT NULL DEFAULT '',
6
+ category TEXT NOT NULL DEFAULT '',
7
+ topics TEXT NOT NULL DEFAULT '[]',
8
+ is_active INTEGER NOT NULL DEFAULT 1,
9
+ created_at INTEGER NOT NULL DEFAULT (unixepoch()),
10
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch())
11
+ );
12
+
13
+ CREATE TABLE IF NOT EXISTS market_state (
14
+ market_address TEXT PRIMARY KEY REFERENCES markets(address),
15
+ mean REAL,
16
+ sigma REAL,
17
+ variance REAL,
18
+ is_initialized INTEGER NOT NULL DEFAULT 0,
19
+ is_paused INTEGER NOT NULL DEFAULT 0,
20
+ is_settled INTEGER NOT NULL DEFAULT 0,
21
+ settlement_value REAL,
22
+ total_shares TEXT,
23
+ total_backing TEXT,
24
+ mean_raw TEXT,
25
+ sigma_raw TEXT,
26
+ variance_raw TEXT,
27
+ fetched_at INTEGER NOT NULL DEFAULT (unixepoch())
28
+ );
29
+
30
+ CREATE TABLE IF NOT EXISTS market_events (
31
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
32
+ market_address TEXT NOT NULL REFERENCES markets(address),
33
+ tx_hash TEXT NOT NULL UNIQUE,
34
+ block_number INTEGER NOT NULL,
35
+ timestamp INTEGER NOT NULL,
36
+ event_type TEXT NOT NULL CHECK(event_type IN ('bootstrapped','trade_moved','market_initialized','trade_executed')),
37
+ trader TEXT,
38
+ mean REAL NOT NULL,
39
+ std_dev REAL NOT NULL,
40
+ lower_bound REAL NOT NULL,
41
+ upper_bound REAL NOT NULL,
42
+ old_mean REAL,
43
+ old_std_dev REAL,
44
+ collateral_posted TEXT,
45
+ raw_data TEXT,
46
+ created_at INTEGER NOT NULL DEFAULT (unixepoch())
47
+ );
48
+
49
+ CREATE INDEX IF NOT EXISTS idx_events_market_block
50
+ ON market_events(market_address, block_number);
51
+
52
+ CREATE INDEX IF NOT EXISTS idx_events_trader
53
+ ON market_events(trader) WHERE trader IS NOT NULL;
54
+
55
+ CREATE INDEX IF NOT EXISTS idx_events_market_ts
56
+ ON market_events(market_address, timestamp);
57
+
58
+ CREATE TABLE IF NOT EXISTS user_positions (
59
+ market_address TEXT NOT NULL REFERENCES markets(address),
60
+ trader TEXT NOT NULL,
61
+ has_position INTEGER NOT NULL DEFAULT 0,
62
+ collateral_locked TEXT,
63
+ mean REAL,
64
+ sigma REAL,
65
+ variance REAL,
66
+ settlement_state TEXT NOT NULL DEFAULT 'unknown',
67
+ unrealized_pnl REAL,
68
+ delta_count INTEGER NOT NULL DEFAULT 0,
69
+ claimed INTEGER NOT NULL DEFAULT 0,
70
+ fetched_at INTEGER NOT NULL DEFAULT (unixepoch()),
71
+ PRIMARY KEY (market_address, trader)
72
+ );
73
+
74
+ CREATE INDEX IF NOT EXISTS idx_positions_trader
75
+ ON user_positions(trader);
76
+
77
+ CREATE TABLE IF NOT EXISTS indexer_cursors (
78
+ market_address TEXT PRIMARY KEY REFERENCES markets(address),
79
+ last_block_number INTEGER NOT NULL DEFAULT 0,
80
+ last_timestamp INTEGER NOT NULL DEFAULT 0,
81
+ events_count INTEGER NOT NULL DEFAULT 0,
82
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch())
83
+ );
84
+ `;
85
+ export function initializeSchema(db) {
86
+ db.exec(SCHEMA_DDL);
87
+ }
88
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmFlB,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,EAAY;IAC3C,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACtB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Event decoder for Distribution Market events.
3
+ *
4
+ * Supports two event generations:
5
+ * Legacy: Bootstrapped / TradeMoved (Q96 encoding)
6
+ * Current: MarketInitialized / TradeExecuted (SQ128x128 4-limb encoding)
7
+ */
8
+ import type { VoyagerEvent, DecodedMarketEvent } from '../types';
9
+ export declare function decodeEvent(event: VoyagerEvent): DecodedMarketEvent | null;
10
+ export declare function decodeEvents(events: readonly VoyagerEvent[]): DecodedMarketEvent[];
11
+ //# sourceMappingURL=decoder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decoder.d.ts","sourceRoot":"","sources":["../../src/etl/decoder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAyCjE,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,kBAAkB,GAAG,IAAI,CAY1E;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,YAAY,EAAE,GAC9B,kBAAkB,EAAE,CAYtB"}