This commit is contained in:
drethereum 2025-12-09 11:12:30 -07:00
commit 50bb0bc8b7
47 changed files with 489 additions and 109 deletions

View File

@ -2,6 +2,11 @@ name: dbt_run_template_docs_update
on:
workflow_call:
inputs:
resource_id:
description: 'DDS resource ID to refresh (defaults to repository name if not provided)'
required: false
type: string
jobs:
run_dbt_jobs_refresh:
@ -79,8 +84,19 @@ jobs:
run: |
git push -f --set-upstream origin docs
notify-failure:
refresh-dds-cache:
needs: [run_dbt_jobs_refresh]
if: success()
uses: FlipsideCrypto/analytics-workflow-templates/.github/workflows/refresh_dds.yml@main
with:
resource_id: ${{ inputs.resource_id }}
api_url: ${{ github.ref == 'refs/heads/main' && 'https://dds-api.fsc-data-platform.io' || 'https://dds-api.fsc-data-platform-stg.io' }}
force_refresh: true
secrets:
DDS_API_KEY: ${{ github.ref == 'refs/heads/main' && secrets.DDS_PROD_API_KEY || secrets.DDS_STG_API_KEY }}
notify-failure:
needs: [run_dbt_jobs_refresh, refresh-dds-cache]
if: failure()
uses: ./.github/workflows/slack_notify.yml
secrets:

View File

@ -12,8 +12,10 @@ gnosis_vars,gnosis-models,gnosis,true
ink_vars,ink-models,ink,true
kaia_vars,kaia-models,kaia,false
mantle_vars,mantle-models,mantle,false
monad_vars,monad-models,monad,true
optimism_vars,optimism-models,optimism,true
polygon_vars,polygon-models,polygon,true
ronin_vars,ronin-models,ronin,false
scroll_vars,scroll-models,scroll,false
somnia_vars,somnia-models,somnia,true
swell_vars,swell-models,swell,false
1 repo_key github_repo chain_name is_active
12 ink_vars ink-models ink true
13 kaia_vars kaia-models kaia false
14 mantle_vars mantle-models mantle false
15 monad_vars monad-models monad true
16 optimism_vars optimism-models optimism true
17 polygon_vars polygon-models polygon true
18 ronin_vars ronin-models ronin false
19 scroll_vars scroll-models scroll false
20 somnia_vars somnia-models somnia true
21 swell_vars swell-models swell false

View File

