Журнал решений

Канонический реестр — doc/DECISIONS.md. Эта страница кратко излагает поворотные моменты.

2026-08-25 — Внутреннее ревью безопасности

Одна находка высокой критичности: частичные исполнения оставляли ETH и USDC застрявшими в роутерах, причём полностью обложенными налогом. Исправлено отказом от частичных исполнений вместо их обработки.

2026-08-27 — Комиссия растёт с 4 % до 5 %

Доля создателя удвоилась, с 1 % до 2 %. Схема $STOCKFUN — с 2 / 1,5 / 0,5 на 2 / 2,5 / 0,5. Доля казны остаётся 2 %, и это число, которое никогда не меняется.

Принятое следствие: стоимость цикла покупки и продажи растёт с 7,84 % до 9,75 %. С 2026-10-05 ставка и её разбивка — настройки владельца, а эти значения — значения по умолчанию.

2026-08-27 — Байбэк создателя

Снимает исключение «никакого выхода» для единственного пути, который всегда заканчивается сжиганием. Теперь Treasury Ratio может падать по усмотрению создателя. Удалён 2026-09-27, заменён аирдропом.

2026-08-29 — Аварийный режим

Владелец может переместить активы казны после 48 публичных часов. Заменяет обещание «никто не может тронуть казну». Протокол перестаёт описываться как trustless. Немедленный с 2026-10-05: задержки больше нет.

2026-09-11 — Канал переходит на Robinhood Chain

Блокером был допуск контракта волта у эмитента с первичным минтом, публично никогда не документированный. Вторичным пулам Robinhood Chain он не нужен. Цена: принятая кросс-чейн зависимость.

2026-09-12 — Бондинг-кривая уходит

Заменена двумя односторонними позициями Uniswap v4, заблокированными с момента создания. Никакой градуации, никакой миграции, никакой комиссии за градуацию.

Стартовая FDV не меняется: она остаётся той, с которой открывалась кривая, — 3,409 ETH. Первый тикет в 2 ETH забирает 36,06 % саплая против прежних 36,99 % — запуск ведёт себя как раньше, с точностью до пункта.

Попутно отвергнуты: запуск на $5 000 с потолком $50 000, который давал всего 3,25 ETH глубины и позволял первому покупателю на 2 ETH забрать 57 % саплая. А также идея, что более низкий потолок успокоит рынок, — он раньше передаёт эстафету неограниченному диапазону, который тонкий, и удваивает FDV, достигнутую после 50 ETH покупок.

2026-09-12 — Трёхблочный антиснайп

Только создатель в блоке 1, 99 % в байбэк в блоке 2, кроме создателя и вайтлиста владельца, затем обычный режим. Заменён 2026-09-28 убывающим антиснайпом.

Решение принято с полным пониманием возражения: налог 99 % что-то приносит, только если кто-то теряет свои деньги, а закрытие блока 2 дало бы тот же сдерживающий эффект без жертв. Вайтлист находится на уровне протокола, а не создателя, именно для того, чтобы он не мог стать инсайдерским преимуществом на отдельных рынках.

2026-09-12 — Никакого сжигания при продажах

Идея отправлять на сжигание 10 % входящих токенов при каждой продаже отброшена. Если бы её оплачивал продавец, стоимость цикла покупки и продажи выросла бы до 18,78 %. Если бы её оплачивал LP, утверждение «ликвидность заблокирована навсегда» стало бы ложным, а любой получил бы рычаг примерно 1:1, чтобы сжигать флоат и пампить собственный бэг.

2026-09-27 — Аирдроп заменяет байбэк создателя

Теперь у казны рынка одно назначение: 100 % акций, которые она покупает, раздаются через аирдроп холдерам токена этого рынка, пропорционально, в натуральной форме, на Robinhood Chain. Байбэк создателя удалён, а вместе с ним и обратный путь моста. Байбэк и сжигание $STOCKFUN остаются.

Попутно отвергнуты: сохранение байбэка создателя и разделение, при котором 60 % остаются в казне, а 40 % распределяются, — прежний план V2. Принятые следствия: ни одна казна больше не накапливается, Treasury Ratio теряет смысл, а слоган и теглайн предстоит пересмотреть. Механизм был написан в коде 2026-10-04: см. Аирдроп.

2026-09-27 — Цикл каждые 24 часа

Периодичность аирдропа определена в тот же день. Раз в 24 часа для каждого рынка, казна которого накопила как минимум 0,1 ETH, кипер конвертирует накопленное, отправляет его через мост, покупает акции, а затем раздаёт их через аирдроп. Ниже порога в этот день ничего не происходит; ETH ждёт.

Акции можно покупать только тогда, когда фондовый рынок США открыт, поэтому по выходным и в праздничные дни NYSE цикла нет. В коде кипера до 2026-10-06 конвертация выполнялась в течение сессии, на первом проходе, на котором волт держал порог; с тех пор она следует этому решению: раз за окно, на первом проходе кипера после закрытия окна и только если волт в этот момент держит порог (см. 2026-10-06 ниже); с шестого цикла аудита, в тот же день, этому ритму следует и USDC, который держит волт. Отправка в аирдроп выполняется раз за окно с 2026-10-05, после дневной сессии: см. Кипер.

2026-09-27 — Застрявшие средства и измерение владения

Остатки прерванного цикла доводятся до конца в следующем цикле, независимо от того, достигнут порог или нет. Средства аирдропа, застрявшие на 24 часа в зеркальном волте, владелец может переместить без предварительного объявления: это единственное исключение из публичной 48-часовой задержки, выбранное осознанно. Владение измеряется как средний баланс за 24 часа перед циклом, в том числе по понедельникам. Окно для застрявших средств было увеличено до 48 часов 2026-09-28, а правило было закрыто 2026-10-05, так и не попав в код.

2026-09-28 — Убывающий антиснайп

80 % в открывающем блоке, минус 8 пунктов за каждый блок, 5 % с 11-го блока, на покупках и продажах. Излишек идёт в казну рынка, а на $STOCKFUN — в комиссии команды, доступные для клейма. Исключения: покупка создателя при запуске и вайтлист, заданный создателем, — зафиксированный в транзакции создания, публичный, неизменяемый и ограниченный 20 адресами; на $STOCKFUN его задаёт владелец при запуске. С 2026-10-05 эти числа — настройки владельца, а значения выше — значения по умолчанию.

Попутно отвергнуто: маркировать кошельки, которые покупают в первых блоках, и облагать налогом их последующие продажи, даже после перевода. Пул v4 не видит кошелёк, налог, взимаемый самим токеном, приводит к сбою продажи, а блокировка маркированных кошельков вне роутера StockFun привела бы к тому, что сканеры пометили бы токен. Принятое следствие: вайтлист переходит от протокола к создателю — то, что решение от 2026-09-12 исключило, чтобы не допустить инсайдерского преимущества.

2026-09-28 — Застрявшие средства аирдропа: 48 часов

Средства аирдропа, пробывшие в зеркальном волте 48 часов, а не 24, владелец может переместить без предварительного объявления. При 24 часах окно было равно периоду цикла, поэтому обычный перенос на следующий цикл уже позволял переместить средства без предварительного объявления; при 48 часах это уже не так. После сбоя в пятницу средства по-прежнему можно переместить в воскресенье, до цикла понедельника. Решено в тот же день: отсчёт никогда не останавливается — ни во время паузы, ни в выходные. Закрыто 2026-10-05, так и не попав в код: аварийное перемещение теперь везде немедленное.

