Перейти к содержанию

Как работает автозаправка

Заправка запускается автоматически, в момент создания транзакции. Никакого отдельного вызова «заправь vault» не существует: когда пользователь инициирует перевод токена, платформа сначала проверяет, хватает ли на адресе газа, и при необходимости доливает его с газ-станции.

Когда срабатывает

Проверка газа встроена в расчёт комиссии на старте создания транзакции и срабатывает только если выполнены все условия:

  • в workspace назначена газ-станция;
  • на исходном vault включена автозаправка;
  • vault не является самой газ-станцией;
  • переводится не базовый актив сети (для перевода самого базового актива заправлять нечего — он и есть газ);
  • для базового актива есть per-asset конфигурация с корректными Cap и Threshold.

Если хотя бы одно условие не выполнено, заправка молча пропускается, и транзакция идёт обычным путём.

Алгоритм

Триггер — порог Threshold, а не ошибка сети: платформа не ждёт, пока нода откажет из-за нехватки газа, а заранее сравнивает баланс с порогом. Это не зависит от конкретного блокчейна.

баланс газа на адресе < Threshold?ниженетбаланс выше порогаrefuelAmount = Cap − текущий балансждать завершениядаесть заправкав процессе?запросить у сети комиссиюза заправкуотложить — сеть дорогаядакомиссия > MaxGasPrice?нетгаз-станция пустанетна газ-станции хватаетна сумму + комиссию?дасоздать транзакцию-заправкус газ-станции на адресждать подтверждения в сети
баланс газа на адресе < Threshold?ниженетбаланс выше порогаrefuelAmount = Cap − текущий балансждать завершениядаесть заправкав процессе?запросить у сети комиссиюза заправкуотложить — сеть дорогаядакомиссия > MaxGasPrice?нетгаз-станция пустанетна газ-станции хватаетна сумму + комиссию?дасоздать транзакцию-заправкус газ-станции на адресждать подтверждения в сети

Пошагово:

  1. Определяется цель — кошелёк базового актива в том vault'е, чей токен пользователь пытается отправить.
  2. Сравнение с порогом. Если доступный баланс газа ≥ Threshold — заправка не нужна, выход.
  3. Сумма заправки считается как Cap − текущий баланс: долив до потолка, а не фиксированная порция.
  4. Дедупликация. Если от газ-станции на этот адрес уже идёт заправка — новая не создаётся (см. ниже).
  5. Оценка комиссии. Сеть оценивает стоимость самой заправки. Если она выше MaxGasPrice — заправка откладывается.
  6. Проверка средств станции. На vault'е газ-станции должно хватать на сумму заправки + комиссию. Если нет — заправка не создаётся.
  7. Создание заправки. Платформа создаёт перевод базового актива с газ-станции на адрес от имени системного (сервисного) аккаунта. После того как он подтвердится в блокчейне, исходную транзакцию пользователя можно повторить — газ на месте.

Заправка переживёт отмену запроса

Перевод-заправка создаётся как самостоятельный фоновый эффект: даже если исходный HTTP-запрос пользователя оборвётся, уже запущенная заправка завершится. Создаётся она от системного аккаунта, а не от имени пользователя.

Возможные исходы

Попытка заправки приводит к одному из состояний:

Исход Что значит Что делать
Газа достаточно баланс выше Threshold ничего, транзакция идёт дальше
Заправка запущена / уже идёт создан (или уже существует) перевод газа, он подтверждается в сети повторить операцию через некоторое время
Сеть слишком дорогая средства на станции есть, но комиссия превышает MaxGasPrice повторить позже, когда комиссии в сети упадут
На станции нет средств газ-станции не хватает на сумму + комиссию пополнить vault газ-станции базовым активом

Когда расчёт комиссии для транзакции не проходит, а заправка в этот момент уже выполняется, ответ содержит дополнительный код GAS_REFUEL_IN_PROGRESS_EXISTS. Это сигнал клиенту: «газ доливается, повтори чуть позже», а не окончательная ошибка.

Параллельные запросы и дубли

Несколько одновременных переводов из одного vault'а не приводят к нескольким заправкам:

  • заправки от одной газ-станции сериализуются — параллельные запросы по очереди принимают решение на согласованном балансе;
  • перед созданием новой заправки проверяется, нет ли уже активной заправки от этой газ-станции на тот же адрес по тому же активу; активной считается транзакция в любом неоконченном статусе (от создания до подтверждения).

Вместе это гарантирует: пока один долив газа «в полёте», второй на тот же адрес не создаётся — газ-станция не тратит средства дважды.

Коды ошибок

Код HTTP Когда возникает
GAS_STATION_NOT_FOUND 404 для workspace не назначена газ-станция либо нет конфигурации по запрошенному активу
GAS_STATION_CANNOT_ASSIGN_SELF 400 попытка включить автозаправку на vault'е, который сам является газ-станцией
GAS_REFUEL_IN_PROGRESS_EXISTS дополнительный код в ответе: газ доливается, операцию стоит повторить позже

См. также Структуру кошельков.