Аудит-чеклист перед деплоем в mainnet

Пройдёшь security-чеклист: роли, sender, bounce, replay, тесты и секреты — до отправки state-init в mainnet.

Чеклист безопасности

Деплой в mainnet фиксирует код и init-данные. Этот список — security-срез: не замена полного аудита, а минимум, без которого не стоит слать state-init. Рядом по смыслу — чеклист деплоя в разделе контрактов; здесь акцент на уязвимостях.


Пункты и автоматизация в CI

Обязательные проверки

  1. Роли — каждый admin/upgrade/withdraw/pause закрыт sender() == …; нет «забытого» opcode.
  2. Sender trust — все входящие от jetton-wallet / oracle / nft-item сверяют адрес, не только opcode.
  3. Replay — external с подписью имеют seqno/nonce; инкремент до эффекта.
  4. Bounce — оптимистичные списания имеют bounced с компенсацией; поля влезают в 224 бит.
  5. Числа — границы сумм, coins, нет записи в узкий слот без throw_unless.
  6. Init — owner/oracle/коды не из туториала; mainnet-адреса осознанны.
  7. Тесты — sandbox: happy path, чужой sender, replay, bounce, нехватка газа/value.
  8. Секреты — ключи деплоя не в git; см. статью про backend-ключи.
  9. Наблюдаемость — code hash, адрес, алерт на баланс и неожиданные outgoing.
typescript
// @ton/sandbox ^0.29.0 · @ton/test-utils ^0.6.0
// Минимальный security-smoke в Jest (фрагмент)

it("rejects withdraw from non-owner", async () => {
  const result = await vault.sendWithdraw(attacker.getSender(), {
    value: toNano("0.1"),
    amount: toNano("1"),
  });
  expect(result.transactions).toHaveTransaction({
    from: attacker.address,
    to: vault.address,
    success: false,
  });
});

it("rejects PriceUpdate from fake oracle", async () => {
  const result = await consumer.sendPriceUpdate(stranger.getSender(), {
    value: toNano("0.05"),
    price: 42n,
  });
  expect(result.transactions).toHaveTransaction({
    from: stranger.address,
    to: consumer.address,
    success: false,
  });
});

Как это работает

  • Чеклист проходят по коду и по тестам: галочка «проверил глазами» без failing-теста на чужой sender почти бесполезна.
  • Отдельно гоняй testnet с теми же init-параметрами (кроме секретов), что mainnet.
  • Для нетривиальной экономики (DEX, vault, bridge) чеклиста мало — нужен внешний аудит и bug bounty-план.
  • Фиксируй версии компилятора в lockfile; воспроизводимая сборка — часть security.

Частые ошибки

Пропускаешь bounce-тесты «потому что на testnet не стреляло» → в mainnet контрпартия другая.

Считаешь deploy-чеклист достаточным → деплой про газ и процесс; этот список — про злоупотребления.

Оставляешь debug-метод drain / свободный setCode «на всякий» → вырежи до mainnet или закрой мультисигом.


Что дальше

Материалы gramdocs.tech носят образовательный характер и не являются финансовой, юридической или инвестиционной рекомендацией. Работа с блокчейном TON и токеном Gram связана с рисками потери средств. Правовая информация