Руководство по интеграции

Base URL: https://api.crosscurve.fi Alternative Base URL: https://pusher-cdp.x.ubtk.dev (CDP API) Swagger UI: https://api.crosscurve.fi/api-docs/ | https://pusher-cdp.x.ubtk.dev/api-docs TypeScript SDK: @crosscurve/sdkarrow-up-right Общая документация: https://docs.crosscurve.fi

🚀 Быстрый старт — запустите первый своп за 15 минут 🤝 Партнёрская программа — fee sharing для интеграторов


Содержание


Обзор интеграции

Минимальный флоу

Пример: Своп CRV (Arbitrum) → CRV (Ethereum)

Пример для ознакомления с флоу. Проверяйте актуальность адресов через /tokenlist.

Важно: Адреса должны быть в формате checksum (EIP-55). Используйте ethers.utils.getAddress(address) для преобразования.

Примеры для тестирования

Исходная сеть
Целевая сеть
Токен In
Токен Out

Arbitrum (42161)

Ethereum (1)

CRV

CRV

Optimism (10)

Arbitrum (42161)

USDC

USDC

Arbitrum (42161)

Polygon (137)

USDT

USDT

Адреса токенов берите из /tokenlist.

Если маршрут не найден

Если /routing/scan возвращает пустой массив []:

  • Проверьте, что токены имеют тег can_swap

  • Попробуйте изменить сумму (слишком маленькая/большая)

  • Попробуйте другую пару токенов

  • Для маршрута нужна ликвидность в поддерживаемых пулах

cURL примеры для быстрого тестирования

Тестирование API без написания кода:


TypeScript SDK

Альтернатива прямым API-вызовам — TypeScript SDK с типизацией и встроенным auto-recovery.

Установка

Быстрый пример

Ключевые методы

Метод
Описание

init()

Загрузка сетей и токенов

getQuote()

Получение котировки

executeQuote()

Выполнение свопа

trackTransaction()

Отслеживание статуса

recover()

Ручное восстановление

Поддерживаемые провайдеры

  • ViemAdapter (рекомендуется)

  • EthersV6Adapter

  • EthersV5Adapter

  • Web3Adapter

Полная документация: GitHubarrow-up-right | npmarrow-up-right


Архитектура интеграции

Диаграмма процесса

Этапы кроссчейн-свопа

Этап
Описание
API / Действие

1. Discovery

Получение справочных данных

GET /networks, GET /tokenlist

2. Routing

Поиск доступных маршрутов (включает signature)

POST /routing/scan

3. Transaction

Формирование calldata

POST /tx/create

4. Approval

Разрешение на использование токенов

token.approve() (ERC-20)

5. Execution

Отправка транзакции

signer.sendTransaction()

6. Lookup

Получение requestId

GET /search?search={txHash}

7. Tracking

Отслеживание статуса

GET /transaction/{requestId}


Поддерживаемые сети

Актуальный список через GET /networks. Примеры:

Сеть
Chain ID
Имя в API

Ethereum

1

ethereum

Arbitrum

42161

arbitrum

Optimism

10

optimism

Polygon

137

polygon

BSC

56

bsc

Поддерживается 20+ EVM-сетей. См. /networks для актуального списка.


Справочные данные

GET /networks

Получение списка поддерживаемых блокчейн-сетей.

Параметры запроса:

Параметр
Тип
Описание

type

number

Фильтр: 0 - mainnet, 1 - testnet

Пример запроса:

Пример ответа:

Важно: Ключи — имена сетей (ethereum), не chainId.


GET /tokenlist

Получение списка токенов.

Пример запроса:

Пример ответа:

Важно: Ключи - имена сетей. Для обмена проверяйте наличие тега can_swap у токена.

Основные теги токенов:

Тег
Описание

can_swap

Доступен для кроссчейн-обмена

stable

Стейблкоин

native

Нативный токен сети (ETH, BNB...)

wrapped_native

Wrapped версия (WETH, WBNB...)

curve_lp

LP токен Curve


GET /prices/{token}

Получение цены токена в USD.

Параметры пути:

Параметр
Тип
Описание

token

string

Адрес токена (checksum)