2026-09-28 — Владение записывается ончейн

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

2026-09-28 — Аирдроп обёрнутыми акциями, на Ethereum

Акции, купленные на Robinhood Chain, блокируются там в адаптерах LayerZero, задеплоенных StockFun, по одному на каждую акцию, и отправляются на Ethereum в виде обёрнутых акций. Распределение происходит на Ethereum, где находятся токен и данные о владении им, и каждый холдер клеймит свою долю за свой счёт. Принятые следствия: ценность обёрнутых акций держится только на заблокированных акциях и конфигурации LayerZero, у них нет рынка на Ethereum, а заморозка Stock Tokens их эмитентом сделала бы заблокированные акции недоступными. Решено в тот же день: конфигурацию LayerZero у адаптеров держит владелец, без задержки и без лимита на вывод, как это делает Paxos для USDG. Отвергнуто: конфигурация, замороженная после деплоя, и изменения с 48-часовым предварительным объявлением.

2026-09-28 — Официальный роутер остаётся изменяемым

Владелец может в любой момент сменить официальный своп-роутер, а хук распознаёт вайтлист антиснайпа через этот роутер. Принятое следствие: назначив другой роутер, владелец может освободить от антиснайпа кого угодно.

2026-09-28 — Комиссия за создание 0,001 ETH

Комиссия за создание становится равной 0,001 ETH и зашита в код, вместо примерно $3: без ценового фида и без настройки владельцем. Её стоимость в долларах теперь следует за ценой ETH. Настройка владельца с 2026-10-05, 0,001 ETH по умолчанию.

2026-09-28 — PoolManager вне записи владения

Токен не записывает PoolManager Uniswap: он участвует в каждом свопе, хранит токены всех пулов и никогда не получает аирдроп. Его история читается как ноль, а владение трейдера по-прежнему записывается. Измеренная экономия: около 24 000 газа на своп, при покупке и при продаже.

2026-09-29 — Никакой LP-комиссии в пулах StockFun

Пулы создаются с LP-комиссией Uniswap, равной нулю, вместо 0,30 %: налог хука — это вся стоимость сделки, 5 % в одну сторону и 9,75 % за цикл покупки и продажи без учёта влияния на цену. Принятая цена: казна, команда и создатель теряют свою долю LP-комиссий, а сжигание той части этих комиссий, которая собиралась в токене, исчезает. С 2026-10-05 LP-комиссия — настройка запуска, по умолчанию нулевая; каждый пул сохраняет комиссию, с которой был создан.

2026-10-01 — Исправления по итогам аудита безопасности от 2026-09-29

Внесены 2026-09-30 и 2026-10-01, после того как каждая находка была рассмотрена и для неё было выбрано исправление. У каждой исправленной находки есть регрессионные тесты, которые падают на коде, прошедшем аудит.

Добавлять ликвидность в пул StockFun может только лок ликвидности: сторонняя позиция торговала против облагаемых налогом свопов, не платя ни налога, ни антиснайпа. Новое разрешение хука изменило адрес хука, который был намайнен заново.

Во время сделки отправляется только доля казны. Доли команды и байбэка начисляются на хуке и выплачиваются через клеймы, которые может вызвать любой, на текущие кошельки фабрики; эскроу больше нет. Роутер и лок вносят входную сумму до свопа. До этого кошелёк для комиссий, который делал обратный вызов в Uniswap, мог остановить торговлю во всех пулах.

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

Каждый токен записывает во времени свой саплай вне PoolManager Uniswap — знаменатель пропорциональной доли аирдропа. Из трёх вариантов, описанных в аудите, этот обходится в одну дополнительную запись на своп; если бы PoolManager снова записывался, это обошлось бы примерно в 24 000 газа на своп. Принятое следствие: окна аирдропа начинаются и заканчиваются на границе часа.

На канале Robinhood отклонённая корзина больше не блокирует остальные рынки батча, один удалённый токен получает один идентификатор, частичное исполнение в v3 проваливает свой маршрут, удалённый хаб на паузе всё равно применяет смены ролей, а канонические записи выплачиваются в том порядке, в котором они пришли.

Измерено: покупка через роутер стоит 113 529 газа, а продажа — 137 250, против 125 862 и 150 416 раньше. Всё ещё открыты и ожидают решения владельца: ротация адаптера моста (M-2, а вместе с ней и L-8), аттестации Ondo (M-7) и роутеры, принимающие самих себя в качестве получателя (L-4). С 2026-10-05 M-7 и L-4 исправлены, а M-2 остаётся как есть по решению владельца, вместе с ней и L-8.

2026-10-01 — Пайплайн безопасности дорабатывает исправления

В тот же день второй раунд аудита, проведённый двумя независимыми аудиторами, доработал несколько исправлений. У каждого есть регрессионные тесты; ни одно не меняет ни проектного решения, ни неизменяемого параметра.

На Robinhood Chain маршрут v3 исполняется по одному пулу за раз, и каждый пул должен принять всю свою входную сумму: прежняя проверка видела только первый пул, а частичное исполнение дальше по маршруту оставляло промежуточный токен там, где его мог забрать любой. Канонический тикет учёта выплачивает самое большее столько записей, сколько добавил в очередь, сначала самые старые, поэтому скопившиеся записи больше не выводят его за пределы газа его автоматического исполнения; остальное выплачивает sweep.

Исполненное аварийное перемещение, которое опускает деньги волта ниже его резервов, обнуляет их все, в обоих волтах: то, что осталось, и каждое последующее поступление заново распределяются по весам. До этого обнуление существовало только при чтении, и старые резервы возвращались со следующим поступлением.

Кипер при каждой покупке удерживает n−1 единиц на последней акции корзины: остаток от округления достаётся этой акции, и пылевой перевод мог сорвать покупку. Он также уменьшает вдвое часть сжигания, которую пул $STOCKFUN не может исполнить целиком. Каждый токен записывает свою первую часовую отметку при деплое, что имело значение только при отсчёте времени, который начинается с часа 0, как в тестовой сети. Роутер акций на Ethereum выполняет sync перед оплатой в ETH, а Lens отклоняет пустую страницу.

Измерено: в отдельной транзакции первый своп токена в каждом часе стоит дополнительно примерно от 28 000 до 30 000 газа, а не около 23 000.

Ожидают решения владельца, не решены: аварийное перемещение денег, записанных на удалённом хабе, чьи записи затем выплачиваются из денег других рынков (R2H-1); денежный токен, который отказывает одному зеркальному волту, из-за чего останавливается каноническая очередь и не проходят батчи, в которые включён этот рынок (R2H-2); запас на последней акции на стороне контрактов, который меняет задокументированное правило аллокации (R2T-1); взимание налога на покупку в виде claims PoolManager, чтобы покупать мог любой роутер (R2F-1, option b); деплой волта $STOCKFUN самой фабрикой (R2F-2); и три информационных пункта (R2H-4, R2H-6, R2H-7). Акция, которую больше никогда нельзя будет купить, продолжает получать долю каждого поступления по своему весу: так задумано, потому что исключение звена изменило бы фиксированные веса корзины. С 2026-10-05 R2H-1 покрыта инструментами урегулирования расчётов из циклов аудита того дня вместе с процедурой — владелец ставит удалённый хаб на паузу перед перемещением; R2H-2 закрыта неблокирующими доставками четвёртого цикла; option b из R2F-1 отклонён, и налог взимается по-прежнему; а волт, который не принимает ETH, больше не останавливает свой рынок — ту остановку, которую описывала R2F-2: см. записи от 2026-10-05 ниже.

