diff --git a/models/sources.yml b/models/sources.yml index 36e5916a..52522330 100644 --- a/models/sources.yml +++ b/models/sources.yml @@ -12,6 +12,7 @@ sources: - name: hours - name: udm_address_labels - name: udm_address_labels_new + - name: udm_events_terra - name: udm_address_tags - name: udm_balances - name: udm_decimal_adjustments diff --git a/models/terra/gold/gold_terra__address_labels.sql b/models/terra/gold/gold_terra__address_labels.sql new file mode 100644 index 00000000..c1f8a5ea --- /dev/null +++ b/models/terra/gold/gold_terra__address_labels.sql @@ -0,0 +1,17 @@ +{{ config( + materialized = 'incremental', + unique_key = 'blockchain || address', + incremental_strategy = 'delete+insert', + cluster_by = ['address'], + tags = ['snowflake', 'terra_gold', 'terra_address_labels'] +) }} + +SELECT + * +FROM + {{ source( + 'shared', + 'udm_address_labels_new' + ) }} +WHERE + blockchain = 'terra' diff --git a/models/terra/gold/gold_terra__address_tags.sql b/models/terra/gold/gold_terra__address_tags.sql new file mode 100644 index 00000000..a71eb150 --- /dev/null +++ b/models/terra/gold/gold_terra__address_tags.sql @@ -0,0 +1,24 @@ +{{ config( + materialized = 'incremental', + unique_key = 'blockchain || address', + incremental_strategy = 'delete+insert', + cluster_by = ['blockchain'], + tags = ['snowflake', 'terra_gold', 'terra_address_tags'] +) }} + +SELECT + blockchain, + address, + tag_name, + tag_type, + tag_slug, + source, + start_date, + end_date +FROM + {{ source( + 'shared', + 'udm_address_tags' + ) }} +WHERE + blockchain = 'terra' diff --git a/models/terra/gold/gold_terra__daily_balances.sql b/models/terra/gold/gold_terra__daily_balances.sql new file mode 100644 index 00000000..4313b5f9 --- /dev/null +++ b/models/terra/gold/gold_terra__daily_balances.sql @@ -0,0 +1,58 @@ +{{ config( + materialized = 'incremental', + sort = ['date', 'currency'], + unique_key = 'date', + tags = ['snowflake', 'terra_gold', 'terra_daily_balances'] +) }} + +WITH prices AS ( + + SELECT + p.symbol, + DATE_TRUNC( + 'day', + HOUR + ) AS DAY, + AVG(price) AS price + FROM + {{ ref('gold_terra__prices') }} + p + WHERE + TRUE + +{% if is_incremental() %} +AND HOUR >= getdate() - INTERVAL '3 days' +{% endif %} +GROUP BY + p.symbol, + DAY +) +SELECT + DATE, + b.address, + address_labels.l1_label AS address_label_type, + address_labels.l2_label AS address_label_subtype, + address_labels.project_name AS address_label, + address_labels.address_name AS address_address_name, + balance, + balance * p.price AS balance_usd, + b.balance_type, + currency +FROM + {{ source( + 'terra', + 'udm_daily_balances_terra' + ) }} + b + LEFT OUTER JOIN prices p + ON p.symbol = b.currency + AND p.day = b.date + LEFT OUTER JOIN {{ ref('gold_terra__address_labels') }} + address_labels + ON b.address = address_labels.address +WHERE + TRUE + +{% if is_incremental() %} +AND DATE >= getdate() - INTERVAL '3 days' +{% endif %} diff --git a/models/terra/gold/gold_terra__decimals.sql b/models/terra/gold/gold_terra__decimals.sql new file mode 100644 index 00000000..ff3842e6 --- /dev/null +++ b/models/terra/gold/gold_terra__decimals.sql @@ -0,0 +1,17 @@ +{{ config( + materialized = 'incremental', + unique_key = 'blockchain || asset_id', + incremental_strategy = 'delete+insert', + cluster_by = ['blockchain'], + tags = ['snowflake', 'terra_gold', 'terra_decimals'] +) }} + +SELECT + * +FROM + {{ source( + 'shared', + 'udm_decimal_adjustments' + ) }} +WHERE + blockchain = 'terra' diff --git a/models/terra/gold/gold_terra__events.sql b/models/terra/gold/gold_terra__events.sql new file mode 100644 index 00000000..bff2a197 --- /dev/null +++ b/models/terra/gold/gold_terra__events.sql @@ -0,0 +1,76 @@ +{{ config( + materialized = 'incremental', + sort = 'block_timestamp', + unique_key = 'block_timestamp', + tags = ['snowflake', 'terra_gold', 'terra_events'] +) }} + +SELECT + e.blockchain, + block_timestamp, + block_id AS block_number, + tx_id, + tx_from, + tx_from_labels.l1_label AS tx_from_label_type, + tx_from_labels.l2_label AS tx_from_label_subtype, + tx_from_labels.project_name AS tx_from_label, + tx_from_labels.address_name AS tx_from_address_name, + tx_to, + tx_to_labels.l1_label AS tx_to_label_type, + tx_to_labels.l2_label AS tx_to_label_subtype, + tx_to_labels.project_name AS tx_to_label, + tx_to_labels.address_name AS tx_to_address_name, + tx_type, + tx_fee, + tx_fee * fee_price.price AS tx_fee_usd, + event_from, + event_from_labels.l1_label AS event_from_label_type, + event_from_labels.l2_label AS event_from_label_subtype, + event_from_labels.project_name AS event_from_label, + event_from_labels.address_name AS event_from_address_name, + event_to, + event_to_labels.l1_label AS event_to_label_type, + event_to_labels.l2_label AS event_to_label_subtype, + event_to_labels.project_name AS event_to_label, + event_to_labels.address_name AS event_to_address_name, + event_type, + event_amount, + event_amount * event_price.price AS event_amount_usd, + event_currency +FROM + {{ source( + 'shared', + 'udm_events_terra' + ) }} + e + LEFT OUTER JOIN {{ ref('gold_terra__address_labels') }} AS tx_from_labels + ON e.tx_from = tx_from_labels.address + LEFT OUTER JOIN {{ ref('gold_terra__address_labels') }} AS tx_to_labels + ON e.tx_to = tx_to_labels.address + LEFT OUTER JOIN {{ ref('gold_terra__address_labels') }} AS event_from_labels + ON e.event_from = event_from_labels.address + LEFT OUTER JOIN {{ ref('gold_terra__address_labels') }} AS event_to_labels + ON e.event_to = event_to_labels.address + LEFT OUTER JOIN {{ ref('gold_terra__prices') }} + fee_price + ON fee_price.hour = DATE_TRUNC( + 'hour', + block_timestamp + ) + AND fee_price.symbol = COALESCE( + e.event_currency, + 'LUNA' + ) + LEFT OUTER JOIN {{ ref('gold_terra__prices') }} + event_price + ON event_price.hour = DATE_TRUNC( + 'hour', + block_timestamp + ) + AND event_price.symbol = e.event_currency +WHERE + TRUE + +{% if is_incremental() %} +AND block_timestamp >= getdate() - INTERVAL '3 days' +{% endif %} diff --git a/models/terra/gold/gold_terra__prices.sql b/models/terra/gold/gold_terra__prices.sql new file mode 100644 index 00000000..a7d63cae --- /dev/null +++ b/models/terra/gold/gold_terra__prices.sql @@ -0,0 +1,104 @@ +{{ config( + materialized = 'incremental', + unique_key = 'symbol || hour', + incremental_strategy = 'delete+insert', + cluster_by = ['hour'], + tags = ['snowflake', 'terra_gold', 'terra_prices'] +) }} + +WITH hours AS ( + + SELECT + HOUR + FROM + {{ source( + 'shared', + 'hours' + ) }} + WHERE + TRUE + +{% if is_incremental() %} +AND HOUR >= getdate() - INTERVAL '3 days' +AND HOUR < getdate() + INTERVAL '1 day' +{% endif %} +), +raw_prices AS ( + SELECT + symbol, + DATE_TRUNC( + 'hour', + recorded_at + ) AS HOUR, + AVG(price) AS price + FROM + {{ source( + 'shared', + 'prices' + ) }} + WHERE + asset_id IN ( + 4172, + -- Luna + 5115, + -- Terra KRW (KRT) + 6370 -- Terra SDT (SDR) + ) + +{% if is_incremental() %} +AND recorded_at >= getdate() - INTERVAL '3 days' +{% endif %} +AND recorded_at < getdate() + INTERVAL '1 day' +GROUP BY + symbol, + HOUR +UNION ALL +SELECT + symbol, + DATE_TRUNC( + 'hour', + recorded_at + ) AS HOUR, + AVG(price) AS price +FROM + {{ source( + 'shared', + 'coingecko_prices' + ) }} +WHERE + asset_id IN ('terrausd') + +{% if is_incremental() %} +AND recorded_at >= getdate() - INTERVAL '3 days' +{% endif %} +AND recorded_at < getdate() + INTERVAL '1 day' +GROUP BY + symbol, + HOUR +), +assets AS ( + SELECT + symbol + FROM + raw_prices + GROUP BY + 1 +), +hour_assets AS ( + SELECT + h.hour, + A.symbol + FROM + hours h + CROSS JOIN assets A +) +SELECT + ha.hour, + ha.symbol, + -- use price if we have other, otherwise fall back to daily average + COALESCE(rp.price, AVG(rp.price) over(PARTITION BY DATE_TRUNC('day', ha.hour), ha.symbol)) AS price +FROM + hour_assets ha + LEFT OUTER JOIN raw_prices rp + ON ha.symbol = rp.symbol + AND ha.hour = rp.hour diff --git a/models/terra/gold/gold_terra__tax_rate.sql b/models/terra/gold/gold_terra__tax_rate.sql new file mode 100644 index 00000000..691507b1 --- /dev/null +++ b/models/terra/gold/gold_terra__tax_rate.sql @@ -0,0 +1,24 @@ +{{ config( + materialized = 'incremental', + unique_key = 'blockchain || block_number', + incremental_strategy = 'delete+insert', + cluster_by = ['blockchain', 'block_number'], + tags = ['snowflake', 'terra_gold', 'terra_tax_rate'] +) }} + +SELECT + blockchain, + block_timestamp, + block_number, + tax_rate +FROM + {{ source( + 'terra', + 'udm_custom_fields_terra_tax_rate' + ) }} +WHERE + TRUE + +{% if is_incremental() %} +AND block_timestamp >= getdate() - INTERVAL '3 days' +{% endif %} diff --git a/models/terra/gold/gold_terra__velocity.sql b/models/terra/gold/gold_terra__velocity.sql new file mode 100644 index 00000000..6ee6451a --- /dev/null +++ b/models/terra/gold/gold_terra__velocity.sql @@ -0,0 +1,27 @@ +{{ config( + materialized = 'incremental', + unique_key = 'start_Date', + incremental_strategy = 'delete+insert', + cluster_by = ['start_date'], + tags = ['snowflake', 'terra_gold', 'terra_velocity'] +) }} +{{ config( + materialized = 'table', + sort = 'start_date', + tags = ['custom'] +) }} + +SELECT + blockchain, + start_date, + end_date, + currency, + metric, + VALUE +FROM + {{ source( + 'shared', + 'udm_velocity' + ) }} +WHERE + blockchain = 'terra' diff --git a/models/terra/gold/gold_terra__voting_power.sql b/models/terra/gold/gold_terra__voting_power.sql new file mode 100644 index 00000000..d3bbc7eb --- /dev/null +++ b/models/terra/gold/gold_terra__voting_power.sql @@ -0,0 +1,25 @@ +{{ config( + materialized = 'incremental', + unique_key = 'blockchain || address', + incremental_strategy = 'delete+insert', + cluster_by = ['block_number', 'block_timestamp'], + tags = ['snowflake', 'terra_gold', 'terra_voting_power'] +) }} + +SELECT + blockchain, + block_timestamp, + block_number, + address, + voting_power +FROM + {{ source( + 'terra', + 'terra_validator_voting_power' + ) }} +WHERE + TRUE + +{% if is_incremental() %} +AND block_timestamp >= getdate() - INTERVAL '3 days' +{% endif %}