⚠️ Важно: Используйте адрес токена, не символ. Символы (USDC, CRV) не поддерживаются. Рекомендуется использовать /prices/{token}/{chainId} для однозначности.

Пример:


GET /prices/{token}/{chainId}

Получение цены токена в конкретной сети.

Пример:

Пример ответа: 0.999827 (число, цена в USD)


POST /prices

Пакетное получение цен нескольких токенов (batch запрос).

Request Body:

Response:


Выполнение кроссчейн-свопа

POST /routing/scan

Поиск доступных маршрутов для обмена.

Headers:

Header
Обязательно
Описание

Content-Type

Да

application/json

api-key

Нет

API ключ партнёра (Free или Standard). При наличии ответ включает поля feeShare, feeShareRecipient, feeShareToken. Standard ключи также позволяют задавать feeShareBps

Request Body:

Параметры:

Поле
Тип
Обязательно
Описание

params.chainIdIn

number

Да

ID исходной сети

params.chainIdOut

number

Да

ID целевой сети

params.tokenIn

string

Да

Адрес исходного токена

params.tokenOut

string

Да

Адрес целевого токена

params.amountIn

string

Да

Сумма в минимальных единицах

slippage

number

Да

Допустимое проскальзывание (%)

feeFromAmount

boolean

Нет

Вычитать комиссию из входной суммы

feeToken

string

Нет

Адрес токена для оплаты комиссий

from

string

Нет

Адрес кошелька пользователя (для оценки газа)

feeShareBps

number

Нет

Комиссия интегратора в базисных пунктах (например, 50 = 0.5%). Только для Standard API ключей

providers

string[]

Нет

Фильтр провайдеров роутинга (например: ["AXELAR", "LAYER_ZERO"])

Response:

Дополнительные поля ответа:

Поле
Описание

sourceFee

Комиссия на исходной сети (token, amount, usd)

deliveryFee

Комиссия за доставку (token, amount, usd)

feeShare

Доля комиссии для партнёра (только с api-key)

feeShareRecipient

Адрес получателя партнёрской комиссии

feeShareToken

Токен партнёрской комиссии

consumptions

Детализация потребления газа по бриджам

signature

Подпись маршрута (для CDP API)

Структура ответа: Массив объектов, где каждый объект — это отдельный маршрут. Выбираете один маршрут и передаёте его целиком в /tx/create. Поле route внутри объекта — это массив шагов данного маршрута.

Пустой массив [] — маршрут не найден. См. Если маршрут не найден.


POST /estimate

DEPRECATED: Этот эндпоинт больше не поддерживается. Подпись (signature) теперь включена непосредственно в ответ /routing/scan. Используйте маршрут из /routing/scan напрямую в /tx/create.

Получение оценки операции с подписью для выполнения.

Request Body: Весь объект маршрута из /routing/scan (передаётся целиком, не отдельные поля)

Response:


POST /tx/create

Формирование данных транзакции для отправки в блокчейн.

Request Body:

Параметры:

Поле
Тип
Обязательно
Описание

from

string

Да

Адрес отправителя

recipient

string

Да

Адрес получателя

routing

object

Да

Весь объект маршрута из /routing/scan (включает signature)

estimate

object

Нет

DEPRECATED — не требуется, signature уже включена в routing

permit

object

Нет

EIP-2612 permit подпись

buildCalldata

boolean

Нет

Собрать calldata

Примечание: Поле estimate больше не требуется — подпись (signature) уже включена в объект routing из /routing/scan.

Response (с buildCalldata: true): — рекомендуется

Готово для sendTransaction({ to, data, value }).

Response (без buildCalldata):

Требует вызова через ethers.Contract.


Token Approval

Перед выполнением свопа необходимо разрешить контракту CrossCurve использовать ваши токены.

Откуда брать spenderAddress? Используйте txData.to из ответа /tx/create — это адрес контракта, который будет тратить ваши токены.

Стандартный Approve (ERC-20)

Permit (EIP-2612) - Approve через подпись

Если токен поддерживает EIP-2612 (поле permit: true в tokenlist), можно использовать подпись вместо транзакции approve.


Отслеживание транзакций

GET /transaction/{requestId}

Получение статуса кроссчейн-транзакции.

Параметры:

Параметр
Тип
Описание

