Skip to content

Commit

Permalink
Major improvements of MagicEden Spells (#1310)
Browse files Browse the repository at this point in the history
* Major improvements of MagicEden Spells

* Update magiceden_solana_schema.yml

* Update alter_table_properties.sql

* update incremental filter

* Update magiceden_events.sql
  • Loading branch information
soispoke authored Jul 22, 2022
1 parent 2fd09aa commit 400e0c1
Show file tree
Hide file tree
Showing 8 changed files with 250 additions and 57 deletions.
10 changes: 10 additions & 0 deletions spellbook/macros/alter_table_properties.sql
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,15 @@ ALTER VIEW magiceden.mints SET TBLPROPERTIES('dune.public'='true',
'dune.data_explorer.contributors'='["soispoke"]');
{% endset %}

{% set magiceden_fees %}
ALTER VIEW magiceden.fees SET TBLPROPERTIES('dune.public'='true',
'dune.data_explorer.blockchains'='["solana"]',
'dune.data_explorer.category'='abstraction',
'dune.data_explorer.abstraction.type'='project',
'dune.data_explorer.abstraction.name'='magiceden',
'dune.data_explorer.contributors'='["soispoke"]');
{% endset %}

{% set nft_events %}
ALTER TABLE nft.events SET TBLPROPERTIES('dune.public'='true',
'dune.data_explorer.blockchains'='["ethereum","solana"]',
Expand Down Expand Up @@ -415,6 +424,7 @@ ALTER VIEW ens.view_renewals SET TBLPROPERTIES('dune.public'='true',
{% do run_query(magiceden_events) %}
{% do run_query(magiceden_trades) %}
{% do run_query(magiceden_mints) %}
{% do run_query(magiceden_fees) %}
{% do run_query(nft_events) %}
{% do run_query(nft_trades) %}
{% do run_query(nft_mints) %}
Expand Down
32 changes: 16 additions & 16 deletions spellbook/models/magiceden/magiceden_events.sql
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,16 @@ SELECT blockchain,
project,
version,
block_time,
NULL::string as token_id,
token_id,
NULL::string as collection,
amount_usd,
token_standard,
NULL::string as trade_type,
NULL::string as number_of_items,
trade_type,
number_of_items,
NULL::string as trade_category,
evt_type,
NULL::string as seller,
NULL::string as buyer,
seller,
buyer,
amount_original,
amount_raw,
currency_symbol,
Expand All @@ -33,20 +33,20 @@ tx_hash,
block_number,
NULL::string as tx_from,
NULL::string as tx_to,
NULL::double as platform_fee_amount_raw,
NULL::double as platform_fee_amount,
NULL::double as platform_fee_amount_usd,
NULL::string as platform_fee_percentage,
NULL::double as royalty_fee_amount_raw,
NULL::double as royalty_fee_amount,
NULL::double as royalty_fee_amount_usd,
NULL::string as royalty_fee_percentage,
NULL::double as royalty_fee_receive_address,
NULL::double as royalty_fee_currency_symbol,
platform_fee_amount_raw,
platform_fee_amount,
platform_fee_amount_usd,
platform_fee_percentage,
royalty_fee_amount_raw,
royalty_fee_amount,
royalty_fee_amount_usd,
royalty_fee_percentage,
NULL::string as royalty_fee_receive_address,
royalty_fee_currency_symbol,
unique_trade_id
FROM {{ ref('magiceden_solana_events') }}

{% if is_incremental() %}
-- this filter will only be applied on an incremental run
WHERE block_time > now() - interval 2 days
WHERE block_time >= (select max(block_time) from {{ this }})
{% endif %}
38 changes: 38 additions & 0 deletions spellbook/models/magiceden/magiceden_fees.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{{
config(
alias='fees')
}}

SELECT blockchain,
project,
version,
block_time,
token_id,
NULL::string as collection,
platform_fee_amount_raw,
platform_fee_amount,
platform_fee_amount_usd,
platform_fee_percentage,
royalty_fee_amount_raw,
royalty_fee_amount,
royalty_fee_amount_usd,
royalty_fee_percentage,
NULL::string as royalty_fee_receive_address,
royalty_fee_currency_symbol,
token_standard,
trade_type,
number_of_items,
NULL::string as trade_category,
evt_type,
seller,
buyer,
NULL::string as nft_contract_address,
project_contract_address,
NULL::string as aggregator_name,
NULL::string as aggregator_address,
block_number,
tx_hash,
NULL::string as tx_from,
NULL::string as tx_to,
unique_trade_id
FROM {{ ref('magiceden_solana_events') }}
10 changes: 5 additions & 5 deletions spellbook/models/magiceden/magiceden_mints.sql
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,16 @@ SELECT blockchain,
project,
version,
block_time,
NULL::string as token_id,
token_id,
NULL::string as collection,
amount_usd,
token_standard,
NULL::string as trade_type,
NULL::string as number_of_items,
trade_type,
number_of_items,
NULL::string as trade_category,
evt_type,
NULL::string as seller,
NULL::string as buyer,
seller,
buyer,
amount_original,
amount_raw,
currency_symbol,
Expand Down
49 changes: 48 additions & 1 deletion spellbook/models/magiceden/magiceden_schema.yml
Original file line number Diff line number Diff line change
Expand Up @@ -197,4 +197,51 @@ models:
- *block_number
- *tx_from
- *tx_to
- *unique_trade_id
- *unique_trade_id


- name: magiceden_fees
meta:
blockchain: solana
project: magiceden
contributors: soispoke
config:
tags: ['magiceden','solana','fees']
description: >
MagicEden fees on Solana
columns:
- *blockchain
- *project
- *version
- *block_time
- *token_id
- *collection
- *platform_fee_amount_raw
- *platform_fee_amount
- *platform_fee_amount_usd
- *platform_fee_percentage
- *royalty_fee_amount_raw
- *royalty_fee_amount
- *royalty_fee_amount_usd
- *royalty_fee_percentage
- *royalty_fee_receive_address
- *royalty_fee_currency_symbol
- *token_standard
- *trade_type
- *number_of_items
- *trade_category
- *evt_type
- *seller
- *buyer
- *currency_symbol
- *currency_contract
- *nft_contract_address
- *project_contract_address
- *aggregator_name
- *aggregator_address
- *tx_hash
- *block_number
- *tx_from
- *tx_to
- name: unique_trade_id
description: "Unique trade ID"
8 changes: 4 additions & 4 deletions spellbook/models/magiceden/magiceden_trades.sql
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,16 @@ SELECT blockchain,
project,
version,
block_time,
NULL::string as token_id,
token_id,
NULL::string as collection,
amount_usd,
token_standard,
NULL::string as trade_type,
NULL::string as number_of_items,
number_of_items,
NULL::string as trade_category,
evt_type,
NULL::string as seller,
NULL::string as buyer,
seller,
buyer,
amount_original,
amount_raw,
currency_symbol,
Expand Down
106 changes: 76 additions & 30 deletions spellbook/models/magiceden/solana/magiceden_solana_events.sql
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,11 @@
)
}}

