TON Connect в чистом JS без React Подключишь кошелёк и отправишь транзакцию через @tonconnect/ui или headless @tonconnect/sdk без React.
Перед использованием кода на mainnet протестируйте его на testnet. Проверьте точные версии зависимостей (Tact, FunC, tonweb и др.). Перед продакшн-использованием проведите аудит смарт-контрактов и платёжных интеграций.
Без React: два пакета
Если нет React — не тащи @tonconnect/ui-react.
Пакет Когда @tonconnect/ui ^3.0.0Нужна готовая модалка и кнопка Connect @tonconnect/sdk ^4.0.0Свой UI с нуля или серверный/скрипт-коннектор
Манифест на HTTPS обязателен в обоих случаях.
Вариант с UI (@tonconnect/ui)
html
Копировать<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8" />
<title>TON Connect vanilla</title>
</head>
<body>
<div id="connect-button"></div>
<button id="pay" type="button">Отправить 0.01 Gram</button>
<pre id="log"></pre>
<script type="module">
// @tonconnect/ui ^3.0.0
import { TonConnectUI } from "https://esm.sh/@tonconnect/ui@3.0.0";
const log = (m) => {
document.getElementById("log").textContent += m + "\n";
};
const tonConnectUI = new TonConnectUI({
manifestUrl:
"https://raw.githubusercontent.com/ton-connect/demo-dapp-with-react-ui/master/public/tonconnect-manifest.json",
buttonRootId: "connect-button",
});
tonConnectUI.onStatusChange((wallet) => {
log(wallet ? `connected: ${wallet.account.address}` : "disconnected");
});
document.getElementById("pay").onclick = async () => {
if (!tonConnectUI.connected) {
await tonConnectUI.openModal();
return;
}
try {
const result = await tonConnectUI.sendTransaction({
validUntil: Math.floor(Date.now() / 1000) + 300,
network: "-239",
messages: [
{
address:
"EQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2N",
amount: "10000000",
},
],
});
log("boc: " + result.boc);
} catch (e) {
log("rejected or failed: " + (e?.message ?? String(e)));
}
};
</script>
</body>
</html>
Установка в бандлере:
bash
Копироватьnpm i @tonconnect/ui@^3.0.0
Headless SDK (кратко)
typescript
Копировать// @tonconnect/sdk ^4.0.0
import { TonConnect } from "@tonconnect/sdk" ;
const connector = new TonConnect ({
manifestUrl: "https://app.example.com/tonconnect-manifest.json" ,
});
await connector. restoreConnection ();
// дальше — свой UI списка кошельков + connector.connect(...)
Headless подходит, когда рисуешь пикер кошельков сам. Для большинства сайтов и лендингов достаточно @tonconnect/ui.
Как это работает
buttonRootId — SDK монтирует кнопку Connect в указанный DOM-узел.
onStatusChange — тот же контракт, что в React-хуках.
sendTransaction / отказ пользователя — идентичны React-обёртке; лови исключения.
Частые ошибки
Подключаешь @tonconnect/ui-react в Vue/Svelte «просто так» → лишний runtime и боль с peer deps. Бери @tonconnect/ui.
Манифест с file:// или без CORS → кнопка есть, connect не завершается. Нужен HTTPS + доступ кошелька к JSON.
Не вызываешь restoreConnection() в headless → после F5 сессия «пропадает», хотя storage ещё жив.
Что дальше
НазадОтключение сессии и повторное подключение Далее Манифест приложения (tonconnect-manifest.json) Материалы gramdocs.tech носят образовательный характер и не являются финансовой, юридической или инвестиционной рекомендацией. Работа с блокчейном TON и токеном Gram связана с рисками потери средств. Правовая информация
На этой странице