requestId

string

Уникальный ID операции

Response:

Возможные статусы:

Статус
Описание

in progress

Операция выполняется

completed

Успешно завершена

failed

Ошибка выполнения

reverted

Откат (требуется inconsistency)

retry

Готов для повторной отправки через другой бридж

canceled

Отменена

Алгоритм обработки статуса:

Расширенный ответ с bridgeState:


Поиск транзакций по хешу или requestId.

Параметры:

Параметр
Тип
Обязательно
Описание

search

string

Да

Хеш транзакции или requestId

limit

number

Нет

Лимит результатов

offset

number

Нет

Смещение

Пример:


GET /history

История транзакций пользователя.

Параметры:

Параметр
Тип
Обязательно
Описание

address

string

Да

Адрес кошелька

Пример:


Обработка ошибок

Сценарии

Флаг / Статус
Действие

status: "completed"

Операция завершена ✅

destination.status: "retry"

Вызвать /tx/create/retry для повтора через другой бридж

destination.emergency: true

Вызвать /tx/create/emergency для восстановления

inconsistency: true

Вызвать /inconsistency для возврата

GET /inconsistency/{requestId}

Получение параметров для возврата средств при inconsistency.

Пример:


POST /inconsistency

Создание транзакции возврата.

Флоу:

  1. Вызовите GET /inconsistency/{requestId} — получите параметры (tokenIn, tokenOut, chainIdIn, chainIdOut, amountIn)

  2. Подпишите данные о возврате кошельком пользователя (EIP-712 или personal_sign)

  3. Передайте подпись и оригинальный маршрут в этот эндпоинт

Request Body:

Параметры:

Поле
Тип
Обязательно
Описание

requestId

string

Да

ID операции с inconsistency

signature

string

Да

Подпись пользователя (65 байт hex)

routing

object

Да

Оригинальный маршрут из /routing/scan

permit

object

Нет

EIP-2612 permit (если токен поддерживает)


POST /tx/create/emergency

Аварийное восстановление заблокированных средств.

Когда использовать: При destination.emergency: true в статусе транзакции — средства заблокированы на destination chain и требуют ручного восстановления.

Request Body:

Параметры:

Поле
Тип
Обязательно
Описание

requestId

string

Да

ID заблокированной операции

signature

string

Да

Подпись пользователя (65 байт hex)

Response: Возвращает данные транзакции для восстановления средств.


POST /tx/create/retry

Повторная отправка через альтернативный бридж.

Когда использовать: При destination.status: "retry" — доставка через один бридж не удалась, но есть альтернативные бриджи.

Request Body:

Параметры:

Поле
Тип
Обязательно
Описание

requestId

string

Да

ID операции для повтора

signature

string

Да

Подпись пользователя (65 байт hex)

Response:

Пример использования:


Создание подписи для Emergency/Inconsistency/Retry

Для эндпоинтов /tx/create/emergency и /inconsistency требуется подпись, подтверждающая владение кошельком.


Типичные ошибки API

Ошибка
Причина
Решение

Can't find receiveRequest

requestId не найден

Проверить requestId

Can't find paymentTx

Транзакция не найдена

Проверить requestId

Routing signature not valid

Истёк или изменён маршрут

Повторить /routing/scan

Already completed

Транзакция завершена

Действие не требуется

Not an emergency

Условия emergency не выполнены

Подождать или проверить статус

Uncorrect user address

Подпись не от владельца

Подписать кошельком из from

invalid signature string

Неверный формат подписи

Проверить 65-байтную hex подпись

Retry is not supported for single bridge

Только один бридж доступен

Использовать emergency вместо retry

No remaining bridges available

Все бриджи уже использованы

Использовать emergency


API Reference

Список эндпоинтов

Справочные данные

Метод
Эндпоинт
Описание

GET

/networks

Список сетей

GET

/tokenlist

Список токенов

GET

/validators

Статус валидаторов

GET

/ready

Готовность сервиса

GET

/prices/{token}

Цена токена

GET

/prices/{token}/{chainId}

Цена в сети

POST

/prices

Пакетные цены

Маршрутизация и обмен

Метод
Эндпоинт
Описание

POST

/routing/scan

Поиск маршрутов (включает signature)

