mirror of
https://github.com/FlipsideCrypto/optimism-models.git
synced 2026-02-06 11:01:44 +00:00
AN-2548/op-ez-dex-swaps (#76)
* created core__ez_dex_swaps view * added synthetix swaps models and adjusted velodrome / sushi models for necessary ez_dex columns * fixed error in velo pools backfill seed causing duplicates * fixed issue with silver prices causing duplicate token_address * added univ3 pools and swaps models for integration into ez_dex_swaps * replaced null event_names with swap * added univ3 to dex_swaps and added not null event name test * updated gitignore for dbt-env * curve pools silver model * added incremental logic to curve pools table * adjusted data type on decimal column * updated curve_pools and added curve_swaps * case when for null event_name * removed dbt-env * snowflake tagging for ez_dex_swaps * added beethoven swaps and pools tables, and joined them to ez_dex_swaps * beethoven pools yml * removed column from synthetix swaps yml * recreated velodrome pools model using the reads udf * change event_name to reference topic * deleted velo_pools_backfill seed and hardcoded function sigs * changed udf_hex_to_int ref to ethereum.public * changed synthetix swaps to reference data instead of event inputs * changed event_input references to data in beethoven models * rounded usd values * modified tx_to logic in curve swaps * modified curve swaps for proper volumes
This commit is contained in:
parent
27f344bbde
commit
4528d47adf
12
data/silver__synthetix_synths.csv
Normal file
12
data/silver__synthetix_synths.csv
Normal file
@ -0,0 +1,12 @@
|
||||
synth_symbol,synth_proxy_address
|
||||
sETH,0xe405de8f52ba7559f9df3c368500b6e6ae6cee49
|
||||
sLINK,0xc5db22719a06418028a40a9b5e9a7c02959d0d08
|
||||
sBTC,0x298b9b95708152ff6968aafd889c6586e9169f1d
|
||||
sUSD,0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9
|
||||
sAAVE,0x00b8d5a5e1ac97cb4341c4bc4367443c8776e8d9
|
||||
sUNI,0xf5a6115aa582fd1beea22bc93b7dc7a785f60d03
|
||||
sEUR,0xfbc4198702e81ae77c06d58f81b629bdf36f0a71
|
||||
sAVAX,0xb2b42b231c68cbb0b4bf2ffebf57782fd97d3da4
|
||||
sMATIC,0x81ddfac111913d3d5218dea999216323b7cd6356
|
||||
sSOL,0x8b2f7ae8ca8ee8428b6d76de88326bb413db2766
|
||||
sINR,0xa3a538ea5d5838dc32dde15946ccd74bdd5652ff
|
||||
|
@ -1,83 +0,0 @@
|
||||
pool_address,pool_name,pool_type,token0_symbol,token1_symbol,token0_address,token1_address,token0_decimals,token1_decimals
|
||||
0x47029bc8f5cbe3b464004e87ef9c9419a48018cd,vAMM-OP/USDC,volatile,OP,USDC,0x4200000000000000000000000000000000000042,0x7f5c764cbc14f9669b88837ca1490cca17c31607,18,6
|
||||
0x3eec44e94ee86ce79f34bb26dc3cdbbee18d6d17,vAMM-WETH/AELIN,volatile,WETH,AELIN,0x4200000000000000000000000000000000000006,0x61baadcf22d2565b0f471b291c475db5555e0b76,18,18
|
||||
0x4c8b195d33c6f95a8262d56ede793611ee7b5aad,vAMM-WBTC/USDC,volatile,WBTC,USDC,0x68f180fcce6836688e9084f035309e29bf0a2095,0x7f5c764cbc14f9669b88837ca1490cca17c31607,8,6
|
||||
0xfc77e39de40e54f820e313039207dc850e4c9e60,vAMM-OP/L2DAO,volatile,OP,L2DAO,0x4200000000000000000000000000000000000042,0xd52f94df742a6f4b4c8b033369fe13a41782bf44,18,18
|
||||
0xcdd41009e74bd1ae4f7b2eecf892e4bc718b9302,vAMM-WETH/OP,volatile,WETH,OP,0x4200000000000000000000000000000000000006,0x4200000000000000000000000000000000000042,18,18
|
||||
0xe47d437252fe9cb5e74396eee63360d8647df25d,vAMM-LYRA/sUSD,volatile,LYRA,sUSD,0x50c5725949a6f0c72e6c4a641f24049a917db0cb,0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9,18,18
|
||||
0x85ff5b70de43fee34f3fa632addd9f76a0f6baa9,vAMM-SNX/sUSD,volatile,SNX,sUSD,0x8700daec35af8ff88c16bdf0418774cb3d7599b4,0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9,18,18
|
||||
0x43ce87a1ad20277b78cae52c7bcd5fc82a297551,vAMM-WETH/DOLA,volatile,WETH,DOLA,0x4200000000000000000000000000000000000006,0x8ae125e8653821e851f12a49f7765db9a9ce7384,18,18
|
||||
0x986d353a3700530be4e75794830f57e657bc68cb,vAMM-FRAX/OP,volatile,FRAX,OP,0x2e3d870790dc77a83dd1d18184acc7439a53f475,0x4200000000000000000000000000000000000042,18,18
|
||||
0x9056eb7ca982a5dd65a584189994e6a27318067d,vAMM-USDC/SNX,volatile,USDC,SNX,0x7f5c764cbc14f9669b88837ca1490cca17c31607,0x8700daec35af8ff88c16bdf0418774cb3d7599b4,6,18
|
||||
0x9355292f66552ea5717b274d27eefc8254011d83,vAMM-THALES/USDC,volatile,THALES,USDC,0x217d47011b23bb961eb6d93ca9945b7501a5bb11,0x7f5c764cbc14f9669b88837ca1490cca17c31607,18,6
|
||||
0x207AddB05C548F262219f6bFC6e11c02d0f7fDbe,sAMM-USDC/LUSD,stable,USDC,LUSD,0x7f5c764cbc14f9669b88837ca1490cca17c31607,0xc40F949F8a4e094D1b49a23ea9241D289B7b2819,6,18
|
||||
0x4F7ebc19844259386DBdDB7b2eB759eeFc6F8353,sAMM-USDC/DAI,stable,USDC,DAI,0x7f5c764cbc14f9669b88837ca1490cca17c31607,0xda10009cbd5d07dd0cecc66161fc93d7c9000da1,6,18
|
||||
0xffb6c35960b23989037c8c391facebc8a17de970,vAMM-WETH/SNX,volatile,WETH,SNX,0x4200000000000000000000000000000000000006,0x8700daec35af8ff88c16bdf0418774cb3d7599b4,18,18
|
||||
0xf8edf2da8fcf610cf77235d3f90cc110723159aa,vAMM-DF/USX,volatile,DF,USX,0x9e5aac1ba1a2e6aed6b32689dfcf62a509ca96f3,0xbfd291da8a403daaf7e5e9dc1ec0aceacd4848b9,18,18
|
||||
0x43C3f2d0aA0EbC433d654BB6ebf67F0C03f8D8d9,vAMM-OP/DAI,volatile,OP,DAI,0x4200000000000000000000000000000000000042,0xda10009cbd5d07dd0cecc66161fc93d7c9000da1,18,18
|
||||
0x6C5019D345Ec05004A7E7B0623A91a0D9B8D590d,sAMM-USDC/DOLA,stable,USDC,DOLA,0x7f5c764cbc14f9669b88837ca1490cca17c31607,0x8ae125e8653821e851f12a49f7765db9a9ce7384,6,18
|
||||
0xFFD74EF185989BFF8752c818A53a47FC45388F08,vAMM-VELO/OP,volatile,VELO,OP,0x3c8b650257cfb5f272f799f5e2b4e65093a11a05,0x4200000000000000000000000000000000000042,18,18
|
||||
0xdee1856d7b75abf4c1bdf986da4e1c6c7864d640,vAMM-LYRA/USDC,volatile,LYRA,USDC,0x50c5725949a6f0c72e6c4a641f24049a917db0cb,0x7f5c764cbc14f9669b88837ca1490cca17c31607,18,6
|
||||
0xd62c9d8a3d4fd98b27caaefe3571782a3af0a737 ,sAMM-USDC/MAI,stable,USDC,MAI,0x7f5c764cbc14f9669b88837ca1490cca17c31607,0xdfa46478f9e5ea86d57387849598dbfb2e964b02,6,18
|
||||
0xAdF902b11e4ad36B227B84d856B229258b0b0465,sAMM-FRAX/USDC,stable,FRAX,USDC,0x2e3d870790dc77a83dd1d18184acc7439a53f475,0x7f5c764cbc14f9669b88837ca1490cca17c31607,18,6
|
||||
0x9c8a59934fba9af82674eff5d13a24e7c7e7a1f1,vAMM-USDC/PERP,volatile,USDC,PERP,0x7f5c764cbc14f9669b88837ca1490cca17c31607,0x9e1028f5f1d5ede59748ffcee5532509976840e0,6,18
|
||||
0x588443c932b45f47e936b969eb5aa6b5fd4f3369,vAMM-HND/USDC,volatile,HND,USDC,0x10010078a54396F62c96dF8532dc2B4847d47ED3,0x7f5c764cbc14f9669b88837ca1490cca17c31607,18,6
|
||||
0x7866C6072B09539fC0FDE82963846b80203d7beb,vAMM-USDC/agEUR,volatile,USDC,agEUR,0x7f5c764cbc14f9669b88837ca1490cca17c31607,0x9485aca5bbbe1667ad97c7fe7c4531a624c8b1ed,6,18
|
||||
0xac49498b97312a6716ef312f389b7e4d183a2a7c,sAMM-FRAX/sUSD,stable,FRAX,sUSD,0x2e3d870790dc77a83dd1d18184acc7439a53f475,0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9,18,18
|
||||
0xe8537b6FF1039CB9eD0B71713f697DDbaDBb717d,vAMM-VELO/USDC,volatile,VELO,USDC,0x3c8b650257cfb5f272f799f5e2b4e65093a11a05,0x7f5c764cbc14f9669b88837ca1490cca17c31607,18,6
|
||||
0x0d693efd716021878d5979fab4cf8f6c1b7ce450,sAMM-sUSD/LUSD,stable,sUSD,LUSD,0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9,0xc40F949F8a4e094D1b49a23ea9241D289B7b2819,18,18
|
||||
0x6fd5bee1ddb4dbbb0b7368b080ab99b8ba765902,sAMM-alETH/WETH,stable,alETH,WETH,0x3E29D3A9316dAB217754d13b28646B76607c5f04,0x4200000000000000000000000000000000000006,18,18
|
||||
0xd3650ab80545c31088f89fb6d16930796758f3c1,vAMM-OP/LYRA,volatile,OP,LYRA,0x4200000000000000000000000000000000000042,0x50c5725949a6f0c72e6c4a641f24049a917db0cb,18,18
|
||||
0xd16232ad60188B68076a235c65d692090caba155,sAMM-USDC/sUSD,stable,USDC,sUSD,0x7f5c764cbc14f9669b88837ca1490cca17c31607,0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9,6,18
|
||||
0x46b8a98d72820e28465a172687af920cc167e587,vAMM-VELO/sUSD,volatile,VELO,sUSD,0x3c8b650257cfb5f272f799f5e2b4e65093a11a05,0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9,18,18
|
||||
0xfdad8f85c0f3895c85301f549d124ce526479bf8,sAMM-WBTC/renBTC,stable,WBTC,renBTC,0x68f180fcce6836688e9084f035309e29bf0a2095,0x85f6583762bc76d775eab9a7456db344f12409f7,8,8
|
||||
0x06141423dcf1a5a4c137039063ac873cdc1e363a,vAMM-VELO/WETH,volatile,VELO,WETH,0x3c8b650257cfb5f272f799f5e2b4e65093a11a05,0x4200000000000000000000000000000000000006,18,18
|
||||
0xe75a3f4bf99882ad9f8aebab2115873315425d00,sAMM-USDC/alUSD,stable,USDC,alUSD,0x7f5c764cbc14f9669b88837ca1490cca17c31607,0xcb8fa9a76b8e203d8c3797bf438d8fb81ea3326a,6,18
|
||||
0xe2ea57fdf87624f4384ef6da5f3844e8e9e5d878,vAMM-FRAX/FXS,volatile,FRAX,FXS,0x2e3d870790dc77a83dd1d18184acc7439a53f475,0x67ccea5bb16181e7b4109c9c2143c24a1c2205be,18,18
|
||||
0x53bea2d15efe344b054e73209455d2b6aa1c9462,vAMM-OP/sUSD,volatile,OP,sUSD,0x4200000000000000000000000000000000000042,0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9,18,18
|
||||
0x051a9a47920a913914a9e6e961a230a2a464eeb2,vAMM-VELO/LYRA,volatile,VELO,LYRA,0x3c8b650257cfb5f272f799f5e2b4e65093a11a05,0x50c5725949a6f0c72e6c4a641f24049a917db0cb,18,18
|
||||
0xec24eb97cec2f0f6a2d61254990b0f163bbbfe1d,sAMM-sUSD/DAI,stable,sUSD,DAI,0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9,0xda10009cbd5d07dd0cecc66161fc93d7c9000da1,18,18
|
||||
0x5edac6b8ea08d535c01981d75b3361481c0ee999,sAMM-USDC/USX,stable,USDC,USX,0x7f5c764cbc14f9669b88837ca1490cca17c31607,0xbfd291da8a403daaf7e5e9dc1ec0aceacd4848b9,6,18
|
||||
0xFd7FddFc0A729eCF45fB6B12fA3B71A575E1966F,sAMM-WETH/sETH,stable,WETH,sETH,0x4200000000000000000000000000000000000006,0xe405de8f52ba7559f9df3c368500b6e6ae6cee49,18,18
|
||||
0x6580c6ee0bb96651be0aa8db382b48ea7acd077d,vAMM-VELO/SNX,volatile,VELO,SNX,0x3c8b650257cfb5f272f799f5e2b4e65093a11a05,0x8700daec35af8ff88c16bdf0418774cb3d7599b4,18,18
|
||||
0x58f98be02c4ffb675af8857013a9c0dfa5750d04,vAMM-WETH/sUSD,volatile,WETH,sUSD,0x4200000000000000000000000000000000000006,0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9,18,18
|
||||
0x79c912FEF520be002c2B6e57EC4324e260f38E50,vAMM-WETH/USDC,volatile,WETH,USDC,0x4200000000000000000000000000000000000006,0x7f5c764cbc14f9669b88837ca1490cca17c31607,18,6
|
||||
0xe8633ce5d216ebfdddf6875067dfb8397dedcaf3,vAMM-OP/USDC,volatile,OP,USDC,0x4200000000000000000000000000000000000042,0x7f5c764cbc14f9669b88837ca1490cca17c31607,18,6
|
||||
0xe08d427724d8a2673fe0be3a81b7db17be835b36,sAMM-USDC/USDT,stable,USDC,USDT,0x7f5c764cbc14f9669b88837ca1490cca17c31607,0x94b008aa00579c1307b0ef2c499ad98a8ce58e58,6,6
|
||||
0x335bd4ffa921160fc86ce3843f80a9941e7456c6,sAMM-VELO/USDC,stable,VELO,USDC,0x3c8b650257cfb5f272f799f5e2b4e65093a11a05,0x7f5c764cbc14f9669b88837ca1490cca17c31607,18,6
|
||||
0x587233ce63d7c1e081ce9d94d9940544758f6d01,sAMM-FRAX/USDC,stable,FRAX,USDC,0x2e3d870790dc77a83dd1d18184acc7439a53f475,0x7f5c764cbc14f9669b88837ca1490cca17c31607,18,6
|
||||
0xc2058aa3b3f96075cc33946bcd1963bfa660315b,sAMM-sUSD/DAI,stable,sUSD,DAI,0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9,0xda10009cbd5d07dd0cecc66161fc93d7c9000da1,18,18
|
||||
0x557949dde71e88cc2f41d33d341ff42417a35a2d,vAMM-VELO/OP,volatile,VELO,OP,0x3c8b650257cfb5f272f799f5e2b4e65093a11a05,0x4200000000000000000000000000000000000042,18,18
|
||||
0x8e6bf020d11e641511bd8b24ee0fab2034e224e5,vAMM-THALES/USDC,volatile,THALES,USDC,0x217d47011b23bb961eb6d93ca9945b7501a5bb11,0x7f5c764cbc14f9669b88837ca1490cca17c31607,18,6
|
||||
0xbe61c199d356d205b3beba3634a7992af5e28631,sAMM-USDC/LUSD,stable,USDC,LUSD,0x7f5c764cbc14f9669b88837ca1490cca17c31607,0xc40F949F8a4e094D1b49a23ea9241D289B7b2819,6,18
|
||||
0x48e18e3d1efa7f0e15f1b2bf01b232534c30a3ef,vAMM-WETH/USDC,volatile,WETH,USDC,0x4200000000000000000000000000000000000006,0x7f5c764cbc14f9669b88837ca1490cca17c31607,18,6
|
||||
0x93fc04cd6d108588ecd844c7d60f46635037b5a3,sAMM-USDC/sUSD,stable,USDC,sUSD,0x7f5c764cbc14f9669b88837ca1490cca17c31607,0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9,6,18
|
||||
0xE1224c055c057cb71E41DaC936BA946f6F500eD1,vAMM-OP/USDT,volatile,OP,USDT,0x4200000000000000000000000000000000000042,0x94b008aa00579c1307b0ef2c499ad98a8ce58e58,18,6
|
||||
0xd04f675127d37bf7b009453116c17b7ef088cceb,vAMM-VELO/DAI,volatile,VELO,DAI,0x3c8b650257cfb5f272f799f5e2b4e65093a11a05,0xda10009cbd5d07dd0cecc66161fc93d7c9000da1,18,18
|
||||
0x534f3135757db41c4f705b0eac697659f68c4014,vAMM-WETH/DAI,volatile,WETH,DAI,0x4200000000000000000000000000000000000006,0xda10009cbd5d07dd0cecc66161fc93d7c9000da1,18,18
|
||||
0x278631efe7e7b4c2ec49927b255c2ca42be2c1b1,vAMM-WETH/OP,volatile,WETH,OP,0x4200000000000000000000000000000000000006,0x4200000000000000000000000000000000000042,18,18
|
||||
0x3e2882ef90fafab1894bec08f57745a0dd63950a,vAMM-VELO/alUSD,volatile,VELO,alUSD,0x3c8b650257cfb5f272f799f5e2b4e65093a11a05,0xcb8fa9a76b8e203d8c3797bf438d8fb81ea3326a,18,18
|
||||
0x265013a5915cebb9344c9e259d531e55855da45d,sAMM-LYRA/sUSD,stable,LYRA,sUSD,0x50c5725949a6f0c72e6c4a641f24049a917db0cb,0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9,18,18
|
||||
0xd52b3eac7ef128b879db10ffbd94e29fe65a34d8,vAMM-alETH/WETH,volatile,alETH,WETH,0x3E29D3A9316dAB217754d13b28646B76607c5f04,0x4200000000000000000000000000000000000006,18,18
|
||||
0xcfcf4bb472aa2ad6c82ebef2377a20829b6356ad,sAMM-VELO/WETH,stable,VELO,WETH,0x3c8b650257cfb5f272f799f5e2b4e65093a11a05,0x4200000000000000000000000000000000000006,18,18
|
||||
0x34bb604e97604533ab9e42a756c3790910caac87,vAMM-WETH/LYRA,volatile,WETH,LYRA,0x4200000000000000000000000000000000000006,0x50c5725949a6f0c72e6c4a641f24049a917db0cb,18,18
|
||||
0x61eba8151880ea81743795faf3e4042b38e8638c,vAMM-sUSD/sETH,volatile,sUSD,sETH,0x50c5725949a6f0c72e6c4a641f24049a917db0cb,0xe405de8f52ba7559f9df3c368500b6e6ae6cee49,18,18
|
||||
0x49b5c691685aaeeaaaff57ab6ccef081a165f5bb,vAMM-alETH/OP,volatile,alETH,OP,0x3E29D3A9316dAB217754d13b28646B76607c5f04,0x4200000000000000000000000000000000000042,18,18
|
||||
0xb840adae1a31b52778188b9e948fc79a4bc99d44,sAMM-SNX/sUSD,stable,SNX,sUSD,0x8700daec35af8ff88c16bdf0418774cb3d7599b4,0x50c5725949a6f0c72e6c4a641f24049a917db0cb,18,18
|
||||
0x078f65c0e854ab7fa3baa2cff62a4f9cb4031382,vAMM-USDC/DAI,volatile,USDC,DAI,0x7f5c764cbc14f9669b88837ca1490cca17c31607,0xda10009cbd5d07dd0cecc66161fc93d7c9000da1,6,18
|
||||
0x78fa29412998acedd7728b4cf5623ee5e2f8f589,vAMM-OP/alUSD,volatile,OP,alUSD,0x4200000000000000000000000000000000000042,0xcb8fa9a76b8e203d8c3797bf438d8fb81ea3326a,18,18
|
||||
0x3bbde95b1ed19f8d76252d0b48854d9eaaec3cef,vAMM-TAROT/USDC,volatile,TAROT,USDC,0x375488f097176507e39b9653b88fdc52cde736bf,0x7f5c764cbc14f9669b88837ca1490cca17c31607,18,6
|
||||
0xc0d2e721d3d93578f3528d3bedac9a42120aeef7,vAMM-POOL/WETH,volatile,POOL,WETH,0x395ae52bb17aef68c2888d941736a71dc6d4e125,0x4200000000000000000000000000000000000006,18,18
|
||||
0xf8ae1a9ff9f853a7837c251f09befd43abebcf90,vAMM-sETHo/pETHo,volatile,sETHo,pETHo,0x09448876068907827ec15f49a8f1a58c70b04d45,0x6ca558bd3eab53da1b25ab97916dd14bf6cfee4e,18,18
|
||||
0x43e8e67a6e59b372be0d8af48742991b2ae7a2a2,vAMM-SEED/OP,volatile,SEED,OP,0x1ad0abe4fd37e8f1e1b0a018425b5e4eae703304,0x4200000000000000000000000000000000000042,18,18
|
||||
0xaee6477fab80a73abfdab05dab59761fddc0e826,vAMM-SEED-TEST/OP,volatile,SEED-TEST,OP,0x17bcc8f26d44ecfa5f56abebe4ac8bc0ab71069a,0x4200000000000000000000000000000000000042,18,18
|
||||
0x74f66d886f85f424bdd8045c5772c98af84340ff,vAMM-TT/OP,volatile,TT,OP,0x1ce444cd37ddbff1ab6a901140d8a5ad3e810118,0x4200000000000000000000000000000000000042,18,18
|
||||
0xd0223f10f3e71ba8af6861f39272f2ac21b5aba5,vAMM-OP/SS,volatile,OP,SS,0x4200000000000000000000000000000000000042,0x8ff13f65f9f0e0b70bf0b15d1d4a5d808c571511,18,18
|
||||
0x651ea5496b6e36120f9bf020ec0ea5cfd31c529c,vAMM-PREMIA/WETH,volatile,PREMIA,WETH,0x374ad0f47f4ca39c78e5cc54f1c9e426ff8f231a,0x4200000000000000000000000000000000000006,18,18
|
||||
0x47bc0bdc420475f713ce099647f967f636b1cf70,vAMM-OP/SSHARE-TEST,volatile,OP,SSHARE-TEST,0x4200000000000000000000000000000000000042,0x66bdc9ab6cb33d9cfbe05cc3d3eea69bbd92ae35,18,18
|
||||
0x9629a694c041f3b10ce974dc37ef4dd4596c4f54,vAMM-sETHo/WETH,volatile,sETHo,WETH,0x09448876068907827ec15f49a8f1a58c70b04d45,0x4200000000000000000000000000000000000006,18,18
|
||||
0xcd897440484280c5e0d574cf8e61a67c7e6981ac,vAMM-sETHo/WETH,volatile,sETHo,WETH,0x09448876068907827ec15f49a8f1a58c70b04d45,0x4200000000000000000000000000000000000006,18,18
|
||||
0x657e6eebd71ac90a91173b786c099e71e37a75ff,vAMM-UNLOCK/USDC,volatile,UNLOCK,USDC,0x7ae97042a4a0eb4d1eb370c34bfec71042a056b7,0x7f5c764cbc14f9669b88837ca1490cca17c31607,18,6
|
||||
0x3bbde95b1ed19f8d76252d0b48854d9eaaec3cef,vAMM-TAROT/USDC,volatile,TAROT,USDC,0x375488f097176507e39b9653b88fdc52cde736bf,0x7f5c764cbc14f9669b88837ca1490cca17c31607,18,6
|
||||
0xe957ac5fc6b93227bf7fe0b32798e58b7a044252,vAMM-OP/SSHARE,volatile,OP,SSHARE,0x4200000000000000000000000000000000000042,0x74af59598ec0c1771d0a7797eba4a2c073d8d253,18,18
|
||||
0xd2d631d8d887e3d18a623e8eb9e4f9ca97b3372a,vAMM-USDT/MYERC20,volatile,USDT,MYERC20,0x94b008aa00579c1307b0ef2c499ad98a8ce58e58,0x9a45dc286b8b9e1429a312220685529e6a32702c,6,18
|
||||
|
@ -29,7 +29,7 @@ tests:
|
||||
|
||||
on-run-start:
|
||||
- "{{ create_sps() }}"
|
||||
- "{{ create_udfs() }}"
|
||||
# - "{{ create_udfs() }}"
|
||||
|
||||
on-run-end:
|
||||
- '{{ apply_meta_as_tags(results) }}'
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,13 +1,8 @@
|
||||
{% macro create_udfs() %}
|
||||
{% if var("UPDATE_UDFS_AND_SPS") %}
|
||||
{% set sql %}
|
||||
CREATE schema if NOT EXISTS silver;
|
||||
{{ create_js_hex_to_int() }};
|
||||
{{ create_udf_hex_to_int(
|
||||
schema = "public"
|
||||
) }}
|
||||
|
||||
{% endset %}
|
||||
{% do run_query(sql) %}
|
||||
{% endif %}
|
||||
{% endmacro %}
|
||||
-- {% macro create_udfs() %}
|
||||
-- {% if var("UPDATE_UDFS_AND_SPS") %}
|
||||
-- {% set sql %}
|
||||
-- CREATE schema if NOT EXISTS silver;
|
||||
-- {% endset %}
|
||||
-- {% do run_query(sql) %}
|
||||
-- {% endif %}
|
||||
-- {% endmacro %}
|
||||
|
||||
@ -1,6 +0,0 @@
|
||||
{% macro create_js_hex_to_int() %}
|
||||
CREATE
|
||||
OR REPLACE FUNCTION {{ target.schema }}.js_hex_to_int (
|
||||
s STRING
|
||||
) returns DOUBLE LANGUAGE javascript AS 'if (S !== null) { yourNumber = parseInt(S, 16); } return yourNumber'
|
||||
{% endmacro %}
|
||||
@ -1,21 +0,0 @@
|
||||
{% macro create_udf_hex_to_int(schema) %}
|
||||
create or replace function {{ schema }}.udf_hex_to_int(hex string)
|
||||
returns string
|
||||
language python
|
||||
runtime_version = '3.8'
|
||||
handler = 'hex_to_int'
|
||||
as
|
||||
$$
|
||||
def hex_to_int(hex) -> str:
|
||||
"""
|
||||
Converts hex (of any size) to int (as a string). Snowflake and java script can only handle up to 64-bit (38 digits of precision)
|
||||
select hex_to_int('200000000000000000000000000000211');
|
||||
>> 680564733841876926926749214863536423441
|
||||
select hex_to_int('0x200000000000000000000000000000211');
|
||||
>> 680564733841876926926749214863536423441
|
||||
select hex_to_int(NULL);
|
||||
>> NULL
|
||||
"""
|
||||
return str(int(hex, 16)) if hex else None
|
||||
$$;
|
||||
{% endmacro %}
|
||||
@ -0,0 +1,6 @@
|
||||
{% docs eth_ez_dex_swaps_table_doc %}
|
||||
|
||||
This table currently contains swap events from the ```fact_event_logs``` table for Velodrome and SushiSwap along with other helpful columns including an amount USD where possible. Other dexes coming soon!
|
||||
Note: A rule has been put in place to null out the amount_USD if that number is too divergent between amount_in_USD and amount_out_usd. This can happen for swaps of less liquid tokens during very high fluctuation of price.
|
||||
|
||||
{% enddocs %}
|
||||
@ -58,8 +58,6 @@ The dimension tables are sourced from a variety of on-chain and off-chain source
|
||||
|
||||
Convenience views (denoted ez_) are a combination of different fact and dimension tables.
|
||||
|
||||
A user-defined-function (UDF) is available to decode hex encoded values to integers in this database. You can call this UDF by using `optimism.public.udf_hex_to_int(FIELD)`.
|
||||
|
||||
|
||||
## **Using dbt docs**
|
||||
### Navigation
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
{% docs opt_traces_table_doc %}
|
||||
|
||||
This table contains flattened trace data for internal contract calls on the Optimism Blockchain. Hex encoded fields can be decoded to integers by using `ethereum.public.udf_hex_to_int()`.
|
||||
This table contains flattened trace data for internal contract calls on the Optimism Blockchain. Hex encoded fields can be decoded to integers by using `ethereum.ethereum.public.udf_hex_to_int()`.
|
||||
|
||||
{% enddocs %}
|
||||
372
models/gold/dex/core__ez_dex_swaps.sql
Normal file
372
models/gold/dex/core__ez_dex_swaps.sql
Normal file
@ -0,0 +1,372 @@
|
||||
{{ config(
|
||||
materialized = 'view',
|
||||
persist_docs ={ "relation": true,
|
||||
"columns": true },
|
||||
meta={
|
||||
'database_tags':{
|
||||
'table': {
|
||||
'PROTOCOL': 'SUSHI, UNISWAP, CURVE, SYNTHETIX, VELODROME',
|
||||
'PURPOSE': 'DEX, SWAPS'
|
||||
}
|
||||
}
|
||||
}
|
||||
) }}
|
||||
|
||||
WITH velodrome_swaps AS (
|
||||
|
||||
SELECT
|
||||
block_number,
|
||||
block_timestamp,
|
||||
tx_hash,
|
||||
origin_function_signature,
|
||||
origin_from_address,
|
||||
origin_to_address,
|
||||
contract_address,
|
||||
pool_name,
|
||||
CASE
|
||||
WHEN event_name IS NULL THEN 'Swap'
|
||||
ELSE event_name
|
||||
END AS event_name,
|
||||
amount_in,
|
||||
amount_in_usd,
|
||||
amount_out,
|
||||
amount_out_usd,
|
||||
sender_address AS sender,
|
||||
to_address AS tx_to,
|
||||
event_index,
|
||||
platform,
|
||||
token_address_in AS token_in,
|
||||
token_address_out AS token_out,
|
||||
symbol_in,
|
||||
symbol_out,
|
||||
_log_id
|
||||
FROM
|
||||
{{ ref('velodrome__ez_swaps') }}
|
||||
),
|
||||
sushi_swaps AS (
|
||||
SELECT
|
||||
block_number,
|
||||
block_timestamp,
|
||||
tx_hash,
|
||||
origin_function_signature,
|
||||
origin_from_address,
|
||||
origin_to_address,
|
||||
contract_address,
|
||||
pool_name,
|
||||
CASE
|
||||
WHEN event_name IS NULL THEN 'Swap'
|
||||
ELSE event_name
|
||||
END AS event_name,
|
||||
amount_in,
|
||||
amount_in_usd,
|
||||
amount_out,
|
||||
amount_out_usd,
|
||||
origin_from_address AS sender,
|
||||
tx_to,
|
||||
event_index,
|
||||
platform,
|
||||
token_in,
|
||||
token_out,
|
||||
symbol_in,
|
||||
symbol_out,
|
||||
_log_id
|
||||
FROM
|
||||
{{ ref('sushi__ez_swaps') }}
|
||||
),
|
||||
synthetix_swaps AS (
|
||||
SELECT
|
||||
block_number,
|
||||
block_timestamp,
|
||||
tx_hash,
|
||||
origin_function_signature,
|
||||
origin_from_address,
|
||||
origin_to_address,
|
||||
contract_address,
|
||||
pool_name,
|
||||
CASE
|
||||
WHEN event_name IS NULL THEN 'Swap'
|
||||
ELSE event_name
|
||||
END AS event_name,
|
||||
amount_in,
|
||||
amount_in_usd,
|
||||
amount_out,
|
||||
amount_out_usd,
|
||||
sender,
|
||||
tx_to,
|
||||
event_index,
|
||||
platform,
|
||||
token_in,
|
||||
token_out,
|
||||
symbol_in,
|
||||
symbol_out,
|
||||
_log_id
|
||||
FROM
|
||||
{{ ref('silver_dex__synthetix_swaps') }}
|
||||
),
|
||||
univ3_swaps AS (
|
||||
SELECT
|
||||
block_number,
|
||||
block_timestamp,
|
||||
tx_hash,
|
||||
origin_function_signature,
|
||||
origin_from_address,
|
||||
origin_to_address,
|
||||
pool_address AS contract_address,
|
||||
pool_name,
|
||||
'Swap' AS event_name,
|
||||
CASE
|
||||
WHEN amount0_unadj > 0 THEN ABS(amount0_adjusted)
|
||||
ELSE ABS(amount1_adjusted)
|
||||
END AS amount_in,
|
||||
CASE
|
||||
WHEN amount0_unadj > 0 THEN ABS(amount0_usd)
|
||||
ELSE ABS(amount1_usd)
|
||||
END AS amount_in_usd,
|
||||
CASE
|
||||
WHEN amount0_unadj < 0 THEN ABS(amount0_adjusted)
|
||||
ELSE ABS(amount1_adjusted)
|
||||
END AS amount_out,
|
||||
CASE
|
||||
WHEN amount0_unadj < 0 THEN ABS(amount0_usd)
|
||||
ELSE ABS(amount1_usd)
|
||||
END AS amount_out_usd,
|
||||
sender,
|
||||
recipient AS tx_to,
|
||||
event_index,
|
||||
'uniswap-v3' AS platform,
|
||||
CASE
|
||||
WHEN amount0_unadj > 0 THEN token0_address
|
||||
ELSE token1_address
|
||||
END AS token_in,
|
||||
CASE
|
||||
WHEN amount0_unadj < 0 THEN token0_address
|
||||
ELSE token1_address
|
||||
END AS token_out,
|
||||
CASE
|
||||
WHEN amount0_unadj > 0 THEN token0_symbol
|
||||
ELSE token1_symbol
|
||||
END AS symbol_in,
|
||||
CASE
|
||||
WHEN amount0_unadj < 0 THEN token0_symbol
|
||||
ELSE token1_symbol
|
||||
END AS symbol_out,
|
||||
_log_id
|
||||
FROM
|
||||
{{ ref('silver_dex__univ3_swaps') }}
|
||||
),
|
||||
curve_swaps AS (
|
||||
SELECT
|
||||
block_number,
|
||||
block_timestamp,
|
||||
tx_hash,
|
||||
origin_function_signature,
|
||||
origin_from_address,
|
||||
origin_to_address,
|
||||
contract_address,
|
||||
pool_name,
|
||||
CASE
|
||||
WHEN event_name IS NULL THEN 'Swap'
|
||||
ELSE event_name
|
||||
END AS event_name,
|
||||
amount_in,
|
||||
amount_in_usd,
|
||||
amount_out,
|
||||
amount_out_usd,
|
||||
sender,
|
||||
tx_to,
|
||||
event_index,
|
||||
platform,
|
||||
token_in,
|
||||
token_out,
|
||||
symbol_in,
|
||||
symbol_out,
|
||||
_log_id
|
||||
FROM
|
||||
{{ ref('silver_dex__curve_swaps') }}
|
||||
),
|
||||
beethovenx_swaps AS (
|
||||
SELECT
|
||||
block_number,
|
||||
block_timestamp,
|
||||
tx_hash,
|
||||
origin_function_signature,
|
||||
origin_from_address,
|
||||
origin_to_address,
|
||||
contract_address,
|
||||
pool_name,
|
||||
CASE
|
||||
WHEN event_name IS NULL THEN 'Swap'
|
||||
ELSE event_name
|
||||
END AS event_name,
|
||||
amount_in,
|
||||
amount_in_usd,
|
||||
amount_out,
|
||||
amount_out_usd,
|
||||
sender,
|
||||
tx_to,
|
||||
event_index,
|
||||
platform,
|
||||
token_in,
|
||||
token_out,
|
||||
symbol_in,
|
||||
symbol_out,
|
||||
_log_id
|
||||
FROM
|
||||
{{ ref('silver_dex__beethovenx_swaps') }}
|
||||
)
|
||||
|
||||
SELECT
|
||||
block_number,
|
||||
block_timestamp,
|
||||
tx_hash,
|
||||
origin_function_signature,
|
||||
origin_from_address,
|
||||
origin_to_address,
|
||||
contract_address,
|
||||
pool_name,
|
||||
event_name,
|
||||
amount_in,
|
||||
amount_in_usd,
|
||||
amount_out,
|
||||
amount_out_usd,
|
||||
sender,
|
||||
tx_to,
|
||||
event_index,
|
||||
platform,
|
||||
token_in,
|
||||
token_out,
|
||||
symbol_in,
|
||||
symbol_out,
|
||||
_log_id
|
||||
FROM
|
||||
velodrome_swaps
|
||||
UNION ALL
|
||||
SELECT
|
||||
block_number,
|
||||
block_timestamp,
|
||||
tx_hash,
|
||||
origin_function_signature,
|
||||
origin_from_address,
|
||||
origin_to_address,
|
||||
contract_address,
|
||||
pool_name,
|
||||
event_name,
|
||||
amount_in,
|
||||
amount_in_usd,
|
||||
amount_out,
|
||||
amount_out_usd,
|
||||
sender,
|
||||
tx_to,
|
||||
event_index,
|
||||
platform,
|
||||
token_in,
|
||||
token_out,
|
||||
symbol_in,
|
||||
symbol_out,
|
||||
_log_id
|
||||
FROM
|
||||
sushi_swaps
|
||||
UNION ALL
|
||||
SELECT
|
||||
block_number,
|
||||
block_timestamp,
|
||||
tx_hash,
|
||||
origin_function_signature,
|
||||
origin_from_address,
|
||||
origin_to_address,
|
||||
contract_address,
|
||||
pool_name,
|
||||
event_name,
|
||||
amount_in,
|
||||
amount_in_usd,
|
||||
amount_out,
|
||||
amount_out_usd,
|
||||
sender,
|
||||
tx_to,
|
||||
event_index,
|
||||
platform,
|
||||
token_in,
|
||||
token_out,
|
||||
symbol_in,
|
||||
symbol_out,
|
||||
_log_id
|
||||
FROM
|
||||
synthetix_swaps
|
||||
UNION ALL
|
||||
SELECT
|
||||
block_number,
|
||||
block_timestamp,
|
||||
tx_hash,
|
||||
origin_function_signature,
|
||||
origin_from_address,
|
||||
origin_to_address,
|
||||
contract_address,
|
||||
pool_name,
|
||||
event_name,
|
||||
amount_in,
|
||||
amount_in_usd,
|
||||
amount_out,
|
||||
amount_out_usd,
|
||||
sender,
|
||||
tx_to,
|
||||
event_index,
|
||||
platform,
|
||||
token_in,
|
||||
token_out,
|
||||
symbol_in,
|
||||
symbol_out,
|
||||
_log_id
|
||||
FROM
|
||||
univ3_swaps
|
||||
UNION ALL
|
||||
SELECT
|
||||
block_number,
|
||||
block_timestamp,
|
||||
tx_hash,
|
||||
origin_function_signature,
|
||||
origin_from_address,
|
||||
origin_to_address,
|
||||
contract_address,
|
||||
pool_name,
|
||||
event_name,
|
||||
amount_in,
|
||||
amount_in_usd,
|
||||
amount_out,
|
||||
amount_out_usd,
|
||||
sender,
|
||||
tx_to,
|
||||
event_index,
|
||||
platform,
|
||||
token_in,
|
||||
token_out,
|
||||
symbol_in,
|
||||
symbol_out,
|
||||
_log_id
|
||||
FROM
|
||||
curve_swaps
|
||||
UNION ALL
|
||||
SELECT
|
||||
block_number,
|
||||
block_timestamp,
|
||||
tx_hash,
|
||||
origin_function_signature,
|
||||
origin_from_address,
|
||||
origin_to_address,
|
||||
contract_address,
|
||||
pool_name,
|
||||
event_name,
|
||||
amount_in,
|
||||
amount_in_usd,
|
||||
amount_out,
|
||||
amount_out_usd,
|
||||
sender,
|
||||
tx_to,
|
||||
event_index,
|
||||
platform,
|
||||
token_in,
|
||||
token_out,
|
||||
symbol_in,
|
||||
symbol_out,
|
||||
_log_id
|
||||
FROM
|
||||
beethovenx_swaps
|
||||
152
models/gold/dex/core__ez_dex_swaps.yml
Normal file
152
models/gold/dex/core__ez_dex_swaps.yml
Normal file
@ -0,0 +1,152 @@
|
||||
version: 2
|
||||
models:
|
||||
- name: core__ez_dex_swaps
|
||||
description: '{{ doc("eth_ez_dex_swaps_table_doc") }}'
|
||||
|
||||
tests:
|
||||
- dbt_utils.unique_combination_of_columns:
|
||||
combination_of_columns:
|
||||
- _LOG_ID
|
||||
columns:
|
||||
- name: BLOCK_NUMBER
|
||||
description: '{{ doc("opt_block_number") }}'
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- NUMBER
|
||||
- FLOAT
|
||||
- name: BLOCK_TIMESTAMP
|
||||
description: '{{ doc("opt_block_timestamp") }}'
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_row_values_to_have_recent_data:
|
||||
datepart: day
|
||||
interval: 1
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- TIMESTAMP_NTZ
|
||||
- name: TX_HASH
|
||||
description: '{{ doc("opt_logs_tx_hash") }}'
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_match_regex:
|
||||
regex: 0[xX][0-9a-fA-F]+
|
||||
- name: CONTRACT_ADDRESS
|
||||
description: '{{ doc("opt_logs_contract_address") }}'
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_match_regex:
|
||||
regex: 0[xX][0-9a-fA-F]+
|
||||
- name: EVENT_NAME
|
||||
description: '{{ doc("opt_event_name") }}'
|
||||
tests:
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- STRING
|
||||
- VARCHAR
|
||||
- not_null
|
||||
- name: AMOUNT_IN
|
||||
description: '{{ doc("eth_dex_swaps_amount_in") }}'
|
||||
tests:
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- NUMBER
|
||||
- FLOAT
|
||||
- name: AMOUNT_OUT
|
||||
description: '{{ doc("eth_dex_swaps_amount_out") }}'
|
||||
tests:
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- NUMBER
|
||||
- FLOAT
|
||||
- name: AMOUNT_IN_USD
|
||||
description: '{{ doc("eth_dex_swaps_amount_in_usd") }}'
|
||||
tests:
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- NUMBER
|
||||
- FLOAT
|
||||
- name: AMOUNT_OUT_USD
|
||||
description: '{{ doc("eth_dex_swaps_amount_out_usd") }}'
|
||||
tests:
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- NUMBER
|
||||
- FLOAT
|
||||
- name: TOKEN_IN
|
||||
description: '{{ doc("eth_dex_swaps_token_in") }}'
|
||||
tests:
|
||||
- not_null:
|
||||
where: PLATFORM <> 'uniswap-v3'
|
||||
- dbt_expectations.expect_column_values_to_match_regex:
|
||||
regex: 0[xX][0-9a-fA-F]+
|
||||
- name: TOKEN_OUT
|
||||
description: '{{ doc("eth_dex_swaps_token_out") }}'
|
||||
tests:
|
||||
- not_null:
|
||||
where: PLATFORM <> 'uniswap-v3'
|
||||
- dbt_expectations.expect_column_values_to_match_regex:
|
||||
regex: 0[xX][0-9a-fA-F]+
|
||||
- name: SYMBOL_IN
|
||||
description: '{{ doc("eth_dex_swaps_symbol_in") }}'
|
||||
tests:
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- STRING
|
||||
- VARCHAR
|
||||
- name: SYMBOL_OUT
|
||||
description: '{{ doc("eth_dex_swaps_symbol_out") }}'
|
||||
tests:
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- STRING
|
||||
- VARCHAR
|
||||
- name: SENDER
|
||||
description: '{{ doc("eth_dex_swaps_sender") }}'
|
||||
tests:
|
||||
- not_null:
|
||||
where: BLOCK_TIMESTAMP > '2021-08-01'
|
||||
- dbt_expectations.expect_column_values_to_match_regex:
|
||||
regex: 0[xX][0-9a-fA-F]+
|
||||
- name: TX_TO
|
||||
description: '{{ doc("eth_dex_swaps_tx_to") }}'
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_match_regex:
|
||||
regex: 0[xX][0-9a-fA-F]+
|
||||
enabled: False
|
||||
- name: PLATFORM
|
||||
description: '{{ doc("eth_dex_platform") }}'
|
||||
tests:
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- STRING
|
||||
- VARCHAR
|
||||
- name: EVENT_INDEX
|
||||
description: '{{ doc("opt_event_index") }}'
|
||||
tests:
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- NUMBER
|
||||
- FLOAT
|
||||
- name: _LOG_ID
|
||||
description: '{{ doc("opt_log_id_events") }}'
|
||||
tests:
|
||||
- not_null
|
||||
- name: ORIGIN_FUNCTION_SIGNATURE
|
||||
description: '{{ doc("opt_tx_origin_sig") }}'
|
||||
tests:
|
||||
- not_null
|
||||
- name: ORIGIN_FROM_ADDRESS
|
||||
description: '{{ doc("opt_origin_from") }}'
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_match_regex:
|
||||
regex: 0[xX][0-9a-fA-F]+
|
||||
- name: ORIGIN_TO_ADDRESS
|
||||
description: '{{ doc("opt_origin_to") }}'
|
||||
tests:
|
||||
- dbt_expectations.expect_column_values_to_match_regex:
|
||||
regex: 0[xX][0-9a-fA-F]+
|
||||
|
||||
154
models/silver/dex/silver_dex__beethovenx_pools.sql
Normal file
154
models/silver/dex/silver_dex__beethovenx_pools.sql
Normal file
@ -0,0 +1,154 @@
|
||||
{{ config(
|
||||
materialized = 'incremental',
|
||||
unique_key = "pool_address",
|
||||
) }}
|
||||
|
||||
WITH pool_creation AS (
|
||||
|
||||
SELECT
|
||||
tx_hash,
|
||||
topics [1] :: STRING AS pool_id,
|
||||
SUBSTR(topics [1] :: STRING,1,42) AS pool_address,
|
||||
block_number,
|
||||
_inserted_timestamp
|
||||
FROM
|
||||
{{ ref('silver__logs') }}
|
||||
WHERE
|
||||
topics[0]::STRING = '0x3c13bc30b8e878c53fd2a36b679409c073afd75950be43d8858768e956fbc20e'
|
||||
AND contract_address = '0xba12222222228d8ba445958a75a0704d566bf2c8'
|
||||
{% if is_incremental() %}
|
||||
AND pool_address NOT IN (
|
||||
SELECT
|
||||
DISTINCT pool_address
|
||||
FROM
|
||||
{{ this }}
|
||||
)
|
||||
{% endif %}
|
||||
|
||||
),
|
||||
|
||||
function_sigs AS (
|
||||
|
||||
SELECT
|
||||
'0x06fdde03' AS function_sig,
|
||||
'name' AS function_name
|
||||
UNION ALL
|
||||
SELECT
|
||||
'0x95d89b41' AS function_sig,
|
||||
'symbol' AS function_name
|
||||
UNION ALL
|
||||
SELECT
|
||||
'0x313ce567' AS function_sig,
|
||||
'decimals' AS function_name
|
||||
),
|
||||
|
||||
inputs_pools AS (
|
||||
|
||||
SELECT
|
||||
pool_address,
|
||||
block_number,
|
||||
function_sig,
|
||||
(ROW_NUMBER() OVER (PARTITION BY pool_address
|
||||
ORDER BY block_number)) - 1 AS function_input
|
||||
FROM pool_creation
|
||||
JOIN function_sigs ON 1=1
|
||||
),
|
||||
|
||||
ready_reads_pools AS (
|
||||
SELECT
|
||||
pool_address,
|
||||
block_number,
|
||||
function_sig,
|
||||
function_input,
|
||||
CONCAT(
|
||||
'[\'',
|
||||
pool_address,
|
||||
'\',',
|
||||
block_number,
|
||||
',\'',
|
||||
function_sig,
|
||||
'\',\'',
|
||||
function_input,
|
||||
'\']'
|
||||
) AS read_input
|
||||
FROM inputs_pools
|
||||
),
|
||||
|
||||
batch_reads_pools AS (
|
||||
|
||||
SELECT
|
||||
CONCAT('[', LISTAGG(read_input, ','), ']') AS batch_read
|
||||
FROM
|
||||
ready_reads_pools
|
||||
),
|
||||
|
||||
pool_token_reads AS (
|
||||
|
||||
SELECT
|
||||
ethereum.streamline.udf_json_rpc_read_calls(
|
||||
node_url,
|
||||
headers,
|
||||
PARSE_JSON(batch_read)
|
||||
) AS read_output,
|
||||
SYSDATE() AS _inserted_timestamp
|
||||
FROM
|
||||
batch_reads_pools
|
||||
JOIN streamline.crosschain.node_mapping ON 1=1
|
||||
AND chain = 'optimism'
|
||||
WHERE
|
||||
EXISTS (
|
||||
SELECT
|
||||
1
|
||||
FROM
|
||||
ready_reads_pools
|
||||
LIMIT
|
||||
1
|
||||
)
|
||||
),
|
||||
|
||||
reads_adjusted AS (
|
||||
|
||||
SELECT
|
||||
VALUE :id :: STRING AS read_id,
|
||||
VALUE :result :: STRING AS read_result,
|
||||
SPLIT(
|
||||
read_id,
|
||||
'-'
|
||||
) AS read_id_object,
|
||||
read_id_object [0] :: STRING AS pool_address,
|
||||
read_id_object [1] :: STRING AS block_number,
|
||||
read_id_object [2] :: STRING AS function_sig,
|
||||
read_id_object [3] :: STRING AS function_input,
|
||||
_inserted_timestamp
|
||||
FROM
|
||||
pool_token_reads,
|
||||
LATERAL FLATTEN(
|
||||
input => read_output [0] :data
|
||||
)
|
||||
),
|
||||
|
||||
pool_details AS (
|
||||
|
||||
SELECT
|
||||
pool_address,
|
||||
function_sig,
|
||||
function_name,
|
||||
read_result,
|
||||
regexp_substr_all(SUBSTR(read_result, 3, len(read_result)), '.{64}') AS segmented_output,
|
||||
_inserted_timestamp
|
||||
FROM reads_adjusted
|
||||
LEFT JOIN function_sigs USING(function_sig)
|
||||
)
|
||||
|
||||
SELECT
|
||||
pool_address,
|
||||
MIN(CASE WHEN function_name = 'symbol' THEN TRY_HEX_DECODE_STRING(segmented_output [2] :: STRING) END) AS pool_symbol,
|
||||
MIN(CASE WHEN function_name = 'name' THEN TRY_HEX_DECODE_STRING(segmented_output [2] :: STRING) END) AS pool_name,
|
||||
MIN(CASE
|
||||
WHEN read_result::STRING = '0x' THEN NULL
|
||||
ELSE ethereum.public.udf_hex_to_int(read_result::STRING)
|
||||
END)::INTEGER AS pool_decimals,
|
||||
MAX(_inserted_timestamp) AS _inserted_timestamp
|
||||
FROM pool_details
|
||||
GROUP BY 1
|
||||
|
||||
29
models/silver/dex/silver_dex__beethovenx_pools.yml
Normal file
29
models/silver/dex/silver_dex__beethovenx_pools.yml
Normal file
@ -0,0 +1,29 @@
|
||||
version: 2
|
||||
models:
|
||||
- name: silver_dex__beethovenx_pools
|
||||
tests:
|
||||
- dbt_utils.unique_combination_of_columns:
|
||||
combination_of_columns:
|
||||
- POOL_ADDRESS
|
||||
columns:
|
||||
- name: POOL_ADDRESS
|
||||
tests:
|
||||
- not_null
|
||||
- name: POOL_SYMBOL
|
||||
tests:
|
||||
- not_null
|
||||
- name: POOL_NAME
|
||||
tests:
|
||||
- not_null
|
||||
- name: POOL_DECIMALS
|
||||
tests:
|
||||
- not_null
|
||||
- name: _INSERTED_TIMESTAMP
|
||||
tests:
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- TIMESTAMP_NTZ
|
||||
|
||||
|
||||
|
||||
|
||||
173
models/silver/dex/silver_dex__beethovenx_swaps.sql
Normal file
173
models/silver/dex/silver_dex__beethovenx_swaps.sql
Normal file
@ -0,0 +1,173 @@
|
||||
{{ config(
|
||||
materialized = 'incremental',
|
||||
unique_key = '_log_id',
|
||||
cluster_by = ['block_timestamp::DATE']
|
||||
) }}
|
||||
|
||||
WITH pool_name AS (
|
||||
|
||||
SELECT
|
||||
CONCAT(pool_name,' (',pool_symbol,')') AS pool_name,
|
||||
pool_address
|
||||
FROM
|
||||
{{ ref('silver_dex__beethovenx_pools') }}
|
||||
),
|
||||
swaps_base AS (
|
||||
SELECT
|
||||
tx_hash,
|
||||
block_number,
|
||||
block_timestamp,
|
||||
origin_function_signature,
|
||||
origin_from_address,
|
||||
origin_to_address,
|
||||
contract_address,
|
||||
_inserted_timestamp,
|
||||
event_name,
|
||||
event_index,
|
||||
regexp_substr_all(SUBSTR(DATA, 3, len(DATA)), '.{64}') AS segmented_data,
|
||||
(CASE
|
||||
WHEN segmented_data [0] = '0x' THEN NULL
|
||||
ELSE ethereum.public.udf_hex_to_int(
|
||||
segmented_data [0] :: STRING
|
||||
)
|
||||
END) :: INTEGER AS amount_in_unadj,
|
||||
(CASE
|
||||
WHEN segmented_data [1] = '0x' THEN NULL
|
||||
ELSE ethereum.public.udf_hex_to_int(
|
||||
segmented_data [1] :: STRING
|
||||
)
|
||||
END) :: INTEGER AS amount_out_unadj,
|
||||
topics [1] :: STRING AS pool_id,
|
||||
CONCAT('0x', SUBSTR(topics [2] :: STRING, 27, 40)) AS token_in,
|
||||
CONCAT('0x', SUBSTR(topics [3] :: STRING, 27, 40)) AS token_out,
|
||||
SUBSTR(topics [1] :: STRING,1,42) AS pool_address,
|
||||
_log_id,
|
||||
ingested_at,
|
||||
'beethoven-x' AS platform,
|
||||
origin_from_address AS sender,
|
||||
origin_from_address AS tx_to
|
||||
FROM
|
||||
{{ ref('silver__logs') }}
|
||||
WHERE
|
||||
topics[0]::STRING = '0x2170c741c41531aec20e7c107c24eecfdd15e69c9bb0a8dd37b1840b9e0b207b'
|
||||
AND contract_address = '0xba12222222228d8ba445958a75a0704d566bf2c8'
|
||||
|
||||
{% if is_incremental() %}
|
||||
AND _inserted_timestamp >= (
|
||||
SELECT
|
||||
MAX(_inserted_timestamp) :: DATE - 2
|
||||
FROM
|
||||
{{ this }}
|
||||
)
|
||||
{% endif %}
|
||||
),
|
||||
contracts AS (
|
||||
SELECT
|
||||
*
|
||||
FROM
|
||||
{{ ref('core__dim_contracts') }}
|
||||
WHERE
|
||||
decimals IS NOT NULL
|
||||
AND
|
||||
address IN (
|
||||
SELECT
|
||||
DISTINCT token_in AS address
|
||||
FROM
|
||||
swaps_base
|
||||
UNION
|
||||
SELECT
|
||||
DISTINCT token_out AS address
|
||||
FROM
|
||||
swaps_base
|
||||
)
|
||||
),
|
||||
hourly_token_price AS (
|
||||
SELECT
|
||||
hour,
|
||||
token_address,
|
||||
price
|
||||
FROM
|
||||
{{ ref('silver__prices') }}
|
||||
WHERE
|
||||
token_address IN (
|
||||
SELECT
|
||||
DISTINCT address
|
||||
FROM
|
||||
contracts
|
||||
)
|
||||
AND hour :: DATE IN (
|
||||
SELECT
|
||||
DISTINCT block_timestamp :: DATE
|
||||
FROM
|
||||
swaps_base
|
||||
)
|
||||
)
|
||||
SELECT
|
||||
tx_hash,
|
||||
block_number,
|
||||
block_timestamp,
|
||||
origin_function_signature,
|
||||
origin_from_address,
|
||||
origin_to_address,
|
||||
contract_address,
|
||||
_inserted_timestamp,
|
||||
s.event_name,
|
||||
event_index,
|
||||
amount_in_unadj,
|
||||
c1.decimals AS decimals_in,
|
||||
c1.symbol AS symbol_in,
|
||||
CASE
|
||||
WHEN decimals_in IS NULL THEN amount_in_unadj
|
||||
ELSE (amount_in_unadj / pow(10, decimals_in))
|
||||
END AS amount_in,
|
||||
CASE
|
||||
WHEN decimals_in IS NOT NULL THEN ROUND(
|
||||
amount_in * p1.price,
|
||||
2
|
||||
)
|
||||
END AS amount_in_usd,
|
||||
amount_out_unadj,
|
||||
c2.decimals AS decimals_out,
|
||||
c2.symbol AS symbol_out,
|
||||
CASE
|
||||
WHEN decimals_out IS NULL THEN amount_out_unadj
|
||||
ELSE (amount_out_unadj / pow(10, decimals_out))
|
||||
END AS amount_out,
|
||||
CASE
|
||||
WHEN decimals_out IS NOT NULL THEN ROUND(
|
||||
amount_out * p2.price,
|
||||
2
|
||||
)
|
||||
END AS amount_out_usd,
|
||||
s.pool_id,
|
||||
token_in,
|
||||
token_out,
|
||||
s.pool_address,
|
||||
s._log_id,
|
||||
s.ingested_at,
|
||||
s.platform,
|
||||
sender,
|
||||
tx_to,
|
||||
pool_name
|
||||
FROM
|
||||
swaps_base s
|
||||
LEFT JOIN contracts c1
|
||||
ON token_in = c1.address
|
||||
LEFT JOIN contracts c2
|
||||
ON token_out = c2.address
|
||||
LEFT JOIN hourly_token_price p1
|
||||
ON token_in = p1.token_address
|
||||
AND DATE_TRUNC(
|
||||
'hour',
|
||||
block_timestamp
|
||||
) = p1.hour
|
||||
LEFT JOIN hourly_token_price p2
|
||||
ON token_out = p2.token_address
|
||||
AND DATE_TRUNC(
|
||||
'hour',
|
||||
block_timestamp
|
||||
) = p2.hour
|
||||
LEFT JOIN pool_name pn
|
||||
ON pn.pool_address = s.pool_address
|
||||
WHERE
|
||||
pool_name IS NOT NULL
|
||||
75
models/silver/dex/silver_dex__beethovenx_swaps.yml
Normal file
75
models/silver/dex/silver_dex__beethovenx_swaps.yml
Normal file
@ -0,0 +1,75 @@
|
||||
version: 2
|
||||
models:
|
||||
- name: silver_dex__beethovenx_swaps
|
||||
tests:
|
||||
- dbt_utils.unique_combination_of_columns:
|
||||
combination_of_columns:
|
||||
- _log_id
|
||||
columns:
|
||||
- name: AMOUNT_IN
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- decimal
|
||||
- float
|
||||
- name: AMOUNT_IN_USD
|
||||
tests:
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- decimal
|
||||
- float
|
||||
- name: AMOUNT_OUT
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- decimal
|
||||
- float
|
||||
- name: AMOUNT_OUT_USD
|
||||
tests:
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- decimal
|
||||
- float
|
||||
- name: TOKEN_IN
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_match_regex:
|
||||
regex: 0[xX][0-9a-fA-F]+
|
||||
- name: TOKEN_OUT
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_match_regex:
|
||||
regex: 0[xX][0-9a-fA-F]+
|
||||
- name: BLOCK_TIMESTAMP
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_row_values_to_have_recent_data:
|
||||
datepart: day
|
||||
interval: 1
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- TIMESTAMP_NTZ
|
||||
- name: EVENT_INDEX
|
||||
tests:
|
||||
- not_null
|
||||
- name: POOL_ADDRESS
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_match_regex:
|
||||
regex: 0[xX][0-9a-fA-F]+
|
||||
- name: POOL_NAME
|
||||
tests:
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- varchar
|
||||
- name: SENDER
|
||||
tests:
|
||||
- not_null
|
||||
- name: TX_TO
|
||||
tests:
|
||||
- not_null
|
||||
- name: TX_HASH
|
||||
tests:
|
||||
- not_null
|
||||
251
models/silver/dex/silver_dex__curve_pools.sql
Normal file
251
models/silver/dex/silver_dex__curve_pools.sql
Normal file
@ -0,0 +1,251 @@
|
||||
{{ config(
|
||||
materialized = 'incremental',
|
||||
unique_key = "pool_id"
|
||||
) }}
|
||||
|
||||
WITH contract_deployments AS (
|
||||
|
||||
SELECT
|
||||
a.tx_hash AS tx_hash,
|
||||
a.block_number AS block_number,
|
||||
a.block_timestamp AS block_timestamp,
|
||||
a.from_address AS deployer_address,
|
||||
a.to_address AS contract_address,
|
||||
a._inserted_timestamp AS _inserted_timestamp
|
||||
FROM
|
||||
{{ ref('silver__traces' )}} a
|
||||
WHERE
|
||||
-- curve contract deployers
|
||||
a.from_address IN (
|
||||
'0x2db0e83599a91b508ac268a6197b8b14f5e72840',
|
||||
'0x7eeac6cddbd1d0b8af061742d41877d7f707289a',
|
||||
'0x745748bcfd8f9c2de519a71d789be8a63dd7d66c')
|
||||
AND TYPE ilike 'create%'
|
||||
AND TX_STATUS ilike 'success'
|
||||
{% if is_incremental() %}
|
||||
AND a.to_address NOT IN (
|
||||
SELECT
|
||||
DISTINCT pool_address
|
||||
FROM
|
||||
{{ this }}
|
||||
)
|
||||
{% endif %}
|
||||
QUALIFY(ROW_NUMBER() OVER(PARTITION BY a.to_address ORDER BY block_timestamp ASC)) = 1
|
||||
),
|
||||
|
||||
function_sigs AS (
|
||||
|
||||
SELECT
|
||||
'0xc6610657' AS function_sig,
|
||||
'coins' AS function_name
|
||||
UNION ALL
|
||||
SELECT
|
||||
'0x06fdde03' AS function_sig,
|
||||
'name' AS function_name
|
||||
UNION ALL
|
||||
SELECT
|
||||
'0x95d89b41' AS function_sig,
|
||||
'symbol' AS function_name
|
||||
UNION ALL
|
||||
SELECT
|
||||
'0x313ce567' AS function_sig,
|
||||
'decimals' AS function_name
|
||||
),
|
||||
|
||||
function_inputs AS (
|
||||
SELECT
|
||||
SEQ4() AS function_input
|
||||
FROM
|
||||
TABLE(GENERATOR(rowcount => 4))
|
||||
),
|
||||
|
||||
inputs_coins AS (
|
||||
|
||||
SELECT
|
||||
deployer_address,
|
||||
contract_address,
|
||||
block_number,
|
||||
function_sig,
|
||||
(ROW_NUMBER() OVER (PARTITION BY contract_address
|
||||
ORDER BY block_number)) - 1 AS function_input
|
||||
FROM contract_deployments
|
||||
JOIN function_sigs ON 1=1
|
||||
JOIN function_inputs ON 1=1
|
||||
WHERE function_name = 'coins'
|
||||
),
|
||||
|
||||
inputs_pool_details AS (
|
||||
|
||||
SELECT
|
||||
deployer_address,
|
||||
contract_address,
|
||||
block_number,
|
||||
function_sig,
|
||||
NULL AS function_input
|
||||
FROM contract_deployments
|
||||
JOIN function_sigs ON 1=1
|
||||
WHERE function_name IN ('name','symbol','decimals')
|
||||
),
|
||||
|
||||
all_inputs AS (
|
||||
|
||||
SELECT
|
||||
deployer_address,
|
||||
contract_address,
|
||||
block_number,
|
||||
function_sig,
|
||||
function_input
|
||||
FROM inputs_coins
|
||||
UNION ALL
|
||||
SELECT
|
||||
deployer_address,
|
||||
contract_address,
|
||||
block_number,
|
||||
function_sig,
|
||||
function_input
|
||||
FROM inputs_pool_details
|
||||
),
|
||||
|
||||
ready_reads_pools AS (
|
||||
SELECT
|
||||
deployer_address,
|
||||
contract_address,
|
||||
block_number,
|
||||
function_sig,
|
||||
function_input,
|
||||
CONCAT(
|
||||
'[\'',
|
||||
contract_address,
|
||||
'\',',
|
||||
block_number,
|
||||
',\'',
|
||||
function_sig,
|
||||
'\',\'',
|
||||
(CASE WHEN function_input IS NULL THEN '' ELSE function_input::STRING END),
|
||||
'\']'
|
||||
) AS read_input
|
||||
FROM all_inputs
|
||||
),
|
||||
|
||||
batch_reads_pools AS (
|
||||
|
||||
SELECT
|
||||
CONCAT('[', LISTAGG(read_input, ','), ']') AS batch_read
|
||||
FROM
|
||||
ready_reads_pools
|
||||
),
|
||||
|
||||
pool_token_reads AS (
|
||||
|
||||
SELECT
|
||||
ethereum.streamline.udf_json_rpc_read_calls(
|
||||
node_url,
|
||||
headers,
|
||||
PARSE_JSON(batch_read)
|
||||
) AS read_output,
|
||||
SYSDATE() AS _inserted_timestamp
|
||||
FROM
|
||||
batch_reads_pools
|
||||
JOIN streamline.crosschain.node_mapping ON 1=1
|
||||
AND chain = 'optimism'
|
||||
WHERE
|
||||
EXISTS (
|
||||
SELECT
|
||||
1
|
||||
FROM
|
||||
ready_reads_pools
|
||||
LIMIT
|
||||
1
|
||||
)
|
||||
),
|
||||
|
||||
reads_adjusted AS (
|
||||
|
||||
SELECT
|
||||
VALUE :id :: STRING AS read_id,
|
||||
VALUE :result :: STRING AS read_result,
|
||||
SPLIT(
|
||||
read_id,
|
||||
'-'
|
||||
) AS read_id_object,
|
||||
read_id_object [0] :: STRING AS contract_address,
|
||||
read_id_object [1] :: STRING AS block_number,
|
||||
read_id_object [2] :: STRING AS function_sig,
|
||||
read_id_object [3] :: STRING AS function_input,
|
||||
_inserted_timestamp
|
||||
FROM
|
||||
pool_token_reads,
|
||||
LATERAL FLATTEN(
|
||||
input => read_output [0] :data
|
||||
)
|
||||
),
|
||||
|
||||
tokens AS (
|
||||
|
||||
SELECT
|
||||
contract_address,
|
||||
function_sig,
|
||||
function_name,
|
||||
read_result,
|
||||
regexp_substr_all(SUBSTR(read_result, 3, len(read_result)), '.{64}')[0]AS segmented_token_address,
|
||||
_inserted_timestamp
|
||||
FROM reads_adjusted
|
||||
LEFT JOIN function_sigs USING(function_sig)
|
||||
WHERE read_result IS NOT NULL
|
||||
AND function_name = 'coins'
|
||||
),
|
||||
|
||||
pool_details AS (
|
||||
|
||||
SELECT
|
||||
contract_address,
|
||||
function_sig,
|
||||
function_name,
|
||||
read_result,
|
||||
regexp_substr_all(SUBSTR(read_result, 3, len(read_result)), '.{64}') AS segmented_output,
|
||||
_inserted_timestamp
|
||||
FROM reads_adjusted
|
||||
LEFT JOIN function_sigs USING(function_sig)
|
||||
WHERE read_result IS NOT NULL
|
||||
AND function_name IN ('name','symbol','decimals')
|
||||
),
|
||||
|
||||
FINAL AS (
|
||||
SELECT
|
||||
t.contract_address AS pool_address,
|
||||
CONCAT('0x',SUBSTRING(t.segmented_token_address,25,40)) AS token_address,
|
||||
MIN(CASE WHEN p.function_name = 'symbol' THEN TRY_HEX_DECODE_STRING(RTRIM(p.segmented_output [2] :: STRING, 0)) END) AS pool_symbol,
|
||||
MIN(CASE WHEN p.function_name = 'name' THEN CONCAT(TRY_HEX_DECODE_STRING(p.segmented_output [2] :: STRING),
|
||||
TRY_HEX_DECODE_STRING(segmented_output [3] :: STRING)) END) AS pool_name,
|
||||
MIN(CASE
|
||||
WHEN p.read_result::STRING = '0x' THEN NULL
|
||||
ELSE ethereum.public.udf_hex_to_int(p.read_result::STRING)
|
||||
END)::INTEGER AS pool_decimals,
|
||||
CONCAT(
|
||||
t.contract_address,
|
||||
'-',
|
||||
CONCAT('0x',SUBSTRING(t.segmented_token_address,25,40))
|
||||
) AS pool_id,
|
||||
MAX(t._inserted_timestamp) AS _inserted_timestamp
|
||||
FROM tokens t
|
||||
LEFT JOIN pool_details p ON t.contract_address = p.contract_address
|
||||
WHERE token_address IS NOT NULL
|
||||
AND token_address <> '0x0000000000000000000000000000000000000000'
|
||||
GROUP BY 1,2
|
||||
)
|
||||
|
||||
SELECT
|
||||
pool_address,
|
||||
CASE
|
||||
WHEN token_address = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' THEN '0x4200000000000000000000000000000000000006'
|
||||
ELSE token_address
|
||||
END AS token_address,
|
||||
CASE
|
||||
WHEN token_address = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' THEN 'WETH'
|
||||
ELSE pool_symbol
|
||||
END AS pool_symbol,
|
||||
pool_name,
|
||||
pool_decimals,
|
||||
pool_id,
|
||||
_inserted_timestamp
|
||||
FROM FINAL
|
||||
29
models/silver/dex/silver_dex__curve_pools.yml
Normal file
29
models/silver/dex/silver_dex__curve_pools.yml
Normal file
@ -0,0 +1,29 @@
|
||||
version: 2
|
||||
models:
|
||||
- name: silver_dex__curve_pools
|
||||
|
||||
tests:
|
||||
- dbt_utils.unique_combination_of_columns:
|
||||
combination_of_columns:
|
||||
- POOL_ID
|
||||
columns:
|
||||
- name: POOL_ADDRESS
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_match_regex:
|
||||
regex: 0[xX][0-9a-fA-F]+
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- varchar
|
||||
- name: TOKEN_ADDRESS
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_match_regex:
|
||||
regex: 0[xX][0-9a-fA-F]+
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- varchar
|
||||
- name: POOL_SYMBOL
|
||||
- name: POOL_NAME
|
||||
- name: POOL_DECIMALS
|
||||
- name: _INSERTED_TIMESTAMP
|
||||
261
models/silver/dex/silver_dex__curve_swaps.sql
Normal file
261
models/silver/dex/silver_dex__curve_swaps.sql
Normal file
@ -0,0 +1,261 @@
|
||||
{{ config(
|
||||
materialized = 'incremental',
|
||||
unique_key = "_log_id",
|
||||
cluster_by = ['block_timestamp::DATE']
|
||||
) }}
|
||||
|
||||
WITH pool_meta AS (
|
||||
|
||||
SELECT
|
||||
DISTINCT pool_address,
|
||||
CASE
|
||||
WHEN pool_name IS NULL AND pool_symbol IS NULL THEN CONCAT('Curve.fi Pool: ',SUBSTRING(pool_address, 1, 5),'...',SUBSTRING(pool_address, 39, 42))
|
||||
WHEN pool_name IS NULL THEN CONCAT('Curve.fi Pool: ',pool_symbol)
|
||||
ELSE pool_name
|
||||
END AS pool_name
|
||||
FROM
|
||||
{{ ref('silver_dex__curve_pools') }}
|
||||
),
|
||||
|
||||
curve_base AS (
|
||||
SELECT
|
||||
block_number,
|
||||
block_timestamp,
|
||||
tx_hash,
|
||||
origin_function_signature,
|
||||
origin_from_address,
|
||||
origin_to_address,
|
||||
contract_address,
|
||||
event_index,
|
||||
event_name,
|
||||
contract_address AS pool_address,
|
||||
pool_name,
|
||||
regexp_substr_all(SUBSTR(DATA, 3, len(DATA)), '.{64}') AS segmented_data,
|
||||
CONCAT('0x', SUBSTR(topics [1] :: STRING, 27, 40)) AS sender,
|
||||
CONCAT('0x', SUBSTR(topics [2] :: STRING, 27, 40)) AS recipient,
|
||||
ethereum.public.udf_hex_to_int(
|
||||
segmented_data [0] :: STRING
|
||||
) :: INTEGER AS sold_id,
|
||||
ethereum.public.udf_hex_to_int(
|
||||
segmented_data [1] :: STRING
|
||||
) :: INTEGER AS tokens_sold,
|
||||
ethereum.public.udf_hex_to_int(
|
||||
segmented_data [2] :: STRING
|
||||
) :: INTEGER AS bought_id,
|
||||
ethereum.public.udf_hex_to_int(
|
||||
segmented_data [3] :: STRING
|
||||
) :: INTEGER AS tokens_bought,
|
||||
_log_id,
|
||||
_inserted_timestamp
|
||||
FROM
|
||||
{{ ref('silver__logs') }}
|
||||
INNER JOIN pool_meta
|
||||
ON pool_meta.pool_address = contract_address
|
||||
WHERE
|
||||
topics [0] :: STRING IN (
|
||||
'0x8b3e96f2b889fa771c53c981b40daf005f63f637f1869f707052d15a3dd97140',
|
||||
'0xd013ca23e77a65003c2c659c5442c00c805371b7fc1ebd4c206c41d1536bd90b'
|
||||
)
|
||||
|
||||
{% if is_incremental() %}
|
||||
AND _inserted_timestamp >= (
|
||||
SELECT
|
||||
MAX(_inserted_timestamp) :: DATE - 2
|
||||
FROM
|
||||
{{ this }}
|
||||
)
|
||||
{% endif %}
|
||||
),
|
||||
token_transfers AS (
|
||||
SELECT
|
||||
tx_hash,
|
||||
contract_address AS token_address,
|
||||
TRY_TO_NUMBER(
|
||||
CASE
|
||||
WHEN DATA :: STRING = '0x' THEN NULL
|
||||
ELSE ethereum.public.udf_hex_to_int(
|
||||
DATA :: STRING
|
||||
) END ) AS amount,
|
||||
CONCAT('0x', SUBSTR(topics [1] :: STRING, 27, 40)) AS from_address,
|
||||
CONCAT('0x', SUBSTR(topics [2] :: STRING, 27, 40)) AS to_address
|
||||
FROM
|
||||
{{ ref('silver__logs') }}
|
||||
WHERE
|
||||
topics [0] :: STRING = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'
|
||||
AND tx_hash IN (
|
||||
SELECT
|
||||
DISTINCT tx_hash
|
||||
FROM
|
||||
curve_base
|
||||
)
|
||||
--AND CONCAT('0x', SUBSTR(topics [1] :: STRING, 27, 40)) <> '0x0000000000000000000000000000000000000000'
|
||||
AND CONCAT('0x', SUBSTR(topics [2] :: STRING, 27, 40)) <> '0x0000000000000000000000000000000000000000'
|
||||
|
||||
{% if is_incremental() %}
|
||||
AND _inserted_timestamp >= (
|
||||
SELECT
|
||||
MAX(_inserted_timestamp) :: DATE - 2
|
||||
FROM
|
||||
{{ this }}
|
||||
)
|
||||
{% endif %}
|
||||
),
|
||||
from_transfers AS (
|
||||
SELECT
|
||||
DISTINCT tx_hash,
|
||||
token_address,
|
||||
from_address,
|
||||
amount
|
||||
FROM
|
||||
token_transfers
|
||||
),
|
||||
to_transfers AS (
|
||||
SELECT
|
||||
DISTINCT tx_hash,
|
||||
token_address,
|
||||
to_address,
|
||||
amount
|
||||
FROM
|
||||
token_transfers
|
||||
),
|
||||
pool_info AS (
|
||||
SELECT
|
||||
s.block_number,
|
||||
s.block_timestamp,
|
||||
s.tx_hash,
|
||||
s.origin_function_signature,
|
||||
s.origin_from_address,
|
||||
s.origin_to_address,
|
||||
CASE
|
||||
WHEN s.recipient IS NULL THEN s.origin_from_address
|
||||
ELSE s.recipient
|
||||
END AS tx_to,
|
||||
event_index,
|
||||
event_name,
|
||||
pool_address,
|
||||
pool_address AS contract_address,
|
||||
pool_name,
|
||||
sender,
|
||||
sold_id,
|
||||
tokens_sold,
|
||||
sold.token_address AS token_in,
|
||||
c0.symbol symbol_in,
|
||||
c0.decimals AS decimals_in,
|
||||
CASE
|
||||
WHEN decimals_in IS NOT NULL THEN tokens_sold / pow(
|
||||
10,
|
||||
decimals_in
|
||||
)
|
||||
ELSE tokens_sold
|
||||
END AS amount_in,
|
||||
bought_id,
|
||||
tokens_bought,
|
||||
bought.token_address AS token_out,
|
||||
c1.symbol AS symbol_out,
|
||||
c1.decimals AS decimals_out,
|
||||
CASE
|
||||
WHEN decimals_out IS NOT NULL THEN tokens_bought / pow(
|
||||
10,
|
||||
decimals_out
|
||||
)
|
||||
ELSE tokens_bought
|
||||
END AS amount_out,
|
||||
_log_id,
|
||||
_inserted_timestamp
|
||||
FROM
|
||||
curve_base s
|
||||
LEFT JOIN from_transfers sold
|
||||
ON tokens_sold = sold.amount
|
||||
AND s.tx_hash = sold.tx_hash
|
||||
LEFT JOIN to_transfers bought
|
||||
ON tokens_bought = bought.amount
|
||||
AND s.tx_hash = bought.tx_hash
|
||||
LEFT JOIN {{ ref('core__dim_contracts') }}
|
||||
c0
|
||||
ON c0.address = sold.token_address
|
||||
LEFT JOIN {{ ref('core__dim_contracts') }}
|
||||
c1
|
||||
ON c1.address = bought.token_address
|
||||
WHERE
|
||||
tokens_sold <> 0
|
||||
AND symbol_out <> symbol_in qualify(ROW_NUMBER() over(PARTITION BY _log_id
|
||||
ORDER BY
|
||||
_inserted_timestamp DESC)) = 1
|
||||
),
|
||||
prices AS (
|
||||
SELECT
|
||||
hour,
|
||||
token_address,
|
||||
price
|
||||
FROM
|
||||
{{ ref('silver__prices') }}
|
||||
WHERE
|
||||
hour :: DATE IN (
|
||||
SELECT
|
||||
DISTINCT block_timestamp :: DATE
|
||||
FROM
|
||||
curve_base
|
||||
)
|
||||
AND LOWER(token_address) IN (
|
||||
SELECT
|
||||
DISTINCT token_in AS token_address
|
||||
FROM
|
||||
pool_info
|
||||
UNION
|
||||
SELECT
|
||||
DISTINCT token_out AS token_address
|
||||
FROM
|
||||
pool_info
|
||||
)
|
||||
)
|
||||
SELECT
|
||||
block_number,
|
||||
block_timestamp,
|
||||
origin_function_signature,
|
||||
origin_from_address,
|
||||
origin_to_address,
|
||||
contract_address,
|
||||
tx_hash,
|
||||
event_index,
|
||||
event_name,
|
||||
tx_to,
|
||||
pool_address,
|
||||
pool_name,
|
||||
sender,
|
||||
decimals_in,
|
||||
symbol_in,
|
||||
token_in,
|
||||
amount_in,
|
||||
decimals_out,
|
||||
symbol_out,
|
||||
token_out,
|
||||
amount_out,
|
||||
CASE
|
||||
WHEN decimals_in IS NOT NULL THEN ROUND(
|
||||
amount_in * p0.price,
|
||||
2
|
||||
)
|
||||
END AS amount_in_usd,
|
||||
CASE
|
||||
WHEN decimals_out IS NOT NULL THEN ROUND(
|
||||
amount_out * p1.price,
|
||||
2
|
||||
)
|
||||
END AS amount_out_usd,
|
||||
_log_id,
|
||||
_inserted_timestamp,
|
||||
'curve' AS platform
|
||||
FROM
|
||||
pool_info
|
||||
LEFT JOIN prices p0
|
||||
ON p0.hour = DATE_TRUNC(
|
||||
'hour',
|
||||
block_timestamp
|
||||
)
|
||||
AND p0.token_address = token_in
|
||||
LEFT JOIN prices p1
|
||||
ON p1.hour = DATE_TRUNC(
|
||||
'hour',
|
||||
block_timestamp
|
||||
)
|
||||
AND p1.token_address = token_out
|
||||
68
models/silver/dex/silver_dex__curve_swaps.yml
Normal file
68
models/silver/dex/silver_dex__curve_swaps.yml
Normal file
@ -0,0 +1,68 @@
|
||||
version: 2
|
||||
models:
|
||||
- name: silver_dex__curve_swaps
|
||||
tests:
|
||||
- dbt_utils.unique_combination_of_columns:
|
||||
combination_of_columns:
|
||||
- _log_id
|
||||
columns:
|
||||
- name: AMOUNT_IN
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- decimal
|
||||
- float
|
||||
- name: AMOUNT_IN_USD
|
||||
tests:
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- decimal
|
||||
- float
|
||||
- name: AMOUNT_OUT
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- decimal
|
||||
- float
|
||||
- name: AMOUNT_OUT_USD
|
||||
tests:
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- decimal
|
||||
- float
|
||||
- name: BLOCK_TIMESTAMP
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_row_values_to_have_recent_data:
|
||||
datepart: day
|
||||
interval: 1
|
||||
- name: EVENT_INDEX
|
||||
tests:
|
||||
- not_null
|
||||
- name: POOL_ADDRESS
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_match_regex:
|
||||
regex: 0[xX][0-9a-fA-F]+
|
||||
- name: POOL_NAME
|
||||
tests:
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- varchar
|
||||
- name: SENDER
|
||||
tests:
|
||||
- not_null
|
||||
- name: TX_TO
|
||||
tests:
|
||||
- not_null
|
||||
- name: TOKEN_IN
|
||||
tests:
|
||||
- not_null
|
||||
- name: TOKEN_OUT
|
||||
tests:
|
||||
- not_null
|
||||
- name: TX_HASH
|
||||
tests:
|
||||
- not_null
|
||||
142
models/silver/dex/silver_dex__synthetix_swaps.sql
Normal file
142
models/silver/dex/silver_dex__synthetix_swaps.sql
Normal file
@ -0,0 +1,142 @@
|
||||
{{ config(
|
||||
materialized = 'incremental',
|
||||
unique_key = "_log_id",
|
||||
cluster_by = ['block_timestamp::DATE']
|
||||
) }}
|
||||
|
||||
WITH swaps_base AS (
|
||||
|
||||
SELECT
|
||||
block_number,
|
||||
block_timestamp,
|
||||
tx_hash,
|
||||
origin_function_signature,
|
||||
origin_from_address,
|
||||
origin_to_address,
|
||||
contract_address,
|
||||
NULL AS pool_name,
|
||||
'Swap' AS event_name,
|
||||
regexp_substr_all(SUBSTR(DATA, 3, len(DATA)), '.{64}') AS segmented_data,
|
||||
(CASE
|
||||
WHEN segmented_data [1] = '0x' THEN NULL
|
||||
ELSE ethereum.public.udf_hex_to_int(
|
||||
segmented_data [1] :: STRING
|
||||
)
|
||||
END) :: INTEGER / 1e18 AS amount_in,
|
||||
(CASE
|
||||
WHEN segmented_data [3] = '0x' THEN NULL
|
||||
ELSE ethereum.public.udf_hex_to_int(
|
||||
segmented_data [3] :: STRING
|
||||
)
|
||||
END) :: INTEGER / 1e18 AS amount_out,
|
||||
CONCAT('0x', SUBSTR(topics [1] :: STRING, 27, 40)) AS sender,
|
||||
CONCAT('0x',SUBSTR(segmented_data [4] :: STRING, 25, 40)) AS tx_to,
|
||||
event_index,
|
||||
'synthetix' AS platform,
|
||||
REGEXP_REPLACE(HEX_DECODE_STRING(segmented_data [0] :: STRING),'[^a-zA-Z0-9]+') AS symbol_in,
|
||||
REGEXP_REPLACE(HEX_DECODE_STRING(segmented_data [2] :: STRING),'[^a-zA-Z0-9]+') AS symbol_out,
|
||||
CONCAT(tx_hash,'-',event_index) AS _log_id,
|
||||
event_inputs,
|
||||
_inserted_timestamp
|
||||
FROM
|
||||
{{ ref('silver__logs') }}
|
||||
WHERE
|
||||
contract_address IN (
|
||||
'0x8700daec35af8ff88c16bdf0418774cb3d7599b4'
|
||||
)
|
||||
AND topics[0] = '0x65b6972c94204d84cffd3a95615743e31270f04fdf251f3dccc705cfbad44776'
|
||||
|
||||
{% if is_incremental() %}
|
||||
AND _inserted_timestamp >= (
|
||||
SELECT
|
||||
MAX(_inserted_timestamp) :: DATE - 2
|
||||
FROM
|
||||
{{ this }}
|
||||
)
|
||||
{% endif %}
|
||||
|
||||
),
|
||||
|
||||
swaps_with_token_addresses AS (
|
||||
SELECT
|
||||
b.*,
|
||||
synth_symbol_in,
|
||||
LOWER(token_in) AS token_in,
|
||||
synth_symbol_out,
|
||||
LOWER(token_out) AS token_out
|
||||
FROM
|
||||
swaps_base b
|
||||
LEFT JOIN (
|
||||
SELECT
|
||||
synth_symbol AS synth_symbol_in,
|
||||
synth_proxy_address AS token_in
|
||||
FROM
|
||||
{{ ref('silver__synthetix_synths') }}
|
||||
) synths_in
|
||||
ON synths_in.synth_symbol_in = b.symbol_in
|
||||
LEFT JOIN (
|
||||
SELECT
|
||||
synth_symbol AS synth_symbol_out,
|
||||
synth_proxy_address AS token_out
|
||||
FROM
|
||||
{{ ref('silver__synthetix_synths') }}
|
||||
) synths_out
|
||||
ON synths_out.synth_symbol_out = b.symbol_out
|
||||
),
|
||||
|
||||
hourly_prices AS (
|
||||
SELECT
|
||||
hour,
|
||||
token_address,
|
||||
price
|
||||
FROM
|
||||
{{ ref('silver__prices') }}
|
||||
WHERE hour :: DATE IN (
|
||||
SELECT
|
||||
DISTINCT block_timestamp :: DATE
|
||||
FROM
|
||||
swaps_base
|
||||
)
|
||||
AND LOWER(token_address) IN (
|
||||
SELECT
|
||||
DISTINCT token_in AS token_address
|
||||
FROM swaps_with_token_addresses
|
||||
UNION
|
||||
SELECT
|
||||
DISTINCT token_out AS token_address
|
||||
FROM swaps_with_token_addresses
|
||||
)
|
||||
)
|
||||
|
||||
SELECT
|
||||
block_number,
|
||||
block_timestamp,
|
||||
tx_hash,
|
||||
origin_function_signature,
|
||||
origin_from_address,
|
||||
origin_to_address,
|
||||
contract_address,
|
||||
pool_name,
|
||||
event_name,
|
||||
amount_in,
|
||||
ROUND(amount_in * prices_in.price,2) AS amount_in_usd,
|
||||
amount_out,
|
||||
ROUND(amount_out * prices_out.price,2) AS amount_out_usd,
|
||||
sender,
|
||||
tx_to,
|
||||
event_index,
|
||||
platform,
|
||||
token_in,
|
||||
token_out,
|
||||
symbol_in,
|
||||
symbol_out,
|
||||
_log_id,
|
||||
_inserted_timestamp
|
||||
FROM
|
||||
swaps_with_token_addresses s
|
||||
LEFT JOIN hourly_prices AS prices_in
|
||||
ON prices_in.token_address = s.token_in
|
||||
AND prices_in.hour = date_trunc('hour',s.block_timestamp)
|
||||
LEFT JOIN hourly_prices AS prices_out
|
||||
ON prices_out.token_address = s.token_out
|
||||
AND prices_out.hour = date_trunc('hour',s.block_timestamp)
|
||||
196
models/silver/dex/silver_dex__synthetix_swaps.yml
Normal file
196
models/silver/dex/silver_dex__synthetix_swaps.yml
Normal file
@ -0,0 +1,196 @@
|
||||
version: 2
|
||||
models:
|
||||
- name: silver_dex__synthetix_swaps
|
||||
description: A record of all swaps in the Synthetix DEX on Optimism.
|
||||
tests:
|
||||
- dbt_utils.unique_combination_of_columns:
|
||||
combination_of_columns:
|
||||
- _log_id
|
||||
columns:
|
||||
- name: BLOCK_NUMBER
|
||||
description: '{{ doc("opt_block_number") }}'
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- NUMBER
|
||||
- FLOAT
|
||||
- name: BLOCK_TIMESTAMP
|
||||
description: '{{ doc("opt_block_timestamp") }}'
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_row_values_to_have_recent_data:
|
||||
datepart: day
|
||||
interval: 1
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- TIMESTAMP_NTZ
|
||||
- name: TX_HASH
|
||||
description: '{{ doc("opt_tx_hash") }}'
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_match_regex:
|
||||
regex: 0[xX][0-9a-fA-F]+
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- STRING
|
||||
- VARCHAR
|
||||
- name: ORIGIN_FUNCTION_SIGNATURE
|
||||
description: Function signature from the transaction that originated the swap
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- STRING
|
||||
- VARCHAR
|
||||
- name: ORIGIN_FROM_ADDRESS
|
||||
description: Address that initiated the transaction that originated the swap
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_match_regex:
|
||||
regex: 0[xX][0-9a-fA-F]+
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- STRING
|
||||
- VARCHAR
|
||||
- name: ORIGIN_TO_ADDRESS
|
||||
description: Receiving party of the transaction that originated the swap
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_match_regex:
|
||||
regex: 0[xX][0-9a-fA-F]+
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- STRING
|
||||
- VARCHAR
|
||||
- name: CONTRACT_ADDRESS
|
||||
description: '{{ doc("opt_logs_contract_address") }}'
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_match_regex:
|
||||
regex: 0[xX][0-9a-fA-F]+
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- STRING
|
||||
- VARCHAR
|
||||
- name: POOL_NAME
|
||||
description: This table is based on the Kwenta exchange which is built on the Synthetix protocol. The liquidity traders access is entirely created by SNX stakers on Synthetix (or routed through 1inch for non-synth trades).
|
||||
- name: EVENT_NAME
|
||||
description: Always 'Swap'
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- STRING
|
||||
- VARCHAR
|
||||
- name: AMOUNT_IN
|
||||
description: Amount of tokens entering the swap (decimal adjusted)
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- decimal
|
||||
- float
|
||||
- number
|
||||
- name: AMOUNT_IN_USD
|
||||
description: Approximate Amount of USD entering the swap
|
||||
tests:
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- decimal
|
||||
- float
|
||||
- name: AMOUNT_OUT
|
||||
description: Amount of tokens exiting the swap (decimal adjusted)
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- decimal
|
||||
- float
|
||||
- number
|
||||
- name: AMOUNT_OUT_USD
|
||||
description: Approximate Amount of USD exiting the swap
|
||||
tests:
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- decimal
|
||||
- float
|
||||
- name: SENDER
|
||||
description: Same as origin_from_address
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_match_regex:
|
||||
regex: 0[xX][0-9a-fA-F]+
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- STRING
|
||||
- VARCHAR
|
||||
- name: TX_TO
|
||||
description: the "to" field in the swap event log
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_match_regex:
|
||||
regex: 0[xX][0-9a-fA-F]+
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- STRING
|
||||
- VARCHAR
|
||||
- name: EVENT_INDEX
|
||||
description: index of the event log of the swap
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- NUMBER
|
||||
- FLOAT
|
||||
- name: PLATFORM
|
||||
description: platform in which the swap is happening. always "Synthetix"
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- STRING
|
||||
- VARCHAR
|
||||
- name: TOKEN_IN
|
||||
description: address of the token entering the swap
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_match_regex:
|
||||
regex: 0[xX][0-9a-fA-F]+
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- STRING
|
||||
- VARCHAR
|
||||
- name: TOKEN_OUT
|
||||
description: address of the token exiting the swap
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_match_regex:
|
||||
regex: 0[xX][0-9a-fA-F]+
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- STRING
|
||||
- VARCHAR
|
||||
- name: SYMBOL_IN
|
||||
description: symbol (ticker) of the token entering the swap
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- STRING
|
||||
- VARCHAR
|
||||
- name: SYMBOL_OUT
|
||||
description: symbol (ticker) of the token exiting the swap
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- STRING
|
||||
- VARCHAR
|
||||
- name: _LOG_ID
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- STRING
|
||||
- VARCHAR
|
||||
168
models/silver/dex/silver_dex__univ3_pools.sql
Normal file
168
models/silver/dex/silver_dex__univ3_pools.sql
Normal file
@ -0,0 +1,168 @@
|
||||
{{ config(
|
||||
materialized = 'incremental',
|
||||
unique_key = 'pool_address',
|
||||
cluster_by = ['_inserted_timestamp::DATE']
|
||||
) }}
|
||||
|
||||
WITH created_pools AS (
|
||||
|
||||
SELECT
|
||||
block_number AS created_block,
|
||||
block_timestamp AS created_time,
|
||||
tx_hash AS created_tx_hash,
|
||||
regexp_substr_all(SUBSTR(DATA, 3, len(DATA)), '.{64}') AS segmented_data,
|
||||
LOWER(CONCAT('0x', SUBSTR(topics [1] :: STRING, 27, 40))) AS token0_address,
|
||||
LOWER(CONCAT('0x', SUBSTR(topics [2] :: STRING, 27, 40))) AS token1_address,
|
||||
ethereum.public.udf_hex_to_int(
|
||||
's2c',
|
||||
topics [3] :: STRING
|
||||
) :: INTEGER AS fee,
|
||||
ethereum.public.udf_hex_to_int(
|
||||
's2c',
|
||||
segmented_data [0] :: STRING
|
||||
) :: INTEGER AS tick_spacing,
|
||||
CONCAT('0x', SUBSTR(segmented_data [1] :: STRING, 25, 40)) AS pool_address,
|
||||
_inserted_timestamp
|
||||
FROM
|
||||
{{ ref('silver__logs') }}
|
||||
WHERE
|
||||
topics [0] = '0x783cca1c0412dd0d695e784568c96da2e9c22ff989357a2e8b1d9b2b4e6b7118'
|
||||
AND contract_address = '0x1f98431c8ad98523631ae4a59f267346ea31f984'
|
||||
|
||||
{% if is_incremental() %}
|
||||
AND _inserted_timestamp >= (
|
||||
SELECT
|
||||
MAX(
|
||||
_inserted_timestamp
|
||||
) :: DATE - 2
|
||||
FROM
|
||||
{{ this }}
|
||||
)
|
||||
{% endif %}
|
||||
),
|
||||
initial_info AS (
|
||||
SELECT
|
||||
contract_address,
|
||||
regexp_substr_all(SUBSTR(DATA, 3, len(DATA)), '.{64}') AS segmented_data,
|
||||
ethereum.public.udf_hex_to_int('s2c', CONCAT('0x', segmented_data [0] :: STRING)) :: FLOAT AS init_sqrtPriceX96,
|
||||
ethereum.public.udf_hex_to_int('s2c', CONCAT('0x', segmented_data [1] :: STRING)) :: FLOAT AS init_tick,
|
||||
pow(
|
||||
1.0001,
|
||||
init_tick
|
||||
) AS init_price_1_0_unadj
|
||||
FROM
|
||||
{{ ref('silver__logs') }}
|
||||
WHERE
|
||||
topics [0] :: STRING = '0x98636036cb66a9c19a37435efc1e90142190214e8abeb821bdba3f2990dd4c95'
|
||||
|
||||
{% if is_incremental() %}
|
||||
AND _inserted_timestamp >= (
|
||||
SELECT
|
||||
MAX(
|
||||
_inserted_timestamp
|
||||
) :: DATE - 2
|
||||
FROM
|
||||
{{ this }}
|
||||
)
|
||||
{% endif %}
|
||||
),
|
||||
contracts AS (
|
||||
SELECT
|
||||
LOWER(address) AS address,
|
||||
symbol,
|
||||
NAME,
|
||||
decimals
|
||||
FROM
|
||||
{{ ref('core__dim_contracts') }}
|
||||
WHERE
|
||||
decimals IS NOT NULL
|
||||
),
|
||||
token_prices AS (
|
||||
SELECT
|
||||
hour,
|
||||
token_address,
|
||||
price
|
||||
FROM
|
||||
{{ ref('silver__prices') }}
|
||||
WHERE
|
||||
hour :: DATE IN (
|
||||
SELECT
|
||||
DISTINCT created_time :: DATE
|
||||
FROM
|
||||
created_pools
|
||||
)
|
||||
),
|
||||
FINAL AS (
|
||||
SELECT
|
||||
created_block,
|
||||
created_time,
|
||||
created_tx_hash,
|
||||
token0_address,
|
||||
token1_address,
|
||||
fee :: INTEGER AS fee,
|
||||
(
|
||||
fee / 10000
|
||||
) :: FLOAT AS fee_percent,
|
||||
tick_spacing,
|
||||
pool_address,
|
||||
COALESCE(
|
||||
init_tick,
|
||||
0
|
||||
) AS init_tick,
|
||||
c0.decimals AS token0_decimals,
|
||||
c1.decimals AS token1_decimals,
|
||||
COALESCE(
|
||||
init_price_1_0_unadj / pow(
|
||||
10,
|
||||
token1_decimals - token0_decimals
|
||||
),
|
||||
0
|
||||
) AS init_price_1_0,
|
||||
c0.symbol AS token0_symbol,
|
||||
c1.symbol AS token1_symbol,
|
||||
c0.name AS token0_name,
|
||||
c1.name AS token1_name,
|
||||
p0.price AS token0_price,
|
||||
p1.price AS token1_price,
|
||||
div0(
|
||||
token1_price,
|
||||
token0_price
|
||||
) AS usd_ratio,
|
||||
init_price_1_0 * token1_price AS init_price_1_0_usd,
|
||||
CONCAT(
|
||||
token0_symbol,
|
||||
'-',
|
||||
token1_symbol,
|
||||
' ',
|
||||
fee,
|
||||
' ',
|
||||
tick_spacing
|
||||
) AS pool_name,
|
||||
_inserted_timestamp
|
||||
FROM
|
||||
created_pools
|
||||
LEFT JOIN initial_info
|
||||
ON pool_address = contract_address
|
||||
LEFT JOIN contracts c0
|
||||
ON c0.address = token0_address
|
||||
LEFT JOIN contracts c1
|
||||
ON c1.address = token1_address
|
||||
LEFT JOIN token_prices p0
|
||||
ON p0.token_address = token0_address
|
||||
AND p0.hour = DATE_TRUNC(
|
||||
'hour',
|
||||
created_time
|
||||
)
|
||||
LEFT JOIN token_prices p1
|
||||
ON p1.token_address = token1_address
|
||||
AND p1.hour = DATE_TRUNC(
|
||||
'hour',
|
||||
created_time
|
||||
)
|
||||
)
|
||||
SELECT
|
||||
*
|
||||
FROM
|
||||
FINAL qualify(ROW_NUMBER() over(PARTITION BY pool_address
|
||||
ORDER BY
|
||||
_inserted_timestamp DESC)) = 1
|
||||
47
models/silver/dex/silver_dex__univ3_pools.yml
Normal file
47
models/silver/dex/silver_dex__univ3_pools.yml
Normal file
@ -0,0 +1,47 @@
|
||||
version: 2
|
||||
models:
|
||||
- name: silver_dex__univ3_pools
|
||||
tests:
|
||||
- dbt_utils.unique_combination_of_columns:
|
||||
combination_of_columns:
|
||||
- POOL_ADDRESS
|
||||
columns:
|
||||
- name: CREATED_BLOCK
|
||||
tests:
|
||||
- not_null
|
||||
- name: CREATED_TIME
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_row_values_to_have_recent_data:
|
||||
datepart: day
|
||||
interval: 7
|
||||
- name: FEE
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- decimal
|
||||
- float
|
||||
- number
|
||||
- name: INIT_PRICE_1_0
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- decimal
|
||||
- float
|
||||
- name: INIT_TICK
|
||||
tests:
|
||||
- not_null
|
||||
- name: POOL_ADDRESS
|
||||
tests:
|
||||
- not_null
|
||||
- name: TICK_SPACING
|
||||
tests:
|
||||
- not_null
|
||||
- name: CREATED_TX_HASH
|
||||
tests:
|
||||
- not_null
|
||||
|
||||
|
||||
|
||||
173
models/silver/dex/silver_dex__univ3_swaps.sql
Normal file
173
models/silver/dex/silver_dex__univ3_swaps.sql
Normal file
@ -0,0 +1,173 @@
|
||||
{{ config(
|
||||
materialized = 'incremental',
|
||||
unique_key = '_log_id',
|
||||
cluster_by = ['block_timestamp::DATE']
|
||||
) }}
|
||||
|
||||
WITH base_swaps AS (
|
||||
|
||||
SELECT
|
||||
*,
|
||||
regexp_substr_all(SUBSTR(DATA, 3, len(DATA)), '.{64}') AS segmented_data,
|
||||
CONCAT('0x', SUBSTR(topics [1] :: STRING, 27, 40)) AS sender,
|
||||
CONCAT('0x', SUBSTR(topics [2] :: STRING, 27, 40)) AS recipient,
|
||||
ethereum.public.udf_hex_to_int(
|
||||
's2c',
|
||||
segmented_data [0] :: STRING
|
||||
) :: FLOAT AS amount0_unadj,
|
||||
ethereum.public.udf_hex_to_int(
|
||||
's2c',
|
||||
segmented_data [1] :: STRING
|
||||
) :: FLOAT AS amount1_unadj,
|
||||
ethereum.public.udf_hex_to_int(
|
||||
's2c',
|
||||
segmented_data [2] :: STRING
|
||||
) :: FLOAT AS sqrtPriceX96,
|
||||
ethereum.public.udf_hex_to_int(
|
||||
's2c',
|
||||
segmented_data [3] :: STRING
|
||||
) :: FLOAT AS liquidity,
|
||||
ethereum.public.udf_hex_to_int(
|
||||
's2c',
|
||||
segmented_data [4] :: STRING
|
||||
) :: FLOAT AS tick
|
||||
FROM
|
||||
{{ ref('silver__logs') }}
|
||||
WHERE
|
||||
block_timestamp :: DATE > '2021-04-01'
|
||||
AND topics [0] :: STRING = '0xc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67'
|
||||
AND tx_status = 'SUCCESS'
|
||||
AND event_removed = 'false'
|
||||
|
||||
{% if is_incremental() %}
|
||||
AND _inserted_timestamp >= (
|
||||
SELECT
|
||||
MAX(
|
||||
_inserted_timestamp
|
||||
) :: DATE - 2
|
||||
FROM
|
||||
{{ this }}
|
||||
)
|
||||
{% endif %}
|
||||
),
|
||||
pool_data AS (
|
||||
SELECT
|
||||
token0_address,
|
||||
token1_address,
|
||||
fee,
|
||||
fee_percent,
|
||||
tick_spacing,
|
||||
pool_address,
|
||||
token0_symbol,
|
||||
token1_symbol,
|
||||
token0_decimals,
|
||||
token1_decimals,
|
||||
pool_name
|
||||
FROM
|
||||
{{ ref('silver_dex__univ3_pools') }}
|
||||
),
|
||||
token_prices AS (
|
||||
SELECT
|
||||
hour,
|
||||
token_address,
|
||||
price
|
||||
FROM
|
||||
{{ ref('silver__prices') }}
|
||||
WHERE
|
||||
hour :: DATE IN (
|
||||
SELECT
|
||||
DISTINCT block_timestamp :: DATE
|
||||
FROM
|
||||
base_swaps
|
||||
)
|
||||
),
|
||||
FINAL AS (
|
||||
SELECT
|
||||
'optimism' AS blockchain,
|
||||
block_number,
|
||||
block_timestamp,
|
||||
tx_hash,
|
||||
contract_address AS pool_address,
|
||||
pool_name,
|
||||
recipient,
|
||||
sender,
|
||||
tick,
|
||||
liquidity,
|
||||
COALESCE(
|
||||
liquidity / pow(
|
||||
10,
|
||||
(
|
||||
(
|
||||
token0_decimals + token1_decimals
|
||||
) / 2
|
||||
)
|
||||
),
|
||||
0
|
||||
) AS liquidity_adjusted,
|
||||
event_index,
|
||||
amount0_unadj / pow(
|
||||
10,
|
||||
COALESCE(
|
||||
token0_decimals,
|
||||
18
|
||||
)
|
||||
) AS amount0_adjusted,
|
||||
amount1_unadj / pow(
|
||||
10,
|
||||
COALESCE(
|
||||
token1_decimals,
|
||||
18
|
||||
)
|
||||
) AS amount1_adjusted,
|
||||
COALESCE(div0(ABS(amount1_adjusted), ABS(amount0_adjusted)), 0) AS price_1_0,
|
||||
COALESCE(div0(ABS(amount0_adjusted), ABS(amount1_adjusted)), 0) AS price_0_1,
|
||||
token0_address,
|
||||
token1_address,
|
||||
token0_symbol,
|
||||
token1_symbol,
|
||||
p0.price AS token0_price,
|
||||
p1.price AS token1_price,
|
||||
CASE
|
||||
WHEN token0_decimals IS NOT NULL THEN ROUND(
|
||||
token0_price * amount0_adjusted,
|
||||
2
|
||||
)
|
||||
END AS amount0_usd,
|
||||
CASE
|
||||
WHEN token1_decimals IS NOT NULL THEN ROUND(
|
||||
token1_price * amount1_adjusted,
|
||||
2
|
||||
)
|
||||
END AS amount1_usd,
|
||||
_log_id,
|
||||
_inserted_timestamp,
|
||||
origin_function_signature,
|
||||
origin_from_address,
|
||||
origin_to_address,
|
||||
amount0_unadj,
|
||||
amount1_unadj,
|
||||
token0_decimals,
|
||||
token1_decimals
|
||||
FROM
|
||||
base_swaps
|
||||
INNER JOIN pool_data
|
||||
ON pool_data.pool_address = base_swaps.contract_address
|
||||
LEFT JOIN token_prices p0
|
||||
ON p0.token_address = token0_address
|
||||
AND p0.hour = DATE_TRUNC(
|
||||
'hour',
|
||||
block_timestamp
|
||||
)
|
||||
LEFT JOIN token_prices p1
|
||||
ON p1.token_address = token1_address
|
||||
AND p1.hour = DATE_TRUNC(
|
||||
'hour',
|
||||
block_timestamp
|
||||
)
|
||||
)
|
||||
SELECT
|
||||
*
|
||||
FROM
|
||||
FINAL qualify(ROW_NUMBER() over(PARTITION BY _log_id
|
||||
ORDER BY
|
||||
_inserted_timestamp DESC)) = 1
|
||||
80
models/silver/dex/silver_dex__univ3_swaps.yml
Normal file
80
models/silver/dex/silver_dex__univ3_swaps.yml
Normal file
@ -0,0 +1,80 @@
|
||||
version: 2
|
||||
models:
|
||||
- name: silver_dex__univ3_swaps
|
||||
tests:
|
||||
- dbt_utils.unique_combination_of_columns:
|
||||
combination_of_columns:
|
||||
- _LOG_ID
|
||||
columns:
|
||||
- name: AMOUNT0_UNADJ
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- decimal
|
||||
- float
|
||||
- name: AMOUNT1_UNADJ
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- decimal
|
||||
- float
|
||||
- name: BLOCK_NUMBER
|
||||
tests:
|
||||
- not_null
|
||||
- name: BLOCK_TIMESTAMP
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_row_values_to_have_recent_data:
|
||||
datepart: day
|
||||
interval: 1
|
||||
- name: BLOCKCHAIN
|
||||
tests:
|
||||
- not_null
|
||||
- name: LIQUIDITY
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- decimal
|
||||
- float
|
||||
- name: LIQUIDITY_ADJUSTED
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- decimal
|
||||
- float
|
||||
- name: EVENT_INDEX
|
||||
tests:
|
||||
- not_null
|
||||
- name: POOL_ADDRESS
|
||||
tests:
|
||||
- not_null
|
||||
- name: PRICE_0_1
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- decimal
|
||||
- float
|
||||
- name: PRICE_1_0
|
||||
tests:
|
||||
- not_null
|
||||
- dbt_expectations.expect_column_values_to_be_in_type_list:
|
||||
column_type_list:
|
||||
- decimal
|
||||
- float
|
||||
- name: RECIPIENT
|
||||
tests:
|
||||
- not_null
|
||||
- name: SENDER
|
||||
tests:
|
||||
- not_null
|
||||
- name: TICK
|
||||
tests:
|
||||
- not_null
|
||||
- name: TX_HASH
|
||||
tests:
|
||||
- not_null
|
||||
@ -39,24 +39,24 @@ all_records AS (
|
||||
network :: STRING AS network,
|
||||
chain_id :: STRING AS blockchain,
|
||||
tx_count :: INTEGER AS tx_count,
|
||||
udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
header :difficulty :: STRING
|
||||
) :: INTEGER AS difficulty,
|
||||
udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
header :totalDifficulty :: STRING
|
||||
) :: INTEGER AS total_difficulty,
|
||||
header: extraData :: STRING AS extra_data,
|
||||
udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
header :gasLimit :: STRING
|
||||
) :: INTEGER AS gas_limit,
|
||||
udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
header :gasUsed :: STRING
|
||||
) :: INTEGER AS gas_used,
|
||||
header: "hash" :: STRING AS HASH,
|
||||
header: parentHash :: STRING AS parent_hash,
|
||||
header: receiptsRoot :: STRING AS receipts_root,
|
||||
header: sha3Uncles :: STRING AS sha3_uncles,
|
||||
udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
header: "size" :: STRING
|
||||
) :: INTEGER AS SIZE,
|
||||
CASE
|
||||
|
||||
@ -35,7 +35,7 @@ token_names AS (
|
||||
function_signature,
|
||||
read_output,
|
||||
regexp_substr_all(SUBSTR(read_output, 3, len(read_output)), '.{64}') AS segmented_output,
|
||||
PUBLIC.udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
segmented_output [1] :: STRING
|
||||
) AS sub_len,
|
||||
TRY_HEX_DECODE_STRING(
|
||||
@ -69,7 +69,7 @@ token_symbols AS (
|
||||
function_signature,
|
||||
read_output,
|
||||
regexp_substr_all(SUBSTR(read_output, 3, len(read_output)), '.{64}') AS segmented_output,
|
||||
PUBLIC.udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
segmented_output [1] :: STRING
|
||||
) AS sub_len,
|
||||
TRY_HEX_DECODE_STRING(
|
||||
@ -99,7 +99,7 @@ token_symbols AS (
|
||||
token_decimals AS (
|
||||
SELECT
|
||||
contract_address,
|
||||
PUBLIC.udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
read_output :: STRING
|
||||
) AS token_decimals,
|
||||
LENGTH(token_decimals) AS dec_length
|
||||
|
||||
@ -67,7 +67,7 @@ logs AS (
|
||||
tx_status,
|
||||
ingested_at,
|
||||
_inserted_timestamp,
|
||||
udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
VALUE :logIndex :: STRING
|
||||
) :: INTEGER AS event_index,
|
||||
VALUE :address :: STRING AS contract_address,
|
||||
|
||||
@ -242,7 +242,7 @@ adj_eth_prices AS (
|
||||
all_prices AS (
|
||||
SELECT
|
||||
HOUR,
|
||||
token_address,
|
||||
LOWER(token_address) AS token_address,
|
||||
symbol,
|
||||
decimals,
|
||||
price,
|
||||
@ -253,7 +253,7 @@ all_prices AS (
|
||||
UNION ALL
|
||||
SELECT
|
||||
HOUR,
|
||||
token_address,
|
||||
LOWER(token_address) AS token_address,
|
||||
symbol,
|
||||
decimals,
|
||||
price,
|
||||
|
||||
@ -96,10 +96,10 @@ base_table AS (
|
||||
flattened_traces AS (
|
||||
SELECT
|
||||
DATA :from :: STRING AS from_address,
|
||||
udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
DATA :gas :: STRING
|
||||
) AS gas,
|
||||
udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
DATA :gasUsed :: STRING
|
||||
) AS gas_used,
|
||||
DATA :input :: STRING AS input,
|
||||
@ -108,7 +108,7 @@ flattened_traces AS (
|
||||
DATA :to :: STRING AS to_address,
|
||||
DATA :type :: STRING AS TYPE,
|
||||
CASE
|
||||
WHEN DATA :type :: STRING = 'CALL' THEN udf_hex_to_int(
|
||||
WHEN DATA :type :: STRING = 'CALL' THEN ethereum.public.udf_hex_to_int(
|
||||
DATA :value :: STRING
|
||||
) / pow(
|
||||
10,
|
||||
|
||||
@ -10,14 +10,14 @@ WITH base_table AS (
|
||||
block_timestamp,
|
||||
block_id :: INTEGER AS block_number,
|
||||
tx_id :: STRING AS tx_hash,
|
||||
udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
tx :nonce :: STRING
|
||||
) :: INTEGER AS nonce,
|
||||
tx_block_index :: INTEGER AS POSITION,
|
||||
tx :from :: STRING AS from_address,
|
||||
tx :to :: STRING AS to_address,
|
||||
(
|
||||
udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
tx :value :: STRING
|
||||
) / pow(
|
||||
10,
|
||||
@ -26,11 +26,11 @@ WITH base_table AS (
|
||||
) :: FLOAT AS eth_value,
|
||||
tx :blockHash :: STRING AS block_hash,
|
||||
(
|
||||
udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
tx :gasPrice :: STRING
|
||||
)
|
||||
) :: FLOAT AS gas_price,
|
||||
udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
tx :gas :: STRING
|
||||
) :: INTEGER AS gas_limit,
|
||||
tx :input :: STRING AS DATA,
|
||||
@ -38,13 +38,13 @@ WITH base_table AS (
|
||||
WHEN tx :receipt :status :: STRING = '0x1' THEN 'SUCCESS'
|
||||
ELSE 'FAIL'
|
||||
END AS status,
|
||||
udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
tx :receipt :gasUsed :: STRING
|
||||
) :: INTEGER AS gas_used,
|
||||
udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
tx :receipt :cumulativeGasUsed :: STRING
|
||||
) :: INTEGER AS cumulative_Gas_Used,
|
||||
udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
tx :receipt :effectiveGasPrice :: STRING
|
||||
) :: INTEGER AS effective_Gas_Price,
|
||||
ingested_at :: TIMESTAMP AS ingested_at,
|
||||
@ -54,7 +54,7 @@ WITH base_table AS (
|
||||
'traces'
|
||||
) AS tx_json,
|
||||
COALESCE(
|
||||
udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
tx :receipt :l1Fee :: STRING
|
||||
) :: FLOAT,
|
||||
0
|
||||
@ -64,13 +64,13 @@ WITH base_table AS (
|
||||
0
|
||||
) :: FLOAT AS l1_fee_scalar,
|
||||
COALESCE(
|
||||
udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
tx :receipt :l1GasPrice :: STRING
|
||||
) :: FLOAT,
|
||||
0
|
||||
) AS l1_gas_price,
|
||||
COALESCE(
|
||||
udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
tx :receipt :l1GasUsed :: STRING
|
||||
) :: FLOAT,
|
||||
0
|
||||
|
||||
@ -70,7 +70,7 @@ find_missing_events AS (
|
||||
contract_address :: STRING AS contract_address,
|
||||
CONCAT('0x', SUBSTR(topics [1], 27, 40)) :: STRING AS from_address,
|
||||
CONCAT('0x', SUBSTR(topics [2], 27, 40)) :: STRING AS to_address,
|
||||
COALESCE(udf_hex_to_int(topics [3] :: STRING), udf_hex_to_int(SUBSTR(DATA, 3, 64))) :: FLOAT AS raw_amount,
|
||||
COALESCE(ethereum.public.udf_hex_to_int(topics [3] :: STRING), ethereum.public.udf_hex_to_int(SUBSTR(DATA, 3, 64))) :: FLOAT AS raw_amount,
|
||||
event_index,
|
||||
_inserted_timestamp
|
||||
FROM
|
||||
|
||||
@ -27,10 +27,10 @@ WITH swap_events AS (
|
||||
event_name,
|
||||
regexp_substr_all(SUBSTR(DATA, 3, len(DATA)), '.{64}') AS segmented_data,
|
||||
TRY_TO_NUMBER(
|
||||
public.udf_hex_to_int(segmented_data[0]::string)::integer
|
||||
ethereum.public.udf_hex_to_int(segmented_data[0]::string)::integer
|
||||
) AS amountIn,
|
||||
TRY_TO_NUMBER(
|
||||
public.udf_hex_to_int(segmented_data[1]::string)::integer
|
||||
ethereum.public.udf_hex_to_int(segmented_data[1]::string)::integer
|
||||
) AS amountOut,
|
||||
CONCAT('0x', SUBSTR(topics [3] :: STRING, 27, 40)) AS token_out,
|
||||
CONCAT('0x', SUBSTR(topics [2] :: STRING, 27, 40)) AS token_in,
|
||||
@ -131,19 +131,20 @@ SELECT
|
||||
amount_in,
|
||||
case
|
||||
WHEN amount_in * pIn.price <= 5 * amount_out * pOut.price
|
||||
AND amount_out * pOut.price <= 5 * amount_in * pIn.price THEN amount_in * pIn.price
|
||||
when pOut.price is null then amount_in * pIn.price
|
||||
AND amount_out * pOut.price <= 5 * amount_in * pIn.price THEN ROUND(amount_in * pIn.price,2)
|
||||
when pOut.price is null then ROUND(amount_in * pIn.price,2)
|
||||
ELSE NULL
|
||||
END AS amount_in_usd,
|
||||
amount_out,
|
||||
CASE
|
||||
WHEN amount_in * pIn.price <= 5 * amount_out * pOut.price
|
||||
AND amount_out * pOut.price <= 5 * amount_in * pIn.price THEN amount_out * pOut.price
|
||||
when pIn.price is null then amount_out * pOut.price
|
||||
AND amount_out * pOut.price <= 5 * amount_in * pIn.price THEN ROUND(amount_out * pOut.price,2)
|
||||
when pIn.price is null then ROUND(amount_out * pOut.price,2)
|
||||
ELSE NULL
|
||||
END AS amount_out_usd,
|
||||
tx_to,
|
||||
event_index,
|
||||
event_name,
|
||||
token_in,
|
||||
token_out,
|
||||
symbol_in,
|
||||
|
||||
@ -51,6 +51,7 @@ SELECT
|
||||
origin_to_address,
|
||||
tx_hash,
|
||||
event_index,
|
||||
event_name,
|
||||
platform,
|
||||
contract_address,
|
||||
pool_address,
|
||||
@ -166,7 +167,8 @@ SELECT
|
||||
CASE
|
||||
WHEN fee_currency IS NULL AND lp_fee <> 0 AND pool_address <> '0xce9accfbb25eddce91845c3a7c3d1613d1d7081f' THEN token_address_in
|
||||
ELSE fee_currency
|
||||
END AS lp_fee_token_address
|
||||
END AS lp_fee_token_address,
|
||||
_log_id
|
||||
FROM
|
||||
{{ ref('silver__velodrome_swaps') }}
|
||||
base
|
||||
|
||||
@ -2,7 +2,11 @@ version: 2
|
||||
models:
|
||||
- name: velodrome__ez_swaps
|
||||
description: 'This table contains details on swaps executed on Velodrome.'
|
||||
|
||||
|
||||
tests:
|
||||
- dbt_utils.unique_combination_of_columns:
|
||||
combination_of_columns:
|
||||
- _LOG_ID
|
||||
columns:
|
||||
- name: BLOCK_NUMBER
|
||||
description: '{{ doc("opt_block_number") }}'
|
||||
@ -124,4 +128,8 @@ models:
|
||||
where: LP_FEE <> 0 and POOL_ADDRESS <> '0xce9accfbb25eddce91845c3a7c3d1613d1d7081f'
|
||||
- dbt_expectations.expect_column_values_to_match_regex:
|
||||
regex: 0[xX][0-9a-fA-F]+
|
||||
- name: _LOG_ID
|
||||
description: '{{ doc("opt_log_id_events") }}'
|
||||
tests:
|
||||
- not_null
|
||||
|
||||
@ -27,7 +27,7 @@ WITH lp_actions AS (
|
||||
WHEN topics [0] :: STRING IN(
|
||||
'0xdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496',
|
||||
'0x4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f'
|
||||
) THEN PUBLIC.udf_hex_to_int(
|
||||
) THEN ethereum.public.udf_hex_to_int(
|
||||
segmented_data [0] :: STRING
|
||||
) :: FLOAT
|
||||
END AS amount0_unadj,
|
||||
@ -35,7 +35,7 @@ WITH lp_actions AS (
|
||||
WHEN topics [0] :: STRING IN(
|
||||
'0xdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496',
|
||||
'0x4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f'
|
||||
) THEN PUBLIC.udf_hex_to_int(
|
||||
) THEN ethereum.public.udf_hex_to_int(
|
||||
segmented_data [1] :: STRING
|
||||
) :: FLOAT
|
||||
END AS amount1_unadj,
|
||||
@ -47,7 +47,7 @@ WITH lp_actions AS (
|
||||
END AS to_address,
|
||||
CASE
|
||||
WHEN topics [0] :: STRING = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef' THEN (
|
||||
PUBLIC.udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
segmented_data [0] :: STRING
|
||||
) :: FLOAT / pow(
|
||||
10,
|
||||
|
||||
@ -17,19 +17,19 @@ WITH velo_distributions AS (
|
||||
contract_address,
|
||||
event_index,
|
||||
regexp_substr_all(SUBSTR(DATA, 3, len(DATA)), '.{64}') AS segmented_data,
|
||||
PUBLIC.udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
segmented_data [0] :: STRING
|
||||
) :: INTEGER AS token_id,
|
||||
PUBLIC.udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
segmented_data [1] :: STRING
|
||||
) :: FLOAT / pow(
|
||||
10,
|
||||
18
|
||||
) :: FLOAT AS claimed_amount,
|
||||
PUBLIC.udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
segmented_data [2] :: STRING
|
||||
) :: INTEGER AS claim_epoch,
|
||||
PUBLIC.udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
segmented_data [3] :: STRING
|
||||
) :: INTEGER AS max_epoch,
|
||||
'venft_distribution' AS reward_type,
|
||||
@ -66,7 +66,7 @@ staking_rewards AS (
|
||||
contract_address,
|
||||
event_index,
|
||||
regexp_substr_all(SUBSTR(DATA, 3, len(DATA)), '.{64}') AS segmented_data,
|
||||
PUBLIC.udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
segmented_data [0] :: STRING
|
||||
) :: INTEGER AS claimed_amount,
|
||||
CONCAT('0x', SUBSTR(topics [1] :: STRING, 27, 40)) AS from_address,
|
||||
|
||||
@ -19,18 +19,18 @@ WITH new_locks AS (
|
||||
regexp_substr_all(SUBSTR(DATA, 3, len(DATA)), '.{64}') AS segmented_data,
|
||||
CONCAT('0x', SUBSTR(topics [1] :: STRING, 27, 40)) AS provider_address,
|
||||
CASE
|
||||
WHEN topics [0] :: STRING = '0xff04ccafc360e16b67d682d17bd9503c4c6b9a131f6be6325762dc9ffc7de624' THEN TO_TIMESTAMP(PUBLIC.udf_hex_to_int(topics [2] :: STRING))
|
||||
WHEN topics [0] :: STRING = '0xff04ccafc360e16b67d682d17bd9503c4c6b9a131f6be6325762dc9ffc7de624' THEN TO_TIMESTAMP(ethereum.public.udf_hex_to_int(topics [2] :: STRING))
|
||||
WHEN topics [0] :: STRING = '0x02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca94' THEN TO_TIMESTAMP(
|
||||
PUBLIC.udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
segmented_data [2] :: STRING
|
||||
)
|
||||
)
|
||||
END AS unlock_date,
|
||||
PUBLIC.udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
segmented_data [0] :: STRING
|
||||
) AS token_id,
|
||||
(
|
||||
PUBLIC.udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
segmented_data [1] :: STRING
|
||||
) :: FLOAT / pow(
|
||||
10,
|
||||
@ -38,7 +38,7 @@ WITH new_locks AS (
|
||||
)
|
||||
) :: FLOAT AS velo_value,
|
||||
CASE
|
||||
WHEN topics [0] :: STRING = '0xff04ccafc360e16b67d682d17bd9503c4c6b9a131f6be6325762dc9ffc7de624' THEN PUBLIC.udf_hex_to_int(
|
||||
WHEN topics [0] :: STRING = '0xff04ccafc360e16b67d682d17bd9503c4c6b9a131f6be6325762dc9ffc7de624' THEN ethereum.public.udf_hex_to_int(
|
||||
segmented_data [2] :: STRING
|
||||
)
|
||||
END AS deposit_type,
|
||||
|
||||
@ -4,42 +4,11 @@
|
||||
tags = ['velodrome']
|
||||
) }}
|
||||
|
||||
WITH pool_backfill AS (
|
||||
WITH pool_creation AS (
|
||||
|
||||
SELECT
|
||||
LOWER(pool_address) AS pool_address,
|
||||
pool_name,
|
||||
pool_type,
|
||||
token0_symbol,
|
||||
token1_symbol,
|
||||
LOWER(token0_address) AS token0_address,
|
||||
LOWER(token1_address) AS token1_address,
|
||||
token0_decimals,
|
||||
token1_decimals,
|
||||
'1970-01-01' :: DATE AS _inserted_timestamp
|
||||
FROM
|
||||
{{ ref('silver__velo_pool_backfill') }}
|
||||
),
|
||||
token_backfill AS (
|
||||
SELECT
|
||||
symbol,
|
||||
op_token_address AS contract_address,
|
||||
decimals
|
||||
FROM
|
||||
{{ ref('silver__velo_tokens_backup') }}
|
||||
),
|
||||
contracts AS (
|
||||
SELECT
|
||||
address AS contract_address,
|
||||
symbol,
|
||||
decimals
|
||||
FROM
|
||||
{{ ref('core__dim_contracts') }}
|
||||
),
|
||||
new_pools AS (
|
||||
SELECT
|
||||
block_timestamp AS created_timestamp,
|
||||
block_number AS created_block,
|
||||
block_number,
|
||||
tx_hash AS created_hash,
|
||||
CONCAT('0x', SUBSTR(topics [1] :: STRING, 27, 40)) AS token0_address,
|
||||
CONCAT('0x', SUBSTR(topics [2] :: STRING, 27, 40)) AS token1_address,
|
||||
@ -57,184 +26,219 @@ new_pools AS (
|
||||
{{ ref('silver__logs') }}
|
||||
WHERE
|
||||
topics [0] :: STRING = '0xc4805696c66d7cf352fc1d6bb633ad5ee82f6cb577c453024b6e0eb8306c6fc9' -- pair created
|
||||
AND contract_address = '0x25cbddb98b35ab1ff77413456b31ec81a6b6b746' -- velo depolyer
|
||||
|
||||
AND contract_address = '0x25cbddb98b35ab1ff77413456b31ec81a6b6b746' --velo deployer
|
||||
{% if is_incremental() %}
|
||||
AND _inserted_timestamp >= (
|
||||
AND pool_address NOT IN (
|
||||
SELECT
|
||||
MAX(
|
||||
_inserted_timestamp
|
||||
) :: DATE - 2
|
||||
DISTINCT pool_address
|
||||
FROM
|
||||
{{ this }}
|
||||
)
|
||||
{% endif %}
|
||||
),
|
||||
|
||||
{% if is_incremental() %}
|
||||
missing_pools AS (
|
||||
SELECT
|
||||
created_timestamp,
|
||||
created_block,
|
||||
created_hash,
|
||||
token0_address,
|
||||
token1_address,
|
||||
pool_address,
|
||||
pool_type,
|
||||
_inserted_timestamp
|
||||
FROM
|
||||
{{ this }}
|
||||
WHERE
|
||||
pool_name IS NULL
|
||||
OR token0_decimals IS NULL
|
||||
OR token1_decimals IS NULL
|
||||
),
|
||||
{% endif %}
|
||||
function_sigs AS (
|
||||
|
||||
heal_pools AS (
|
||||
SELECT
|
||||
created_timestamp,
|
||||
created_block,
|
||||
created_hash,
|
||||
token0_address,
|
||||
token1_address,
|
||||
pool_address,
|
||||
pool_type,
|
||||
_inserted_timestamp
|
||||
FROM
|
||||
new_pools
|
||||
|
||||
{% if is_incremental() %}
|
||||
UNION
|
||||
SELECT
|
||||
created_timestamp,
|
||||
created_block,
|
||||
created_hash,
|
||||
token0_address,
|
||||
token1_address,
|
||||
pool_address,
|
||||
pool_type,
|
||||
_inserted_timestamp
|
||||
'0x06fdde03' AS function_sig,
|
||||
'name' AS function_name
|
||||
UNION ALL
|
||||
SELECT
|
||||
'0x95d89b41' AS function_sig,
|
||||
'symbol' AS function_name
|
||||
UNION ALL
|
||||
SELECT
|
||||
'0x313ce567' AS function_sig,
|
||||
'decimals' AS function_name
|
||||
),
|
||||
|
||||
all_inputs AS (
|
||||
|
||||
SELECT
|
||||
pool_address AS contract_address,
|
||||
block_number,
|
||||
function_sig,
|
||||
(ROW_NUMBER() OVER (PARTITION BY pool_address
|
||||
ORDER BY block_number)) - 1 AS function_input,
|
||||
'pool' AS address_label
|
||||
FROM pool_creation
|
||||
JOIN function_sigs ON 1=1
|
||||
UNION ALL
|
||||
SELECT
|
||||
token0_address AS contract_address,
|
||||
block_number,
|
||||
function_sig,
|
||||
(ROW_NUMBER() OVER (PARTITION BY token0_address
|
||||
ORDER BY block_number)) - 1 AS function_input,
|
||||
'token0' AS address_label
|
||||
FROM pool_creation
|
||||
JOIN function_sigs ON 1=1
|
||||
UNION ALL
|
||||
SELECT
|
||||
token1_address AS contract_address,
|
||||
block_number,
|
||||
function_sig,
|
||||
(ROW_NUMBER() OVER (PARTITION BY token1_address
|
||||
ORDER BY block_number)) - 1 AS function_input,
|
||||
'token1' AS address_label
|
||||
FROM pool_creation
|
||||
JOIN function_sigs ON 1=1
|
||||
),
|
||||
|
||||
ready_reads_all AS (
|
||||
SELECT
|
||||
contract_address,
|
||||
block_number,
|
||||
function_sig,
|
||||
function_input,
|
||||
CONCAT(
|
||||
'[\'',
|
||||
contract_address,
|
||||
'\',',
|
||||
block_number,
|
||||
',\'',
|
||||
function_sig,
|
||||
'\',\'',
|
||||
function_input,
|
||||
'\']'
|
||||
) AS read_input
|
||||
FROM all_inputs
|
||||
),
|
||||
|
||||
batch_reads_all AS (
|
||||
|
||||
SELECT
|
||||
CONCAT('[', LISTAGG(read_input, ','), ']') AS batch_read
|
||||
FROM
|
||||
missing_pools
|
||||
{% endif %}
|
||||
ready_reads_all
|
||||
),
|
||||
add_meta AS (
|
||||
SELECT
|
||||
created_timestamp,
|
||||
created_block,
|
||||
created_hash,
|
||||
token0_address,
|
||||
COALESCE(
|
||||
tb0.symbol,
|
||||
c0.symbol
|
||||
) AS token0_symbol,
|
||||
COALESCE(
|
||||
tb1.symbol,
|
||||
c1.symbol
|
||||
) AS token1_symbol,
|
||||
COALESCE(
|
||||
tb0.decimals,
|
||||
c0.decimals
|
||||
) AS token0_decimals,
|
||||
COALESCE(
|
||||
tb1.decimals,
|
||||
c1.decimals
|
||||
) AS token1_decimals,
|
||||
token1_address,
|
||||
pool_address,
|
||||
pool_type,
|
||||
_inserted_timestamp
|
||||
FROM
|
||||
heal_pools
|
||||
LEFT JOIN token_backfill AS tb0
|
||||
ON token0_address = tb0.contract_address
|
||||
LEFT JOIN contracts AS c0
|
||||
ON token0_address = c0.contract_address
|
||||
LEFT JOIN token_backfill AS tb1
|
||||
ON token1_address = tb1.contract_address
|
||||
LEFT JOIN contracts AS c1
|
||||
ON token1_address = c1.contract_address
|
||||
),
|
||||
name_pools AS (
|
||||
SELECT
|
||||
created_timestamp,
|
||||
created_block,
|
||||
created_hash,
|
||||
token0_address,
|
||||
token0_symbol,
|
||||
token1_symbol,
|
||||
token0_decimals,
|
||||
token1_decimals,
|
||||
token1_address,
|
||||
pool_address,
|
||||
pool_type,
|
||||
_inserted_timestamp,
|
||||
CONCAT(
|
||||
LOWER(
|
||||
LEFT(
|
||||
pool_type,
|
||||
1
|
||||
)
|
||||
),
|
||||
'AMM-',
|
||||
token0_symbol,
|
||||
'/',
|
||||
token1_symbol
|
||||
) AS pool_name
|
||||
FROM
|
||||
add_meta
|
||||
),
|
||||
combine AS (
|
||||
SELECT
|
||||
pool_address,
|
||||
pool_name,
|
||||
pool_type,
|
||||
token0_symbol,
|
||||
token1_symbol,
|
||||
token0_address,
|
||||
token1_address,
|
||||
token0_decimals,
|
||||
token1_decimals,
|
||||
created_timestamp,
|
||||
created_block,
|
||||
created_hash,
|
||||
_inserted_timestamp
|
||||
FROM
|
||||
name_pools
|
||||
UNION ALL
|
||||
SELECT
|
||||
pool_address,
|
||||
pool_name,
|
||||
pool_type,
|
||||
token0_symbol,
|
||||
token1_symbol,
|
||||
token0_address,
|
||||
token1_address,
|
||||
token0_decimals,
|
||||
token1_decimals,
|
||||
NULL AS created_timestamp,
|
||||
NULL AS created_block,
|
||||
NULL AS created_hash,
|
||||
_inserted_timestamp
|
||||
FROM
|
||||
pool_backfill
|
||||
)
|
||||
|
||||
all_reads AS (
|
||||
|
||||
SELECT
|
||||
LOWER(pool_address) AS pool_address,
|
||||
ethereum.streamline.udf_json_rpc_read_calls(
|
||||
node_url,
|
||||
headers,
|
||||
PARSE_JSON(batch_read)
|
||||
) AS read_output,
|
||||
SYSDATE() AS _inserted_timestamp
|
||||
FROM
|
||||
batch_reads_all
|
||||
JOIN streamline.crosschain.node_mapping ON 1=1
|
||||
AND chain = 'optimism'
|
||||
WHERE
|
||||
EXISTS (
|
||||
SELECT
|
||||
1
|
||||
FROM
|
||||
ready_reads_all
|
||||
LIMIT
|
||||
1
|
||||
)
|
||||
),
|
||||
|
||||
reads_adjusted AS (
|
||||
|
||||
SELECT
|
||||
VALUE :id :: STRING AS read_id,
|
||||
VALUE :result :: STRING AS read_result,
|
||||
SPLIT(
|
||||
read_id,
|
||||
'-'
|
||||
) AS read_id_object,
|
||||
read_id_object [0] :: STRING AS contract_address,
|
||||
read_id_object [1] :: STRING AS block_number,
|
||||
read_id_object [2] :: STRING AS function_sig,
|
||||
read_id_object [3] :: STRING AS function_input,
|
||||
_inserted_timestamp
|
||||
FROM
|
||||
all_reads,
|
||||
LATERAL FLATTEN(
|
||||
input => read_output [0] :data
|
||||
)
|
||||
),
|
||||
|
||||
details AS (
|
||||
|
||||
SELECT
|
||||
contract_address,
|
||||
function_sig,
|
||||
function_name,
|
||||
read_result,
|
||||
regexp_substr_all(SUBSTR(read_result, 3, len(read_result)), '.{64}') AS segmented_output,
|
||||
_inserted_timestamp
|
||||
FROM reads_adjusted
|
||||
LEFT JOIN function_sigs USING(function_sig)
|
||||
),
|
||||
|
||||
pools AS (
|
||||
|
||||
SELECT
|
||||
d.contract_address AS pool_address,
|
||||
MIN(CASE WHEN function_name = 'symbol' THEN TRY_HEX_DECODE_STRING(segmented_output [2] :: STRING) END) AS pool_symbol,
|
||||
MIN(CASE WHEN function_name = 'name' THEN TRY_HEX_DECODE_STRING(segmented_output [2] :: STRING) END) AS pool_name,
|
||||
MIN(CASE
|
||||
WHEN read_result::STRING = '0x' THEN NULL
|
||||
ELSE ethereum.public.udf_hex_to_int(read_result::STRING)
|
||||
END)::INTEGER AS pool_decimals,
|
||||
MAX(_inserted_timestamp) AS _inserted_timestamp
|
||||
FROM details d
|
||||
LEFT JOIN all_inputs i ON d.contract_address = i.contract_address
|
||||
WHERE address_label = 'pool'
|
||||
GROUP BY 1
|
||||
),
|
||||
|
||||
token0 AS (
|
||||
|
||||
SELECT
|
||||
d.contract_address AS token0_address,
|
||||
MIN(CASE WHEN function_name = 'symbol' THEN TRY_HEX_DECODE_STRING(segmented_output [2] :: STRING) END) AS token0_symbol,
|
||||
MIN(CASE WHEN function_name = 'name' THEN TRY_HEX_DECODE_STRING(segmented_output [2] :: STRING) END) AS token0_name,
|
||||
MIN(CASE
|
||||
WHEN function_name = 'decimals' AND read_result::STRING <> '0x' THEN ethereum.public.udf_hex_to_int(segmented_output [0] :: STRING)
|
||||
ELSE NULL
|
||||
END)::INTEGER AS token0_decimals,
|
||||
MAX(_inserted_timestamp) AS _inserted_timestamp
|
||||
FROM details d
|
||||
LEFT JOIN all_inputs i ON d.contract_address = i.contract_address
|
||||
WHERE address_label = 'token0'
|
||||
GROUP BY 1
|
||||
),
|
||||
|
||||
token1 AS (
|
||||
|
||||
SELECT
|
||||
d.contract_address AS token1_address,
|
||||
MIN(CASE WHEN function_name = 'symbol' THEN TRY_HEX_DECODE_STRING(segmented_output [2] :: STRING) END) AS token1_symbol,
|
||||
MIN(CASE WHEN function_name = 'name' THEN TRY_HEX_DECODE_STRING(segmented_output [2] :: STRING) END) AS token1_name,
|
||||
MIN(CASE
|
||||
WHEN function_name = 'decimals' AND read_result::STRING <> '0x' THEN ethereum.public.udf_hex_to_int(segmented_output [0] :: STRING)
|
||||
ELSE NULL
|
||||
END)::INTEGER AS token1_decimals,
|
||||
MAX(_inserted_timestamp) AS _inserted_timestamp
|
||||
FROM details d
|
||||
LEFT JOIN all_inputs i ON d.contract_address = i.contract_address
|
||||
WHERE address_label = 'token1'
|
||||
GROUP BY 1
|
||||
)
|
||||
|
||||
SELECT
|
||||
pool_address,
|
||||
pool_name,
|
||||
pool_type,
|
||||
pool_symbol,
|
||||
pool_decimals,
|
||||
token0_symbol,
|
||||
token1_symbol,
|
||||
LOWER(token0_address) AS token0_address,
|
||||
LOWER(token1_address) AS token1_address,
|
||||
c.token0_address,
|
||||
c.token1_address,
|
||||
token0_decimals,
|
||||
token1_decimals,
|
||||
created_timestamp,
|
||||
created_block,
|
||||
block_number AS created_block,
|
||||
created_hash,
|
||||
_inserted_timestamp
|
||||
FROM
|
||||
combine qualify(ROW_NUMBER() over(PARTITION BY pool_address
|
||||
ORDER BY
|
||||
_inserted_timestamp DESC) = 1)
|
||||
a._inserted_timestamp
|
||||
FROM pools a
|
||||
LEFT JOIN pool_creation c USING(pool_address)
|
||||
LEFT JOIN token0 ON c.token0_address = token0.token0_address
|
||||
LEFT JOIN token1 ON c.token1_address = token1.token1_address
|
||||
|
||||
@ -21,11 +21,11 @@ WITH staking_actions AS (
|
||||
WHEN topics [0] :: STRING = '0xdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7' THEN 'deposit'
|
||||
WHEN topics [0] :: STRING = '0xf341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb567' THEN 'withdraw'
|
||||
END AS staking_action_type,
|
||||
PUBLIC.udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
segmented_data [0] :: STRING
|
||||
) :: INTEGER AS token_id,
|
||||
(
|
||||
PUBLIC.udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
segmented_data [1] :: STRING
|
||||
) :: FLOAT / pow(
|
||||
10,
|
||||
@ -66,7 +66,7 @@ token_transfer AS (
|
||||
CONCAT('0x', SUBSTR(topics [1] :: STRING, 27, 40)) AS gauge_address,
|
||||
CONCAT('0x', SUBSTR(topics [2] :: STRING, 27, 40)) AS lp_provider_address,
|
||||
(
|
||||
PUBLIC.udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
segmented_data [0] :: STRING
|
||||
) :: FLOAT / pow(
|
||||
10,
|
||||
|
||||
@ -23,43 +23,44 @@ WITH base AS (
|
||||
WHEN topics [0] :: STRING = '0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822' THEN CONCAT('0x', SUBSTR(topics [2] :: STRING, 27, 40))
|
||||
END AS to_address,
|
||||
CASE
|
||||
WHEN topics [0] :: STRING = '0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822' THEN PUBLIC.udf_hex_to_int(
|
||||
WHEN topics [0] :: STRING = '0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822' THEN ethereum.public.udf_hex_to_int(
|
||||
segmented_data [0] :: STRING
|
||||
) :: FLOAT
|
||||
END AS amount0_in_unadj,
|
||||
CASE
|
||||
WHEN topics [0] :: STRING = '0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822' THEN PUBLIC.udf_hex_to_int(
|
||||
WHEN topics [0] :: STRING = '0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822' THEN ethereum.public.udf_hex_to_int(
|
||||
segmented_data [1] :: STRING
|
||||
) :: FLOAT
|
||||
END AS amount1_in_unadj,
|
||||
CASE
|
||||
WHEN topics [0] :: STRING = '0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822' THEN PUBLIC.udf_hex_to_int(
|
||||
WHEN topics [0] :: STRING = '0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822' THEN ethereum.public.udf_hex_to_int(
|
||||
segmented_data [2] :: STRING
|
||||
) :: FLOAT
|
||||
END AS amount0_out_unadj,
|
||||
CASE
|
||||
WHEN topics [0] :: STRING = '0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822' THEN PUBLIC.udf_hex_to_int(
|
||||
WHEN topics [0] :: STRING = '0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822' THEN ethereum.public.udf_hex_to_int(
|
||||
segmented_data [3] :: STRING
|
||||
) :: FLOAT
|
||||
END AS amount1_out_unadj,
|
||||
CASE
|
||||
WHEN topics [0] :: STRING = '0x112c256902bf554b6ed882d2936687aaeb4225e8cd5b51303c90ca6cf43a8602' THEN PUBLIC.udf_hex_to_int(
|
||||
WHEN topics [0] :: STRING = '0x112c256902bf554b6ed882d2936687aaeb4225e8cd5b51303c90ca6cf43a8602' THEN ethereum.public.udf_hex_to_int(
|
||||
segmented_data [0] :: STRING
|
||||
) :: FLOAT
|
||||
END AS fees0_adj,
|
||||
CASE
|
||||
WHEN topics [0] :: STRING = '0x112c256902bf554b6ed882d2936687aaeb4225e8cd5b51303c90ca6cf43a8602' THEN PUBLIC.udf_hex_to_int(
|
||||
WHEN topics [0] :: STRING = '0x112c256902bf554b6ed882d2936687aaeb4225e8cd5b51303c90ca6cf43a8602' THEN ethereum.public.udf_hex_to_int(
|
||||
segmented_data [1] :: STRING
|
||||
) :: FLOAT
|
||||
END AS fees1_adj,
|
||||
CASE
|
||||
WHEN topics [0] :: STRING = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef' THEN PUBLIC.udf_hex_to_int(
|
||||
WHEN topics [0] :: STRING = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef' THEN ethereum.public.udf_hex_to_int(
|
||||
segmented_data [0] :: STRING
|
||||
) :: FLOAT
|
||||
END AS transfer_amount,
|
||||
_log_id,
|
||||
_inserted_timestamp,
|
||||
event_index,
|
||||
event_name,
|
||||
'velodrome' AS platform,
|
||||
topics [0] :: STRING AS function_type
|
||||
FROM
|
||||
@ -142,6 +143,7 @@ swaps AS (
|
||||
_log_id,
|
||||
_inserted_timestamp,
|
||||
event_index,
|
||||
event_name,
|
||||
platform,
|
||||
ROW_NUMBER() over (
|
||||
PARTITION BY tx_hash,
|
||||
@ -173,6 +175,7 @@ SELECT
|
||||
_log_id,
|
||||
_inserted_timestamp,
|
||||
event_index,
|
||||
event_name,
|
||||
platform,
|
||||
COALESCE(
|
||||
fees_adj,
|
||||
|
||||
@ -18,11 +18,11 @@ WITH votes_base AS (
|
||||
event_index,
|
||||
regexp_substr_all(SUBSTR(DATA, 3, len(DATA)), '.{64}') AS segmented_data,
|
||||
CONCAT('0x', SUBSTR(topics [1] :: STRING, 27, 40)) AS from_address,
|
||||
PUBLIC.udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
segmented_data [0] :: STRING
|
||||
) AS token_id,
|
||||
(
|
||||
PUBLIC.udf_hex_to_int(
|
||||
ethereum.public.udf_hex_to_int(
|
||||
segmented_data [1] :: STRING
|
||||
) / pow(
|
||||
10,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user