Merge branch 'main' of github.com:FlipsideCrypto/fsc-evm into DAT2-192/upgrade-dbt-version-1.10

This commit is contained in:
mattromano 2026-01-12 09:26:02 -08:00
commit ed6bf5b32b
107 changed files with 4669 additions and 520 deletions

View File

@ -58,7 +58,7 @@ jobs:
git checkout -B docs origin/main
- name: generate dbt docs
run: dbt docs generate -t prod --exclude "fsc_evm,tag:streamline" "fsc_evm,tag:scores"
run: dbt docs generate -t prod --select "$PROJECT_NAME.*" "fsc_evm,tag:core" "fsc_evm,tag:prices" "fsc_evm,tag:labels" "fsc_evm,tag:balances" "fsc_evm,tag:decoded_logs" "fsc_evm,tag:abis" "fsc_evm,tag:defi" "fsc_evm,tag:stats"
- name: move files to docs directory
run: |

View File

@ -0,0 +1,19 @@
contract_address,address,token_address,function_name,function_sig,chain,attribution
0xab7590cee3ef1a863e9a5877fbb82d9be11504da,null,0x0000000000000000000000000000000000000000,categoryTVL,0x820a1175,optimism,ethereum
0x86b5780b606940eb59a062aa85a07959518c0161,null,0x7189fb5b6504bbff6a852b13b7b82a3c118fdc27,totalSupply,0x18160ddd,arbitrum,arbitrum
0x86b5780b606940eb59a062aa85a07959518c0161,null,0x6c240dda6b5c336df09a4d011139beaaa1ea2aa2,totalSupply,0x18160ddd,base,base
0x86b5780b606940eb59a062aa85a07959518c0161,null,0xfe0c30065b384f05761f15d0cc899d4f9f9cc0eb,totalSupply,0x18160ddd,ethereum,ethereum
0x939778d83b46b456224a33fb59630b11dec56663,null,null,totalSupply,0x18160ddd,ethereum,ethereum
0x6329004e903b7f420245e7af3f355186f2432466,null,0x0000000000000000000000000000000000000000,getTvl,0xd075dd42,optimism,ethereum
0x8236a87084f8b84306f72007f36f2618a5634494,0xd4e20eca1f996dab35883dc0ad5e3428af888d45,null,balanceOf,0x70a08231,ethereum,ethereum
0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f,0x657e8c867d8b37dcc18fa4caead9c45eb088c642,0x2260fac5e5542a773aa44fbcfedf7c193bc2c599,balanceOf,0x70a08231,arbitrum,ethereum
0x8236a87084f8b84306f72007f36f2618a5634494,0x657e8c867d8b37dcc18fa4caead9c45eb088c642,null,balanceOf,0x70a08231,ethereum,ethereum
0xecac9c5f704e954931349da37f60e39f515c11c1,0x657e8c867d8b37dcc18fa4caead9c45eb088c642,0x8236a87084f8b84306f72007f36f2618a5634494,balanceOf,0x70a08231,base,ethereum
0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf,0x657e8c867d8b37dcc18fa4caead9c45eb088c642,null,balanceOf,0x70a08231,ethereum,ethereum
0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf,0x657e8c867d8b37dcc18fa4caead9c45eb088c642,null,balanceOf,0x70a08231,base,ethereum
0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf,0x657e8c867d8b37dcc18fa4caead9c45eb088c642,null,balanceOf,0x70a08231,arbitrum,ethereum
0x468c34703f6c648ccf39dbab11305d17c70ba011,0x657e8c867d8b37dcc18fa4caead9c45eb088c642,null,balanceOf,0x70a08231,ethereum,ethereum
0x9c0823d3a1172f9ddf672d438dec79c39a64f448,0x657e8c867d8b37dcc18fa4caead9c45eb088c642,null,balanceOf,0x70a08231,ethereum,ethereum
0x126d4dbf752aaf61f3eaada24ab0db84fecf6891,0x657e8c867d8b37dcc18fa4caead9c45eb088c642,null,balanceOf,0x70a08231,ethereum,ethereum
0x971e5b5d4baa5607863f3748febf287c7bf82618,0x657e8c867d8b37dcc18fa4caead9c45eb088c642,null,balanceOf,0x70a08231,ethereum,ethereum
0x2260fac5e5542a773aa44fbcfedf7c193bc2c599,0x657e8c867d8b37dcc18fa4caead9c45eb088c642,null,balanceOf,0x70a08231,ethereum,ethereum
1 contract_address address token_address function_name function_sig chain attribution
2 0xab7590cee3ef1a863e9a5877fbb82d9be11504da null 0x0000000000000000000000000000000000000000 categoryTVL 0x820a1175 optimism ethereum
3 0x86b5780b606940eb59a062aa85a07959518c0161 null 0x7189fb5b6504bbff6a852b13b7b82a3c118fdc27 totalSupply 0x18160ddd arbitrum arbitrum
4 0x86b5780b606940eb59a062aa85a07959518c0161 null 0x6c240dda6b5c336df09a4d011139beaaa1ea2aa2 totalSupply 0x18160ddd base base
5 0x86b5780b606940eb59a062aa85a07959518c0161 null 0xfe0c30065b384f05761f15d0cc899d4f9f9cc0eb totalSupply 0x18160ddd ethereum ethereum
6 0x939778d83b46b456224a33fb59630b11dec56663 null null totalSupply 0x18160ddd ethereum ethereum
7 0x6329004e903b7f420245e7af3f355186f2432466 null 0x0000000000000000000000000000000000000000 getTvl 0xd075dd42 optimism ethereum
8 0x8236a87084f8b84306f72007f36f2618a5634494 0xd4e20eca1f996dab35883dc0ad5e3428af888d45 null balanceOf 0x70a08231 ethereum ethereum
9 0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f 0x657e8c867d8b37dcc18fa4caead9c45eb088c642 0x2260fac5e5542a773aa44fbcfedf7c193bc2c599 balanceOf 0x70a08231 arbitrum ethereum
10 0x8236a87084f8b84306f72007f36f2618a5634494 0x657e8c867d8b37dcc18fa4caead9c45eb088c642 null balanceOf 0x70a08231 ethereum ethereum
11 0xecac9c5f704e954931349da37f60e39f515c11c1 0x657e8c867d8b37dcc18fa4caead9c45eb088c642 0x8236a87084f8b84306f72007f36f2618a5634494 balanceOf 0x70a08231 base ethereum
12 0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf 0x657e8c867d8b37dcc18fa4caead9c45eb088c642 null balanceOf 0x70a08231 ethereum ethereum
13 0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf 0x657e8c867d8b37dcc18fa4caead9c45eb088c642 null balanceOf 0x70a08231 base ethereum
14 0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf 0x657e8c867d8b37dcc18fa4caead9c45eb088c642 null balanceOf 0x70a08231 arbitrum ethereum
15 0x468c34703f6c648ccf39dbab11305d17c70ba011 0x657e8c867d8b37dcc18fa4caead9c45eb088c642 null balanceOf 0x70a08231 ethereum ethereum
16 0x9c0823d3a1172f9ddf672d438dec79c39a64f448 0x657e8c867d8b37dcc18fa4caead9c45eb088c642 null balanceOf 0x70a08231 ethereum ethereum
17 0x126d4dbf752aaf61f3eaada24ab0db84fecf6891 0x657e8c867d8b37dcc18fa4caead9c45eb088c642 null balanceOf 0x70a08231 ethereum ethereum
18 0x971e5b5d4baa5607863f3748febf287c7bf82618 0x657e8c867d8b37dcc18fa4caead9c45eb088c642 null balanceOf 0x70a08231 ethereum ethereum
19 0x2260fac5e5542a773aa44fbcfedf7c193bc2c599 0x657e8c867d8b37dcc18fa4caead9c45eb088c642 null balanceOf 0x70a08231 ethereum ethereum

View File

@ -0,0 +1,49 @@
chain,token_address,mixer_address
ethereum,0x0000000000000000000000000000000000000000,0x12d66f87a04a9e220743712ce6d9bb1b5616b8fc
ethereum,0x0000000000000000000000000000000000000000,0x47ce0c6ed5b0ce3d3a51fdb1c52dc66a7c3c2936
ethereum,0x0000000000000000000000000000000000000000,0x910cbd523d972eb0a6f4cae4618ad62622b39dbf
ethereum,0x0000000000000000000000000000000000000000,0xa160cdab225685da1d56aa342ad8841c3b53f291
ethereum,0x6b175474e89094c44da98b954eedeac495271d0f,0xd4b88df4d29f5cedd6857912842cff3b20c8cfa3
ethereum,0x6b175474e89094c44da98b954eedeac495271d0f,0xfd8610d20aa15b7b2e3be39b396a1bc3516c7144
ethereum,0x6b175474e89094c44da98b954eedeac495271d0f,0x07687e702b410fa43f4cb4af7fa097918ffd2730
ethereum,0x6b175474e89094c44da98b954eedeac495271d0f,0x23773e65ed146a459791799d01336db287f25334
ethereum,0xdac17f958d2ee523a2206206994597c13d831ec7,0x169ad27a470d064dede56a2d3ff727986b15d52b
ethereum,0xdac17f958d2ee523a2206206994597c13d831ec7,0x0836222f2b2b24a3f36f98668ed8f0b38d1a872f
ethereum,0xdac17f958d2ee523a2206206994597c13d831ec7,0xf67721a2d8f736e75a49fdd7fad2e31d8676542a
ethereum,0xdac17f958d2ee523a2206206994597c13d831ec7,0x9ad122c22b14202b4490edaf288fdb3c7cb3ff5e
ethereum,0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48,0xd96f2b1c14db8458374d9aca76e26c3d18364307
ethereum,0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48,0x4736dcf1b7a3d580672cce6e7c65cd5cc9cfba9d
ethereum,0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48,0xd691f27f38b395864ea86cfc7253969b409c362d
ethereum,0x2260fac5e5542a773aa44fbcfedf7c193bc2c599,0x178169b423a011fff22b9e3f3abea13414ddd0f1
ethereum,0x2260fac5e5542a773aa44fbcfedf7c193bc2c599,0x610b717796ad172b316836ac95a2ffad065ceab4
ethereum,0x2260fac5e5542a773aa44fbcfedf7c193bc2c599,0xbb93e510bbcd0b7beb5a853875f9ec60275cf498
ethereum,0x5d3a536e4d6dbd6114cc1ead35777bab948e3643,0x22aaa7720ddd5388a3c0a3333430953c68f1849b
ethereum,0x5d3a536e4d6dbd6114cc1ead35777bab948e3643,0x03893a7c7463ae47d46bc7f091665f1893656003
ethereum,0x5d3a536e4d6dbd6114cc1ead35777bab948e3643,0x2717c5e28cf931547b621a5dddb772ab6a35b701
ethereum,0x5d3a536e4d6dbd6114cc1ead35777bab948e3643,0xd21be7248e0197ee08e0c20d4a96debdac3d20af
bsc,0x0000000000000000000000000000000000000000,0x84443cfd09a48af6ef360c6976c5392ac5023a1f
bsc,0x0000000000000000000000000000000000000000,0xd47438c816c9e7f2e2888e060936a499af9582b3
bsc,0x0000000000000000000000000000000000000000,0x330bdfade01ee9bf63c209ee33102dd334618e0a
bsc,0x0000000000000000000000000000000000000000,0x1e34a77868e19a6647b1f2f47b51ed72dede95dd
polygon,0x0000000000000000000000000000000000000000,0x1e34a77868e19a6647b1f2f47b51ed72dede95dd
polygon,0x0000000000000000000000000000000000000000,0xdf231d99ff8b6c6cbf4e9b9a945cbacef9339178
polygon,0x0000000000000000000000000000000000000000,0xaf4c0b70b2ea9fb7487c7cbb37ada259579fe040
polygon,0x0000000000000000000000000000000000000000,0xa5c2254e4253490c54cef0a4347fddb8f75a4998
optimism,0x0000000000000000000000000000000000000000,0x84443cfd09a48af6ef360c6976c5392ac5023a1f
optimism,0x0000000000000000000000000000000000000000,0xd47438c816c9e7f2e2888e060936a499af9582b3
optimism,0x0000000000000000000000000000000000000000,0x330bdfade01ee9bf63c209ee33102dd334618e0a
optimism,0x0000000000000000000000000000000000000000,0x1e34a77868e19a6647b1f2f47b51ed72dede95dd
arbitrum,0x0000000000000000000000000000000000000000,0x84443cfd09a48af6ef360c6976c5392ac5023a1f
arbitrum,0x0000000000000000000000000000000000000000,0xd47438c816c9e7f2e2888e060936a499af9582b3
arbitrum,0x0000000000000000000000000000000000000000,0x330bdfade01ee9bf63c209ee33102dd334618e0a
arbitrum,0x0000000000000000000000000000000000000000,0x1e34a77868e19a6647b1f2f47b51ed72dede95dd
gnosis,0x0000000000000000000000000000000000000000,0x1e34a77868e19a6647b1f2f47b51ed72dede95dd
gnosis,0x0000000000000000000000000000000000000000,0xdf231d99ff8b6c6cbf4e9b9a945cbacef9339178
gnosis,0x0000000000000000000000000000000000000000,0xaf4c0b70b2ea9fb7487c7cbb37ada259579fe040
gnosis,0x0000000000000000000000000000000000000000,0xa5c2254e4253490c54cef0a4347fddb8f75a4998
avax,0x0000000000000000000000000000000000000000,0x330bdfade01ee9bf63c209ee33102dd334618e0a
avax,0x0000000000000000000000000000000000000000,0x1e34a77868e19a6647b1f2f47b51ed72dede95dd
avax,0x0000000000000000000000000000000000000000,0xaf8d1839c3c67cf571aa74b5c12398d4901147b3
ethereumclassic,0x0000000000000000000000000000000000000000,0x2f56d5afc058b8734350b162efee75ee48f034e0
ethereumclassic,0x0000000000000000000000000000000000000000,0x59fcb629a23e8ed0a60a0188771e221042260118
ethereumclassic,0x0000000000000000000000000000000000000000,0x784b3a7a7981b959bd8d9d9e73c2013be819fbf2
1 chain token_address mixer_address
2 ethereum 0x0000000000000000000000000000000000000000 0x12d66f87a04a9e220743712ce6d9bb1b5616b8fc
3 ethereum 0x0000000000000000000000000000000000000000 0x47ce0c6ed5b0ce3d3a51fdb1c52dc66a7c3c2936
4 ethereum 0x0000000000000000000000000000000000000000 0x910cbd523d972eb0a6f4cae4618ad62622b39dbf
5 ethereum 0x0000000000000000000000000000000000000000 0xa160cdab225685da1d56aa342ad8841c3b53f291
6 ethereum 0x6b175474e89094c44da98b954eedeac495271d0f 0xd4b88df4d29f5cedd6857912842cff3b20c8cfa3
7 ethereum 0x6b175474e89094c44da98b954eedeac495271d0f 0xfd8610d20aa15b7b2e3be39b396a1bc3516c7144
8 ethereum 0x6b175474e89094c44da98b954eedeac495271d0f 0x07687e702b410fa43f4cb4af7fa097918ffd2730
9 ethereum 0x6b175474e89094c44da98b954eedeac495271d0f 0x23773e65ed146a459791799d01336db287f25334
10 ethereum 0xdac17f958d2ee523a2206206994597c13d831ec7 0x169ad27a470d064dede56a2d3ff727986b15d52b
11 ethereum 0xdac17f958d2ee523a2206206994597c13d831ec7 0x0836222f2b2b24a3f36f98668ed8f0b38d1a872f
12 ethereum 0xdac17f958d2ee523a2206206994597c13d831ec7 0xf67721a2d8f736e75a49fdd7fad2e31d8676542a
13 ethereum 0xdac17f958d2ee523a2206206994597c13d831ec7 0x9ad122c22b14202b4490edaf288fdb3c7cb3ff5e
14 ethereum 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 0xd96f2b1c14db8458374d9aca76e26c3d18364307
15 ethereum 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 0x4736dcf1b7a3d580672cce6e7c65cd5cc9cfba9d
16 ethereum 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 0xd691f27f38b395864ea86cfc7253969b409c362d
17 ethereum 0x2260fac5e5542a773aa44fbcfedf7c193bc2c599 0x178169b423a011fff22b9e3f3abea13414ddd0f1
18 ethereum 0x2260fac5e5542a773aa44fbcfedf7c193bc2c599 0x610b717796ad172b316836ac95a2ffad065ceab4
19 ethereum 0x2260fac5e5542a773aa44fbcfedf7c193bc2c599 0xbb93e510bbcd0b7beb5a853875f9ec60275cf498
20 ethereum 0x5d3a536e4d6dbd6114cc1ead35777bab948e3643 0x22aaa7720ddd5388a3c0a3333430953c68f1849b
21 ethereum 0x5d3a536e4d6dbd6114cc1ead35777bab948e3643 0x03893a7c7463ae47d46bc7f091665f1893656003
22 ethereum 0x5d3a536e4d6dbd6114cc1ead35777bab948e3643 0x2717c5e28cf931547b621a5dddb772ab6a35b701
23 ethereum 0x5d3a536e4d6dbd6114cc1ead35777bab948e3643 0xd21be7248e0197ee08e0c20d4a96debdac3d20af
24 bsc 0x0000000000000000000000000000000000000000 0x84443cfd09a48af6ef360c6976c5392ac5023a1f
25 bsc 0x0000000000000000000000000000000000000000 0xd47438c816c9e7f2e2888e060936a499af9582b3
26 bsc 0x0000000000000000000000000000000000000000 0x330bdfade01ee9bf63c209ee33102dd334618e0a
27 bsc 0x0000000000000000000000000000000000000000 0x1e34a77868e19a6647b1f2f47b51ed72dede95dd
28 polygon 0x0000000000000000000000000000000000000000 0x1e34a77868e19a6647b1f2f47b51ed72dede95dd
29 polygon 0x0000000000000000000000000000000000000000 0xdf231d99ff8b6c6cbf4e9b9a945cbacef9339178
30 polygon 0x0000000000000000000000000000000000000000 0xaf4c0b70b2ea9fb7487c7cbb37ada259579fe040
31 polygon 0x0000000000000000000000000000000000000000 0xa5c2254e4253490c54cef0a4347fddb8f75a4998
32 optimism 0x0000000000000000000000000000000000000000 0x84443cfd09a48af6ef360c6976c5392ac5023a1f
33 optimism 0x0000000000000000000000000000000000000000 0xd47438c816c9e7f2e2888e060936a499af9582b3
34 optimism 0x0000000000000000000000000000000000000000 0x330bdfade01ee9bf63c209ee33102dd334618e0a
35 optimism 0x0000000000000000000000000000000000000000 0x1e34a77868e19a6647b1f2f47b51ed72dede95dd
36 arbitrum 0x0000000000000000000000000000000000000000 0x84443cfd09a48af6ef360c6976c5392ac5023a1f
37 arbitrum 0x0000000000000000000000000000000000000000 0xd47438c816c9e7f2e2888e060936a499af9582b3
38 arbitrum 0x0000000000000000000000000000000000000000 0x330bdfade01ee9bf63c209ee33102dd334618e0a
39 arbitrum 0x0000000000000000000000000000000000000000 0x1e34a77868e19a6647b1f2f47b51ed72dede95dd
40 gnosis 0x0000000000000000000000000000000000000000 0x1e34a77868e19a6647b1f2f47b51ed72dede95dd
41 gnosis 0x0000000000000000000000000000000000000000 0xdf231d99ff8b6c6cbf4e9b9a945cbacef9339178
42 gnosis 0x0000000000000000000000000000000000000000 0xaf4c0b70b2ea9fb7487c7cbb37ada259579fe040
43 gnosis 0x0000000000000000000000000000000000000000 0xa5c2254e4253490c54cef0a4347fddb8f75a4998
44 avax 0x0000000000000000000000000000000000000000 0x330bdfade01ee9bf63c209ee33102dd334618e0a
45 avax 0x0000000000000000000000000000000000000000 0x1e34a77868e19a6647b1f2f47b51ed72dede95dd
46 avax 0x0000000000000000000000000000000000000000 0xaf8d1839c3c67cf571aa74b5c12398d4901147b3
47 ethereumclassic 0x0000000000000000000000000000000000000000 0x2f56d5afc058b8734350b162efee75ee48f034e0
48 ethereumclassic 0x0000000000000000000000000000000000000000 0x59fcb629a23e8ed0a60a0188771e221042260118
49 ethereumclassic 0x0000000000000000000000000000000000000000 0x784b3a7a7981b959bd8d9d9e73c2013be819fbf2

