@the-situation/indexer 0.11.3 → 0.11.5
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/dist/api/app.d.ts +188 -0
- package/dist/api/app.d.ts.map +1 -1
- package/dist/api/app.js +4 -1
- package/dist/api/app.js.map +1 -1
- package/dist/api/routes/activity-feed.d.ts +54 -0
- package/dist/api/routes/activity-feed.d.ts.map +1 -0
- package/dist/api/routes/activity-feed.js +66 -0
- package/dist/api/routes/activity-feed.js.map +1 -0
- package/dist/api/routes/admin-subscriptions.d.ts +176 -0
- package/dist/api/routes/admin-subscriptions.d.ts.map +1 -0
- package/dist/api/routes/admin-subscriptions.js +69 -0
- package/dist/api/routes/admin-subscriptions.js.map +1 -0
- package/dist/api/routes/index.d.ts +3 -0
- package/dist/api/routes/index.d.ts.map +1 -1
- package/dist/api/routes/index.js +3 -0
- package/dist/api/routes/index.js.map +1 -1
- package/dist/api/routes/spice-faucet.d.ts +76 -0
- package/dist/api/routes/spice-faucet.d.ts.map +1 -0
- package/dist/api/routes/spice-faucet.js +78 -0
- package/dist/api/routes/spice-faucet.js.map +1 -0
- package/dist/client/IndexerClient.d.ts +8 -0
- package/dist/client/IndexerClient.d.ts.map +1 -1
- package/dist/client/IndexerClient.js.map +1 -1
- package/dist/client/IndexerClientLive.d.ts.map +1 -1
- package/dist/client/IndexerClientLive.js +28 -0
- package/dist/client/IndexerClientLive.js.map +1 -1
- package/dist/client/convenience.d.ts +2 -0
- package/dist/client/convenience.d.ts.map +1 -1
- package/dist/client/convenience.js +1 -0
- package/dist/client/convenience.js.map +1 -1
- package/dist/client/index.d.ts +2 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/db/repositories/activity-feed.d.ts +24 -0
- package/dist/db/repositories/activity-feed.d.ts.map +1 -0
- package/dist/db/repositories/activity-feed.js +76 -0
- package/dist/db/repositories/activity-feed.js.map +1 -0
- package/dist/db/repositories/index.d.ts +2 -0
- package/dist/db/repositories/index.d.ts.map +1 -1
- package/dist/db/repositories/index.js +2 -0
- package/dist/db/repositories/index.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 +10 -4
- package/dist/db/repositories/position.js.map +1 -1
- package/dist/db/repositories/ranking.d.ts.map +1 -1
- package/dist/db/repositories/ranking.js +7 -8
- package/dist/db/repositories/ranking.js.map +1 -1
- package/dist/db/repositories/subscription.d.ts +18 -0
- package/dist/db/repositories/subscription.d.ts.map +1 -0
- package/dist/db/repositories/subscription.js +77 -0
- package/dist/db/repositories/subscription.js.map +1 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +26 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/etl/event-indexer.d.ts +1 -1
- package/dist/etl/position-refresher.d.ts +1 -1
- package/dist/etl/position-refresher.d.ts.map +1 -1
- package/dist/etl/position-refresher.js +62 -20
- package/dist/etl/position-refresher.js.map +1 -1
- package/dist/etl/scheduler.d.ts.map +1 -1
- package/dist/etl/scheduler.js +79 -14
- package/dist/etl/scheduler.js.map +1 -1
- package/dist/etl/state-refresher.d.ts +1 -1
- package/dist/index.js +13 -1
- package/dist/index.js.map +1 -1
- package/dist/layers/ChainReaderLive.d.ts.map +1 -1
- package/dist/layers/ChainReaderLive.js +45 -33
- package/dist/layers/ChainReaderLive.js.map +1 -1
- package/dist/layers/DatabaseLive.d.ts.map +1 -1
- package/dist/layers/DatabaseLive.js +3 -1
- package/dist/layers/DatabaseLive.js.map +1 -1
- package/dist/logger.d.ts +13 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +29 -0
- package/dist/logger.js.map +1 -0
- package/dist/services/ActivityEnricher.d.ts +29 -0
- package/dist/services/ActivityEnricher.d.ts.map +1 -0
- package/dist/services/ActivityEnricher.js +94 -0
- package/dist/services/ActivityEnricher.js.map +1 -0
- package/dist/services/Database.d.ts +3 -1
- package/dist/services/Database.d.ts.map +1 -1
- package/dist/services/Database.js.map +1 -1
- package/dist/services/WebhookDispatcher.d.ts +14 -0
- package/dist/services/WebhookDispatcher.d.ts.map +1 -0
- package/dist/services/WebhookDispatcher.js +129 -0
- package/dist/services/WebhookDispatcher.js.map +1 -0
- package/dist/types/activity.d.ts +92 -0
- package/dist/types/activity.d.ts.map +1 -0
- package/dist/types/activity.js +28 -0
- package/dist/types/activity.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/position.d.ts +2 -0
- package/dist/types/position.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -7,7 +7,7 @@ export class RankingRepository {
|
|
|
7
7
|
return this.db
|
|
8
8
|
.query(`SELECT
|
|
9
9
|
p.trader,
|
|
10
|
-
COALESCE(SUM(p.unrealized_pnl), 0) as totalPnl,
|
|
10
|
+
COALESCE(SUM(COALESCE(p.unrealized_pnl, 0) + COALESCE(p.realized_pnl, 0)), 0) as totalPnl,
|
|
11
11
|
COUNT(DISTINCT p.market_address) as marketsTraded,
|
|
12
12
|
COALESCE(e.totalTrades, 0) as totalTrades
|
|
13
13
|
FROM user_positions p
|
|
@@ -16,10 +16,9 @@ export class RankingRepository {
|
|
|
16
16
|
FROM market_events
|
|
17
17
|
WHERE trader IS NOT NULL
|
|
18
18
|
GROUP BY trader
|
|
19
|
-
) e ON
|
|
20
|
-
WHERE p.has_position = 1 OR
|
|
21
|
-
|
|
22
|
-
)
|
|
19
|
+
) e ON p.trader = e.trader
|
|
20
|
+
WHERE p.has_position = 1 OR p.delta_count > 0
|
|
21
|
+
OR p.unrealized_pnl IS NOT NULL OR p.realized_pnl IS NOT NULL
|
|
23
22
|
GROUP BY p.trader
|
|
24
23
|
ORDER BY totalPnl DESC
|
|
25
24
|
LIMIT ?`)
|
|
@@ -37,10 +36,10 @@ export class RankingRepository {
|
|
|
37
36
|
.get(trader);
|
|
38
37
|
const pnlStats = this.db
|
|
39
38
|
.query(`SELECT
|
|
40
|
-
COALESCE(SUM(unrealized_pnl), 0) as totalPnl,
|
|
41
|
-
COALESCE(MAX(unrealized_pnl), 0) as biggestWin
|
|
39
|
+
COALESCE(SUM(COALESCE(unrealized_pnl, 0) + COALESCE(realized_pnl, 0)), 0) as totalPnl,
|
|
40
|
+
COALESCE(MAX(COALESCE(unrealized_pnl, 0) + COALESCE(realized_pnl, 0)), 0) as biggestWin
|
|
42
41
|
FROM user_positions
|
|
43
|
-
WHERE trader = ? AND unrealized_pnl IS NOT NULL`)
|
|
42
|
+
WHERE trader = ? AND (unrealized_pnl IS NOT NULL OR realized_pnl IS NOT NULL)`)
|
|
44
43
|
.get(trader);
|
|
45
44
|
const unrealizedPnl = this.db
|
|
46
45
|
.query(`SELECT COALESCE(SUM(unrealized_pnl), 0) as unrealizedPnl
|
|
@@ -1 +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
|
|
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;;;;;;;;;;;;;;;;iBAgBS,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;;;;uFAI+E,CAChF;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,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Webhook subscription CRUD repository.
|
|
3
|
+
*/
|
|
4
|
+
import type { Database } from 'bun:sqlite';
|
|
5
|
+
import type { CreateSubscriptionInput, SubscriptionRow, UpdateSubscriptionInput } from '../../types/activity';
|
|
6
|
+
export declare class SubscriptionRepository {
|
|
7
|
+
private readonly db;
|
|
8
|
+
constructor(db: Database);
|
|
9
|
+
create(input: CreateSubscriptionInput): SubscriptionRow;
|
|
10
|
+
findAll(): SubscriptionRow[];
|
|
11
|
+
findActive(): SubscriptionRow[];
|
|
12
|
+
findById(id: number): SubscriptionRow | null;
|
|
13
|
+
update(id: number, input: UpdateSubscriptionInput): SubscriptionRow | null;
|
|
14
|
+
delete(id: number): boolean;
|
|
15
|
+
recordSuccess(id: number): void;
|
|
16
|
+
recordFailure(id: number): void;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=subscription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../../../src/db/repositories/subscription.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EACV,uBAAuB,EACvB,eAAe,EACf,uBAAuB,EACxB,MAAM,sBAAsB,CAAC;AAI9B,qBAAa,sBAAsB;IACrB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEzC,MAAM,CAAC,KAAK,EAAE,uBAAuB,GAAG,eAAe;IAWvD,OAAO,IAAI,eAAe,EAAE;IAM5B,UAAU,IAAI,eAAe,EAAE;IAM/B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAQ5C,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,uBAAuB,GAAG,eAAe,GAAG,IAAI;IAkC1E,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAK3B,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAQ/B,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;CAWhC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
const MAX_FAILURES = 10;
|
|
2
|
+
export class SubscriptionRepository {
|
|
3
|
+
db;
|
|
4
|
+
constructor(db) {
|
|
5
|
+
this.db = db;
|
|
6
|
+
}
|
|
7
|
+
create(input) {
|
|
8
|
+
const result = this.db
|
|
9
|
+
.query(`INSERT INTO subscriptions (name, webhook_url, secret, filters)
|
|
10
|
+
VALUES (?, ?, ?, ?)
|
|
11
|
+
RETURNING *`)
|
|
12
|
+
.get(input.name, input.webhook_url, input.secret ?? null, JSON.stringify(input.filters));
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
findAll() {
|
|
16
|
+
return this.db
|
|
17
|
+
.query('SELECT * FROM subscriptions ORDER BY created_at DESC')
|
|
18
|
+
.all();
|
|
19
|
+
}
|
|
20
|
+
findActive() {
|
|
21
|
+
return this.db
|
|
22
|
+
.query('SELECT * FROM subscriptions WHERE is_active = 1 ORDER BY id')
|
|
23
|
+
.all();
|
|
24
|
+
}
|
|
25
|
+
findById(id) {
|
|
26
|
+
return (this.db
|
|
27
|
+
.query('SELECT * FROM subscriptions WHERE id = ?')
|
|
28
|
+
.get(id) ?? null);
|
|
29
|
+
}
|
|
30
|
+
update(id, input) {
|
|
31
|
+
const sets = ['updated_at = unixepoch()'];
|
|
32
|
+
const params = [];
|
|
33
|
+
if (input.name !== undefined) {
|
|
34
|
+
sets.push('name = ?');
|
|
35
|
+
params.push(input.name);
|
|
36
|
+
}
|
|
37
|
+
if (input.webhook_url !== undefined) {
|
|
38
|
+
sets.push('webhook_url = ?');
|
|
39
|
+
params.push(input.webhook_url);
|
|
40
|
+
}
|
|
41
|
+
if (input.secret !== undefined) {
|
|
42
|
+
sets.push('secret = ?');
|
|
43
|
+
params.push(input.secret);
|
|
44
|
+
}
|
|
45
|
+
if (input.filters !== undefined) {
|
|
46
|
+
sets.push('filters = ?');
|
|
47
|
+
params.push(JSON.stringify(input.filters));
|
|
48
|
+
}
|
|
49
|
+
if (input.is_active !== undefined) {
|
|
50
|
+
sets.push('is_active = ?');
|
|
51
|
+
params.push(input.is_active ? 1 : 0);
|
|
52
|
+
}
|
|
53
|
+
params.push(id);
|
|
54
|
+
return (this.db
|
|
55
|
+
.query(`UPDATE subscriptions SET ${sets.join(', ')} WHERE id = ? RETURNING *`)
|
|
56
|
+
.get(...params) ?? null);
|
|
57
|
+
}
|
|
58
|
+
delete(id) {
|
|
59
|
+
const result = this.db.query('DELETE FROM subscriptions WHERE id = ?').run(id);
|
|
60
|
+
return result.changes > 0;
|
|
61
|
+
}
|
|
62
|
+
recordSuccess(id) {
|
|
63
|
+
this.db
|
|
64
|
+
.query(`UPDATE subscriptions SET last_delivered_at = unixepoch(), failure_count = 0, updated_at = unixepoch() WHERE id = ?`)
|
|
65
|
+
.run(id);
|
|
66
|
+
}
|
|
67
|
+
recordFailure(id) {
|
|
68
|
+
this.db
|
|
69
|
+
.query(`UPDATE subscriptions SET
|
|
70
|
+
failure_count = failure_count + 1,
|
|
71
|
+
is_active = CASE WHEN failure_count + 1 >= ? THEN 0 ELSE is_active END,
|
|
72
|
+
updated_at = unixepoch()
|
|
73
|
+
WHERE id = ?`)
|
|
74
|
+
.run(MAX_FAILURES, id);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=subscription.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscription.js","sourceRoot":"","sources":["../../../src/db/repositories/subscription.ts"],"names":[],"mappings":"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"}
|
package/dist/db/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
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;AAmT3C,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CA0CnD"}
|
package/dist/db/schema.js
CHANGED
|
@@ -112,6 +112,7 @@ CREATE TABLE IF NOT EXISTS user_positions (
|
|
|
112
112
|
original_probs_json TEXT,
|
|
113
113
|
collateral_locked_raw TEXT,
|
|
114
114
|
expected_value REAL,
|
|
115
|
+
realized_pnl REAL,
|
|
115
116
|
effective_mean REAL,
|
|
116
117
|
effective_sigma REAL,
|
|
117
118
|
effective_variance REAL,
|
|
@@ -140,6 +141,28 @@ CREATE TABLE IF NOT EXISTS multinoulli_state_snapshots (
|
|
|
140
141
|
CREATE INDEX IF NOT EXISTS idx_multinoulli_snapshots_market_ts
|
|
141
142
|
ON multinoulli_state_snapshots(market_address, timestamp);
|
|
142
143
|
|
|
144
|
+
CREATE TABLE IF NOT EXISTS subscriptions (
|
|
145
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
146
|
+
name TEXT NOT NULL,
|
|
147
|
+
webhook_url TEXT NOT NULL,
|
|
148
|
+
secret TEXT,
|
|
149
|
+
filters TEXT NOT NULL DEFAULT '{}',
|
|
150
|
+
is_active INTEGER NOT NULL DEFAULT 1,
|
|
151
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch()),
|
|
152
|
+
updated_at INTEGER NOT NULL DEFAULT (unixepoch()),
|
|
153
|
+
last_delivered_at INTEGER,
|
|
154
|
+
failure_count INTEGER NOT NULL DEFAULT 0
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
CREATE INDEX IF NOT EXISTS idx_events_timestamp_desc
|
|
158
|
+
ON market_events(timestamp DESC, id DESC);
|
|
159
|
+
|
|
160
|
+
CREATE TABLE IF NOT EXISTS spice_mints (
|
|
161
|
+
recipient TEXT PRIMARY KEY,
|
|
162
|
+
tx_hash TEXT,
|
|
163
|
+
minted_at INTEGER NOT NULL DEFAULT (unixepoch())
|
|
164
|
+
);
|
|
165
|
+
|
|
143
166
|
CREATE TABLE IF NOT EXISTS indexer_cursors (
|
|
144
167
|
market_address TEXT PRIMARY KEY REFERENCES markets(address),
|
|
145
168
|
last_block_number INTEGER NOT NULL DEFAULT 0,
|
|
@@ -277,12 +300,15 @@ export function initializeSchema(db) {
|
|
|
277
300
|
safeAddColumn(db, 'user_positions', 'collateral_locked_raw', 'TEXT');
|
|
278
301
|
// Leaderboard: expected value and effective distribution columns
|
|
279
302
|
safeAddColumn(db, 'user_positions', 'expected_value', 'REAL');
|
|
303
|
+
safeAddColumn(db, 'user_positions', 'realized_pnl', 'REAL');
|
|
280
304
|
safeAddColumn(db, 'user_positions', 'effective_mean', 'REAL');
|
|
281
305
|
safeAddColumn(db, 'user_positions', 'effective_sigma', 'REAL');
|
|
282
306
|
safeAddColumn(db, 'user_positions', 'effective_variance', 'REAL');
|
|
283
307
|
safeAddColumn(db, 'user_positions', 'effective_probs_json', 'TEXT');
|
|
284
308
|
safeAddColumn(db, 'market_state', 'k', 'REAL');
|
|
285
309
|
safeAddColumn(db, 'market_state', 'effective_k', 'REAL');
|
|
310
|
+
// Webhook subscription secret
|
|
311
|
+
safeAddColumn(db, 'subscriptions', 'secret', 'TEXT');
|
|
286
312
|
// Rich market metadata columns
|
|
287
313
|
safeAddColumn(db, 'markets', 'x_axis_label', 'TEXT DEFAULT NULL');
|
|
288
314
|
safeAddColumn(db, 'markets', 'x_axis_unit', 'TEXT DEFAULT NULL');
|
package/dist/db/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,GAAG
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,5 +8,5 @@ import { VoyagerClientTag } from '../services/VoyagerClient';
|
|
|
8
8
|
import type { MarketType } from '../types';
|
|
9
9
|
import type { IndexerCycleResult } from './types';
|
|
10
10
|
export declare const indexMarketEvents: (marketAddress: string, marketType?: MarketType) => Effect.Effect<IndexerCycleResult, never, DatabaseTag | VoyagerClientTag | EventBusTag>;
|
|
11
|
-
export declare const indexAllMarkets: Effect.Effect<IndexerCycleResult[], never, DatabaseTag |
|
|
11
|
+
export declare const indexAllMarkets: Effect.Effect<IndexerCycleResult[], never, DatabaseTag | VoyagerClientTag | EventBusTag>;
|
|
12
12
|
//# sourceMappingURL=event-indexer.d.ts.map
|
|
@@ -8,5 +8,5 @@ import { EventBusTag } from '../services/EventBus';
|
|
|
8
8
|
import type { MarketType } from '../types';
|
|
9
9
|
import type { PositionRefreshResult } from './types';
|
|
10
10
|
export declare const refreshPosition: (marketAddress: string, trader: string, marketType?: MarketType) => Effect.Effect<PositionRefreshResult, never, DatabaseTag | ChainReaderTag | EventBusTag>;
|
|
11
|
-
export declare const refreshAllPositions: Effect.Effect<PositionRefreshResult[], never,
|
|
11
|
+
export declare const refreshAllPositions: Effect.Effect<PositionRefreshResult[], never, DatabaseTag | ChainReaderTag | EventBusTag>;
|
|
12
12
|
//# sourceMappingURL=position-refresher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"position-refresher.d.ts","sourceRoot":"","sources":["../../src/etl/position-refresher.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"position-refresher.d.ts","sourceRoot":"","sources":["../../src/etl/position-refresher.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAMhC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAwBrD,eAAO,MAAM,eAAe,GAC1B,eAAe,MAAM,EACrB,QAAQ,MAAM,EACd,aAAY,UAAqB,KAChC,MAAM,CAAC,MAAM,CAAC,qBAAqB,EAAE,KAAK,EAAE,WAAW,GAAG,cAAc,GAAG,WAAW,CAqMrF,CAAC;AAIL,eAAO,MAAM,mBAAmB,2FA2B9B,CAAC"}
|
|
@@ -2,10 +2,30 @@
|
|
|
2
2
|
* Position refresher — reads trader positions from chain and computes expected value.
|
|
3
3
|
*/
|
|
4
4
|
import { Effect } from 'effect';
|
|
5
|
-
import { computeMultinoulliPositionEV, computePositionEV } from '@the-situation/sdk';
|
|
5
|
+
import { computeMultinoulliPositionEV, computePositionEV, } from '@the-situation/sdk/valuation';
|
|
6
|
+
import { log } from '../logger';
|
|
6
7
|
import { ChainReaderTag } from '../services/ChainReader';
|
|
7
8
|
import { DatabaseTag } from '../services/Database';
|
|
8
9
|
import { EventBusTag } from '../services/EventBus';
|
|
10
|
+
/**
|
|
11
|
+
* Determine whether a position is "closed" — i.e. the market is settled
|
|
12
|
+
* and/or the position has been claimed or flattened.
|
|
13
|
+
*
|
|
14
|
+
* We check the MARKET state (not just the position flags) because the
|
|
15
|
+
* chain's tracksSettlementClaim flag is true for any active position that
|
|
16
|
+
* would receive a payout, which the ChainReader maps to 'pending_claim'.
|
|
17
|
+
*/
|
|
18
|
+
function isPositionClosed(positionState, claimed, marketIsSettled) {
|
|
19
|
+
if (claimed)
|
|
20
|
+
return true;
|
|
21
|
+
if (positionState === 'flat')
|
|
22
|
+
return true;
|
|
23
|
+
// Only treat pending_claim/early_settled as closed if the market itself is settled
|
|
24
|
+
if (marketIsSettled && (positionState === 'pending_claim' || positionState === 'early_settled')) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
9
29
|
export const refreshPosition = (marketAddress, trader, marketType = 'normal') => Effect.gen(function* () {
|
|
10
30
|
const db = yield* DatabaseTag;
|
|
11
31
|
const chain = yield* ChainReaderTag;
|
|
@@ -24,27 +44,32 @@ export const refreshPosition = (marketAddress, trader, marketType = 'normal') =>
|
|
|
24
44
|
// Compute expected value for multinoulli positions
|
|
25
45
|
let expectedValue = null;
|
|
26
46
|
let unrealizedPnl = null;
|
|
27
|
-
|
|
47
|
+
let realizedPnl = null;
|
|
48
|
+
const mState = db.multinoulliMarketState.findByMarket(marketAddress);
|
|
49
|
+
const marketIsSettled = mState?.is_settled === 1;
|
|
50
|
+
const isClosed = isPositionClosed(pos.settlementState, pos.claimed, marketIsSettled);
|
|
28
51
|
if (isClosed) {
|
|
29
52
|
expectedValue = 0;
|
|
30
53
|
unrealizedPnl = 0;
|
|
54
|
+
// Capture realized PnL: snapshot the last known unrealized_pnl before it zeroes out
|
|
55
|
+
const prev = db.positions.findOne(marketAddress, trader);
|
|
56
|
+
if (prev && prev.realized_pnl == null && prev.unrealized_pnl != null) {
|
|
57
|
+
realizedPnl = prev.unrealized_pnl;
|
|
58
|
+
}
|
|
31
59
|
}
|
|
32
|
-
else if (pos.exists && pos.effectiveProbs.length > 0) {
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
expectedValue = ev;
|
|
46
|
-
unrealizedPnl = ev - collateral;
|
|
47
|
-
}
|
|
60
|
+
else if (pos.exists && pos.effectiveProbs.length > 0 && mState && mState.k != null) {
|
|
61
|
+
const marketProbs = JSON.parse(mState.probs_json);
|
|
62
|
+
const collateral = pos.collateralLockedNumber;
|
|
63
|
+
const k = mState.effective_k ?? mState.k;
|
|
64
|
+
const ev = computeMultinoulliPositionEV({
|
|
65
|
+
effectiveProbs: pos.effectiveProbs,
|
|
66
|
+
originalProbs: pos.originalProbs,
|
|
67
|
+
collateralLocked: collateral,
|
|
68
|
+
k,
|
|
69
|
+
}, marketProbs);
|
|
70
|
+
if (Number.isFinite(ev)) {
|
|
71
|
+
expectedValue = ev;
|
|
72
|
+
unrealizedPnl = ev - collateral;
|
|
48
73
|
}
|
|
49
74
|
}
|
|
50
75
|
db.positions.upsert({
|
|
@@ -61,6 +86,7 @@ export const refreshPosition = (marketAddress, trader, marketType = 'normal') =>
|
|
|
61
86
|
effective_probs_json: pos.effectiveProbs.length > 0 ? JSON.stringify(pos.effectiveProbs) : null,
|
|
62
87
|
expected_value: expectedValue,
|
|
63
88
|
unrealized_pnl: unrealizedPnl,
|
|
89
|
+
realized_pnl: realizedPnl,
|
|
64
90
|
});
|
|
65
91
|
bus.broadcast({
|
|
66
92
|
type: 'position_update',
|
|
@@ -83,17 +109,24 @@ export const refreshPosition = (marketAddress, trader, marketType = 'normal') =>
|
|
|
83
109
|
// Compute expected value using SDK's Gaussian product integral formula
|
|
84
110
|
let expectedValue = null;
|
|
85
111
|
let unrealizedPnl = null;
|
|
86
|
-
|
|
112
|
+
let realizedPnl = null;
|
|
113
|
+
const marketState = db.marketState.findByMarket(marketAddress);
|
|
114
|
+
const marketIsSettled = marketState?.is_settled === 1;
|
|
115
|
+
const isClosed = isPositionClosed(pos.settlementState, pos.claimed, marketIsSettled);
|
|
87
116
|
if (isClosed) {
|
|
88
117
|
expectedValue = 0;
|
|
89
118
|
unrealizedPnl = 0;
|
|
119
|
+
// Capture realized PnL: snapshot the last known unrealized_pnl before it zeroes out
|
|
120
|
+
const prev = db.positions.findOne(marketAddress, trader);
|
|
121
|
+
if (prev && prev.realized_pnl == null && prev.unrealized_pnl != null) {
|
|
122
|
+
realizedPnl = prev.unrealized_pnl;
|
|
123
|
+
}
|
|
90
124
|
}
|
|
91
125
|
else if (pos.hasPosition &&
|
|
92
126
|
pos.effectiveMean != null &&
|
|
93
127
|
pos.effectiveSigma != null &&
|
|
94
128
|
pos.mean != null &&
|
|
95
129
|
pos.sigma != null) {
|
|
96
|
-
const marketState = db.marketState.findByMarket(marketAddress);
|
|
97
130
|
if (marketState?.mean != null && marketState?.sigma != null && marketState.k != null) {
|
|
98
131
|
const collateral = pos.collateralLockedNumber;
|
|
99
132
|
const k = marketState.effective_k ?? marketState.k;
|
|
@@ -120,6 +153,14 @@ export const refreshPosition = (marketAddress, trader, marketType = 'normal') =>
|
|
|
120
153
|
unrealizedPnl = ev - collateral;
|
|
121
154
|
}
|
|
122
155
|
}
|
|
156
|
+
else {
|
|
157
|
+
log.warn('position EV skipped: missing market state', {
|
|
158
|
+
market: marketAddress.slice(0, 16),
|
|
159
|
+
trader: trader.slice(0, 16),
|
|
160
|
+
hasMarketMean: marketState?.mean != null,
|
|
161
|
+
hasMarketK: marketState?.k != null,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
123
164
|
}
|
|
124
165
|
db.positions.upsert({
|
|
125
166
|
market_address: marketAddress,
|
|
@@ -138,6 +179,7 @@ export const refreshPosition = (marketAddress, trader, marketType = 'normal') =>
|
|
|
138
179
|
position_type: marketType,
|
|
139
180
|
expected_value: expectedValue,
|
|
140
181
|
unrealized_pnl: unrealizedPnl,
|
|
182
|
+
realized_pnl: realizedPnl,
|
|
141
183
|
});
|
|
142
184
|
bus.broadcast({
|
|
143
185
|
type: 'position_update',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"position-refresher.js","sourceRoot":"","sources":["../../src/etl/position-refresher.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,
|
|
1
|
+
{"version":3,"file":"position-refresher.js","sourceRoot":"","sources":["../../src/etl/position-refresher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/etl/scheduler.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/etl/scheduler.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EAAE,KAAK,kBAAkB,EAAkB,MAAM,yBAAyB,CAAC;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE5D,OAAO,EAAE,KAAK,eAAe,EAAe,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,KAAK,oBAAoB,EAAoB,MAAM,2BAA2B,CAAC;AAKxF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;CAC3B;AAiCD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE;IACR,QAAQ,EAAE,eAAe,CAAC;IAC1B,aAAa,EAAE,oBAAoB,CAAC;IACpC,WAAW,EAAE,kBAAkB,CAAC;IAChC,QAAQ,EAAE,eAAe,CAAC;CAC3B,GACA,gBAAgB,CA2HlB"}
|
package/dist/etl/scheduler.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* the previous one finishes, preventing concurrent retry storms.
|
|
6
6
|
*/
|
|
7
7
|
import { Effect, Layer } from 'effect';
|
|
8
|
+
import { log } from '../logger';
|
|
8
9
|
import { ChainReaderTag } from '../services/ChainReader';
|
|
9
10
|
import { DatabaseTag } from '../services/Database';
|
|
10
11
|
import { EventBusTag } from '../services/EventBus';
|
|
@@ -47,42 +48,106 @@ export function startScheduler(config, services) {
|
|
|
47
48
|
const results = await run(indexAllMarkets);
|
|
48
49
|
const total = results.reduce((sum, r) => sum + r.newEvents, 0);
|
|
49
50
|
if (total > 0) {
|
|
50
|
-
|
|
51
|
+
log.info('event-indexer cycle', { newEvents: total, markets: results.length });
|
|
51
52
|
}
|
|
52
53
|
}
|
|
53
|
-
catch (
|
|
54
|
-
|
|
54
|
+
catch (err) {
|
|
55
|
+
log.error('event-indexer cycle failed', {
|
|
56
|
+
error: err instanceof Error ? err.message : String(err),
|
|
57
|
+
});
|
|
55
58
|
}
|
|
56
59
|
}, config.eventPollIntervalMs);
|
|
57
60
|
const cancelState = startNonOverlappingLoop(async () => {
|
|
58
61
|
try {
|
|
59
|
-
await run(refreshAllMarketStates);
|
|
62
|
+
const results = await run(refreshAllMarketStates);
|
|
63
|
+
const ok = results.filter((r) => r.success).length;
|
|
64
|
+
const failed = results.filter((r) => !r.success);
|
|
65
|
+
if (failed.length > 0) {
|
|
66
|
+
log.warn('state-refresh partial failure', {
|
|
67
|
+
ok,
|
|
68
|
+
failed: failed.length,
|
|
69
|
+
errors: failed.slice(0, 5).map((r) => ({
|
|
70
|
+
market: r.marketAddress.slice(0, 12),
|
|
71
|
+
error: r.error,
|
|
72
|
+
})),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
else if (ok > 0) {
|
|
76
|
+
log.info('state-refresh cycle', { ok, total: results.length });
|
|
77
|
+
}
|
|
60
78
|
}
|
|
61
|
-
catch (
|
|
62
|
-
|
|
79
|
+
catch (err) {
|
|
80
|
+
log.error('state-refresh cycle failed', {
|
|
81
|
+
error: err instanceof Error ? err.message : String(err),
|
|
82
|
+
});
|
|
63
83
|
}
|
|
64
84
|
}, config.statePollIntervalMs);
|
|
65
85
|
const cancelPositions = startNonOverlappingLoop(async () => {
|
|
66
86
|
try {
|
|
67
|
-
await run(refreshAllPositions);
|
|
87
|
+
const results = await run(refreshAllPositions);
|
|
88
|
+
const ok = results.filter((r) => r.success).length;
|
|
89
|
+
const failed = results.filter((r) => !r.success);
|
|
90
|
+
if (failed.length > 0) {
|
|
91
|
+
log.warn('position-refresh partial failure', {
|
|
92
|
+
ok,
|
|
93
|
+
failed: failed.length,
|
|
94
|
+
errors: failed.slice(0, 5).map((r) => ({
|
|
95
|
+
market: r.marketAddress.slice(0, 12),
|
|
96
|
+
trader: r.trader.slice(0, 12),
|
|
97
|
+
error: r.error,
|
|
98
|
+
})),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
else if (ok > 0) {
|
|
102
|
+
log.info('position-refresh cycle', { ok, total: results.length });
|
|
103
|
+
}
|
|
68
104
|
}
|
|
69
|
-
catch (
|
|
70
|
-
|
|
105
|
+
catch (err) {
|
|
106
|
+
log.error('position-refresh cycle failed', {
|
|
107
|
+
error: err instanceof Error ? err.message : String(err),
|
|
108
|
+
});
|
|
71
109
|
}
|
|
72
110
|
}, config.positionPollIntervalMs);
|
|
73
111
|
// Run immediately on start
|
|
74
112
|
void (async () => {
|
|
113
|
+
log.info('scheduler boot: starting initial sync');
|
|
75
114
|
try {
|
|
76
|
-
await run(indexAllMarkets);
|
|
77
|
-
|
|
78
|
-
|
|
115
|
+
const eventResults = await run(indexAllMarkets);
|
|
116
|
+
const newEvents = eventResults.reduce((sum, r) => sum + r.newEvents, 0);
|
|
117
|
+
log.info('scheduler boot: events indexed', { markets: eventResults.length, newEvents });
|
|
118
|
+
const stateResults = await run(refreshAllMarketStates);
|
|
119
|
+
const stateOk = stateResults.filter((r) => r.success).length;
|
|
120
|
+
const stateFailed = stateResults.filter((r) => !r.success);
|
|
121
|
+
log.info('scheduler boot: states refreshed', {
|
|
122
|
+
ok: stateOk,
|
|
123
|
+
failed: stateFailed.length,
|
|
124
|
+
errors: stateFailed.slice(0, 5).map((r) => ({
|
|
125
|
+
market: r.marketAddress.slice(0, 12),
|
|
126
|
+
error: r.error,
|
|
127
|
+
})),
|
|
128
|
+
});
|
|
129
|
+
const posResults = await run(refreshAllPositions);
|
|
130
|
+
const posOk = posResults.filter((r) => r.success).length;
|
|
131
|
+
const posFailed = posResults.filter((r) => !r.success);
|
|
132
|
+
log.info('scheduler boot: positions refreshed', {
|
|
133
|
+
ok: posOk,
|
|
134
|
+
failed: posFailed.length,
|
|
135
|
+
errors: posFailed.slice(0, 5).map((r) => ({
|
|
136
|
+
market: r.marketAddress.slice(0, 12),
|
|
137
|
+
error: r.error,
|
|
138
|
+
})),
|
|
139
|
+
});
|
|
140
|
+
log.info('scheduler boot: complete');
|
|
79
141
|
}
|
|
80
|
-
catch (
|
|
81
|
-
|
|
142
|
+
catch (err) {
|
|
143
|
+
log.error('scheduler boot failed', {
|
|
144
|
+
error: err instanceof Error ? err.message : String(err),
|
|
145
|
+
});
|
|
82
146
|
}
|
|
83
147
|
})();
|
|
84
148
|
return {
|
|
85
149
|
stop: () => {
|
|
150
|
+
log.info('scheduler stopping');
|
|
86
151
|
cancelEvents();
|
|
87
152
|
cancelState();
|
|
88
153
|
cancelPositions();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/etl/scheduler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,EAA2B,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAElF,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAwB,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAA6B,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAM3D;;;;GAIG;AACH,SAAS,uBAAuB,CAAC,EAAuB,EAAE,UAAkB;IAC1E,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,KAAK,GAAyC,IAAI,CAAC;IAEvD,KAAK,UAAU,IAAI;QACjB,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QACD,MAAM,EAAE,EAAE,CAAC;QACX,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QACD,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACvC,CAAC;IAED,gDAAgD;IAChD,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAErC,OAAO,GAAG,EAAE;QACV,OAAO,GAAG,IAAI,CAAC;QACf,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,MAAqB,EACrB,QAKC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAC1B,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAC7D,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,EAC5E,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,cAAc,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EACtE,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAC9D,CAAC;IAEF,MAAM,GAAG,GAAG,CACV,MAA8F,EAC9F,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAEtD,MAAM,YAAY,GAAG,uBAAuB,CAAC,KAAK,IAAI,EAAE;QACtD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAC/D,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/etl/scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,5 +8,5 @@ import { EventBusTag } from '../services/EventBus';
|
|
|
8
8
|
import type { MarketType } from '../types';
|
|
9
9
|
import type { StateRefreshResult } from './types';
|
|
10
10
|
export declare const refreshMarketState: (marketAddress: string, marketType?: MarketType) => Effect.Effect<StateRefreshResult, never, DatabaseTag | ChainReaderTag | EventBusTag>;
|
|
11
|
-
export declare const refreshAllMarketStates: Effect.Effect<StateRefreshResult[], never,
|
|
11
|
+
export declare const refreshAllMarketStates: Effect.Effect<StateRefreshResult[], never, DatabaseTag | ChainReaderTag | EventBusTag>;
|
|
12
12
|
//# sourceMappingURL=state-refresher.d.ts.map
|