Skip to content

Commit 400e0c1

Browse files
authored
Major improvements of MagicEden Spells (#1310)
* Major improvements of MagicEden Spells * Update magiceden_solana_schema.yml * Update alter_table_properties.sql * update incremental filter * Update magiceden_events.sql
1 parent 2fd09aa commit 400e0c1

8 files changed

Lines changed: 250 additions & 57 deletions

spellbook/macros/alter_table_properties.sql

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,15 @@ ALTER VIEW magiceden.mints SET TBLPROPERTIES('dune.public'='true',
244244
'dune.data_explorer.contributors'='["soispoke"]');
245245
{% endset %}
246246

247+
{% set magiceden_fees %}
248+
ALTER VIEW magiceden.fees SET TBLPROPERTIES('dune.public'='true',
249+
'dune.data_explorer.blockchains'='["solana"]',
250+
'dune.data_explorer.category'='abstraction',
251+
'dune.data_explorer.abstraction.type'='project',
252+
'dune.data_explorer.abstraction.name'='magiceden',
253+
'dune.data_explorer.contributors'='["soispoke"]');
254+
{% endset %}
255+
247256
{% set nft_events %}
248257
ALTER TABLE nft.events SET TBLPROPERTIES('dune.public'='true',
249258
'dune.data_explorer.blockchains'='["ethereum","solana"]',
@@ -415,6 +424,7 @@ ALTER VIEW ens.view_renewals SET TBLPROPERTIES('dune.public'='true',
415424
{% do run_query(magiceden_events) %}
416425
{% do run_query(magiceden_trades) %}
417426
{% do run_query(magiceden_mints) %}
427+
{% do run_query(magiceden_fees) %}
418428
{% do run_query(nft_events) %}
419429
{% do run_query(nft_trades) %}
420430
{% do run_query(nft_mints) %}

spellbook/models/magiceden/magiceden_events.sql

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,16 @@ SELECT blockchain,
1111
project,
1212
version,
1313
block_time,
14-
NULL::string as token_id,
14+
token_id,
1515
NULL::string as collection,
1616
amount_usd,
1717
token_standard,
18-
NULL::string as trade_type,
19-
NULL::string as number_of_items,
18+
trade_type,
19+
number_of_items,
2020
NULL::string as trade_category,
2121
evt_type,
22-
NULL::string as seller,
23-
NULL::string as buyer,
22+
seller,
23+
buyer,
2424
amount_original,
2525
amount_raw,
2626
currency_symbol,
@@ -33,20 +33,20 @@ tx_hash,
3333
block_number,
3434
NULL::string as tx_from,
3535
NULL::string as tx_to,
36-
NULL::double as platform_fee_amount_raw,
37-
NULL::double as platform_fee_amount,
38-
NULL::double as platform_fee_amount_usd,
39-
NULL::string as platform_fee_percentage,
40-
NULL::double as royalty_fee_amount_raw,
41-
NULL::double as royalty_fee_amount,
42-
NULL::double as royalty_fee_amount_usd,
43-
NULL::string as royalty_fee_percentage,
44-
NULL::double as royalty_fee_receive_address,
45-
NULL::double as royalty_fee_currency_symbol,
36+
platform_fee_amount_raw,
37+
platform_fee_amount,
38+
platform_fee_amount_usd,
39+
platform_fee_percentage,
40+
royalty_fee_amount_raw,
41+
royalty_fee_amount,
42+
royalty_fee_amount_usd,
43+
royalty_fee_percentage,
44+
NULL::string as royalty_fee_receive_address,
45+
royalty_fee_currency_symbol,
4646
unique_trade_id
4747
FROM {{ ref('magiceden_solana_events') }}
4848

4949
{% if is_incremental() %}
5050
-- this filter will only be applied on an incremental run
51-
WHERE block_time > now() - interval 2 days
51+
WHERE block_time >= (select max(block_time) from {{ this }})
5252
{% endif %}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{{
2+
config(
3+
alias='fees')
4+
}}
5+
6+
SELECT blockchain,
7+
project,
8+
version,
9+
block_time,
10+
token_id,
11+
NULL::string as collection,
12+
platform_fee_amount_raw,
13+
platform_fee_amount,
14+
platform_fee_amount_usd,
15+
platform_fee_percentage,
16+
royalty_fee_amount_raw,
17+
royalty_fee_amount,
18+
royalty_fee_amount_usd,
19+
royalty_fee_percentage,
20+
NULL::string as royalty_fee_receive_address,
21+
royalty_fee_currency_symbol,
22+
token_standard,
23+
trade_type,
24+
number_of_items,
25+
NULL::string as trade_category,
26+
evt_type,
27+
seller,
28+
buyer,
29+
NULL::string as nft_contract_address,
30+
project_contract_address,
31+
NULL::string as aggregator_name,
32+
NULL::string as aggregator_address,
33+
block_number,
34+
tx_hash,
35+
NULL::string as tx_from,
36+
NULL::string as tx_to,
37+
unique_trade_id
38+
FROM {{ ref('magiceden_solana_events') }}

spellbook/models/magiceden/magiceden_mints.sql

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@ SELECT blockchain,
77
project,
88
version,
99
block_time,
10-
NULL::string as token_id,
10+
token_id,
1111
NULL::string as collection,
1212
amount_usd,
1313
token_standard,
14-
NULL::string as trade_type,
15-
NULL::string as number_of_items,
14+
trade_type,
15+
number_of_items,
1616
NULL::string as trade_category,
1717
evt_type,
18-
NULL::string as seller,
19-
NULL::string as buyer,
18+
seller,
19+
buyer,
2020
amount_original,
2121
amount_raw,
2222
currency_symbol,

spellbook/models/magiceden/magiceden_schema.yml

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,4 +197,51 @@ models:
197197
- *block_number
198198
- *tx_from
199199
- *tx_to
200-
- *unique_trade_id
200+
- *unique_trade_id
201+
202+
203+
- name: magiceden_fees
204+
meta:
205+
blockchain: solana
206+
project: magiceden
207+
contributors: soispoke
208+
config:
209+
tags: ['magiceden','solana','fees']
210+
description: >
211+
MagicEden fees on Solana
212+
columns:
213+
- *blockchain
214+
- *project
215+
- *version
216+
- *block_time
217+
- *token_id
218+
- *collection
219+
- *platform_fee_amount_raw
220+
- *platform_fee_amount
221+
- *platform_fee_amount_usd
222+
- *platform_fee_percentage
223+
- *royalty_fee_amount_raw
224+
- *royalty_fee_amount
225+
- *royalty_fee_amount_usd
226+
- *royalty_fee_percentage
227+
- *royalty_fee_receive_address
228+
- *royalty_fee_currency_symbol
229+
- *token_standard
230+
- *trade_type
231+
- *number_of_items
232+
- *trade_category
233+
- *evt_type
234+
- *seller
235+
- *buyer
236+
- *currency_symbol
237+
- *currency_contract
238+
- *nft_contract_address
239+
- *project_contract_address
240+
- *aggregator_name
241+
- *aggregator_address
242+
- *tx_hash
243+
- *block_number
244+
- *tx_from
245+
- *tx_to
246+
- name: unique_trade_id
247+
description: "Unique trade ID"

spellbook/models/magiceden/magiceden_trades.sql

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@ SELECT blockchain,
77
project,
88
version,
99
block_time,
10-
NULL::string as token_id,
10+
token_id,
1111
NULL::string as collection,
1212
amount_usd,
1313
token_standard,
1414
NULL::string as trade_type,
15-
NULL::string as number_of_items,
15+
number_of_items,
1616
NULL::string as trade_category,
1717
evt_type,
18-
NULL::string as seller,
19-
NULL::string as buyer,
18+
seller,
19+
buyer,
2020
amount_original,
2121
amount_raw,
2222
currency_symbol,

spellbook/models/magiceden/solana/magiceden_solana_events.sql

Lines changed: 76 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,11 @@
77
)
88
}}
99