View File

@ -0,0 +1,28 @@
{% macro unverify_contract_reads() %}
{% if var('HEAL_MODEL', false) and is_incremental() %}
DELETE FROM {{ this }} t
WHERE t.metadata:verified_check_enabled::STRING = 'true'
AND (
(
t.metadata:token0::STRING IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM {{ ref('price__ez_asset_metadata') }} v
WHERE v.is_verified
AND v.token_address IS NOT NULL
AND v.token_address = t.metadata:token0::STRING
)
)
OR (
t.metadata:token1::STRING IS NOT NULL
AND NOT EXISTS (
SELECT 1
FROM {{ ref('price__ez_asset_metadata') }} v
WHERE v.is_verified
AND v.token_address IS NOT NULL
AND v.token_address = t.metadata:token1::STRING
)
)
);
{% endif %}
{% endmacro %}

View File

@ -0,0 +1,32 @@
{% macro unverify_tvl() %}
{% if var('HEAL_MODEL', false) and is_incremental() %}
-- Only target platforms that use verified_check_enabled
-- Delete rows that are invalid in BOTH v2 and v3/v4 styles
DELETE FROM {{ this }} t
WHERE EXISTS (
SELECT 1
FROM {{ ref('streamline__contract_reads_records') }}
WHERE metadata:verified_check_enabled::STRING = 'true'
AND platform = t.platform
) --necessary for the complete_tvl model
AND
-- Not valid in v2 style (address as pool)
NOT EXISTS (
SELECT 1
FROM {{ ref('streamline__contract_reads_records') }} r
WHERE r.metadata:verified_check_enabled::STRING = 'true'
AND r.address IS NULL
AND r.contract_address = t.address
)
AND
-- Not valid in v3/v4 style (token-address combo)
NOT EXISTS (
SELECT 1
FROM {{ ref('streamline__contract_reads_records') }} r
WHERE r.metadata:verified_check_enabled::STRING = 'true'
AND r.address IS NOT NULL
AND r.contract_address = t.contract_address
AND r.address = t.address
);
{% 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-v2','multichain-v7','symbiosis-v1','hop-v1'],
'CURATED_DEFI_BRIDGE_RECENCY_EXCLUSION_LIST': ['hyperliquid-v1','across-v2','multichain-v7','symbiosis-v1','hop-v1','everclear-v1'],
'CURATED_DEFI_DEX_SWAPS_CONTRACT_MAPPING': {
'uniswap': {
'v2': {

View File

@ -22,8 +22,8 @@
'CUSTOM_GHA_SCHEDULED_DEXALOT_MAIN_CRON': '5 * * * *',
'CURATED_DEFI_LENDING_RECENCY_EXCLUSION_LIST': ['aave-v2'],
'CURATED_DEFI_DEX_SWAPS_RECENCY_EXCLUSION_LIST': ['gmx-v1','hashflow-v1','woofi-v1'],
'CURATED_DEFI_DEX_LP_ACTIONS_RECENCY_EXCLUSION_LIST': ['pharaoh-v1','kyberswap-v2','curve-v1','uniswap-v2','kyberswap-v1','fraxswap-v1'],
'CURATED_DEFI_BRIDGE_RECENCY_EXCLUSION_LIST': ['symbiosis-v1','multichain-v7','allbridge-v1'],
'CURATED_DEFI_DEX_LP_ACTIONS_RECENCY_EXCLUSION_LIST': ['pharaoh-v1','kyberswap-v2','curve-v1','uniswap-v2','kyberswap-v1','fraxswap-v1','pharaoh-v2'],
'CURATED_DEFI_BRIDGE_RECENCY_EXCLUSION_LIST': ['symbiosis-v1','multichain-v7','allbridge-v1','everclear-v1','eywa-v1'],
'CURATED_DEFI_DEX_SWAPS_CONTRACT_MAPPING': {
'arena_trade': {
'v1': {

View File

@ -26,11 +26,14 @@
'MAIN_OBSERV_EXCLUSION_LIST_ENABLED': true,
'MAIN_SL_TOKEN_READS_BRONZE_TABLE_ENABLED': true,
'CURATED_DEFI_LENDING_RECENCY_EXCLUSION_LIST': ['silo-v1','aave-v1','flux-v1','aave-v2','aave-v2.1','sturdy-v1','silo-v2'],
'CURATED_DEFI_DEX_SWAPS_RECENCY_EXCLUSION_LIST': ['hashflow-v1','pancakeswap-v2','synthetix-v1'],
'CURATED_DEFI_DEX_LP_ACTIONS_RECENCY_EXCLUSION_LIST': ['kyberswap-v2'],
'CURATED_DEFI_BRIDGE_RECENCY_EXCLUSION_LIST': ['ronin_axie_bridge-v1','multichain-v7','symbiosis-v1','axie_infinity-v2','across-v2','near_rainbow_bridge-v1','hop-v1'],
'CURATED_DEFI_DEX_SWAPS_RECENCY_EXCLUSION_LIST': ['hashflow-v1','pancakeswap-v2','synthetix-v1','uniswap-v1'],
'CURATED_DEFI_DEX_LP_ACTIONS_RECENCY_EXCLUSION_LIST': ['kyberswap-v2','uniswap-v1'],
'CURATED_DEFI_BRIDGE_RECENCY_EXCLUSION_LIST': ['ronin_axie_bridge-v1','multichain-v7','symbiosis-v1','axie_infinity-v2','across-v1','near_rainbow_bridge-v1','hop-v1','everclear-v1'],
'CURATED_DEFI_DEX_SWAPS_CONTRACT_MAPPING': {
'uniswap': {
'v1': {
'factory': '0xc0a47dfe034b400b47bdad5fecda2621de6c4d95'
},
'v2': {
'uni_v2_pair_created': '0x5c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f'
},

View File

@ -18,6 +18,7 @@
'MAIN_GHA_SCHEDULED_SCORES_CRON': '50 5 * * *',
'CURATED_DEFI_LENDING_RECENCY_EXCLUSION_LIST': ['morpho-v1'],
'CURATED_DEFI_DEX_LP_ACTIONS_RECENCY_EXCLUSION_LIST': ['squidswap-v1'],
'CURATED_DEFI_BRIDGE_RECENCY_EXCLUSION_LIST': ['everclear-v1'],
'CURATED_DEFI_DEX_SWAPS_CONTRACT_MAPPING': {
'uniswap': {
'v2': {

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-v2','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','everclear-v1'],
'CURATED_DEFI_DEX_SWAPS_CONTRACT_MAPPING': {
'uniswap': {
'v2': {

View File

@ -4,6 +4,8 @@
'GLOBAL_NODE_PROVIDER': 'flipside',
'GLOBAL_NODE_URL': "{URL}",
'GLOBAL_NODE_VAULT_PATH': 'vault/prod/evm/flipside/somnia/mainnet',
'GLOBAL_ALT_NODE_ENABLED': true,
'GLOBAL_ALT_NODE_VAULT_PATH': 'vault/prod/evm/ankr/somnia/mainnet',
'GLOBAL_WRAPPED_NATIVE_ASSET_ADDRESS': '0x046ede9564a72571df6f5e44d0405360c0f4dcab',
'GLOBAL_WRAPPED_NATIVE_ASSET_SYMBOL': 'WSOMI',
'GLOBAL_NATIVE_ASSET_SYMBOL': 'SOMI',

View File

@ -19,6 +19,8 @@
{% set ns.GLOBAL_NODE_VAULT_PATH = get_var('GLOBAL_NODE_VAULT_PATH', '') %}
{% set ns.GLOBAL_NETWORK = get_var('GLOBAL_NETWORK', 'mainnet') %}
{% set ns.GLOBAL_START_BLOCK = get_var('GLOBAL_START_BLOCK', 0) %}
{% set ns.GLOBAL_ALT_NODE_ENABLED = get_var('GLOBAL_ALT_NODE_ENABLED', false) %}
{% set ns.GLOBAL_ALT_NODE_VAULT_PATH = get_var('GLOBAL_ALT_NODE_VAULT_PATH', '') %}
{% set ns.GLOBAL_BRONZE_FR_ENABLED = none if get_var('GLOBAL_BRONZE_FR_ENABLED', false) else false %} {# Sets to none if true, still requires --full-refresh, otherwise will use incremental #}
{% set ns.GLOBAL_SILVER_FR_ENABLED = none if get_var('GLOBAL_SILVER_FR_ENABLED', false) else false %}
@ -281,16 +283,18 @@
{% set ns.CURATED_DEFI_BRIDGE_RECENCY_EXCLUSION_LIST = get_var('CURATED_DEFI_BRIDGE_RECENCY_EXCLUSION_LIST', []) %}
{% set ns.CURATED_DEFI_LENDING_RECENCY_EXCLUSION_LIST = get_var('CURATED_DEFI_LENDING_RECENCY_EXCLUSION_LIST', []) %}
{# SL Stablecoin Reads Variables #}
{% set ns.CURATED_SL_STABLECOIN_READS_REALTIME_SQL_LIMIT = get_var('CURATED_SL_STABLECOIN_READS_REALTIME_SQL_LIMIT', 3000) %}
{% set ns.CURATED_SL_STABLECOIN_READS_REALTIME_PRODUCER_BATCH_SIZE = get_var('CURATED_SL_STABLECOIN_READS_REALTIME_PRODUCER_BATCH_SIZE', 1500) %}
{% set ns.CURATED_SL_STABLECOIN_READS_REALTIME_WORKER_BATCH_SIZE = get_var('CURATED_SL_STABLECOIN_READS_REALTIME_WORKER_BATCH_SIZE', 500) %}
{% set ns.CURATED_SL_STABLECOIN_READS_REALTIME_ASYNC_CONCURRENT_REQUESTS = get_var('CURATED_SL_STABLECOIN_READS_REALTIME_ASYNC_CONCURRENT_REQUESTS', 5) %}
{# SL Contract Reads Variables #}
{% set ns.CURATED_SL_CONTRACT_READS_START_DATE = get_var('CURATED_SL_CONTRACT_READS_START_DATE', '2025-06-10') %}
{% set ns.CURATED_SL_STABLECOIN_READS_HISTORY_SQL_LIMIT = get_var('CURATED_SL_STABLECOIN_READS_HISTORY_SQL_LIMIT', 20000) %}
{% set ns.CURATED_SL_STABLECOIN_READS_HISTORY_PRODUCER_BATCH_SIZE = get_var('CURATED_SL_STABLECOIN_READS_HISTORY_PRODUCER_BATCH_SIZE', 1500) %}
{% set ns.CURATED_SL_STABLECOIN_READS_HISTORY_WORKER_BATCH_SIZE = get_var('CURATED_SL_STABLECOIN_READS_HISTORY_WORKER_BATCH_SIZE', 500) %}
{% set ns.CURATED_SL_STABLECOIN_READS_HISTORY_ASYNC_CONCURRENT_REQUESTS = get_var('CURATED_SL_STABLECOIN_READS_HISTORY_ASYNC_CONCURRENT_REQUESTS', 5) %}
{% set ns.CURATED_SL_CONTRACT_READS_REALTIME_SQL_LIMIT = get_var('CURATED_SL_CONTRACT_READS_REALTIME_SQL_LIMIT', 12000000) %}
{% set ns.CURATED_SL_CONTRACT_READS_REALTIME_PRODUCER_BATCH_SIZE = get_var('CURATED_SL_CONTRACT_READS_REALTIME_PRODUCER_BATCH_SIZE', 240000) %}
{% set ns.CURATED_SL_CONTRACT_READS_REALTIME_WORKER_BATCH_SIZE = get_var('CURATED_SL_CONTRACT_READS_REALTIME_WORKER_BATCH_SIZE', 60000) %}
{% set ns.CURATED_SL_CONTRACT_READS_REALTIME_ASYNC_CONCURRENT_REQUESTS = get_var('CURATED_SL_CONTRACT_READS_REALTIME_ASYNC_CONCURRENT_REQUESTS', 10) %}
{% set ns.CURATED_SL_CONTRACT_READS_HISTORY_SQL_LIMIT = get_var('CURATED_SL_CONTRACT_READS_HISTORY_SQL_LIMIT', 12000000) %}
{% set ns.CURATED_SL_CONTRACT_READS_HISTORY_PRODUCER_BATCH_SIZE = get_var('CURATED_SL_CONTRACT_READS_HISTORY_PRODUCER_BATCH_SIZE', 600000) %}
{% set ns.CURATED_SL_CONTRACT_READS_HISTORY_WORKER_BATCH_SIZE = get_var('CURATED_SL_CONTRACT_READS_HISTORY_WORKER_BATCH_SIZE', 60000) %}
{% set ns.CURATED_SL_CONTRACT_READS_HISTORY_ASYNC_CONCURRENT_REQUESTS = get_var('CURATED_SL_CONTRACT_READS_HISTORY_ASYNC_CONCURRENT_REQUESTS', 10) %}
{# Curated Bridge Variables #}
{% set ns.CURATED_DEFI_BRIDGE_CONTRACT_MAPPING = get_var('CURATED_DEFI_BRIDGE_CONTRACT_MAPPING', {}) %}

View File

@ -18,7 +18,7 @@
],
merge_exclude_columns = ["inserted_timestamp"],
full_refresh = vars.GLOBAL_GOLD_FR_ENABLED,
tags = ['gold','balances','erc20','heal','phase_4']
tags = ['gold','balances','erc20','heal','curated_daily','phase_4']
) }}
WITH balances AS (

View File

@ -15,7 +15,7 @@
merge_exclude_columns = ["inserted_timestamp"],
post_hook = "{{ unverify_balances() }}",
full_refresh = vars.GLOBAL_SILVER_FR_ENABLED,
tags = ['silver','balances','erc20','heal','phase_4']
tags = ['silver','balances','erc20','heal','curated_daily','phase_4']
) }}
SELECT

View File

@ -87,7 +87,12 @@ SELECT
'x-fsc-livequery', 'true'
),
'method', 'POST',
'secret_name', '{{ vars.GLOBAL_NODE_VAULT_PATH }}',
'secret_name',
{% if vars.GLOBAL_ALT_NODE_ENABLED %}
'{{ vars.GLOBAL_ALT_NODE_VAULT_PATH }}'
{% else %}
'{{ vars.GLOBAL_NODE_VAULT_PATH }}'
{% endif %},
'url', '{{ vars.GLOBAL_NODE_URL }}'
) AS request
FROM

View File

@ -89,7 +89,12 @@ SELECT
'x-fsc-livequery', 'true'
),
'method', 'POST',
'secret_name', '{{ vars.GLOBAL_NODE_VAULT_PATH }}',
'secret_name',
{% if vars.GLOBAL_ALT_NODE_ENABLED %}
'{{ vars.GLOBAL_ALT_NODE_VAULT_PATH }}'
{% else %}
'{{ vars.GLOBAL_NODE_VAULT_PATH }}'
{% endif %},
'url', '{{ vars.GLOBAL_NODE_URL }}'
) AS request
FROM

View File

@ -13,7 +13,7 @@
post_hook = "ALTER TABLE {{ this }} ADD SEARCH OPTIMIZATION ON EQUALITY(address)",
merge_exclude_columns = ["inserted_timestamp"],
full_refresh = vars.GLOBAL_GOLD_FR_ENABLED,
tags = ['gold','balances','native','phase_4']
tags = ['gold','balances','native','curated_daily','phase_4']
) }}
WITH balances AS (

View File

@ -12,7 +12,7 @@
incremental_predicates = ["dynamic_range", "block_number"],
merge_exclude_columns = ["inserted_timestamp"],
full_refresh = vars.GLOBAL_SILVER_FR_ENABLED,
tags = ['silver','balances','native','phase_4']
tags = ['silver','balances','native','curated_daily','phase_4']
) }}
SELECT

View File

@ -77,7 +77,12 @@ SELECT
'x-fsc-livequery', 'true'
),
'method', 'POST',
'secret_name', '{{ vars.GLOBAL_NODE_VAULT_PATH }}',
'secret_name',
{% if vars.GLOBAL_ALT_NODE_ENABLED %}
'{{ vars.GLOBAL_ALT_NODE_VAULT_PATH }}'
{% else %}
'{{ vars.GLOBAL_NODE_VAULT_PATH }}'
{% endif %},
'url', '{{ vars.GLOBAL_NODE_URL }}'
) AS request
FROM

View File

@ -79,7 +79,12 @@ SELECT
'x-fsc-livequery', 'true'
),
'method', 'POST',
'secret_name', '{{ vars.GLOBAL_NODE_VAULT_PATH }}',
'secret_name',
{% if vars.GLOBAL_ALT_NODE_ENABLED %}
'{{ vars.GLOBAL_ALT_NODE_VAULT_PATH }}'
{% else %}
'{{ vars.GLOBAL_NODE_VAULT_PATH }}'
{% endif %},
'url', '{{ vars.GLOBAL_NODE_URL }}'
) AS request
FROM

View File

