@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.
- package/README.md +21 -0
- package/dist/__tests__/performance/perf-fixtures.d.ts +26 -0
- package/dist/__tests__/performance/perf-fixtures.d.ts.map +1 -0
- package/dist/__tests__/performance/perf-fixtures.js +172 -0
- package/dist/__tests__/performance/perf-fixtures.js.map +1 -0
- package/dist/__tests__/performance/perf-utils.d.ts +42 -0
- package/dist/__tests__/performance/perf-utils.d.ts.map +1 -0
- package/dist/__tests__/performance/perf-utils.js +91 -0
- package/dist/__tests__/performance/perf-utils.js.map +1 -0
- package/dist/api/app.d.ts +1 -1
- package/dist/api/routes/admin-subscriptions.d.ts +1 -1
- package/dist/api/routes/admin.d.ts.map +1 -1
- package/dist/api/routes/admin.js +4 -0
- package/dist/api/routes/admin.js.map +1 -1
- package/dist/api/routes/market-events.d.ts.map +1 -1
- package/dist/api/routes/market-events.js +8 -0
- package/dist/api/routes/market-events.js.map +1 -1
- package/dist/api/routes/markets.d.ts.map +1 -1
- package/dist/api/routes/markets.js +8 -0
- package/dist/api/routes/markets.js.map +1 -1
- package/dist/api/routes/trader-events.d.ts.map +1 -1
- package/dist/api/routes/trader-events.js +8 -0
- package/dist/api/routes/trader-events.js.map +1 -1
- package/dist/db/connection.d.ts.map +1 -1
- package/dist/db/connection.js +4 -0
- package/dist/db/connection.js.map +1 -1
- package/dist/db/repositories/activity-feed.d.ts +3 -0
- package/dist/db/repositories/activity-feed.d.ts.map +1 -1
- package/dist/db/repositories/activity-feed.js +33 -18
- package/dist/db/repositories/activity-feed.js.map +1 -1
- package/dist/db/repositories/event.d.ts +22 -0
- package/dist/db/repositories/event.d.ts.map +1 -1
- package/dist/db/repositories/event.js +139 -75
- package/dist/db/repositories/event.js.map +1 -1
- package/dist/db/repositories/lp-position.d.ts +2 -10
- package/dist/db/repositories/lp-position.d.ts.map +1 -1
- package/dist/db/repositories/lp-position.js +54 -52
- package/dist/db/repositories/lp-position.js.map +1 -1
- package/dist/db/repositories/market-state.d.ts +10 -0
- package/dist/db/repositories/market-state.d.ts.map +1 -1
- package/dist/db/repositories/market-state.js +16 -5
- package/dist/db/repositories/market-state.js.map +1 -1
- package/dist/db/repositories/market.d.ts +7 -0
- package/dist/db/repositories/market.d.ts.map +1 -1
- package/dist/db/repositories/market.js +32 -24
- package/dist/db/repositories/market.js.map +1 -1
- package/dist/db/repositories/multinoulli-snapshots.d.ts +1 -0
- package/dist/db/repositories/multinoulli-snapshots.d.ts.map +1 -1
- package/dist/db/repositories/multinoulli-snapshots.js +7 -5
- package/dist/db/repositories/multinoulli-snapshots.js.map +1 -1
- package/dist/db/repositories/position.d.ts +1 -0
- package/dist/db/repositories/position.d.ts.map +1 -1
- package/dist/db/repositories/position.js +9 -0
- package/dist/db/repositories/position.js.map +1 -1
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +114 -5
- package/dist/db/schema.js.map +1 -1
- package/dist/etl/decoder.js +16 -0
- package/dist/etl/decoder.js.map +1 -1
- package/dist/etl/event-indexer.d.ts.map +1 -1
- package/dist/etl/event-indexer.js +138 -74
- package/dist/etl/event-indexer.js.map +1 -1
- package/dist/etl/lp-position-refresher.d.ts +9 -3
- package/dist/etl/lp-position-refresher.d.ts.map +1 -1
- package/dist/etl/lp-position-refresher.js +74 -21
- package/dist/etl/lp-position-refresher.js.map +1 -1
- package/dist/etl/position-refresher.d.ts +9 -3
- package/dist/etl/position-refresher.d.ts.map +1 -1
- package/dist/etl/position-refresher.js +44 -36
- package/dist/etl/position-refresher.js.map +1 -1
- package/dist/etl/state-refresher.d.ts +8 -3
- package/dist/etl/state-refresher.d.ts.map +1 -1
- package/dist/etl/state-refresher.js +137 -12
- package/dist/etl/state-refresher.js.map +1 -1
- package/dist/layers/ChainReaderLive.d.ts.map +1 -1
- package/dist/layers/ChainReaderLive.js +69 -22
- package/dist/layers/ChainReaderLive.js.map +1 -1
- package/dist/services/ChainReader.d.ts +21 -0
- package/dist/services/ChainReader.d.ts.map +1 -1
- package/dist/services/ChainReader.js.map +1 -1
- package/dist/types/api.d.ts +28 -0
- package/dist/types/api.d.ts.map +1 -1
- package/dist/types/event.d.ts +24 -0
- package/dist/types/event.d.ts.map +1 -1
- package/dist/types/market.d.ts +16 -0
- package/dist/types/market.d.ts.map +1 -1
- 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;
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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;
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
137
|
+
if (fromTimestamp !== undefined && toTimestamp !== undefined) {
|
|
138
|
+
return this.findByMarketRangeStmt.all(marketAddress, fromTimestamp, toTimestamp, limit, offset);
|
|
139
|
+
}
|
|
50
140
|
if (fromTimestamp !== undefined) {
|
|
51
|
-
|
|
52
|
-
params.push(fromTimestamp);
|
|
141
|
+
return this.findByMarketFromStmt.all(marketAddress, fromTimestamp, limit, offset);
|
|
53
142
|
}
|
|
54
143
|
if (toTimestamp !== undefined) {
|
|
55
|
-
|
|
56
|
-
params.push(toTimestamp);
|
|
144
|
+
return this.findByMarketToStmt.all(marketAddress, toTimestamp, limit, offset);
|
|
57
145
|
}
|
|
58
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
96
|
-
|
|
161
|
+
if (fromTimestamp !== undefined && toTimestamp !== undefined) {
|
|
162
|
+
return this.findByTraderRangeStmt.all(trader, fromTimestamp, toTimestamp, limit, offset);
|
|
163
|
+
}
|
|
97
164
|
if (fromTimestamp !== undefined) {
|
|
98
|
-
|
|
99
|
-
params.push(fromTimestamp);
|
|
165
|
+
return this.findByTraderFromStmt.all(trader, fromTimestamp, limit, offset);
|
|
100
166
|
}
|
|
101
167
|
if (toTimestamp !== undefined) {
|
|
102
|
-
|
|
103
|
-
params.push(toTimestamp);
|
|
168
|
+
return this.findByTraderToStmt.all(trader, toTimestamp, limit, offset);
|
|
104
169
|
}
|
|
105
|
-
|
|
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.
|
|
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.
|
|
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":"AAMA,MAAM,OAAO,eAAe;
|
|
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
|
-
|
|
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":"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;
|
|
1
|
+
{"version":3,"file":"lp-position.d.ts","sourceRoot":"","sources":["../../../src/db/repositories/lp-position.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
|
18
|
-
|
|
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 = ?
|
|
30
|
-
AND event_type IN ('liquidity_added', 'liquidity_removed', 'market_initialized')
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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(
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
.
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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) {
|