TreasuryVault
Один волт на рынок. Он получает 2 % с каждой сделки и превращает их в токенизированные акции, которые раздаются холдерам токена через аирдроп. Это самый тяжёлый контракт протокола и контракт с наименьшими полномочиями.
Чего у него нет
Нет withdraw. Нет transfer. Нет sweep. Нет владельца. Этих функций нет в текущей
имплементации, и любой может это проверить: вызов не проходит, потому что вызывать нечего.
С 2026-10-02 сам волт можно апгрейдить: см. ниже.
Цикл конвертации
- Накопление. ETH поступает вместе со сделками. Раз в 24 часа цикл запускается, если волт держит как минимум 0,1 ETH, когда кипер его проверяет, на своём первом проходе после закрытия окна аирдропа; при меньшей сумме в этот день ничего не срабатывает, даже если ETH пересечёт порог позже, — газ и проскальзывание съели бы операцию. Кипер придерживается этого с 2026-10-06; до того он конвертировал, как только волт держал порог.
- ETH → USDC на Uniswap v4 в Ethereum, с границей 50 базисных пунктов относительно фида ETH/USD. Пара глубокая, поэтому граница может быть узкой. Сумму указывает кипер, не менее порога и не более баланса, и граница рассчитывается по этой сумме.
- USDC → USDG через Curve, затем через OFT от Paxos на LayerZero.
- Покупка акций во вторичных пулах Robinhood Chain зеркальным волтом, с границей 200 базисных пунктов относительно независимого фида Chainlink, каждой акции — на деньги, зарезервированные для неё.
- Аирдроп. В том же ежедневном цикле кипер отправляет купленные акции в контракт аирдропа на Ethereum, где холдеры токена клеймят их пропорционально. С седьмого цикла аудита, 2026-10-06, он отправляет их, как только они стоят того, во что обходится их отправка; иначе они ждут в волте одного из следующих окон.
Волт измеряет, что он фактически получает, и отказывается, если результат ниже минимума кипера, который никогда не слабее границы (с 2026-10-05; до этого результат проверялся только по границе). Он не доверяет ни киперу, ни каналу, ни котируемой цене.
С 2026-10-05 каждое звено покупки исполняется отдельно, на обоих волтах, которые покупают
акции. Звено, которое не проходит, — маршрут, который откатывается, замороженная акция,
устаревший фид, результат ниже минимума, отклонённая котировка, а с 2026-10-06 на
Robinhood Chain — акция, токен которой ставит свой оракул на паузу для корпоративного
действия, — сохраняет свои деньги зарезервированными для своей акции и генерирует
LegFailed, а остальные звенья исполняются. Вызов не проходит, только когда не
исполняется ни одно звено, с причиной первого звена, как было бы с единственным звеном. До
этого одно непрошедшее звено срывало всю покупку. На Robinhood Chain, при заданной
проверке секвенсора оракула, секвенсор, который не работает или только что восстановился,
задерживает каждое звено (см. Канал Robinhood); эта проверка
выключена, пока Chainlink не опубликует фид аптайма для этой сети.
Порог и обе границы — это значения по умолчанию настроек владельца StockFun, с 2026-10-05; каждый волт читает их в реальном времени: волты на Ethereum — из фабрики, зеркальные волты для своих покупок — из удалённого хаба. Изменение применяется к следующей конвертации каждого волта.
Суммы и резервы
С 2026-10-01, после аудита безопасности от 2026-09-29:
- Каждый шаг расходует сумму, которую указывает кипер. Волт, который больше, чем его площадка может поглотить в пределах границы, конвертирует частями, за несколько циклов. Раньше каждый шаг расходовал весь баланс, и волт, переросший свою площадку, больше никогда не мог провести конвертацию.
- Граница шага ETH рассчитывается по этой сумме, а не по текущему балансу. ETH, который добавляют сделки, пока транзакция ждёт, больше не делает минимум кипера недействительным.
- Деньги резервируются акция за акцией. По мере поступления они откладываются для каждой акции корзины по весам корзины. Каждая акция расходует только свой резерв, а акция, которую кипер пропускает, сохраняет его на потом. Раньше доля пропущенной акции заново распределялась по всей корзине: пропуская акции, кипер мог переместить почти всю казну в одну акцию.
Так работают оба волта, которые покупают акции: зеркальный волт на Robinhood Chain, в USDG, и волт на Ethereum на локальном канале, в USDC.
В обоих, начиная с пайплайна безопасности от 2026-10-01, аварийное перемещение, которое опускает деньги ниже резервов, обнуляет их все: то, что осталось, и каждое последующее поступление заново распределяются по весам корзины. Аварийное перемещение, которое забирает только незарезервированные деньги или другой актив, их сохраняет. Раньше обнуление существовало только в том, как волт читал свои резервы: старые резервы возвращались со следующим поступлением, и порядок вызовов кипера определял состав корзины.
Роль кипера
Запуск, и ничего больше. Он выбирает момент, указывает сумму каждого шага, предлагает маршруты свопа и передаёт минимальные суммы — которые волт отклоняет, если они слабее его собственной границы оракула или если сумма превышает то, что зарезервировано для этой акции. Кипер может запросить больше, чем требует граница, но никогда меньше. С 2026-10-05 волт сверяет то, что фактически приходит, с минимумом кипера.
Кипер расходует резерв каждой акции полностью, кроме последней акции корзины, на которой он удерживает n−1 единиц, где n — число акций: см. Кипер.
На опциональном канале Ondo кипер передаёт волту подписанную эмитентом котировку для
каждого звена. Такая котировка действительна для любого, кто её предъявит, поэтому с
2026-10-05 роутер Ondo обслуживает только волты фабрики — волт протокола и волт каждого
зарегистрированного рынка — и отклоняет всех остальных (NotAVault): никто другой не может
израсходовать котировку кипера и сорвать эту конвертацию. Кроме того, каждый роутер
протокола отклоняет себя в качестве получателя свопа, поэтому между транзакциями он ничего
не держит.
Что бы кипер ни указал, он не может увести актив, выбрать другую корзину, перенести деньги одной акции на другую или ослабить границу.
Аирдроп
У акций волта одно назначение: холдеры токена, при каждом аирдропе, пропорционально их доле. Распределение следует из балансов по правилу, которое никто не выбирает, — ни создатель, ни кипер. Механизм написан в коде с 2026-10-04, без деплоя: см. Аирдроп.
На локальном канале волт сам передаёт свои акции. sendToAirdrop(stocks), только для
кипера, отправляет весь баланс каждой указанной акции корзины в контракт аирдропа, который
назначает фабрика и который волт читает в реальном времени. Волт одобряет точные суммы,
контракт забирает их и зачисляет в текущий цикл рынка, а одобрения снова закрываются до
возврата из вызова. Акция, указанная дважды или не входящая в корзину, приводит к отказу
вызова; акция без баланса пропускается. С 2026-10-05 каждая акция отправляется отдельно:
акция, баланс которой нельзя прочитать или перевод которой отклонён, например из-за
заморозки эмитентом, остаётся в волте с событием (AirdropSendFailed), а остальные
уходят; когда не уходит ни одна акция, вызов не проходит и сообщает причину. Волт,
подключённый к хабу моста, отклоняет этот вызов: его акции покупаются и хранятся на
Robinhood Chain, откуда зеркальный волт отправляет их тем же способом, через адаптер
LayerZero каждой акции.
Байбэк создателя, buybackAndBurn(...), который позволял создателю продавать акции казны,
чтобы выкупить и сжечь свой токен, был отменён 2026-09-27 и удалён из кода 2026-09-28.
Что может держать волт
ETH, USDC, USDG и акции своей корзины, а также, на опциональном канале Ondo, USDon, который может вернуть минт у эмитента. Больше волт ничего не покупает. Это следует из кода; ни один тест не проверяет это как инвариант, и ничто не мешает третьей стороне отправить на адрес волта посторонний токен. Аварийный режим выводит такой токен, как любой другой актив.
Волт, полный USDC, не сломан: он в пути. Все три состояния показываются как казна в ожидании следующего аирдропа; распределяются только акции, после того как они куплены.
Один прокси на рынок
С 2026-10-02 волт каждого рынка — это отдельный прокси. Он создаётся вместе с рынком, перед имплементацией волта, которую фабрика указывает в этот момент, и инициализируется в той же транзакции своей корзиной, своим рынком, а также роутером, оракулом и хабом моста, которые фабрика указывает на тот момент. Владелец StockFun апгрейдит волты по одному, рынок за рынком, с немедленным вступлением в силу. Новая имплементация, указанная в фабрике, применяется только к рынкам, созданным после этого.
Зеркальные волты на Robinhood Chain следуют тому же правилу: см. Канал Robinhood.
Аварийный режим
С 2026-08-29 владелец StockFun может переместить любой актив из волта на любой адрес; с 2026-10-05 перемещение происходит немедленно, без предварительного объявления. Наряду с аирдропом это единственный путь, которым текущая имплементация позволяет активам покинуть волт; подробно он описан в разделе Аварийный режим.