Модель доверия

Кто что может. Честный ответ, а не маркетинговый.

С 2026-10-02 почти каждый контракт протокола можно апгрейдить: владелец StockFun может заменить его код, с немедленным вступлением в силу. С 2026-10-05 числа протокола, от налога до цикла аирдропа, также являются ончейн-настройками владельца, тоже с немедленным вступлением в силу: цифры, которые приводит эта документация, — их значения по умолчанию; они перечислены ниже вместе с тем, что остаётся фиксированным. Каждое правило, которое эта документация приписывает модулю, — это правило его текущей имплементации. Вне полномочия на апгрейд: токены, лок ликвидности и, на Robinhood Chain, деплоер зеркальных волтов.

Чего не может никто

Эти пункты опираются на контракты, которые нельзя апгрейдить. Они остаются в силе, что бы владелец ни апгрейдил и ни настраивал.

  • Минтить новые токены. Саплай минтится один раз, в конструкторе, и токены нельзя апгрейдить
  • Переместить токены холдера без его разрешения. Сеттер токенов, setRecorder, не перемещает балансы, а их функции спасения, с 2026-10-05, перемещают только то, что было отправлено на собственный адрес токена
  • Изъять ликвидность пула без публичного объявления за 30 дней. Лок нельзя апгрейдить, его единственный выход — режим завершения, описанный ниже, а его 30 дней — константа, а не настройка. Его функции спасения, с 2026-10-05, не достают ни до позиций, ни до долей комиссий, которые он удерживает для их получателей
  • Изменить LP-комиссию или шаг тиков действующего пула. Каждый пул сохраняет те, с которыми был создан: они входят в его ключ, который хранит лок

Что исключает текущий код

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

  • Добавить ликвидность в пул StockFun. С 2026-10-01 это может только лок ликвидности
  • Заблокировать торговлю через кошелёк для комиссий или через волт. Во время сделки выплачивается только доля казны, и с 2026-10-05 волту, который её не принимает, эта сумма вместо этого причитается; остальные клеймятся позже
  • Изменить состав корзины после создания
  • Изменить ценовые фиды, которые читает существующий волт. Каждый фид записывается один раз, при инициализации оракула, и каждый волт сохраняет свой оракул; настройками являются интервалы актуальности (heartbeat) фидов, а с 2026-10-06 — и две защиты оракула на Robinhood Chain, которые могут только придержать цену, но никогда её не изменить
  • Отправить токены байбэка $STOCKFUN куда-либо, кроме сжигания
  • Выбрать, кто получит аирдроп, или заклеймить чужую долю. Распределение следует из записанного владения, пропорционально, и клеймит только сам холдер

Что может создатель

  • Получать строку создателя с каждой сделки на своём рынке, 2 % по умолчанию, и клеймить её, с 2026-10-05 — на другой адрес, если он того хочет (claimCreatorFeesTo)
  • Задавать вайтлист антиснайпа своего рынка, адреса из которого в первые блоки платят обычный налог: не более 20 адресов по умолчанию, зафиксированных в транзакции создания, публичных и неизменных в дальнейшем
  • Покупать и продавать собственный токен, как любой другой участник

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

Что может кипер

Запускать конвертации — в момент по своему выбору, суммами, которые он указывает, по маршрутам, которые он предлагает. Всегда в пределах границ оракула волта и резерва каждой акции и никогда не выбирая, кто что получит. С 2026-10-01 пропуск акции больше не меняет веса корзины: эта акция сохраняет свою долю на потом. С 2026-10-05 волт сверяет то, что фактически приходит, с минимумом, который указывает кипер. С 2026-10-06 кипер конвертирует ETH волта раз за окно аирдропа, как решено 2026-09-27: это собственное правило кипера, которое волт не обеспечивает; волт лишь записывает, когда его ETH конвертировался в последний раз.

С 2026-10-05 он также единственный, кто отправляет батч моста (bridgeReady), и, вместе с владельцем StockFun, единственный, кто заранее деплоит зеркальный волт рынка на Robinhood Chain (predeploy). До этого и то и другое мог делать кто угодно. Удалённый хаб узнаёт кипера из батча, поэтому до первого батча волт первого рынка заранее деплоит владелец StockFun, а рынок, волт которого кипер не может задеплоить заранее, исключается из своего батча.

