Тестирование и верификация

Уровни

Уровень Что он ловит
Юнит-тесты Foundry Ожидаемое поведение, контракт за контрактом
Фаззинг Входные данные, которые никто не предусмотрел
Инварианты Свойства, которые должны сохраняться после любой последовательности
Форк-тесты Поведение на реальных контрактах и реальном состоянии
Формальная верификация Свойства, доказанные на всех путях, а не на выборке
Статический анализ Известные опасные паттерны
Аудит текстов Запрещённая лексика и визуальные запреты

Экономические инварианты

Это равенства, которые должны выполняться всегда:

  1. Четыре доли в сумме дают ровно взятый налог, по умолчанию 500 базисных пунктов, без потери хотя бы одного wei
  2. Никто не может вывести активы волта на адрес по своему выбору; единственные возможные уменьшения — конвертация, аирдроп холдерам и аварийное перемещение владельца
  3. Веса корзины в сумме дают 100 % и никогда не меняются
  4. Обе позиции вносятся при создании и могут быть изъяты только режимом завершения, через 30 дней после его объявления
  5. Ликвидность заблокирована; её единственный выход — режим завершения, который владелец объявляет за 30 дней
  6. Байбэк $STOCKFUN не может отправить купленные токены никуда, кроме сжигания
  7. Саплай создателя равен нулю на каждом рынке
  8. Волт может покупать только активы своей корзины
  9. Волт приобретает только ETH, USDC, USDG и акции своей корзины, а также возвраты в USDon на опциональном канале Ondo
  10. Цикл аирдропа никогда не выплачивает больше, чем держит, по каждой акции в отдельности, и ни один холдер не получает больше своей пропорциональной доли; то, что должен контракт аирдропа по всем циклам и отложенным акциям, никогда не превышает его баланс — требуется с 2026-09-27, проверяется с 2026-10-04 инвариантом с состоянием. С 2026-10-05, в том числе в аварийных сценариях, то, что обеспечивает эти расчёты, всегда состоит из токенов, которые контракт действительно держит, и никогда — из токенов, ещё не зачисленных; это проверяет второй инвариант с состоянием
  11. Только лок ликвидности добавляет ликвидность в пул StockFun
  12. Сделка не платит никому, кроме волта рынка; остальные доли ждут на хуке до клейма. С 2026-10-05 волту, который не принимает свою долю, она причитается на хуке, а сделка продолжается
  13. Каждая акция корзины расходует только деньги, зарезервированные для неё

Они проверяются на текущих имплементациях; апгрейд заменяет код, на котором они проверяются.

Ограничение размера

Лимит 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.