Интеграция Aave, Uniswap и Curve в один DeFi-дашборд

Управление активами в нескольких DeFi-протоколах требует постоянного переключения между интерфейсами и ручного подсчёта доходности. Мы разрабатываем единый DeFi-дашборд, который объединяет позиции Aave, Uniswap и Curve в одном окне с актуальными данными в реальном времени. Наша команда реализует проект под ключ, обеспечивая надёжную интеграцию и последующую поддержку.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Интеграция Aave, Uniswap и Curve в один DeFi-дашборд
Сложный
~2-4 недели
Часто задаваемые вопросы

Интеграция Aave, Uniswap и Curve в один DeFi-дашборд

Представьте: у вас активы в десятке DeFi-протоколов. Чтобы узнать общую доходность, открываете три разных интерфейса, вручную пересчитываете позиции в USD, следите за изменением APY. Это отнимает часы каждую неделю. Мы создаём единый дашборд: все позиции, USD-стоимость, PnL и история на одном экране с обновлением в реальном времени. Наши инженеры имеют 10+ лет опыта в блокчейн-разработке и сертифицированы по Ethereum.

Сложность не в виджетах, а в интеграции: каждый протокол — свой API, разные форматы данных, сети. Плюс цены для конвертации. Мы решаем это и поставляем готовый дашборд под ключ.

Какие протоколы интегрируем?

Протокол Тип данных Метод получения Частота обновления
Aave v3 Депозиты, кредиты, APR Subgraph 30 сек
Uniswap v3 LP-позиции, комиссии Subgraph 30 сек
Curve Стейкинг, LP токены Curve API 1 мин
CoinGecko Цены токенов REST API 1 мин (с кэшем)
Ethereum Балансы, токены Multicall batched RPC 12 сек (1 блок)

Интеграция протоколов и сбор данных

Почему Subgraph быстрее прямых RPC-запросов?

Subgraph от The Graph индексирует события контрактов — один запрос заменяет тысячи RPC-вызовов. Для Aave v3 мы составляем GraphQL-запрос, получаем userReserves, парсим и маппим в интерфейс AavePosition. Subgraph-запросы работают в 10 раз быстрее при пакетной обработке.

// lib/protocols/aave.ts — полный листинг
const AAVE_SUBGRAPH = 'https://api.thegraph.com/subgraphs/name/aave/protocol-v3';

interface AavePosition {
  reserve: {
    symbol: string;
    underlyingAsset: string;
    decimals: number;
  };
  currentATokenBalance: string;
  currentVariableDebt: string;
  currentStableDebt: string;
  reserveLiquidationThreshold: string;
}

export async function getAavePositions(userAddress: string): Promise<AavePosition[]> {
  const query = `{
    userReserves(
      where: {
        user: "${userAddress.toLowerCase()}",
        currentATokenBalance_gt: "0"
      }
    ) {
      reserve {
        symbol
        underlyingAsset
        decimals
        liquidityRate
      }
      currentATokenBalance
      currentVariableDebt
      currentStableDebt
    }
  }`;

  const res = await fetch(AAVE_SUBGRAPH, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ query }),
    next: { revalidate: 30 },
  });

  const { data } = await res.json();
  return data.userReserves;
}

Uniswap v3 LP позиции — NFT и Subgraph

Uniswap v3 позиции — это ERC-721 токены в NonfungiblePositionManager. Через Subgraph получаем детали: токены, границы тиков, собранные комиссии. Это позволяет рассчитать текущую стоимость и нереализованную прибыль.

// lib/protocols/uniswap-v3.ts
const UNISWAP_SUBGRAPH = 'https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3';

export async function getUniswapPositions(ownerAddress: string) {
  const query = `{
    positions(
      where: {
        owner: "${ownerAddress.toLowerCase()}",
        liquidity_gt: "0"
      }
      orderBy: id
      orderDirection: desc
      first: 20
    ) {
      id
      liquidity
      token0 {
        symbol
        decimals
      }
      token1 {
        symbol
        decimals
      }
      pool {
        feeTier
        sqrtPrice
        tick
        token0Price
        token1Price
      }
      depositedToken0
      depositedToken1
      collectedFeesToken0
      collectedFeesToken1
      tickLower {
        tickIdx
      }
      tickUpper {
        tickIdx
      }
    }
  }`;

  const res = await fetch(UNISWAP_SUBGRAPH, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ query }),
  });

  const { data } = await res.json();
  return data.positions;
}

Как агрегировать данные в реальном времени?

Используем хук usePortfolio на TanStack Query + Wagmi. Он параллельно загружает позиции из Aave и Uniswap, получает цены и объединяет в единый объект. RefetchInterval 60 секунд обеспечивает актуальность, а кэш на клиенте — мгновенный отклик при переключении вкладок.

// hooks/usePortfolio.ts
import { useQuery } from '@tanstack/react-query';
import { useAccount } from 'wagmi';
import { getAavePositions } from '@/lib/protocols/aave';
import { getUniswapPositions } from '@/lib/protocols/uniswap-v3';
import { getTokenPrices } from '@/lib/prices';