В аирдропе, с 2026-10-04: открывать цикл рынка (openCycle), отправлять акции волта в контракт аирдропа (sendToAirdrop, оплачивая комиссии LayerZero с Robinhood Chain) и размещать отложенные акции (assignUnassigned). Он выбирает, когда, но никогда — сколько, что, куда или кому: сумма — это баланс волта, адресат — контракт, который назначает протокол, а распределение следует из владения. Открыть цикл или разместить отложенные акции может кто угодно, с одним и тем же результатом, кто бы ни вызывал. Отправка, поступившая после следующего времени закрытия, по умолчанию 13:00 UTC, измеряется по окну следующего дня. Его ежедневный шаг написан с 2026-10-05: см. Кипер. С седьмого цикла аудита, 2026-10-06, он отправляет акцию, только когда она стоит того, во что обходится её отправка, и это решает лишь, когда эта акция уходит: то, что ждёт, остаётся в волте до одного из следующих окон. С девятого, в тот же день, он также указывает газ, который каждая доставка получает на Ethereum и который удалённый хаб удерживает между нижним пределом и потолком, заданными владельцем StockFun, и со своего собственного ключа повторно выполняет доставку, застрявшую на эндпоинте LayerZero на Ethereum, что может сделать любой: ни то, ни другое не меняет того, что доставляется, и куда.

С 2026-10-05 он также в каждом цикле выплачивает то, что хук и лок удерживают для получателя, который это не принял (payTreasury, payOwed), и собирает LP-комиссии пула, созданного с такой комиссией (collectFees). Эти три вызова может сделать любой, и они платят только получателям, которых указывают контракты.

Его ключ — горячий ключ. Кипер никогда не выбирает, куда уходит актив.

Что может владелец StockFun

