Skip to content

Liquidity Request (Pending Withdrawal) ​

Что такое Liquidity Request ​

При выводе Alien токенов из TVM в EVM контракт MultiVault должен отправить получателю реальные токены из своего баланса. Если баланс недостаточен — вывод не может завершиться мгновенно. В этом случае создаётся Liquidity Request (LR) — отложенный вывод (Pending Withdrawal) со статусом NotRequired, который ожидает поступления ликвидности.

Зачем нужен механизм LR? ​

  • Защита от блокировки средств — без LR транзакция бы просто откатилась, и пользователь не смог бы получить токены. LR фиксирует право на вывод и позволяет завершить его позже
  • Экономический стимул для LP — пользователь устанавливает bounty (награду), что привлекает провайдеров ликвидности для быстрого закрытия LR
  • Гибкость для получателя — если ликвидность не появляется, пользователь может отменить LR и вернуть токены в TVM

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

  1. Пользователь инициирует вывод Alien токена из TVM → EVM
  2. При вызове saveWithdrawAlien() MultiVault обнаруживает, что баланс меньше суммы вывода
  3. Создаётся Pending Withdrawal со статусом NotRequired — одобрение governance не требуется
  4. Получатель устанавливает bounty — награду за заполнение LR
  5. Провайдер ликвидности (LP) вносит токены через deposit(), закрывает LR и забирает bounty
  6. Получатель получает свои токены (за вычетом bounty)

Важно

Liquidity Request существует только на стороне EVM сети и только для Alien токенов. Native токены при выводе минтятся, поэтому нехватка ликвидности для них невозможна.

Схема создания Liquidity Request ​

Технически LR — тот же Pending Withdrawal, что создаётся при превышении лимитов, но со статусом NotRequired вместо Required.

Пример сценария ​

Пользователь выводит 50,000 USDT из TVM → EVM

1. Контракт проверяет баланс MultiVault: 10,000 USDT
2. 50,000 > 10,000 — ликвидности недостаточно
3. Создаётся LR с approveStatus = NotRequired
4. LP заполняет LR через Fill и забирает bounty
5. Пользователь получает свои 50,000 USDT (минус bounty)

Структура данных ​

Что хранится в каждом LR ​

ПолеЧто означает
tokenКакой токен выводится
amountСколько (уже за вычетом комиссии)
bountyНаграда для LP за fill (устанавливает пользователь)
timestampКогда был создан запрос в TVM
approveStatusТекущий статус (NotRequired для LR)
chainIdВ какую сеть выводить
callbackДанные для вызова после вывода

Доступные действия ​

LR создаётся со статусом NotRequired — одобрение governance не требуется, можно действовать сразу:

ДействиеКто можетОписание
FillЛюбой (обычно LP)LP вносит токены, получатель получает сумму минус bounty
Force WithdrawЛюбойПрямой вывод при появлении ликвидности на MultiVault
CancelВладелец LRОтмена и возврат токенов в TVM
BountyВладелец LRУстановка/изменение награды для LP

TIP

Если Pending Withdrawal создан из-за превышения лимитов (статус Required), действия отличаются — см. Лимиты.

Идентификация LR ​

Каждый LR идентифицируется парой recipient (адрес получателя) + id (порядковый номер).

События для отслеживания ​

EventКогда эмититсяПараметры
PendingWithdrawalCreatedПри создании LRrecipient, id, token, amount, payloadId
PendingWithdrawalFillПри fill через depositrecipient, id
PendingWithdrawalForceПри force withdrawrecipient, id
PendingWithdrawalCancelПри отменеrecipient, id, amount
PendingWithdrawalUpdateBountyПри изменении bountyrecipient, id, bounty

TIP

События Approve/Reject и автовывода описаны в разделе Лимиты.

Механизм Fill (LP) ​

Провайдер ликвидности (LP) может "заполнить" чужой LR, внеся свои токены. Получатель получает деньги, а LP забирает bounty.

LP вносит 1000 USDT через deposit()
         │
         ▼
Пользователь с LR получает 990 USDT (установил bounty = 10)
         │
         ▼
LP получает в TVM: 1000 + 10 - fee = ~1008 USDT

Процесс:

  1. LP вызывает deposit() с токенами и списком LR для закрытия
  2. Для каждого LR:
    • Проверяется что токен совпадает
    • Проверяется что достаточно средств
    • Получатель получает amount - bounty
    • LP накапливает bounty
  3. LP получает в TVM: depositAmount + totalBounty - fee

Bounty — вознаграждение для LP ​

Пользователь сам устанавливает bounty — это стимул для LP заполнить именно его LR:

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

Как установить bounty:

solidity
setPendingWithdrawalBounty(id, bounty)

Cancel — отмена LR ​

Получатель может отменить Liquidity Request и вернуть токены в TVM.

solidity
cancelPendingWithdrawal(id, amount, tvmRecipient, ...)

Ограничения:

  • Только для Alien токенов (из EVM)
  • Только владелец LR
  • Статус должен быть NotRequired или Approved

Force Withdraw — прямой вывод ​

Если LR имеет статус NotRequired или Approved и на MultiVault появилась ликвидность, любой адрес может протолкнуть вывод напрямую. Получатель получает полную сумму — bounty не вычитается.

solidity
forceWithdraw(pendingWithdrawalIds[])

Коды ошибок ​

ОшибкаПричина
"Pending: amount is zero"LR уже заполнен или отменён
"Pending: native token"Bounty нельзя установить для Native токенов
"Pending: bounty too large"Bounty больше суммы вывода
"Pending: wrong amount"Неверная сумма для cancel
"Pending: wrong token"Токен LR не совпадает с токеном депозита
"Pending: deposit insufficient"Недостаточно средств для fill

ChainConnect Bridge Documentation