March 27

DeFi. Ищем смарт-контракты депозитов, пулов, vaults (хранилищ) на примере Morpho

DeFi. Morpho. Go!

Вводные

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

В результате вы получаете выборку хранилищ:

Выборка VAULTS через скрипт

Вот такого формата:

  • mmTestUSDC — mmTestUSDC — 0xFE333f2c3c55138fAD556B6C1F1D9103c7268071
  • MC.wM — MEV Capital M^0 Vault — 0xfbDEE8670b273E12b019210426E70091464b02Ab
  • aZCHF — Alpha ZCHF Vault — 0xFa7ED49Eb24A6117D8a3168EEE69D26b45C40C63
  • etc.

То есть у вас получается:

  • Название актива
  • Название VAULT
  • Адрес

Далее можно попробовать сделать выборку параметров по конкретному 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 не найден или ошибка в адресе")

Здесь вы получите примерно следующие показатели:

Параметры VAULT 0xFa7ED49Eb24A6117D8a3168EEE69D26b45C40C63

То есть - список их такой:

  • Название VAULT
  • APY
  • Net APY
  • TVL

Итоги

С помощью простых запросов вы всегда можете агрегировать данные из разных источников, выводить их на собственных ресурсах и использовать, например, в ботах.

К слову, код №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))

Чтобы у вас ошибка при запросе выдавалась, а не просто как абракадабра. На этом пока всё и

До!