Именно здесь находится реальное доверие. Владелец StockFun — это владелец протокола: владелец фабрики на Ethereum, которого удалённый хаб отражает на Robinhood Chain.

  • Апгрейдить каждый модуль, кроме токенов, лока ликвидности и деплоера зеркальных волтов, с немедленным вступлением в силу и без предварительного объявления. Волты апгрейдятся по одному, рынок за рынком, в обеих сетях
  • Менять числа протокола, с немедленным вступлением в силу и без предварительного объявления: налог, его разбивку и антиснайп, комиссию за создание, форму новых рынков, порог конвертации и ценовые границы волтов, цикл аирдропа и остальные настройки, перечисленные ниже
  • Запустить режим завершения лока и через 30 дней вывести всю ликвидность каждого пула, включая ликвидность $STOCKFUN, на любой адрес
  • Назначать регистратор владения, которому каждый токен сообщает о своих переводах. Если сообщение не проходит, перевод не проходит: это единственное намеренное исключение из правила, согласно которому один сбой никогда не блокирует остальное (см. Архитектура), с двумя немедленными рычагами — setRecorder(0), который останавливает запись токена, и апгрейдом регистратора на месте. С 2026-10-05 токен отказывается принимать регистратор, привязанный не к тому PoolManager Uniswap, в котором находится его пул. Регистратор апгрейдят на месте, что сохраняет его историю, и не заменяют на живом токене: с 2026-10-05 заменяющий регистратор начинает с саплая токена вне PoolManager Uniswap, поэтому торговля продолжается, а аирдроп не измеряет ни одного окна, начавшегося до него; но холдеров, движений которых он не видел, он считает ничего не державшими до их следующего движения, так что окно, захватывающее этот период, выплачивает им меньше и никому не выплачивает больше. До 2026-10-05 из-за нового регистратора не проходила ни одна продажа, и он ломал доли аирдропа в циклах, открытых после этого
  • Регистрировать корзины, до того как они будут заморожены
  • Задавать однократно задаваемые адреса, один раз
  • Назначать кипера и кошельки для комиссий. Клейм платит кошельку, назначенному на момент клейма, поэтому смена также перенаправляет баланс команды или байбэка, по которому ещё не было клейма
  • Менять официальный своп-роутер, записанный в фабрике, — тот, через который хук распознаёт вайтлист антиснайпа
  • Направлять будущие волты на другой роутер акций или реестр оракула; существующие волты сохраняют свои
  • Сопоставлять каждую акцию корзины с её токеном на Robinhood Chain, только добавляя новые записи
  • Задавать список исключений аирдропа для каждого токена, для окон, которые закроются после этого (setExclusions); регистрировать OFT каждой акции на Ethereum (registerStockOft)
  • Назначать контракт аирдропа, в который отправляют волты (setAirdropDistributor); заменённый контракт сохраняет каждый свой цикл доступным для клейма там же. На Robinhood Chain — назначать маршрут аирдропа, контракт и газ каждой доставки (setAirdrop), а также адаптер каждой акции (setStockAdapter); с 2026-10-06 — задавать значение по умолчанию, нижний предел и потолок газа, который каждая доставка получает на Ethereum (setAirdropReceiveGas, setAirdropComposeGas)
  • Заменять адаптер моста для будущих отправок, немедленно (changeAdapter), на адаптер с точно такими же привязками: тот же хаб, фабрика, денежные токены, удалённый хаб и пункт назначения. Аудит безопасности от 2026-09-29 обнаружил, что удалённый хаб отклонял бы батчи нового адаптера (M-2); 2026-10-05 владелец решил оставить всё как есть, поэтому адаптер меняют апгрейдом на месте, по тому же адресу
  • Ставить на паузу конвертации и отправку через мост, немедленно. Удалённый хаб на паузе всё равно применяет смены ролей, которые несёт каждый батч. На контракте аирдропа пауза останавливает отправки, открытия циклов и размещение отложенных акций, но никогда не клейм
  • Перемещать любой актив из казны, хаба моста или контракта аирдропа на любой адрес, немедленно и без предварительного объявления (emergencyTransfer), в любой из сетей, в любой момент; на удалённом хабе, с 2026-10-05, также с отнесением на один рынок, чьи расчёты урегулируются в том же вызове (emergencyTransferFromPending, emergencyTransferRecord)
  • После такого перемещения из контракта аирдропа или удалённого хаба списывать потерю с цикла или рынка, который её понёс (writeDownCycle, writeDownUnassigned, writeOffPending, writeOffRecord, с 2026-10-05). Частичное списание с цикла возможно, только пока никто не заклеймил из него акцию, и тогда каждый холдер теряет одну и ту же долю; как только часть холдеров получила выплату, возможно только списание всего его остатка, который теряют холдеры, ещё не получившие выплату, а то, что поступает в цикл после этого, снова делится пропорционально между всеми его холдерами. Никакой другой рынок за потерю не платит; пока потеря не списана или активы не вернулись через restore, которую может вызвать кто угодно, выплаты недостающего ждут, а остальные продолжаются: клейм выплачивает другие акции. Оба контракта учитывают то, что обеспечивает их расчёты, и никогда — свой баланс: активы, которые находятся на пути к другому рынку, никогда не идут на покрытие потери, а простой перевод в эти контракты ничего не обеспечивает
  • Выводить то, что модуль держит по ошибке (rescue, с 2026-10-05): ETH или токены, отправленные в модуль, который ничего ни для кого не хранит; случайные поступления хука, но никогда — то, что он должен; то, что лок держит сверх удерживаемых им долей комиссий, но никогда — его позиции; ETH BuybackBurner — только когда никакое сжигание уже не могло бы его потратить; то, что было отправлено на собственный адрес токена. См. Аварийный режим
  • Менять конфигурацию LayerZero у адаптеров акций аирдропа, без предварительного объявления и без лимита на вывод

Апгрейд — самое широкое из этих полномочий: он разом затрагивает каждое правило из второго списка выше. Вместе с настройками, режимом завершения, аварийным перемещением и конфигурацией адаптеров акций он означает, что StockFun не является trustless и не претендует на это. Казну охраняет протокол, а путь восстановления контролирует владелец.

Настройки

С 2026-10-05 числа протокола — это ончейн-настройки владельца StockFun, в обеих сетях. Каждая вступает в силу в той транзакции, которая её задаёт, без предварительного объявления, генерирует событие и отклоняет невозможные значения: ставку выше 100 %, разбивку больше налога, форму запуска, которую пул не может вместить. Ниже — значения по умолчанию, те, что приводит эта документация.