10-
{% set v1_key = "MEisE1HzehtrDpAAT8PnLHjpSSkRYakotTuJRPjTpo8" %}
11-
{% set v2_key = "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K" %}
12-
{% set launchpad_v1_key = "CMX5tvuWs2rBUL3vqVWiARfcDoCKjdeSinCsZdxJmYoF" %}
13-
{% set launchpad_v2_key = "CMY8R8yghKfFnHKCWjzrArUpYH4PbJ56aWBr4kCP4DMk" %}
14-
{% set launchpad_v3_key = "CMZYPASGWeTz7RNGHaRJfCq2XQ5pYK6nDvVQxzkH51zb" %}
15-
1610
SELECT
1711
'solana' as blockchain,
1812
'magiceden' as project,
19-
CASE WHEN (array_contains(account_keys, '{{v1_key}}')) THEN 'v1'
20-
WHEN (array_contains(account_keys, '{{v2_key}}')) THEN 'v2'
21-
WHEN (array_contains(account_keys, '{{launchpad_v1_key}}')) THEN 'launchpad_v1'
22-
WHEN (array_contains(account_keys, '{{launchpad_v2_key}}')) THEN 'launchpad_v2'
23-
WHEN (array_contains(account_keys, '{{launchpad_v3_key}}')) THEN 'launchpad_v3'
13+
CASE WHEN (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K')) THEN 'v2'
14+
WHEN (array_contains(account_keys, 'CMZYPASGWeTz7RNGHaRJfCq2XQ5pYK6nDvVQxzkH51zb')) THEN 'launchpad_v3'
2415
END as version,
2516
signatures[0] as tx_hash,
2617
block_time,
@@ -31,30 +22,85 @@ SELECT
3122
p.symbol as currency_symbol,
3223
p.contract_address as currency_contract,
3324
'metaplex' as token_standard,
34-
CASE WHEN (array_contains(account_keys, '{{v1_key}}')) THEN '{{v1_key}}'
35-
WHEN (array_contains(account_keys, '{{v2_key}}')) THEN '{{v2_key}}'
36-
END as project_contract_address,
37-
CASE WHEN (array_contains(account_keys, '{{v1_key}}'))
38-
OR (array_contains(account_keys, '{{v2_key}}')) THEN 'Trade'
39-
WHEN (array_contains(account_keys, '{{launchpad_v1_key}}'))
40-
OR (array_contains(account_keys, '{{launchpad_v2_key}}'))
41-
OR (array_contains(account_keys, '{{launchpad_v3_key}}')) THEN 'Mint'
42-
ELSE 'Transaction' END as evt_type,
43-
signatures[0] || '-' || id || '-' || instructions[0]::string as unique_trade_id
25+
CASE WHEN (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K')) THEN 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K'
26+
WHEN (array_contains(account_keys, 'CMZYPASGWeTz7RNGHaRJfCq2XQ5pYK6nDvVQxzkH51zb')) THEN 'CMZYPASGWeTz7RNGHaRJfCq2XQ5pYK6nDvVQxzkH51zb'
27+
END as project_contract_address,
28+
CASE WHEN (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K'))
29+
AND array_contains(log_messages, 'Program log: Instruction: ExecuteSale')
30+
AND array_contains(log_messages, 'Program log: Instruction: Buy') THEN 'Trade'
31+
WHEN (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K'))
32+
AND array_contains(log_messages, 'Program log: Instruction: Sell') THEN 'List'
33+
WHEN (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K'))
34+
AND array_contains(log_messages, 'Program log: Instruction: Buy') THEN 'Bid'
35+
WHEN (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K'))
36+
AND array_contains(log_messages, 'Program log: Instruction: CancelBuy') THEN 'Cancel Bid'
37+
WHEN (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K'))
38+
AND array_contains(log_messages, 'Program log: Instruction: CancelSell') THEN 'Cancel Listing'
39+
WHEN (array_contains(account_keys, 'CMZYPASGWeTz7RNGHaRJfCq2XQ5pYK6nDvVQxzkH51zb'))
40+
AND array_contains(log_messages, 'Program log: Instruction: SetAuthority') THEN 'Mint'
41+
ELSE 'Other' END as evt_type,
42+
CASE WHEN (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K'))
43+
AND array_contains(log_messages, 'Program log: Instruction: ExecuteSale')
44+
AND array_contains(log_messages, 'Program log: Instruction: Buy') THEN instructions[1].account_arguments[2]::string
45+
WHEN (array_contains(account_keys, 'CMZYPASGWeTz7RNGHaRJfCq2XQ5pYK6nDvVQxzkH51zb'))
46+
AND array_contains(log_messages, 'Program log: Instruction: SetAuthority') THEN COALESCE(instructions[6].account_arguments[9], instructions[5].account_arguments[9],
47+
instructions[4].account_arguments[9], instructions[2].account_arguments[7], instructions[1].account_arguments[10], instructions[0].account_arguments[10])::string
48+
END AS token_id,
49+
NULL::string as collection,
50+
CASE WHEN (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K'))
51+
AND array_contains(log_messages, 'Program log: Instruction: ExecuteSale')
52+
AND array_contains(log_messages, 'Program log: Instruction: Buy') THEN 'Single Item Trade' ELSE NULL::string
53+
END as trade_type,
54+
'1' as number_of_items,
55+
NULL::string as trade_category,
56+
signer as buyer,
57+
CASE WHEN (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K'))
58+
AND array_contains(log_messages, 'Program log: Instruction: ExecuteSale')
59+
AND array_contains(log_messages, 'Program log: Instruction: Buy') THEN instructions[2].account_arguments[1]::string
60+
WHEN (array_contains(account_keys, 'CMZYPASGWeTz7RNGHaRJfCq2XQ5pYK6nDvVQxzkH51zb')) THEN '' END as seller,
61+
NULL::string as nft_contract_address,
62+
NULL::string as aggregator_name,
63+
NULL::string as aggregator_address,
64+
NULL::string as tx_from,
65+
NULL::string as tx_to,
66+
2*(abs(post_balances[0] - pre_balances[0])::string)/100 as platform_fee_amount_raw,
67+
2*(abs(post_balances[0] / 1e9 - pre_balances[0] / 1e9))/100 as platform_fee_amount,
68+
2*(abs(post_balances[0] / 1e9 - pre_balances[0] / 1e9) * p.price)/100 as platform_fee_amount_usd,
69+
'2' as platform_fee_percentage,
70+
abs(post_balances[11] - pre_balances[11]) + abs(post_balances[12] - pre_balances[12])
71+
+ abs(post_balances[13] - pre_balances[13]) + abs(post_balances[14] - pre_balances[14]) + abs(post_balances[15] - pre_balances[15]) as royalty_fee_amount_raw,
72+
abs(post_balances[11] / 1e9 - pre_balances[11] / 1e9) + abs(post_balances[12] / 1e9 - pre_balances[12] / 1e9)
73+
+ abs(post_balances[13] / 1e9 - pre_balances[13] / 1e9) + abs(post_balances[14] / 1e9 - pre_balances[14] / 1e9) + abs(post_balances[15] / 1e9 - pre_balances[15] / 1e9)
74+
as royalty_fee_amount,
75+
(abs(post_balances[11] / 1e9 - pre_balances[11] / 1e9) + abs(post_balances[12] / 1e9 - pre_balances[12] / 1e9)
76+
+ abs(post_balances[13] / 1e9 - pre_balances[13] / 1e9) + abs(post_balances[14] / 1e9 - pre_balances[14] / 1e9) + abs(post_balances[15] / 1e9 - pre_balances[15] / 1e9)) *
77+
p.price as royalty_fee_amount_usd,
78+
ROUND(((abs(post_balances[10] / 1e9 - pre_balances[10] / 1e9)
79+
+abs(post_balances[11] / 1e9 - pre_balances[11] / 1e9)
80+
+abs(post_balances[12] / 1e9 - pre_balances[12] / 1e9)
81+
+abs(post_balances[13] / 1e9 - pre_balances[13] / 1e9)
82+
+abs(post_balances[14] / 1e9 - pre_balances[14] / 1e9)
83+
+abs(post_balances[15] / 1e9 - pre_balances[15] / 1e9)) / ((abs(post_balances[0] / 1e9 - pre_balances[0] / 1e9)-0.00204928)) * 100),2) as royalty_fee_percentage,
84+
NULL::double as royalty_fee_receive_address,
85+
CASE WHEN (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K'))
86+
AND array_contains(log_messages, 'Program log: Instruction: ExecuteSale')
87+
AND array_contains(log_messages, 'Program log: Instruction: Buy') THEN 'SOL'
88+
ELSE NULL::string END as royalty_fee_currency_symbol,
89+
signatures[0] || '-' || id || '-' || instructions[0]::string as unique_trade_id,
90+
instructions,
91+
signatures,
92+
log_messages
4493
FROM {{ source('solana','transactions') }}
45-
LEFT JOIN {{ source('prices', 'usd') }} p
94+
LEFT JOIN prices.usd p
4695
ON p.minute = date_trunc('minute', block_time)
4796
AND p.symbol = 'SOL'
48-
WHERE (
49-
array_contains(account_keys, '{{v1_key}}') -- magic eden v2
50-
OR array_contains(account_keys, '{{v2_key}}')
51-
OR array_contains(account_keys, '{{launchpad_v1_key}}')
52-
OR array_contains(account_keys, '{{launchpad_v2_key}}')
53-
OR array_contains(account_keys, '{{launchpad_v3_key}}'))
54-
AND block_date > '2022-01-07'
97+
WHERE (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K') -- magic eden v2
98+
OR array_contains(account_keys, 'CMZYPASGWeTz7RNGHaRJfCq2XQ5pYK6nDvVQxzkH51zb'))
99+
AND success = 'True'
100+
AND block_date > '2022-01-05'
55101
AND block_slot > 114980355
56102

57103
{% if is_incremental() %}
58104
-- this filter will only be applied on an incremental run
59-
AND block_date > now() - interval 2 days
105+
AND block_date >= (select max(block_time) from {{ this }})
60106
{% endif %}

0 commit comments

Comments
 (0)