@ -51,7 +51,7 @@ tx_fees AS (
)
{% endif %}
),
native_transfers_snapshot AS (
native_records_snapshot AS (
SELECT
DISTINCT
('{{ vars.BALANCES_SL_START_DATE }}' :: TIMESTAMP) :: DATE AS block_date,
@ -80,8 +80,20 @@ native_transfers_snapshot AS (
tx_fees
WHERE
block_timestamp :: DATE <= ('{{ vars.BALANCES_SL_START_DATE }}' :: TIMESTAMP) :: DATE
{% if not is_incremental() %}
UNION
SELECT
DISTINCT
('{{ vars.BALANCES_SL_START_DATE }}' :: TIMESTAMP) :: DATE AS block_date,
address
FROM
{{ ref('silver__balances_validator_addresses_daily')}} b
GROUP BY
address
HAVING MIN(b.block_date) <= ('{{ vars.BALANCES_SL_START_DATE }}' :: TIMESTAMP) :: DATE
{% endif %}
),
native_transfers_history AS (
native_records_history AS (
SELECT
DISTINCT
block_timestamp :: DATE AS block_date,
@ -110,11 +122,28 @@ native_transfers_history AS (
tx_fees
WHERE
block_date > ('{{ vars.BALANCES_SL_START_DATE }}' :: TIMESTAMP) :: DATE
),
all_transfers AS (
SELECT * FROM native_transfers_snapshot
UNION
SELECT * FROM native_transfers_history
SELECT
DISTINCT
block_date,
address
FROM
{{ ref('silver__balances_validator_addresses_daily')}}
WHERE
block_date > ('{{ vars.BALANCES_SL_START_DATE }}' :: TIMESTAMP) :: DATE
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
),
all_records AS (
SELECT * FROM native_records_snapshot
UNION
SELECT * FROM native_records_history
)
SELECT
block_date,
@ -124,6 +153,6 @@ SELECT
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
all_transfers qualify (ROW_NUMBER() over (PARTITION BY balances_native_daily_records_id
all_records qualify (ROW_NUMBER() over (PARTITION BY balances_native_daily_records_id
ORDER BY
modified_timestamp DESC)) = 1

View File

@ -0,0 +1,41 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{# Set up dbt configuration #}
{{ config (
materialized = "incremental",
unique_key = "balances_validator_addresses_daily_id",
cluster_by = "block_date",
tags = ['silver','streamline','balances','records','native','phase_4']
) }}
WITH miner_addresses AS (
SELECT
DISTINCT block_timestamp :: DATE AS block_date,
miner AS address
FROM
{{ ref('core__fact_blocks') }}
WHERE miner <> '0x0000000000000000000000000000000000000000'
{% if is_incremental() %}
AND
modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
)
SELECT
block_date,
address,
{{ dbt_utils.generate_surrogate_key(['block_date', 'address']) }} AS balances_validator_addresses_daily_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
miner_addresses
QUALIFY(ROW_NUMBER() over (PARTITION BY balances_validator_addresses_daily_id
ORDER BY
modified_timestamp DESC)) = 1

View File

@ -4,7 +4,7 @@
{# Set up dbt configuration #}
{{ config (
materialized = 'view',
tags = ['bronze','stablecoin_reads','phase_4']
tags = ['bronze','contract_reads','phase_4']
) }}
{# Main query starts here #}

View File

@ -4,7 +4,7 @@
{# Set up dbt configuration #}
{{ config (
materialized = 'view',
tags = ['bronze','stablecoin_reads','phase_4']
tags = ['bronze','contract_reads','phase_4']
) }}
{# Main query starts here #}

View File

@ -0,0 +1,62 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
-- depends_on: {{ ref('bronze__contract_reads') }}
{{ config(
materialized = 'incremental',
unique_key = 'contract_reads_id',
cluster_by = ['block_date'],
incremental_predicates = ["dynamic_range", "block_number"],
merge_exclude_columns = ["inserted_timestamp"],
full_refresh = vars.GLOBAL_SILVER_FR_ENABLED,
tags = ['silver','contract_reads','curated_daily']
) }}
SELECT
VALUE :"BLOCK_NUMBER" :: NUMBER AS block_number,
(
VALUE :"BLOCK_DATE_UNIX" :: TIMESTAMP
) :: DATE AS block_date,
VALUE :"CONTRACT_ADDRESS" :: STRING AS contract_address,
VALUE :"ADDRESS" :: STRING AS address,
VALUE :"PROTOCOL" :: STRING AS protocol,
VALUE :"VERSION" :: STRING AS version,
VALUE :"PLATFORM" :: STRING AS platform,
VALUE :"TYPE" :: STRING AS type,
PARSE_JSON(
VALUE :"METADATA_STR" :: STRING
) :: variant AS metadata,
VALUE :"FUNCTION_NAME" :: STRING AS function_name,
VALUE :"FUNCTION_SIG" :: STRING AS function_sig,
VALUE :"INPUT" :: STRING AS input,
DATA :result :: STRING AS result_hex,
_inserted_timestamp,
{{ dbt_utils.generate_surrogate_key(
['block_number','contract_address', 'address', 'input', 'platform', 'type']
) }} AS contract_reads_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
{% if is_incremental() %}
{{ ref('bronze__contract_reads') }}
WHERE
_inserted_timestamp >= (
SELECT
COALESCE(MAX(_inserted_timestamp), '1970-01-01')
FROM
{{ this }})
AND DATA :result :: STRING <> '0x'
AND platform IS NOT NULL
{% else %}
{{ ref('bronze__contract_reads_fr') }}
WHERE
DATA :result :: STRING <> '0x'
AND platform IS NOT NULL
{% endif %}
qualify(ROW_NUMBER() over (PARTITION BY contract_reads_id
ORDER BY
_inserted_timestamp DESC)) = 1

View File

@ -0,0 +1,20 @@
version: 2
models:
- name: silver__contract_reads
tests:
- dbt_utils.unique_combination_of_columns:
combination_of_columns:
- contract_reads_id
columns:
- name: BLOCK_DATE
tests:
- not_null
- name: CONTRACT_ADDRESS
tests:
- not_null
- name: PLATFORM
tests:
- not_null
- name: RESULT_HEX
tests:
- not_null

View File

@ -0,0 +1,62 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
-- depends on: {{ ref('bronze__contract_reads') }}
{# Set up dbt configuration #}
{{ config (
materialized = 'incremental',
unique_key = 'contract_reads_complete_id',
incremental_predicates = ['dynamic_range', 'partition_key'],
full_refresh = vars.GLOBAL_STREAMLINE_FR_ENABLED,
tags = ['streamline','contract_reads','complete','phase_4']
) }}
SELECT
partition_key,
contract_address,
VALUE :"ADDRESS" :: STRING AS address,
VALUE :"BLOCK_NUMBER" :: NUMBER AS block_number,
(
VALUE :"BLOCK_DATE_UNIX" :: TIMESTAMP
) :: DATE AS block_date,
VALUE :"FUNCTION_NAME" :: STRING AS function_name,
VALUE :"FUNCTION_SIG" :: STRING AS function_sig,
VALUE :"INPUT" :: STRING AS input,
PARSE_JSON(
VALUE :"METADATA_STR" :: STRING
) :: variant AS metadata,
VALUE :"PROTOCOL" :: STRING AS protocol,
VALUE :"VERSION" :: STRING AS version,
VALUE :"PLATFORM" :: STRING AS platform,
VALUE :"TYPE" :: STRING AS type,
file_name,
{{ dbt_utils.generate_surrogate_key(
['contract_address', 'address', 'block_number', 'function_name', 'function_sig', 'input', 'platform']
) }} AS contract_reads_complete_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
_inserted_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
{% if is_incremental() %}
{{ ref('bronze__contract_reads') }}
WHERE
_inserted_timestamp >= (
SELECT
COALESCE (MAX(_inserted_timestamp), '1970-01-01' :: TIMESTAMP)
FROM
{{ this }})
AND platform IS NOT NULL
{% else %}
{{ ref('bronze__contract_reads_fr') }}
WHERE platform IS NOT NULL
{% endif %}
qualify(ROW_NUMBER() over (PARTITION BY contract_reads_complete_id
ORDER BY
_inserted_timestamp DESC)) = 1

View File

@ -0,0 +1,115 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{# Set up dbt configuration #}
{{ config (
materialized = "table",
tags = ['streamline','contract_reads','history','phase_4']
) }}
WITH last_x_days AS (
SELECT
block_number,
block_date
FROM
{{ ref("_max_block_by_date") }}
WHERE block_date >= ('{{ vars.CURATED_SL_CONTRACT_READS_START_DATE }}' :: TIMESTAMP) :: DATE
),
to_do AS (
SELECT
DISTINCT
d.block_number,
d.block_date,
t.contract_address,
t.address,
t.function_name,
t.function_sig,
t.input,
t.metadata,
t.protocol,
t.version,
t.platform,
t.type
FROM
{{ ref("streamline__contract_reads_records") }} t
CROSS JOIN last_x_days d
WHERE type = 'daily'
EXCEPT
SELECT
block_number,
block_date,
contract_address,
address,
function_name,
function_sig,
input,
metadata,
protocol,
version,
platform,
type
FROM
{{ ref("streamline__contract_reads_complete") }}
WHERE
block_date IS NOT NULL
)
SELECT
block_number,
DATE_PART('EPOCH_SECONDS', block_date) :: INT AS block_date_unix,
contract_address,
address,
function_name,
function_sig,
input,
metadata :: STRING AS metadata_str,
protocol,
version,
platform,
type,
ROUND(
block_number,
-3
) AS partition_key,
OBJECT_CONSTRUCT(
'data', OBJECT_CONSTRUCT(
'id', CONCAT(
contract_address,
'-',
COALESCE(address,'null'),
'-',
input,
'-',
block_number
),
'jsonrpc', '2.0',
'method', 'eth_call',
'params', ARRAY_CONSTRUCT(
OBJECT_CONSTRUCT(
'to', contract_address,
'data', input
),
utils.udf_int_to_hex(block_number)
)
),
'headers', OBJECT_CONSTRUCT(
'Content-Type', 'application/json',
'x-fsc-livequery', 'true'
),
'method', 'POST',
'secret_name',
{% if vars.GLOBAL_ALT_NODE_ENABLED %}
'{{ vars.GLOBAL_ALT_NODE_VAULT_PATH }}'
{% else %}
'{{ vars.GLOBAL_NODE_VAULT_PATH }}'
{% endif %},
'url', '{{ vars.GLOBAL_NODE_URL }}'
) AS request
FROM
to_do
ORDER BY partition_key DESC, block_number DESC
LIMIT {{ vars.CURATED_SL_CONTRACT_READS_HISTORY_SQL_LIMIT }}

View File

@ -0,0 +1,39 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{# Set up dbt configuration #}
{{ config (
materialized = "view",
tags = ['streamline','contract_reads','history','phase_4']
) }}
SELECT
*
FROM
{{ ref('streamline__contract_reads_daily_history_requests') }}
{# Streamline Function Call #}
{% if execute %}
{% set params = {
"external_table": 'contract_reads',
"sql_limit": vars.CURATED_SL_CONTRACT_READS_HISTORY_SQL_LIMIT,
"producer_batch_size": vars.CURATED_SL_CONTRACT_READS_HISTORY_PRODUCER_BATCH_SIZE,
"worker_batch_size": vars.CURATED_SL_CONTRACT_READS_HISTORY_WORKER_BATCH_SIZE,
"async_concurrent_requests": vars.CURATED_SL_CONTRACT_READS_HISTORY_ASYNC_CONCURRENT_REQUESTS,
"sql_source": 'contract_reads_history'
} %}
{% set function_call_sql %}
{{ fsc_utils.if_data_call_function_v2(
func = 'streamline.udf_bulk_rest_api_v2',
target = this.schema ~ "." ~ this.identifier,
params = params
) }}
{% endset %}
{% do run_query(function_call_sql) %}
{{ log("Streamline function call: " ~ function_call_sql, info=true) }}
{% endif %}

View File

@ -0,0 +1,124 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{# Set up dbt configuration #}
{{ config (
materialized = "table",
tags = ['streamline','contract_reads','realtime','phase_4']
) }}
WITH last_x_days AS (
SELECT
block_number,
block_date
FROM
{{ ref("_max_block_by_date") }}
WHERE block_date >= DATEADD('day',-4,SYSDATE()) --last 3 max block_number by date
),
to_do AS (
SELECT
DISTINCT
d.block_number,
d.block_date,
t.contract_address,
t.address,
t.function_name,
t.function_sig,
t.input,
t.metadata,
t.protocol,
t.version,
t.platform,
t.type
FROM
{{ ref("streamline__contract_reads_records") }} t
CROSS JOIN last_x_days d
WHERE type = 'daily'
EXCEPT
SELECT
block_number,
block_date,
contract_address,
address,
function_name,
function_sig,
input,
metadata,
protocol,
version,
platform,
type
FROM
{{ ref("streamline__contract_reads_complete") }}
WHERE
block_date >= (
SELECT MIN(block_date)
FROM last_x_days
)
AND block_date IS NOT NULL
AND _inserted_timestamp :: DATE >= DATEADD(
'day',
-7,
SYSDATE()
)
)
SELECT
block_number,
DATE_PART('EPOCH_SECONDS', block_date) :: INT AS block_date_unix,
contract_address,
address,
function_name,
function_sig,
input,
metadata :: STRING AS metadata_str,
protocol,
version,
platform,
type,
ROUND(
block_number,
-3
) AS partition_key,
OBJECT_CONSTRUCT(
'data', OBJECT_CONSTRUCT(
'id', CONCAT(
contract_address,
'-',
COALESCE(address,'null'),
'-',
input,
'-',
block_number
),
'jsonrpc', '2.0',
'method', 'eth_call',
'params', ARRAY_CONSTRUCT(
OBJECT_CONSTRUCT(
'to', contract_address,
'data', input
),
utils.udf_int_to_hex(block_number)
)
),
'headers', OBJECT_CONSTRUCT(
'Content-Type', 'application/json',
'x-fsc-livequery', 'true'
),
'method', 'POST',
'secret_name',
{% if vars.GLOBAL_ALT_NODE_ENABLED %}
'{{ vars.GLOBAL_ALT_NODE_VAULT_PATH }}'
{% else %}
'{{ vars.GLOBAL_NODE_VAULT_PATH }}'
{% endif %},
'url', '{{ vars.GLOBAL_NODE_URL }}'
) AS request
FROM
to_do
ORDER BY partition_key DESC, block_number DESC
LIMIT {{ vars.CURATED_SL_CONTRACT_READS_REALTIME_SQL_LIMIT }}

View File

@ -0,0 +1,39 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{# Set up dbt configuration #}
{{ config (
materialized = "view",
tags = ['streamline','contract_reads','realtime','phase_4']
) }}
SELECT
*
FROM
{{ ref('streamline__contract_reads_daily_realtime_requests') }}
{# Streamline Function Call #}
{% if execute %}
{% set params = {
"external_table": 'contract_reads',
"sql_limit": vars.CURATED_SL_CONTRACT_READS_REALTIME_SQL_LIMIT,
"producer_batch_size": vars.CURATED_SL_CONTRACT_READS_REALTIME_PRODUCER_BATCH_SIZE,
"worker_batch_size": vars.CURATED_SL_CONTRACT_READS_REALTIME_WORKER_BATCH_SIZE,
"async_concurrent_requests": vars.CURATED_SL_CONTRACT_READS_REALTIME_ASYNC_CONCURRENT_REQUESTS,
"sql_source": 'contract_reads_realtime'
} %}
{% set function_call_sql %}
{{ fsc_utils.if_data_call_function_v2(
func = 'streamline.udf_bulk_rest_api_v2',
target = this.schema ~ "." ~ this.identifier,
params = params
) }}
{% endset %}
{% do run_query(function_call_sql) %}
{{ log("Streamline function call: " ~ function_call_sql, info=true) }}
{% endif %}

View File

@ -0,0 +1,111 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
-- depends_on: {{ ref('silver_lending__aave_ethereum_tokens') }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'aave_v1_reads_id',
tags = ['silver','contract_reads']
) }}
WITH all_tokens AS (
SELECT
underlying_address AS contract_address,
protocol,
version,
CONCAT(
protocol,
'-',
version
) AS platform
FROM
{{ ref('silver_lending__aave_tokens') }}
WHERE
version = 'v1'
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
{% if vars.GLOBAL_PROJECT_NAME == 'ethereum' %}
UNION
SELECT
underlying_address AS contract_address,
protocol,
version,
CONCAT(
protocol,
'-',
version
) AS platform
FROM
{{ ref('silver_lending__aave_ethereum_tokens') }}
--relevant for ethereum only
WHERE
version = 'v1'
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
{% endif %}
),
lending_pools AS (
SELECT
contract_address,
CASE
WHEN '{{ vars.GLOBAL_PROJECT_NAME }}' = 'ethereum' THEN '0x3dfd23a6c5e8bbcfc9581d2e864a68feb6a076d3'
END AS address,
--Aave: LendingPoolCore
protocol,
version,
platform
FROM
all_tokens
UNION ALL
SELECT
contract_address,
CASE
WHEN '{{ vars.GLOBAL_PROJECT_NAME }}' = 'ethereum' THEN '0x1012cff81a1582ddd0616517efb97d02c5c17e25'
END AS address,
--Uniswap: LendingPoolCore in Aave v1 holds Uniswap v1 LP tokens as collateral
protocol,
version,
platform
FROM
all_tokens
)
SELECT
contract_address,
address,
'balanceOf' AS function_name,
'0x70a08231' AS function_sig,
CONCAT(
'0x70a08231',
LPAD(SUBSTR(address, 3), 64, '0')
) AS input,
NULL :: VARIANT AS metadata,
protocol,
version,
platform,
{{ dbt_utils.generate_surrogate_key(
['contract_address','address','input','platform']
) }} AS aave_v1_reads_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
lending_pools

View File

@ -0,0 +1,99 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
-- depends_on: {{ ref('silver_lending__aave_ethereum_tokens') }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'aave_v2_reads_id',
tags = ['silver','contract_reads']
) }}
WITH all_tokens AS (
SELECT
underlying_address AS contract_address,
atoken_address AS address,
protocol,
version,
CONCAT(
protocol,
'-',
version
) AS platform
FROM
{{ ref('silver_lending__aave_tokens') }}
WHERE
version = 'v2'
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
{% if vars.GLOBAL_PROJECT_NAME == 'ethereum' %}
UNION
SELECT
underlying_address AS contract_address,
atoken_address AS address,
protocol,
version,
CONCAT(
protocol,
'-',
version
) AS platform
FROM
{{ ref('silver_lending__aave_ethereum_tokens') }}
--relevant for ethereum only
WHERE
version IN ('v2','v2.1')
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
UNION
SELECT
'0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9' AS contract_address, --AAVE
'0x4da27a545c0c5b758a6ba100e3a049001de870f5' AS address, --stkAAVE (Staking)
'aave' AS protocol,
'v2' AS version,
CONCAT(
protocol,
'-',
version
) AS platform
{% endif %}
)
SELECT
contract_address,
address,
'balanceOf' AS function_name,
'0x70a08231' AS function_sig,
CONCAT(
'0x70a08231',
LPAD(SUBSTR(address, 3), 64, '0')
) AS input,
NULL :: variant AS metadata,
protocol,
version,
platform,
{{ dbt_utils.generate_surrogate_key(
['contract_address','address','input','platform']
) }} AS aave_v2_reads_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
all_tokens

View File

@ -0,0 +1,62 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'aave_v3_reads_id',
tags = ['silver','contract_reads']
) }}
WITH all_tokens AS (
SELECT
atoken_address AS contract_address,
underlying_address,
protocol,
version,
CONCAT(
protocol,
'-',
version
) AS platform
FROM
{{ ref('silver_lending__aave_tokens') }}
WHERE
version = 'v3'
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
)
SELECT
contract_address,
NULL AS address,
'totalSupply' AS function_name,
'0x18160ddd' AS function_sig,
RPAD(
function_sig,
64,
'0'
) AS input,
OBJECT_CONSTRUCT(
'underlying_address',
underlying_address
) :: variant AS metadata,
protocol,
version,
platform,
{{ dbt_utils.generate_surrogate_key(
['contract_address','input','platform']
) }} AS aave_v3_reads_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
all_tokens

View File

@ -0,0 +1,54 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'aerodrome_v1_reads_id',
tags = ['silver','contract_reads']
) }}
WITH liquidity_pools AS (
SELECT
DISTINCT
pool_address AS contract_address,
token0,
token1,
protocol,
version,
platform
FROM {{ ref('silver_dex__aerodrome_pools') }}
{% if is_incremental() %}
WHERE modified_timestamp > (
SELECT MAX(modified_timestamp)
FROM {{ this }}
)
{% endif %}
)
SELECT
contract_address,
NULL AS address,
'getReserves' AS function_name,
'0x0902f1ac' AS function_sig,
RPAD(
function_sig,
64,
'0'
) AS input,
OBJECT_CONSTRUCT(
'token0', token0,
'token1', token1
) :: VARIANT AS metadata,
protocol,
version,
platform,
{{ dbt_utils.generate_surrogate_key(
['contract_address','input','platform']
) }} AS aerodrome_v1_reads_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM liquidity_pools

View File

@ -0,0 +1,46 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'binance_v1_reads_id',
tags = ['silver','contract_reads']
) }}
WITH contracts AS (
SELECT
'0xa2e3356610840701bdf5611a53974510ae27e2e1' AS contract_address --Wrapped Binance Beacon ETH (wBETH)
)
SELECT
contract_address,
NULL AS address,
'totalSupply' AS function_name,
'0x18160ddd' AS function_sig,
RPAD(
function_sig,
64,
'0'
) AS input,
NULL :: VARIANT AS metadata,
'binance' AS protocol,
'v1' AS version,
CONCAT(protocol, '-', version) AS platform,
{{ dbt_utils.generate_surrogate_key(
['contract_address','input','platform']
) }} AS binance_v1_reads_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
contracts
{% if is_incremental() %}
WHERE contract_address NOT IN (
SELECT
contract_address
FROM
{{ this }}
)
{% endif %}

View File

@ -0,0 +1,55 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'curve_reads_id',
tags = ['silver','contract_reads']
) }}
WITH liquidity_pools AS (
SELECT
DISTINCT pool_address AS address,
token_address AS contract_address,
protocol,
version,
platform
FROM
{{ ref('silver_dex__curve_pools') }}
{% if is_incremental() %}
WHERE
_inserted_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
)
SELECT
contract_address,
address,
'balanceOf' AS function_name,
'0x70a08231' AS function_sig,
CONCAT(
'0x70a08231',
LPAD(SUBSTR(address, 3), 64, '0')
) AS input,
NULL :: variant AS metadata,
protocol,
version,
platform,
{{ dbt_utils.generate_surrogate_key(
['contract_address','address','input','platform']
) }} AS curve_reads_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
liquidity_pools

View File

@ -0,0 +1,73 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'etherfi_v1_reads_id',
tags = ['silver','contract_reads']
) }}
WITH contracts AS (
SELECT
contract_address,
address,
token_address,
function_name,
function_sig,
chain,
attribution
FROM
{{ ref('silver_reads__etherfi_seed') }}
WHERE
chain = '{{ vars.GLOBAL_PROJECT_NAME }}'
{% if is_incremental() %}
AND
CONCAT(contract_address, '-', COALESCE(address, 'null')) NOT IN (
SELECT
CONCAT(contract_address, '-', COALESCE(address, 'null'))
FROM
{{ this }}
)
{% endif %}
)
SELECT
contract_address,
address,
function_name,
function_sig,
CASE
WHEN function_name = 'balanceOf' THEN CONCAT(
function_sig,
LPAD(SUBSTR(address, 3), 64, '0')
)
ELSE RPAD(
function_sig,
64,
'0'
)
END AS input,
OBJECT_CONSTRUCT(
'token_address', token_address,
'attribution', attribution,
'chain', chain
) :: variant AS metadata,
'etherfi' AS protocol,
'v1' AS version,
CONCAT(
protocol,
'-',
version
) AS platform,
{{ dbt_utils.generate_surrogate_key(
['contract_address','address','input','platform']
) }} AS etherfi_v1_reads_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
contracts