POST

/estimate

DEPRECATED — Оценка операции

POST

/tx/create

Создание транзакции

Мониторинг

Метод
Эндпоинт
Описание

GET

/transaction/{requestId}

Статус транзакции

GET

/search

Поиск транзакций

GET

/history

История пользователя

GET

/transactions

Список транзакций

Обработка ошибок

Метод
Эндпоинт
Описание

GET

/inconsistency/{requestId}

Параметры возврата

POST

/inconsistency

Транзакция возврата

POST

/tx/create/emergency

Аварийное восстановление

POST

/tx/create/retry

Повторная отправка через другой бридж

Supply и статистика

Значения динамические, примеры актуальны на момент тестирования.

Метод
Эндпоинт
Описание
Формат ответа

GET

/supply/eywa/ts

Total Supply EYWA

число

GET

/supply/eywa/ms

Max Supply EYWA

число

GET

/supply/eywa/cmc

Данные для CoinMarketCap

число

GET

/supply/eywa/cg

Данные для CoinGecko

{"result":"..."}

GET

/points/multipliers

Множители поинтов

объект

NFT операции

Метод
Эндпоинт
Описание
Обязательные параметры

GET

/nft/rarity

Редкость NFT

tokens (query, string) ⚠️

POST

/nft/estimate

Оценка NFT операции

wallet, tokenIds (array of numbers)

POST

/nft/tx

Создание NFT транзакции

wallet, tokenIds, estimate

POST

/nft/emergency

Аварийная операция NFT

requestId, signature

⚠️ Известный баг: GET /nft/rarity не парсит query параметр tokens. Эндпоинт временно недоступен.

Флоу NFT операций:


Примеры кода

Основной флоу см. в разделе Обзор интеграции.

TypeScript: Типы и polling

JavaScript: Получение сетей и токенов

Python: Поиск маршрута


Коды операций маршрута

Код
Описание

A

Добавление ликвидности

S

Своп

R

Удаление ликвидности

LM

Lock/Mint (блокировка и минтинг)

BU

Burn/Unlock (сжигание и разблокировка)

BM

Burn/Mint

Uw

Unwrap (развёртывание нативного токена)

W

Wrap (обёртывание нативного токена)

M

Emergency Mint

U

Emergency Unlock


Rate Limits и Best Practices

API ключи

Доступны два типа API ключей:

Тип ключа

Запросов/мин

Комиссия

feeShareBps

Free

20

0%

Недоступен

Standard

60

Из параметра feeShareBps

1–10000 bps

Ключ передаётся в заголовке api-key:

API доступен без ключа, но ключ необходим для повышенных лимитов и заработка комиссий.

Тестовые ключи для разработки:

  • Free: test-sdk-test-sdk-test-sdk-free

  • Standard: test-sdk-test-sdk-test-sdk-standard

Для получения production API ключа обращайтесь к BD: @Eywa_BDLeadarrow-up-right / [email protected]

Rate Limits

Эндпоинт
Рекомендация

/networks, /tokenlist

Кешировать локально

/routing/scan

По запросу пользователя

/tx/create

После выбора маршрута

/transaction/{id}

Polling с интервалом

/prices

Кешировать при необходимости

Best Practices

  1. Кешируйте /networks и /tokenlist — данные меняются редко

  2. Checksum адресов — рекомендуется EIP-55 формат для совместимости

  3. Проверяйте can_swap перед вызовом /routing/scan

  4. Проверяйте актуальность маршрута — маршруты имеют ограниченный срок действия

  5. Polling — интервал 5-10 сек, обрабатывайте inconsistency и emergency

  6. Сохраняйте requestId — храните после отправки транзакции для отслеживания и recovery

  7. Slippage — используйте адекватные значения (0.5-1% для стейблов, 1-3% для волатильных)

  8. Используйте правильный кошелёк для подписей recovery — должен совпадать с from оригинальной транзакции

  9. Учитывайте decimals токенов — не все токены имеют 18 decimals


Ограничения

Параметр
Описание

Минимальная сумма

Зависит от пары токенов и ликвидности

Максимальная сумма

Ограничена ликвидностью пулов

Slippage

Указывается в процентах при вызове /routing/scan

Время выполнения

