1+ -- Jupiter Perpetual Fees - Hybrid approach
2+ -- Uses instruction_calls for open_fees, close_fees, liquidation_fees
3+ -- Uses decoded tables for funding_fees and price_impact_fees
4+
15WITH all_events AS (
26 -- Add liquidity fees
37 SELECT
@@ -11,8 +15,8 @@ WITH all_events AS (
1115 0 AS funding_fees,
1216 0 AS price_impact_fees
1317 FROM jupiter_solana .perpetuals_evt_addliquidityevent
14- WHERE evt_block_time >= FROM_UNIXTIME ({{start}})
15- AND evt_block_time < FROM_UNIXTIME ({{end}})
18+ WHERE evt_block_time >= from_unixtime ({{start}})
19+ AND evt_block_time < from_unixtime ({{end}})
1620
1721 UNION ALL
1822
@@ -28,162 +32,285 @@ WITH all_events AS (
2832 0 AS funding_fees,
2933 0 AS price_impact_fees
3034 FROM jupiter_solana .perpetuals_evt_removeliquidityevent
31- WHERE evt_block_time >= FROM_UNIXTIME ({{start}})
32- AND evt_block_time < FROM_UNIXTIME ({{end}})
35+ WHERE evt_block_time >= from_unixtime ({{start}})
36+ AND evt_block_time < from_unixtime ({{end}})
3337
3438 UNION ALL
3539
36- -- Swap fees
40+ -- Swap fees (cap at 100k to filter bad historical price data)
3741 SELECT
3842 date_trunc(' day' , evt_block_time) AS day,
3943 0 AS add_liq_fees,
4044 0 AS remove_liq_fees,
41- CAST(swapUsdAmount AS DOUBLE) / 1e6 * CAST(feeBps AS DOUBLE) / 10000 AS swap_fees,
45+ CASE WHEN CAST(swapUsdAmount AS DOUBLE) / 1e6 * CAST(feeBps AS DOUBLE) / 10000 > 100000
46+ THEN 0
47+ ELSE CAST(swapUsdAmount AS DOUBLE) / 1e6 * CAST(feeBps AS DOUBLE) / 10000
48+ END AS swap_fees,
4249 0 AS open_fees,
4350 0 AS close_fees,
4451 0 AS liquidation_fees,
4552 0 AS funding_fees,
4653 0 AS price_impact_fees
4754 FROM jupiter_solana .perpetuals_evt_poolswapevent
48- WHERE evt_block_time >= FROM_UNIXTIME ({{start}})
49- AND evt_block_time < FROM_UNIXTIME ({{end}})
55+ WHERE evt_block_time >= from_unixtime ({{start}})
56+ AND evt_block_time < from_unixtime ({{end}})
5057
5158 UNION ALL
5259
53- -- Swap exact out fees
60+ -- Swap exact out fees (cap at 100k to filter bad historical price data)
5461 SELECT
5562 date_trunc(' day' , evt_block_time) AS day,
5663 0 AS add_liq_fees,
5764 0 AS remove_liq_fees,
58- CAST(swapUsdAmount AS DOUBLE) / 1e6 * CAST(feeBps AS DOUBLE) / 10000 AS swap_fees,
65+ CASE WHEN CAST(swapUsdAmount AS DOUBLE) / 1e6 * CAST(feeBps AS DOUBLE) / 10000 > 100000
66+ THEN 0
67+ ELSE CAST(swapUsdAmount AS DOUBLE) / 1e6 * CAST(feeBps AS DOUBLE) / 10000
68+ END AS swap_fees,
5969 0 AS open_fees,
6070 0 AS close_fees,
6171 0 AS liquidation_fees,
6272 0 AS funding_fees,
6373 0 AS price_impact_fees
6474 FROM jupiter_solana .perpetuals_evt_poolswapexactoutevent
65- WHERE evt_block_time >= FROM_UNIXTIME ({{start}})
66- AND evt_block_time < FROM_UNIXTIME ({{end}})
67-
75+ WHERE evt_block_time >= from_unixtime ({{start}})
76+ AND evt_block_time < from_unixtime ({{end}})
77+
6878 UNION ALL
69-
70- -- Open position - all fees combined
79+
80+ -- =====================================================
81+ -- IncreasePositionEvent (open_fees from instruction_calls)
82+ -- =====================================================
7183 SELECT
72- date_trunc (' day' , evt_block_time ) AS day,
84+ DATE_TRUNC (' day' , block_time ) AS day,
7385 0 AS add_liq_fees,
7486 0 AS remove_liq_fees,
7587 0 AS swap_fees,
76- COALESCE(CAST(positionFeeUsd AS DOUBLE), CAST(feeUsd AS DOUBLE)) / 1e6 AS open_fees,
88+ CASE WHEN bytearray_to_bigint(bytearray_substring(data, 1 + 323 , 1 )) = 1
89+ THEN bytearray_to_bigint(bytearray_reverse(bytearray_substring(data, 1 + 340 , 8 ))) / 1e6
90+ ELSE bytearray_to_bigint(bytearray_reverse(bytearray_substring(data, 1 + 332 , 8 ))) / 1e6
91+ END AS open_fees,
7792 0 AS close_fees,
7893 0 AS liquidation_fees,
79- COALESCE(CAST(fundingFeeUsd AS DOUBLE), 0 ) / 1e6 AS funding_fees,
80- COALESCE(CAST(priceImpactFeeUsd AS DOUBLE), 0 ) / 1e6 AS price_impact_fees
81- FROM jupiter_solana .perpetuals_evt_increasepositionevent
82- WHERE evt_block_time >= FROM_UNIXTIME({{start}})
83- AND evt_block_time < FROM_UNIXTIME({{end}})
84-
94+ 0 AS funding_fees,
95+ 0 AS price_impact_fees
96+ FROM solana .instruction_calls
97+ WHERE executing_account = ' PERPHjGBqRHArX4DySjwM6UJHiR3sWAatqfdBS2qQJu'
98+ AND bytearray_substring(data, 1 + 8 , 8 ) = 0xf5715534d6bb9984 -- IncreasePositionEvent
99+ AND tx_success = true
100+ AND block_time >= from_unixtime({{start}})
101+ AND block_time < from_unixtime({{end}})
102+
85103 UNION ALL
86-
87- -- Instant open position - all fees combined
104+
105+ -- =====================================================
106+ -- InstantIncreasePositionEvent (open_fees from instruction_calls)
107+ -- =====================================================
88108 SELECT
89- date_trunc (' day' , evt_block_time ) AS day,
109+ DATE_TRUNC (' day' , block_time ) AS day,
90110 0 AS add_liq_fees,
91111 0 AS remove_liq_fees,
92112 0 AS swap_fees,
93- COALESCE(CAST(positionFeeUsd AS DOUBLE), CAST(feeUsd AS DOUBLE )) / 1e6 AS open_fees,
113+ bytearray_to_bigint(bytearray_reverse(bytearray_substring(data, 1 + 265 , 8 ) )) / 1e6 AS open_fees,
94114 0 AS close_fees,
95115 0 AS liquidation_fees,
96- COALESCE(CAST(fundingFeeUsd AS DOUBLE), 0 ) / 1e6 AS funding_fees,
97- COALESCE(CAST(priceImpactFeeUsd AS DOUBLE), 0 ) / 1e6 AS price_impact_fees
98- FROM jupiter_solana .perpetuals_evt_instantincreasepositionevent
99- WHERE evt_block_time >= FROM_UNIXTIME({{start}})
100- AND evt_block_time < FROM_UNIXTIME({{end}})
101-
116+ 0 AS funding_fees,
117+ 0 AS price_impact_fees
118+ FROM solana .instruction_calls
119+ WHERE executing_account = ' PERPHjGBqRHArX4DySjwM6UJHiR3sWAatqfdBS2qQJu'
120+ AND bytearray_substring(data, 1 + 8 , 8 ) = 0xcdec3904d16a5745 -- InstantIncreasePositionEvent
121+ AND tx_success = true
122+ AND block_time >= from_unixtime({{start}})
123+ AND block_time < from_unixtime({{end}})
124+
102125 UNION ALL
103-
104- -- Close position - all fees combined
126+
127+ -- =====================================================
128+ -- DecreasePositionEvent (close_fees from instruction_calls)
129+ -- =====================================================
130+ SELECT
131+ DATE_TRUNC(' day' , block_time) AS day,
132+ 0 AS add_liq_fees,
133+ 0 AS remove_liq_fees,
134+ 0 AS swap_fees,
135+ 0 AS open_fees,
136+ CASE
137+ WHEN bytearray_to_bigint(bytearray_substring(data, 1 + 308 , 1 )) = 1 THEN
138+ CASE WHEN bytearray_to_bigint(bytearray_substring(data, 1 + 325 , 1 )) = 1
139+ THEN bytearray_to_bigint(bytearray_reverse(bytearray_substring(data, 1 + 334 , 8 ))) / 1e6
140+ ELSE bytearray_to_bigint(bytearray_reverse(bytearray_substring(data, 1 + 326 , 8 ))) / 1e6
141+ END
142+ ELSE
143+ CASE WHEN bytearray_to_bigint(bytearray_substring(data, 1 + 317 , 1 )) = 1
144+ THEN bytearray_to_bigint(bytearray_reverse(bytearray_substring(data, 1 + 326 , 8 ))) / 1e6
145+ ELSE bytearray_to_bigint(bytearray_reverse(bytearray_substring(data, 1 + 318 , 8 ))) / 1e6
146+ END
147+ END AS close_fees,
148+ 0 AS liquidation_fees,
149+ 0 AS funding_fees,
150+ 0 AS price_impact_fees
151+ FROM solana .instruction_calls
152+ WHERE executing_account = ' PERPHjGBqRHArX4DySjwM6UJHiR3sWAatqfdBS2qQJu'
153+ AND bytearray_substring(data, 1 + 8 , 8 ) = 0x409c2b4a6d83107f -- DecreasePositionEvent
154+ AND tx_success = true
155+ AND block_time >= from_unixtime({{start}})
156+ AND block_time < from_unixtime({{end}})
157+
158+ UNION ALL
159+
160+ -- =====================================================
161+ -- InstantDecreasePositionEvent (close_fees from instruction_calls)
162+ -- =====================================================
163+ SELECT
164+ DATE_TRUNC(' day' , block_time) AS day,
165+ 0 AS add_liq_fees,
166+ 0 AS remove_liq_fees,
167+ 0 AS swap_fees,
168+ 0 AS open_fees,
169+ bytearray_to_bigint(bytearray_reverse(bytearray_substring(data, 1 + 298 , 8 ))) / 1e6 AS close_fees,
170+ 0 AS liquidation_fees,
171+ 0 AS funding_fees,
172+ 0 AS price_impact_fees
173+ FROM solana .instruction_calls
174+ WHERE executing_account = ' PERPHjGBqRHArX4DySjwM6UJHiR3sWAatqfdBS2qQJu'
175+ AND bytearray_substring(data, 1 + 8 , 8 ) = 0xabad6a19efbe3a3b -- InstantDecreasePositionEvent
176+ AND tx_success = true
177+ AND block_time >= from_unixtime({{start}})
178+ AND block_time < from_unixtime({{end}})
179+
180+ UNION ALL
181+
182+ -- =====================================================
183+ -- LiquidateFullPositionEvent (liquidation_fees from instruction_calls)
184+ -- =====================================================
185+ SELECT
186+ DATE_TRUNC(' day' , block_time) AS day,
187+ 0 AS add_liq_fees,
188+ 0 AS remove_liq_fees,
189+ 0 AS swap_fees,
190+ 0 AS open_fees,
191+ 0 AS close_fees,
192+ bytearray_to_bigint(bytearray_reverse(bytearray_substring(data, 1 + 290 , 8 ))) / 1e6 AS liquidation_fees,
193+ 0 AS funding_fees,
194+ 0 AS price_impact_fees
195+ FROM solana .instruction_calls
196+ WHERE executing_account = ' PERPHjGBqRHArX4DySjwM6UJHiR3sWAatqfdBS2qQJu'
197+ AND bytearray_substring(data, 1 + 8 , 8 ) = 0x806547a880485654 -- LiquidateFullPositionEvent
198+ AND tx_success = true
199+ AND block_time >= from_unixtime({{start}})
200+ AND block_time < from_unixtime({{end}})
201+
202+ UNION ALL
203+
204+ -- =====================================================
205+ -- LiquidateBorrowPositionEvent (liquidation_fees from instruction_calls)
206+ -- =====================================================
207+ SELECT
208+ DATE_TRUNC(' day' , block_time) AS day,
209+ 0 AS add_liq_fees,
210+ 0 AS remove_liq_fees,
211+ 0 AS swap_fees,
212+ 0 AS open_fees,
213+ 0 AS close_fees,
214+ bytearray_to_bigint(bytearray_reverse(bytearray_substring(data, 1 + 192 , 8 ))) / 1e6 AS liquidation_fees,
215+ 0 AS funding_fees,
216+ 0 AS price_impact_fees
217+ FROM solana .instruction_calls
218+ WHERE executing_account = ' PERPHjGBqRHArX4DySjwM6UJHiR3sWAatqfdBS2qQJu'
219+ AND bytearray_substring(data, 1 + 8 , 8 ) = 0x0b80fc3b31c038aa -- LiquidateBorrowPositionEvent
220+ AND tx_success = true
221+ AND block_time >= from_unixtime({{start}})
222+ AND block_time < from_unixtime({{end}})
223+
224+ -- =====================================================
225+ -- funding_fees and price_impact_fees from decoded tables
226+ -- =====================================================
227+
228+ UNION ALL
229+
230+ -- IncreasePositionEvent (funding_fees, price_impact_fees from decoded table)
105231 SELECT
106232 date_trunc(' day' , evt_block_time) AS day,
107233 0 AS add_liq_fees,
108234 0 AS remove_liq_fees,
109235 0 AS swap_fees,
110236 0 AS open_fees,
111- COALESCE(CAST(positionFeeUsd AS DOUBLE), CAST(feeUsd AS DOUBLE)) / 1e6 AS close_fees,
237+ 0 AS close_fees,
112238 0 AS liquidation_fees,
113239 COALESCE(CAST(fundingFeeUsd AS DOUBLE), 0 ) / 1e6 AS funding_fees,
114240 COALESCE(CAST(priceImpactFeeUsd AS DOUBLE), 0 ) / 1e6 AS price_impact_fees
115- FROM jupiter_solana .perpetuals_evt_decreasepositionevent
116- WHERE evt_block_time >= FROM_UNIXTIME ({{start}})
117- AND evt_block_time < FROM_UNIXTIME ({{end}})
118-
241+ FROM jupiter_solana .perpetuals_evt_increasepositionevent
242+ WHERE evt_block_time >= from_unixtime ({{start}})
243+ AND evt_block_time < from_unixtime ({{end}})
244+
119245 UNION ALL
120-
121- -- Instant close position - all fees combined
246+
247+ -- InstantIncreasePositionEvent (funding_fees, price_impact_fees from decoded table)
122248 SELECT
123249 date_trunc(' day' , evt_block_time) AS day,
124250 0 AS add_liq_fees,
125251 0 AS remove_liq_fees,
126252 0 AS swap_fees,
127253 0 AS open_fees,
128- COALESCE(CAST(positionFeeUsd AS DOUBLE), CAST(feeUsd AS DOUBLE)) / 1e6 AS close_fees,
254+ 0 AS close_fees,
129255 0 AS liquidation_fees,
130256 COALESCE(CAST(fundingFeeUsd AS DOUBLE), 0 ) / 1e6 AS funding_fees,
131257 COALESCE(CAST(priceImpactFeeUsd AS DOUBLE), 0 ) / 1e6 AS price_impact_fees
132- FROM jupiter_solana .perpetuals_evt_instantdecreasepositionevent
133- WHERE evt_block_time >= FROM_UNIXTIME ({{start}})
134- AND evt_block_time < FROM_UNIXTIME ({{end}})
135-
258+ FROM jupiter_solana .perpetuals_evt_instantincreasepositionevent
259+ WHERE evt_block_time >= from_unixtime ({{start}})
260+ AND evt_block_time < from_unixtime ({{end}})
261+
136262 UNION ALL
137-
138- -- Liquidation fees (old event - uses feeUsd only )
263+
264+ -- DecreasePositionEvent (funding_fees, price_impact_fees from decoded table )
139265 SELECT
140266 date_trunc(' day' , evt_block_time) AS day,
141267 0 AS add_liq_fees,
142268 0 AS remove_liq_fees,
143269 0 AS swap_fees,
144270 0 AS open_fees,
145271 0 AS close_fees,
146- CAST(feeUsd AS DOUBLE) / 1e6 AS liquidation_fees,
147- 0 AS funding_fees,
148- 0 AS price_impact_fees
149- FROM jupiter_solana .perpetuals_evt_liquidatepositionevent
150- WHERE evt_block_time >= FROM_UNIXTIME ({{start}})
151- AND evt_block_time < FROM_UNIXTIME ({{end}})
152-
272+ 0 AS liquidation_fees,
273+ COALESCE(CAST(fundingFeeUsd AS DOUBLE), 0 ) / 1e6 AS funding_fees,
274+ COALESCE(CAST(priceImpactFeeUsd AS DOUBLE), 0 ) / 1e6 AS price_impact_fees
275+ FROM jupiter_solana .perpetuals_evt_decreasepositionevent
276+ WHERE evt_block_time >= from_unixtime ({{start}})
277+ AND evt_block_time < from_unixtime ({{end}})
278+
153279 UNION ALL
154-
155- -- Liquidate full position - all fees combined (new event with breakdown )
280+
281+ -- InstantDecreasePositionEvent (funding_fees, price_impact_fees from decoded table )
156282 SELECT
157283 date_trunc(' day' , evt_block_time) AS day,
158284 0 AS add_liq_fees,
159285 0 AS remove_liq_fees,
160286 0 AS swap_fees,
161287 0 AS open_fees,
162288 0 AS close_fees,
163- COALESCE(CAST(liquidationFeeUsd AS DOUBLE), CAST(feeUsd AS DOUBLE)) / 1e6 AS liquidation_fees,
289+ 0 AS liquidation_fees,
164290 COALESCE(CAST(fundingFeeUsd AS DOUBLE), 0 ) / 1e6 AS funding_fees,
165291 COALESCE(CAST(priceImpactFeeUsd AS DOUBLE), 0 ) / 1e6 AS price_impact_fees
166- FROM jupiter_solana .perpetuals_evt_liquidatefullpositionevent
167- WHERE evt_block_time >= FROM_UNIXTIME ({{start}})
168- AND evt_block_time < FROM_UNIXTIME ({{end}})
169-
292+ FROM jupiter_solana .perpetuals_evt_instantdecreasepositionevent
293+ WHERE evt_block_time >= from_unixtime ({{start}})
294+ AND evt_block_time < from_unixtime ({{end}})
295+
170296 UNION ALL
171-
172- -- Liquidate borrow position (uses liquidationFeeUsd )
297+
298+ -- LiquidateFullPositionEvent (funding_fees, price_impact_fees from decoded table )
173299 SELECT
174300 date_trunc(' day' , evt_block_time) AS day,
175301 0 AS add_liq_fees,
176302 0 AS remove_liq_fees,
177303 0 AS swap_fees,
178304 0 AS open_fees,
179305 0 AS close_fees,
180- CAST(liquidationFeeUsd AS DOUBLE) / 1e6 AS liquidation_fees,
181- 0 AS funding_fees,
182- 0 AS price_impact_fees
183- FROM jupiter_solana .perpetuals_evt_liquidateborrowpositionevent
184- WHERE evt_block_time >= FROM_UNIXTIME ({{start}})
185- AND evt_block_time < FROM_UNIXTIME ({{end}})
306+ 0 AS liquidation_fees,
307+ COALESCE(CAST(fundingFeeUsd AS DOUBLE), 0 ) / 1e6 AS funding_fees,
308+ COALESCE(CAST(priceImpactFeeUsd AS DOUBLE), 0 ) / 1e6 AS price_impact_fees
309+ FROM jupiter_solana .perpetuals_evt_liquidatefullpositionevent
310+ WHERE evt_block_time >= from_unixtime ({{start}})
311+ AND evt_block_time < from_unixtime ({{end}})
186312)
313+
187314SELECT
188315 day,
189316 SUM (add_liq_fees) AS add_liquidity_fees,
0 commit comments