Skip to main content

Calculating Total Value Locked in Liquidity Pools using DEX Data

Automated Market Makers (AMMs) are an innovative new class of smart contracts introduced in decentralized exchange protocols like Uniswap, allowing users to permissionlessly provision liquidity for digital asset trading activity without needing a traditional central order book. However, an important aspect of providing users of these pools is understanding how the total USD value of the assets allocated to the contract can fluctuate over time, leading to impermanent loss for liquidity providers. In this notebook, we explore how Coin Metrics DEX market metadata can be combined with Reference Rates and ATLAS search engine capabilities to construct a timeseries representation pool TVL, allowing market participants to make more informed decisions about DEX market making and trading.

Resources​

This notebook demonstrates basic functionality offered by the Coin Metrics Python API Client, ATLAS blockchain search engine, and DEX Market Data.

Coin Metrics offers a vast assortment of data for hundreds of cryptoassets. The Python API Client allows for easy access to this data using Python without needing to create your own wrappers using requests and other such libraries.

To understand the data that Coin Metrics offers, feel free to peruse the resources below.

File Download​

Download the entire notebook as either a jupyter notebook to run yourself or as a pdf from the two links below

Download DEFI_liquidity_pool_tvl.ipynb

Download DEFI_liquidity_pool_tvl.pdf

Notebook Setup​

from os import environ
import sys
import pandas as pd
import numpy as np
import logging
from datetime import date, datetime, timedelta
from coinmetrics.api_client import CoinMetricsClient
import plotly.graph_objs as go
import logging
from pytz import timezone as timezone_conv
from datetime import timezone as timezone_info
from dateutil.relativedelta import relativedelta
import matplotlib.dates as mdates
import matplotlib.pyplot as plt
# %matplotlib inline
logging.basicConfig(
format='%(asctime)s %(levelname)-8s %(message)s',
level=logging.INFO,
datefmt='%Y-%m-%d %H:%M:%S'
)
# We recommend privately storing your API key in your local environment.
try:
api_key = environ["CM_API_KEY"]
logging.info("Using API key found in environment")
except KeyError:
api_key = ""
logging.info("API key not found. Using community client")

client = CoinMetricsClient(api_key)
2024-10-09 14:36:29 INFO Using API key found in environment

DEX Market Reference Data​

The reference-data/markets endpoint returns a list of available markets meeting specified criteria. Users can pass in a list of markets, exchanges, or market types (spot, futures, options). For DEX markets, the endpoint also returns key liquidity pool metadata, such as fee tier and pool contract address.

uni_v3_markets = client.reference_data_markets(
exchange = 'uniswap_v3_eth'
).to_dataframe()
uni_v3_markets
marketexchangebasequotepairsymboltypesize_assetmargin_assetstrike...order_price_incrementorder_price_minorder_price_maxorder_size_minorder_taker_feeorder_maker_feemargin_trading_enabledexperimentalbase_nativequote_native
0uniswap_v3_eth-1-1inch-dai-spotuniswap_v3_eth1inchdai1inch-dai<NA>spot<NA><NA><NA>...<NA><NA><NA><NA><NA><NA><NA>True<NA><NA>
1uniswap_v3_eth-1-1inch-usdc-spotuniswap_v3_eth1inchusdc1inch-usdc<NA>spot<NA><NA><NA>...<NA><NA><NA><NA><NA><NA><NA>True<NA><NA>
2uniswap_v3_eth-1-1inch-weth-spotuniswap_v3_eth1inchweth1inch-weth<NA>spot<NA><NA><NA>...<NA><NA><NA><NA><NA><NA><NA>True<NA><NA>
3uniswap_v3_eth-1-ageur_eth-eurcv_eth-spotuniswap_v3_ethageur_etheurcv_ethageur_eth-eurcv_eth<NA>spot<NA><NA><NA>...<NA><NA><NA><NA><NA><NA><NA>True<NA><NA>
4uniswap_v3_eth-1-ageur_eth-usdc-spotuniswap_v3_ethageur_ethusdcageur_eth-usdc<NA>spot<NA><NA><NA>...<NA><NA><NA><NA><NA><NA><NA>True<NA><NA>
..................................................................
1638uniswap_v3_eth-agg-yfi-cvx-spotuniswap_v3_ethyficvxyfi-cvx<NA>spot<NA><NA><NA>...<NA><NA><NA><NA><NA><NA><NA>True<NA><NA>
1639uniswap_v3_eth-agg-yfi-link-spotuniswap_v3_ethyfilinkyfi-link<NA>spot<NA><NA><NA>...<NA><NA><NA><NA><NA><NA><NA>True<NA><NA>
1640uniswap_v3_eth-agg-yfi-usdc-spotuniswap_v3_ethyfiusdcyfi-usdc<NA>spot<NA><NA><NA>...<NA><NA><NA><NA><NA><NA><NA>True<NA><NA>
1641uniswap_v3_eth-agg-yfi-wbtc-spotuniswap_v3_ethyfiwbtcyfi-wbtc<NA>spot<NA><NA><NA>...<NA><NA><NA><NA><NA><NA><NA>True<NA><NA>
1642uniswap_v3_eth-agg-yfi-weth-spotuniswap_v3_ethyfiwethyfi-weth<NA>spot<NA><NA><NA>...<NA><NA><NA><NA><NA><NA><NA>True<NA><NA>

