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

Объекты

Объекты, которые API возвращает и принимает. Необязательные поля без значения в ответе не передаются.

ПолеТипОписание
error обязательноobject
error.code обязательноstringЧто не так. Код стабилен — ветвитесь по нему.
error.message обязательноstringПодробности для людей. Текст может меняться.

Адрес в 0x-hex; в запросах — в любом регистре, в ответах — с контрольной суммой (EIP-55).

Тип: string. Формат: ^0x[0-9a-fA-F]{40}$. Пример: 0x2Cd50979a8A33e8CA37DA85F8517fb148a67b769.

Целое число в минимальных единицах, строкой.

Тип: string. Формат: ^[0-9]+$. Пример: 1000000.

Идентификатор сети (EIP-155): 11155111 Sepolia и 97 BSC testnet с тестовым ключом, 1 Ethereum и 56 BSC с боевым.

Тип: integer (int64). Пример: 11155111, 97.

Количество газа.

Тип: integer (int64).

Курсор следующей страницы; на последней — null.

Тип: string \| null.

gas — газ транзакции газ-кошелька; fee — комиссия за sweep; fee_charge — начисление по договору; fee_credit — списание по договору, которое уменьшает комиссии к выводу; withdrawal — вывод комиссий с газ-кошелька вместе с газом вывода; topup — пополнение газ-кошелька, найденное сверкой баланса.

Тип: string.

Изменение баланса газ-кошелька или комиссий, которые на нём лежат.

ПолеТипОписание
id обязательноinteger (int64)
chain_id обязательноChainIDИдентификатор сети (EIP-155): 11155111 Sepolia и 97 BSC testnet с тестовым ключом, 1 Ethereum и 56 BSC с боевым.
kind обязательноLedgerKindgas — газ транзакции газ-кошелька; fee — комиссия за sweep; fee_charge — начисление по договору; fee_credit — списание по договору, которое уменьшает комиссии к выводу; withdrawal — вывод комиссий с газ-кошелька вместе с газом вывода; topup — пополнение газ-кошелька, найденное сверкой баланса. Одно из: gas, fee, fee_charge, fee_credit, withdrawal, topup.
amount обязательноstringWei со знаком: плюс — topup и fee_credit, минус — газ, комиссии, начисления и вывод. Формат: ^-?[0-9]+$.
tx_hash обязательноstring | nullТранзакция движения; у пополнений, начислений и списаний — null.
sweep_id обязательноstring | null (uuid)Sweep, за который комиссия fee; у других видов — null.
note обязательноstring | nullПометка у начислений и списаний; у пополнений — блоки, которые прошла сверка.
created_at обязательноstring (date-time)

Работа партнёра в одной сети за один день UTC.

ПолеТипОписание
date обязательноstring (date)День по UTC.
chain_id обязательноChainIDИдентификатор сети (EIP-155): 11155111 Sepolia и 97 BSC testnet с тестовым ключом, 1 Ethereum и 56 BSC с боевым.
sweeps_done обязательноintegerSweep, созданные в этот день и закончившиеся swept.
sweeps_failed обязательноintegerSweep, созданные в этот день и закончившиеся failed, — откатились в сети или исчерпали попытки.
sweeps_rejected обязательноintegerSweep, созданные в этот день и закончившиеся rejected, — так и не отправлены, потому что проверка перед отправкой не проходила.
revocations_done обязательноintegerСнятия, созданные в этот день и закончившиеся revoked.
gas_spent обязательноAmountГаз транзакций газ-кошелька за день, в wei, без выводов комиссий.
fees обязательноstringКомиссии и начисления за день за вычетом списаний, в wei; меньше нуля, если списаний больше. Формат: ^-?[0-9]+$.

Событие вебхука и как прошла его доставка.

