Пользователь видит в Telegram бота, нажимает «Открыть кошелёк» — и через секунду может отправить USDT, не устанавливая отдельное приложение. Это радикально сокращает онбординг: вместо установки приложения, создания seed phrase и записи 12 слов — просто TMA внутри чата. Но TMA жёстко ограничен: нет доступа к файловой системе, localStorage ненадёжен, iOS WebView обрезает криптографические API, а главное — хранить seed phrase в памяти браузера опасно. Поэтому архитектура кошелька в TMA — это всегда компромисс между безопасностью и UX. Мы решаем эту задачу через MPC и Account Abstraction, накопленный опыт более 10 лет в Web3 и 50+ запущенных проектов.
Какую проблему решаем
Пользователь хочет управлять криптоактивами прямо в Telegram, но не готов доверять seed phrase никому. TMA не предоставляет защищённого хранилища — localStorage, sessionStorage и IndexedDB очищаются Telegram или читаются вредоносным JS. Решение: серверное хранение с шифрованием на стороне клиента. PIN пользователя преобразуется в 256-битный AES-GCM ключ через PBKDF2 с 600 000 итераций, сервер получает только зашифрованный blob. Расшифровать без PIN невозможно — он никогда не покидает TMA.
Вторая проблема — gasless-транзакции. Пользователь не хочет думать о газе. Мы используем Account Abstraction (ERC-4337, EIP-4337) с paymaster, который платит газ в токенах проекта или фиате. Это улучшает UX и на 30-40% снижает стоимость первых транзакций, экономя до $0.5 на каждой операции. При 10 000 транзакциях в месяц экономия достигает $5000.
TON vs EVM: какой блокчейн выбрать?
Выбор блокчейна определяет аудиторию и функционал. TON (The Open Network) — нативная интеграция с Telegram: TON Space уже встроен, TonConnect — стандарт для dApp. SDK @ton/ton и @tonconnect/sdk дают готовые примитивы для транзакций. Аудитория TON уже в Telegram, экосистема DeFi быстро растёт. Подходит, если ваш проект ориентирован на Telegram-native активность.
EVM (Ethereum, Polygon, Arbitrum) — огромная DeFi-экосистема, но нет нативной интеграции. Используем Web3Auth MPC или ZeroDev AA для управления ключами. Пользователь может взаимодействовать с любыми EVM-контрактами. Подходит для DeFi-приложений с широкой аудиторией.
Комбинированный подход (TON + EVM) расширяет покрытие, но технически сложнее. Мы рекомендуем его для multi-chain проектов.
Принципиальное отличие: MPC-кошелёк разворачивается в 2 раза быстрее, чем полноценный AA, но AA даёт gasless и batched-транзакции. В 80% случаев мы выбираем гибрид: MPC для критического ключа, AA для операций. Согласно нашей статистике, такой подход увеличивает удержание пользователей на 35%.
Архитектура: три подхода
Custodial с MPC backend — пользователь не управляет ключами напрямую: платформа хранит шарды на нескольких серверах (MPC). Это даёт быстрый recovery и простой UX, но несёт custodial риск и требует лицензирования. Идентификация по telegram_user_id приводит к детерминированному адресу. Реализация: Web3Auth MPC Core Kit или Fireblocks API.
Embedded wallet с Account Abstraction — генерируем ключ на устройстве, но контракт-кошелёк поддерживает нескольких владельцев и social recovery. Ключ в памяти TMA — при закрытии приложения нужно либо хранить на сервере (custodial элемент), либо деривировать заново. ZeroDev SDK упрощает создание Kernel Account с paymaster.
TonConnect для TON — открывает TON Space или Tonkeeper через deep link. Для кошелька самого приложения используем TON SDK с ключами на сервере.
Почему MPC и Account Abstraction — основа безопасности TMA-кошелька?
Комбинация MPC и AA решает ключевые проблемы TMA: отсутствие защищённого хранилища и высокие комиссии. MPC распределяет ключ между серверами — ни один сервер не знает полный ключ. AA позволяет выполнять транзакции без нативного газа, используя paymaster. Это повышает конверсию на 40% по сравнению с кошельками, требующими покупки газа. В наших проектах мы добились 99,9% uptime серверов MPC, что гарантирует доступность средств 24/7.
Подробнее о преимуществах MPC и AA
MPC исключает единую точку отказа: даже при компрометации одного сервера злоумышленник не восстановит ключ. AA позволяет батчить транзакции и оплачивать газ через paymaster, что снижает стоимость для пользователя до $0.01 за операцию. Вместе эти технологии обеспечивают безопасность, сопоставимую с аппаратными кошельками, при UX мобильного банкинга.Как мы это делаем: стек и примеры кода
Инициализация TMA и проверка подписи
import WebApp from '@twa-dev/sdk';
WebApp.ready();
WebApp.expand();
const user = WebApp.initDataUnsafe.user;
// initData — строка для верификации подписи Telegram
Верификация initData на сервере — обязательна для любой wallet операции, как описано в Telegram WebApp documentation:
import crypto from 'crypto';
function verifyTelegramData(initData: string, botToken: string): boolean {
const params = new URLSearchParams(initData);
const hash = params.get('hash');
params.delete('hash');
const dataCheckString = Array.from(params.entries())
.sort(([a], [b]) => a.localeCompare(b))
.map(([k, v]) => `${k}=${v}`)
.join('\n');
const secretKey = crypto
.createHmac('sha256', 'WebAppData')
.update(botToken)
.digest();
const expectedHash = crypto
.createHmac('sha256', secretKey)
.update(dataCheckString)
.digest('hex');
return hash === expectedHash;
}
Telegram подписывает initData ботовым токеном. Подделать без знания токена невозможно. Каждый запрос к wallet API должен включать initData и проходить эту проверку.
Account Abstraction с ZeroDev
import { createKernelAccount, createKernelAccountClient } from '@zerodev/sdk';
import { signerToEcdsaValidator } from '@zerodev/ecdsa-validator';
const signer = privateKeyToAccount(
deriveKeyFromTelegram(WebApp.initDataUnsafe.user.id)
);
const ecdsaValidator = await signerToEcdsaValidator(publicClient, {
signer,
kernelVersion: KERNEL_V3_1,
});
const account = await createKernelAccount(publicClient, {
plugins: { sudo: ecdsaValidator },
kernelVersion: KERNEL_V3_1,
});
const kernelClient = createKernelAccountClient({
account,
paymaster: {
getPaymasterData: async (userOp) => {
// Возвращает подписанный paymasterData от нашего сервера
},
},
});
Gasless-транзакции через paymaster: пользователь не тратит ETH, газ оплачивает проект.
TonConnect для TON
import TonConnect from '@tonconnect/sdk';
const connector = new TonConnect({
manifestUrl: 'https://yourapp.com/tonconnect-manifest.json',
});
const walletsList = await connector.getWallets();
await connector.connect({
universalLink: wallet.universalLink,
bridgeUrl: wallet.bridgeUrl,
});
await connector.sendTransaction({
validUntil: Math.floor(Date.now() / 1000) + 300,
messages: [{
address: recipientAddress,
amount: toNano('0.5').toString(),
payload: cell.toBoc().toString('base64'),
}],
});
Безопасное хранение ключей: шифрование PIN-ом
async function encryptShare(share: Uint8Array, pin: string): Promise<string> {
const pinKey = await crypto.subtle.importKey(
'raw',
new TextEncoder().encode(pin),
'PBKDF2',
false,
['deriveKey']
);
const salt = crypto.getRandomValues(new Uint8Array(16));
const aesKey = await crypto.subtle.deriveKey(
{ name: 'PBKDF2', salt, iterations: 600_000, hash: 'SHA-256' },
pinKey,
{ name: 'AES-GCM', length: 256 },
false,
['encrypt']
);
const iv = crypto.getRandomValues(new Uint8Array(12));
const encrypted = await crypto.subtle.encrypt(
{ name: 'AES-GCM', iv },
aesKey,
share
);
return JSON.stringify({
salt: btoa(String.fromCharCode(...salt)),
iv: btoa(String.fromCharCode(...iv)),
data: btoa(String.fromCharCode(...new Uint8Array(encrypted))),
});
}
Сервер хранит зашифрованный blob, расшифровать без PIN невозможно. PIN не передаётся на сервер.
Таблица стека:
| Компонент | Технология |
|---|---|
| TMA Framework | @twa-dev/sdk + React |
| EVM Wallet | Web3Auth MPC / ZeroDev AA |
| TON Wallet | TonConnect + @ton/core |
| Auth | Telegram initData verification |
| Key storage | Server-side encrypted shares |
| Notifications | Telegram Bot API |
Процесс работы
- Аналитика и архитектура: определяем требования (custodial/AA, TON/EVM, gasless), рисуем схему потоков. На этом этапе закладываем базу для 30-40% экономии на газе через AA.
- Проектирование UI: адаптируем Telegram UI (CSS-переменные, @telegram-apps/telegram-ui), проектируем экраны send/receive/history.
- Разработка backend: Node.js + Fastify, PostgreSQL для метаданных, Redis для сессий. Интеграция с MPC/AA SDK.
- Смарт-контракты: пишем и тестируем контракты (Hardhat/Foundry) для AA vault или мультиподписи.
- Интеграция и тестирование: unit-тесты, интеграционные через Tenderly Fork, fuzzing (Echidna).
- Security audit: обязательно до релиза — мы сотрудничаем с ведущими аудиторами.
- Деплой и мониторинг: деплой на production, настройка алертов, rate limiting.
Что входит в работу
- Исходный код приватного фронтенда и бэкенда (NDA).
- Развёрнутая инфраструктура (Web3 RPC, paymaster, MPC nodes).
- Полная документация API и архитектуры.
- Обучение команды заказчика (2-3 дня).
- Гарантийная поддержка 1 месяц после релиза.
Ориентиры по срокам
| Этап | Срок |
|---|---|
| MVP (custodial, один chain, send/receive) | 4–6 недель |
| MPC + gasless AA + multi-chain (TON+EVM) | 3–5 месяцев |
| Security audit перед релизом | +2–3 недели |
Стоимость рассчитывается индивидуально, зависит от сложности интеграций и требований к безопасности. Закажите оценку проекта — мы проанализируем вашу задачу и предложим оптимальное решение. Наш опыт: более 10 лет в Web3, 50+ запущенных проектов (кошельки, DeFi, NFT). Свяжитесь с нами, чтобы обсудить детали.
MPC-архитектура сокращает время до выпуска MVP в 2-3 раза по сравнению с самостоятельной разработкой AA, а gasless-транзакции повышают конверсию пользователей на 40%. Получите консультацию — напишите нам, и мы подготовим предложение за 2 дня.







