Контракты
Три небольших контракта без владельца, без административных функций и без возможности обновления. Код у всех одинаковый; батчер или делегат вашим делают адреса, зашитые в него.
Фабрика
Заголовок раздела «Фабрика»SweepFactory — общая: по одной в каждой сети, по одному и тому же адресу во всех сетях, развёрнута через стандартный
деплоер CREATE2 с нулевой солью.
| Сеть | Фабрика | Развёрнута |
|---|---|---|
BSC testnet 97 Testnet | 0x66f63A7246dF0eD76098dD95ad0F53d8e7bed456 | транзакция не записана |
Sepolia 11155111 Testnet | 0x66f63A7246dF0eD76098dD95ad0F53d8e7bed456 | блок 11876757 |
| Компилятор | solc 0.8.33+commit.64118f21, EVM prague, optimizer 200 runs |
|---|---|
| CREATE2 | deployer 0x4e59b44847b379578588920cA78FbF26c0B4956C, salt 0x0000000000000000000000000000000000000000000000000000000000000000 |
| Хеши кода | init code 0x8978addd4a3a80d6acb85369e765f8200edf5f2ae440241994bf3b2b11021320runtime 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.