View File

@ -0,0 +1,60 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'lido_reads_id',
tags = ['silver','contract_reads']
) }}
WITH pooled_assets AS (
SELECT
'0xae7ab96520de3a18e5e111b5eaab095312d7fe84' AS contract_address,
'getTotalPooledEther' AS function_name,
'0x37cfdaca' AS function_sig,
RPAD(
function_sig,
64,
'0'
) AS input
UNION ALL
SELECT
'0x9ee91f9f426fa633d227f7a9b000e28b9dfd8599' AS contract_address,
'getTotalPooledMatic' AS function_name,
'0xe00222a0' AS function_sig,
RPAD(
function_sig,
64,
'0'
) AS input
)
SELECT
contract_address,
NULL AS address,
function_name,
function_sig,
input,
NULL :: VARIANT AS metadata,
'lido' AS protocol,
'v1' AS version,
CONCAT(protocol, '-', version) AS platform,
{{ dbt_utils.generate_surrogate_key(
['contract_address','input','platform']
) }} AS lido_reads_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM pooled_assets
{% if is_incremental() %}
WHERE contract_address NOT IN (
SELECT
contract_address
FROM
{{ this }}
)
{% endif %}

View File

@ -0,0 +1,50 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'polymarket_v1_reads_id',
tags = ['silver','contract_reads']
) }}
WITH contracts AS (
SELECT
'0x2791bca1f2de4661ed88a30c99a7a9449aa84174' AS contract_address, --USDC
'0x4d97dcd97ec945f40cf65f87097ace5ea0476045' AS address --Conditional Tokens
UNION ALL
SELECT
'0x2791bca1f2de4661ed88a30c99a7a9449aa84174' AS contract_address, --USDC
'0x3a3bd7bb9528e159577f7c2e685cc81a765002e2' AS address --Collateral Tokens
)
SELECT
contract_address,
address,
'balanceOf' AS function_name,
'0x70a08231' AS function_sig,
CONCAT(
'0x70a08231',
LPAD(SUBSTR(address, 3), 64, '0')
) AS input,
NULL :: VARIANT AS metadata,
'polymarket' AS protocol,
'v1' AS version,
CONCAT(protocol, '-', version) AS platform,
{{ dbt_utils.generate_surrogate_key(
['contract_address','address','input','platform']
) }} AS polymarket_v1_reads_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
contracts
{% if is_incremental() %}
WHERE CONCAT(contract_address, '-', address) NOT IN (
SELECT
CONCAT(contract_address, '-', address)
FROM
{{ this }}
)
{% endif %}

View File

@ -0,0 +1,63 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
-- depends_on: {{ ref('price__ez_asset_metadata') }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'stablecoins_reads_id',
post_hook = '{{ unverify_stablecoins() }}',
tags = ['silver','contract_reads','heal']
) }}
WITH verified_stablecoins AS (
SELECT
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
is_verified
AND contract_address IS NOT NULL
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
)
SELECT
contract_address,
NULL AS address,
'totalSupply' AS function_name,
'0x18160ddd' AS function_sig,
RPAD(
function_sig,
64,
'0'
) AS input,
metadata,
'stablecoins' AS protocol,
'v1' AS version,
CONCAT(protocol,'-',version) AS platform,
{{ dbt_utils.generate_surrogate_key(
['contract_address','input','platform']
) }} AS stablecoins_reads_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
verified_stablecoins

View File

@ -0,0 +1,88 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
-- depends_on: {{ ref('price__ez_asset_metadata') }}
-- depends_on: {{ ref('silver_reads__lido_v1_reads') }}
-- depends_on: {{ ref('silver_reads__binance_v1_reads') }}
-- depends_on: {{ ref('silver_reads__polymarket_v1_reads') }}
{{ config (
materialized = "incremental",
unique_key = "contract_reads_records_id",
full_refresh = vars.GLOBAL_STREAMLINE_FR_ENABLED,
post_hook = '{{ unverify_contract_reads() }}',
tags = ['streamline','contract_reads','records','heal','phase_4']
) }}
-- only specify chains/exclusions for _reads models with hardcoded or seed driven address data
-- for dynamic models, the underlying upstream data will already be filtered or made relevant for that chain
{% set models = [] %}
{% if vars.GLOBAL_PROJECT_NAME == 'ethereum' %}
{% set _ = models.append((ref('silver_reads__lido_v1_reads'), 'daily')) %}
{% set _ = models.append((ref('silver_reads__binance_v1_reads'), 'daily')) %}
{% endif %}
{% if vars.GLOBAL_PROJECT_NAME == 'polygon' %}
{% set _ = models.append((ref('silver_reads__polymarket_v1_reads'), 'daily')) %}
{% endif %}
{% set _ = models.append((ref('silver_reads__aerodrome_v1_reads'), 'daily')) %}
{% set _ = models.append((ref('silver_reads__superchain_slipstream_v1_reads'), 'daily')) %}
{% set _ = models.append((ref('silver_reads__stablecoins_reads'), 'daily')) %}
{% set _ = models.append((ref('silver_reads__uniswap_v2_reads'), 'daily')) %}
{% set _ = models.append((ref('silver_reads__uniswap_v3_reads'), 'daily')) %}
{% set _ = models.append((ref('silver_reads__uniswap_v4_reads'), 'daily')) %}
{% set _ = models.append((ref('silver_reads__aave_v1_reads'), 'daily')) %}
{% set _ = models.append((ref('silver_reads__aave_v2_reads'), 'daily')) %}
{% set _ = models.append((ref('silver_reads__aave_v3_reads'), 'daily')) %}
{% set _ = models.append((ref('silver_reads__curve_v1_reads'), 'daily')) %}
{% set _ = models.append((ref('silver_reads__tornado_cash_v1_reads'), 'daily')) %}
{% set _ = models.append((ref('silver_reads__etherfi_v1_reads'), 'daily')) %}
WITH all_records AS (
{% for model, type in models %}
SELECT
contract_address,
address,
function_name,
function_sig,
input,
metadata,
protocol,
version,
platform,
'{{ type }}' AS type
FROM {{ model }}
{% if not loop.last %}
{% if is_incremental() %}
WHERE modified_timestamp > (
SELECT MAX(modified_timestamp)
FROM {{ this }}
)
{% endif %}
UNION ALL
{% endif %}
{% endfor %}
)
SELECT
contract_address,
address,
function_name,
function_sig,
input,
metadata,
protocol,
version,
platform,
type,
{{ dbt_utils.generate_surrogate_key(
['contract_address','address','input','platform']
) }} AS contract_reads_records_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
all_records qualify (ROW_NUMBER() over (PARTITION BY contract_reads_records_id
ORDER BY
modified_timestamp DESC)) = 1

View File

@ -0,0 +1,80 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'superchain_slipstream_v1_reads_id',
tags = ['silver','contract_reads']
) }}
WITH blacklisted_tokens AS (
SELECT LOWER('0xdbfefd2e8460a6ee4955a68582f85708baea60a3') AS token_address -- superOETHb: excluded to avoid double-counting with Origin Protocol TVL (Aerodrome AMO position)
),
liquidity_pools AS (
SELECT
DISTINCT
pool_address,
token0_address AS token0,
token1_address AS token1,
protocol,
version,
platform
FROM {{ ref('silver_dex__superchain_slipstream_pools') }}
WHERE token0 NOT IN (SELECT token_address FROM blacklisted_tokens)
AND token1 NOT IN (SELECT token_address FROM blacklisted_tokens)
{% if is_incremental() %}
AND modified_timestamp > (
SELECT MAX(modified_timestamp)
FROM {{ this }}
)
{% endif %}
),
lp_balances AS (
SELECT
token0 AS contract_address,
pool_address AS address,
token0,
token1,
protocol,
version,
platform
FROM liquidity_pools
UNION
SELECT
token1 AS contract_address,
pool_address AS address,
token0,
token1,
protocol,
version,
platform
FROM liquidity_pools
)
SELECT
contract_address,
address,
'balanceOf' AS function_name,
'0x70a08231' AS function_sig,
CONCAT(
'0x70a08231',
LPAD(SUBSTR(address, 3), 64, '0')
) AS input,
OBJECT_CONSTRUCT(
'token0', token0,
'token1', token1
) :: VARIANT AS metadata,
protocol,
version,
platform,
{{ dbt_utils.generate_surrogate_key(
['contract_address','input','platform']
) }} AS superchain_slipstream_v1_reads_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM lp_balances

View File

@ -0,0 +1,58 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'tornado_cash_reads_id',
tags = ['silver','contract_reads']
) }}
WITH mixers AS (
SELECT
token_address AS contract_address,
mixer_address AS address
FROM
{{ ref('silver_reads__tornado_cash_mixer_seed') }}
WHERE
chain = '{{ vars.GLOBAL_PROJECT_NAME }}'
AND contract_address IS NOT NULL --balanceOf calls only apply to erc20 token-mixer pairs. eth_getBalance calls to be handled downstream for null-mixer pairs.
{% if is_incremental() %}
AND CONCAT(COALESCE(contract_address, 'null'), '-', address) NOT IN (
SELECT
CONCAT(COALESCE(contract_address, 'null'), '-', address)
FROM
{{ this }}
)
{% endif %}
)
SELECT
contract_address,
address,
'balanceOf' AS function_name,
'0x70a08231' AS function_sig,
CONCAT(
'0x70a08231',
LPAD(SUBSTR(address, 3), 64, '0')
) AS input,
NULL :: variant AS metadata,
'tornado_cash' AS protocol,
'v1' AS version,
CONCAT(
protocol,
'-',
version
) AS platform,
{{ dbt_utils.generate_surrogate_key(
['contract_address','address','input','platform']
) }} AS tornado_cash_reads_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
mixers

View File

@ -0,0 +1,68 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'uniswap_v2_reads_id',
post_hook = '{{ unverify_contract_reads() }}',
tags = ['silver','contract_reads','heal']
) }}
WITH verified_contracts AS (
SELECT
DISTINCT token_address
FROM
{{ ref('price__ez_asset_metadata') }}
WHERE
is_verified
AND token_address IS NOT NULL
),
liquidity_pools AS (
SELECT
DISTINCT
pool_address AS contract_address,
token0,
token1,
protocol,
version,
platform
FROM {{ ref('silver_dex__paircreated_evt_v2_pools') }}
WHERE token0 IN (SELECT token_address FROM verified_contracts)
AND token1 IN (SELECT token_address FROM verified_contracts)
{% if is_incremental() %}
AND (
modified_timestamp > (SELECT MAX(modified_timestamp) FROM {{ this }})
OR pool_address NOT IN (SELECT contract_address FROM {{ this }})
-- pull in pools with newly verified tokens
)
{% endif %}
)
SELECT
contract_address,
NULL AS address,
'getReserves' AS function_name,
'0x0902f1ac' AS function_sig,
RPAD(
function_sig,
64,
'0'
) AS input,
OBJECT_CONSTRUCT(
'token0', token0,
'token1', token1,
'verified_check_enabled','true'
) :: VARIANT AS metadata,
protocol,
version,
platform,
{{ dbt_utils.generate_surrogate_key(
['contract_address','input','platform']
) }} AS uniswap_v2_reads_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM liquidity_pools

View File

@ -0,0 +1,89 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'uniswap_v3_reads_id',
post_hook = '{{ unverify_contract_reads() }}',
tags = ['silver','contract_reads','heal']
) }}
WITH verified_contracts AS (
SELECT
DISTINCT token_address
FROM
{{ ref('price__ez_asset_metadata') }}
WHERE
is_verified
AND token_address IS NOT NULL
),
liquidity_pools AS (
SELECT
DISTINCT
pool_address,
token0_address AS token0,
token1_address AS token1,
protocol,
version,
platform
FROM {{ ref('silver_dex__poolcreated_evt_v3_pools') }}
WHERE token0 IN (SELECT token_address FROM verified_contracts)
AND token1 IN (SELECT token_address FROM verified_contracts)
{% if is_incremental() %}
AND (
modified_timestamp > (SELECT MAX(modified_timestamp) FROM {{ this }})
OR pool_address NOT IN (SELECT contract_address FROM {{ this }})
-- pull in pools with newly verified tokens
)
{% endif %}
),
lp_balances AS (
SELECT
token0 AS contract_address,
pool_address AS address,
token0,
token1,
protocol,
version,
platform
FROM liquidity_pools
UNION
SELECT
token1 AS contract_address,
pool_address AS address,
token0,
token1,
protocol,
version,
platform
FROM liquidity_pools
)
SELECT
contract_address,
address,
'balanceOf' AS function_name,
'0x70a08231' AS function_sig,
CONCAT(
'0x70a08231',
LPAD(SUBSTR(address, 3), 64, '0')
) AS input,
OBJECT_CONSTRUCT(
'token0', token0,
'token1', token1,
'verified_check_enabled','true'
) :: VARIANT AS metadata,
protocol,
version,
platform,
{{ dbt_utils.generate_surrogate_key(
['contract_address','input','platform']
) }} AS uniswap_v3_reads_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM lp_balances

View File

@ -0,0 +1,148 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'uniswap_v4_reads_id',
post_hook = '{{ unverify_contract_reads() }}',
tags = ['silver','contract_reads','heal']
) }}
WITH verified_contracts AS (
SELECT
DISTINCT token_address
FROM
{{ ref('price__ez_asset_metadata') }}
WHERE
is_verified
AND token_address IS NOT NULL
),
liquidity_pools AS (
SELECT
token0,
token1,
pool_address AS factory_address,
hook_address,
protocol,
version,
platform
FROM
{{ ref('silver_dex__uniswap_v4_pools') }}
WHERE token0 IN (SELECT token_address FROM verified_contracts)
AND token1 IN (SELECT token_address FROM verified_contracts)
{% if is_incremental() %}
AND (
modified_timestamp > (SELECT MAX(modified_timestamp) FROM {{ this }})
OR CONCAT(token0,'-',token1) NOT IN (
SELECT CONCAT(metadata:token0::STRING,'-',metadata:token1::STRING)
FROM {{ this }}
)
-- pull in pools with newly verified tokens
)
{% endif %}
),
all_balances AS (
SELECT
token0 AS contract_address,
factory_address AS address,
token0,
token1,
hook_address,
'factory' AS address_type,
protocol,
version,
platform
FROM
liquidity_pools
WHERE
token0 IS NOT NULL
AND token0 <> '0x0000000000000000000000000000000000000000' -- Represents native asset. balanceOf calls only apply to erc20 tokens. eth_getBalance calls to be handled downstream for null/native assets.
UNION
SELECT
token1 AS contract_address,
factory_address AS address,
token0,
token1,
hook_address,
'factory' AS address_type,
protocol,
version,
platform
FROM
liquidity_pools
WHERE
token1 IS NOT NULL
AND token1 <> '0x0000000000000000000000000000000000000000'
UNION
SELECT
token0 AS contract_address,
hook_address AS address,
token0,
token1,
hook_address,
'hook' AS address_type,
protocol,
version,
platform
FROM
liquidity_pools
WHERE
hook_address IS NOT NULL
AND hook_address <> '0x0000000000000000000000000000000000000000'
AND token0 IS NOT NULL
AND token0 <> '0x0000000000000000000000000000000000000000'
UNION
SELECT
token1 AS contract_address,
hook_address AS address,
token0,
token1,
hook_address,
'hook' AS address_type,
protocol,
version,
platform
FROM
liquidity_pools
WHERE
hook_address IS NOT NULL
AND hook_address <> '0x0000000000000000000000000000000000000000'
AND token1 IS NOT NULL
AND token1 <> '0x0000000000000000000000000000000000000000'
)
SELECT
contract_address,
address,
'balanceOf' AS function_name,
'0x70a08231' AS function_sig,
CONCAT(
'0x70a08231',
LPAD(SUBSTR(address, 3), 64, '0')
) AS input,
object_construct_keep_null(
'token0',
token0,
'token1',
token1,
'hook_address',
hook_address,
'address_type',
address_type,
'verified_check_enabled','true'
) :: variant AS metadata,
protocol,
version,
platform,
{{ dbt_utils.generate_surrogate_key(
['contract_address','input','platform']
) }} AS uniswap_v4_reads_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
all_balances

View File