Настройка По умолчанию Где задаётся
Налог на каждую сделку, покупки и продажи 5 % Хук, setTaxSettings
Его строки на запущенном рынке: казна, создатель, команда; байбэк получает остаток 2 %, 2 %, 0,5 %; байбэк 0,5 % Хук, setTaxSettings
Его строки на рынке $STOCKFUN: казна, команда; байбэк получает остаток 2 %, 2,5 %; байбэк 0,5 % Хук, setTaxSettings
Антиснайп: налог в открывающем блоке, снижение за блок, сколько блоков он длится 80 %, 8 пунктов, 10 блоков Хук, setTaxSettings
Наибольший вайтлист антиснайпа одного рынка 20 адресов Хук, setTaxSettings
Комиссия за создание, выплачиваемая на кошелёк команды 0,001 ETH Фабрика, setCreationFee
Ограничения длины для нового рынка: тикер, название, URI изображения, описание от 2 до 10, 48, 256, 512 байт Фабрика, setStringLimits
Форма новых рынков: саплай, диапазон 1, тики, шаг тиков, LP-комиссия 1 000 000 000 токенов, 700 000 000 в диапазоне 1, тики 195 000 / 171 960 / −887 220, шаг 60, без LP-комиссии Фабрика, setLaunchConfig
То, что собирают заблокированные позиции, сторона ETH: доли волта рынка и команды; создатель, или команда на $STOCKFUN, получает остаток 50 %, 25 %; создатель 25 % Фабрика, setLpFeeShares
Наименьшая сумма, которую конвертирует волт, и его ценовые границы относительно оракула на ETH → USDC и на покупке акции 0,1 ETH, 50 bps, 200 bps Фабрика, setConversionParams
Ценовая граница покупок зеркальных волтов 200 bps Удалённый хаб, setStockMaxSlippageBps
Интервалы актуальности (heartbeat) оракулов: ETH/USD, каждой акции 1 час и 1 день в скриптах деплоя Оракул каждой сети, setEthUsdHeartbeat, setHeartbeat
Проверка секвенсора: фид аптайма секвенсора L2 от Chainlink и льготный период после перезапуска, в течение которого оракул придерживает каждую цену (с 2026-10-06) Выключена: для Robinhood Chain такого фида нет, поэтому деплой проходит с выключенной проверкой; 3 600 секунд льготного периода, когда фид задан Оракул каждой сети, setSequencerUptimeFeed; выключена на Ethereum
Пауза оракула каждой акции: её цена придерживается, пока её токен сообщает, что его оракул на паузе из-за корпоративного действия (с 2026-10-06) Включена для каждой акции Robinhood Chain, выключена на Ethereum Оракул каждой сети, setOraclePauseCheck, по каждой акции
Окна аирдропа: длина, время закрытия 24 часа, 13:00 UTC Контракт аирдропа, setCycleSchedule
Лимиты аирдропа: наибольший список исключений, число окон, которые проверяет один вызов assignUnassigned 16, 30 Контракт аирдропа, setMaxExcluded, setMaxWindowsPerAssign
Эндпоинт LayerZero аирдропа и сеть-источник Как при деплое Контракт аирдропа, setLayerZero
Мост USDG: худший курс USDG за USDC на Curve и часть последнего шага батча на Robinhood Chain, нужная каждому батчу (до десятого цикла аудита — одна цифра на весь шаг, 1 200 000) 30 bps, 200 000 газа UsdgOftAdapter, setSettings
Батч моста USDG: газ, который каждый рынок батча добавляет к этому шагу, и наибольшее число рынков, которое несёт один батч, заданное размером сообщения LayerZero (с десятого цикла аудита; газ самого большого батча не превышает 24 000 000 при любых настройках) 400 000 газа, 17 рынков UsdgOftAdapter, setBatchGas
Канонический мост: газ двух его тикетов, стоимости подачи которых служат нижними пределами Как при деплое ArbitrumCanonicalAdapter, setTicketGas
Канонический мост: число байтов, по которому рассчитывается стоимость тикета депозита 1 024 ArbitrumCanonicalAdapter, setDepositCalldataLength
Записи, которые оплачивает один sweep на удалённом хабе 64 Удалённый хаб, setMaxRecordsPerSweep
Газ lzReceive каждой доставки аирдропа на Ethereum сверх того, что задаёт OFT акции: значение по умолчанию, нижний предел и потолок того, что запрашивает кипер (с 2026-10-06) 650 000, 200 000, 1 500 000 Удалённый хаб, setAirdropReceiveGas
Газ compose каждой доставки аирдропа на контракте аирдропа: значение по умолчанию, нижний предел и потолок (одна цифра, 600 000, до 2026-10-06) 1 250 000, 600 000, 4 000 000 Удалённый хаб, setAirdropComposeGas; значение по умолчанию — также через setAirdrop
  • Каждый пул, со следующего свопа. Изменение налога или антиснайпа применяется со следующего свопа в каждом пуле, включая пул, который ещё находится в блоках антиснайпа: убывание рассчитывается по действующим настройкам, от блока запуска пула. Антиснайп никогда не берёт меньше налога. Лимит вайтлиста применяется при создании рынка
  • Только новые рынки, для их формы. Новый саплай, новые диапазоны, новый шаг тиков или новая LP-комиссия применяются к рынкам, созданным после этого. Каждый пул сохраняет LP-комиссию и шаг тиков, с которыми был создан, и Lens отдаёт их, рынок за рынком; пул $STOCKFUN получает те, что действуют на момент его запуска
  • Вживую, для волтов. Каждый волт читает порог конвертации и свои ценовые границы при каждой конвертации, а лок читает доли LP-комиссий при каждом сборе
  • Открытые циклы сохраняют своё окно. Новое расписание аирдропа применяется к окнам, которые ещё не открыты, и перекраивает их, включая те, которые ещё предстоит проверить для отложенных акций

