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))
Чтобы у вас ошибка при запросе выдавалась, а не просто как абракадабра. На этом пока всё и