@ -90,7 +90,7 @@ poolcreated_evt_v3 AS (
FROM
{{ ref('silver_dex__poolcreated_evt_v3_pool_actions') }}
{% if is_incremental() and 'poolcreated_evt_v3' not in vars.curated_fr_models %}
{% if is_incremental() and 'poolcreated_evt_v3' not in vars.CURATED_FR_MODELS %}
WHERE
_inserted_timestamp >= (
SELECT
@ -136,7 +136,7 @@ paircreated_evt_v2 AS (
FROM
{{ ref('silver_dex__paircreated_evt_v2_pool_actions') }}
{% if is_incremental() and 'paircreated_evt_v2' not in vars.curated_fr_models %}
{% if is_incremental() and 'paircreated_evt_v2' not in vars.CURATED_FR_MODELS %}
WHERE
_inserted_timestamp >= (
SELECT
@ -182,7 +182,7 @@ aerodrome AS (
FROM
{{ ref('silver_dex__aerodrome_pool_actions') }}
{% if is_incremental() and 'aerodrome' not in vars.curated_fr_models %}
{% if is_incremental() and 'aerodrome' not in vars.CURATED_FR_MODELS %}
WHERE
_inserted_timestamp >= (
SELECT
@ -228,7 +228,7 @@ pharaoh_v1 AS (
FROM
{{ ref('silver_dex__pharaoh_v1_pool_actions') }}
{% if is_incremental() and 'pharaoh_v1' not in vars.curated_fr_models %}
{% if is_incremental() and 'pharaoh_v1' not in vars.CURATED_FR_MODELS %}
WHERE
_inserted_timestamp >= (
SELECT
@ -274,7 +274,7 @@ kyberswap_v1_dynamic AS (
FROM
{{ ref('silver_dex__kyberswap_v1_dynamic_pool_actions') }}
{% if is_incremental() and 'kyberswap_v1_dynamic' not in vars.curated_fr_models %}
{% if is_incremental() and 'kyberswap_v1_dynamic' not in vars.CURATED_FR_MODELS %}
WHERE
_inserted_timestamp >= (
SELECT
@ -320,7 +320,7 @@ kyberswap_v2_elastic AS (
FROM
{{ ref('silver_dex__kyberswap_v2_elastic_pool_actions') }}
{% if is_incremental() and 'kyberswap_v2_elastic' not in vars.curated_fr_models %}
{% if is_incremental() and 'kyberswap_v2_elastic' not in vars.CURATED_FR_MODELS %}
WHERE
_inserted_timestamp >= (
SELECT
@ -366,7 +366,7 @@ dodo_v1 AS (
FROM
{{ ref('silver_dex__dodo_v1_pool_actions') }}
{% if is_incremental() and 'dodo_v1' not in vars.curated_fr_models %}
{% if is_incremental() and 'dodo_v1' not in vars.CURATED_FR_MODELS %}
WHERE
_inserted_timestamp >= (
SELECT
@ -412,7 +412,7 @@ pancakeswap_v3 AS (
FROM
{{ ref('silver_dex__pancakeswap_v3_pool_actions') }}
{% if is_incremental() and 'pancakeswap_v3' not in vars.curated_fr_models %}
{% if is_incremental() and 'pancakeswap_v3' not in vars.CURATED_FR_MODELS %}
WHERE
_inserted_timestamp >= (
SELECT
@ -458,7 +458,7 @@ camelot_v2 AS (
FROM
{{ ref('silver_dex__camelot_v2_pool_actions') }}
{% if is_incremental() and 'camelot_v2' not in vars.curated_fr_models %}
{% if is_incremental() and 'camelot_v2' not in vars.CURATED_FR_MODELS %}
WHERE
_inserted_timestamp >= (
SELECT
@ -504,7 +504,7 @@ quickswap_v2 AS (
FROM
{{ ref('silver_dex__quickswap_v2_pool_actions') }}
{% if is_incremental() and 'quickswap_v2' not in vars.curated_fr_models %}
{% if is_incremental() and 'quickswap_v2' not in vars.CURATED_FR_MODELS %}
WHERE
_inserted_timestamp >= (
SELECT
@ -551,7 +551,7 @@ quickswap_v4 AS (
FROM
{{ ref('silver_dex__quickswap_v4_pool_actions') }}
{% if is_incremental() and 'quickswap_v4' not in vars.curated_fr_models %}
{% if is_incremental() and 'quickswap_v4' not in vars.CURATED_FR_MODELS %}
WHERE
_inserted_timestamp >= (
SELECT
@ -598,7 +598,7 @@ dackie AS (
FROM
{{ ref('silver_dex__dackie_pool_actions') }}
{% if is_incremental() and 'dackie' not in vars.curated_fr_models %}
{% if is_incremental() and 'dackie' not in vars.CURATED_FR_MODELS %}
WHERE
_inserted_timestamp >= (
SELECT
@ -644,7 +644,7 @@ superchain_slipstream AS (
FROM
{{ ref('silver_dex__superchain_slipstream_pool_actions') }}
{% if is_incremental() and 'superchain_slipstream' not in vars.curated_fr_models %}
{% if is_incremental() and 'superchain_slipstream' not in vars.CURATED_FR_MODELS %}
WHERE
_inserted_timestamp >= (
SELECT
@ -690,7 +690,7 @@ sushiswap AS (
FROM
{{ ref('silver_dex__sushiswap_pool_actions') }}
{% if is_incremental() and 'sushiswap' not in vars.curated_fr_models %}
{% if is_incremental() and 'sushiswap' not in vars.CURATED_FR_MODELS %}
WHERE
_inserted_timestamp >= (
SELECT
@ -736,7 +736,7 @@ trader_joe_v2 AS (
FROM
{{ ref('silver_dex__trader_joe_v2_pool_actions') }}
{% if is_incremental() and 'trader_joe_v2' not in vars.curated_fr_models %}
{% if is_incremental() and 'trader_joe_v2' not in vars.CURATED_FR_MODELS %}
WHERE
_inserted_timestamp >= (
SELECT
@ -782,7 +782,53 @@ zyberswap_v2 AS (
FROM
{{ ref('silver_dex__zyberswap_v2_pool_actions') }}
{% if is_incremental() and 'zyberswap_v2' not in vars.curated_fr_models %}
{% if is_incremental() and 'zyberswap_v2' not in vars.CURATED_FR_MODELS %}
WHERE
_inserted_timestamp >= (
SELECT
MAX(_inserted_timestamp) - INTERVAL '{{ vars.CURATED_COMPLETE_LOOKBACK_HOURS }}'
FROM
{{ this }}
)
{% endif %}
),
uniswap_v1 AS (
SELECT
block_number,
block_timestamp,
tx_hash,
event_index,
event_name,
liquidity_provider,
sender,
receiver,
pool_address,
token0,
token1,
NULL AS token2,
NULL AS token3,
NULL AS token4,
NULL AS token5,
NULL AS token6,
NULL AS token7,
amount0_unadj,
amount1_unadj,
NULL AS amount2_unadj,
NULL AS amount3_unadj,
NULL AS amount4_unadj,
NULL AS amount5_unadj,
NULL AS amount6_unadj,
NULL AS amount7_unadj,
platform,
protocol,
version,
TYPE,
_log_id AS _id,
modified_timestamp AS _inserted_timestamp
FROM
{{ ref('silver_dex__uniswap_v1_pool_actions') }}
{% if is_incremental() and 'uniswap_v1' not in vars.CURATED_FR_MODELS %}
WHERE
_inserted_timestamp >= (
SELECT
@ -828,7 +874,7 @@ velodrome_v1 AS (
FROM
{{ ref('silver_dex__velodrome_v1_pool_actions') }}
{% if is_incremental() and 'velodrome_v1' not in vars.curated_fr_models %}
{% if is_incremental() and 'velodrome_v1' not in vars.CURATED_FR_MODELS %}
WHERE
_inserted_timestamp >= (
SELECT
@ -874,7 +920,7 @@ velodrome_v2 AS (
FROM
{{ ref('silver_dex__velodrome_v2_pool_actions') }}
{% if is_incremental() and 'velodrome_v2' not in vars.curated_fr_models %}
{% if is_incremental() and 'velodrome_v2' not in vars.CURATED_FR_MODELS %}
WHERE
_inserted_timestamp >= (
SELECT
@ -920,7 +966,7 @@ balancer AS (
FROM
{{ ref('silver_dex__balancer_pool_actions') }}
{% if is_incremental() and 'balancer' not in vars.curated_fr_models %}
{% if is_incremental() and 'balancer' not in vars.CURATED_FR_MODELS %}
WHERE
_inserted_timestamp >= (
SELECT
@ -966,7 +1012,7 @@ curve AS (
FROM
{{ ref('silver_dex__curve_pool_actions') }}
{% if is_incremental() and 'curve' not in vars.curated_fr_models %}
{% if is_incremental() and 'curve' not in vars.CURATED_FR_MODELS %}
WHERE
_inserted_timestamp >= (
SELECT
@ -1067,6 +1113,11 @@ all_pools AS (
FROM
zyberswap_v2
UNION ALL
SELECT
*
FROM
uniswap_v1
UNION ALL
SELECT
*
FROM

View File

@ -867,6 +867,44 @@ WHERE
)
{% endif %}
),
uniswap_v1 AS (
SELECT
block_number,
block_timestamp,
tx_hash,
contract_address,
pool_address,
'0x' AS pool_id,
NULL AS pool_name,
NULL AS fee,
NULL AS tick_spacing,
token0,
token1,
NULL AS token2,
NULL AS token3,
NULL AS token4,
NULL AS token5,
NULL AS token6,
NULL AS token7,
platform,
protocol,
version,
type,
_log_id AS _id,
modified_timestamp AS _inserted_timestamp
FROM
{{ ref('silver_dex__uniswap_v1_pools') }}
{% if is_incremental() and 'uniswap_v1' not in vars.CURATED_FR_MODELS %}
WHERE
_inserted_timestamp >= (
SELECT
MAX(_inserted_timestamp) - INTERVAL '{{ vars.CURATED_COMPLETE_LOOKBACK_HOURS }}'
FROM
{{ this }}
)
{% endif %}
),
uniswap_v4 AS (
SELECT
block_number,
@ -1234,6 +1272,11 @@ all_pools AS (
FROM
pancakeswap_v3
UNION ALL
SELECT
*
FROM
uniswap_v1
UNION ALL
SELECT
*
FROM

View File

@ -1206,6 +1206,43 @@ WHERE
)
{% endif %}
),
uniswap_v1 AS (
SELECT
block_number,
block_timestamp,
tx_hash,
origin_function_signature,
origin_from_address,
origin_to_address,
contract_address,
'0x' AS pool_id,
event_name,
amount_in_unadj,
amount_out_unadj,
token_in,
token_out,
sender,
tx_to,
event_index,
platform,
protocol,
version,
type,
_log_id,
modified_timestamp AS _inserted_timestamp
FROM
{{ ref('silver_dex__uniswap_v1_swaps') }}
{% if is_incremental() and 'uniswap_v1' not in vars.CURATED_FR_MODELS %}
WHERE
_inserted_timestamp >= (
SELECT
MAX(_inserted_timestamp) - INTERVAL '{{ vars.CURATED_COMPLETE_LOOKBACK_HOURS }}'
FROM
{{ this }}
)
{% endif %}
),
uniswap_v4 AS (
SELECT
block_number,
@ -1695,6 +1732,11 @@ all_dex AS (
FROM
dackie
UNION ALL
SELECT
*
FROM
uniswap_v1
UNION ALL
SELECT
*
FROM

View File

@ -0,0 +1,110 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'block_number',
cluster_by = ['block_timestamp::DATE'],
tags = ['silver_dex','defi','dex','lp_actions','curated']
) }}
WITH evt AS (
SELECT
l.block_number,
l.block_timestamp,
l.tx_hash,
l.event_index,
origin_function_signature,
origin_from_address,
origin_to_address,
l.contract_address AS pool_address,
token0,
token1,
topic_0,
topic_1,
topic_2,
topic_3,
data,
CASE
WHEN topic_0 = '0x06239653922ac7bea6aa2b19dc486b9361821d37712eb796adfd38d81de278ca' THEN 'AddLiquidity'
ELSE 'RemoveLiquidity'
END AS event_name,
CONCAT('0x', SUBSTR(topic_1, 27, 40)) AS provider_address,
utils.udf_hex_to_int(
topic_2
) :: FLOAT AS eth_amount,
utils.udf_hex_to_int(
topic_3
) :: FLOAT AS token_amount,
provider_address AS liquidity_provider,
provider_address AS sender,
CASE
WHEN topic_0 = '0x06239653922ac7bea6aa2b19dc486b9361821d37712eb796adfd38d81de278ca' THEN pool_address
ELSE provider_address
END AS receiver,
p.protocol,
p.version,
p.type,
CONCAT(
p.protocol,
'-',
p.version
) AS platform,
CONCAT(
l.tx_hash :: STRING,
'-',
l.event_index :: STRING
) AS _log_id,
l.modified_timestamp
FROM
{{ ref('core__fact_event_logs') }}
l
INNER JOIN {{ref('silver_dex__uniswap_v1_pools')}} p
ON l.contract_address = p.pool_address
WHERE
topic_0 IN ('0x06239653922ac7bea6aa2b19dc486b9361821d37712eb796adfd38d81de278ca', --AddLiquidity
'0x0fbf06c058b90cb038a618f8c2acbf6145f8b3570fd1fa56abb8f0f3f05b36e8' --RemoveLiquidity
)
AND tx_succeeded
{% if is_incremental() %}
AND l.modified_timestamp >= (
SELECT
MAX(modified_timestamp) - INTERVAL '{{ vars.CURATED_LOOKBACK_HOURS }}'
FROM
{{ this }}
)
AND l.modified_timestamp >= SYSDATE() - INTERVAL '{{ vars.CURATED_LOOKBACK_DAYS }}'
{% endif %}
)
SELECT
block_number,
block_timestamp,
tx_hash,
event_index,
origin_function_signature,
origin_from_address,
origin_to_address,
event_name,
pool_address,
token0,
token1,
liquidity_provider,
sender,
receiver,
token_amount AS amount0_unadj,
eth_amount AS amount1_unadj,
protocol,
version,
type,
platform,
_log_id,
modified_timestamp
FROM
evt qualify(ROW_NUMBER() over (PARTITION BY _log_id
ORDER BY
modified_timestamp DESC)) = 1

View File

@ -0,0 +1,84 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'pool_address',
tags = ['silver_dex','defi','dex','curated']
) }}
WITH contract_mapping AS (
{{ curated_contract_mapping(
vars.CURATED_DEFI_DEX_SWAPS_CONTRACT_MAPPING
) }}
WHERE
version = 'v1'
),
pools AS (
SELECT
block_number,
block_timestamp,
tx_hash,
event_index,
l.contract_address,
CONCAT('0x', SUBSTR(topics [1] :: STRING, 27, 40)) AS token0, --All pools are token-ETH only, no token-token pairs
'0x0000000000000000000000000000000000000000' AS token1, --native ETH, for pricing purposes
CONCAT('0x', SUBSTR(topics [2] :: STRING, 27, 40)) AS pool_address,
m.protocol,
m.version,
m.type,
CONCAT(
m.protocol,
'-',
m.version
) AS platform,
'NewExchange' AS event_name,
CONCAT(
tx_hash :: STRING,
'-',
event_index :: STRING
) AS _log_id,
modified_timestamp
FROM
{{ ref('core__fact_event_logs') }}
l
INNER JOIN contract_mapping m
ON l.contract_address = m.contract_address
WHERE
topics [0] :: STRING = '0x9d42cb017eb05bd8944ab536a8b35bc68085931dd5f4356489801453923953f9' --NewExchange
AND tx_succeeded
{% if is_incremental() %}
AND modified_timestamp >= (
SELECT
MAX(modified_timestamp) - INTERVAL '{{ vars.CURATED_LOOKBACK_HOURS }}'
FROM
{{ this }}
)
AND modified_timestamp >= SYSDATE() - INTERVAL '{{ vars.CURATED_LOOKBACK_DAYS }}'
{% endif %}
)
SELECT
block_number,
block_timestamp,
tx_hash,
contract_address,
event_index,
event_name,
token0,
token1,
pool_address,
platform,
protocol,
version,
type,
_log_id,
modified_timestamp
FROM
pools qualify(ROW_NUMBER() over (PARTITION BY pool_address
ORDER BY
modified_timestamp DESC)) = 1

View File

@ -0,0 +1,102 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'block_number',
cluster_by = ['block_timestamp::DATE'],
tags = ['silver_dex','defi','dex','curated']
) }}
WITH swaps AS (
SELECT
l.block_number,
l.block_timestamp,
l.tx_hash,
l.event_index,
origin_function_signature,
origin_from_address,
origin_to_address,
l.contract_address,
CASE
WHEN topics [0] :: STRING = '0x7f4091b46c33e918a0f3aa42307641d17bb67029427a5369e54b353984238705' THEN 'EthPurchase'
ELSE 'TokenPurchase'
END AS event_name,
CONCAT('0x', SUBSTR(topics [1] :: STRING, 27, 40)) AS buyer_address,
utils.udf_hex_to_int(
topics [2] :: STRING
) :: FLOAT AS sold_amount,
utils.udf_hex_to_int(
topics [3] :: STRING
) :: FLOAT AS bought_amount,
CASE
WHEN topics [0] :: STRING = '0x7f4091b46c33e918a0f3aa42307641d17bb67029427a5369e54b353984238705' THEN p.token0
ELSE p.token1
END AS token_in,
CASE
WHEN topics [0] :: STRING = '0x7f4091b46c33e918a0f3aa42307641d17bb67029427a5369e54b353984238705' THEN p.token1
ELSE p.token0
END AS token_out,
p.platform,
p.protocol,
p.version,
p.type,
CONCAT(
l.tx_hash :: STRING,
'-',
l.event_index :: STRING
) AS _log_id,
l.modified_timestamp
FROM
{{ ref('core__fact_event_logs') }}
l
INNER JOIN {{ ref('silver_dex__uniswap_v1_pools') }}
p
ON p.pool_address = l.contract_address
WHERE
topics [0] :: STRING IN (
'0xcd60aa75dea3072fbc07ae6d7d856b5dc5f4eee88854f5b4abf7b680ef8bc50f',
--TokenPurchase
'0x7f4091b46c33e918a0f3aa42307641d17bb67029427a5369e54b353984238705'
) --EthPurchase
AND tx_succeeded
{% if is_incremental() %}
AND l.modified_timestamp >= (
SELECT
MAX(modified_timestamp) - INTERVAL '{{ vars.CURATED_LOOKBACK_HOURS }}'
FROM
{{ this }}
)
AND l.modified_timestamp >= SYSDATE() - INTERVAL '{{ vars.CURATED_LOOKBACK_DAYS }}'
{% endif %}
)
SELECT
block_number,
block_timestamp,
tx_hash,
event_index,
origin_function_signature,
origin_from_address,
origin_to_address,
contract_address,
buyer_address AS sender,
sender AS tx_to,
sold_amount AS amount_in_unadj,
bought_amount AS amount_out_unadj,
token_in,
token_out,
platform,
protocol,
version,
TYPE,
event_name,
_log_id,
modified_timestamp
FROM
swaps

View File

@ -8,7 +8,7 @@
materialized = 'view',
persist_docs ={ "relation": true,
"columns": true },
tags = ['gold','defi','stablecoins','heal','curated_daily']
tags = ['gold','defi','stablecoins','curated_daily']
) }}
SELECT

View File

@ -1,109 +0,0 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
-- depends_on: {{ ref('bronze__stablecoin_reads') }}
-- depends_on: {{ ref('price__ez_asset_metadata') }}
{{ config(
materialized = 'incremental',
unique_key = 'stablecoin_reads_id',
cluster_by = ['block_date'],
incremental_predicates = ["dynamic_range", "block_number"],
merge_exclude_columns = ["inserted_timestamp"],
post_hook = "{{ unverify_stablecoins() }}",
full_refresh = vars.GLOBAL_SILVER_FR_ENABLED,
tags = ['silver','defi','stablecoins','curated_daily']
) }}
WITH stablecoin_reads AS (
SELECT
VALUE :"BLOCK_NUMBER" :: NUMBER AS block_number,
(
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
{% if is_incremental() %}
{{ ref('bronze__stablecoin_reads') }}
WHERE
_inserted_timestamp >= (
SELECT
COALESCE(MAX(_inserted_timestamp), '1970-01-01')
FROM
{{ this }})
AND DATA :result :: STRING <> '0x'
{% else %}
{{ ref('bronze__stablecoin_reads_fr') }}
WHERE
DATA :result :: STRING <> '0x'
{% endif %}
qualify(ROW_NUMBER() over (PARTITION BY block_number, contract_address
ORDER BY
_inserted_timestamp DESC)) = 1
),
results AS (
SELECT
block_number,
block_date,
contract_address,
metadata,
IFF(
C.decimals IS NULL,
18,
C.decimals
) AS decimals_adj,
result_hex AS amount_hex,
IFNULL(
CASE
WHEN LENGTH(amount_hex) <= 4300
AND amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(amount_hex) AS bigint)END,
CASE
WHEN amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(RTRIM(amount_hex, '0')) AS bigint)
END
) AS amount_raw,
IFF(
decimals_adj IS NULL,
NULL,
utils.udf_decimal_adjust(
amount_raw,
decimals_adj
)
) AS amount_precise,
amount_precise :: FLOAT AS amount,
_inserted_timestamp
FROM
stablecoin_reads s
LEFT JOIN {{ ref('core__dim_contracts') }} C
ON s.contract_address = C.address
WHERE
amount_raw IS NOT NULL
)
SELECT
block_number,
block_date,
contract_address,
metadata,
decimals_adj AS decimals,
amount_hex,
amount_raw,
amount_precise,
amount,
_inserted_timestamp,
{{ dbt_utils.generate_surrogate_key(
['block_date','contract_address']
) }} AS stablecoin_reads_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
results

View File

@ -1,49 +0,0 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
-- depends on: {{ ref('bronze__stablecoin_reads') }}
{# Set up dbt configuration #}
{{ config (
materialized = 'incremental',
unique_key = 'stablecoin_reads_complete_id',
incremental_predicates = ['dynamic_range', 'partition_key'],
full_refresh = vars.GLOBAL_STREAMLINE_FR_ENABLED,
tags = ['streamline','stablecoin_reads','complete','phase_4']
) }}
SELECT
partition_key,
contract_address,
VALUE :"BLOCK_NUMBER" :: NUMBER AS block_number,
(
VALUE :"BLOCK_DATE_UNIX" :: TIMESTAMP
) :: DATE AS block_date,
file_name,
{{ dbt_utils.generate_surrogate_key(
['contract_address', 'block_number']
) }} AS stablecoin_reads_complete_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
_inserted_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
{% if is_incremental() %}
{{ ref('bronze__stablecoin_reads') }}
WHERE
_inserted_timestamp >= (
SELECT
COALESCE (MAX(_inserted_timestamp), '1970-01-01' :: TIMESTAMP)
FROM
{{ this }})
{% else %}
{{ ref('bronze__stablecoin_reads_fr') }}
{% endif %}
qualify(ROW_NUMBER() over (PARTITION BY stablecoin_reads_complete_id
ORDER BY
_inserted_timestamp DESC)) = 1

View File

@ -1,141 +0,0 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{# Set up dbt configuration #}
{{ config (
materialized = "view",
tags = ['streamline','stablecoin_reads','history','phase_4']
) }}
WITH verified_stablecoins AS (
SELECT
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
is_verified
AND contract_address IS NOT NULL
),
max_blocks AS (
SELECT
block_number,
block_date
FROM
{{ ref("_max_block_by_date") }}
WHERE
block_date >= ('{{ vars.BALANCES_SL_START_DATE }}' :: TIMESTAMP) :: DATE
),
base AS (
SELECT
s.contract_address,
s.metadata,
m.block_number,
m.block_date
FROM
verified_stablecoins s
CROSS JOIN max_blocks m
LEFT JOIN {{ ref('streamline__stablecoin_reads_complete') }} c
ON s.contract_address = c.contract_address
AND m.block_number = c.block_number
WHERE
c.contract_address IS NULL
AND m.block_date < (
SELECT MAX(block_date)
FROM max_blocks
)
),
function_sigs AS (
SELECT
'0x18160ddd' AS function_sig,
'totalSupply' AS function_name
),
ready_reads AS (
SELECT
contract_address,
block_number,
block_date,
function_sig,
RPAD(
function_sig,
64,
'0'
) AS input,
metadata
FROM
base
JOIN function_sigs
ON 1 = 1
)
SELECT
contract_address,
block_number,
DATE_PART('EPOCH_SECONDS', block_date) :: INT AS block_date_unix,
ROUND(block_number,-3) AS partition_key,
function_sig,
input,
metadata :: STRING AS metadata_str,
live.udf_api(
'POST',
'{{ vars.GLOBAL_NODE_URL }}',
OBJECT_CONSTRUCT(
'Content-Type', 'application/json',
'fsc-quantum-state', 'streamline'
),
OBJECT_CONSTRUCT(
'method', 'eth_call',
'jsonrpc', '2.0',
'params', [{'to': contract_address, 'from': null, 'data': input}, utils.udf_int_to_hex(block_number)],
'id', concat_ws(
'-',
contract_address,
input,
block_number
)
),
'{{ vars.GLOBAL_NODE_VAULT_PATH }}'
) AS request
FROM
ready_reads
WHERE
EXISTS (
SELECT
1
FROM
ready_reads
LIMIT
1
)
{# Streamline Function Call #}
{% if execute %}
{% set params = {
"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": 'contract_reads_daily_history'
} %}
{% set function_call_sql %}
{{ fsc_utils.if_data_call_function_v2(
func = 'streamline.udf_bulk_rest_api_v2',
target = this.schema ~ "." ~ this.identifier,
params = params
) }}
{% endset %}
{% do run_query(function_call_sql) %}
{{ log("Streamline function call: " ~ function_call_sql, info=true) }}
{% endif %}

View File

@ -1,137 +0,0 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{# Set up dbt configuration #}
{{ config (
materialized = "view",
tags = ['streamline','stablecoin_reads','realtime','phase_4']
) }}
WITH verified_stablecoins AS (
SELECT
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
is_verified
AND contract_address IS NOT NULL
),
max_blocks AS (
SELECT
block_number,
block_date
FROM
{{ ref("_max_block_by_date") }}
WHERE
block_date >= DATEADD('day',-4,SYSDATE()) --last 3 max block_number by date
),
base AS (
SELECT
s.contract_address,
s.metadata,
m.block_number,
m.block_date
FROM
verified_stablecoins s
CROSS JOIN max_blocks m
LEFT JOIN {{ ref('streamline__stablecoin_reads_complete') }} c
ON s.contract_address = c.contract_address
AND m.block_number = c.block_number
WHERE
c.contract_address IS NULL
),
function_sigs AS (
SELECT
'0x18160ddd' AS function_sig,
'totalSupply' AS function_name
),
ready_reads AS (
SELECT
contract_address,
block_number,
block_date,
function_sig,
RPAD(
function_sig,
64,
'0'
) AS input,
metadata
FROM
base
JOIN function_sigs
ON 1 = 1
)
SELECT
contract_address,
block_number,
DATE_PART('EPOCH_SECONDS', block_date) :: INT AS block_date_unix,
ROUND(block_number,-3) AS partition_key,
function_sig,
input,
metadata :: STRING AS metadata_str,
live.udf_api(
'POST',
'{{ vars.GLOBAL_NODE_URL }}',
OBJECT_CONSTRUCT(
'Content-Type', 'application/json',
'fsc-quantum-state', 'streamline'
),
OBJECT_CONSTRUCT(
'method', 'eth_call',
'jsonrpc', '2.0',
'params', [{'to': contract_address, 'from': null, 'data': input}, utils.udf_int_to_hex(block_number)],
'id', concat_ws(
'-',
contract_address,
input,
block_number
)
),
'{{ vars.GLOBAL_NODE_VAULT_PATH }}'
) AS request
FROM
ready_reads
WHERE
EXISTS (
SELECT
1
FROM
ready_reads
LIMIT
1
)
{# Streamline Function Call #}
{% if execute %}
{% set params = {
"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" : 'contract_reads_daily_realtime'
} %}
{% set function_call_sql %}
{{ fsc_utils.if_data_call_function_v2(
func = 'streamline.udf_bulk_rest_api_v2',
target = this.schema ~ "." ~ this.identifier,
params = params
) }}
{% endset %}
{% do run_query(function_call_sql) %}
{{ log("Streamline function call: " ~ function_call_sql, info=true) }}
{% endif %}

View File

@ -0,0 +1,155 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
-- depends_on: {{ ref('price__ez_asset_metadata') }}
-- depends_on: {{ ref('defi__dim_stablecoins') }}
{{ config(
materialized = 'incremental',
unique_key = 'stablecoins_reads_totalsupply_id',
cluster_by = ['block_date'],
incremental_predicates = ["dynamic_range", "block_number"],
merge_exclude_columns = ["inserted_timestamp"],
post_hook = "{{ unverify_stablecoins() }}",
full_refresh = vars.GLOBAL_SILVER_FR_ENABLED,
tags = ['silver','defi','stablecoins','heal','curated_daily']
) }}
WITH stablecoin_reads AS (
SELECT
block_number,
block_date,
contract_address,
metadata,
result_hex,
_inserted_timestamp
FROM
{{ ref('silver__contract_reads') }}
WHERE
protocol = 'stablecoins'
AND function_name = 'totalSupply'
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
),
results AS (
SELECT
block_number,
block_date,
contract_address,
metadata,
metadata :decimals AS decimals,
result_hex AS amount_hex,
IFNULL(
CASE
WHEN LENGTH(amount_hex) <= 4300
AND amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(amount_hex) AS bigint)END,
CASE
WHEN amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(RTRIM(amount_hex, '0')) AS bigint)
END
) AS amount_raw,
IFF(
decimals IS NULL,
NULL,
utils.udf_decimal_adjust(
amount_raw,
decimals
)
) AS amount_precise,
amount_precise :: FLOAT AS amount,
_inserted_timestamp
FROM
stablecoin_reads
WHERE
amount_raw IS NOT NULL
),
{% if is_incremental() %}
heal_model AS (
SELECT
t.block_number,
t.block_date,
t.contract_address,
t.metadata,
d.decimals AS decimals_heal,
t.amount_hex,
t.amount_raw,
IFF(
decimals_heal IS NULL,
NULL,
utils.udf_decimal_adjust(
t.amount_raw,
decimals_heal
)
) AS amount_precise_heal,
amount_precise_heal :: FLOAT AS amount_heal,
t._inserted_timestamp
FROM
{{ this }}
t
INNER JOIN {{ ref('defi__dim_stablecoins') }}
d
ON t.contract_address = d.contract_address
WHERE
t.decimals IS NULL
AND d.decimals IS NOT NULL
),
{% endif %}
FINAL AS (
SELECT
*
FROM
results
{% if is_incremental() %}
UNION ALL
SELECT
block_number,
block_date,
contract_address,
metadata,
decimals_heal AS decimals,
amount_hex,
amount_raw,
amount_precise_heal AS amount_precise,
amount_heal AS amount,
_inserted_timestamp
FROM
heal_model
{% endif %}
)
SELECT
block_number,
block_date,
contract_address,
metadata,
decimals,
amount_hex,
amount_raw,
amount_precise,
amount,
_inserted_timestamp,
{{ dbt_utils.generate_surrogate_key(
['block_date','contract_address']
) }} AS stablecoins_reads_totalsupply_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
FINAL
{% if is_incremental() %}
qualify(ROW_NUMBER() over (PARTITION BY stablecoins_reads_totalsupply_id
ORDER BY
modified_timestamp DESC)) = 1
{% endif %}

View File

@ -1,8 +1,8 @@
version: 2
models:
- name: silver__stablecoin_reads
- name: silver_stablecoins__stablecoins_reads_totalsupply
tests:
- dbt_utils.unique_combination_of_columns:
arguments:
combination_of_columns:
- stablecoin_reads_id
- stablecoin_reads_id

View File

@ -23,7 +23,7 @@ max_ts AS (
incremental_dates AS (
-- Get all distinct dates that have been updated in any source table
SELECT DISTINCT block_date
FROM {{ ref('silver__stablecoin_reads') }}
FROM {{ ref('silver_stablecoins__stablecoins_reads_totalsupply') }}
WHERE modified_timestamp > (SELECT max_modified_timestamp FROM max_ts)
UNION
SELECT DISTINCT block_date
@ -54,7 +54,7 @@ total_supply AS (
metadata :label :: STRING AS label,
metadata :decimals :: INTEGER AS decimals
FROM
{{ ref('silver__stablecoin_reads') }}
{{ ref('silver_stablecoins__stablecoins_reads_totalsupply') }}
{% if is_incremental() %}
WHERE
@ -310,9 +310,7 @@ all_supply AS (
AND s.contract_address = h.contract_address
),
{% if is_incremental() and var(
'HEAL_MODEL'
) %}
{% if is_incremental() %}
heal_model AS (
SELECT
t.block_date,
@ -367,9 +365,7 @@ FINAL AS (
FROM
all_supply
{% if is_incremental() and var(
'HEAL_MODEL'
) %}
{% if is_incremental() %}
UNION ALL
SELECT
block_date,
@ -417,9 +413,7 @@ SELECT
FROM
FINAL
{% if is_incremental() and var(
'HEAL_MODEL'
) %}
{% if is_incremental() %}
qualify(ROW_NUMBER() over (PARTITION BY stablecoins_supply_complete_id
ORDER BY
modified_timestamp DESC)) = 1

View File

@ -0,0 +1,46 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'view',
persist_docs ={ "relation": true,
"columns": true },
tags = ['gold','defi','tvl','curated_daily']
) }}
WITH tvl_usd AS (
SELECT
block_date,
SUM(
CASE
WHEN COALESCE(amount_usd, 0) < POWER(10, max_usd_exponent) THEN COALESCE(amount_usd, 0)
ELSE 0
END
) AS tvl_usd,
protocol,
version,
platform,
MAX(modified_timestamp) AS modified_timestamp,
MAX(inserted_timestamp) AS inserted_timestamp
FROM
{{ ref('silver_tvl__complete_tvl') }}
GROUP BY
block_date,
protocol,
version,
platform
)
SELECT
block_date,
tvl_usd,
protocol,
version,
platform,
modified_timestamp,
inserted_timestamp,
{{ dbt_utils.generate_surrogate_key(
['block_date','platform']
) }} AS ez_protocol_tvl_id
FROM
tvl_usd

View File

@ -0,0 +1,22 @@
version: 2
models:
- name: defi__ez_protocol_tvl
description: '{{ doc("ez_protocol_tvl_table_doc") }}'
columns:
- name: BLOCK_DATE
description: '{{ doc("ez_protocol_tvl_block_date") }}'
- name: TVL_USD
description: '{{ doc("ez_protocol_tvl_tvl_usd") }}'
- name: PROTOCOL
description: '{{ doc("ez_protocol_tvl_protocol") }}'
- name: VERSION
description: '{{ doc("ez_protocol_tvl_version") }}'
- name: PLATFORM
description: '{{ doc("ez_protocol_tvl_platform") }}'
- name: INSERTED_TIMESTAMP
description: '{{ doc("general_inserted_timestamp") }}'
- name: MODIFIED_TIMESTAMP
description: '{{ doc("general_modified_timestamp") }}'
- name: EZ_PROTOCOL_TVL_ID
description: '{{ doc("general_pk") }}'

View File

@ -0,0 +1,114 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'aave_v1_tvl_id',
tags = ['silver','defi','tvl','curated_daily']
) }}
WITH reads AS (
SELECT
block_number,
block_date,
contract_address,
address,
result_hex AS amount_hex,
IFNULL(
CASE
WHEN LENGTH(amount_hex) <= 4300
AND amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(amount_hex) AS bigint)END,
CASE
WHEN amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(RTRIM(amount_hex, '0')) AS bigint)
END
) AS amount_raw,
protocol,
version,
platform,
_inserted_timestamp
FROM
{{ ref('silver__contract_reads') }}
WHERE
amount_raw IS NOT NULL
AND platform IN (
SELECT
DISTINCT platform
FROM
{{ ref('silver_reads__aave_v1_reads') }}
)
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
),
balances AS (
SELECT
block_number,
block_date,
'0x0000000000000000000000000000000000000000' AS contract_address, -- Represents native asset, for pricing purposes
address,
balance_hex AS amount_hex,
balance_raw AS amount_raw,
'aave' AS protocol,
'v1' AS version,
CONCAT(
protocol,
'-',
version
) AS platform,
modified_timestamp AS _inserted_timestamp
FROM
{{ ref('balances__ez_balances_native_daily') }}
WHERE
address = '0x3dfd23a6c5e8bbcfc9581d2e864a68feb6a076d3'
AND balance_raw IS NOT NULL
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
),
FINAL AS (
SELECT
*
FROM
reads
UNION ALL
SELECT
*
FROM
balances
)
SELECT
block_number,
block_date,
contract_address,
address,
contract_address AS token_address,
amount_hex,
amount_raw,
protocol,
version,
platform,
{{ dbt_utils.generate_surrogate_key(
['block_date','contract_address','address','platform']
) }} AS aave_v1_tvl_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
FINAL qualify(ROW_NUMBER() over(PARTITION BY aave_v1_tvl_id
ORDER BY
modified_timestamp DESC)) = 1

View File

@ -0,0 +1,4 @@
version: 2
models:
- name: silver_tvl__aave_v1_tvl
description: '{{ doc("aave_v1_tvl_table_doc") }}'

View File

@ -0,0 +1,72 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'aave_v2_tvl_id',
tags = ['silver','defi','tvl','curated_daily']
) }}
WITH reads AS (
SELECT
block_number,
block_date,
contract_address,
address,
result_hex AS amount_hex,
IFNULL(
CASE
WHEN LENGTH(amount_hex) <= 4300
AND amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(amount_hex) AS bigint)END,
CASE
WHEN amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(RTRIM(amount_hex, '0')) AS bigint)
END
) AS amount_raw,
protocol,
version,
platform,
_inserted_timestamp
FROM
{{ ref('silver__contract_reads') }}
WHERE
amount_raw IS NOT NULL
AND platform IN (
SELECT
DISTINCT platform
FROM
{{ ref('silver_reads__aave_v2_reads') }}
)
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
)
SELECT
block_number,
block_date,
contract_address,
address,
contract_address AS token_address,
amount_hex,
amount_raw,
protocol,
version,
platform,
{{ dbt_utils.generate_surrogate_key(
['block_date','contract_address','address','platform']
) }} AS aave_v2_tvl_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
reads qualify(ROW_NUMBER() over(PARTITION BY aave_v2_tvl_id
ORDER BY
modified_timestamp DESC)) = 1

View File

@ -0,0 +1,4 @@
version: 2
models:
- name: silver_tvl__aave_v2_tvl
description: '{{ doc("aave_v2_tvl_table_doc") }}'

View File

@ -0,0 +1,74 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'aave_v3_tvl_id',
tags = ['silver','defi','tvl','curated_daily']
) }}
WITH reads AS (
SELECT
block_number,
block_date,
contract_address,
address,
result_hex AS amount_hex,
IFNULL(
CASE
WHEN LENGTH(amount_hex) <= 4300
AND amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(amount_hex) AS bigint)END,
CASE
WHEN amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(RTRIM(amount_hex, '0')) AS bigint)
END
) AS amount_raw,
metadata :underlying_address :: STRING AS underlying_address,
protocol,
version,
platform,
_inserted_timestamp
FROM
{{ ref('silver__contract_reads') }}
WHERE
amount_raw IS NOT NULL
AND platform IN (
SELECT
DISTINCT platform
FROM
{{ ref('silver_reads__aave_v3_reads') }}
)
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
)
SELECT
block_number,
block_date,
contract_address,
address,
underlying_address AS token_address,
amount_hex,
amount_raw,
protocol,
version,
platform,
12 AS usd_threshold,
{{ dbt_utils.generate_surrogate_key(
['block_date','contract_address','address','platform']
) }} AS aave_v3_tvl_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
reads qualify(ROW_NUMBER() over(PARTITION BY aave_v3_tvl_id
ORDER BY
modified_timestamp DESC)) = 1

View File

@ -0,0 +1,4 @@
version: 2
models:
- name: silver_tvl__aave_v3_tvl
description: '{{ doc("aave_v3_tvl_table_doc") }}'

View File

@ -0,0 +1,122 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'aerodrome_v1_tvl_id',
tags = ['silver','defi','tvl','curated_daily']
) }}
WITH reads AS (
SELECT
block_number,
block_date,
contract_address AS pool_address,
address, --NULL
regexp_substr_all(SUBSTR(result_hex, 3, len(result_hex)), '.{64}') AS segmented_data,
segmented_data [0] :: STRING AS reserve_0_hex,
segmented_data [1] :: STRING AS reserve_1_hex,
segmented_data [2] :: STRING AS block_timestamp_last_hex,
IFNULL(
CASE
WHEN LENGTH(reserve_0_hex) <= 4300
AND reserve_0_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(reserve_0_hex) AS bigint)END,
CASE
WHEN reserve_0_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(RTRIM(reserve_0_hex, '0')) AS bigint)
END
) AS reserve_0_raw,
IFNULL(
CASE
WHEN LENGTH(reserve_1_hex) <= 4300
AND reserve_1_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(reserve_1_hex) AS bigint)END,
CASE
WHEN reserve_1_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(RTRIM(reserve_1_hex, '0')) AS bigint)
END
) AS reserve_1_raw,
IFNULL(
CASE
WHEN LENGTH(block_timestamp_last_hex) <= 4300
AND block_timestamp_last_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(block_timestamp_last_hex) AS TIMESTAMP)END,
CASE
WHEN block_timestamp_last_hex IS NOT NULL THEN TRY_CAST(
utils.udf_hex_to_int(RTRIM(block_timestamp_last_hex, '0')) AS TIMESTAMP
)
END
) AS block_timestamp_last_raw,
metadata :token0 :: STRING AS token_0_address,
metadata :token1 :: STRING AS token_1_address,
protocol,
version,
platform,
_inserted_timestamp
FROM
{{ ref('silver__contract_reads') }}
WHERE
reserve_0_raw IS NOT NULL
AND reserve_1_raw IS NOT NULL
AND block_timestamp_last_raw IS NOT NULL
AND platform IN (
SELECT DISTINCT platform
FROM {{ ref('silver_reads__aerodrome_v1_reads') }}
)
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
),
all_reads AS (
SELECT
block_number,
block_date,
token_0_address AS contract_address,
pool_address AS address,
reserve_0_hex AS amount_hex,
reserve_0_raw AS amount_raw,
protocol,
version,
platform
FROM reads
UNION ALL
SELECT
block_number,
block_date,
token_1_address AS contract_address,
pool_address AS address,
reserve_1_hex AS amount_hex,
reserve_1_raw AS amount_raw,
protocol,
version,
platform
FROM reads
)
SELECT
block_number,
block_date,
contract_address,
address,
contract_address AS token_address,
amount_hex,
amount_raw,
protocol,
version,
platform,
{{ dbt_utils.generate_surrogate_key(
['block_date','contract_address','address','platform']
) }} AS aerodrome_v1_tvl_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
all_reads qualify(ROW_NUMBER() over(PARTITION BY aerodrome_v1_tvl_id
ORDER BY
modified_timestamp DESC)) = 1

View File

@ -0,0 +1,4 @@
version: 2
models:
- name: silver_tvl__aerodrome_v1_tvl
description: '{{ doc("aerodrome_v1_tvl_table_doc") }}'

View File

@ -0,0 +1,69 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'binance_v1_tvl_id',
tags = ['silver','defi','tvl','curated_daily']
) }}
WITH reads AS (
SELECT
block_number,
block_date,
contract_address,
address,
result_hex AS amount_hex,
IFNULL(
CASE
WHEN LENGTH(amount_hex) <= 4300
AND amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(amount_hex) AS bigint)END,
CASE
WHEN amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(RTRIM(amount_hex, '0')) AS bigint)
END
) AS amount_raw,
protocol,
version,
platform,
_inserted_timestamp
FROM
{{ ref('silver__contract_reads') }}
WHERE
platform = 'binance-v1'
AND amount_raw IS NOT NULL
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
)
SELECT
block_number,
block_date,
contract_address,
address,
contract_address AS token_address,
amount_hex,
amount_raw,
protocol,
version,
platform,
{{ dbt_utils.generate_surrogate_key(
['block_date','contract_address','platform']
) }} AS binance_v1_tvl_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
reads qualify(ROW_NUMBER() over(PARTITION BY binance_v1_tvl_id
ORDER BY
modified_timestamp DESC)) = 1

View File

@ -0,0 +1,4 @@
version: 2
models:
- name: silver_tvl__binance_v1_tvl
description: '{{ doc("binance_v1_tvl_table_doc") }}'

View File

@ -0,0 +1,69 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'curve_v1_tvl_id',
tags = ['silver','defi','tvl','curated_daily']
) }}
WITH reads AS (
SELECT
block_number,
block_date,
contract_address,
address,
result_hex AS amount_hex,
IFNULL(
CASE
WHEN LENGTH(amount_hex) <= 4300
AND amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(amount_hex) AS bigint)END,
CASE
WHEN amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(RTRIM(amount_hex, '0')) AS bigint)
END
) AS amount_raw,
protocol,
version,
platform,
_inserted_timestamp
FROM
{{ ref('silver__contract_reads') }}
WHERE
platform = 'curve-v1'
AND amount_raw IS NOT NULL
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
)
SELECT
block_number,
block_date,
contract_address,
address,
contract_address AS token_address,
amount_hex,
amount_raw,
protocol,
version,
platform,
{{ dbt_utils.generate_surrogate_key(
['block_date','contract_address','address','platform']
) }} AS curve_v1_tvl_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
reads qualify(ROW_NUMBER() over(PARTITION BY curve_v1_tvl_id
ORDER BY
modified_timestamp DESC)) = 1