2026-10-02 — Каждый модуль становится апгрейдируемым

До этого ни один контракт протокола нельзя было апгрейдить. Теперь каждый модуль, кроме токенов и лока ликвидности, владелец StockFun может апгрейдить с немедленным вступлением в силу: без таймлока. Каждый из них — прокси с апгрейдом через UUPS, который спрашивает у своего источника прав на апгрейд, кто может его апгрейдить: у фабрики на Ethereum, у удалённого хаба на Robinhood Chain. Волты, в обеих сетях, — это по одному прокси на рынок, с апгрейдом рынок за рынком. Прокси хука намайнен со всеми 14 разрешениями v4, поэтому будущая имплементация может использовать любой колбэк, не меняя адреса.

Токены не несут собственной логики: это простой ERC-20 с фиксированным саплаем и одним сеттером, setRecorder, для владельца. Запись владения уходит из них в новый модуль — регистратор владения, который каждый токен вызывает при каждом переводе; если вызов не проходит, перевод тоже не проходит. С 2026-10-05 у токенов есть и функции спасения — для того, что отправлено на их собственный адрес, — а этот блокирующий вызов является единственным намеренным исключением из правила изоляции основателя (см. ниже).

Лок ликвидности по-прежнему нельзя апгрейдить, и он получает режим завершения: владелец объявляет его и через 30 дней может вывести всю ликвидность каждого пула, включая ликвидность $STOCKFUN, на любой адрес. Владелец может отменить завершение; торговля в течение этих 30 дней продолжается, а пока завершение ожидает исполнения, ни один новый рынок не может быть запущен. Режим существует на случай закрытия проекта; 30 дней — это срок предварительного объявления для холдеров. Деплоер зеркальных волтов на Robinhood Chain тоже нельзя апгрейдить: из его адреса выводится адрес каждого зеркального волта.

Что это меняет: апгрейд не ждёт 48 часов аварийного режима, который сохраняется; правила, которые эта документация называет фиксированными, — от границ волтов до сжигания и ставки 5 %, — действуют, пока владелец не апгрейдит модуль, который их содержит; фабрика деплоится первой, и владелец подключает к ней модули, что меняет порядок деплоя. Своп стоит примерно на 27 000 газа больше при изолированном измерении: покупка — 237 190 газа вместо 210 105, продажа — 285 031 вместо 258 278. Это цена прокси на его пути и вызова регистратора. С 2026-10-05 у аварийного режима тоже нет задержки, а границы волтов и ставка 5 % — настройки владельца.

2026-10-04 — Контракт аирдропа

Написан и протестирован, но не задеплоен. AirdropDistributor, апгрейдируемый модуль на Ethereum, привязанный к фабрике, распределяет акции каждого рынка ежедневными циклами. Окно цикла закрывается в 13:00 UTC, до открытия торгов в США круглый год; его покупки и отправки выполняются в течение следующей сессии. Цикл открывается первой отправкой или заранее и фиксирует свои цифры: регистратор владения, список исключений, действовавший на момент закрытия окна, и допустимое владение. Его питают два пути: sendToAirdrop на зеркальном волте, через адаптер LayerZero каждой акции, и на волте Ethereum для локального канала; больше ничто не зачисляет средства в цикл.

Решено в тот же день: никакой рассылки кипером, клеймит только сам холдер, за свой счёт (TBD 5); ни потолка на кошелёк, ни минимума, ни срока (TBD 7); список исключений для каждого токена, который задаёт владелец, не более 16 адресов, адрес сжигания всегда и контракт вестинга для $STOCKFUN (TBD 8). Отправка для окна без допустимого владения откладывается до первого окна, в котором оно есть, кто бы ни вызывал и когда бы это ни происходило, если в промежутке не меняется час цикла и не заменяется регистратор владения токена.

Принято и задокументировано: кипер выбирает, когда, поэтому отправка, поступившая после следующих 13:00 UTC, измеряется по окну следующего дня; перенос часа цикла заново нарезает ещё не открытые окна, включая те, которые отложенным акциям ещё предстоит проверить; регистратор владения токена апгрейдится на месте и никогда не заменяется на живом токене. Не входит в это изменение: правило 48 часов для застрявших средств, адаптеры акций, шаг аирдропа в кипере и экран клейма в dapp. С 2026-10-05 контракта вестинга, который нужно исключать, больше нет, правило 48 часов закрыто, а час цикла входит в расписание, которое задаёт владелец: длину окон и время их закрытия (setCycleSchedule); регистратор, назначенный на живом токене, начинает с саплая токена вне PoolManager (см. запись о цикле аудита ниже).

2026-10-05 — Никакой аллокации команде, немедленный аварийный режим, каждое число — настройка

Три решения, написанные в коде и протестированные в тот же день, не задеплоенные.

Аллокация команде уходит. Контракт вестинга команды, TeamVesting, удалён, и для команды не резервируется никаких $STOCKFUN: весь саплай, по умолчанию 1 000 000 000 токенов, идёт в одностороннюю заблокированную позицию — так же, как весь саплай рынка идёт в его две позиции. До этого 10 % шли в контракт вестинга на 12 месяцев, и аирдроп исключал этот контракт из циклов $STOCKFUN; теперь исключён только адрес сжигания, а с третьего цикла аудита того дня — ещё и оператор запуска (см. ниже).

Аварийный режим становится немедленным. emergencyTransfer перемещает актив из волта, хаба моста или контракта аирдропа на любой адрес, сразу; каждое перемещение получает порядковый номер и публичное событие. 48-часового графика от 2026-08-29 больше нет, вместе с его окном для отмены, и задержка не является параметром: аварийный режим срабатывает, как только владелец его применяет, и никогда не ждёт. Замена адаптера моста, changeAdapter, тоже немедленная, при тех же привязках. Правило для застрявших средств аирдропа, принятое 2026-09-27 и 2026-09-28 и так и не попавшее в код, закрыто: немедленное перемещение покрывает этот случай, на любом контракте, в любой момент.

Каждое число становится настройкой. Числа протокола теперь — ончейн-настройки владельца, в обеих сетях, а сегодняшние значения — значения по умолчанию: налог, его разбивка и антиснайп; комиссия за создание и ограничения длины строк нового рынка; форма новых рынков, включая LP-комиссию и шаг тиков, и доли того, что собирают заблокированные позиции; порог конвертации и ценовые границы волтов; расписание и лимиты аирдропа; интервалы актуальности оракулов; газ и проскальзывание моста. Каждая настройка вступает в силу сразу и отклоняет невозможные значения. Изменение налога применяется со следующего свопа в каждом пуле, включая пул, который ещё находится в блоках антиснайпа; изменение формы применяется к рынкам, созданным после этого, и каждый пул сохраняет LP-комиссию и шаг тиков, с которыми был создан.

