Skip to content
ChainConnect

Liquidity Request

Что такое Liquidity Request

Проблема

При кросс-чейн трансфере Native токенов может возникнуть ситуация, когда на Native Proxy в сети назначения недостаточно токенов для завершения трансфера.

Пример: Пользователь хочет перевести 1000 USDT из сети A в сеть B. В сети B это Native токен, который должен быть разблокирован из Proxy. Но в Proxy только 500 USDT — трансфер не может завершиться.

Решение

Liquidity Request (LR) — механизм, который позволяет:

  1. Приостановить трансфер до получения недостающей ликвидности
  2. Установить награду (bounty) — получатель может предложить часть суммы как вознаграждение
  3. Привлечь Liquidity Provider — стороннего участника, который предоставит недостающие токены

Как это работает

  1. Отправка токенов — пользователь инициирует кросс-чейн трансфер из сети A в сеть B
  2. Верификация proof — Event контракт в сети B получает и верифицирует Merkle proof транзакции
  3. Попытка разблокировки — Event контракт вызывает Native Proxy для разблокировки токенов
  4. Недостаток ликвидности — Proxy обнаруживает, что баланс меньше требуемой суммы, и вызывает notEnoughLiquidity() на Event контракте
  5. Создание LR — Event контракт переходит в статус LiquidityRequested и эмитит событие

Три варианта разрешения LR:

ВариантДействиеРезультат
LP предоставляет ликвидностьLP отправляет amount - bounty токенов на Event контрактПолучатель получает токены, LP получает обратный трансфер на полную сумму в исходной сети
Пользователь отменяетSender или recipient вызывает cancel()Токены возвращаются отправителю в исходную сеть
Retry при появлении ликвидностиКто-либо вызывает retry() после пополнения ProxyТрансфер завершается штатно

Ключевые участники

УчастникРоль
Отправитель (sender)Инициирует трансфер, может отменить LR
Получатель (recipient)Получает токены, может установить bounty, может отменить LR
Liquidity Provider (LP)Предоставляет недостающую ликвидность за вознаграждение
Native ProxyКонтракт, хранящий ликвидность в сети назначения

Когда создаётся LR

Типы трансферов

Тип трансфераОписаниеТребует LR?
Native → AlienNative токены блокируются, Alien минтятсяНет — минт не требует ликвидности
Alien → NativeAlien сжигаются, Native разблокируютсяДа — требуется ликвидность в Proxy
Native → NativeNative через hub-сетьДа — требуется ликвидность

Условия создания LR

LR создаётся автоматически, когда:

  1. Трансфер верифицирован и подтверждён (статус Confirmed) — proof транзакции прошёл криптографическую верификацию
  2. Proxy пытается отправить токены получателю
  3. Баланс Proxy меньше требуемой суммы
  4. Proxy вызывает notEnoughLiquidity() на Event контракте

После этого Event контракт переходит в статус LiquidityRequested и эмитит событие LiquidityRequested(bounty).

Данные LR

ПолеОписание
tokenАдрес токена
amountПолная сумма трансфера
recipientАдрес получателя
senderАдрес отправителя
bountyНаграда для LP (устанавливается получателем)
statusТекущий статус LR

Жизненный цикл LR

Диаграмма состояний

Диаграмма состояний Liquidity Request

Описание статусов

СтатусЧто происходитЧто можно сделать
InitializingEvent контракт созданОжидание proof
PendingProof отправлен на верификациюОжидание подтверждения
VerifiedВерификация пройденаОжидание конфигурации
ConfirmedТрансфер подтверждён, выполняется
LiquidityRequestedОжидание LPУстановить bounty, отменить, retry
LimitReachedДостигнут дневной лимитApprove, reject, отменить
LiquidityProvidedLP предоставил ликвидностьФинальный статус
CancelledТрансфер отменёнФинальный статус
RejectedТрансфер отклонёнФинальный статус

События контракта

СобытиеКогда эмитится
LiquidityRequested(bounty)При создании LR или изменении bounty
LiquidityProvided(tokenSender)При успешном предоставлении ликвидности
Cancelled()При отмене трансфера
LimitReached(approver)При достижении дневного лимита
Rejected()При отклонении трансфера

Управление LR

Предоставление ликвидности (Approve)

Liquidity Provider (LP) может предоставить недостающую ликвидность:

  1. LP отправляет amount - bounty токенов на Event контракт
  2. Получатель получает токены
  3. LP получает обратный трансфер на полную сумму в исходной сети

Отмена (Cancel)

Отправитель или получатель может отменить LR:

  • Статус меняется на Cancelled
  • Создаётся обратный трансфер на указанный адрес
  • Токены возвращаются в исходную сеть (минус комиссии)

Кто может отменить:

  • Отправитель (sender)
  • Получатель (recipient)
  • Limit approver (если статус LimitReached)

Установка награды (Bounty)

Получатель или отправитель может изменить bounty для привлечения LP:

  • Bounty может быть от 0 до полной суммы трансфера
  • Чем выше bounty, тем привлекательнее LR для LP
  • При изменении bounty эмитится событие LiquidityRequested(newBounty)

Retry (повторная попытка)

Если ликвидность появилась в Proxy, можно повторить попытку:

  • Вызывается функция retry()
  • Трансфер повторно пытается выполниться через Proxy

Кто может вызвать retry:

  • Отправитель
  • Получатель
  • Initializer

Кто такой Initializer

Initializer — это адрес, который отправил транзакцию с proof в сеть назначения и инициализировал Event контракт. Обычно это:

  • Сам пользователь (через UI бриджа)
  • Автоматический сервис бриджа
  • Любой третий участник, который хочет ускорить трансфер

Initializer имеет право вызывать retry(), так как он уже потратил газ на инициализацию Event контракта.

Таймауты

В контрактах нет явного таймаута для LR. Liquidity Request может находиться в статусе LiquidityRequested неограниченное время.

Ошибки и Edge Cases

Таблица ошибок (ErrorCodes)

КодОписание
2324Неверный статус для операции
2326takeWalletAddress вызван не из token root
2331notEnoughLiquidity вызван не из Proxy
2332cancel/setBounty вызван не получателем/отправителем
2333Bounty > amount
2334transferNotification вызван не из token wallet
2335approveLimit/rejectLimit вызван не approver'ом

Edge Cases

Конкуренция LP

Если несколько LP видят один LR и отправляют токены одновременно:

  • Первый transferNotification с корректной суммой будет принят
  • Статус атомарно меняется на LiquidityProvided
  • Все последующие транзакции вернут токены отправителям

Частичное выполнение

Нельзя отправить меньше токенов, чем amount - bounty. Любая сумма меньше требуемой будет отклонена и возвращена.

LR без активности

LR может висеть в статусе LiquidityRequested неограниченно долго. Решения:

  1. Увеличить bounty для привлечения LP
  2. Отменить через cancel()
  3. Дождаться пополнения Proxy и вызвать retry()

Bounty = 0

При нулевом bounty LP должен отправить полную сумму. Это непривлекательно (profit = 0), поэтому такие LR обычно не обрабатываются.

ChainConnect Bridge Documentation