View File

@ -0,0 +1,4 @@
version: 2
models:
- name: silver_tvl__curve_v1_tvl
description: '{{ doc("curve_v1_tvl_table_doc") }}'

View File

@ -0,0 +1,82 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'etherfi_v1_tvl_id',
tags = ['silver','defi','tvl','curated_daily']
) }}
WITH reads AS (
SELECT
block_number,
block_date,
contract_address,
address,
result_hex AS amount_hex,
IFNULL(
CASE
WHEN LENGTH(amount_hex) <= 4300
AND amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(amount_hex) AS bigint)END,
CASE
WHEN amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(RTRIM(amount_hex, '0')) AS bigint)
END
) AS amount_raw_unadj,
metadata :token_address :: STRING AS token_address,
metadata :attribution :: STRING AS attribution,
metadata :chain :: STRING AS chain,
protocol,
version,
platform,
_inserted_timestamp
FROM
{{ ref('silver__contract_reads') }}
WHERE
platform = 'etherfi-v1'
AND chain = '{{ vars.GLOBAL_PROJECT_NAME }}'
AND amount_raw_unadj IS NOT NULL
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
)
SELECT
block_number,
block_date,
contract_address,
address,
CASE
WHEN r.token_address IS NOT NULL THEN r.token_address
ELSE contract_address
END AS token_address,
amount_hex,
CASE
WHEN r.contract_address = '0xab7590cee3ef1a863e9a5877fbb82d9be11504da' THEN -1 * amount_raw_unadj
--categoryTVL() must be subtracted from getTVL(), negative value enables SUM
ELSE amount_raw_unadj
END AS amount_raw,
protocol,
version,
platform,
attribution,
chain,
{{ dbt_utils.generate_surrogate_key(
['block_date','contract_address','address','platform']
) }} AS etherfi_v1_tvl_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
reads r qualify(ROW_NUMBER() over(PARTITION BY etherfi_v1_tvl_id
ORDER BY
modified_timestamp DESC)) = 1