Остаётся фиксированным: срок предварительного объявления режима завершения в 30 дней, END_DELAY, в локе, который нельзя апгрейдить; единицы и кодировки, от базисного пункта до часа записи владения; и связи между контрактами, от ценовых фидов до эндпоинтов моста, которые только апгрейд может направить на другой контракт.

Принятое следствие: цифры, которые эта документация приводит для налога, запуска, волтов и аирдропа, — значения по умолчанию, а не гарантии; владелец может изменить каждую из них в любой момент, без предварительного объявления. Измерено: чтение настроек налога обходится свопу примерно в 1 200 газа больше, с «тёплым» хранилищем. См. Модель доверия.

2026-10-05 — Исправления по итогам цикла аудита

В тот же день цикл ревью всего кода привёл к исправлениям в контрактах, у каждого из которых есть регрессионный тест; они не задеплоены. Четыре из них меняют поведение.

После аварийного перемещения расчёты урегулируются, и ничего никогда не выплачивается за счёт другого рынка. Контракт аирдропа и удалённый хаб держат активы, которые причитаются нескольким рынкам. После перемещения из любого из них выплаты, которые зависят от недостающего, ждут — клеймы этой акции в аирдропе, выплаты удалённого хаба на канале USDG, — пока активы не вернутся или владелец StockFun не спишет потерю с цикла или рынка, который её понёс; на каноническом канале владелец удаляет запись, деньги которой забрало перемещение, до того как придёт следующий депозит. Частичное списание с цикла возможно, только пока никто не заклеймил из него акцию, и тогда каждый холдер теряет одну и ту же долю; как только часть холдеров получила выплату, возможно только списание всего его остатка, который теряют холдеры, ещё не получившие выплату. Само перемещение остаётся немедленным и безусловным. См. Аварийный режим.

Через мост отправляет только кипер. До этого батч моста мог отправить кто угодно: третья сторона могла вклинить свой батч по самому слабому минимуму адаптера между двумя собственными сделками в пуле Curve или сорвать батч кипера, раньше него отправив через мост один из его волтов.

Заранее задеплоить зеркальный волт на Robinhood Chain могут только кипер и владелец StockFun. До этого это мог сделать кто угодно, даже для рынка, которого ещё не существовало, и волт оставался привязан к связям между контрактами того дня. Заранее задеплоенный волт теперь получает роутер акций и оракул удалённого хаба при своём первом батче.

Регистратор владения, назначенный на живом токене, начинает с саплая токена вне PoolManager, а регистратор, который уже записывал этот токен раньше, отказывается его принимать. До этого новый регистратор начинал с нуля: не проходила ни одна продажа, а доли аирдропа в циклах, открытых после этого, были сломаны навсегда. Теперь торговля продолжается, а холдеры, движений которых новый регистратор не видел, считаются ничего не державшими до своего следующего движения. Правилом остаётся апгрейд регистратора на месте.

Исправления поменьше: волты сверяют то, что фактически приходит, с собственным минимумом кипера, а не только со своей границей; тикет учёта канонического моста платит за размер батча; настройки отклоняют тик запуска, на котором не может открыться ни один пул, нулевое ограничение длины названия, а также хук и лок на разных PoolManager; переход на более длинные окна аирдропа больше не блокирует рынок с отложенными акциями. См. Модель доверия.

2026-10-05 — Второй проход цикла аудита

В тот же день второй цикл ревью исправлений привёл к новым исправлениям в контрактах — у каждого есть тест, ни одно не задеплоено — и к изменениям в кипере.

В расчётах учитывается то, что их обеспечивает, и никогда — баланс. Баланс контракта аирдропа, а также удалённого хаба на канале USDG, включает и токены, которые уже пришли, но ещё не зачислены: доставку, последний шаг которой ещё не выполнен. После аварийного перемещения такие токены могли снова открыть клеймы опустошённого цикла и выплатить их акциями другого рынка. Теперь оба контракта сами учитывают то, что обеспечивает их расчёты. Аварийное перемещение забирает в первую очередь из того, что обеспечивает расчёты; забранное сверх этого пришло из ещё не зачисленных токенов, и следующие доставки погашают его, прежде чем что-либо обеспечивать, причём удалённый хаб записывает эти батчи, а не доставляет их. Активы возвращаются через restore, которую может вызвать кто угодно; простой перевод ничего не обеспечивает, поэтому случайно попавшие токены выводят только для того, чтобы вернуть их через restore. См. Аварийный режим.

После списания всего остатка цикла, которое следует за клеймом, всё, что поступает в этот цикл потом, делится пропорционально между всеми его холдерами, как если бы списанной суммы там никогда не было; до этого оно доставалось сначала холдерам, ещё не получившим выплату, в том порядке, в котором они клеймили. Списание, после которого у рынка не остаётся отложенных акций, прекращает для него поиск окна.

Токен отказывается принимать регистратор владения, привязанный не к тому PoolManager Uniswap, в котором находится его пул: такой регистратор считал бы пул холдером, и каждому холдеру выплачивалась бы лишь часть его доли. А регистратор, назначенный на живом токене, держит учитываемый саплай не меньшим, чем сумма балансов холдеров, а не равным ей, пока каждый холдер не совершит движение.

На каноническом мосту комиссия котируется по базовой комиссии, которую указывает кипер, — вдвое выше последней, — а излишек возвращается: котировка, прочитанная без цены газа, видела нулевую базовую комиссию, и длинный батч не проходил. Удалённый хаб узнаёт кипера только из батча: до первого батча владелец StockFun заранее деплоит зеркальный волт первого рынка, а рынок, волт которого кипер не может задеплоить заранее, исключается из своего батча с оповещением. Кипер считает сбои волта на Ethereum и на Robinhood Chain по отдельности.

Из второго раунда от 2026-10-01: R2H-1 покрыта инструментами урегулирования расчётов вместе с процедурой — владелец ставит удалённый хаб на паузу перед перемещением; R2H-2 смягчена, но всё ещё открыта: замороженный зеркальный волт больше не останавливает каноническую очередь навсегда, и батч собирает только кипер, но доставка в этот волт по-прежнему срывается целиком, поэтому кипер должен исключать этот рынок из батча. См. Модель доверия. Закрыта в тот же день четвёртым проходом: см. ниже.

2026-10-05 — Один сбой никогда не блокирует остальное

Правило проектирования основателя, установленное в тот же день: когда что-то приводит к сбою одной функции, остальные функции не должны за это расплачиваться; всё должно продолжать работать, и у всего должен быть рычаг, чтобы вернуть потерянные средства и принять исправление. У него две части. Изоляция: сбой в одной функции, на одном рынке, в одной акции, цикле, записи или у одного получателя никогда не блокирует остальные; элемент пропускается, сохраняется как долг или переносится, с событием, а остальное продолжается. Рычаги: у каждого контракта, который может держать ETH или токены, даже мимоходом или по ошибке, есть рычаг, чтобы вывести застрявшее, и каждый модуль может принять исправление — апгрейд или сеттер, который его заменяет. Начиная с четвёртого цикла аудита, циклы считают любое нарушение дефектом.

Одно намеренное исключение: сообщение токена своему регистратору владения остаётся блокирующим — если сообщение не проходит, не проходит и перевод. Если бы сообщению было позволено не пройти, холдер мог бы оставить его без газа в собственном переводе, чтобы запись пропустила это перемещение, а его доля аирдропа выросла. Рычаг немедленный: setRecorder(0) на токене или апгрейд регистратора на месте, по одной транзакции каждый.