1643 rows × 39 columns

weth_usdc_markets = uni_v3_markets.loc[(uni_v3_markets['base']=='usdc') & (uni_v3_markets['quote']=='weth')]
weth_usdc_pools = weth_usdc_markets.dropna(subset=['contract_address'])
weth_usdc_pools
marketexchangebasequotepairsymboltypesize_assetmargin_assetstrike...order_price_incrementorder_price_minorder_price_maxorder_size_minorder_taker_feeorder_maker_feemargin_trading_enabledexperimentalbase_nativequote_native
72uniswap_v3_eth-1-usdc-weth-spotuniswap_v3_ethusdcwethusdc-weth<NA>spot<NA><NA><NA>...<NA><NA><NA><NA><NA><NA><NA>True<NA><NA>
281uniswap_v3_eth-2-usdc-weth-spotuniswap_v3_ethusdcwethusdc-weth<NA>spot<NA><NA><NA>...<NA><NA><NA><NA><NA><NA><NA>True<NA><NA>
650uniswap_v3_eth-3-usdc-weth-spotuniswap_v3_ethusdcwethusdc-weth<NA>spot<NA><NA><NA>...<NA><NA><NA><NA><NA><NA><NA>True<NA><NA>
1045uniswap_v3_eth-4-usdc-weth-spotuniswap_v3_ethusdcwethusdc-weth<NA>spot<NA><NA><NA>...<NA><NA><NA><NA><NA><NA><NA>True<NA><NA>

4 rows × 39 columns

Fetch contract balances over time with ATLAS​

Now that we have a list of target liquidity pool contracts, we can use ATLAS blockchain search engine to query for balance updates in the pool for each asset.

assets = ['usdc','weth']
pools = weth_usdc_pools['contract_address'].to_list()
pools_tvl = pd.DataFrame()
start = datetime.now() - timedelta(days=30)

for asset in assets:
tvl = client.get_list_of_balance_updates_v2(
asset=asset,
accounts=pools,
start_time = start
).parallel(max_workers=10,time_increment=relativedelta(days=1)).to_dataframe()