View File

@ -0,0 +1,4 @@
version: 2
models:
- name: silver_tvl__etherfi_v1_tvl
description: '{{ doc("etherfi_v1_tvl_table_doc") }}'

View File

@ -0,0 +1,173 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'etherfi_v1_tvl_agg_id',
tags = ['silver','defi','tvl','curated_daily']
) }}
WITH chain_tvl AS (
SELECT
block_number,
block_date,
contract_address,
address,
token_address,
amount_hex,
amount_raw,
protocol,
version,
platform,
attribution,
chain
FROM
{{ ref('silver_tvl__etherfi_v1_tvl') }}
WHERE
chain = '{{ vars.GLOBAL_PROJECT_NAME }}'
AND attribution = '{{ vars.GLOBAL_PROJECT_NAME }}'
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
), {% if vars.GLOBAL_PROJECT_NAME == 'ethereum' %}
eth_attributed_tvl AS (
SELECT
block_number,
block_date,
contract_address,
address,
token_address,
amount_hex,
amount_raw,
protocol,
version,
platform,
attribution,
chain
FROM
{{ source(
'silver_tvl_optimism',
'etherfi_v1_tvl'
) }}
WHERE
attribution = 'ethereum'
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
UNION ALL
SELECT
block_number,
block_date,
contract_address,
address,
token_address,
amount_hex,
amount_raw,
protocol,
version,
platform,
attribution,
chain
FROM
{{ source(
'silver_tvl_arbitrum',
'etherfi_v1_tvl'
) }}
WHERE
attribution = 'ethereum'
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
UNION ALL
SELECT
block_number,
block_date,
contract_address,
address,
token_address,
amount_hex,
amount_raw,
protocol,
version,
platform,
attribution,
chain
FROM
{{ source(
'silver_tvl_base',
'etherfi_v1_tvl'
) }}
WHERE
attribution = 'ethereum'
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
),
{% endif %}
FINAL AS (
SELECT
*
FROM
chain_tvl
{% if vars.GLOBAL_PROJECT_NAME == 'ethereum' %}
UNION ALL
SELECT
*
FROM
eth_attributed_tvl
{% endif %}
)
SELECT
block_number,
block_date,
contract_address,
address,
token_address,
amount_hex,
amount_raw,
protocol,
version,
platform,
attribution,
chain,
{{ dbt_utils.generate_surrogate_key(
['block_date','contract_address','address','platform','attribution','chain']
) }} AS etherfi_v1_tvl_agg_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
FINAL qualify(ROW_NUMBER() over(PARTITION BY etherfi_v1_tvl_agg_id
ORDER BY
modified_timestamp DESC)) = 1

View File

@ -0,0 +1,4 @@
version: 2
models:
- name: silver_tvl__etherfi_v1_tvl_agg
description: '{{ doc("etherfi_v1_tvl_table_doc") }}'

View File

@ -0,0 +1,69 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'lido_tvl_id',
tags = ['silver','defi','tvl','curated_daily']
) }}
WITH reads AS (
SELECT
block_number,
block_date,
contract_address,
address,
result_hex AS amount_hex,
IFNULL(
CASE
WHEN LENGTH(amount_hex) <= 4300
AND amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(amount_hex) AS bigint)END,
CASE
WHEN amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(RTRIM(amount_hex, '0')) AS bigint)
END
) AS amount_raw,
protocol,
version,
platform,
_inserted_timestamp
FROM
{{ ref('silver__contract_reads') }}
WHERE
platform = 'lido-v1'
AND amount_raw IS NOT NULL
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
)
SELECT
block_number,
block_date,
contract_address,
address,
contract_address AS token_address,
amount_hex,
amount_raw,
protocol,
version,
platform,
{{ dbt_utils.generate_surrogate_key(
['block_date','contract_address','platform']
) }} AS lido_tvl_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
reads qualify(ROW_NUMBER() over(PARTITION BY lido_tvl_id
ORDER BY
modified_timestamp DESC)) = 1

View File

@ -0,0 +1,4 @@
version: 2
models:
- name: silver_tvl__lido_v1_tvl
description: '{{ doc("lido_v1_tvl_table_doc") }}'

View File

@ -0,0 +1,69 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'polymarket_v1_tvl_id',
tags = ['silver','defi','tvl','curated_daily']
) }}
WITH reads AS (
SELECT
block_number,
block_date,
contract_address,
address,
result_hex AS amount_hex,
IFNULL(
CASE
WHEN LENGTH(amount_hex) <= 4300
AND amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(amount_hex) AS bigint)END,
CASE
WHEN amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(RTRIM(amount_hex, '0')) AS bigint)
END
) AS amount_raw,
protocol,
version,
platform,
_inserted_timestamp
FROM
{{ ref('silver__contract_reads') }}
WHERE
platform = 'polymarket-v1'
AND amount_raw IS NOT NULL
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
)
SELECT
block_number,
block_date,
contract_address,
address,
contract_address AS token_address,
amount_hex,
amount_raw,
protocol,
version,
platform,
{{ dbt_utils.generate_surrogate_key(
['block_date','contract_address','address','platform']
) }} AS polymarket_v1_tvl_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
reads qualify(ROW_NUMBER() over(PARTITION BY polymarket_v1_tvl_id
ORDER BY
modified_timestamp DESC)) = 1

View File

@ -0,0 +1,4 @@
version: 2
models:
- name: silver_tvl__polymarket_v1_tvl
description: '{{ doc("polymarket_v1_tvl_table_doc") }}'

View File

@ -0,0 +1,239 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
-- depends_on: {{ ref('streamline__contract_reads_records') }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'complete_tvl_id',
post_hook = '{{ unverify_tvl() }}',
tags = ['silver','defi','tvl','complete','heal','curated_daily']
) }}
{% set models = [
(ref('silver_tvl__aave_v1_tvl'), 12, 'aave-v1'),
(ref('silver_tvl__aave_v2_tvl'), 12, 'aave-v2'),
(ref('silver_tvl__aave_v3_tvl'), 12, 'aave-v3'),
(ref('silver_tvl__aerodrome_v1_tvl'), 12, 'aerodrome-v1'),
(ref('silver_tvl__superchain_slipstream_v1_tvl'), 12, 'superchain-slipstream-v1'),
(ref('silver_tvl__binance_v1_tvl'), 12, 'binance-v1'),
(ref('silver_tvl__curve_v1_tvl'), 10, 'curve-v1'),
(ref('silver_tvl__etherfi_v1_tvl_agg'), 12, 'etherfi-v1'),
(ref('silver_tvl__lido_v1_tvl'), 12, 'lido-v1'),
(ref('silver_tvl__tornado_cash_v1_tvl'), 9, 'tornado_cash-v1'),
(ref('silver_tvl__uniswap_v1_tvl'), 9, 'uniswap-v1'),
(ref('silver_tvl__uniswap_v2_tvl'), 9, 'uniswap-v2'),
(ref('silver_tvl__uniswap_v3_tvl'), 9, 'uniswap-v3'),
(ref('silver_tvl__uniswap_v4_tvl'), 9, 'uniswap-v4')
] %}
WITH all_tvl AS (
{% for model, max_usd_exponent, platform in models %}
SELECT
block_number,
block_date,
contract_address,
address,
token_address,
amount_hex,
amount_raw,
protocol,
version,
platform,
{{ max_usd_exponent }} AS max_usd_exponent
FROM {{ model }}
{% if is_incremental() and platform not in vars.CURATED_FR_MODELS %}
WHERE modified_timestamp > (
SELECT MAX(modified_timestamp)
FROM {{ this }}
)
{% endif %}
{% if not loop.last %}
UNION ALL
{% endif %}
{% endfor %}
),
contracts AS (
SELECT
address AS contract_address,
symbol AS token_symbol,
decimals AS token_decimals,
modified_timestamp AS _inserted_timestamp
FROM
{{ ref('core__dim_contracts') }}
UNION ALL
SELECT
'0x0000000000000000000000000000000000000000' AS contract_address,
'{{ vars.GLOBAL_NATIVE_ASSET_SYMBOL }}' AS token_symbol,
decimals AS token_decimals,
modified_timestamp AS _inserted_timestamp
FROM
{{ ref('core__dim_contracts') }}
WHERE
address = '{{ vars.GLOBAL_WRAPPED_NATIVE_ASSET_ADDRESS }}'
),
prices AS (
SELECT
token_address,
price,
HOUR,
is_verified,
modified_timestamp AS _inserted_timestamp
FROM
{{ ref('price__ez_prices_hourly') }}
UNION ALL
SELECT
'0x0000000000000000000000000000000000000000' AS token_address,
price,
HOUR,
is_verified,
modified_timestamp AS _inserted_timestamp
FROM
{{ ref('price__ez_prices_hourly') }}
WHERE
token_address = '{{ vars.GLOBAL_WRAPPED_NATIVE_ASSET_ADDRESS }}'
),
complete_tvl AS (
SELECT
A.block_number,
A.block_date,
A.contract_address,
A.address,
A.token_address,
c1.token_decimals AS decimals,
c1.token_symbol AS symbol,
p1.is_verified,
A.amount_hex,
A.amount_raw,
utils.udf_decimal_adjust(
A.amount_raw,
c1.token_decimals
) AS amount_precise,
amount_precise :: FLOAT AS amount,
ROUND(
amount * p1.price,
2
) AS amount_usd,
A.protocol,
A.version,
A.platform,
A.max_usd_exponent
FROM
all_tvl A
LEFT JOIN contracts c1
ON A.token_address = c1.contract_address
LEFT JOIN prices p1
ON A.token_address = p1.token_address
AND DATEADD(
'hour',
23,
A.block_date
) = p1.hour
),
{% if is_incremental() and var(
'HEAL_MODEL'
) %}
heal_model AS (
SELECT
t.block_number,
t.block_date,
t.contract_address,
t.address,
t.token_address,
c1.token_decimals AS decimals_heal,
c1.token_symbol AS symbol_heal,
p1.is_verified AS is_verified_heal,
t.amount_hex,
t.amount_raw,
utils.udf_decimal_adjust(
t.amount_raw,
c1.token_decimals
) AS amount_precise_heal,
amount_precise_heal :: FLOAT AS amount_heal,
ROUND(
amount_heal * p1.price,
2
) AS amount_usd_heal,
t.protocol,
t.version,
t.platform,
t.max_usd_exponent
FROM
{{ this }}
t
LEFT JOIN contracts c1
ON t.token_address = c1.contract_address
LEFT JOIN prices p1
ON t.token_address = p1.token_address
AND DATEADD(
'hour',
23,
t.block_date
) = p1.hour
WHERE t.decimals IS NULL
AND c1.token_decimals IS NOT NULL -- only heal if contract data now exists
),
{% endif %}
FINAL AS (
SELECT
*
FROM
complete_tvl
{% if is_incremental() and var(
'HEAL_MODEL'
) %}
UNION ALL
SELECT
block_number,
block_date,
contract_address,
address,
token_address,
decimals_heal AS decimals,
symbol_heal AS symbol,
is_verified_heal AS is_verified,
amount_hex,
amount_raw,
amount_precise_heal AS amount_precise,
amount_heal AS amount,
amount_usd_heal AS amount_usd,
protocol,
version,
platform,
max_usd_exponent
FROM
heal_model
{% endif %}
)
SELECT
block_number,
block_date,
contract_address,
address,
token_address,
decimals,
symbol,
is_verified,
amount_hex,
amount_raw,
amount_precise,
amount,
amount_usd,
protocol,
version,
platform,
max_usd_exponent,
{{ dbt_utils.generate_surrogate_key(
['block_number','block_date','contract_address','address','platform']
) }} AS complete_tvl_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
FINAL

View File

