Как работает автозаправка
Заправка запускается автоматически, в момент создания транзакции. Никакого отдельного вызова «заправь vault» не существует: когда пользователь инициирует перевод токена, платформа сначала проверяет, хватает ли на адресе газа, и при необходимости доливает его с газ-станции.
Когда срабатывает
Проверка газа встроена в расчёт комиссии на старте создания транзакции и срабатывает только если выполнены все условия:
- в workspace назначена газ-станция;
- на исходном vault включена автозаправка;
- vault не является самой газ-станцией;
- переводится не базовый актив сети (для перевода самого базового актива заправлять нечего — он и есть газ);
- для базового актива есть per-asset конфигурация с корректными
CapиThreshold.
Если хотя бы одно условие не выполнено, заправка молча пропускается, и транзакция идёт обычным путём.
Алгоритм
Триггер — порог Threshold, а не ошибка сети: платформа не ждёт,
пока нода откажет из-за нехватки газа, а заранее сравнивает баланс с
порогом. Это не зависит от конкретного блокчейна.
Пошагово:
- Определяется цель — кошелёк базового актива в том vault'е, чей токен пользователь пытается отправить.
- Сравнение с порогом. Если доступный баланс газа
≥ Threshold— заправка не нужна, выход. - Сумма заправки считается как
Cap − текущий баланс: долив до потолка, а не фиксированная порция. - Дедупликация. Если от газ-станции на этот адрес уже идёт заправка — новая не создаётся (см. ниже).
- Оценка комиссии. Сеть оценивает стоимость самой заправки. Если
она выше
MaxGasPrice— заправка откладывается. - Проверка средств станции. На vault'е газ-станции должно хватать
на
сумму заправки + комиссию. Если нет — заправка не создаётся. - Создание заправки. Платформа создаёт перевод базового актива с газ-станции на адрес от имени системного (сервисного) аккаунта. После того как он подтвердится в блокчейне, исходную транзакцию пользователя можно повторить — газ на месте.
Заправка переживёт отмену запроса
Перевод-заправка создаётся как самостоятельный фоновый эффект: даже если исходный 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 |
— | дополнительный код в ответе: газ доливается, операцию стоит повторить позже |
См. также Структуру кошельков.