Принятые следствия: отклонённая доля ждёт своего получателя, вместо того чтобы останавливать остальное; аварийное перемещение, не отнесённое ни на один рынок, заставляет выплаты этого актива ждать, пока оно не будет урегулировано; а пока у токена нет регистратора, аирдроп не открывает для него ни одного цикла и держит его акции отложенными. См. Архитектура.

2026-10-05 — Третий проход цикла аудита

В тот же день — третий цикл, проведённый по последовательностям: операциям, корректным по отдельности, которые дают сбой при определённом порядке или тайминге. У каждого исправления есть тест, ни одно не задеплоено.

restore сначала возвращает то, что аварийное перемещение забрало сверх обеспечения расчётов, — на контракте аирдропа и на канале USDG удалённого хаба, — и обеспечивает расчёты остатком: возврат токенов ожидающей доставки больше не идёт на выплату опустошённому рынку. Акция, списанная с цикла целиком до того, как кто-либо её заклеймил, уходит из списка этого цикла.

Регистратор владения, назначенный на живом токене, начинает новую запись в момент переключения: аирдроп не измеряет ни одного окна, начавшегося до него, — акции такого окна ждут, отложенными, первого окна, которое он покрывает полностью, — а токен сообщает баланс адреса сжигания на момент переключения. До этого такое окно, измеряемое только с момента переключения, переплачивало тем, кто перемещал токены после него. Процедура: сначала открыть циклы уже закрытых окон, затем переключать сразу после окончания окна; правилом остаётся апгрейд регистратора на месте.

Скрипт запуска $STOCKFUN исключает оператора запуска из аирдропа, первый цикл которого до этого выплачивал ему долю за это владение. Скрипты моста останавливаются до деплоя, если фабрика уже указывает другой хаб, и сопоставляют акции до назначения хаба; setBridgeHub отклоняет хаб, который не может обслужить зарегистрированную корзину. Офчейн: транзакция, квитанцию которой не удаётся прочитать, отслеживается по её хешу и никогда не отправляется дважды; мониторинг аварийных событий читает свои события частями и подаёт одно оповещение, когда даёт сбой, и одно — когда восстанавливается; рынок, запись которого в батче нельзя собрать, исключается, с одним оповещением. В приложении неподтверждённая транзакция сохраняет свой хеш (с десятого цикла аудита её отслеживают до того, что смайнено с её nonce, и отмена в кошельке никогда не читается как выполненная: см. ниже), а пул, ликвидность которого вывел режим завершения, не показывает ни цены, ни торговли.

2026-10-05 — Четвёртый проход цикла аудита: правило в коде

В тот же день четвёртый цикл внёс правило основателя в код. У каждого исправления есть регрессионный тест, ни одно не задеплоено.

Доставки через мост никогда не блокируют другой рынок — решение владельца по R2H-2: доля, которую денежный токен отклоняет для зеркального волта, остаётся на удалённом хабе, причитаясь своему рынку, а остальные получают выплату; на каноническом канале она покидает очередь, так что записи за ней выплачиваются. Любой выплачивает её позже через sweep. Аварийное перемещение на удалённом хабе можно отнести на один рынок, чьи расчёты урегулируются в том же вызове. Клеймы выплачивают то, что могут: акция, которой не хватает в расчётах или перевод которой отклонён, переносится и остаётся к выплате, а claimMany пропускает цикл, который исключает вызывающего. Каждое звено покупки, каждая акция отправки в аирдроп и каждый рынок батча моста идут отдельно. Волт, который не принимает ETH, больше не останавливает свой рынок: хук сохраняет то, что не смог выплатить, как долг перед этим волтом, лок удерживает отклонённую долю сбора комиссий для её получателя, и любой может их выплатить; контракт создателя, который не может принять ETH, клеймит на другой адрес. Lens читает по одному волту за раз.

Рычаги повсюду: спасение того, что модуль держит по ошибке, — на каждом модуле, который ничего ни для кого не хранит, на хуке — только для случайных поступлений, на локе — никогда для удерживаемых им долей, на бёрнере — для его ETH, только когда никакое сжигание уже не могло бы его потратить, и на обоих токенах; волты, хабы и контракт аирдропа сохраняют аварийный режим.

Также: роутер Ondo обслуживает только волты своей фабрики (M-7), а каждый роутер отклоняет себя в качестве получателя (L-4); тикет депозита канонического канала оценивается по базовой комиссии; скрипт запуска $STOCKFUN вносит оператора в список до минта; проверка хранилища сверяет каждую структуру на всех уровнях вложенности. Решено в тот же день: M-2 и R2F-1 остаются как есть. См. Аварийный режим и Модель доверия.

2026-10-05 — Шаг аирдропа в кипере и экран клейма

Написаны в тот же день по просьбе основателя, без новых решений; не задеплоены. Кипер отправляет акции каждого рынка раз за окно, по умолчанию после сессии в США: сначала размещаются отложенные акции, затем открывается цикл, затем идёт отправка, каждая акция и каждый рынок отдельно, а каждая доставка с Robinhood Chain отслеживается, пока не будет зачислена, с оповещением, которое содержит команду для повторного запуска запоздавшей доставки. Экран клейма в dapp показывает, что кошелёк может заклеймить, окно за окном, и клеймит до десяти окон за транзакцию, около 3,4–3,5 млн газа по замерам «на холодную». Не вошло: автоматическое выполнение последнего шага не прошедшей доставки; вместо этого оповещение даёт команду.

Затем офчейн-проход четвёртого цикла дал киперу новые обязанности: выплату долгов, которые удерживают хук и лок, оповещения о не прошедших звеньях, рынках, которые раз за разом пропускаются, и отклонённых доставках, планирование звена каждой акции отдельно, файл состояния, сохраняющийся между перезапусками, и ежедневный сбор LP-комиссий. Приложение показывает «Figures unavailable» для волта, который не может ответить. См. Кипер и Dapp.

2026-10-05 — Пятый проход цикла аудита

В тот же день пятый цикл нашёл семь находок низкой серьёзности, каждая исправлена с тестом, ни одно исправление не задеплоено. Перемещение на удалённом хабе, отнесённое на каноническую запись, предназначено для записи, депозит которой уже пришёл: оно отклоняет сумму, превышающую деньги, не удерживаемые для отклонённых долей, а запись, депозит которой потерян, списывается. Акция, баланс которой нельзя прочитать, больше не останавливает отправку в аирдроп и её котировку, и адаптер без кода в котировке тоже. Контракты имплементации фабрики и удалённого хаба, которые хранят своего администратора в хранилище прокси, используют своего деплоера как рычаг для того, что отправлено им. Лок и оба токена получают функции спасения для claims v4 и NFT, отправленных им по ошибке; у лока по-прежнему нет общего вызова. Батч моста исключает рынок, у волта которого ещё нет кода. Комментарий, который неверно описывал, как покупка перемещает средства, исправлен. См. Аварийный режим.

2026-10-06 — Офчейн-проход пятого цикла