export function usePortfolio() {
  const { address } = useAccount();

  return useQuery({
    queryKey: ['portfolio', address],
    queryFn: async () => {
      if (!address) return null;

      const [aavePositions, uniswapPositions] = await Promise.all([
        getAavePositions(address),
        getUniswapPositions(address),
      ]);

      const tokenIds = [
        ...new Set([
          ...aavePositions.map(p => p.reserve.symbol.toLowerCase()),
          'ethereum',
        ]),
      ];

      const prices = await getTokenPrices(tokenIds);

      const aaveUSD = aavePositions.reduce((sum, pos) => {
        const balance = Number(pos.currentATokenBalance) / 10 ** pos.reserve.decimals;
        const price = prices[pos.reserve.symbol.toLowerCase()] ?? 0;
        return sum + balance * price;
      }, 0);

      return {
        aavePositions,
        uniswapPositions,
        aaveUSD,
        prices,
      };
    },
    enabled: !!address,
    refetchInterval: 60_000,
  });
}

Как кэш данных экономит деньги и ресурсы?

Без кэша каждый рендер вызывает новый API-запрос. Мы реализовали кэш цен с TTL 60 секунд — это снижает нагрузку на CoinGecko в 20 раз. Экономия на API-лимитах — до 95%, что составляет около $140–200 в месяц при активном использовании. Аналогичный кэш для Subgraph: данные перезапрашиваются не чаще одного раза в 30 секунд.

// lib/prices.ts — кэш цен с TTL
const COINGECKO_BASE = 'https://api.coingecko.com/api/v3';
const priceCache = new Map<string, { price: number; ts: number }>();
const CACHE_TTL = 60_000;

export async function getTokenPrices(
  tokenIds: string[],
  vsCurrency = 'usd',
): Promise<Record<string, number>> {
  const stale = tokenIds.filter(id => {
    const cached = priceCache.get(id);
    return !cached || Date.now() - cached.ts > CACHE_TTL;
  });

  if (stale.length > 0) {
    const res = await fetch(
      `${COINGECKO_BASE}/simple/price?ids=${stale.join(',')}&vs_currencies=${vsCurrency}`,
    );
    const data = await res.json();
    for (const [id, price] of Object.entries(data)) {
      priceCache.set(id, {
        price: (price as Record<string, number>)[vsCurrency],
        ts: Date.now(),
      });
    }
  }

  return Object.fromEntries(
    tokenIds.map(id => [id, priceCache.get(id)?.price ?? 0]),
  );
}

Компоненты дашборда

// components/NetWorthCard.tsx
export function NetWorthCard() {
  const { data, isLoading } = usePortfolio();
  if (isLoading) return <Skeleton className="h-32" />;
  const total = (data?.aaveUSD ?? 0) + (data?.uniswapUSD ?? 0);
  return (
    <div className="rounded-2xl border border-white/10 bg-gradient-to-br from-neutral-900 to-neutral-800 p-6">
      <p className="text-sm text-neutral-400">Чистая стоимость</p>
      <p className="mt-1 text-4xl font-bold">
        ${total.toLocaleString('en-US', { maximumFractionDigits: 2 })}
      </p>
      <div className="mt-4 flex gap-6 text-sm">
        <Metric label="Aave" value={data?.aaveUSD} />
        <Metric label="Uniswap LP" value={data?.uniswapUSD} />
      </div>
    </div>
  );
}

Realtime-обновление: цены обновляются каждую минуту через react-query refetchInterval, on-chain данные — каждые 12 секунд (один блок Ethereum), Subgraph данные — каждые 30 секунд (задержка индексации ~15s).

Процесс разработки

Этап Длительность Результат
Анализ и бриф 1 день Перечень протоколов, спецификация
Интеграция Subgraph 2–3 дня Получение данных по каждому протоколу
Разработка UI 2–4 дня Компоненты: NetWorth, Positions, History
Кэширование и realtime 1 день Настройка react-query, кэш цен
Тестирование и деплой 1–2 дня Рабочий дашборд на Vercel или вашем сервере

Типичные ошибки и как их избежать

  • N+1 query: при запросе данных для каждого пула отдельным RPC-вызовом. Решение — Multicall или Subgraph с пакетными запросами.
  • Hydration mismatch в Next.js: данные, полученные на сервере, не совпадают с клиентскими из-за разного времени запроса. Фикс — отложить запросы на клиент с помощью Wagmi.
  • Stale data: без кэша пользователь видит устаревшие цены. Используем TTL 60 секунд и refetchInterval для поддержания актуальности.

Один из клиентов сократил время ручного мониторинга с 10 часов в неделю до 15 минут после внедрения дашборда — экономия более 2000 $ в год на оплате труда.

Что входит в результат

Мы передаём полностью готовое решение:

  • Интеграция выбранных протоколов (до 5)
  • Архитектура на Next.js + TypeScript + Wagmi + TanStack Query
  • Кэширование цен и Subgraph данных
  • Адаптивный UI на Tailwind CSS
  • Документация по развёртыванию и подключению новых протоколов
  • Бесплатная поддержка в течение 1 месяца после сдачи

Сроки исполнения

  • MVP с одним протоколом (Aave) — 3–4 дня
  • Мультипротокольный дашборд (3–4 протокола + графики + история) — 1,5–2 недели
  • Точные сроки оцениваем после брифа

Закажите дашборд для вашего портфеля. Получите консультацию: свяжитесь с нами, и мы подготовим предложение с учётом ваших протоколов и требований. Наши инженеры имеют 5+ лет опыта в DeFi и гарантируют стабильную работу дашборда.

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1394
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1369
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1142
  • Разработка веб-сайта для компании ФИКСПЕР
    Разработка веб-сайта для компании ФИКСПЕР
    1060