DeFi. Ищем смарт-контракты депозитов, пулов, vaults (хранилищ) на примере Morpho
Вводные
Часто бывает нужно найти адрес смарт-контракта, но делать это руками утомительно. Поэтому покажу на примере Morpho полуавтоматический поиск с помощью простого python-скрипта. А заодно можете второй скрипт (см. ниже) использовать для вставки данных (APY, скажем) в свои проекты.
Дисклеймер
Код предоставляет "как есть", потому что создан в демонстративных, а не каких-либо иных целях.
Узнаём адреса VAULTS
Само API лежит по ссылке: https://blue-api.morpho.org/graphql: (сами же контракты лежат здесь: https://docs.morpho.org/addresses/):
import requests
url = "https://blue-api.morpho.org/graphql"
query = """
query {
vaults {
items {
address
name
symbol
}
}
}
"""
headers = {"Content-Type": "application/json"}
response = requests.post(url, headers=headers, json={"query": query})
if response.status_code == 200:
data = response.json()
vaults = data["data"]["vaults"]["items"]
for v in vaults:
print(f"{v['symbol'] or '[NO SYMBOL]'} — {v['name']} — {v['address']}")
else:
print("[X] Ошибка запроса:", response.status_code, response.text)В результате вы получаете выборку хранилищ:
- mmTestUSDC — mmTestUSDC — 0xFE333f2c3c55138fAD556B6C1F1D9103c7268071
- MC.wM — MEV Capital M^0 Vault — 0xfbDEE8670b273E12b019210426E70091464b02Ab
- aZCHF — Alpha ZCHF Vault — 0xFa7ED49Eb24A6117D8a3168EEE69D26b45C40C63
- etc.
Далее можно попробовать сделать выборку параметров по конкретному VAULT.
Параметры VAULT
import requests
vault_address = "0xFa7ED49Eb24A6117D8a3168EEE69D26b45C40C63"
query = """
query ($address: String!) {
vaultByAddress(address: $address) {
id
name
symbol
state {
apy
netApy
totalAssetsUsd
}
}
}
"""
variables = {"address": vault_address}
response = requests.post(
"https://blue-api.morpho.org/graphql",
headers={"Content-Type": "application/json"},
json={"query": query, "variables": variables}
)
result = response.json()
vault_data = result.get("data", {}).get("vaultByAddress")
if vault_data:
print(f"{vault_data['name']} ({vault_data['symbol']})")
print(f"APY: {vault_data['state']['apy'] * 100:.2f}%")
print(f"Net APY: {vault_data['state']['netApy'] * 100:.2f}%")
print(f"TVL (USD): ${vault_data['state']['totalAssetsUsd']:.2f}")
else:
print("[X] Vault не найден или ошибка в адресе")Здесь вы получите примерно следующие показатели:
Итоги
С помощью простых запросов вы всегда можете агрегировать данные из разных источников, выводить их на собственных ресурсах и использовать, например, в ботах.
К слову, код №02 можно чуть оптимизировать:
import requests
vault_address = "0xFa7ED49Eb24A6117D8a3168EEE69D26b45C40C63"
query = """
query ($address: String!) {
vaultByAddress(address: $address) {
id
name
symbol
state {
apy
netApy
totalAssetsUsd
}
}
}
"""
variables = {"address": vault_address}
try:
response = requests.post(
"https://blue-api.morpho.org/graphql",
headers={"Content-Type": "application/json"},
json={"query": query, "variables": variables}
)
result = response.json()
print("DEBUG RESPONSE:", result) # Добавим отладочный вывод
vault_data = result.get("data", {}).get("vaultByAddress")
if vault_data:
print(f"{vault_data['name']} ({vault_data['symbol']})")
print(f"APY: {vault_data['state']['apy'] * 100:.2f}%")
print(f"Net APY: {vault_data['state']['netApy'] * 100:.2f}%")
print(f"TVL (USD): ${vault_data['state']['totalAssetsUsd']:.2f}")
else:
print("[X] Vault не найден или ошибка в адресе")
except Exception as e:
print("[X] Произошла ошибка:", str(e))Чтобы у вас ошибка при запросе выдавалась, а не просто как абракадабра. На этом пока всё и