Проверка офчейн-кода в пятом цикле нашла три проблемы средней и шестнадцать низкой серьёзности, каждая исправлена в тот же день с тестом, не задеплоено. Теперь кипер придерживается ритма от 2026-09-27: ETH волта конвертируется раз за окно аирдропа, если волт держит порог на первом проходе кипера после закрытия окна; ниже порога ETH ждёт следующего окна. До того кипер конвертировал его на любом проходе сессии, как только волт держал порог. Каждая транзакция, которую отправляет кипер, записывается в его файл состояния вместе с nonce до того, как начинается ожидание квитанции, поэтому кипер, остановленный во время ожидания, не отправляет её повторно; транзакция, которую больше не знает ни одна нода, через заданный срок отпускается; одной папкой состояния одновременно пользуется только один кипер. На канале Ondo покупка, которую Ondo оценивает ниже границы волта, больше не отправляется, чтобы не пройти, и за неё не оплачивается аттестация. Акция, адаптер которой не отвечает, исключается из отправки в аирдроп сама по себе.

Корзина содержит не более пяти акций — техническая граница, которую владелец StockFun может изменить апгрейдом: все затраты, которые растут вместе с корзиной, измерены до этого размера, а три стартовые корзины содержат три, три и две акции. Lens содержит состояние каждого волта и то, что хук и лок ему должны, и его апгрейд выкатывается раньше Worker и приложения, которые его читают. Скрипт запуска $STOCKFUN возобновляет запуск, остановившийся до назначения рынка протокола, вместо минта второго токена. Приложение учитывает в казне волта причитающийся ему ETH, оставляет в клейме запас для акции, зачисленной до того, как он смайнен, запоминает акцию, которую отклонил её токен, и никогда не показывает как ноль цифру, которую не смогло прочитать. См. Кипер, Корзины и Dapp.

2026-10-06 — Шестой цикл аудита

Шестой цикл нашёл одну проблему высокой и пять низкой серьёзности, каждая исправлена в тот же день с тестом, не задеплоено. На каноническом мосту, который используется в тестнете и как запасной, кипер переставал повторно отправлять тикеты батча, как только его рынки были зачислены, а рынку могли зачислить деньги другого батча, так что депозит, пропустивший своё автоматическое исполнение, мог истечь. Теперь кипер следит за каждым тикетом, пока не узнает, что тот исполнен, независимо от зачисления его перевода, повторно отправляет ещё живой и подаёт оповещение, когда об исполнении тикета не известно через шесть часов по умолчанию или когда он потерян; канонический перевод он зачисляет только по собственным событиям удалённого хаба, никогда — по балансу.

Вместе с исправлениями пришло решение, принятое аудитом как рекомендованное по умолчанию: ритм от 2026-09-27 распространяется на USDC. USDC волта, потраченный на акции в Ethereum или отправленный через мост, уходит один раз после каждой конвертации его ETH и не чаще раза за окно в остальных случаях; до того несколько единиц USDC, отправленных на волт, заставляли кипера на каждом проходе отправлять транзакцию или целый батч моста. Покупки на Robinhood Chain по-прежнему выполняются на каждом проходе: баланс зеркального волта не отличает доставку от подарка, а лимиты каждой покупки намеренно распределяют крупную доставку на несколько проходов. Локальные и тестнетовые запуски отключают оба ритма одним переключателем.

Также исправлено: поиск отложенных акций, который ничего не разместил бы, для волта, которому нечего отправлять, больше не отправляется каждый день; волт ниже порога проверяется по балансу, прочитанному после закрытия окна; ранее в тот же день файл локального деплоя стал сверяться с блокчейном перед использованием; приложение помечает цену $STOCKFUN как «(last read)», пока Lens не может прочитать его казну, и воркер в это время не записывает для него цену. Следующий цикл аудита, начатый в тот же день, обнаружил, что кипер котировал все волты на одном роутере, хотя каждый волт хранит роутер, с которым был создан: теперь каждый волт котируется на своём. См. Кипер.

С седьмого цикла (см. ниже) «нечего отправлять» означает, что нет ничего, что стоило бы отправлять, а кипер читает каждый тикет, начиная с квитанции его создания.

2026-10-06 — Седьмой цикл аудита

Седьмой цикл нашёл одну проблему средней и четырнадцать низкой серьёзности, каждая исправлена в тот же день с тестом, не задеплоено; в контрактах находок не было. На каноническом мосту кипер читал, существует ли ещё тикет, раньше, чем квитанцию его создания: депозит, созданный между двумя чтениями или увиденный двумя нодами с разницей в блок, мог сойти за исполненный, пока он ещё был жив, и истечь без повторной отправки и без оповещения. Теперь кипер читает их в том порядке, в каком это делает Arbitrum SDK: сначала квитанцию, затем автоматическое исполнение, затем тикет на блоке не раньше его создания.

Вместе с исправлениями пришло одно решение, принятое аудитом как рекомендованное по умолчанию: кипер отправляет в аирдроп только то, что стоит того, во что обходится его отправка. Акция выше пыли, которую мост LayerZero не может перенести, оценённая собственным оракулом её волта по последнему ответу её ценового фида, должна стоить не меньше собственной комиссии LayerZero или своей доли газа отправки на Ethereum, а прошедшие акции вместе должны стоить не меньше всей отправки плюс открытия цикла окна, если он ещё не открыт; иначе они ждут в волте одного из следующих окон вместе с тем, что накопится. Стоимость, которую кипер не может прочитать, пропускает отправку, как и раньше. Множитель — настройка кипера, KEEPER_AIRDROP_MIN_VALUE_BPS: по умолчанию однократная стоимость, а 0 отключает правило. Оно решает только, когда уходит акция, но никогда — сколько, что или куда. До того подарок акции чуть выше пыли на волт рынка, которым никто не торгует, заставлял кипера каждый день открывать цикл этого окна и оплачивать сообщение LayerZero; а та же пыль считалась «чем-то для отправки», поэтому лимит на поиски отложенных акций из шестого цикла не действовал на канале через мост.

Также исправлено: каждый поиск по логам кипера останавливается на несколько блоков ниже последнего блока сети, поэтому событие никогда не теряется из-за ноды, отстающей на блок или два; кипер проверяет, что каждый RPC обслуживает сеть, указанную в его конфигурации, и иначе отказывается запускаться; у его вебхука оповещений есть ограничение по времени, а его ответ читается, и оповещение, которое вебхук не принял, сохраняется и отправляется снова; пустая настройка принимает своё значение по умолчанию. Worker данных приложения читает каждый апгрейдируемый контракт отдельно, поэтому контракт, который не работает после неудачного апгрейда, больше не обнуляет цифры токена $STOCKFUN; он показывает объём за 24 часа как неизвестный, пока его чтения логов сделок раз за разом не проходят, проверяет, что каждый из его эндпоинтов обслуживает его сеть, а график цены ставит каждую точку в её время. Lens и схема данных Worker не меняются. См. Кипер и Dapp.

С восьмого цикла (см. ниже) об акции, собственная котировка которой равна нулю, спрашивают её адаптер, открытие окна на локальном канале учитывается один раз, тикет читается на несколько блоков ниже последнего, а кипер больше не предполагает идентификатор сети, когда он не задан.

2026-10-06 — Защиты ценовых фидов на Robinhood Chain

