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

Контракты

Три небольших контракта без владельца, без административных функций и без возможности обновления. Код у всех одинаковый; батчер или делегат вашим делают адреса, зашитые в него.

SweepFactory — общая: по одной в каждой сети, по одному и тому же адресу во всех сетях, развёрнута через стандартный деплоер CREATE2 с нулевой солью.

СетьФабрикаРазвёрнута
BSC testnet 97 Testnet0x66f63A7246dF0eD76098dD95ad0F53d8e7bed456транзакция не записана
Sepolia 11155111 Testnet0x66f63A7246dF0eD76098dD95ad0F53d8e7bed456блок 11876757
Компиляторsolc 0.8.33+commit.64118f21, EVM prague, optimizer 200 runs
CREATE2deployer 0x4e59b44847b379578588920cA78FbF26c0B4956C, salt 0x0000000000000000000000000000000000000000000000000000000000000000
Хеши кодаinit code 0x8978addd4a3a80d6acb85369e765f8200edf5f2ae440241994bf3b2b11021320
runtime code 0xa805b3e8e2915685aaa97e94e623be43255d68ab0ce7886c272242d082cc475d
коммит97eb1efe5c30bb96de87da6e726601602d30d360

Фабрика разворачивает ваши контракты, когда вы регистрируете горячий кошелёк (котёл), — вызовом с вашего газ-кошелька: вызвавший всегда становится газ-кошельком того, что развёрнуто, поэтому развернуть контракты от вашего имени нельзя. Её функции идемпотентны.

ФункцияЧто делает
deployBatcher()Разворачивает батчер вызывающего или возвращает уже развёрнутый.
deployDelegate(hotWallet)Разворачивает делегат hotWallet для батчера вызывающего или возвращает уже развёрнутый.
onboard(hotWallet)Оба сразу.
predictBatcher(gasWallet)Адрес батчера газ-кошелька — развёрнут он или нет.
predictDelegate(hotWallet, gasWallet)Адрес делегата горячего кошелька — развёрнут он или нет.

SweepBatcher(gasWallet) — по одному на газ-кошелёк, и вызвать его может только этот газ-кошелёк. sweepMany сметает список депозитных адресов одной транзакцией, отводя каждому не больше 300 000 газа, чтобы один упавший адрес не остановил остальные. На каждый успешный перевод — событие Swept(account, token, amount), на каждую неудачу — SweepFailed(account, token, reason) с селектором ошибки.

SweepDelegate(hotWallet, batcher) — по одному на горячий кошелёк, это код, который выполняют ваши депозитные адреса. Его единственная функция sweep(token, amount) отправляет токен адреса — или нативную монету, если токен — нулевой адрес, — в горячий кошелёк и только по вызову вашего батчера; amount 0 — весь баланс. Поддерживает токены, которые ничего не возвращают из transfer, как USDT в Ethereum, и читает из ответа токена не больше 32 байт. Адрес при этом продолжает принимать нативную монету и вызовы, как обычный.

ОшибкаЧто значит
Unauthorized()Вызывающий — не ваш батчер или не ваш газ-кошелёк.
NothingToSweep()Сметать нечего: баланс 0.
TokenTransferFailed()Токен отказал в переводе.
NativeTransferFailed()Горячий кошелёк не принял нативную монету.
ZeroAddress()Делегат нельзя собрать для нулевого адреса.

Каждый адрес выше следует из кода контрактов: посчитайте их из кода и сравните. verify-delegate из SDK делает это одной командой; в гайде Проверка делегата — и она, и ручная проверка в Foundry. Настройки компилятора и хэши кода выше — это настройки и хэши развёрнутой фабрики.

В мейннете исходники фабрики, каждого батчера и делегата будут также верифицированы в Etherscan и Sourcify. Развёртывания в тестнетах в обозревателях не верифицируются: проверяйте их по адресам. За исходниками контрактов обращайтесь на support@portuna.io.