@ -0,0 +1,38 @@
version: 2
models:
- name: silver_tvl__complete_tvl
tests:
- dbt_utils.unique_combination_of_columns:
combination_of_columns:
- COMPLETE_TVL_ID
columns:
- name: BLOCK_NUMBER
tests:
- not_null
- name: BLOCK_DATE
tests:
- not_null
- name: CONTRACT_ADDRESS
tests:
- not_null
- dbt_expectations.expect_column_values_to_match_regex:
regex: 0[xX][0-9a-fA-F]+
- name: AMOUNT_RAW
tests:
- not_null
- name: PLATFORM
tests:
- not_null
- name: PROTOCOL
tests:
- not_null
- name: VERSION
tests:
- not_null
- name: MODIFIED_TIMESTAMP
tests:
- not_null
- dbt_expectations.expect_row_values_to_have_recent_data:
datepart: day
interval: 3

View File

@ -0,0 +1,74 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'superchain_slipstream_v1_tvl_id',
tags = ['silver','defi','tvl','curated_daily']
) }}
WITH reads AS (
SELECT
block_number,
block_date,
contract_address,
address,
result_hex AS amount_hex,
IFNULL(
CASE
WHEN LENGTH(amount_hex) <= 4300
AND amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(amount_hex) AS bigint)END,
CASE
WHEN amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(RTRIM(amount_hex, '0')) AS bigint)
END
) AS amount_raw,
metadata :token0 :: STRING AS token_0_address,
metadata :token1 :: STRING AS token_1_address,
protocol,
version,
platform,
_inserted_timestamp
FROM
{{ ref('silver__contract_reads') }}
WHERE
amount_raw IS NOT NULL
AND platform IN (
SELECT DISTINCT platform
FROM {{ ref('silver_reads__superchain_slipstream_v1_reads') }}
)
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
)
SELECT
block_number,
block_date,
contract_address,
address,
contract_address AS token_address,
amount_hex,
amount_raw,
protocol,
version,
platform,
{{ dbt_utils.generate_surrogate_key(
['block_date','contract_address','address','platform']
) }} AS superchain_slipstream_v1_tvl_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
reads qualify(ROW_NUMBER() over(PARTITION BY superchain_slipstream_v1_tvl_id
ORDER BY
modified_timestamp DESC)) = 1

View File

@ -0,0 +1,4 @@
version: 2
models:
- name: silver_tvl__superchain_slipstream_v1_tvl
description: '{{ doc("superchain_slipstream_v1_tvl_table_doc") }}'

View File

@ -0,0 +1,117 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'tornado_cash_v1_tvl_id',
tags = ['silver','defi','tvl','curated_daily']
) }}
WITH reads AS (
SELECT
block_number,
block_date,
contract_address,
address,
result_hex AS amount_hex,
IFNULL(
CASE
WHEN LENGTH(amount_hex) <= 4300
AND amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(amount_hex) AS bigint)END,
CASE
WHEN amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(RTRIM(amount_hex, '0')) AS bigint)
END
) AS amount_raw,
protocol,
version,
platform,
_inserted_timestamp
FROM
{{ ref('silver__contract_reads') }}
WHERE
platform = 'tornado_cash-v1'
AND amount_raw IS NOT NULL
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
),
balances AS (
SELECT
b.block_number,
b.block_date,
t.token_address AS contract_address,
b.address AS address,
balance_hex AS amount_hex,
balance_raw AS amount_raw,
'tornado_cash' AS protocol,
'v1' AS version,
CONCAT(
protocol,
'-',
version
) AS platform,
b.modified_timestamp AS _inserted_timestamp
FROM
{{ ref('balances__ez_balances_native_daily') }}
b
LEFT JOIN {{ ref('silver_reads__tornado_cash_mixer_seed') }}
t
ON b.address = t.mixer_address
WHERE
t.mixer_address IS NOT NULL
AND t.token_address = '0x0000000000000000000000000000000000000000'
AND t.chain = '{{ vars.GLOBAL_PROJECT_NAME }}'
AND balance_raw IS NOT NULL
{% if is_incremental() %}
AND b.modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
),
FINAL AS (
SELECT
*
FROM
reads
UNION ALL
SELECT
*
FROM
balances
)
SELECT
block_number,
block_date,
contract_address,
address,
contract_address AS token_address,
amount_hex,
amount_raw,
protocol,
version,
platform,
{{ dbt_utils.generate_surrogate_key(
['block_date','contract_address','address','platform']
) }} AS tornado_cash_v1_tvl_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
FINAL qualify(ROW_NUMBER() over(PARTITION BY tornado_cash_v1_tvl_id
ORDER BY
modified_timestamp DESC)) = 1

View File

@ -0,0 +1,4 @@
version: 2
models:
- name: silver_tvl__tornado_cash_v1_tvl
description: '{{ doc("tornado_cash_v1_tvl_table_doc") }}'

View File

@ -0,0 +1,101 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'uniswap_v1_tvl_id',
tags = ['silver','defi','tvl','curated_daily']
) }}
WITH balances AS (
SELECT
b.block_number,
b.block_date,
p.token0,
p.token1,
b.address,
balance_hex,
balance_raw,
p.protocol,
p.version,
p.platform
FROM
{{ ref('balances__ez_balances_native_daily') }}
b
LEFT JOIN {{ ref('silver_dex__uniswap_v1_pools') }}
p
ON b.address = p.pool_address
WHERE
p.pool_address IS NOT NULL
AND balance_raw IS NOT NULL
{% if is_incremental() %}
AND b.modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
),
expanded AS (
-- Row for token0 as contract_address
SELECT
block_number,
block_date,
token0 AS contract_address,
token1 AS token_address,
address,
balance_hex,
balance_raw,
protocol,
version,
platform
FROM
balances
UNION ALL
-- Row for token1 as contract_address
SELECT
block_number,
block_date,
token1 AS contract_address,
token1 AS token_address,
address,
balance_hex,
balance_raw,
protocol,
version,
platform
FROM
balances
)
SELECT
block_number,
block_date,
contract_address,
address,
token_address,
balance_hex AS amount_hex,
balance_raw AS amount_raw,
protocol,
version,
platform,
{{ dbt_utils.generate_surrogate_key(
['block_date','contract_address','token_address','platform']
) }} AS uniswap_v1_tvl_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
expanded qualify(ROW_NUMBER() over(PARTITION BY uniswap_v1_tvl_id
ORDER BY
block_number DESC)) = 1

View File

@ -0,0 +1,4 @@
version: 2
models:
- name: silver_tvl__uniswap_v1_tvl
description: '{{ doc("uniswap_v1_tvl_table_doc") }}'

View File

@ -0,0 +1,124 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
-- depends_on: {{ ref('streamline__contract_reads_records') }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'uniswap_v2_tvl_id',
post_hook = '{{ unverify_tvl() }}',
tags = ['silver','defi','tvl','heal','curated_daily']
) }}
WITH reads AS (
SELECT
block_number,
block_date,
contract_address AS pool_address,
address, --NULL
regexp_substr_all(SUBSTR(result_hex, 3, len(result_hex)), '.{64}') AS segmented_data,
segmented_data [0] :: STRING AS reserve_0_hex,
segmented_data [1] :: STRING AS reserve_1_hex,
segmented_data [2] :: STRING AS block_timestamp_last_hex,
IFNULL(
CASE
WHEN LENGTH(reserve_0_hex) <= 4300
AND reserve_0_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(reserve_0_hex) AS bigint)END,
CASE
WHEN reserve_0_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(RTRIM(reserve_0_hex, '0')) AS bigint)
END
) AS reserve_0_raw,
IFNULL(
CASE
WHEN LENGTH(reserve_1_hex) <= 4300
AND reserve_1_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(reserve_1_hex) AS bigint)END,
CASE
WHEN reserve_1_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(RTRIM(reserve_1_hex, '0')) AS bigint)
END
) AS reserve_1_raw,
IFNULL(
CASE
WHEN LENGTH(block_timestamp_last_hex) <= 4300
AND block_timestamp_last_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(block_timestamp_last_hex) AS TIMESTAMP)END,
CASE
WHEN block_timestamp_last_hex IS NOT NULL THEN TRY_CAST(
utils.udf_hex_to_int(RTRIM(block_timestamp_last_hex, '0')) AS TIMESTAMP
)
END
) AS block_timestamp_last_raw,
metadata :token0 :: STRING AS token_0_address,
metadata :token1 :: STRING AS token_1_address,
protocol,
version,
platform,
_inserted_timestamp
FROM
{{ ref('silver__contract_reads') }}
WHERE
reserve_0_raw IS NOT NULL
AND reserve_1_raw IS NOT NULL
AND block_timestamp_last_raw IS NOT NULL
AND platform IN (
SELECT DISTINCT platform
FROM {{ ref('silver_reads__uniswap_v2_reads') }}
)
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
),
all_reads AS (
SELECT
block_number,
block_date,
token_0_address AS contract_address,
pool_address AS address,
reserve_0_hex AS amount_hex,
reserve_0_raw AS amount_raw,
protocol,
version,
platform
FROM reads
UNION ALL
SELECT
block_number,
block_date,
token_1_address AS contract_address,
pool_address AS address,
reserve_1_hex AS amount_hex,
reserve_1_raw AS amount_raw,
protocol,
version,
platform
FROM reads
)
SELECT
block_number,
block_date,
contract_address,
address,
contract_address AS token_address,
amount_hex,
amount_raw,
protocol,
version,
platform,
{{ dbt_utils.generate_surrogate_key(
['block_date','contract_address','platform']
) }} AS uniswap_v2_tvl_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
all_reads qualify(ROW_NUMBER() over(PARTITION BY uniswap_v2_tvl_id
ORDER BY
modified_timestamp DESC)) = 1

View File

@ -0,0 +1,4 @@
version: 2
models:
- name: silver_tvl__uniswap_v2_tvl
description: '{{ doc("uniswap_v2_tvl_table_doc") }}'

View File

@ -0,0 +1,78 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
-- depends_on: {{ ref('streamline__contract_reads_records') }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'uniswap_v3_tvl_id',
post_hook = '{{ unverify_tvl() }}',
tags = ['silver','defi','tvl','heal','curated_daily']
) }}
WITH reads AS (
SELECT
block_number,
block_date,
contract_address,
address,
result_hex AS amount_hex,
IFNULL(
CASE
WHEN LENGTH(amount_hex) <= 4300
AND amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(amount_hex) AS bigint)END,
CASE
WHEN amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(RTRIM(amount_hex, '0')) AS bigint)
END
) AS amount_raw,
metadata :token0 :: STRING AS token_0_address,
metadata :token1 :: STRING AS token_1_address,
protocol,
version,
platform,
_inserted_timestamp
FROM
{{ ref('silver__contract_reads') }}
WHERE
amount_raw IS NOT NULL
AND platform IN (
SELECT DISTINCT platform
FROM {{ ref('silver_reads__uniswap_v3_reads') }}
)
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
)
SELECT
block_number,
block_date,
contract_address,
address,
contract_address AS token_address,
amount_hex,
amount_raw,
token_0_address,
token_1_address,
protocol,
version,
platform,
{{ dbt_utils.generate_surrogate_key(
['block_date','contract_address','address','platform']
) }} AS uniswap_v3_tvl_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
reads qualify(ROW_NUMBER() over(PARTITION BY uniswap_v3_tvl_id
ORDER BY
modified_timestamp DESC)) = 1

View File

@ -0,0 +1,4 @@
version: 2
models:
- name: silver_tvl__uniswap_v3_tvl
description: '{{ doc("uniswap_v3_tvl_table_doc") }}'

View File

@ -0,0 +1,79 @@
{# Get variables #}
{% set vars = return_vars() %}
{# Log configuration details #}
{{ log_model_details() }}
-- depends_on: {{ ref('streamline__contract_reads_records') }}
{{ config(
materialized = 'incremental',
incremental_strategy = 'delete+insert',
unique_key = 'uniswap_v4_tvl_id',
post_hook = '{{ unverify_tvl() }}',
tags = ['silver','defi','tvl','heal','curated_daily']
) }}
WITH reads AS (
SELECT
block_number,
block_date,
contract_address,
address,
result_hex AS amount_hex,
IFNULL(
CASE
WHEN LENGTH(amount_hex) <= 4300
AND amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(amount_hex) AS bigint)END,
CASE
WHEN amount_hex IS NOT NULL THEN TRY_CAST(utils.udf_hex_to_int(RTRIM(amount_hex, '0')) AS bigint)
END
) AS amount_raw,
metadata :address_type :: STRING AS address_type,
metadata :hook_address :: STRING AS hook_address,
metadata :token0 :: STRING AS token_0_address,
metadata :token1 :: STRING AS token_1_address,
protocol,
version,
platform,
_inserted_timestamp
FROM
{{ ref('silver__contract_reads') }}
WHERE
platform = 'uniswap-v4'
AND amount_raw IS NOT NULL
{% if is_incremental() %}
AND modified_timestamp > (
SELECT
MAX(modified_timestamp)
FROM
{{ this }}
)
{% endif %}
)
SELECT
block_number,
block_date,
contract_address,
address,
contract_address AS token_address,
amount_hex,
amount_raw,
address_type,
hook_address,
token_0_address,
token_1_address,
protocol,
version,
platform,
{{ dbt_utils.generate_surrogate_key(
['block_date','contract_address','address','platform']
) }} AS uniswap_v4_tvl_id,
SYSDATE() AS inserted_timestamp,
SYSDATE() AS modified_timestamp,
'{{ invocation_id }}' AS _invocation_id
FROM
reads qualify(ROW_NUMBER() over(PARTITION BY uniswap_v4_tvl_id
ORDER BY
modified_timestamp DESC)) = 1

View File

@ -0,0 +1,4 @@
version: 2
models:
- name: silver_tvl__uniswap_v4_tvl
description: '{{ doc("uniswap_v4_tvl_table_doc") }}'

View File

@ -0,0 +1,100 @@
{% docs ez_protocol_tvl_table_doc %}
## What
This table provides daily Total Value Locked (TVL) metrics for DeFi protocols across EVM-compatible blockchains. It aggregates values by platform to track liquidity and value deposited in various DeFi applications. Methods may vary by protocol and blockchain.
## Methodology Note
For certain protocols (e.g., Uniswap v2/v3/v4 and forks), TVL is calculated only for pools where both tokens are verified. This filtering removes low-quality or spam pools, providing a more accurate representation of "real" TVL rather than values inflated by low-liquidity tokens.
## Key Use Cases
- Tracking protocol TVL growth and trends over time
- Comparing TVL across different protocols and platforms
- Analyzing protocol adoption and liquidity depth
- Building TVL-based dashboards and metrics
## Commonly-used Fields
- `block_date`: Date of the TVL snapshot
- `tvl_usd`: Total Value Locked in USD
- `protocol`: Name of the DeFi protocol (e.g., Uniswap, Aave)
- `version`: Protocol version (e.g., v2, v3)
- `platform`: Specific deployment or platform identifier
## Sample queries
```sql
-- Latest TVL by protocol
SELECT
protocol,
version,
tvl_usd
FROM <blockchain_name>.defi.ez_protocol_tvl
WHERE block_date = CURRENT_DATE - 1
ORDER BY tvl_usd DESC;
-- Daily TVL trend for a specific protocol in aggregate
SELECT
block_date,
SUM(tvl_usd) AS tvl_usd_total
FROM <blockchain_name>.defi.ez_protocol_tvl
WHERE protocol = 'uniswap'
AND block_date >= CURRENT_DATE - 30
GROUP BY block_date, protocol
ORDER BY block_date DESC;
-- TVL comparison across platforms
SELECT
block_date,
platform,
SUM(tvl_usd) AS total_tvl
FROM <blockchain_name>.defi.ez_protocol_tvl
WHERE block_date >= CURRENT_DATE - 7
GROUP BY block_date, platform
ORDER BY block_date DESC, total_tvl DESC;
```
{% enddocs %}
{% docs ez_protocol_tvl_block_date %}
The date of the daily TVL snapshot.
Example: '2025-06-10'
{% enddocs %}
{% docs ez_protocol_tvl_tvl_usd %}
The total value locked in USD for the protocol on the given date. Values exceeding $1 trillion (1e12) are excluded to filter out erroneous pricing data.
Example: 1500000000
{% enddocs %}
{% docs ez_protocol_tvl_protocol %}
The name of the DeFi protocol.
Example: 'Uniswap'
{% enddocs %}
{% docs ez_protocol_tvl_version %}
The version of the protocol deployment.
Example: 'v3'
{% enddocs %}
{% docs ez_protocol_tvl_platform %}
The specific platform or deployment identifier for the protocol.
Example: 'uniswap-v3-ethereum'
{% enddocs %}

View File

@ -0,0 +1,104 @@
{% docs aave_v1_tvl_table_doc %}
Methodology:
Sums all underlying token balances held by the LendingPoolCore contract + native ETH in the protocol
{% enddocs %}
{% docs aave_v2_tvl_table_doc %}
Methodology:
Sums all underlying token balances held by each aToken contract (+ stkAAVE staking on Ethereum)
{% enddocs %}
{% docs aave_v3_tvl_table_doc %}
Methodology:
Sums totalSupply of each aToken contract
{% enddocs %}
{% docs binance_v1_tvl_table_doc %}
Methodology:
Total supply of wBETH
{% enddocs %}
{% docs curve_v1_tvl_table_doc %}
Methodology:
Sums all token balances held across pool contracts
{% enddocs %}
{% docs etherfi_v1_tvl_table_doc %}
Methodology:
Sums values from protocol oracle (minus looped positions), eUSD supply, BTC product balances (WBTC, LBTC, cbBTC) and ETHFI staking where applicable.
{% enddocs %}
{% docs lido_v1_tvl_table_doc %}
Methodology:
Total pooled assets reported by the Lido staking contracts
{% enddocs %}
{% docs tornado_cash_v1_tvl_table_doc %}
Methodology:
Sums ERC20 token balances + native asset balances across all mixer contracts
{% enddocs %}
{% docs uniswap_v1_tvl_table_doc %}
Methodology:
Sums native ETH balance across all pool contracts, doubled to represent total pool value (all pools are 50/50 ETH-token pairs)
{% enddocs %}
{% docs uniswap_v2_tvl_table_doc %}
Methodology:
Sums getReserves() values for token0 and token1 across all pools where both tokens are verified. This filtering removes spam/low-liquidity pools to provide a more accurate TVL value.
{% enddocs %}
{% docs uniswap_v3_tvl_table_doc %}
Methodology:
Sums token0 and token1 balances held by each pool contract where both tokens are verified. This filtering removes spam/low-liquidity pools to provide a more accurate TVL value.
{% enddocs %}
{% docs uniswap_v4_tvl_table_doc %}
Methodology:
Sums token0 and token1 balances held by the PoolManager singleton + any associated hook contracts where both tokens are verified. This filtering removes spam/low-liquidity pools to provide a more accurate TVL value.
{% enddocs %}
{% docs polymarket_v1_tvl_table_doc %}
Methodology:
Sums USDC balances held by the Conditional Tokens and Collateral Tokens contracts
{% enddocs %}
{% docs aerodrome_v1_tvl_table_doc %}
Methodology:
Sums getReserves() values for token0 and token1 across all AMM pools
{% enddocs %}
{% docs superchain_slipstream_v1_tvl_table_doc %}
Methodology:
Sums token0 and token1 balances held by each Slipstream (CL) pool contract via balanceOf()
{% enddocs %}

View File

@ -33,9 +33,9 @@ FROM
WHERE
modified_timestamp >= (
SELECT
MAX(
coalesce(MAX(
modified_timestamp
)
), '1970-01-01')
FROM
{{ this }}
)

Some files were not shown because too many files have changed in this diff Show More