@ -50,7 +50,8 @@ WITH source AS (
FROM
source
WHERE
(latest_timestamp < threshold_ts
latest_timestamp IS NOT NULL
AND (latest_timestamp < threshold_ts
OR (percent_delta < {{ percent_delta_threshold }} AND percent_delta <> 0))
{% if type == 'dex_swaps' %}
AND platform NOT IN ('{{ vars.CURATED_DEFI_DEX_SWAPS_RECENCY_EXCLUSION_LIST | join("', '") }}')

View File

@ -1,4 +1,4 @@
{% test stablecoins_date_gaps(model, lookback_days=7) %}
{% test stablecoins_date_gaps(model, lookback_days=3) %}
WITH recent_data AS (
SELECT

View File

@ -1,4 +1,4 @@
{% test stablecoins_is_imputed_false(model, lookback_days=7) %}
{% test stablecoins_is_imputed_false(model, lookback_days=3) %}
WITH active_pairs AS (
SELECT DISTINCT

View File

@ -1,11 +1,26 @@
{% macro get_where_subquery(relation) -%}
{%- set where = config.get('where') -%}
{% macro get_where_subquery(relation, where_override=none) -%}
{#
Get where clause from config or override parameter.
This macro is namespace-agnostic and can be imported into any dbt project.
Args:
relation: The relation (model/table) to query
where_override: Optional override for the where clause (useful when config context may vary)
#}
{# Get where clause - prefer override, then config, then none #}
{%- if where_override is not none -%}
{%- set where = where_override -%}
{%- else -%}
{%- set where = config.get('where', none) -%}
{%- endif -%}
{%- set interval_vars = namespace(
interval_type = none,
interval_value = none
) -%}
{# Check for interval variables - these work across all namespaces #}
{% set intervals = {
'minutes': var('minutes', none),
'hours': var('hours', none),
@ -22,59 +37,86 @@
{% break %}
{% endif %}
{% endfor %}
{% if 'dbt_expectations_expect_column_values_to_be_in_type_list' in this | string %}
{% if 'dbt_expectations_expect_column_values_to_be_in_type_list' in this | string %}
{% do return(relation) %}
{% endif %}
{%- set ts_vars = namespace(
timestamp_column = none,
filter_condition = none
) -%}
{% if where %}
{% if "__timestamp_filter__" in where %}
{% set columns = adapter.get_columns_in_relation(relation) %}
{% set column_names = columns | map(attribute='name') | list %}
{# Build timestamp filter if interval vars are set #}
{% if interval_vars.interval_type is not none and interval_vars.interval_value is not none %}
{% set columns = adapter.get_columns_in_relation(relation) %}
{# Search for common timestamp column names in priority order #}
{% for column in columns %}
{% if column.name == 'MODIFIED_TIMESTAMP' %}
{% set ts_vars.timestamp_column = 'MODIFIED_TIMESTAMP' %}
{% break %}
{% endif %}
{% endfor %}
{% if not ts_vars.timestamp_column %}
{% for column in columns %}
{% if column.name == 'MODIFIED_TIMESTAMP' %}
{% set ts_vars.timestamp_column = 'MODIFIED_TIMESTAMP' %}
{% if column.name == '_INSERTED_TIMESTAMP' %}
{% set ts_vars.timestamp_column = '_INSERTED_TIMESTAMP' %}
{% break %}
{% endif %}
{% endfor %}
{% if not ts_vars.timestamp_column %}
{% for column in columns %}
{% if column.name == '_INSERTED_TIMESTAMP' %}
{% set ts_vars.timestamp_column = '_INSERTED_TIMESTAMP' %}
{% break %}
{% endif %}
{% endfor %}
{% endif %}
{% if not ts_vars.timestamp_column %}
{% for column in columns %}
{% if column.name == 'BLOCK_TIMESTAMP' %}
{% set ts_vars.timestamp_column = 'BLOCK_TIMESTAMP' %}
{% break %}
{% endif %}
{% endfor %}
{% endif %}
{% if ts_vars.timestamp_column is not none %}
{% set ts_vars.filter_condition = ts_vars.timestamp_column ~ " >= dateadd(" ~
interval_vars.interval_type ~ ", -" ~
interval_vars.interval_value ~ ", current_timestamp())" %}
{% set where = where | replace("__timestamp_filter__", ts_vars.filter_condition) %}
{% endif %}
{% endif %}
{% if not ts_vars.timestamp_column %}
{% for column in columns %}
{% if column.name == 'BLOCK_TIMESTAMP' %}
{% set ts_vars.timestamp_column = 'BLOCK_TIMESTAMP' %}
{% break %}
{% endif %}
{% endfor %}
{% endif %}
{% if not ts_vars.timestamp_column %}
{% for column in columns %}
{% if column.name == 'BLOCK_DATE' %}
{% set ts_vars.timestamp_column = 'BLOCK_DATE' %}
{% break %}
{% endif %}
{% endfor %}
{% endif %}
{# Build timestamp filter condition if we found a timestamp column #}
{% if ts_vars.timestamp_column is not none %}
{% set ts_vars.filter_condition = ts_vars.timestamp_column ~ " >= dateadd(" ~
interval_vars.interval_type ~ ", -" ~
interval_vars.interval_value ~ ", SYSDATE())" %}
{% endif %}
{% endif %}
{# Handle where clause with timestamp filtering #}
{% if ts_vars.filter_condition is not none %}
{# We have a timestamp filter to apply #}
{% if where %}
{# Combine timestamp filter with existing where using AND #}
{% set where = ts_vars.filter_condition ~ " AND (" ~ where ~ ")" %}
{% else %}
{# No existing where clause, use just the timestamp filter #}
{% set where = ts_vars.filter_condition %}
{% endif %}
{% endif %}
{# Return filtered relation - always as a subquery for consistency #}
{% if where %}
{%- set filtered -%}
(select * from {{ relation }} where {{ where }}) dbt_subquery
(select * from {{ relation }} where {{ where }})
{%- endset -%}
{% do return(filtered) %}
{%- else -%}
{% do return(relation) %}
{# Return relation as a subquery even when no where clause for consistent behavior #}
{%- set filtered -%}
(select * from {{ relation }})
{%- endset -%}
{% do return(filtered) %}
{%- endif -%}
{%- endmacro %}

View File

@ -23,7 +23,7 @@
'CURATED_DEFI_LENDING_RECENCY_EXCLUSION_LIST': ['radiant-v2','radiant-v1'],
'CURATED_DEFI_DEX_SWAPS_RECENCY_EXCLUSION_LIST': ['hashflow-v1','gmx-v1','woofi-v3','woofi-v1'],
'CURATED_DEFI_DEX_LP_ACTIONS_RECENCY_EXCLUSION_LIST': ['trader_joe-v2','kyberswap-v1','kyberswap-v2','zyberswap-v2','fraxswap-v1'],
'CURATED_DEFI_BRIDGE_RECENCY_EXCLUSION_LIST': ['hyperliquid-v1','across-v1','multichain-v7','symbiosis-v1','hop-v1'],
'CURATED_DEFI_BRIDGE_RECENCY_EXCLUSION_LIST': ['hyperliquid-v1','across-v2','multichain-v7','symbiosis-v1','hop-v1'],
'CURATED_DEFI_DEX_SWAPS_CONTRACT_MAPPING': {
'uniswap': {
'v2': {
@ -187,8 +187,8 @@
'CURATED_DEFI_DEX_DEXALOT_DEST_CHAIN_ID': 42161,
'CURATED_DEFI_BRIDGE_CONTRACT_MAPPING': {
'across': {
'v1': {
'funds_deposited': '0xe35e9842fceaca96570b734083f4a58e8f7c5f2a'
'v2': {
'funds_deposited': ['0xe35e9842fceaca96570b734083f4a58e8f7c5f2a','0xb88690461ddbab6f04dfad7df66b7725942feb9c']
},
'v3': {
'funds_deposited': '0xe35e9842fceaca96570b734083f4a58e8f7c5f2a'

View File

@ -33,7 +33,7 @@
'CURATED_DEFI_LENDING_RECENCY_EXCLUSION_LIST': ['seamless-v1'],
'CURATED_DEFI_DEX_SWAPS_RECENCY_EXCLUSION_LIST': ['woofi-v3','woofi-v1','voodoo-v1'],
'CURATED_DEFI_DEX_LP_ACTIONS_RECENCY_EXCLUSION_LIST': ['balancer-v1'],
'CURATED_DEFI_BRIDGE_RECENCY_EXCLUSION_LIST': ['symbiosis-v1','hop-v1','across-v1'],
'CURATED_DEFI_BRIDGE_RECENCY_EXCLUSION_LIST': ['symbiosis-v1','hop-v1','across-v2'],
'CURATED_DEFI_DEX_SWAPS_CONTRACT_MAPPING': {
'uniswap': {
'v2': {
@ -139,7 +139,7 @@
'CURATED_DEFI_DEX_DEXALOT_DEST_CHAIN_ID': 8453,
'CURATED_DEFI_BRIDGE_CONTRACT_MAPPING': {
'across': {
'v1': {
'v2': {
'funds_deposited': '0x09aea4b2242abc8bb4bb78d537a67a245a7bec64'
},
'v3': {

View File

@ -60,6 +60,13 @@
'token_bridge_swap': '0x432036208d2717394d2614d6697c46df3ed69540'
}
}
},
'CURATED_DEFI_LENDING_CONTRACT_MAPPING': {
'wefi': {
'v1': {
'comp_v2_origin_from_address': '0x99a219f4c322993a101258b0a157eacf5b447d68'
}
}
}
} %}

View File

@ -166,8 +166,8 @@
},
'CURATED_DEFI_BRIDGE_CONTRACT_MAPPING': {
'across': {
'v1': {
'funds_deposited': '0x5c7bcd6e7de5423a257d81b442095a1a6ced35c5'
'v2': {
'funds_deposited': ['0x5c7bcd6e7de5423a257d81b442095a1a6ced35c5','0x4d9079bb4165aeb4084c526a32695dcfd2f77381']
},
'v3': {
'funds_deposited': '0x5c7bcd6e7de5423a257d81b442095a1a6ced35c5'

View File

@ -4,13 +4,19 @@
'GLOBAL_NODE_PROVIDER': 'quicknode',
'GLOBAL_NODE_URL': "{URL}",
'GLOBAL_NODE_VAULT_PATH': 'Vault/prod/evm/quicknode/monad/mainnet',
'GLOBAL_WRAPPED_NATIVE_ASSET_ADDRESS': '0x3a704ad3e4784b935ae029171adcf57ee7988198',
'GLOBAL_WRAPPED_NATIVE_ASSET_ADDRESS': '0x3bd359c1119da7da1d913d1c4d2b7c461115433a',
'GLOBAL_WRAPPED_NATIVE_ASSET_SYMBOL': 'WMON',
'GLOBAL_NATIVE_ASSET_SYMBOL': 'MON',
'MAIN_SL_BLOCKS_PER_HOUR': 10000,
'MAIN_PRICES_NATIVE_SYMBOLS': 'MON',
'CURATED_START_TIMESTAMP': '2025-11-18 00:00:00',
'MAIN_PRICES_NATIVE_BLOCKCHAINS': 'monad',
'MAIN_PRICES_PROVIDER_PLATFORMS': 'monad',
'DECODER_SILVER_CONTRACT_ABIS_EXPLORER_NAME': 'etherscan',
'DECODER_SL_CONTRACT_ABIS_EXPLORER_VAULT_PATH': 'Vault/prod/evm/etherscan/pro_plus',
'DECODER_SL_CONTRACT_ABIS_EXPLORER_URL': 'https://api.etherscan.io/v2/api?apikey={KEY}&chainid=143&module=contract&action=getabi&address=',
'DECODER_SL_CONTRACT_ABIS_EXPLORER_URL_SUFFIX': '&tag=latest',
'DECODER_SILVER_CONTRACT_ABIS_ETHERSCAN_ENABLED': true,
'MAIN_GHA_STREAMLINE_CHAINHEAD_CRON': '24,54 * * * *',
'BALANCES_SL_DAILY_REALTIME_LOOKBACK_DAYS': -2,
'CURATED_DEFI_DEX_SWAPS_CONTRACT_MAPPING': {
@ -52,6 +58,11 @@
}
},
'CURATED_DEFI_BRIDGE_CONTRACT_MAPPING': {
'across': {
'v3': {
'funds_deposited': '0xd2ecb3afe598b746f8123cae365a598da831a449'
}
},
'layerzero': {
'v2': {
'bridge': '0x6f475642a6e85809b1c36fa62763669b1b48dd5b'
@ -60,7 +71,7 @@
'axelar': {
'v1': {
'gateway': '0xe432150cce91c13a887f7d836923d5597add8e31',
'gas_service': '0xbe406f0189a0b4cf3a05c286473d23791dd44cc6'
'gas_service': '0x2d5d7d31f671f86c782533cc367f14109a082712'
}
},
'wormhole': {
@ -83,6 +94,18 @@
'source': '0xef4fb24ad0916217251f553c0596f8edc630eb66'
}
}
},
'CURATED_DEFI_LENDING_CONTRACT_MAPPING': {
'morpho': {
'v1': {
'morpho_blue_address': '0xd5d960e8c380b724a48ac59e2dff1b2cb4a1eaee'
}
},
'neverland': {
'v1': {
'aave_version_address': '0x80f00661b13cc5f6ccd3885be7b4c9c67545d585'
}
}
}
} %}

View File

@ -22,7 +22,7 @@
'CURATED_DEFI_LENDING_RECENCY_EXCLUSION_LIST': ['granary-v1','sonne-v1'],
'CURATED_DEFI_DEX_SWAPS_RECENCY_EXCLUSION_LIST': ['woofi-v1','hashflow-v1'],
'CURATED_DEFI_DEX_LP_ACTIONS_RECENCY_EXCLUSION_LIST': ['fraxswap-v1','kyberswap-v2','sushiswap-v1','uniswap-v2'],
'CURATED_DEFI_BRIDGE_RECENCY_EXCLUSION_LIST': ['eywa-v1','across-v1','meson-v1','symbiosis-v1','multichain-v7','hop-v1'],
'CURATED_DEFI_BRIDGE_RECENCY_EXCLUSION_LIST': ['eywa-v1','across-v2','meson-v1','symbiosis-v1','multichain-v7','hop-v1'],
'CURATED_DEFI_DEX_SWAPS_CONTRACT_MAPPING': {
'uniswap': {
'v2': {
@ -111,8 +111,8 @@
},
'CURATED_DEFI_BRIDGE_CONTRACT_MAPPING': {
'across': {
'v1': {
'funds_deposited': '0x6f26bf09b1c792e3228e5467807a900a503c0281'
'v2': {
'funds_deposited': ['0x6f26bf09b1c792e3228e5467807a900a503c0281','0xa420b2d1c0841415a695b81e5b867bcd07dff8c9']
},
'v3': {
'funds_deposited': '0x6f26bf09b1c792e3228e5467807a900a503c0281'

View File

@ -24,7 +24,7 @@
'CURATED_DEFI_LENDING_RECENCY_EXCLUSION_LIST': ['aave-v2'],
'CURATED_DEFI_DEX_SWAPS_RECENCY_EXCLUSION_LIST': ['woofi-v1','hashflow-v1'],
'CURATED_DEFI_DEX_LP_ACTIONS_RECENCY_EXCLUSION_LIST': ['kyberswap-v2','curve-v1'],
'CURATED_DEFI_BRIDGE_RECENCY_EXCLUSION_LIST': ['hop-v1','multichain-v7','symbiosis-v1','across-v1'],
'CURATED_DEFI_BRIDGE_RECENCY_EXCLUSION_LIST': ['hop-v1','multichain-v7','symbiosis-v1','across-v2'],
'CURATED_DEFI_DEX_SWAPS_CONTRACT_MAPPING': {
'uniswap': {
'v2': {
@ -113,8 +113,8 @@
},
'CURATED_DEFI_BRIDGE_CONTRACT_MAPPING': {
'across': {
'v1': {
'funds_deposited': '0x9295ee1d8c5b022be115a2ad3c30c72e34e7f096'
'v2': {
'funds_deposited': ['0x9295ee1d8c5b022be115a2ad3c30c72e34e7f096','0x69b5c72837769ef1e7c164abc6515dcff217f920']
},
'v3': {
'funds_deposited': '0x9295ee1d8c5b022be115a2ad3c30c72e34e7f096'

View File

@ -70,6 +70,13 @@
'bridge': '0x78add880a697070c1e765ac44d65323a0dcce913'
}
}
},
'CURATED_DEFI_LENDING_CONTRACT_MAPPING': {
'tokos': {
'v1': {
'aave_version_address': '0xec6758e6324c167db39b6908036240460a2b0168'
}
}
}
} %}

View File

@ -274,6 +274,7 @@
{% set ns.CURATED_COMPLETE_LOOKBACK_HOURS = get_var('CURATED_COMPLETE_LOOKBACK_HOURS', '4 hours') %}
{% set ns.CURATED_LOOKBACK_HOURS = get_var('CURATED_LOOKBACK_HOURS', '12 hours') %}
{% set ns.CURATED_LOOKBACK_DAYS = get_var('CURATED_LOOKBACK_DAYS', '7 days') %}
{% set ns.CURATED_START_TIMESTAMP = get_var('CURATED_START_TIMESTAMP', '2000-01-01 00:00:00') %}
{% set ns.CURATED_FR_MODELS = get_var('CURATED_FR_MODELS', []) %}
{% set ns.CURATED_DEFI_DEX_SWAPS_RECENCY_EXCLUSION_LIST = get_var('CURATED_DEFI_DEX_SWAPS_RECENCY_EXCLUSION_LIST', []) %}
{% set ns.CURATED_DEFI_DEX_LP_ACTIONS_RECENCY_EXCLUSION_LIST = get_var('CURATED_DEFI_DEX_LP_ACTIONS_RECENCY_EXCLUSION_LIST', []) %}

View File

@ -18,7 +18,7 @@ WITH contract_mapping AS (
) }}
WHERE
protocol = 'across'
AND version = 'v1'
AND version = 'v2'
),
base_evt AS (
@ -74,7 +74,7 @@ base_evt AS (
INNER JOIN contract_mapping m
ON l.contract_address = m.contract_address
WHERE
topics [0] :: STRING = '0xafc4df6845a4ab948b492800d3d8a25d538a102a2bc07cd01f1cfa097fddcff6'
topics [0] :: STRING IN ('0xafc4df6845a4ab948b492800d3d8a25d538a102a2bc07cd01f1cfa097fddcff6','0x4a4fc49abd237bfd7f4ac82d6c7a284c69daaea5154430cff04ad7482c6c4254')
AND tx_succeeded
{% if is_incremental() %}

View File

@ -121,19 +121,19 @@ ccip_decoded AS (
utils.udf_hex_to_int(
part [0] :: STRING
) :: STRING AS dest_chain_selector,
utils.udf_hex_to_int(
try_to_number(utils.udf_hex_to_int(
part [2] :: STRING
) :: INT AS fee_token_amount,
)) AS fee_token_amount,
'0x' || SUBSTR(
part [3] :: STRING,
25
) AS original_sender,
utils.udf_hex_to_int(
try_to_number(utils.udf_hex_to_int(
part [4] :: STRING
) :: INT / 32 AS offset_receiver,
utils.udf_hex_to_int(
)) / 32 AS offset_receiver,
try_to_number(utils.udf_hex_to_int(
part [offset_receiver + 4] :: STRING
) :: INT * 2 AS receiver_length,
)) * 2 AS receiver_length,
(
offset_receiver + 5
) * 64 AS receiver_byteskip,
@ -143,12 +143,12 @@ ccip_decoded AS (
25,
40
) AS receiver_evm,
utils.udf_hex_to_int(
try_to_number(utils.udf_hex_to_int(
part [6] :: STRING
) :: INT / 32 AS offset_token_amount,
utils.udf_hex_to_int(
)) / 32 AS offset_token_amount,
try_to_number(utils.udf_hex_to_int(
part [offset_token_amount + 4] :: STRING
) :: INT AS token_amount_array,
)) AS token_amount_array,
chain_name,
trace_index,
from_address,
@ -228,9 +228,9 @@ final_ccip AS (
token_array [0] :: STRING,
25
) AS token_address,
utils.udf_hex_to_int(
try_to_number(utils.udf_hex_to_int(
token_array [1] :: STRING
) :: INT AS amount_unadj,
)) AS amount_unadj,
dest_chain_selector,
receiver_raw,
receiver_evm,

View File

@ -22,6 +22,8 @@ models:
- dbt_expectations.expect_row_values_to_have_recent_data:
datepart: day
interval: 3
config:
severity: warn
- name: EVENT_INDEX
tests:
- not_null:

View File

@ -22,6 +22,8 @@ models:
- dbt_expectations.expect_row_values_to_have_recent_data:
datepart: day
interval: 3
config:
severity: warn
- name: EVENT_INDEX
tests:
- not_null:

View File

@ -21,7 +21,9 @@ models:
- not_null
- dbt_expectations.expect_row_values_to_have_recent_data:
datepart: day
interval: 14
interval: 30
config:
severity: warn
- name: EVENT_INDEX
tests:
- not_null:

View File

@ -22,6 +22,8 @@ models:
- dbt_expectations.expect_row_values_to_have_recent_data:
datepart: day
interval: 30
config:
severity: warn
- name: EVENT_INDEX
tests:
- not_null:

View File

@ -22,6 +22,8 @@ models:
- dbt_expectations.expect_row_values_to_have_recent_data:
datepart: day
interval: 3
config:
severity: warn
- name: EVENT_INDEX
tests:
- not_null:

View File

@ -22,6 +22,8 @@ models:
- dbt_expectations.expect_row_values_to_have_recent_data:
datepart: day
interval: 3
config:
severity: warn
- name: EVENT_INDEX
tests:
- not_null:

View File

@ -54,6 +54,7 @@ log_pull AS (
topics [0] :: STRING in(
'0x7ac369dbd14fa5ea3f473ed67cc9d598964a77501540ba6751eb0b3decf5870d',
'0x70aea8d848e8a90fb7661b227dc522eb6395c3dac71b63cb59edd5c9899b2364',
'0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f',--wefi topic
'0x17d6db5ffe5a3d1c3d7a98194dca4f7d808d621e6ff9077ed574513d553a2a85'--joelend topic
)
AND origin_from_address IN (

View File

@ -77,6 +77,7 @@ traces AS (
AND function_sig = '0x50d8cd4b'
AND trace_succeeded
AND tx_succeeded
AND block_timestamp >= '{{ vars.CURATED_START_TIMESTAMP }}'
{% if is_incremental() %}
AND modified_timestamp >= (

View File

@ -77,6 +77,7 @@ traces AS (
AND function_sig = '0xa99aad89'
AND trace_succeeded
AND tx_succeeded
AND block_timestamp >= '{{ vars.CURATED_START_TIMESTAMP }}'
{% if is_incremental() %}
AND modified_timestamp >= (

View File

@ -53,6 +53,7 @@ flashloan AS(
FROM
morpho_blue_addresses
)
AND l.block_timestamp >= '{{ vars.CURATED_START_TIMESTAMP }}'
{% if is_incremental() %}
AND l.modified_timestamp >= (

View File

@ -64,6 +64,7 @@ traces AS (
AND function_sig = '0xd8eabcb8'
AND trace_succeeded
AND tx_succeeded
AND block_timestamp >= '{{ vars.CURATED_START_TIMESTAMP }}'
{% if is_incremental() %}
AND modified_timestamp >= (

View File

@ -77,6 +77,7 @@ traces AS (
AND function_sig = '0x20b76e81'
AND trace_succeeded
AND tx_succeeded
AND block_timestamp >= '{{ vars.CURATED_START_TIMESTAMP }}'
{% if is_incremental() %}
AND modified_timestamp >= (

View File

@ -77,6 +77,7 @@ traces AS (
AND function_sig = '0x5c2bea49'
AND trace_succeeded
AND tx_succeeded
AND block_timestamp >= '{{ vars.CURATED_START_TIMESTAMP }}'
{% if is_incremental() %}
AND modified_timestamp >= (

View File

@ -25,7 +25,8 @@ WITH crosschain_stablecoins AS (
m.name
) AS NAME,
m.decimals,
m.is_verified
m.is_verified,
m.is_verified_modified_timestamp
FROM
{{ source(
'crosschain_silver',
@ -56,7 +57,8 @@ manual_stablecoins AS (
) AS symbol,
m.name,
m.decimals,
m.is_verified
m.is_verified,
m.is_verified_modified_timestamp
FROM
{{ ref('silver_stablecoins__stablecoins_mapping_seed') }}
s
@ -86,16 +88,84 @@ all_stablecoins AS (
*
FROM
manual_stablecoins
),
{% if is_incremental() and var(
'HEAL_MODEL'
) %}
heal_model AS (
SELECT
t.contract_address,
m.symbol AS symbol_heal,
m.name AS name_heal,
CONCAT(
m.symbol,
': ',
m.name
) AS label_heal,
m.decimals AS decimals_heal,
m.is_verified AS is_verified_heal,
m.is_verified_modified_timestamp AS is_verified_modified_timestamp_heal
FROM
{{ this }}
t
INNER JOIN {{ ref('price__ez_asset_metadata') }}
m
ON t.contract_address = m.token_address
WHERE
m.blockchain = '{{ vars.GLOBAL_PROJECT_NAME }}'
AND (
t.symbol IS NULL
OR t.name IS NULL
OR t.decimals IS NULL
)
),
{% endif %}
FINAL AS (
SELECT
contract_address,
symbol,
NAME,
CONCAT(
symbol,
': ',
NAME
) AS label,
decimals,
is_verified,
is_verified_modified_timestamp
FROM
all_stablecoins
{% if is_incremental() and var(
'HEAL_MODEL'
) %}
UNION ALL
SELECT
contract_address,
symbol_heal AS symbol,
name_heal AS NAME,
label_heal AS label,
decimals_heal AS decimals,
is_verified_heal AS is_verified,
is_verified_modified_timestamp_heal AS is_verified_modified_timestamp
FROM
heal_model
{% endif %}
)
SELECT
contract_address,
symbol,
NAME,
CONCAT(symbol,': ',name) AS label,
label,
decimals,
is_verified,
is_verified_modified_timestamp,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
{{ dbt_utils.generate_surrogate_key(['contract_address']) }} AS dim_stablecoins_id
FROM
all_stablecoins
FINAL qualify(ROW_NUMBER() over (PARTITION BY dim_stablecoins_id
ORDER BY
modified_timestamp DESC)) = 1

View File

@ -19,6 +19,7 @@ SELECT
label,
decimals,
total_supply,
total_holders,
amount_minted,
amount_burned,
amount_transferred,

View File

@ -18,6 +18,8 @@ models:
description: '{{ doc("ez_stablecoins_supply_decimals") }}'
- name: TOTAL_SUPPLY
description: '{{ doc("ez_stablecoins_supply_total_supply") }}'
- name: TOTAL_HOLDERS
description: '{{ doc("ez_stablecoins_supply_total_holders") }}'
- name: AMOUNT_MINTED
description: '{{ doc("ez_stablecoins_supply_amount_minted") }}'
- name: AMOUNT_BURNED

View File

@ -9,7 +9,7 @@
{# Main query starts here #}
{{ streamline_external_table_query(
source_name = 'stablecoin_reads',
source_name = 'contract_reads',
block_number = false,
contract_address = true,
data_not_null = false

View File

@ -9,7 +9,7 @@
{# Main query starts here #}
{{ streamline_external_table_query_fr(
source_name = 'stablecoin_reads',
source_name = 'contract_reads',
block_number = false,
contract_address = true,
data_not_null = false

View File

@ -25,6 +25,9 @@ WITH stablecoin_reads AS (
VALUE :"BLOCK_DATE_UNIX" :: TIMESTAMP
) :: DATE AS block_date,
contract_address,
PARSE_JSON(
VALUE :"METADATA_STR" :: STRING
) :: variant AS metadata,
DATA :result :: STRING AS result_hex,
_inserted_timestamp
FROM
@ -53,6 +56,7 @@ results AS (
block_number,
block_date,
contract_address,
metadata,
IFF(
C.decimals IS NULL,
18,
@ -88,6 +92,7 @@ SELECT
block_number,
block_date,
contract_address,
metadata,
decimals_adj AS decimals,
amount_hex,
amount_raw,

View File

@ -12,7 +12,14 @@
WITH verified_stablecoins AS (
SELECT
contract_address
contract_address,
OBJECT_CONSTRUCT(
'symbol', symbol,
'name', name,
'label', label,
'decimals', decimals,
'is_verified', is_verified
) :: VARIANT AS metadata
FROM
{{ ref('defi__dim_stablecoins') }}
WHERE
@ -31,6 +38,7 @@ max_blocks AS (
base AS (
SELECT
s.contract_address,
s.metadata,
m.block_number,
m.block_date
FROM
@ -61,7 +69,8 @@ ready_reads AS (
function_sig,
64,
'0'
) AS input
) AS input,
metadata
FROM
base
JOIN function_sigs
@ -74,6 +83,7 @@ SELECT
ROUND(block_number,-3) AS partition_key,
function_sig,
input,
metadata :: STRING AS metadata_str,
live.udf_api(
'POST',
'{{ vars.GLOBAL_NODE_URL }}',
@ -109,12 +119,12 @@ WHERE
{# Streamline Function Call #}
{% if execute %}
{% set params = {
"external_table": 'stablecoin_reads',
"external_table": 'contract_reads',
"sql_limit": vars.CURATED_SL_STABLECOIN_READS_HISTORY_SQL_LIMIT,
"producer_batch_size": vars.CURATED_SL_STABLECOIN_READS_HISTORY_PRODUCER_BATCH_SIZE,
"worker_batch_size": vars.CURATED_SL_STABLECOIN_READS_HISTORY_WORKER_BATCH_SIZE,
"async_concurrent_requests": vars.CURATED_SL_STABLECOIN_READS_HISTORY_ASYNC_CONCURRENT_REQUESTS,
"sql_source": 'stablecoin_reads_history'
"sql_source": 'contract_reads_daily_history'
} %}
{% set function_call_sql %}

View File

@ -12,7 +12,14 @@
WITH verified_stablecoins AS (
SELECT
contract_address
contract_address,
OBJECT_CONSTRUCT(
'symbol', symbol,
'name', name,
'label', label,
'decimals', decimals,
'is_verified', is_verified
) :: VARIANT AS metadata
FROM
{{ ref('defi__dim_stablecoins') }}
WHERE
@ -31,6 +38,7 @@ max_blocks AS (
base AS (
SELECT
s.contract_address,
s.metadata,
m.block_number,
m.block_date
FROM
@ -57,7 +65,8 @@ ready_reads AS (
function_sig,
64,
'0'
) AS input
) AS input,
metadata
FROM
base
JOIN function_sigs
@ -70,6 +79,7 @@ SELECT
ROUND(block_number,-3) AS partition_key,
function_sig,
input,
metadata :: STRING AS metadata_str,
live.udf_api(
'POST',
'{{ vars.GLOBAL_NODE_URL }}',
@ -105,12 +115,12 @@ WHERE
{# Streamline Function Call #}
{% if execute %}
{% set params = {
"external_table" :"stablecoin_reads",
"external_table" :"contract_reads",
"sql_limit" : vars.CURATED_SL_STABLECOIN_READS_REALTIME_SQL_LIMIT,
"producer_batch_size" : vars.CURATED_SL_STABLECOIN_READS_REALTIME_PRODUCER_BATCH_SIZE,
"worker_batch_size" : vars.CURATED_SL_STABLECOIN_READS_REALTIME_WORKER_BATCH_SIZE,
"async_concurrent_requests" : vars.CURATED_SL_STABLECOIN_READS_REALTIME_ASYNC_CONCURRENT_REQUESTS,
"sql_source" : 'stablecoin_reads_realtime'
"sql_source" : 'contract_reads_daily_realtime'
} %}
{% set function_call_sql %}

View File

@ -3,6 +3,7 @@
{# Log configuration details #}
{{ log_model_details() }}
-- depends_on: {{ ref('price__ez_asset_metadata') }}
-- depends_on: {{ ref('defi__dim_stablecoins') }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
@ -47,7 +48,11 @@ total_supply AS (
SELECT
block_date,
contract_address,
amount AS total_supply
amount AS total_supply,
metadata :symbol :: STRING AS symbol,
metadata :name :: STRING AS name,
metadata :label :: STRING AS label,
metadata :decimals :: INTEGER AS decimals
FROM
{{ ref('silver__stablecoin_reads') }}
@ -216,11 +221,36 @@ GROUP BY
block_date,
contract_address
),
FINAL AS (
holders AS (
SELECT
block_date,
contract_address,
COUNT(DISTINCT address) AS num_holders,
MAX(modified_timestamp) AS modified_timestamp
FROM
{{ ref('silver_stablecoins__supply_by_address_imputed') }}
WHERE balance > 0
{% if is_incremental() %}
AND block_date IN (
SELECT
block_date
FROM
incremental_dates
)
{% endif %}
GROUP BY
block_date,
contract_address
),
all_supply AS (
SELECT
s.block_date,
s.contract_address,
s.total_supply,
s.symbol,
s.name,
s.label,
s.decimals,
COALESCE(
b.balance_blacklist,
0
@ -256,7 +286,11 @@ FINAL AS (
COALESCE(
transfer_volume,
0
) AS transfer_volume
) AS transfer_volume,
COALESCE(
num_holders,
0
) AS num_holders
FROM
total_supply s
LEFT JOIN blacklist_supply b
@ -271,6 +305,93 @@ FINAL AS (
LEFT JOIN transfers t
ON s.block_date = t.block_date
AND s.contract_address = t.contract_address
LEFT JOIN holders h
ON s.block_date = h.block_date
AND s.contract_address = h.contract_address
),
{% if is_incremental() and var(
'HEAL_MODEL'
) %}
heal_model AS (
SELECT
t.block_date,
t.contract_address,
d.symbol AS symbol_heal,
d.name AS name_heal,
d.label AS label_heal,
d.decimals AS decimals_heal,
t.total_supply,
t.amount_blacklisted,
t.amount_in_cex,
t.amount_in_bridges,
t.amount_in_dex_liquidity_pools,
t.amount_in_lending_pools,
t.amount_in_contracts,
t.amount_minted,
t.amount_burned,
t.amount_transferred,
t.total_holders
FROM
{{ this }}
t
INNER JOIN {{ ref('defi__dim_stablecoins') }}
d
ON t.contract_address = d.contract_address
WHERE
t.symbol IS NULL
OR t.name IS NULL
OR t.decimals IS NULL
),
{% endif %}
FINAL AS (
SELECT
block_date,
contract_address,
symbol,
NAME,
label,
decimals,
total_supply,
blacklist_supply AS amount_blacklisted,
cex_balance AS amount_in_cex,
bridge_balance AS amount_in_bridges,
dex_balance AS amount_in_dex_liquidity_pools,
lending_pool_balance AS amount_in_lending_pools,
contracts_balance AS amount_in_contracts,
mint_amount AS amount_minted,
burn_amount AS amount_burned,
transfer_volume AS amount_transferred,
num_holders AS total_holders
FROM
all_supply
{% if is_incremental() and var(
'HEAL_MODEL'
) %}
UNION ALL
SELECT
block_date,
contract_address,
symbol_heal AS symbol,
name_heal AS NAME,
label_heal AS label,
decimals_heal AS decimals,
total_supply,
amount_blacklisted,
amount_in_cex,
amount_in_bridges,
amount_in_dex_liquidity_pools,
amount_in_lending_pools,
amount_in_contracts,
amount_minted,
amount_burned,
amount_transferred,
total_holders
FROM
heal_model
{% endif %}
)
SELECT
block_date,
@ -280,18 +401,26 @@ SELECT
label,
decimals,
total_supply,
blacklist_supply AS amount_blacklisted,
cex_balance AS amount_in_cex,
bridge_balance AS amount_in_bridges,
dex_balance AS amount_in_dex_liquidity_pools,
lending_pool_balance AS amount_in_lending_pools,
contracts_balance AS amount_in_contracts,
mint_amount AS amount_minted,
burn_amount AS amount_burned,
transfer_volume AS amount_transferred,
total_holders,
amount_blacklisted,
amount_in_cex,
amount_in_bridges,
amount_in_dex_liquidity_pools,
amount_in_lending_pools,
amount_in_contracts,
amount_minted,
amount_burned,
amount_transferred,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
{{ dbt_utils.generate_surrogate_key(['block_date','contract_address']) }} AS stablecoins_supply_complete_id
FROM
FINAL
LEFT JOIN {{ ref('defi__dim_stablecoins') }} USING (contract_address)
{% if is_incremental() and var(
'HEAL_MODEL'
) %}
qualify(ROW_NUMBER() over (PARTITION BY stablecoins_supply_complete_id
ORDER BY
modified_timestamp DESC)) = 1
{% endif %}

View File

@ -28,6 +28,9 @@ models:
- name: TOTAL_SUPPLY
tests:
- not_null
- name: TOTAL_HOLDERS
tests:
- not_null
- name: AMOUNT_BLACKLISTED
tests:
- not_null

View File

@ -132,4 +132,4 @@ SELECT
FROM
all_abis qualify(ROW_NUMBER() over(PARTITION BY contract_address
ORDER BY
_INSERTED_TIMESTAMP DESC)) = 1
_INSERTED_TIMESTAMP DESC)) = 1

View File

@ -127,6 +127,14 @@ Example: 1500000000
{% enddocs %}
{% docs ez_stablecoins_supply_total_holders %}
The total number of unique addresses holding the stablecoin on this blockchain as of the block_date.
Example: 750000
{% enddocs %}
{% docs ez_stablecoins_supply_amount_minted %}
The amount of tokens minted daily.

View File

@ -262,7 +262,13 @@ FROM
qualify ROW_NUMBER() over (
PARTITION BY fact_event_logs_id
ORDER BY
block_number DESC,
block_timestamp DESC nulls last,
origin_function_signature DESC nulls last
{% if vars.GLOBAL_PROJECT_NAME == 'monad' %}
tx_succeeded DESC nulls last,
block_number DESC,
block_timestamp DESC nulls last
{% else %}
block_number DESC,
block_timestamp DESC nulls last,
origin_function_signature DESC nulls last
{% endif %}
) = 1

View File

@ -712,4 +712,10 @@ SELECT
FROM
all_traces qualify(ROW_NUMBER() over(PARTITION BY block_number, {% if vars.MAIN_CORE_TRACES_SEI_MODE %}tx_hash, {% else %}tx_position, {% endif %} trace_index
ORDER BY
modified_timestamp DESC, block_timestamp DESC nulls last)) = 1
{% if vars.GLOBAL_PROJECT_NAME == 'monad' %}
tx_succeeded DESC nulls last,
block_timestamp DESC nulls last
{% else %} -- this maybe should be updated everywhere but im not sure it matters since the block number is in the partition
modified_timestamp DESC, block_timestamp DESC nulls last
{% endif %}
)) = 1

View File

@ -920,7 +920,14 @@ FROM
all_transactions qualify ROW_NUMBER() over (
PARTITION BY fact_transactions_id
ORDER BY
block_number DESC,
block_timestamp DESC nulls last,
tx_succeeded DESC nulls last
{% if vars.GLOBAL_PROJECT_NAME == 'monad' %}
tx_succeeded DESC nulls last,
block_number DESC,
block_timestamp DESC nulls last
{% else %}
block_number DESC,
block_timestamp DESC nulls last,
tx_succeeded DESC nulls last
{% endif %}
) = 1

View File

@ -65,6 +65,12 @@ to_do AS (
SELECT block_number
FROM to_do
{% if not vars.MAIN_SL_NEW_BUILD_ENABLED %}
UNION
SELECT block_number
FROM {{ ref("_unconfirmed_blocks") }}
{% endif %}
{% if vars.MAIN_SL_TESTING_LIMIT is not none %}
ORDER BY block_number DESC
LIMIT {{ vars.MAIN_SL_TESTING_LIMIT }}

View File

@ -44,7 +44,6 @@ sources:
- name: balances_erc20
- name: balances_native
- name: contract_reads
- name: stablecoin_reads
- name: complete_streamline
database: "{{ target.database }}"
schema: streamline