Skip to content

Commit 8ddbc2b

Browse files
committed
Fix: jupiter-perpetual dune query
1 parent 39fcc87 commit 8ddbc2b

File tree

1 file changed

+198
-71
lines changed

1 file changed

+198
-71
lines changed

helpers/queries/jupiter-perpetual.sql

Lines changed: 198 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
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+
15
WITH 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+
187314
SELECT
188315
day,
189316
SUM(add_liq_fees) AS add_liquidity_fees,

0 commit comments

Comments
 (0)