ПолеТипОписание
id обязательноstring (uuid)id события, как в доставке.
event обязательноstringТип события.
status обязательноstringpending — доставляется или ждёт следующей попытки; delivered — получатель ответил 2xx; failed — попытки кончились или вебхук удалён. Одно из: pending, delivered, failed.
attempts обязательноintegerСколько попыток уже было.
last_status_code обязательноinteger | nullHTTP-статус, которым получатель ответил на последнюю попытку; null — не ответил.
last_error обязательноstring | nullПочему последняя попытка не удалась; null, если удалась. status <код> — получатель ответил другим статусом. timeout, connection refused, connection reset, connection closed, DNS lookup failed, TLS error, connection failed — не ответил; private address refused — имя его хоста указывает на непубличный адрес. webhook removed — вебхук удалён. internal — сбой на нашей стороне.
created_at обязательноstring (date-time)Когда произошло событие.
delivered_at обязательноstring | null (date-time)Когда событие доставлено; до тех пор — null.
next_attempt_at обязательноstring | null (date-time)Когда следующая попытка; только у pending.

Газ-кошелёк и его баланс по сетям.

ПолеТипОписание
gas_wallet обязательноAddressГаз-кошелёк — один адрес во всех сетях.
chains обязательномассив object
chains[].chain_id обязательноChainIDИдентификатор сети (EIP-155): 11155111 Sepolia и 97 BSC testnet с тестовым ключом, 1 Ethereum и 56 BSC с боевым.
chains[].name обязательноstringНазвание сети.
chains[].native обязательноstringТикер нативной монеты сети.
chains[].balanceAmountБаланс газ-кошелька, в wei; нет, если есть error.
chains[].fees_accrued обязательноAmountВсе комиссии и начисления в этой сети за вычетом списаний, в wei.
chains[].fees_withdrawn обязательноAmountСколько комиссий выведено, вместе с газом выводов, в wei.
chains[].fees_due обязательноAmountНачисленные и ещё не выведенные комиссии, в wei. Они лежат на газ-кошельке в резерве.
chains[].availableAmountЧто остаётся на газ, в wei: balance минус fees_due, но не меньше нуля. Нет, если есть error.
chains[].errorstringchain_unavailable — нода сети не ответила, поэтому баланса нет. Одно из: chain_unavailable.

Ставки партнёра и эталоны газа в одной сети.

ПолеТипОписание
chain_id обязательноChainIDИдентификатор сети (EIP-155): 11155111 Sepolia и 97 BSC testnet с тестовым ключом, 1 Ethereum и 56 BSC с боевым.
name обязательноstringНазвание сети.
rate_bps обязательноintegerX для sweep токенов в базисных пунктах, 7000 = 70%; 0 — без комиссии.
rate обязательноstringrate_bps в процентах.
native_markup_bps обязательноintegerНаценка на газ для sweep нативной монеты, в базисных пунктах.
native_markup обязательноstringnative_markup_bps в процентах.
classic_gasсловарь objectЭталон классики для каждого актива, по тикеру токена или нативной монеты: газ на пополнение депозитного адреса и перевод с него. Нет в сети без эталонов.
classic_gas.<ключ>.new обязательноGasГаз для адреса без аккаунта в сети — его создаёт пополнение (только у токенов).
classic_gas.<ключ>.existing обязательноGasГаз для адреса с аккаунтом.
extra_gasobjectСколько газа батча несёт первый sweep адреса сверх повторного. Нет в сети без эталонов.
extra_gas.delegation обязательноGasУстановка делегата на адрес по его авторизации.
extra_gas.account обязательноGasЕщё и создание аккаунта адреса — для адреса, на котором были только токены.
ПолеТипОписание
keep_one_unitbooleanSweep токенов оставляет на депозитном адресе 1 минимальную единицу, и следующий депозит пользователя дешевле. Задание может переопределить. По умолчанию выключено.

Горячий кошелёк в одной сети и его делегат.

