1
- -- LATEST EVENTS {{{
1
+ -- LATEST STATE {{{
2
2
3
3
-- Create a table containing the latest state for each market and auto update
4
4
-- using triggers.
@@ -47,31 +47,41 @@ WHERE
47
47
ORDER BY
48
48
(data - > ' market_metadata' - >> ' market_id' )::NUMERIC ,
49
49
(data - >> ' transaction_version' )::NUMERIC DESC ,
50
- (data - >> ' event_index ' )::NUMERIC DESC ;
50
+ (data - > ' state_metadata ' - >> ' market_nonce ' )::NUMERIC DESC ;
51
51
52
52
CREATE OR REPLACE FUNCTION UPDATE_LATEST_STATE ()
53
53
RETURNS TRIGGER AS $$
54
54
BEGIN
55
- DELETE FROM inbox_latest_state
56
- WHERE (inbox_latest_state .data - > ' market_metadata' - >> ' market_id' )::numeric = (NEW .data - > ' market_metadata' - >> ' market_id' )::numeric
57
- AND (inbox_latest_state .data - > ' state_metadata' - >> ' bump_time' )::numeric <= (NEW .data - > ' state_metadata' - >> ' bump_time' )::numeric ;
58
- INSERT INTO inbox_latest_state SELECT NEW.* ;
55
+ INSERT INTO inbox_latest_state
56
+ SELECT
57
+ NEW.* ,
58
+ (NEW .data - > ' market_metadata' - >> ' market_id' )::NUMERIC
59
+ ON CONFLICT (market_id) DO UPDATE SET
60
+ transaction_version = EXCLUDED .transaction_version ,
61
+ transaction_block_height = EXCLUDED .transaction_block_height ,
62
+ data = EXCLUDED .data ,
63
+ inserted_at = EXCLUDED .inserted_at ,
64
+ event_index = EXCLUDED .event_index
65
+ WHERE
66
+ (inbox_latest_state .data - > ' market_metadata' - >> ' market_id' )::NUMERIC = (EXCLUDED .data - > ' market_metadata' - >> ' market_id' )::NUMERIC
67
+ AND
68
+ (inbox_latest_state .data - > ' state_metadata' - >> ' market_nonce' )::NUMERIC < (EXCLUDED .data - > ' state_metadata' - >> ' market_nonce' )::NUMERIC ;
59
69
RETURN NEW;
60
70
END;
61
71
$$ LANGUAGE plpgsql;
62
72
63
73
CREATE TRIGGER update_latest_state
64
74
AFTER INSERT ON inbox_events
65
75
FOR EACH ROW
66
- WHEN (new .type LIKE ' %:: emojicoin_dot_fun::State' )
76
+ WHEN (new .event_name = ' emojicoin_dot_fun::State' )
67
77
EXECUTE PROCEDURE UPDATE_LATEST_STATE();
68
78
69
79
CREATE INDEX inbox_latest_state_by_market_cap ON inbox_events (
70
80
((data - > ' instantaneous_stats' - >> ' market_cap' )::NUMERIC ) DESC
71
81
);
72
82
73
- CREATE INDEX inbox_latest_state_by_bump_time ON inbox_events (
74
- ((data - > ' state_metadata' - >> ' bump_time ' )::NUMERIC ) DESC
83
+ CREATE INDEX inbox_latest_state_by_nonce ON inbox_events (
84
+ ((data - > ' state_metadata' - >> ' market_nonce ' )::NUMERIC ) DESC
75
85
);
76
86
77
87
-- }}}
@@ -137,7 +147,7 @@ BEGIN
137
147
),
138
148
all_time_volume = inbox_volume .all_time_volume + (NEW .data - >> ' volume_quote' )::numeric
139
149
WHERE
140
- inbox_volume .market_id = (NEW .data - > ' market_metadata' - > ' market_id' )::numeric ;
150
+ inbox_volume .market_id = (NEW .data - > ' market_metadata' - >> ' market_id' )::numeric ;
141
151
RETURN NEW;
142
152
END;
143
153
$$ LANGUAGE plpgsql;
@@ -160,20 +170,34 @@ CREATE INDEX inbox_latest_state_by_daily_volume ON inbox_volume (
160
170
161
171
-- }}}
162
172
173
+ -- noqa: disable=ST06
163
174
CREATE VIEW market_data AS
164
175
SELECT
165
- state .market_id ,
176
+ -- General data
177
+ (registration .data - > ' market_metadata' - >> ' market_id' )::NUMERIC AS market_id,
178
+ (registration .data - > ' market_metadata' - >> ' emoji_bytes' ) AS emoji_bytes,
179
+ (registration .data - > ' market_metadata' - >> ' market_address' ) AS market_address,
180
+ -- Latest state data
166
181
state .transaction_version ,
167
- volume .all_time_volume ,
168
- volume .daily_volume ,
169
182
(state .data - > ' instantaneous_stats' - >> ' market_cap' )::NUMERIC AS market_cap,
170
183
(state .data - > ' state_metadata' - >> ' bump_time' )::NUMERIC AS bump_time,
171
184
(state .data - > ' cumulative_stats' - >> ' n_swaps' )::NUMERIC AS n_swaps,
172
185
(state .data - > ' cumulative_stats' - >> ' n_chat_messages' )::NUMERIC AS n_chat_messages,
186
+ (state .data - > ' last_swap' - >> ' avg_execution_price_q64' )::NUMERIC AS avg_execution_price_q64,
187
+ (state .data - >> ' lp_coin_supply' )::NUMERIC AS lp_coin_supply,
173
188
state .data - > ' clamm_virtual_reserves' AS clamm_virtual_reserves,
174
- state .data - > ' cpamm_real_reserves' AS cpamm_real_reserves
175
- FROM inbox_latest_state AS state, inbox_volume AS volume
176
- WHERE state .market_id = volume .market_id ;
189
+ state .data - > ' cpamm_real_reserves' AS cpamm_real_reserves,
190
+ -- Volume data
191
+ volume .all_time_volume ,
192
+ volume .daily_volume
193
+ FROM (
194
+ SELECT data FROM inbox_events WHERE event_name = ' emojicoin_dot_fun::MarketRegistration'
195
+ ) AS registration
196
+ LEFT JOIN inbox_latest_state AS state
197
+ ON (registration .data - > ' market_metadata' - >> ' market_id' )::NUMERIC = state .market_id
198
+ LEFT JOIN inbox_volume AS volume
199
+ ON (registration .data - > ' market_metadata' - >> ' market_id' )::NUMERIC = volume .market_id ;
200
+ -- noqa: disable=ST06
177
201
178
202
CREATE INDEX inbox_periodic_state ON inbox_events (
179
203
((data - > ' market_metadata' - >> ' market_id' )::NUMERIC ),
0 commit comments