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

Первый и повторный sweep

Первый sweep депозитного адреса везёт его подписанную авторизацию: одна и та же транзакция ставит делегат на адрес и сметает его. После этого повторным sweep авторизация не нужна. Поле kind у выполненного задания говорит, каким он был:

kindЧто было нужно депозитному адресуЭталон классики
repeatничего: делегат уже стоялпополнение и перевод с адреса, у которого есть аккаунт (existing)
firstделегат, поставленный в этом батче; аккаунт в сети у адреса уже был — с него уходили транзакции или на нём есть нативная монетато же (existing)
first_newделегат, поставленный в этом батче, который заодно создал аккаунт: на адресе были только токеныпополнение, которое создаёт аккаунт, и перевод (new)

Следить, какие адреса уже делегированы, не нужно: авторизацию можно присылать в каждом запросе. Сервис использует её, только когда она нужна адресу, и игнорирует в остальных случаях.

По правилам газа Glamsterdam (EIP-8037), которые уже действуют в Sepolia и ожидаются в мейннете Ethereum, первое касание адреса, где лежат только токены, создаёт ему аккаунт за 183 600 газа — в любой схеме: в классике его создаёт пополнение газом, здесь — делегирование. Батчи окупаются на повторных sweep:

USDT, газ на адрес в SepoliaКлассика: пополнение + переводБатч из 10Батч из 50
первый sweep (first_new)237 233246 398243 687
повторный sweep53 63320 24618 078

Поэтому сервис выгоднее всего для постоянных депозитных адресов, которые пользователи пополняют снова и снова. Для одноразовых адресов (новый адрес на каждый счёт) экономии по газу нет, но остаются операционные плюсы: не нужно пополнять адреса газом, нет пыли, одна транзакция на батч. По прежним правилам газа (мейннет Ethereum сейчас, BSC) эталоны new и existing совпадают.

Авторизация подписывается для текущего nonce депозитного адреса: 0 у адреса, который ни разу не отправлял транзакций. Если адрес отправит любую транзакцию до того, как его первый sweep уйдёт в сеть, nonce сдвинется и авторизация перестанет действовать. Задание тогда получит rejected с причиной stale_authorization: подпишите новую с текущим nonce и отправьте sweep снова.

amount в POST /v1/sweeps необязателен:

  • без amount sweep переводит весь баланс токена, который есть на адресе в момент выполнения батча;
  • с amount — ровно эту сумму в минимальных единицах токена (1 = 0,000001 USDT в Ethereum), вплоть до одной единицы.

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

Баланс токена хранится не в самом адресе, а в контракте токена — строкой «адрес → сумма». Когда баланс становится нулём, строка удаляется, и следующий депозит пользователя создаёт её заново. После EIP-8037 это одна из самых дорогих операций — 97 920 газа, — и платит её пользователь, который присылает токены.

Сметать весь балансОставлять 1 единицу
Следующий депозит пользователя на адрес (газ пользователя)~126 000~28 000
Повторный sweep в батче из 10 (ваш газ)~20 000~24 500

Оставленная единица обходится вам примерно в 4 000 газа на sweep (сеть больше не возвращает газ за удалённую строку), а каждый следующий депозит ваших пользователей становится примерно в 4,5 раза дешевле. Сама единица — 0,000001 USDT на адрес.

  • Для всех sweep: PATCH /v1/settings с {"keep_one_unit": true}. По умолчанию выключено.
  • Для одного sweep: keep_one_unit в POST /v1/sweeps — перекрывает настройку в обе стороны.

С флагом sweep переводит не больше «баланс минус одна единица»: без amount — всё, кроме одной единицы; с amount — эту сумму, но не больше баланса минус одна. Баланс сервис читает при подготовке батча, а деньги, пришедшие позже, дождутся следующего sweep. Если сверх одной единицы на адресе ничего нет, задание получает rejected с причиной nothing_to_sweep. На нативную монету флаг не действует: её sweep всегда переводит запрошенное.

Сервис собирает задания одного горячего кошелька (котла), которые стоят в очереди, в один батч — до размера батча сети: 50 в Sepolia и 200 в BSC testnet. Батч, который не помещается в лимит газа одной транзакции, уходит частями, и задания при этом не теряют попыток.

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