# Add the asset name to a new 'asset' column
tvl['asset'] = asset
pools_tvl = pd.concat([pools_tvl, tvl], axis=0)
Exporting to dataframe type: 100%|█████████████████████████████████████████████████████████████| 31/31 [00:28<00:00, 1.09it/s]
Exporting to dataframe type: 100%|█████████████████████████████████████████████████████████████| 31/31 [00:41<00:00, 1.34s/it]
# Create a mapping from contract_address to market
contract_to_market = weth_usdc_pools.set_index('contract_address')['market']
contract_to_market
contract_address
e0554a476a092703abdb3ef35c80e0d76d32939f uniswap_v3_eth-1-usdc-weth-spot
88e6a0c2ddd26feeb64f039a2c41296fcb3f5640 uniswap_v3_eth-2-usdc-weth-spot
8ad599c3a0ff1de082011efddc58f1908eb6e6d8 uniswap_v3_eth-3-usdc-weth-spot
7bea39867e4169dbe237d55c8242a8f2fcdcc387 uniswap_v3_eth-4-usdc-weth-spot
Name: market, dtype: string
pools_tvl['market'] = pools_tvl['account'].map(contract_to_market)
pools_tvl
chain_sequence_numberaccountaccount_creation_heightchangeprevious_balancenew_balancetransaction_sequence_numbern_debitsn_creditsblock_hash...consensus_timecredittotal_receivedtotal_sentprevious_debit_heightprevious_credit_heightprevious_chain_sequence_numbertxidassetmarket
08896464689928601688e6a0c2ddd26feeb64f039a2c41296fcb3f564012376729-60426.46649772674047.98276972613621.51627204019999361951096131a3e3702feb38e1ce25c71773962cdf6ed8beb5ee2......2024-09-09 14:37:23+00:00False738732040663.426392738659427041.910034207136952071369488964642604318722a8f5e44bb9ae9f93a3d1b11b5fce58fe2bcad8ba73561f...usdcuniswap_v3_eth-2-usdc-weth-spot
18896464689928602288e6a0c2ddd26feeb64f039a2c41296fcb3f564012376729-551.74521872613621.51627272613069.77105404020000361951096131a3e3702feb38e1ce25c71773962cdf6ed8beb5ee2......2024-09-09 14:37:23+00:00False738732040663.426392738659427593.6553962071369620713694889646468992860163072cd48442d1e61b7232590812737dabdd52d60ed2181...usdcuniswap_v3_eth-2-usdc-weth-spot
28896465119425331888e6a0c2ddd26feeb64f039a2c41296fcb3f564012376729-1189.38200372613069.77105472611880.389051040200013619510d1b93582ac0242d6c4d78a2e15fa7a14cb8f23cdd315a7......2024-09-09 14:37:35+00:00False738732040663.426392738659428783.037231207136962071369488964646899286022785845bb01a0c4c95a4fce1a5b684b607eff59db5e35a0...usdcuniswap_v3_eth-2-usdc-weth-spot
388964651194253320e0554a476a092703abdb3ef35c80e0d76d32939f13616454-1185.605465601863.20449600677.5990251231967225267d1b93582ac0242d6c4d78a2e15fa7a14cb8f23cdd315a7......2024-09-09 14:37:35+00:00False5991391248.0468025990790570.447777207136952071369588964642604318733785845bb01a0c4c95a4fce1a5b684b607eff59db5e35a0...usdcuniswap_v3_eth-1-usdc-weth-spot
48896465119425333888e6a0c2ddd26feeb64f039a2c41296fcb3f564012376729-1178.09951472611880.38905172610702.289537040200023619510d1b93582ac0242d6c4d78a2e15fa7a14cb8f23cdd315a7......2024-09-09 14:37:35+00:00False738732040663.426392738659429961.136841207136972071369488964651194253318e8c9bf688ee4d41f22d95f34936a425edb4f61244318b7...usdcuniswap_v3_eth-2-usdc-weth-spot
..................................................................
27378789893038440054825e0554a476a092703abdb3ef35c80e0d76d32939f1361645411.459842397.2327982408.6926381292522301912de4360d0ae6f824e4ca7525da2268497de62906fec744c......2024-10-09 18:33:11+00:00True4128265.5908434125856.898204209298532092985089893034145087672aefc38b1fa84766bb2e50b8565d7e6b23031d98a28ccd8...wethuniswap_v3_eth-1-usdc-weth-spot
27378889893038440054892e0554a476a092703abdb3ef35c80e0d76d32939f13616454-0.0155232408.6926382408.6771150292523301912de4360d0ae6f824e4ca7525da2268497de62906fec744c......2024-10-09 18:33:11+00:00False4128265.5908434125856.9137272092985320929854898930384400548259b83a0daab76cd6db6aedbafc5f1e61adc0f5d31e72e47...wethuniswap_v3_eth-1-usdc-weth-spot
2737898989303844005496888e6a0c2ddd26feeb64f039a2c41296fcb3f564012376729-2.12320927357.19308627355.069877036858724078043de4360d0ae6f824e4ca7525da2268497de62906fec744c......2024-10-09 18:33:11+00:00False378530260.402821378502905.332944209298522092985489893038440054823e79fe9981166fccb9fb15b872da4ee5f8ea4f581a86e0d...wethuniswap_v3_eth-2-usdc-weth-spot
2737908989305132495680888e6a0c2ddd26feeb64f039a2c41296fcb3f564012376729-0.11939227355.06987727354.9504850368587340780432823efc897ab6e43f4382e7670f1cfa4aa621571e79d9d......2024-10-09 18:33:47+00:00False378530260.402821378502905.452336209298542092985489893038440054968a46cab246dea451a42d4b26c79994c5fc06ce1a10a53a7...wethuniswap_v3_eth-2-usdc-weth-spot
2737918989305132495689488e6a0c2ddd26feeb64f039a2c41296fcb3f564012376729-0.82517427354.95048527354.1253110368587440780432823efc897ab6e43f4382e7670f1cfa4aa621571e79d9d......2024-10-09 18:33:47+00:00False378530260.402821378502906.277512092985720929854898930513249568083004b50008190b1b36f5cdf602b63b9f9792267d89f2fe...wethuniswap_v3_eth-2-usdc-weth-spot