Что остаётся фиксированным:

  • Предварительное объявление режима завершения за 30 дней, END_DELAY, — константа лока ликвидности, который нельзя апгрейдить
  • Немедленность аварийного перемещения: у него нет задержки, и никакая настройка не может её добавить
  • Единицы и кодировки: базисный пункт, час как единица записи владения и окон аирдропа, адрес сжигания, форматы сообщений
  • Связи между контрактами: ценовые фиды, пулы, на которых покупает роутер акций на Ethereum, OFT USDG, эндпоинты LayerZero моста, удалённый хаб, пул Curve. Они фиксируются при деплое или записываются один раз; чтобы изменить что-то из этого, нужно указать другой контракт, а это требует апгрейда

Апгрейды

С 2026-10-02 каждый модуль — это прокси с апгрейдом через UUPS, кроме контрактов, перечисленных ниже. Как это устроено: см. Архитектура.

Сеть Кто выполняет апгрейд Модули
Ethereum Владелец фабрики: каждый модуль спрашивает у фабрики, кто её владелец Сама фабрика, хук, регистратор владения, каждый TreasuryVault, оракул, роутеры акций, официальный своп-роутер, BuybackBurner, Lens, хаб моста и его адаптеры, контракт аирдропа
Robinhood Chain Администратор аварийного режима удалённого хаба: владелец в Ethereum, каким его передал последний батч моста, а до первого батча — начальный администратор, назначенный при деплое Сам удалённый хаб, каждый зеркальный волт, роутер акций, оракул
  • Немедленно. Апгрейд вступает в силу в той транзакции, которая его выполняет: без таймлока, без предварительного объявления, как и настройки и аварийное перемещение
  • С проверкой. Апгрейдить может только владелец протокола. Новая имплементация должна подчиняться тому же источнику прав на апгрейд, а имплементации хука и регистратора владения должны сохранять тот же PoolManager
  • Рынок за рынком. Каждый волт — отдельный прокси. Новая имплементация волта, указанная в фабрике, применяется к рынкам, созданным после этого; существующие волты апгрейдятся по одному
  • Хранилище дополняется, но не переупорядочивается. Раскладка хранилища каждого модуля записана, и скрипт проверяет её перед каждым апгрейдом, с 2026-10-05 — на всех уровнях вложенности каждой структуры

