Перейти к содержимому
PortunaPortunaPortunaДокументацияTestnet

Статусы, подтверждения и реорги

queued ──▶ processing ──▶ swept
▲ │ ├────▶ failed
└── повтор ◀─┘ └────▶ rejected
СтатусЧто значит
queuedПринято и ждёт батча или повторной попытки.
processingВ батче, который готовится, уже в пути или ждёт подтверждений.
sweptОкончательный. Средства в горячем кошельке: swept_amount, tx_hash, gas, fee.
failedОкончательный. Перевод откатился в сети или кончились попытки. Почему — в reason.
rejectedОкончательный. Задание так и не отправилось: проверка перед отправкой не проходила. Какая — в reason.

attempts — число попыток. Окончательный статус приходит событием вебхука sweep.swept, sweep.failed или sweep.rejected. reason — всегда один из стабильных кодов ниже: ветвитесь по нему. Сообщения самой ноды остаются в наших логах; могут появиться новые коды — незнакомый обрабатывайте как internal.

Перед отправкой батча сервис проверяет все адреса на одном блоке. Задание, не прошедшее проверку, проверяется снова после паузы — всего три раза, потому что нода может ещё не видеть только что пришедших средств или делегации. Если проверка так и не прошла, задание отклоняется:

reasonЧто случилосьЧто делать
not_upgradedАдрес не делегирован на делегат этого горячего кошелька, а авторизации в запросе не было.Отправьте sweep снова с авторизацией.
stale_authorizationNonce авторизации не совпадает с nonce адреса: после подписи адрес отправил транзакцию.Подпишите заново с текущим nonce.
would_failСимуляция показывает, что перевод упадёт: например, нет баланса или он меньше amount.Проверьте баланс адреса.
nothing_to_sweepС keep_one_unit на адресе нет ничего сверх оставляемой единицы.Ничего: сметите адрес после следующего депозита.

failed с именем ошибки контракта значит, что перевод откатился в сети — внутри батча, который прошёл:

reasonЧто значит
TokenTransferFailedТокен отказал в переводе.
NativeTransferFailedГорячий кошелёк не принял нативную монету.
NothingToSweepК моменту выполнения батча баланса уже не было.
UnauthorizedК моменту выполнения батча адрес был делегирован на другой делегат.
revertedПеревод откатился без ошибки наших контрактов — например, токен израсходовал все 300 000 газа, отведённые одному адресу.

Такое задание несёт свою долю газа, но без комиссии. Любая другая reason у failed — причина последней попытки.

Попытка может не пройти целиком: например, батч не отправить, пока на газ-кошельке нет газа, или вся транзакция откатилась. Тогда задание возвращается в queued и ждёт повтора, а reason до следующей попытки говорит, что случилось. У задания пять попыток с растущими паузами между ними; когда они кончились, задание получает failed с причиной последней. Те же причины бывают в reason снятия делегации и в error горячего кошелька.

reasonЧто случилосьЧто делать
insufficient_gas_balanceБаланса газ-кошелька за вычетом комиссий к выводу, которые лежат на нём в резерве, не хватает на транзакцию.Пополните газ-кошелёк: задания в очереди продолжатся сами.
gas_limit_exceededОдному sweep нужно больше газа, чем можно транзакции, — например, из-за необычного токена.Напишите в поддержку.
transaction_revertedТранзакция откатилась целиком — в сети или при оценке газа.Ничего: попытка повторится. Если это повторяется, напишите в поддержку.
nonce_conflictNonce газ-кошелька заняла другая транзакция.Ничего: попытка повторится со следующим nonce.
chain_unavailableНода сети не ответила или не выполнила запрос.Ничего: попытка повторится.
internalДругой сбой на нашей стороне.Ничего: попытка повторится. Если это повторяется, напишите в поддержку.

Сервис записывает итог, только когда над блоком транзакции набралось достаточно блоков: в тестнетах — три, считая её собственный. До этого задание остаётся в processing.

Если реорг выкинет блок в пределах этих подтверждений, receipt транзакции пропадёт, и сервис снова отправит ту же транзакцию из своего журнала. Вы увидите только задержку: ни дублей, ни потерянных заданий. Итог записывается, когда подтверждения набраны; более глубокий реорг после этого не обрабатывается — в Ethereum и BSC такие реорги очень редки.

Зависшие транзакции сервис тоже доводит сам: переотправляет их в ноду, а если они так и ждут — заменяет той же транзакцией с более высокой комиссией сети. Переотправлять что-либо вам не нужно.

СтатусЧто значит
pendingДелегат разворачивается. Пока кошелёк не станет активным, sweep в него получают 409 hot_wallet_not_active.
activeДелегат в сети: tx_hash — транзакция развёртывания. Приходит событие hot_wallet.active.
failedРазвернуть не удалось, причина — в error. Приходит событие hot_wallet.failed. Чтобы повторить, снова отправьте POST /v1/hot-wallets.

error — тоже код. Чаще всего это insufficient_gas_balance: пополните газ-кошелёк и зарегистрируйте горячий кошелёк снова. not_deployed значит, что транзакция развёртывания прошла, но делегата по его адресу нет: напишите в поддержку. Любой другой код — причина неудачной попытки.

Снятие проходит queued и processing, как sweep, и заканчивается статусом revoked, failed или rejected:

СтатусreasonЧто значит
revokedДелегации на адресе больше нет.
rejectednot_delegatedСнимать было нечего: делегации на адресе нет.
rejectedstale_authorizationNonce адреса уже не тот, для которого вы подписали.
rejectedinvalid_authorizationАвторизация не прошла проверку перед отправкой. Подпишите заново.
failednot_appliedТранзакция прошла, но сеть пропустила авторизацию: nonce адреса сменился после проверки. Подпишите заново.
failedдругаяПричина последней попытки, когда попытки кончились.

См. Снятие делегации.