547648 rows × 21 columns

# Sort by 'consensus_time', 'market', and 'chain_sequence_number'
pools_tvl_sorted = pools_tvl.sort_values(by=['consensus_time', 'market', 'chain_sequence_number'], ascending=[True, True, False])

# Drop duplicates, keeping only the first occurrence (in this case, the highest 'chain_sequence_number')
pools_tvl_deduplicated = pools_tvl_sorted.drop_duplicates(subset=['consensus_time', 'market','asset'], keep='first')
pools_tvl_clean = pools_tvl_deduplicated[['market','consensus_time','asset','new_balance']].copy()
pools_tvl_clean['new_balance'] = pools_tvl_clean.apply(
lambda row: -row['new_balance'] if row['asset'] == 'weth' else row['new_balance'],
axis=1
)
pools_tvl_clean
marketconsensus_timeassetnew_balance
1uniswap_v3_eth-2-usdc-weth-spot2024-09-09 14:37:23+00:00weth-3.126659e+04
1uniswap_v3_eth-2-usdc-weth-spot2024-09-09 14:37:23+00:00usdc7.261307e+07
3uniswap_v3_eth-1-usdc-weth-spot2024-09-09 14:37:35+00:00weth-4.664425e+02
3uniswap_v3_eth-1-usdc-weth-spot2024-09-09 14:37:35+00:00usdc6.006776e+05
4uniswap_v3_eth-2-usdc-weth-spot2024-09-09 14:37:35+00:00weth-3.126763e+04
...............
273850uniswap_v3_eth-2-usdc-weth-spot2024-10-09 18:36:11+00:00usdc8.006068e+07
273853uniswap_v3_eth-1-usdc-weth-spot2024-10-09 18:36:23+00:00usdc2.503766e+06
273851uniswap_v3_eth-2-usdc-weth-spot2024-10-09 18:36:23+00:00usdc8.005964e+07
273854uniswap_v3_eth-2-usdc-weth-spot2024-10-09 18:36:47+00:00usdc8.005916e+07
273855uniswap_v3_eth-1-usdc-weth-spot2024-10-09 18:36:59+00:00usdc2.493272e+06

382679 rows × 4 columns