{% set v1_key = "MEisE1HzehtrDpAAT8PnLHjpSSkRYakotTuJRPjTpo8" %}
{% set v2_key = "M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K" %}
{% set launchpad_v1_key = "CMX5tvuWs2rBUL3vqVWiARfcDoCKjdeSinCsZdxJmYoF" %}
{% set launchpad_v2_key = "CMY8R8yghKfFnHKCWjzrArUpYH4PbJ56aWBr4kCP4DMk" %}
{% set launchpad_v3_key = "CMZYPASGWeTz7RNGHaRJfCq2XQ5pYK6nDvVQxzkH51zb" %}

SELECT
'solana' as blockchain,
'magiceden' as project,
CASE WHEN (array_contains(account_keys, '{{v1_key}}')) THEN 'v1'
WHEN (array_contains(account_keys, '{{v2_key}}')) THEN 'v2'
WHEN (array_contains(account_keys, '{{launchpad_v1_key}}')) THEN 'launchpad_v1'
WHEN (array_contains(account_keys, '{{launchpad_v2_key}}')) THEN 'launchpad_v2'
WHEN (array_contains(account_keys, '{{launchpad_v3_key}}')) THEN 'launchpad_v3'
CASE WHEN (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K')) THEN 'v2'
WHEN (array_contains(account_keys, 'CMZYPASGWeTz7RNGHaRJfCq2XQ5pYK6nDvVQxzkH51zb')) THEN 'launchpad_v3'
END as version,
signatures[0] as tx_hash,
block_time,
Expand All @@ -31,30 +22,85 @@ SELECT
p.symbol as currency_symbol,
p.contract_address as currency_contract,
'metaplex' as token_standard,
CASE WHEN (array_contains(account_keys, '{{v1_key}}')) THEN '{{v1_key}}'
WHEN (array_contains(account_keys, '{{v2_key}}')) THEN '{{v2_key}}'
END as project_contract_address,
CASE WHEN (array_contains(account_keys, '{{v1_key}}'))
OR (array_contains(account_keys, '{{v2_key}}')) THEN 'Trade'
WHEN (array_contains(account_keys, '{{launchpad_v1_key}}'))
OR (array_contains(account_keys, '{{launchpad_v2_key}}'))
OR (array_contains(account_keys, '{{launchpad_v3_key}}')) THEN 'Mint'
ELSE 'Transaction' END as evt_type,
signatures[0] || '-' || id || '-' || instructions[0]::string as unique_trade_id
CASE WHEN (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K')) THEN 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K'
WHEN (array_contains(account_keys, 'CMZYPASGWeTz7RNGHaRJfCq2XQ5pYK6nDvVQxzkH51zb')) THEN 'CMZYPASGWeTz7RNGHaRJfCq2XQ5pYK6nDvVQxzkH51zb'
END as project_contract_address,
CASE WHEN (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K'))
AND array_contains(log_messages, 'Program log: Instruction: ExecuteSale')
AND array_contains(log_messages, 'Program log: Instruction: Buy') THEN 'Trade'
WHEN (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K'))
AND array_contains(log_messages, 'Program log: Instruction: Sell') THEN 'List'
WHEN (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K'))
AND array_contains(log_messages, 'Program log: Instruction: Buy') THEN 'Bid'
WHEN (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K'))
AND array_contains(log_messages, 'Program log: Instruction: CancelBuy') THEN 'Cancel Bid'
WHEN (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K'))
AND array_contains(log_messages, 'Program log: Instruction: CancelSell') THEN 'Cancel Listing'
WHEN (array_contains(account_keys, 'CMZYPASGWeTz7RNGHaRJfCq2XQ5pYK6nDvVQxzkH51zb'))
AND array_contains(log_messages, 'Program log: Instruction: SetAuthority') THEN 'Mint'
ELSE 'Other' END as evt_type,
CASE WHEN (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K'))
AND array_contains(log_messages, 'Program log: Instruction: ExecuteSale')
AND array_contains(log_messages, 'Program log: Instruction: Buy') THEN instructions[1].account_arguments[2]::string
WHEN (array_contains(account_keys, 'CMZYPASGWeTz7RNGHaRJfCq2XQ5pYK6nDvVQxzkH51zb'))
AND array_contains(log_messages, 'Program log: Instruction: SetAuthority') THEN COALESCE(instructions[6].account_arguments[9], instructions[5].account_arguments[9],
instructions[4].account_arguments[9], instructions[2].account_arguments[7], instructions[1].account_arguments[10], instructions[0].account_arguments[10])::string
END AS token_id,
NULL::string as collection,
CASE WHEN (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K'))
AND array_contains(log_messages, 'Program log: Instruction: ExecuteSale')
AND array_contains(log_messages, 'Program log: Instruction: Buy') THEN 'Single Item Trade' ELSE NULL::string
END as trade_type,
'1' as number_of_items,
NULL::string as trade_category,
signer as buyer,
CASE WHEN (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K'))
AND array_contains(log_messages, 'Program log: Instruction: ExecuteSale')
AND array_contains(log_messages, 'Program log: Instruction: Buy') THEN instructions[2].account_arguments[1]::string
WHEN (array_contains(account_keys, 'CMZYPASGWeTz7RNGHaRJfCq2XQ5pYK6nDvVQxzkH51zb')) THEN '' END as seller,
NULL::string as nft_contract_address,
NULL::string as aggregator_name,
NULL::string as aggregator_address,
NULL::string as tx_from,
NULL::string as tx_to,
2*(abs(post_balances[0] - pre_balances[0])::string)/100 as platform_fee_amount_raw,
2*(abs(post_balances[0] / 1e9 - pre_balances[0] / 1e9))/100 as platform_fee_amount,
2*(abs(post_balances[0] / 1e9 - pre_balances[0] / 1e9) * p.price)/100 as platform_fee_amount_usd,
'2' as platform_fee_percentage,
abs(post_balances[11] - pre_balances[11]) + abs(post_balances[12] - pre_balances[12])
+ 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,
abs(post_balances[11] / 1e9 - pre_balances[11] / 1e9) + abs(post_balances[12] / 1e9 - pre_balances[12] / 1e9)
+ 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)
as royalty_fee_amount,
(abs(post_balances[11] / 1e9 - pre_balances[11] / 1e9) + abs(post_balances[12] / 1e9 - pre_balances[12] / 1e9)
+ 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)) *
p.price as royalty_fee_amount_usd,
ROUND(((abs(post_balances[10] / 1e9 - pre_balances[10] / 1e9)
+abs(post_balances[11] / 1e9 - pre_balances[11] / 1e9)
+abs(post_balances[12] / 1e9 - pre_balances[12] / 1e9)
+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)) / ((abs(post_balances[0] / 1e9 - pre_balances[0] / 1e9)-0.00204928)) * 100),2) as royalty_fee_percentage,
NULL::double as royalty_fee_receive_address,
CASE WHEN (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K'))
AND array_contains(log_messages, 'Program log: Instruction: ExecuteSale')
AND array_contains(log_messages, 'Program log: Instruction: Buy') THEN 'SOL'
ELSE NULL::string END as royalty_fee_currency_symbol,
signatures[0] || '-' || id || '-' || instructions[0]::string as unique_trade_id,
instructions,
signatures,
log_messages
FROM {{ source('solana','transactions') }}
LEFT JOIN {{ source('prices', 'usd') }} p
LEFT JOIN prices.usd p
ON p.minute = date_trunc('minute', block_time)
AND p.symbol = 'SOL'
WHERE (
array_contains(account_keys, '{{v1_key}}') -- magic eden v2
OR array_contains(account_keys, '{{v2_key}}')
OR array_contains(account_keys, '{{launchpad_v1_key}}')
OR array_contains(account_keys, '{{launchpad_v2_key}}')
OR array_contains(account_keys, '{{launchpad_v3_key}}'))
AND block_date > '2022-01-07'
WHERE (array_contains(account_keys, 'M2mx93ekt1fmXSVkTrUL9xVFHkmME8HTUi5Cyc5aF7K') -- magic eden v2
OR array_contains(account_keys, 'CMZYPASGWeTz7RNGHaRJfCq2XQ5pYK6nDvVQxzkH51zb'))
AND success = 'True'
AND block_date > '2022-01-05'
AND block_slot > 114980355

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

0 comments on commit 400e0c1

Please sign in to comment.