ПолеТипОписание
chain_id обязательноChainIDИдентификатор сети (EIP-155): 11155111 Sepolia и 97 BSC testnet с тестовым ключом, 1 Ethereum и 56 BSC с боевым.
address обязательноAddressГорячий кошелёк, куда sweep переводят средства.
delegate обязательноAddressДелегат горячего кошелька — на этот адрес депозитные адреса подписывают авторизацию.
status обязательноstringpending — делегат разворачивается; active — развёрнут, можно сметать; failed — развернуть не удалось, повторная регистрация кошелька запускает развёртывание снова. Одно из: pending, active, failed.
errorstringПочему развернуть не удалось; только у failed. Чаще всего — insufficient_gas_balance: пополните газ-кошелёк и зарегистрируйте горячий кошелёк снова. not_deployed — транзакция развёртывания прошла, но делегата по его адресу нет. Остальные коды — причины неудачной попытки, как в reason задания на sweep. Одно из: not_deployed, insufficient_gas_balance, gas_limit_exceeded, transaction_reverted, nonce_conflict, chain_unavailable, internal.
tx_hashstringТранзакция, которая развернула делегат.
created_at обязательноstring (date-time)Когда горячий кошелёк зарегистрирован.

Авторизация EIP-7702, подписанная ключом депозитного адреса: в сети chain_id на адресе работает код address. Как подписать её, в том числе в HSM, KMS и MPC, — в гайде Подпись авторизаций.

ПолеТипОписание
chain_id обязательноinteger (int64)Сеть запроса; 0 (любая сеть) не принимается.
address обязательноAddressДелегат горячего кошелька из POST /v1/hot-wallets; для снятия делегации — нулевой адрес.
nonce обязательноinteger (int64)Текущий nonce депозитного адреса.
y_parity обязательноintegerЧётность y подписи. Одно из: 0, 1.
r обязательноstringr подписи, 0x-hex до 32 байт. Формат: ^0x[0-9a-fA-F]{1,64}$.
s обязательноstrings подписи, 0x-hex до 32 байт, в нижней половине порядка кривой (EIP-2). Формат: ^0x[0-9a-fA-F]{1,64}$.

Что сметать, откуда и куда.

ПолеТипОписание
external_idstringВаш id задания, уникальный в аккаунте: запрос с уже занятым external_id возвращает то задание, а не создаёт новое, поэтому повторять запрос безопасно. До 128 символов.
chain_id обязательноChainIDИдентификатор сети (EIP-155): 11155111 Sepolia и 97 BSC testnet с тестовым ключом, 1 Ethereum и 56 BSC с боевым.
hot_wallet обязательноAddressГорячий кошелёк в этой сети; его делегат должен быть active.
account обязательноAddressДепозитный адрес.
token обязательноstringТикер токена из списка сети (в любом регистре), адрес контракта токена из этого списка или native (либо тикер нативной монеты) для нативной монеты.
amountAmountСколько сметать, больше нуля; без поля — весь баланс.
keep_one_unitbooleanОставить 1 минимальную единицу токена на депозитном адресе; по умолчанию — из настроек партнёра. Для нативной монеты не действует.
authorizationAuthorizationНужна, пока на депозитном адресе нет делегата этого горячего кошелька. Потом не используется, но присланная всё равно должна быть верной.

Задание на sweep и его итог.

ПолеТипОписание
id обязательноstring (uuid)
external_idstringВаш id задания, если он был в запросе.
chain_id обязательноChainIDИдентификатор сети (EIP-155): 11155111 Sepolia и 97 BSC testnet с тестовым ключом, 1 Ethereum и 56 BSC с боевым.
hot_wallet обязательноAddressГорячий кошелёк.
account обязательноAddressДепозитный адрес.
token обязательноstringТикер токена или нативной монеты.
token_addressAddressАдрес контракта токена; у нативной монеты его нет.
amountAmountЗапрошенная сумма; нет, если сметался весь баланс.
keep_one_unitbooleanЕсть и равно true, если sweep оставляет на депозитном адресе 1 минимальную единицу токена.
status обязательноstringqueued — ждёт батча или повтора; processing — в батче, который готовится, отправлен или ждёт подтверждений; swept — готово, средства в горячем кошельке; failed — откатилось в сети или кончились попытки; rejected — не отправлено. Последние три — окончательные. Одно из: queued, processing, swept, failed, rejected.
reasonstringПочему задание закончилось rejected или failed, а пока оно в queued и ждёт повтора — почему не прошла последняя попытка. Это стабильный код: сообщения самой ноды остаются в наших логах.