df = pd.DataFrame(pools_tvl_clean)
df['consensus_time'] = pd.to_datetime(df['consensus_time'])
# Split the DataFrame by market and store in a dictionary
market_dfs = {market: group.pivot(index='consensus_time', columns='asset', values='new_balance').ffill()
for market, group in df.groupby('market')}
display(market_dfs)
{'uniswap_v3_eth-1-usdc-weth-spot': asset usdc weth
consensus_time
2024-09-09 14:37:35+00:00 6.006776e+05 -466.442498
2024-09-09 14:37:47+00:00 5.927582e+05 -469.913266
2024-09-09 14:38:11+00:00 5.834235e+05 -474.007791
2024-09-09 14:38:23+00:00 5.852796e+05 -473.193522
2024-09-09 14:38:35+00:00 5.783144e+05 -476.250599
... ... ...
2024-10-09 18:35:11+00:00 2.504156e+06 -2408.677115
2024-10-09 18:35:35+00:00 2.507156e+06 -2408.677115
2024-10-09 18:36:11+00:00 2.503081e+06 -2408.677115
2024-10-09 18:36:23+00:00 2.503766e+06 -2408.677115
2024-10-09 18:36:59+00:00 2.493272e+06 -2408.677115

[93275 rows x 2 columns],
'uniswap_v3_eth-2-usdc-weth-spot': asset usdc weth
consensus_time
2024-09-09 14:37:23+00:00 7.261307e+07 -31266.590416
2024-09-09 14:37:35+00:00 7.261070e+07 -31267.627526
2024-09-09 14:37:47+00:00 7.244846e+07 -31338.733700
2024-09-09 14:37:59+00:00 7.240161e+07 -31359.275300
2024-09-09 14:38:11+00:00 7.227468e+07 -31414.964479
... ... ...
2024-10-09 18:34:47+00:00 7.997092e+07 -27354.125311
2024-10-09 18:35:35+00:00 7.998951e+07 -27354.125311
2024-10-09 18:36:11+00:00 8.006068e+07 -27354.125311
2024-10-09 18:36:23+00:00 8.005964e+07 -27354.125311
2024-10-09 18:36:47+00:00 8.005916e+07 -27354.125311

[89932 rows x 2 columns],
'uniswap_v3_eth-3-usdc-weth-spot': asset usdc weth
consensus_time
2024-09-09 14:40:11+00:00 9.802691e+06 -22517.703981
2024-09-09 15:06:59+00:00 9.815312e+06 -22512.198607
2024-09-09 15:07:11+00:00 9.836937e+06 -22502.771507
2024-09-09 15:13:23+00:00 9.817752e+06 -22511.184829
2024-09-09 15:13:47+00:00 9.797839e+06 -22519.924545
... ... ...
2024-10-09 18:15:47+00:00 1.306390e+07 -19482.217019
2024-10-09 18:16:59+00:00 1.293324e+07 -19536.165795
2024-10-09 18:17:11+00:00 1.276007e+07 -19607.732168
2024-10-09 18:18:23+00:00 1.255446e+07 -19692.807793
2024-10-09 18:23:47+00:00 1.255437e+07 -19692.792301

[7850 rows x 2 columns],
'uniswap_v3_eth-4-usdc-weth-spot': asset usdc weth
consensus_time
2024-09-09 15:17:35+00:00 288875.833924 -166.205531
2024-09-09 16:12:35+00:00 291361.212465 -165.137952
2024-09-09 16:56:47+00:00 293088.964462 -164.400079
2024-09-09 17:10:23+00:00 293188.964462 -164.357478
2024-09-09 19:54:35+00:00 293683.964462 -164.146777
... ... ...
2024-10-08 21:45:59+00:00 311219.129512 -157.116899
2024-10-08 21:56:11+00:00 311402.896623 -157.042040
2024-10-09 01:33:23+00:00 312960.239993 -156.409115
2024-10-09 01:38:11+00:00 314224.468721 -155.897241
2024-10-09 18:30:11+00:00 313919.457241 -156.023085

[435 rows x 2 columns]}

Retrieve Reference Rates to calculate the equivalent USD value for TVL​

To normalize pool TVL into USD-denominated terms, we'll leverage the Coin Metrics Reference Rate, which represents a volume-weighted median price across a subset of the asset's most highly-liquid markets.

ref_rate = client.get_asset_metrics(
assets=['usdc','weth'],
metrics='ReferenceRateUSD',
start_time=start,
frequency='1m'
).parallel(max_workers=10,time_increment=relativedelta(days=1)).to_dataframe()
Exporting to dataframe type: 100%|█████████████████████████████████████████████████████████████| 62/62 [00:06<00:00, 8.93it/s]
ref_rate = ref_rate.pivot(index='time', columns='asset', values='ReferenceRateUSD')
ref_rate
assetusdcweth
time
2024-09-09 14:38:00+00:001.0002282281.628477
2024-09-09 14:39:00+00:001.0000662278.047686
2024-09-09 14:40:00+00:000.999752279.877181
2024-09-09 14:41:00+00:000.9999172278.211943
2024-09-09 14:42:00+00:000.9998672279.118291
.........
2024-10-09 18:34:00+00:000.9998622422.199211
2024-10-09 18:35:00+00:000.9998222418.294121
2024-10-09 18:36:00+00:000.9998272420.816853
2024-10-09 18:37:00+00:000.9997892420.182517
2024-10-09 18:38:00+00:000.9998732421.764058

43441 rows × 2 columns

# Iterate over each market DataFrame
for market, df in market_dfs.items():
# Resample the DataFrame to 1-minute intervals
df_resampled = df.resample('min').last().dropna()

# Reindex the market DataFrame to the ref_rate DataFrame's index
aligned_df = df_resampled.reindex(ref_rate.index, method='nearest')

# Multiply the 'usdc' and 'weth' columns by the corresponding rate
aligned_df['usdc'] = aligned_df['usdc'] * ref_rate['usdc']
aligned_df['weth'] = aligned_df['weth'] * ref_rate['weth']

