Тестирование и верификация
Уровни
| Уровень | Что он ловит |
|---|---|
| Юнит-тесты Foundry | Ожидаемое поведение, контракт за контрактом |
| Фаззинг | Входные данные, которые никто не предусмотрел |
| Инварианты | Свойства, которые должны сохраняться после любой последовательности |
| Форк-тесты | Поведение на реальных контрактах и реальном состоянии |
| Формальная верификация | Свойства, доказанные на всех путях, а не на выборке |
| Статический анализ | Известные опасные паттерны |
| Аудит текстов | Запрещённая лексика и визуальные запреты |
Экономические инварианты
Это равенства, которые должны выполняться всегда:
- Четыре доли в сумме дают ровно взятый налог, по умолчанию 500 базисных пунктов, без потери хотя бы одного wei
- Никто не может вывести активы волта на адрес по своему выбору; единственные возможные уменьшения — конвертация, аирдроп холдерам и аварийное перемещение владельца
- Веса корзины в сумме дают 100 % и никогда не меняются
- Обе позиции вносятся при создании и могут быть изъяты только режимом завершения, через 30 дней после его объявления
- Ликвидность заблокирована; её единственный выход — режим завершения, который владелец объявляет за 30 дней
- Байбэк
$STOCKFUNне может отправить купленные токены никуда, кроме сжигания - Саплай создателя равен нулю на каждом рынке
- Волт может покупать только активы своей корзины
- Волт приобретает только ETH, USDC, USDG и акции своей корзины, а также возвраты в USDon на опциональном канале Ondo
- Цикл аирдропа никогда не выплачивает больше, чем держит, по каждой акции в отдельности, и ни один холдер не получает больше своей пропорциональной доли; то, что должен контракт аирдропа по всем циклам и отложенным акциям, никогда не превышает его баланс — требуется с 2026-09-27, проверяется с 2026-10-04 инвариантом с состоянием. С 2026-10-05, в том числе в аварийных сценариях, то, что обеспечивает эти расчёты, всегда состоит из токенов, которые контракт действительно держит, и никогда — из токенов, ещё не зачисленных; это проверяет второй инвариант с состоянием
- Только лок ликвидности добавляет ликвидность в пул StockFun
- Сделка не платит никому, кроме волта рынка; остальные доли ждут на хуке до клейма. С 2026-10-05 волту, который не принимает свою долю, она причитается на хуке, а сделка продолжается
- Каждая акция корзины расходует только деньги, зарезервированные для неё
Они проверяются на текущих имплементациях; апгрейд заменяет код, на котором они проверяются.
Ограничение размера
Лимит EIP-170 — 24 576 байт рантайм-кода. Его соблюдение контролирует тест, который проваливает набор тестов, а не ручная проверка.
Здесь это реальное ограничение: фабрику пришлось разделить. До 2026-10-02 деплоер волтов,
который встраивал код создания TreasuryVault, был контрактом, ближе всех подошедшим к
потолку, и каждая строка, добавленная в волт, расходовала этот запас. Удаление байбэка
создателя 2026-09-28 сократило его размер с 23 055 до 14 965 байт; исправления от
2026-10-01, которые резервируют деньги акция за акцией, довели его до 15 954. С 2026-10-02
он деплоит прокси, и под лимит должна укладываться имплементация каждого модуля.
2026-10-05 ближе всех к потолку оказался контракт аирдропа. Изменения клеймов в четвёртом цикле аудита вывели его за лимит; перевод части его view-функций в private и отказ от его аварийных перемещений, относимых на один цикл, вернули его к 24 432 байтам, на 144 ниже потолка.
После аудита от 2026-09-29
У каждой находки, исправленной после аудита безопасности от 2026-09-29, есть регрессионные тесты, которые падают на коде, прошедшем аудит; в большинстве это PoC из аудита, инвертированные так, чтобы проверять исправленное поведение.
Пайплайн безопасности от 2026-10-01
Второй раунд аудита, проведённый двумя независимыми аудиторами, а затем все проверки заново на исправленном коде. У каждого его исправления в контрактах и в кипере есть регрессионные тесты. На 2026-10-01, после этих исправлений:
- Foundry. Проходят 421 тестов вне форк-сьютов, а также глубокий профиль: 20 000 прогонов фаззинга, инварианты на 512 прогонах глубиной 128. Форк-сьюты не прогонялись: доступного RPC URL не было.
- Мутационное тестирование. slither-mutate запускался на пяти контрактах: распределителе комиссий, записи владения, волте казны, роутере акций на Robinhood Chain и удалённом хабе. Он создал 1 301 мутант — небольшие намеренные изменения кода, — и тесты поймали 1 118 из них. Из 183 выживших 107 эквивалентны исходному коду: никакие входные данные не позволяют их различить. Остальные 76 показали проверки, которых тесты не делали; теперь тесты покрывают их все. Ни один мутант не выявил бага.
- Формальная верификация. Каждое задание Certora было заново запущено на прувере, на
исправленном коде (certora-cli 8.8.1, базовые sanity-проверки). Ни одно правило не
нарушено. Семь правил
LiquidityLockостаются нерешёнными для одного метода,lockProtocolLiquidity: они превысили лимит времени, а повторный прогон с более длинным лимитом завершился без вердикта. На всех остальных методах они выполняются; этот метод доступен только владельцу, выполняется один раз, для$STOCKFUN, а тесты Foundry покрывают доступ к нему, его однократность и форму его лока. Остальные неверифицированные результаты — известные случаи вакуумности: правило, запускаемое на каждом методе, для метода, который в верифицируемой конфигурации никогда не может выполниться успешно. Сбои первого прогонаTreasuryVaultбыли вызваны двумя артефактами спецификации, ни один из которых не был багом; спецификация исправлена. - Фаззинг и символьное исполнение. В Medusa пять свойств записи владения прогонялись десять минут без единого сбоя. Первый прогон Medusa обнаружил, что в тестовой сети, где отсчёт времени начинается с часа 0, отсутствовала первая часовая отметка учитываемого саплая; ни одна реальная сеть затронута не была, и теперь токен записывает эту отметку при деплое. В Halmos три символьные проверки проходят для любых входных данных в допустимых пределах: разбивка комиссии точна, учитываемый саплай следует за любыми двумя переводами, а его интеграл на следующем часе верен. Mythril не может исследовать контракты протокола вне деплоя — покрытие около 14 %; на автономной записи владения он достиг 31 % за 15 минут и ничего не сообщил.
- Статический анализ. Slither, Aderyn и Solhint не нашли ничего нового.
- На свежей локальной сети. Проходят полный деплой, реальный цикл кипера и десять сценариев использования. Репетиция деплоя — продакшн-скрипты, запущенные в порядке ранбука, — проходит после исправления одного скрипта: скрипт мок-канала минтил свои средства для начального наполнения на отправителя по умолчанию в forge, а не на ключ, который выполняет деплой.
| Задание Certora | Верифицировано |
|---|---|
BuybackBurner |
12 |
Fees |
5 |
LiquidityLock |
13 |
StockFunFactory |
23 |
StockFunHook |
36 |
StockFunProtocolToken |
9 |
StockFunSwapRouter |
8 |
StockFunToken |
11 |
TreasuryOracle |
8 |
TreasuryVault |
32 |
UniswapV4StockRouter |
12 |
Этот прогон также верифицировал 11 правил TeamVesting — контракта, удалённого вместе со
своей спецификацией 2026-10-05. Прувер не покрывает сторону Robinhood Chain: удалённый хаб,
зеркальные волты и роутер акций.
Переработка под апгрейд от 2026-10-02
Переработка, сделавшая модули апгрейдируемыми, прошла после всех проверок выше. На 2026-10-02, на новом коде:
- Foundry. Проходят 458 тестов вне форк-сьютов. Новые сьюты покрывают апгрейды, на
Ethereum и на Robinhood Chain, — кто может выполнять апгрейд, источник прав и
PoolManager, которые новая имплементация должна сохранить, волты по одному, — а также режим завершения. Сьют записи владения переехал вместе с записью — в регистратор владения. - Раскладки хранилища. Раскладка хранилища каждого апгрейдируемого модуля записана в
contracts/storage-layouts/, аcontracts/script/check-storage-layouts.shзавершается с ошибкой при любом изменении, кроме дописывания в конец. Он предназначен для запуска перед каждым апгрейдом. С 2026-10-05 он проверяет каждую структуру на всех уровнях вложенности: см. Деплой. - На свежей локальной сети. Скрипт
LocalRunпроходит. - Формальная верификация. Спецификации Certora обновляются под новый код. Их последний полный прогон на прувере, 2026-10-01, был сделан до переработки: таблица выше описывает этот прогон.
Глубокий профиль, мутационное тестирование, фаззинг и символьное исполнение и статический анализ, описанные выше, запускались 2026-10-01, на коде до переработки.
Аирдроп от 2026-10-04
Контракт аирдропа и два пути sendToAirdrop, написанные 2026-10-04, без деплоя. В этот
день, на новом коде:
- Foundry. Проходят 514 тестов вне форк-сьютов, против 459 до аирдропа. Три новых
сьюта:
AirdropDistributorTest, 38 тестов;AirdropCrossChainTest, 15, с моками LayerZero;AirdropInvariantsTest, 2, вокруг инварианта с состоянием: сохранение и платёжеспособность на двух рынках при случайных отправках, клеймах, размещениях, открытиях и изменениях исключений и часа цикла, 128 прогонов по 64 вызова. Фаззинг расчёта долей выполняется 512 раз. - Газ. Клейм цикла из двух или трёх акций стоит примерно от 120 000 до 210 000 газа по замерам в тестах, которые работают с «тёплым» хранилищем: реальная транзакция стоит несколько дороже. Доставка с Robinhood Chain стоит на Ethereum примерно от 85 000 до 1 016 000 газа, по замерам «на холодную»: см. Деплой.
- На локальной сети. На Anvil —
LocalRun, затемLocalAirdrop: два холдера, акции, отложенные до 13:00 UTC, затем размещённые и заклеймленные после. Каждый клейм — это ровно округлённая вниз доля, с 1 wei пыли на акцию. - Формальная верификация. Пять спецификаций Certora, затрагивающих изменённые контракты, проходят проверку типов. Прувер не запускался, и ни одна спецификация не покрывает контракт аирдропа.
- Офчейн. Проходят 93 теста кипера, 43 — общего пакета, 9 — бэкенда и 58 — воркера.
- Ревью. Codex (gpt-6-astra) проверил дизайн, затем код: одна находка Medium, о
таймингах отложенных акций, и одна Low, о локальном скрипте, обе исправлены. Повторное
ревью исправлений нашло одну находку Medium, о тайминге изменений списка исключений, и
одну Low, о порядке действий локального скрипта, обе исправлены: окно измеряется по
списку исключений, действовавшему на момент его закрытия, а скрипт сначала размещает
отложенные акции. Финальная проверка этих двух исправлений не нашла ни одного бага в
рамках заявленной гарантии: отложенные акции уходят в первое окно с допустимым
владением, кто бы ни вызывал и когда бы это ни происходило, если в промежутке не
меняется час цикла и не заменяется регистратор владения токена. Отчёты лежат в
projet/docs/audit-2026-10-04/.
Изменения от 2026-10-05
Никакой аллокации команде, немедленный аварийный режим и каждое число — настройка владельца; написано 2026-10-05, без деплоя. В этот день, на новом коде:
- Foundry. Набор проходит, 520 тестов. Два новых сьюта,
SettingsиSettingsCrossChain, покрывают каждую настройку: кто может её задавать, какие значения она отклоняет и следующую операцию после изменения — среди них налог и антиснайп, форма запуска, сохранение каждым пулом своего ключа и доли того, что собирают заблокированные позиции. Свойства комиссий, проверенные фаззингом и символьно, выполняются для любых допустимых настроек. Тесты аварийного режима приведены в соответствие с немедленным перемещением, а тесты контракта вестинга ушли вместе с ним. - Газ. Чтение настроек налога обходится свопу примерно в 1 200 газа больше, с «тёплым» хранилищем.
- Формальная верификация. Спецификации комиссий, хука, лока, фабрики, токенов и оракула следуют за настройками и проходят проверку типов локально. Прувер не запускался.
Циклы аудита от 2026-10-05
В тот же день код, без деплоя, прошли пять циклов ревью; начиная с четвёртого, нарушение правила основателя, согласно которому один сбой никогда не блокирует остальное, считается дефектом (см. Архитектура). У каждого исправления есть регрессионный тест. На коде каждого цикла:
- Foundry. После четвёртого цикла проходят 602 теста, после пятого — 613; в конце дня проходят 614, а три форк-сьюта пропущены без RPC. Каждый контракт укладывается в EIP-170, а раскладки хранилища выросли только там, где исправление дописало состояние.
- Инварианты. Инварианты аирдропа проходят 512 прогонов глубиной 128 в глубоком
профиле, после третьего цикла. Второй инвариант с состоянием проводит аирдроп через
аварийные сценарии: доставки, последний шаг которых выполняется с опозданием, случайно
поступившие токены, выводы, возвраты, списания и паузы, а с пятого цикла — акции,
замороженные эмитентом, и
claimMany. - Формальная верификация. Циклы добавили правила для хука (его долги перед волтами, его случайные поступления), для лока (удерживаемые им доли, его функции спасения), для бёрнера и токенов (их функции спасения) и правило о том, что на роутерах, оракуле и фабрике спасение выполняет только владелец протокола: 213 правил и инвариантов в 11 спецификациях после четвёртого цикла и ещё одно, о функциях спасения токенов, после пятого. Каждая затронутая спецификация проходит проверку типов локально; на прувер ничего не отправлялось, и его последним прогоном остаётся прогон от 2026-10-01.
- Офчейн. После шага аирдропа в кипере, экрана клейма в dapp и офчейн-прохода четвёртого цикла проходят 191 тест кипера, 51 — общего пакета, 9 — бэкенда и 90 — воркера, а приложение проходит проверку типов и линт.
- На локальной сети. На Anvil —
LocalRun, затем кипер, движок воркера и подготовка клейма в приложении: в окне деплоя кипер ничего не отправил; в следующем он открыл два цикла и отправил акции двух волтов, а одинclaimManyвыплатил пять акций по двум циклам, примерно за 421 000 газа, после чегоclaimableпоказывал ноль.
Офчейн-проход пятого цикла, 2026-10-06
Проверка кипера, воркера, приложения и скриптов в пятом цикле нашла три проблемы средней и шестнадцать низкой серьёзности, каждая исправлена с регрессионным тестом, не задеплоено. Запуск 2026-10-06:
- Foundry. На коде того дня проходят 619 тестов, три форк-сьюта пропущены без RPC: у
новых полей Lens, ограничения корзины пятью акциями и возобновлённого запуска
$STOCKFUNесть свои тесты. Раскладки хранилища не изменились. - Офчейн. Проходят 210 тестов кипера, 51 — общего пакета, 9 — бэкенда и 111 — воркера; тесты каждого исправления кипера падают, когда исправление убрано. Приложение проходит проверку типов и линт; у него нет раннера тестов, а подготовка клейма переехала в движок воркера, тесты которого её покрывают.
- На локальной сети. Репетиция на приватном Anvil прошла свои шесть сценариев:
LocalRun, пробный прогон которого не записывает файл деплоя; кипер через два окна, конвертирующий ETH каждого волта раз за окно, затем размещающий, открывающий и отправляющий аирдроп один раз, причём каждый клейм точен до wei; волт, отклоняющий ETH, долги которого на хуке и локе выплачены после его восстановления; остановки посреди работы с файлом состояния и его блокировкой, ничего не отправлено дважды, заменённая и отброшенная транзакции обработаны; функции спасения и ежедневный сбор LP-комиссий. Канал через мост, приложение и воркер в неё не входили.
После репетиции, 2026-10-06
Находки репетиции исправлены в тот же день, не задеплоено. Кипер размещает акции, которые контракт аирдропа держит отложенными для рынка, даже когда его волту нечего нового отправить, и записывает волт, найденный ниже порога, по окну, для которого он проверялся, а не по собственным часам; он учитывает отдельно отправку, оказавшуюся отложенной, не трогает те несколько единиц USDC, которые последнее звено покупки волта никогда не сможет потратить, и показывает в логе идентификаторы пулов. Первая область шестого цикла проверки ничего не нашла в контрактах и нашла одну проблему низкой серьёзности в локальном скрипте, исправленную: файл локального деплоя сверяется с блокчейном до того, как его используют кипер, приложение или воркер. На этом коде:
- Foundry. Проходят 620 тестов, три форк-сьюта пропущены без RPC: на один больше —
возобновлённый запуск
$STOCKFUN, отклонивший волт, который держит акции другой корзины - Офчейн. Проходят 218 тестов кипера, 51 — общего пакета, 9 — бэкенда и 111 — воркера; тесты каждого исправления кипера падают на кипере до него. У проверки файла локального деплоя нет автоматического теста: её запускали вручную на приватном Anvil, где она пропустила свежий деплой и отклонила файл с переставленными ролями двух контрактов
После шестого и седьмого циклов аудита, 2026-10-06
Исправления кипера и воркера шестого цикла и седьмого цикла были сделаны в тот же день, не задеплоено; ни в одном из них не изменился код ни одного контракта, был исправлен лишь один комментарий в контракте. Запуск 2026-10-06, на коммите 415dcae (контракты — из чистой копии этого коммита, поскольку шла другая работа над контрактами):
- Foundry. Проходят 620 тестов: 615 вне форк-файлов и пять тестов форк-сьюта Robinhood Chain на его публичном RPC; три форк-сьюта Ethereum пропущены без RPC. Столько же, сколько после репетиции: ни один тест контрактов не изменился
- Офчейн. Проходят 277 тестов кипера, 51 — общего пакета, 9 — бэкенда и 137 — воркера, в 11 файлах. Каждый proof of concept седьмого цикла — регрессионный тест, и новые тесты каждого исправления падают на коде до него, кроме нескольких, которые фиксируют то, что старый код уже делал (отправка, которую кипер не может оценить, уходит как раньше; старый файл состояния загружается), и тестов графика, функции которого новые. Файл состояния, записанный кипером до шестого цикла, хранится как тестовая фикстура и загружается новым кипером
- Приложение. Оно проходит проверку типов, линт и сборку, а его предварительно отрисованный демо-график занимает всю область построения; у него нет раннера тестов, и браузерные тесты не запускались. Размещение точек графика выполняет код движка воркера, который покрывают тесты воркера
Защиты ценовых фидов и восьмой цикл аудита, 2026-10-06
Две защиты ценовых фидов оракула для Robinhood Chain были написаны 2026-10-06, а исправления кипера, воркера и приложения восьмого цикла — в тот же день, не задеплоено. Контракты изменились вместе с защитами, а не с циклом. Запуск 2026-10-06, на коммите 6586d40 (контракты — из чистой копии этого коммита, поскольку шла другая работа над контрактами):
- Foundry. Проходят 640 тестов: 633 вне форк-файлов, в 82 сьютах, и семь тестов форк-файла Robinhood Chain на его публичном RPC; три форк-сьюта Ethereum пропущены без RPC. Защиты добавили 18 тестов вне форк-файлов: 16 на одном оракуле, с мок-фидами и мок-токенами (каждая защита выключена, затем включена, каждый способ, которым фид или токен может не ответить, каждый ответ, который считается паузой, чтение, которому не хватило газа, настройки владельца и отказы скрипта деплоя), и 2 на кросс-чейн канале (звено акции на паузе не проходит отдельно и покупает после снятия паузы; сбой секвенсора останавливает каждое звено, пока не закончится его льготный период). Два новых форк-теста читают реальные токены акций: каждый из двадцати отвечает на сигнал паузы так, как его читает оракул, причём самое затратное чтение заняло 13 288 газа, а токен, поставленный на паузу там, где его реальный код хранит флаг, придерживает только собственную цену
- Хранилище и спецификации. Раскладки хранилища 17 апгрейдируемых модулей не изменились, кроме дописывания в конец у оракула; формальная спецификация оракула, 25 правил и инвариантов, проходит проверку типов, без прогона на прувере
- Офчейн. Проходят 306 тестов кипера, 51 — общего пакета, 9 — бэкенда и 155 — воркера, в 12 файлах. Каждый proof of concept восьмого цикла — регрессионный тест, и новые тесты каждого исправления падают на коде до него, кроме тестов новых функций
- Приложение. Оно проходит проверку типов, линт, проверку движка и сборку; у него нет раннера тестов, и браузерные тесты не запускались. Проверка корзины в его форме запуска и налог в его панели торговли выполняют код движка воркера, который покрывают тесты воркера
Девятый цикл аудита, Glamsterdam и тестнетовый запуск LayerZero, 2026-10-06
Исправления девятого цикла, газ доставки аирдропа при апгрейде Ethereum Glamsterdam и повторное выполнение застрявшей доставки кипером были сделаны 2026-10-06, не задеплоено в мейннет. Вместе с ними пришло одно изменение контрактов (политики газа удалённого хаба и отправка и котировка зеркального волта с тремя аргументами), проверенное девятью новыми тестами кросс-чейн канала (значения по умолчанию против замеров, ограничение с обеих сторон, опции отправки и соответствующая им котировка, формы с одним аргументом, отказы сеттеров, доставка тяжелее газа, который задаёт её OFT, хаб без политик, оставляющий акции на месте, опции байт в байт) и четырьмя тестами скрипта деплоя. Мок OFT акции теперь суммирует опции газа и оставляет доставку, которой не хватило газа, ждать запуска с большим газом, как это делает эндпоинт LayerZero. С этого цикла второй агент проверяет изменение каждого исправления перед его пушем (шлюз верификатора), и его находки исправляются и тестируются так же. Запуск 2026-10-06, на коммите 92a1904 (контракты — из чистой копии этого коммита, поскольку шла другая работа):
- Foundry. Проходят 653 теста: 646 вне форк-файлов, в 83 сьютах, и семь тестов форк-файла Robinhood Chain на его публичном RPC; три форк-сьюта Ethereum пропущены без RPC. Foundry работает по таблице газа Cancun: его цифры газа — это старые цены, а новые взяты из Sepolia
- Хранилище. Раскладки хранилища 17 апгрейдируемых модулей не изменились, кроме дописывания в конец у удалённого хаба (его политики газа, слоты с 21 по 23)
- Офчейн. Проходят 370 тестов кипера, 51 — общего пакета, 9 — бэкенда и 189 — воркера, в 14 файлах (у кипера 372 на e1dd5f6, после последнего исправления шлюза, остальные без изменений); кипер и воркер проходят проверку типов. Новые тесты каждого исправления падают на коде до него, кроме тестов новых функций. Новый лимит газа на каждую транзакцию в приложении выполняет код движка воркера, который покрывают тесты воркера
- Приложение. Оно проходит проверку типов, линт и проверку движка; у него нет раннера тестов. Два других его исправления — сумма казны, помеченная как оценка, и одобрение, которое не удалось прочитать, — проверены запуском его собственного кода во временной копии
- В Sepolia, после Glamsterdam. Каждая фиксированная цифра газа в контрактах и скриптах была заново измерена в живой сети: все выдерживают, с запасом, кроме двух цифр доставки аирдропа, исправленных политиками газа. Десятый цикл аудита нашёл ещё две: собственный газ скриптов деплоя, который forge берёт из своей собственной симуляции по старым ценам (теперь каждая рассылка берёт оценку ноды), и газ compose моста, рассчитанный на один рынок, а не на батч. Префлайт кипера, запущенный только на чтение на деплое тестнетового запуска LayerZero, проходит свои 68 проверок
- Тестнетовый запуск LayerZero. Протокол прошёл от начала до конца в Sepolia и тестнете Robinhood Chain через реальные тестнетовые эндпоинты, DVN и исполнитель LayerZero — семь часовых окон и шесть циклов аирдропа, каждый клейм в точности равен доле, рассчитанной по регистратору владения: см. Канал Robinhood. Его последнее окно прошло на кипере девятого цикла, с газом доставки, выбранным по его симуляциям
Десятый цикл аудита, 2026-10-06
Исправления десятого цикла были сделаны 2026-10-06, не задеплоены в мейннет, и каждое было проверено вторым агентом перед слиянием. Изменился один контракт, адаптер моста USDG: последний шаг батча моста на Robinhood Chain теперь получает базу плюс долю на каждый рынок, а батч несёт не более 17 рынков. Его покрывают девять новых тестов: четыре новых рынка по пять акций, полный батч из 17 и тридцать рынков, отправленных двумя батчами, каждый запущен «на холодную» ровно с его газом; 18 рынков, отклонённых из-за размера их сообщения; комиссия, растущая вместе с батчем; батч сверх потолка, отклонённый целиком, пока следующий проходит; адаптер, установленный до появления новых настроек, который ничего не переправляет через мост, пока они не заданы; и границы настроек. Мок моста токена USDG теперь отклоняет сообщение сверх лимита размера LayerZero и берёт плату за газ, как это делает LayerZero. У процедуры деплоя нет теста: её изменение было опробовано в Sepolia, где создание, отправленное с собственным газом инструмента деплоя, исчерпало этот газ, а те же создания, отправленные с оценкой ноды, прошли. Запуск 2026-10-07, на коммите 5ea8bf0 (контракты — из чистой копии этого коммита):
- Foundry. Проходят 662 теста: 655 вне форк-файлов, в 84 сьютах, и семь тестов форк-файла Robinhood Chain на его публичном RPC; три форк-сьюта Ethereum пропущены без RPC. Проходят 2 теста проекта тестнетового запуска LayerZero, на собственных контрактах LayerZero
- Хранилище. Раскладки хранилища 17 апгрейдируемых модулей не изменились, кроме дописывания в конец у адаптера моста (его две настройки батча)
- Офчейн. Проходят 400 тестов кипера, 51 — общего пакета, 9 — бэкенда и 210 — воркера, в 15 файлах; кипер и воркер проходят проверку типов. Proof of concept каждого ревьюера — регрессионный тест, а новые тесты каждого исправления падают на коде до него, кроме тестов новых функций. Отслеживание приложением транзакции, которую кошелёк отменяет или заменяет, и его чтения на блоке не раньше блока его собственной последней транзакции выполняют код движка воркера, который покрывают тесты воркера
- Приложение. Оно проходит проверку типов, линт и проверку движка; у него нет раннера тестов
- В тестнетах. Адаптер моста тестнетового запуска LayerZero получил апгрейд в Sepolia 2026-10-06, и его следующий батч, из одного рынка, был доставлен исполнителем LayerZero, который выполнил его compose с новым газом, 600 000, из которых использовано 115 990
Чего тесты не доказывают
Это важно, и собственные отчёты проекта говорят об этом прямо.
Локальные тесты симулируют кросс-чейн доставку. Они не доказывают реальную доставку через LayerZero. Кросс-чейн тесты аирдропа работают с моками LayerZero и адаптеров акций, которых нет в репозитории для мейннета. Форк-сьюты были исключены как минимум из одного прогона, потому что публичные эндпоинты возвращали ошибки HTTP, — и этот отчёт так и говорит, а не выдаёт сьюты за пройденные.
Тестнетовый запуск LayerZero от 2026-10-06 переносил реальные сообщения LayerZero между двумя тестнетами, с тестовыми акциями, тестовыми адаптерами, тестовым USDG и мок-фидами: он доказывает работу кода StockFun на транспорте LayerZero, но не пару USDG от Paxos, не акции Robinhood и их адаптеры, не реальные фиды и ликвидность и не газ, комиссии и финальность мейннета.
Никакой прогон не доказывает: транспорт LayerZero в мейннете, внешнее ревью или формальное доказательство, покрывающее текущий канал. Тестнетовый запуск подписывался реальными кошельками, три его клейма — через приложение.
Локально
Полный сценарий запускается в четырёх терминалах: блокчейн, деплой и симуляция, сервис цен, dapp. Затем кипер и браузерная обвязка.
Точная процедура описана в projet/docs/LOCAL_TESTING.md.