Деплой контракта в mainnet: чеклист перед публикацией

Пройдёшь чеклист перед mainnet-деплоем: тесты, testnet, права, газ, апгрейд и мониторинг.

Перед mainnet

Mainnet-деплой необратим для кода без заранее заложенного механизма апгрейда. Чеклист ниже — минимальный набор проверок, прежде чем слать state-init в прод.


Чеклист и скрипт деплоя

Обязательно до blueprint run на mainnet

  1. Sandbox — unit-тесты на все receivers, bounce-ветки, права owner.
  2. Testnet — тот же код и те же init-параметры (кроме секретов), прогнаны боевые сценарии с кошелька.
  3. Фиксация версий@tact-lang/compiler, @ton/blueprint, @ton/core в lockfile; сборка воспроизводима на CI.
  4. Права — кто owner / admin в init-данных? Не оставляй дефолтный адрес из туториала.
  5. Upgrade path — если код когда-либо меняется: set_code / proxy уже в первой версии (см. статьи про апгрейд и Proxy).
  6. Экономика — storage fee, min balance, gas на худший путь; value в деплое с запасом.
  7. Секреты — мнемоника только в локальном env / hardware wallet; не в git.
  8. Наблюдаемость — адрес, code hash, ссылка на эксплорер, алерт на баланс контракта.
typescript
// @ton/blueprint ^0.27.0 · @ton/core ^0.60.0
// scripts/deployCounterMainnet.ts
import { toNano } from "@ton/core";
import { Counter } from "../build/Counter/tact_Counter";
import { NetworkProvider } from "@ton/blueprint";

export async function run(provider: NetworkProvider) {
  // Явная страховка от случайного выбора testnet-скрипта на mainnet-кошельке
  if (provider.network() !== "mainnet") {
    throw new Error("This script is mainnet-only");
  }

  const owner = provider.sender().address;
  if (!owner) {
    throw new Error("Sender address is required");
  }

  const id = 1n; // фиксированный id для прод-инстанса — документируй в README
  const counter = provider.open(await Counter.fromInit(id, 0n));

  console.log("About to deploy:", counter.address.toString());
  console.log("Owner/sender:", owner.toString());

  await counter.send(
    provider.sender(),
    { value: toNano("0.1") },
    null,
  );

  await provider.waitForDeploy(counter.address);
  console.log("Deployed", counter.address.toString());
}
bash
# Только после пунктов чеклиста
npx blueprint run deployCounterMainnet
# В меню — mainnet + проверенный кошелёк

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

  • provider.network() !== "mainnet" — дешёвый предохранитель от деплоя не в ту сеть.
  • Фиксированный id даёт стабильный адрес; случайный id из туториала в проде обычно вреден.
  • toNano("0.1") — примерный запас на деплой простого контракта; сложные init-данные могут требовать больше.
  • Аудит имеет смысл для нетривиальной логики (деньги, jetton, апгрейд) — чеклист его не заменяет.

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

«На testnet работало» с другим owner / другими константами → в mainnet уезжает другая конфигурация; сравни init-данные побайтно.

Деплой с ноутбука без бэкапа seed → потеря контроля над admin-функциями равносильна потере контракта.

Нет плана на bounce и пустой баланс → контракт «живой», но не может отвечать; заложи min storage + мониторинг.


Что дальше

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