План запуска перечислял две защиты, которых у оракула ещё не было, обе рекомендованные документацией Robinhood. Они построены, но не задеплоены, как настройки владельца StockFun, которые изначально выключены; каждая может только придержать цену, но никогда её не изменить.

  • Корпоративное действие. Пока акция проходит через него, её токен сообщает, что его оракул на паузе, а её ценовой фид держит своё последнее значение, которое может выглядеть свежим, пока множитель токена меняется. Теперь оракул придерживает цену этой акции: её звено покупки не проходит отдельно, её деньги сохраняются для неё, а остальные акции корзины покупаются. Проверка включена для каждой акции канала Robinhood, по каждой акции отдельно, чтобы токен, ответ которого нельзя использовать или флаг которого остаётся выставленным, можно было отключить отдельно. Токен, который не отвечает, считается не поставленным на паузу: Robinhood называет флаг рекомендательным, и главной защитой остаётся собственная проверка фида на устаревание.
  • Секвенсор. Robinhood Chain — сеть Arbitrum с единственным секвенсором. При заданном фиде аптайма секвенсора L2 от Chainlink оракул придерживает каждую цену, пока секвенсор не работает, восстановился в пределах льготного периода (по умолчанию час) или фид нельзя прочитать. Для Robinhood Chain такого фида нет, и Chainlink больше не добавляет их в новые сети: канал деплоится с выключенной проверкой, по явному выбору, которого требует скрипт деплоя, а владелец StockFun задаст фид, если он когда-нибудь будет опубликован.

На Ethereum обе остаются выключенными. См. Канал Robinhood.

2026-10-06 — Восьмой цикл аудита

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

Также исправлено: кипер следит за батчем моста, только когда блок, в котором он находится, ушёл на несколько блоков вглубь, поэтому реорганизация самых новых блоков Ethereum больше не может оставить его следить за идентификаторами, которые никогда не появятся; он отличает пыль, которую мост не может перенести, от акции, собственную комиссию LayerZero которой нельзя котировать, и теперь исключает такую акцию с оповещением, а не отбрасывает её молча; он хранит одно ожидающее оповещение на каждое отдельное оповещение, с тем, сколько раз и когда оно подавалось, поэтому оповещения, повторяющиеся в каждом цикле, больше не вытесняют разовое оповещение; он больше не откладывает в сторону файл состояния, записанный для другой сети, до того как проверит, какую сеть обслуживает его RPC, и требует оба идентификатора сети; он читает тикет на несколько блоков ниже последнего, на блоке, который есть у каждой ноды эндпоинта; а на локальном канале он учитывает открытие окна один раз. Кипер, его префлайт и его инспектор научились работать с защитами ценовых фидов: покупки на Robinhood Chain ждут, пока оракул придерживает цены из-за секвенсора, с одним оповещением, а акция в корпоративном действии ждёт отдельно и никогда не считается сбоем. Worker данных приложения никогда не сдвигает своё окно сделок назад, поэтому нода, отстающая на несколько блоков, больше не заставляет объём за 24 часа считать блоки дважды; его RPC-прокси отклоняет любой адрес, который адресом не является; он публикует, почему отсутствует цена акции (схема данных 8), что показывает приложение; а панель торговли берёт с кошелька из вайтлиста обычный налог во время окна антиснайпа, как это делает хук. Lens не меняется, а Worker и приложение по-прежнему можно деплоить в любом порядке. См. Кипер и Dapp.

2026-10-06 — Газ доставки аирдропа при Glamsterdam

Sepolia активировала апгрейд Ethereum Glamsterdam 2026-10-06, во время тестнетового запуска LayerZero (см. ниже); у Hoodi и мейннета даты ещё не было. Он переоценивает рост состояния: новый слот хранилища, записанный «на холодную», стоит 110 020 газа против 22 100 раньше. Каждая фиксированная цифра газа в контрактах и скриптах была заново измерена в Sepolia, и все они выдерживают, кроме одной пары — газа, который доставка аирдропа получает на Ethereum: отправка зеркального волта несла единственную цифру для compose, 600 000, а lzReceive OFT акции получал только газ, который этот OFT задаёт принудительно. Каждой доставке первого цикла этого запуска не хватило газа у исполнителя LayerZero, и её выполнили вручную. Позже десятый цикл аудита нашёл ещё две: собственный газ скриптов деплоя и газ compose моста для батча (см. ниже).

Решение основателя, в тот же день: кипер симулирует каждую доставку и выбирает её газ, ограниченный рамками, которые владелец StockFun задаёт на удалённом хабе; доставку, которая всё же застряла, кипер выполняет повторно, а о втором сбое подаётся оповещение. В коде, не задеплоено в мейннет:

  • Удалённый хаб хранит две политики газа, каждая — значение по умолчанию, нижний предел и потолок: газ lzReceive сверх того, что задаёт OFT акции, 650 000 в пределах от 200 000 до 1 500 000 (setAirdropReceiveGas), и газ compose, 1 250 000 в пределах от 600 000 до 4 000 000 (setAirdropComposeGas). sendToAirdrop(stocks, receiveGas, composeGas) зеркального волта отправляет то, что хаб предоставляет на запрос кипера, причём ноль означает значение по умолчанию; вызов с одними акциями берёт оба значения по умолчанию. Хаб, который апгрейдили с версии без политик, отклоняет каждую отправку, пока обе не заданы
  • Кипер симулирует lzReceive и compose каждой акции на Ethereum, от адреса эндпоинта, и запрашивает потребность плюс 25 %; когда симуляцию нельзя выполнить, он берёт то, что использовали последние доставки рынка, а затем значения хаба по умолчанию. Доставку, которая остаётся сохранённой на эндпоинте, после того как исполнитель LayerZero не смог её выполнить или через десять минут, кипер выполняет повторно со своего собственного ключа, с её симулированной потребностью плюс 25 %, по умолчанию не более 4 000 000 газа; о доставке, которую нельзя отправить, подаётся оповещение с командой, чтобы выполнить её вручную, а о втором сбое подаётся оповещение, и она больше никогда не отправляется
  • Приложение клеймит пять окон за транзакцию вместо десяти, оставляет 400 000 газа на каждую акцию, которую окно ещё может получить, и добавляло 150 000 газа к оценке каждой транзакции, что девятый цикл аудита заменил собственным лимитом каждой транзакции (см. ниже)

Исправление было применено к удалённому хабу и зеркальному волту тестнетового запуска апгрейдом и обеспечило его последующие циклы. См. Кипер и Канал Robinhood.

2026-10-06 — Тестнетовый запуск LayerZero

Протокол был задеплоен в Sepolia и в тестнете Robinhood Chain — продакшн-скриптами или тестнетовыми обёртками, сохраняющими их тело, — за 167 транзакций, все успешные, с тестовыми акциями, тестовыми адаптерами, тестовым USDG и мок-фидами, и работал с 13:50 до 19:07 UTC: семь часовых окон, ETH каждого из которых был сконвертирован, переправлен через LayerZero и потрачен на тестовые акции; шесть циклов аирдропа, отправленных обратно через LayerZero, первые четыре из которых пять холдеров заклеймили полностью, причём каждая выплата в точности равнялась доле, рассчитанной по регистратору владения; учебные инциденты, разыгранные на живых сообщениях и восстановленные так, как задокументировано, кроме двух половин. Он доказывает работу кода StockFun на реальных эндпоинтах, DVN и исполнителе LayerZero. Он не доказывает ни пару USDG от Paxos, ни акции Robinhood и их адаптеры, ни реальные фиды или ликвидность, ни газ, комиссии и финальность мейннета: пробный запуск в мейннете ещё предстоит. В продакшн-коде он обнаружил переоценку Glamsterdam (см. выше) и часть девятого цикла аудита (см. ниже). См. Канал Robinhood.