- rejected — проверка перед отправкой так и не прошла: not_upgraded, stale_authorization, would_fail или nothing_to_sweep. - failed в сети, внутри прошедшего батча: ошибка контракта, с которой откатился перевод, — TokenTransferFailed, NativeTransferFailed, NothingToSweep или Unauthorized, или reverted без неё. - Причина неудачной попытки; попытка повторяется, а когда попытки кончились, задание получает failed с этой причиной: insufficient_gas_balance (пополните газ-кошелёк), gas_limit_exceeded, transaction_reverted, nonce_conflict, chain_unavailable или internal. Одно из: not_upgraded, stale_authorization, would_fail, nothing_to_sweep, reverted, TokenTransferFailed, NativeTransferFailed, NothingToSweep, Unauthorized, insufficient_gas_balance, gas_limit_exceeded, transaction_reverted, nonce_conflict, chain_unavailable, internal.
attempts обязательноintegerСколько раз задание пробовали выполнить.
swept_amountAmountСколько дошло до горячего кошелька; только у swept.
tx_hashstringТранзакция батча, в которой был sweep.
kindstringЧто понадобилось депозитному адресу в батче; от этого зависят доля газа и эталон. repeat — ничего, делегат уже стоял. first — установка делегата; аккаунт в сети у адреса уже был. first_new — установка делегата, которая заодно создала аккаунт: на адресе были только токены. Одно из: repeat, first, first_new.
gasGasДоля sweep в газе батча.
gas_costAmountТо же в wei.
feeAmountКомиссия в wei; только у swept.
classic_gasGasЭталон, по которому посчитана комиссия.
rate_bpsintegerСтавка, по которой посчитана комиссия; у нативной монеты — наценка на газ.
created_at обязательноstring (date-time)Когда задание создано.
updated_at обязательноstring (date-time)Когда задание менялось в последний раз.

С какого депозитного адреса снять делегацию, с его авторизацией на нулевой адрес.

ПолеТипОписание
external_idstringВаш id снятия, уникальный в аккаунте: запрос с уже занятым external_id возвращает то снятие, а не создаёт новое, поэтому повторять запрос безопасно. До 128 символов.
chain_id обязательноChainIDИдентификатор сети (EIP-155): 11155111 Sepolia и 97 BSC testnet с тестовым ключом, 1 Ethereum и 56 BSC с боевым.
account обязательноAddressДепозитный адрес.
authorization обязательноAuthorizationАвторизация депозитного адреса с address = 0x0000000000000000000000000000000000000000.

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

ПолеТипОписание
id обязательноstring (uuid)
external_idstringВаш id снятия, если он был в запросе.
chain_id обязательноChainIDИдентификатор сети (EIP-155): 11155111 Sepolia и 97 BSC testnet с тестовым ключом, 1 Ethereum и 56 BSC с боевым.
account обязательноAddressДепозитный адрес.
status обязательноstringqueued и processing — как у sweep; revoked — делегации на депозитном адресе больше нет; failed — транзакция прошла, но сеть пропустила авторизацию, или кончились попытки; rejected — не отправлено. Последние три — окончательные. Одно из: queued, processing, revoked, failed, rejected.
reasonstringПочему снятие закончилось rejected или failed, а пока оно в queued и ждёт повтора — почему не прошла последняя попытка. У rejected: not_delegated (делегации и так нет), stale_authorization (nonce депозитного адреса уже другой) или invalid_authorization. У failed: not_applied (сеть пропустила авторизацию). Остальные коды — причины неудачной попытки, как в reason задания на sweep. Одно из: not_delegated, stale_authorization, invalid_authorization, not_applied, insufficient_gas_balance, gas_limit_exceeded, transaction_reverted, nonce_conflict, chain_unavailable, internal.
attempts обязательноintegerСколько раз снятие пробовали выполнить.
tx_hashstringТранзакция, в которой было снятие.
gasGasДоля снятия в газе транзакции.
gas_costAmountТо же в wei.
created_at обязательноstring (date-time)Когда снятие создано.
updated_at обязательноstring (date-time)Когда снятие менялось в последний раз.