# Replace the original DataFrame in the dictionary with the updated one
market_dfs[market] = aligned_df
first_pool_key = list(market_dfs.keys())[0]
first_pool = market_dfs[first_pool_key]
first_pool
assetusdcweth
time
2024-09-09 14:38:00+00:00580007.558512-1085063.725878
2024-09-09 14:39:00+00:00591547.333378-1071736.155646
2024-09-09 14:40:00+00:00591664.869298-1072292.759274
2024-09-09 14:41:00+00:00584444.264977-1078824.970611
2024-09-09 14:42:00+00:00604433.557236-1059255.13815
.........
2024-10-09 18:34:00+00:002480138.279715-5834295.808101
2024-10-09 18:35:00+00:002506710.799699-5824889.708489
2024-10-09 18:36:00+00:002492840.090089-5830966.153299
2024-10-09 18:37:00+00:002492746.887517-5829438.242635
2024-10-09 18:38:00+00:002492954.27474-5833247.665283

43441 rows × 2 columns

Plot USD-denominated TVL for target liquidity pools​

def generate_area_figure(df, layout, columns, diverging_colors=False):
traces = []
for series in columns:
traces.append(
go.Scatter(
x=df.index,
y=df[series],
name=series,
fill='tozeroy' # Ensures filling to the zero line on the y-axis
))
return go.Figure(data=traces, layout=layout)
# Plotting for each market using Matplotlib
market_to_contract = contract_to_market.reset_index().set_index('market')
for market, data in market_dfs.items():
address = market_to_contract.loc[market, 'contract_address']
print(f'{market}')
print(f'{address}')
print(f'USDC: https://atlas.coinmetrics.io/address-details?asset=usdc&address={address}')
print(f'WETH: https://atlas.coinmetrics.io/address-details?asset=weth&address={address}')

# Create the figure and axis
fig, ax = plt.subplots(figsize=(10, 6))

# Plot the area chart for each series in the data
for column in data.columns:
ax.fill_between(data.index, data[column], label=column)

# Set chart title and labels
ax.set_title(f'{market.upper()}\nLiquidity Pool TVL', fontsize=16, color='grey')
ax.set_xlabel('', color='grey')
ax.set_ylabel('TVL Value (USD)', color='grey')

# Set grid and background colors
ax.set_facecolor('#49494a')
ax.grid(True, color='white', linestyle='--', linewidth=0.5)

# Customize tick parameters (color and size)
ax.tick_params(axis='x', colors='grey', rotation=45)
ax.tick_params(axis='y', colors='grey')
ax.xaxis.set_major_locator(mdates.DayLocator(interval=4))
ax.set_xlim([data.index.min(), data.index.max()])

# Set legend and its appearance
ax.legend(loc='upper right', fontsize=10)

# Adjust the plot layout
plt.tight_layout()

# Show the plot
plt.show()
uniswap_v3_eth-1-usdc-weth-spot
e0554a476a092703abdb3ef35c80e0d76d32939f
USDC: https://atlas.coinmetrics.io/address-details?asset=usdc&address=e0554a476a092703abdb3ef35c80e0d76d32939f
WETH: https://atlas.coinmetrics.io/address-details?asset=weth&address=e0554a476a092703abdb3ef35c80e0d76d32939f



uniswap_v3_eth-2-usdc-weth-spot
88e6a0c2ddd26feeb64f039a2c41296fcb3f5640
USDC: https://atlas.coinmetrics.io/address-details?asset=usdc&address=88e6a0c2ddd26feeb64f039a2c41296fcb3f5640
WETH: https://atlas.coinmetrics.io/address-details?asset=weth&address=88e6a0c2ddd26feeb64f039a2c41296fcb3f5640



uniswap_v3_eth-3-usdc-weth-spot
8ad599c3a0ff1de082011efddc58f1908eb6e6d8
USDC: https://atlas.coinmetrics.io/address-details?asset=usdc&address=8ad599c3a0ff1de082011efddc58f1908eb6e6d8
WETH: https://atlas.coinmetrics.io/address-details?asset=weth&address=8ad599c3a0ff1de082011efddc58f1908eb6e6d8



uniswap_v3_eth-4-usdc-weth-spot
7bea39867e4169dbe237d55c8242a8f2fcdcc387
USDC: https://atlas.coinmetrics.io/address-details?asset=usdc&address=7bea39867e4169dbe237d55c8242a8f2fcdcc387
WETH: https://atlas.coinmetrics.io/address-details?asset=weth&address=7bea39867e4169dbe237d55c8242a8f2fcdcc387