2026-10-06 — Девятый цикл аудита и шлюз верификатора

Девятый цикл проверил исправления восьмого и принял находки оператора тестнетового запуска LayerZero. Он нашёл две проблемы средней серьёзности — газ доставки аирдропа (см. выше) и Worker данных приложения, который перестраивал своё переключение между RPC при каждом вытеснении своего объекта Cloudflare и во время сбоя основного RPC отправлял ему 37 запросов меньше чем за семь минут, тогда как теперь уходит 8, — и проблемы низкой серьёзности в кипере, Worker и одном тестнетовом скрипте, каждая исправлена в тот же день с тестом. В течение минуты после одной из своих транзакций кипер читает то, что она изменила, и оценивает газ того, что отправляет следом, на блоке этой транзакции, поэтому нода, отстающая на блок, больше не превращает батч моста, отправленный сразу после конвертации, в ложный сбой; каждая его транзакция уходит с оценённым газом плюс 25 %; оповещения, которые он не смог доставить, уходят в том порядке, в каком они подавались в последний раз; о тикете, который удалило его собственное исполнение, больше не оповещают как о живом; время сети, которое не может вместить ни одна дата, читается как «an unknown time»; он декодирует ошибки оракула; а его префлайт работает на деплое тестнетового запуска. Worker записывает номер блока самой Robinhood Chain.

С этого цикла второй агент проверяет изменение каждого исправления перед его пушем — на классы дефектов, которые нашли прежние циклы, большинство из них в исправлениях предыдущего цикла: это шлюз верификатора. То, что он находит, исправляется как находка ревью, и это исправление снова проходит через шлюз. В этом цикле он нашёл дефекты низкой серьёзности в нескольких исправлениях, среди них повторное выполнение, которое верило событию-оповещению, которое может сгенерировать кто угодно, — теперь ему верят, только если оно исходит от исполнителя LayerZero, — и повторное выполнение, которое делало вывод о неудачном запуске на блоке самого этого запуска, что реорганизация блока могла бы превратить в ложный второй сбой: теперь оно ждёт, пока блок не уйдёт на несколько блоков вглубь. Все исправлены.

Затем ревью Worker и приложения в этом цикле нашло ещё одну проблему средней серьёзности — 150 000 газа сверх оценки транзакции, которых приложению не хватало, когда сделка встречает больше нового хранилища, чем отметка саплая часа, — исправленную в тот же день: теперь каждая транзакция получает свою оценку плюс 50 000 газа, а сделка — ещё и газ каждой записи, которую её оценка не может увидеть и которая всё ещё может произойти, прочитанной на блоке оценки; транзакция, оценка которой не проходит, уходит с фиксированным лимитом, а запуск рынка тогда ждёт. Две его находки низкой серьёзности тоже исправлены: сумма казны, которая является оценкой, помечается «+» везде, где отображается, а одобрение, которое не удалось прочитать, никогда не принимается за его отсутствие. Цикл не чистый, и счёт чистых циклов остаётся на нуле. См. Кипер и Dapp.

2026-10-06 — Десятый цикл аудита

Десятый цикл проверил исправления девятого и работу над апгрейдом Ethereum Glamsterdam, каждую область — под своим углом: контракты при новых ценах газа, каждое кросс-чейн сообщение, которое не проходит в пункте назначения, кипер на протяжении месяцев, приложение с реальными кошельками и документы в сравнении с кодом. Он нашёл три проблемы средней серьёзности и шесть низкой серьёзности, каждая исправлена в тот же день с тестом, каждое исправление проверено шлюзом верификатора, не задеплоено в мейннет. Под углом газа контракты оказались чистыми при обеих таблицах цен газа.

  • Процедура деплоя при Glamsterdam. Задокументированный деплой в Ethereum не мог пройти успешно: инструмент деплоя давал каждой транзакции газ своей собственной локальной симуляции, по старым ценам, тогда как создание контракта теперь требует в четыре-семь раз больше. Теперь каждая рассылка (broadcast) запрашивает у ноды газ каждой транзакции, когда предыдущая уже смайнена; опробовано в Sepolia
  • Газ compose батча моста. Последний шаг батча моста на Robinhood Chain получал одну фиксированную цифру газа, 1 200 000, что бы ни содержал батч: четырём новым рынкам по пять акций её не хватило, их USDG тогда остался на удалённом хабе без какой-либо записи, и каждый следующий батч с теми же рынками не проходил так же. Теперь газ — это база плюс доля на каждый рынок, по умолчанию 200 000 и 400 000, обе — настройки владельца StockFun, а батч несёт не более 17 рынков, что держит его сообщение в пределах лимита размера LayerZero, а его газ — в пределах лимита Robinhood Chain на транзакцию; кипер отправляет не больше и оставляет остальные до своего следующего прохода, первыми — рынки, которые ждут дольше всех. Дополнительный газ стоит немного: исполнитель LayerZero берёт за него по цене газа Robinhood Chain, 0,00001 ETH за миллион газа в тестнете. Оповещение кипера о застрявшем переводе теперь сообщает, где находится сообщение батча. Адаптер тестнета получил апгрейд в тот же день, и его следующий батч прошёл с новым газом
  • Мониторинг аварийных событий. Кипер указывал все отслеживаемые волты в одном запросе логов, который эндпоинт отклоняет сверх своего лимита: как только реестр перерос бы этот лимит, ни одно аварийное перемещение больше не было бы переслано. Теперь он указывает их группами, ограниченными новой настройкой
  • Более мелкие исправления. Тексты ошибок кипера сохраняют от адреса RPC только хост; его чтения каждого рынка идут через Multicall3, по сто рынков за вызов, а не по одному на каждом проходе; приложение отслеживает транзакцию, которую кошелёк отменяет или заменяет, никогда не показывая отмену как выполненную, и в течение минуты после своей транзакции читает на блоке не раньше блока этой транзакции, поэтому продажа сразу после её одобрения больше не отклоняется нодой, отстающей на блок; и два документа приведены в соответствие с кодом

При своём значении по умолчанию, с отправкой после сессии в США, кипер теперь снова читает волт, которому после закрытия сессии нечего отправлять, только на следующей сессии. Это следствие такой экономии, а не новое правило: акция, переданная волту после закрытия сессии помимо любой покупки, уходит с отправкой следующей сессии, в более позднее окно; то, что приносят собственные покупки волта, по-прежнему уходит в окно, закончившееся в тот день.

Аудит также взвесил рекомендацию, а не дефект: клеймы, которые оставляют по одному wei в каждом из начислений комиссий на хуке, чтобы следующая сделка никогда не платила за запись этих слотов хранилища с нуля. Сейчас она не принята. Дополнительный газ ложится на первую сделку после каждого клейма, около 104 000 на слот, и запас приложения на него поднимает лимит сделки, а не то, что она платит; изменение затронуло бы код клейма, формальные правила которого нельзя было бы снова доказать без запуска прувера; а хук и бёрнер могут принять его позже апгрейдом, без миграции. Цикл не чистый, и счёт чистых циклов остаётся на нуле. См. Кипер, Канал Robinhood и Dapp.