Настройка вебхука.

ПолеТипОписание
url обязательноstring (uri)Куда приходят события.
secret обязательноstringСекрет подписи, whsec_…. Храните его на бэкенде.
low_balance обязательномассив objectАлерты о низком балансе газ-кошелька, по одному на сеть.
low_balance[].chain_id обязательноChainIDИдентификатор сети (EIP-155): 11155111 Sepolia и 97 BSC testnet с тестовым ключом, 1 Ethereum и 56 BSC с боевым.
low_balance[].threshold обязательноAmountПорог, в wei.
low_balance[].low обязательноbooleanБаланс ниже порога, алерт отправлен; он снова взводится, когда баланс восстановится.

Тело доставки вебхука. type говорит, что произошло и что лежит в data: задание на sweep, как в GET /v1/sweeps/{id}; снятие делегации, как в GET /v1/revocations/{id}; горячий кошелёк, как в GET /v1/hot-wallets; алерт о низком балансе или тестовое событие. Задания, снятия и кошельки показываются такими, какие они в момент доставки.

Одно из: SweepEvent, RevocationEvent, HotWalletEvent, BalanceLowEvent, WebhookTestEvent; какое именно — говорит поле type.

Задание на sweep закончилось. sweep.swept — средства переведены; sweep.failed — откатилось в сети или кончились попытки; sweep.rejected — так и не отправлено.

ПолеТипОписание
id обязательноstring (uuid)id события, во всех попытках один и тот же.
type обязательноstringТип события. Одно из: sweep.swept, sweep.failed, sweep.rejected.
created_at обязательноstring (date-time)Когда произошло событие.
data обязательноSweepЗадание на sweep и его итог.

Снятие делегации закончилось. revocation.revoked — делегация снята; revocation.failed — сеть пропустила авторизацию или кончились попытки; revocation.rejected — так и не отправлено.

ПолеТипОписание
id обязательноstring (uuid)id события, во всех попытках один и тот же.
type обязательноstringТип события. Одно из: revocation.revoked, revocation.failed, revocation.rejected.
created_at обязательноstring (date-time)Когда произошло событие.
data обязательноRevocationСнятие делегации и его итог.

Развёртывание делегата горячего кошелька закончилось. hot_wallet.active — делегат развёрнут; hot_wallet.failed — развернуть не удалось.

ПолеТипОписание
id обязательноstring (uuid)id события, во всех попытках один и тот же.
type обязательноstringТип события. Одно из: hot_wallet.active, hot_wallet.failed.
created_at обязательноstring (date-time)Когда произошло событие.
data обязательноHotWalletГорячий кошелёк в одной сети и его делегат.

Баланс газ-кошелька опустился ниже порога. По событию на каждое падение ниже порога; алерт снова взводится, когда баланс восстановится.

ПолеТипОписание
id обязательноstring (uuid)id события, во всех попытках один и тот же.
type обязательноstringТип события. Одно из: balance.low.
created_at обязательноstring (date-time)Когда произошло событие.
data обязательноBalanceLowАлерт о низком балансе.

Тестовое событие, запрошенное через POST /v1/webhook/test.

ПолеТипОписание
id обязательноstring (uuid)id события, во всех попытках один и тот же.
type обязательноstringТип события. Одно из: webhook.test.
created_at обязательноstring (date-time)Когда произошло событие.
data обязательноWebhookTestДанные тестового события.

Алерт о низком балансе.

ПолеТипОписание
chain_id обязательноChainIDИдентификатор сети (EIP-155): 11155111 Sepolia и 97 BSC testnet с тестовым ключом, 1 Ethereum и 56 BSC с боевым.
gas_wallet обязательноAddressГаз-кошелёк.
balance обязательноAmountЕго баланс в этой сети в момент алерта, в wei.
threshold обязательноAmountПорог, ниже которого он опустился, в wei.

Данные тестового события.

ПолеТипОписание
message обязательноstring