Канал Robinhood
Токенизированные акции, которые держат волты, находятся на Robinhood Chain — L2 на базе Arbitrum Orbit. Протокол попадает туда через LayerZero, а денежным звеном служит USDG OFT от Paxos.
Почему этот канал
Выбор был сделан 2026-09-11, после того как от предыдущего канала отказались.
В канале с первичным минтом контракт волта должен быть допущен эмитентом к владению активом: KYB, регистрация адреса контракта и письменное подтверждение, которое эмитент никогда публично не документировал. Это был единственный по-настоящему неустранимый блокер проекта.
Вторичные пулы Robinhood Chain ничего из этого не требуют: они открыты для всех. У StockFun нет отношений с эмитентом, и они ему не нужны.
Цена этой свободы — кросс-чейн зависимость: мост, два хаба и стейблкоин, выпущенный третьей стороной, которая может его заморозить. Это принятый и задокументированный риск, а не устранённый.
Схема
Ethereum] -->|ETH → USDC
Uniswap v4| U[USDC] U -->|USDC → USDG
Curve| G[USDG] G --> BH[BridgeHub] BH -->|Paxos OFT
LayerZero| RH[RemoteHub
Robinhood Chain] RH --> MV[Зеркальный волт
CREATE2, один на рынок] MV -->|пулы v3 / v4| S[Stock Tokens] S -->|адаптеры акций, в обёрнутом виде| AD[AirdropDistributor
Ethereum] AD -->|клеймы| HO[Холдеры токена
на Ethereum]
Обратный путь USDG, из Robinhood Chain в Ethereum, служил только байбэку создателя; оба были удалены из кода 2026-09-28.
С 2026-10-04 зеркальный волт отправляет свои акции в контракт аирдропа на Ethereum: каждая акция блокируется в своём адаптере LayerZero на Robinhood Chain и минтится в обёрнутом виде на Ethereum, где холдеры её клеймят. По этому пути передаются только акции. Адаптеров, по одному на акцию, в репозитории для мейннета пока нет; тесты используют моки, а тестнетовый запуск LayerZero от 2026-10-06 использовал тестовые адаптеры (см. ниже).
Что доступно без разрешений, а что нет
| Компонент | Статус |
|---|---|
| Эндпоинт LayerZero | Без разрешений |
| Вторичные пулы Stock Token | Без разрешений — именно их использует протокол |
| Первичный минт / сжигание Robinhood | KYB — не используется |
| USDG | Paxos контролирует минт и сжигание и может поставить на паузу или заморозить |
Последняя строка — самая жёсткая зависимость канала, и она реальна.
Зеркальный волт
У каждого рынка есть зеркальный волт на Robinhood Chain, задеплоенный через CREATE2 по
адресу, который можно предсказать из Ethereum. Поэтому кипер может поручить удалённому хабу
задеплоить его заранее, до прихода USDC, и перевод никогда не попадёт на адрес без кода. С
2026-10-05 это могут делать только кипер и владелец StockFun (predeploy): до этого это
мог делать кто угодно, даже для рынка, которого ещё не существовало, привязывая его
зеркальный волт к подключению того дня. Удалённый хаб узнаёт кипера из батча моста, который
его несёт: до первого батча он не знает никакого кипера, поэтому зеркальный волт первого
рынка заранее деплоит владелец StockFun. Со второго цикла аудита от 2026-10-05 рынок,
зеркальный волт которого кипер не может задеплоить заранее (до первого батча или после
смены кипера, о которой удалённый хаб ещё не узнал), исключается из батча с оповещением,
вместо того чтобы отправляться со слишком малым количеством газа для деплоя своего волта;
остальные рынки проходят через мост, и их батч несёт нового кипера.
С 2026-10-02 каждый зеркальный волт — это прокси, MirrorVaultProxy, стоящий перед
имплементацией волта, которую удалённый хаб указывает в момент деплоя волта. Конструктор
прокси не принимает аргументов, поэтому его код создания, а вместе с ним и адрес каждого
зеркального волта, остаются предсказуемыми из Ethereum, какой бы ни была имплементация.
Корзина волта приходит с первым батчем, который с 2026-10-05 также обновляет роутер акций
и оракул волта до тех, которые удалённый хаб указывает на тот момент: волт, задеплоенный до
того, как акция была добавлена, принимает корзину с этой акцией. Владелец StockFun, каким
его отражает удалённый хаб, апгрейдит зеркальные волты по одному, рынок за рынком, с
немедленным вступлением в силу.
Маршруты свопа не зашиты в код: они приходят в calldata, закодированные как
abi.encode(uint8 version, bytes payload) — версия 3 для упакованного пути Uniswap v3,
версия 4 для массива PathKey v4. Волт получает по несколько кандидатов на каждое звено и
исполняет по первому, который укладывается в его границу. С 2026-10-01 маршрут, который
исполняет только часть суммы, не проходит, и пробуется следующий кандидат; раньше частичное
исполнение на маршруте v3 оставляло непотраченный USDG застрявшим в роутере.
Начиная с пайплайна безопасности от 2026-10-01, маршрут v3 исполняется по одному пулу за
раз. Каждый пул должен принять всю свою входную сумму, иначе маршрут не проходит; его
выходная сумма возвращается в роутер акций и становится входной суммой следующего пула, а
последний пул платит волту, с соблюдением минимальной суммы звена. Пул, который не прошёл,
откатывает предыдущие пулы той же попытки, и пробуется следующий кандидат. До этого
проверка видела только первый пул маршрута: частичное исполнение дальше по маршруту
оставляло промежуточный токен в роутере Uniswap v3, SwapRouter02, где его мог забрать
любой, а звено при этом проходило успешно. Многошаговое звено v3 теперь стоит один своп и
один approve на каждый пул.
Каждое звено расходует только USDG, зарезервированный для его акции по весам корзины: см.
TreasuryVault. Его ценовая граница относительно фида акции, по
умолчанию 200 базисных пунктов, — настройка, которую хранит удалённый хаб и которую каждый
зеркальный волт читает в реальном времени (setStockMaxSlippageBps). С 2026-10-05 волт
сверяет то, что фактически пришло, с собственным минимумом кипера, который никогда не
слабее этой границы.
Когда оракул придерживает цену
С 2026-10-06 у оракула зеркальных волтов есть две защиты, которые рекомендует собственная документация Robinhood; каждая может только придержать цену, но никогда её не изменить.
- Корпоративное действие. Пока акция проходит через него (например, сплит), её токен
сообщает, что его оракул на паузе (
oraclePaused()), а её фид Chainlink держит своё последнее значение, которое может выглядеть свежим, пока множитель токена меняется. Тогда оракул придерживает цену этой акции: её звено покупки не проходит отдельно (StockOraclePaused), её USDG остаётся зарезервированным для неё, а остальные акции корзины покупаются. Проверка включена для каждой акции; владелец StockFun может выключить её для одной акции (setOraclePauseCheck), и тогда её цена опирается только на собственные проверки её фида. Токен, который не отвечает, считается не поставленным на паузу. - Секвенсор. Robinhood Chain — сеть Arbitrum с единственным секвенсором. Когда задан
фид аптайма секвенсора L2 от Chainlink (
setSequencerUptimeFeed), оракул придерживает каждую цену, пока фид сообщает, что секвенсор не работает, восстановился не дольше льготного периода назад (по умолчанию час), или пока фид нельзя прочитать: до тех пор ни одно звено не покупает. Сегодня для Robinhood Chain такого фида нет, поэтому канал деплоится с выключенной проверкой; владелец StockFun задаст фид, если Chainlink его опубликует.
Кипер видит обе защиты, прежде чем что-либо котировать (см. Кипер), Worker сообщает, почему отсутствует цена акции, а dapp это показывает (см. Dapp).
Отправка акций в аирдроп
С 2026-10-04 купленные акции покидают зеркальный волт только одним путём: sendToAirdrop.
Кипер вызывает его со списком акций для отправки и оплачивает комиссии LayerZero; излишек
ему возвращается. По каждой акции волт отправляет весь свой баланс через адаптер этой
акции в контракт аирдропа на Ethereum, с идентификатором рынка в качестве полезной
нагрузки. Кипер не указывает ни сумму, ни адресата: адаптер каждой акции
(setStockAdapter, который проверяет, что адаптер переносит именно этот токен) и контракт
аирдропа (setAirdrop) назначает на удалённом хабе его администратор, владелец StockFun.
Акция, указанная дважды или не входящая в корзину, приводит к отказу вызова.
С 2026-10-06 кипер указывает газ, который каждая доставка получает на Ethereum:
sendToAirdrop(stocks, receiveGas, composeGas) — для lzReceive OFT акции сверх того,
что задаёт этот OFT, и для compose контракта аирдропа. Удалённый хаб ограничивает каждое
значение нижним пределом и потолком, которые задаёт его администратор, причём ноль
означает значение по умолчанию (airdropGas), а волт строит отправку и её котировку с
тем, что предоставляет хаб; вызов с одними акциями берёт оба значения по умолчанию. Кипер
выбирает значения по симуляциям доставки на Ethereum (см. Кипер): апгрейд
Ethereum Glamsterdam, активный в Sepolia с 2026-10-06, сделал новый слот хранилища
примерно в пять раз дороже, а прежней единственной цифры для compose, 600 000 газа, не
хватило ни одной доставке первого цикла тестнетового запуска LayerZero. Удалённый хаб,
апгрейд которого выполнен с версии без политик, отклоняет каждую отправку и котировку
(AirdropGasNotSet), пока обе не заданы.
С 2026-10-05 каждая акция отправляется отдельно. Акция без адаптера, акция, баланс которой
нельзя прочитать, и акция, отправка которой не проходит, — заморозка эмитентом,
отсутствующий пир, комиссия, которую не покрывает платёж кипера, — остаётся в волте с
событием (AirdropSendFailed), а остальные уходят; когда не уходит ничего, вызов не
проходит и сообщает причину. Котировка, quoteSendToAirdrop, пропускает то, что не может
оценить, вместо того чтобы завершаться с ошибкой.
LayerZero переносит шесть знаков после запятой: меньше 10^12 единиц акции с 18 знаками, то есть миллионная доля токена, не может пересечь мост и остаётся в волте до следующей отправки.
На Ethereum OFT акции минтит обёрнутую акцию в контракт аирдропа, а затем эндпоинт LayerZero вызывает его с полезной нагрузкой. Контракт зачисляет доставку, только если она пришла от его эндпоинта, от OFT акции, который зарегистрировал владелец, с Robinhood Chain и была отправлена зеркальным волтом, который хаб моста выводит для рынка, указанного в полезной нагрузке. Эта доставка выполняется на газе, который несла отправка (см. выше); доставка, которой не хватило газа, не проходит, ничего не теряя: она сохраняется на эндпоинте LayerZero, обёрнутые акции уже находятся в контракте аирдропа, если не прошёл только compose, и любой может выполнить её повторно с большим газом. С 2026-10-06 это делает кипер, со своего собственного ключа, в пределах ограничения, и подаёт оповещение о втором сбое. Подробности и замеры — в разделах Деплой и Аирдроп.
Апгрейды и подключение
С 2026-10-02 каждый контракт StockFun в канале можно апгрейдить, кроме деплоера зеркальных волтов, из адреса которого выводится адрес каждого зеркального волта. На Ethereum хаб моста и его адаптеры подчиняются владельцу фабрики. На Robinhood Chain источник прав на апгрейд — удалённый хаб: он отвечает адресом своего администратора аварийного режима, то есть владельца в Ethereum, каким его передал последний батч, поэтому удалённый хаб, зеркальные волты, роутер акций и оракул апгрейдит владелец StockFun, с немедленным вступлением в силу.
Удалённый хаб деплоится в своей сети первым, с начальным администратором, который затем назначает роутер акций, оракул и имплементацию будущих зеркальных волтов, а также, если они заданы, маршрут аирдропа и адаптеры акций. Первый батч заменяет этого администратора владельцем StockFun.
С 2026-10-05 тот же администратор распоряжается настройками удалённого хаба: число
записей, которые оплачивает один sweep, по умолчанию 64 (setMaxRecordsPerSweep, никогда
не ноль), ценовая граница покупок зеркальных волтов и газ каждой доставки аирдропа
(setAirdrop); а с 2026-10-06 — две защиты оракула и две политики газа доставок аирдропа
на Ethereum, каждая — значение по умолчанию, нижний предел и потолок
(setAirdropReceiveGas, 650 000 в пределах от 200 000 до 1 500 000;
setAirdropComposeGas, 1 250 000 в пределах от 600 000 до 4 000 000; нулевой нижний
предел, нижний предел выше потолка и значение по умолчанию вне их отклоняются). Удалённый
хаб задаёт обе при инициализации, а DeployRemote задаёт их снова из своих переменных
окружения. Оракул-замена, который назначает администратор (setOracle), начинает с обеими
выключенными защитами, поэтому администратор снова включает их для него; уже
инициализированные зеркальные волты сохраняют оракул, с которым были инициализированы.
На Ethereum хаб моста больше не деплоит свой адаптер: адаптер деплоится под этот хаб, а
затем владелец StockFun один раз назначает его (setAdapter), и при этом проверяются
привязки адаптера. Последующая замена, changeAdapter, с 2026-10-05 происходит
немедленно. Она принимает только адаптер, привязки которого в точности совпадают с
привязками текущего: тот же хаб, фабрика, денежные токены, удалённый хаб, сеть назначения
и транспорт. Она может изменить параметры газа, опции или пул Curve, но никогда — пункт
назначения; удалённый хаб по-прежнему принимает батчи только от того адаптера, под который
он был построен (M-2, см. Аварийный режим). Поэтому адаптер меняют
апгрейдом на месте, по тому же адресу; чтобы принять новый адрес, удалённый хаб сначала
пришлось бы апгрейдить. 2026-10-05 владелец решил оставить это так.
Собственные числа адаптеров — тоже настройки владельца StockFun: на канале USDG — худший
курс USDG за USDC, принимаемый на Curve, по умолчанию 30 базисных пунктов, и газ
последнего шага доставки на Robinhood Chain (setSettings); с десятого цикла аудита,
2026-10-06, этот газ — база, нужная каждому батчу, по умолчанию 200 000, плюс доля на
каждый рынок батча, по умолчанию 400 000, а батч несёт не более 17 рынков (setBatchGas;
см. «Газ compose батча» ниже). До того одна цифра, по умолчанию 1 200 000, оплачивала
каждый батч, что бы он ни нёс. На каноническом канале — газ обоих тикетов
(setTicketGas). С 2026-10-05 тикет учёта канонического канала платит
столько, сколько inbox моста запрашивает за размер батча по текущей базовой комиссии, а
настройка служит нижним пределом. Котировка, прочитанная офчейн без цены газа, видела
нулевую базовую комиссию и оценивала этот тикет только по нижнему пределу, поэтому длинный
батч не проходил при реальной базовой комиссии; со второго цикла аудита того дня кипер
запрашивает котировку по базовой комиссии, которую он указывает (quoteBridgeAt), вдвое
выше последней, и получает излишек обратно. С четвёртого цикла тикет депозита оценивается
так же: столько, сколько inbox запрашивает за depositCalldataLength() байт по базовой
комиссии, а настройка tokenSubmissionCost служит нижним пределом. Эта длина — тоже
настройка владельца (setDepositCalldataLength, никогда не ноль): по умолчанию 1 024
байта, больше 740 байт депозита USDC через шлюз. До этого стоимость подачи депозита была
фиксированной настройкой, и базовая комиссия, которая её перерастала, срывала каждый батч.
Сбои, которые остаются изолированными
С 2026-10-01, после аудита безопасности от 2026-09-29:
- Отклонённая корзина блокирует только свой рынок. Если Robinhood Chain отклоняет корзину рынка, например из-за акции, которую не поддерживают роутер или оракул этой сети, зеркальный волт этого рынка остаётся неинициализированным и сохраняет свои деньги, которые может вернуть аварийный режим. Остальные рынки того же батча моста проходят. Раньше не проходил весь батч, и любой мог включить в один батч исправные рынки вместе с отклонённым.
- Один удалённый токен — один идентификатор. Хаб моста отказывается сопоставлять второй идентификатор корзины с токеном Robinhood Chain, который уже сопоставлен.
- Удалённый хаб на паузе всё равно применяет роли. Каждый батч несёт текущих кипера и администратора аварийного режима. Хаб на паузе всё равно их применяет, поэтому смена владельца StockFun всегда доходит до Robinhood Chain. Деньги записываются по каждому рынку и выплачиваются зеркальным волтам через sweep после снятия с паузы.
- Канонические записи выплачиваются по порядку. На каноническом мосту Orbit, который используется в тестнете и как запасной вариант, токены и учёт приходят двумя отдельными тикетами. Хаб выплачивает ожидающие записи целиком, в том порядке, в котором пришли их сообщения, кто бы ни запустил sweep. Начиная с пайплайна безопасности от 2026-10-01, тикет учёта выплачивает самое большее столько записей, сколько добавил в очередь, сначала самые старые, и они могут относиться к более ранним батчам; остальное выплачивает sweep, по умолчанию не более 64 записей за вызов. Раньше записи, скопившиеся из-за паузы или запоздалого депозита, могли вывести тикет за пределы фиксированного газа его автоматического исполнения, и батч оставался незаписанным, если никто не отправлял тикет повторно вручную в течение семи дней.
Один сбой был изолирован лишь частично. Второй раунд аудита, проведённый 2026-10-01, обнаружил, что если денежный токен отказывает одному зеркальному волту, например потому что его эмитент заморозил этот адрес, каноническая очередь останавливается, а на обоих каналах не проходит ни один батч, в который включён этот рынок (R2H-2). Второй цикл аудита от 2026-10-05 смягчил этот сбой, а четвёртый в тот же день закрыл его: такая доставка теперь ждёт отдельно, а батч продолжается (см. ниже).
С 2026-10-05, после цикла аудита того дня:
- Через мост отправляет только кипер. Батч моста,
bridgeReady, — только для кипера. До этого его мог отправить кто угодно: третья сторона могла вклинить свой батч по самому слабому минимуму адаптера между двумя собственными сделками в пуле Curve или сорвать батч кипера, раньше него отправив через мост один из его волтов. - Аварийное перемещение на удалённом хабе урегулируется, а не оплачивается другим
рынком. На канале USDG хаб отказывается выплачивать то, что он должен, пока не хватает
денег, которые это обеспечивают: со второго цикла аудита того дня он считает их сам и
никогда — по своему балансу, который включает и деньги батчей, ещё находящихся в пути;
деньги возвращаются через
restore. На каноническом канале владелец StockFun ставит хаб на паузу перед перемещением, удаляет запись, деньги которой забрало аварийное перемещение, затем снимает хаб с паузы. См. Аварийный режим.
С четвёртого цикла аудита от 2026-10-05, который применяет правило основателя о том, что один сбой никогда не блокирует остальное (см. Архитектура):
- Отклонённая доставка ждёт отдельно. На канале USDG доля зеркального волта, которую
денежный токен отклоняет, остаётся на удалённом хабе, причитающейся этому рынку и
обеспеченной (
DeliveryRefused), а остальные рынки батча получают выплату. На каноническом канале такая запись покидает очередь и хранится отдельно для своего рынка (undeliverable), так что записи за ней и следующие тикеты выплачиваются. На обоих каналах любой выплачивает её черезsweep(marketId), как только волт снова принимает деньги. С 2026-10-06 кипер на каноническом канале также закрывает переводы, отклонённые записи которых один sweep выплатил разом или которые владелец StockFun отнёс на рынок, чтобы ни один из них не оставался под наблюдением навсегда. - Каждый рынок батча идёт отдельно.
bridgeReadyисключает указанный рынок, волт которого не может выдать свои деньги, — на паузе, пустой, отклонённый эмитентом или, с пятого цикла, волт, у которого ещё нет кода, как у волта рынка протокола до его назначения, — неизвестный рынок или рынок, полезную нагрузку которого адаптер не может собрать (MarketSkipped), а остальные уходят. Минимум кипера покрывает батч в указанном составе и пропорционально уменьшается до того, что фактически ушло;Bridgedперечисляет только ушедшие рынки. Батч, из которого не уходит ничего, не проходит, с причиной первого рынка. - Каждое звено покупки идёт отдельно, на зеркальном волте, как и на волте в Ethereum
(
LegFailed): см. TreasuryVault. - Аварийное перемещение можно отнести на один рынок. Владелец StockFun перемещает
деньги одного рынка и урегулирует его расчёты в том же вызове, так что ни один другой
рынок не ждёт:
emergencyTransferFromPendingзабирает то, что хаб должен этому рынку на канале USDG, или его отклонённую долю на каноническом канале, аemergencyTransferRecord— стоящую в очереди каноническую запись, целиком. С пятого цикла последний вызов предназначен для записи, депозит которой уже пришёл: деньги очереди общие, поэтому он отклоняет сумму, превышающую деньги, не удерживаемые для отклонённых долей (RecordNotCovered). Запись, депозит которой потерян, списывается (writeOffRecord). На канале USDG перемещение, не отнесённое ни на один рынок, сохраняет своё общее ожидание — так задумано: расчёты показывают недостачу, пока деньги не вернут или не спишут. - Придержанная цена задерживает только свои звенья (с 2026-10-06): акция в корпоративном действии срывает только собственное звено, в каждом зеркальном волте; при заданной проверке секвенсора сбой секвенсора задерживает каждое звено, пока секвенсор не проработает после восстановления льготный период, и деньги ждут в волтах (выше, «Когда оракул придерживает цену»).
Газ compose батча
С десятого цикла аудита, 2026-10-06. Последний шаг батча моста на Robinhood Chain, compose удалённого хаба, инициализирует и пополняет зеркальный волт каждого рынка, поэтому его газ растёт вместе с батчем. Раньше он получал одну фиксированную цифру, по умолчанию 1 200 000, что бы ни содержал батч: четырём новым рынкам на корзинах из пяти акций её не хватило. Их USDG тогда остался на удалённом хабе без какой-либо записи, каждый следующий батч с теми же рынками не проходил так же, и сдвинуть его смог только запуск вручную на эндпоинте Robinhood Chain. Ничего не было потеряно, но ни один рынок батча за это время не получил ни покупок, ни аирдропа.
- База и доля на каждый рынок. Адаптер USDG даёт батчу из n рынков
composeGas + n × composeGasPerMarketгаза compose, по умолчанию 200 000 плюс 400 000 на рынок, одинаково для отправки и для каждой котировки. Первому батчу рынка из пяти акций нужно около 294 000 газа (экстраполяция по замерам для одной–трёх акций), а уже настроенному рынку — от 21 000 до 39 000, на форке тестнета Robinhood Chain через собственный эндпоинт LayerZero - Не более 17 рынков на батч. LayerZero отклоняет сообщение сверх лимита размера пути, по умолчанию 10 000 байт, а каждый рынок из пяти акций добавляет к сообщению батча не более 544 байт: 17 рынков помещаются, 18 — нет. Батч большего размера отклоняется целиком, прежде чем что-либо сдвинется, и каждый волт сохраняет свои USDC. Кипер отправляет не больше, первыми — рынки, которые ждут дольше всех, а остальные уходят на его следующем проходе, так что ни один не ждёт бесконечно. У канонического канала такого потолка нет
- В пределах лимитов Robinhood Chain. Газ compose самого большого батча — не более 24 000 000, ниже 32 000 000 газа, которые Robinhood Chain исполняет в одной транзакции; настройки владельца не могут выйти за этот предел. До мейннета владелец читает лимит размера пути, которым пользуется USDG от Paxos, и, если он отличается, приводит потолок в соответствие
- Это стоит немного. Исполнитель LayerZero берёт за дополнительный газ по цене газа Robinhood Chain: в тестнете комиссия батча растёт на 0,00001 ETH за миллион газа
- Адаптер прежней версии отклоняет каждый батч, пока владелец не задаст две новые настройки, что его апгрейд делает в той же транзакции. Адаптер тестнета получил апгрейд таким образом 2026-10-06, и compose его следующего батча исполнитель LayerZero выполнил с его новой опцией, 600 000 газа на один рынок, из которых использовано 115 990
- Застрявший compose об этом сообщает. Оповещение кипера о переводе, не зачисленном вовремя, теперь читает сообщение батча на эндпоинте Robinhood Chain: ещё не доставлено туда; compose выполнен, и зачисление последует; или сохранено, его USDG на удалённом хабе, и оно ждёт повторного запуска вручную с большим газом, что может сделать кто угодно, причём оповещение даёт хеш сохранённого сообщения. Сам кипер по-прежнему не выполняет compose моста
Что проверено, а что нет
Сначала текущее состояние. Не было ни деплоя в мейннет, ни перевода реальных средств. Локальные тесты симулируют доставку; они не доказывают реальную доставку через LayerZero. Отправки аирдропа, написанные 2026-10-04, тестируются на моках LayerZero и адаптеров акций.
Тестнетовый запуск LayerZero, 2026-10-06. Протокол был задеплоен в Sepolia и в
тестнете Robinhood Chain (167 транзакций деплоя, все успешные) и прошёл от начала до конца
на реальных тестнетовых эндпоинтах, DVN и исполнителе LayerZero, с 13:50 до 19:07 UTC, под
управлением кипера, в семи часовых окнах: ETH каждого окна был сконвертирован один раз,
переправлен одним батчем LayerZero, обработан через compose на удалённом хабе в зеркальный
волт и потрачен на три тестовые акции. Были открыты шесть циклов аирдропа, отправленных
обратно через LayerZero и обработанных через compose на контракте аирдропа; первые четыре
были полностью заклеймлены пятью холдерами, пятый — частично, шестой оставлен для клейма,
и каждая выплата в точности равнялась доле, рассчитанной независимо по регистратору
владения. Учебные инциденты (паузы, аварийные перемещения и restore, rescue, кипер,
остановленный с ожидающей транзакцией, compose, выполненный вручную, устаревший фид, акция
на паузе, защита секвенсора, доставка, которую отклоняет денежный токен) были разыграны на
живых сообщениях и восстановлены так, как задокументировано, кроме двух половин: паузы
хаба моста в Sepolia и compose моста, выполненного вручную. Sepolia активировала апгрейд
Ethereum Glamsterdam во время запуска: первым доставкам аирдропа не хватило газа у
исполнителя LayerZero, и их выполнили вручную, а исправление газа доставки (см. выше) было
применено апгрейдом и обеспечило следующие циклы. Кипер был перезапущен в 18:25 на коде
девятого цикла аудита и чисто провёл последнее окно, с газом, который он выбрал по своим
симуляциям.
Чего этот запуск не доказывает: USDG от Paxos, у тестнетового токена которого нет функции
OFT в этих тестнетах, поэтому его заменял тестовый USDG под MintBurnOFTAdapter от
LayerZero, устроенный как пара в мейннете, и ни DVN этой пары, ни заморозка, ни пауза не
проверялись; акции Robinhood и их адаптеры, которые заменяли тестовые акции под
OFTAdapter от LayerZero; реальные ценовые фиды и реальную ликвидность; газ, комиссии и
финальность мейннета. Ещё предстоит пробный запуск в мейннете — первый небольшой цикл на
проверочном волте.
Более старые скрипты для Sepolia используют канонический мост Orbit и не проверяют LayerZero. Успех на форке или в тестнете не является доказательством реальной доставки в мейннете.