Зависит от сетей и загрузки oracle network


Адреса контрактов

Адреса контрактов доступны через /networks:

Контракт
Описание
Поле в /networks

Portal

Точка входа для кроссчейн операций

portal

Synthesis

Контракт синтетических токенов

synthesis

Router

Маршрутизатор свопов

router


Структура комиссий

Информация о комиссиях возвращается в ответе /routing/scan:

Тип комиссии
Описание
Поле в ответе

dex

Комиссия DEX/пула

В каждом шаге route

bridge

Комиссия моста

В шагах bridgeIn/bridgeOut

aggregation

Комиссия агрегации

Общая комиссия CrossCurve

total

Итоговая комиссия

totalFee в маршруте


FAQ

Общие вопросы

Q: Нужен ли API ключ? A: API доступен без ключа, но с ограниченным лимитом (20 запросов/мин). Доступны два типа ключей: Free (20 запросов/мин, без комиссии) и Standard (60 запросов/мин, комиссия через feeShareBps). См. API ключи.

Q: Есть ли rate limits? A: Free ключи — 20 запросов/мин, Standard ключи — 60 запросов/мин. Кешируйте справочные данные и избегайте частых запросов.

Q: Какие сети поддерживаются? A: Актуальный список доступен через GET /networks. Поддерживаются EVM-совместимые сети.

Q: Почему /routing/scan возвращает пустой массив? A: Маршрут не найден. См. Если маршрут не найден.

Технические вопросы

Q: Как получить requestId после отправки транзакции? A: RequestId эмитируется в событиях контракта Portal. Используйте GET /search?search={txHash} для поиска.

Q: Что делать при inconsistency: true? A: Требуется возврат средств:

  1. Вызовите GET /inconsistency/{requestId} — получите параметры для подписи

  2. Подпишите данные кошельком пользователя

  3. Вызовите POST /inconsistency с requestId, signature и оригинальным routing

Q: Что делать при emergency: true? A: Требуется восстановление средств. Вызовите POST /tx/create/emergency с requestId и signature (подпись пользователя).

Q: Как работает permit (EIP-2612)? A: Если токен поддерживает permit (permit: true в tokenlist), можно подписать разрешение оффчейн вместо отдельной транзакции approve. Передайте подпись {v, r, s} в /tx/create.


Глоссарий

Термин
Описание

Portal

Контракт-точка входа для кроссчейн операций

Synthesis

Контракт для минтинга/сжигания синтетических токенов

Router

Контракт маршрутизации свопов

RequestId

Уникальный идентификатор кроссчейн операции

Inconsistency

Состояние, требующее возврата средств

Emergency

Состояние, требующее восстановления средств

Retry

Повторная отправка через альтернативный бридж

can_swap

Тег токена, указывающий на возможность кроссчейн обмена

Synth

Синтетический токен, представляющий актив с другой сети

bridgeIn

Операция блокировки токена на source chain

bridgeOut

Операция разблокировки токена на destination chain

Oracle

Сеть валидаторов CrossCurve

Slippage

Допустимое отклонение цены от ожидаемой

sourceFee

Комиссия на исходной сети

deliveryFee

Комиссия за доставку на целевую сеть

feeShare

Доля комиссии для партнёра (при использовании api-key)

bridgeState

Состояние доставки по каждому бриджу (AXELAR, LAYER_ZERO)


Changelog

История изменений API. Следите за обновлениями в Swagger UI.

Дата
Изменение

2025-01

BREAKING: /estimate endpoint deprecated — signature теперь включена в /routing/scan. Обновлён флоу: routing/scan → tx/create → send TX

2025-01

Добавлено: CDP API URL, api-key для партнёров, новые параметры routing (feeFromAmount, feeToken, providers), sourceFee/deliveryFee/feeShare в ответе, endpoint /tx/create/retry, статус retry, bridgeState

2025-12

Документация создана: Quick Start, API Reference, примеры кода

Актуальные изменения API см. в Swagger UI


Поддержка

  • Swagger UI: https://api.crosscurve.fi/api-docs/

  • Документация: https://docs.crosscurve.fi

Партнёрство и API-ключи

Для получения партнёрского API-ключа (fee sharing) обращайтесь к BD:

Last updated