Апгрейдить нельзя:

  • Токены — токены рынков и $STOCKFUN: простые ERC-20, саплай которых минтится один раз, без минта, сжигания, паузы или блэклиста. Их единственный сеттер, setRecorder, и их функции спасения принадлежат владельцу протокола
  • Лок ликвидности, код которого и удерживает ликвидность в пулах. Его единственный выход для ликвидности — режим завершения; его функции спасения не достают ни до позиций, ни до удерживаемых им долей
  • Деплоер зеркальных волтов на Robinhood Chain: адрес каждого зеркального волта выводится из его собственного адреса

Два деплоера на Ethereum, которые не хранят состояния, заменяются через фабрику, а не апгрейдятся.

Режим завершения

Единственный выход из лока ликвидности, добавленный 2026-10-02 на случай закрытия проекта. Владелец StockFun вызывает end(). С этого момента ни один новый рынок не может быть запущен, а торговля во всех пулах продолжается. Через тридцать дней владелец может вывести всю ликвидность каждого пула на любой адрес. Пока завершение ожидает исполнения, владелец может в любой момент его отменить; пулы, из которых ликвидность уже выведена, остаются пустыми. 30 дней — это срок предварительного объявления для холдеров. Подробнее — в разделе Запуск с двумя позициями.

Внешние зависимости

Зависимость Что она может сломать
Paxos / USDG Может поставить на паузу или заморозить. Денежное звено канала останавливается. С 2026-10-05 заморозка одного зеркального волта останавливает только доставки в этот волт: его доля ждёт на удалённом хабе, причитаясь его рынку, а остальные рынки получают выплату (R2H-2, закрыта)
LayerZero Потерянное сообщение оставляет средства в пути до повторной отправки или восстановления. С 2026-09-28 от него также зависит сохранность обёрнутых акций аирдропа
Robinhood Chain Молодая сеть. Сбой замораживает акции, которые там находятся. С 2026-10-06 оракул может также придерживать каждую цену, пока фид аптайма секвенсора от Chainlink сообщает, что секвенсор не работает или только что восстановился; эта проверка выключена, пока Chainlink не опубликует такой фид для Robinhood Chain, чего он не сделал
Фиды Chainlink Устаревший фид блокирует конвертацию, которой он нужен; с 2026-10-05, для акции, — только звено этой акции. С 2026-10-06 то же делает корпоративное действие: пока токен акции сообщает, что его оракул на паузе, фид держит своё последнее значение, а оракул придерживает цену этой акции, поэтому её звено ждёт, её деньги сохраняются для неё, а остальные покупают. Это задуманное поведение
Вторичная ликвидность Если пулы слишком тонкие, кипер покупает меньшими частями, а ценовая граница, 200 bps по умолчанию, отклоняет то, что всё равно не может исполниться

Ни одна из этих зависимостей не скрыта, и ни одна не может переместить актив из волта на какой-либо адрес.

Принятые риски

  • Апгрейд, изменение настройки и аварийное перемещение вступают в силу сразу: холдеры не получают о них предварительного объявления, в отличие от режима завершения, объявляемого за 30 дней
  • Каждый перевод токена зависит от регистратора владения: если сообщение не проходит, перевод тоже не проходит. Это единственное намеренное исключение из правила, согласно которому один сбой никогда не блокирует остальное: если бы сообщению было позволено не пройти, холдер мог бы обойти запись и увеличить свою долю аирдропа. Его рычаги немедленные: setRecorder(0) на токене или апгрейд регистратора на месте
  • Доля, которую получатель не принимает, ждёт этого получателя — на хуке, в локе, на удалённом хабе или в контракте аирдропа, — вместо того чтобы останавливать остальное; а аварийное перемещение, не отнесённое ни на один рынок, заставляет выплаты этого актива ждать, пока оно не будет урегулировано
  • Ни одна казна не накапливается: всё распределяется, и аирдроп может быть нулевым, если никто не торгует
  • Аирдроп выплачивается обёрнутыми акциями на Ethereum: их ценность держится только на акциях, заблокированных на Robinhood Chain, и на конфигурации LayerZero, а заморозка Stock Tokens их эмитентом сделала бы заблокированные акции недоступными
  • Рынок может никогда не исчерпать свой первый диапазон ликвидности
  • Цикл покупки и продажи обходится в 9,75 % без учёта движения цены, при налоге 5 % по умолчанию
  • На момент написания этой документации кросс-чейн канал не проверялся в реальных условиях