From d3c20cd76babbf89a6f24db71a4cb85304f1c89f Mon Sep 17 00:00:00 2001 From: eric-laurello <102970824+eric-laurello@users.noreply.github.com> Date: Wed, 18 Jan 2023 17:33:48 -0500 Subject: [PATCH] AN-2668 topshot packs (#103) * ts packs * alpha version topshot packs * beta schema --- models/beta/beta__ez_nft_topshot_packs.sql | 28 +++++ models/beta/beta__ez_nft_topshot_packs.yml | 85 ++++++++++++++ .../silver/silver__nft_topshot_pack_sales.sql | 66 +++++++++++ .../silver/silver__nft_topshot_pack_sales.yml | 105 ++++++++++++++++++ 4 files changed, 284 insertions(+) create mode 100644 models/beta/beta__ez_nft_topshot_packs.sql create mode 100644 models/beta/beta__ez_nft_topshot_packs.yml create mode 100644 models/silver/silver__nft_topshot_pack_sales.sql create mode 100644 models/silver/silver__nft_topshot_pack_sales.yml diff --git a/models/beta/beta__ez_nft_topshot_packs.sql b/models/beta/beta__ez_nft_topshot_packs.sql new file mode 100644 index 0000000..8287c6f --- /dev/null +++ b/models/beta/beta__ez_nft_topshot_packs.sql @@ -0,0 +1,28 @@ +{{ config( + materialized = 'view', + tags = ['nft', 'ez'] +) }} + +WITH silver_nfts AS ( + + SELECT + * + FROM + {{ ref('silver__nft_topshot_pack_sales') }} +), +gold_nfts AS ( + SELECT + tx_id, + block_height, + block_timestamp, + marketplace, + nft_id, + buyer, + tx_succeeded + FROM + silver_nfts +) +SELECT + * +FROM + gold_nfts diff --git a/models/beta/beta__ez_nft_topshot_packs.yml b/models/beta/beta__ez_nft_topshot_packs.yml new file mode 100644 index 0000000..f7915f1 --- /dev/null +++ b/models/beta/beta__ez_nft_topshot_packs.yml @@ -0,0 +1,85 @@ +version: 2 + +models: + - name: beta__ez_nft_topshot_packs + description: |- + This ez_ view contains the NBA TopShot nfts transfers related to rips. These are assumed to be packs that were purchased and opened. This is an alpha version and does not have sale price or pack name at this time. + tests: + - dbt_utils.unique_combination_of_columns: + combination_of_columns: + - tx_id + - buyer + - nft_id + + columns: + - name: TX_ID + description: "{{ doc('tx_id') }}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - STRING + - VARCHAR + + - name: BLOCK_HEIGHT + description: "{{ doc('block_height') }}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - NUMBER + - FLOAT + + - name: BLOCK_TIMESTAMP + description: "{{ doc('block_timestamp') }}" + tests: + - not_null + - dbt_expectations.expect_row_values_to_have_recent_data: + datepart: day + interval: 1 + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - TIMESTAMP_NTZ + + - name: MARKETPLACE + description: "{{ doc('marketplace') }}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - STRING + - VARCHAR + + + - name: NFT_ID + description: "{{ doc('nft_id') }}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - STRING + - VARCHAR + - NUMBER + + - name: BUYER + description: "{{ doc('buyer') }}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - STRING + - VARCHAR + + - name: SELLER + description: "{{ doc('seller') }}" + + + + - name: TX_SUCCEEDED + description: "{{ doc('tx_succeeded') }}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - BOOLEAN + diff --git a/models/silver/silver__nft_topshot_pack_sales.sql b/models/silver/silver__nft_topshot_pack_sales.sql new file mode 100644 index 0000000..05daa14 --- /dev/null +++ b/models/silver/silver__nft_topshot_pack_sales.sql @@ -0,0 +1,66 @@ +{{ config( + materialized = 'incremental', + incremental_strategy = 'merge', + cluster_by = ['_inserted_timestamp::DATE'], + unique_key = ['tx_id','nft_id'], + tags = ['nft'] +) }} + +WITH silver_events AS ( + + SELECT + * + FROM + {{ ref('silver__events_final') }} + +{% if is_incremental() %} +WHERE + _inserted_timestamp >= ( + SELECT + MAX(_inserted_timestamp) + FROM + {{ this }} + ) +{% endif %} +), +nft_txs AS ( + SELECT + tx_id, + event_index, + block_height, + block_timestamp, + tx_succeeded, + event_data :id :: INT AS nft_id, + _inserted_timestamp + FROM + silver_events + WHERE + event_data :from = '0xe1f2a091f7bb5245' + AND event_contract = 'A.0b2a3299cc857e29.TopShot' +) +SELECT + A.tx_id, + A.block_height, + A.block_timestamp, + 'topshot pack' AS marketplace, + NULL AS nft_collection, + A.nft_id, + b.event_data :to :: STRING buyer, + NULL AS seller, + NULL price, + NULL currency, + A.tx_succeeded, + NULL AS tokenflow, + NULL AS counterparties, + MD5( + CAST(COALESCE(CAST(A.tx_id AS VARCHAR), '') AS VARCHAR) + ) AS pack_id, + A._inserted_timestamp +FROM + nft_txs A + JOIN silver_events b + ON A.tx_id = b.tx_id + AND A.nft_id = b.event_data :id :: INT +WHERE + event_data :to IS NOT NULL + AND A.event_index <> b.event_index diff --git a/models/silver/silver__nft_topshot_pack_sales.yml b/models/silver/silver__nft_topshot_pack_sales.yml new file mode 100644 index 0000000..f084988 --- /dev/null +++ b/models/silver/silver__nft_topshot_pack_sales.yml @@ -0,0 +1,105 @@ +version: 2 + +models: + - name: silver__nft_topshot_pack_sales + description: |- + TopShot pack sales + + columns: + - name: tx_id + description: "{{ doc('tx_id') }}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - STRING + - VARCHAR + + - name: block_height + description: "{{ doc('block_height') }}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - NUMBER + - FLOAT + + - name: block_timestamp + description: "{{ doc('block_timestamp') }}" + tests: + - not_null + - dbt_expectations.expect_row_values_to_have_recent_data: + datepart: day + interval: 1 + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - TIMESTAMP_NTZ + + - name: marketplace + description: "{{ doc('marketplace') }}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - STRING + - VARCHAR + + - name: nft_collection + description: "{{ doc('nft_collection') }}" + + - name: nft_id + description: "{{ doc('nft_id') }}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - STRING + - VARCHAR + - NUMBER + + - name: buyer + description: "{{ doc('buyer') }}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - STRING + - VARCHAR + + - name: seller + description: "{{ doc('seller') }}" + + + - name: price + description: "{{ doc('price') }}" + tests: + + - name: currency + description: "{{ doc('currency') }}" + + - name: tx_succeeded + description: "{{ doc('tx_succeeded') }}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - BOOLEAN + + - name: _ingested_at + description: "{{ doc('_ingested_at') }}" + + - name: tokenflow + description: "{{ doc('tokenflow') }}" + + + - name: counterparties + description: "{{ doc('counterparties') }}" + + + - name: _inserted_timestamp + description: "{{ doc('_inserted_timestamp') }}" + tests: + - not_null + - dbt_expectations.expect_column_values_to_be_in_type_list: + column_type_list: + - TIMESTAMP_NTZ