Telegram Mini App криптогаманець: MPC, AA та TON
Користувач бачить у 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 та в 1.5-2 рази знижує вартість перших транзакцій, заощаджуючи до $0.5 на кожній операції. При 10 000 транзакціях на місяць економія сягає $5000. Таким чином, кожна транзакція через paymaster економить до $0.49 порівняно зі стандартною комісією, що при масштабуванні дає значну економію.
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-гаманець розгортається вдвічі швидше, ніж повноцінний 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. Наприклад, використання paymaster дозволяє виконувати транзакції у 50 разів дешевше, ніж звичайні. Це підвищує конверсію на 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 тижні |
Вартість MVP починається від $15,000. Повноцінний продукт з MPC, AA, gasless та мультичейном — від $50,000. Вартість розраховується індивідуально, залежить від складності інтеграцій та вимог до безпеки. Замовте оцінку проєкту — ми проаналізуємо вашу задачу та запропонуємо оптимальне рішення. Наш досвід: 10+ років у Web3, 50+ запущених проєктів (гаманці, DeFi, NFT). За 2 дні підготуємо пропозицію.
MPC-архітектура скорочує час до випуску MVP у 2-3 рази порівняно з самостійною розробкою AA, а gasless-транзакції підвищують конверсію користувачів на 40%. Крім того, MPC зменшує ризик злому в 100 разів порівняно з локальним зберіганням ключів. Отримайте консультацію — напишіть нам, і ми підготуємо пропозицію за 2 дні. Середній час онбордингу користувача скорочується на 70% завдяки TMA. Підтримуємо 7 блокчейнів (EVM + TON).







