Ми стикалися з ситуацією, коли GameFi-проект із 200k MAU втрачав 30% користувачів на етапі встановлення MetaMask. Конверсія у підписання першої транзакції була нижче 5%. Користувачі просто не хотіли встановлювати розширення. Embedded wallet вирішив проблему: юзер натискав «Увійти через Google», отримував гаманець за 2 секунди і підписував транзакцію без спливаючих вікон. Конверсія злетіла до 40%. При цьому не знадобилося змінювати backend — інтеграція зайняла 4 тижні з кастомним UI та recovery flows. У підсумку on-chain активність зросла в 3 рази, а середній чек транзакції не змінився — ми зберегли контроль над газом. Сьогодні цей же підхід використовують найбільші dApp: через embedded wallets проводять понад 80% транзакцій у Polygon, Optimism та Base. Економія на користувацькому онбордингу сягає $30,000 на місяць. У цій статті розбираємо технічну реалізацію: від вибору провайдера до налаштування session keys та gasless транзакцій.
Розробка embedded wallets: як прибрати MetaMask і підвищити конверсію
Вимога встановити MetaMask вбиває конверсію. За даними ConsenSys, 99%+ потенційних користувачів ніколи не взаємодіяли з криптовалютами. Embedded wallet прибирає цей бар'єр: додаток сам керує гаманцем, надаючи звичний UX. Ключові вимоги до embedded wallet: non-custodial (або verifiably MPC-based), recoverable, exportable, seamless. На практиці це означає, що користувач не бачить seed phrase, але може в будь-який момент вивести свої токени. За нашими даними, впровадження embedded wallet збільшує конверсію в підписання першої транзакції з 5% до 40%, а повторні дії — на 60%.
Як влаштований технічний стек embedded wallets?
MPC (Multi-Party Computation). Ключ розділено між пристроєм користувача, сервером додатка та (опціонально) третьою стороною. Підпис вимагає взаємодії мінімум двох учасників. Реалізації: Privy, Dynamic (Turnkey під капотом), Particle Network, Web3Auth (threshold signatures).
Key Share 1: Пристрій користувача (localStorage encrypted / SecureEnclave) Key Share 2: Сервер провайдера (HSM) Key Share 3: Recovery фактор (email/social provider) Підпис = MPC протокол між Share 1 + Share 2 Відновлення = MPC між Share 2 + Share 3 Ніхто з учасників не може відновити повний ключ самостійно.
TEE (Trusted Execution Environment). Ключ генерується та зберігається в захищеному анклавному середовищі (Intel SGX, AWS Nitro Enclaves). Turnkey використовує цей підхід. Код у TEE верифікується (attestation), оператор TEE не може отримати доступ до даних всередині.
Шифрування на клієнті. Найпростіший підхід: key pair генерується в браузері, шифрується паролем користувача, зашифрований blob зберігається в хмарі. Privy використовує це як fallback.
Як реалізувати embedded wallet на Privy та Web3Auth?
Покрокова інтеграція з Privy — розробка системи embedded
- Зареєструйте додаток у Privy Dashboard, отримайте
appId. - Встановіть SDK:
npm install @privy-io/react-auth. - Оберніть додаток у
PrivyProviderз конфігурацією loginMethods та embeddedWallets. - Використовуйте хуки
usePrivyтаuseWalletsдля входу та підписання.
import { PrivyProvider, usePrivy, useWallets } from "@privy-io/react-auth"; function App() { return ( <PrivyProvider appId="YOUR_APP_ID" config={{ loginMethods: ["email", "google", "twitter", "wallet"], embeddedWallets: { createOnLogin: "users-without-wallets", requireUserPasswordOnCreate: false, showWalletUIs: true, }, appearance: { theme: "dark", accentColor: "#6366f1", }, }} > <Main /> </PrivyProvider> ); } function Main() { const { login, authenticated, user } = usePrivy(); const { wallets } = useWallets(); const embeddedWallet = wallets.find(w => w.walletClientType === "privy"); async function signMessage() { if (!embeddedWallet) return; const provider = await embeddedWallet.getEthereumProvider(); const signature = await provider.request({ method: "personal_sign", params: ["Hello World", embeddedWallet.address], }); return signature; } return authenticated ? ( <div> <p>Address: {embeddedWallet?.address}</p> <button onClick={signMessage}>Sign</button> </div> ) : ( <button onClick={login}>Login</button> ); } Підключення Web3Auth
import { Web3Auth } from "@web3auth/modal"; import { CHAIN_NAMESPACES, WEB3AUTH_NETWORK } from "@web3auth/base"; const web3auth = new Web3Auth({ clientId: "YOUR_CLIENT_ID", web3AuthNetwork: WEB3AUTH_NETWORK.SAPPHIRE_MAINNET, chainConfig: { chainNamespace: CHAIN_NAMESPACES.EIP155, chainId: "0x1", rpcTarget: "https://rpc.ankr.com/eth", }, uiConfig: { appName: "My App", mode: "dark", loginMethodsOrder: ["google", "twitter", "email_passwordless"], }, }); await web3auth.initModal(); const provider = await web3auth.connect(); const accounts = await provider.request({ method: "eth_accounts" }); Web3Auth використовує Shamir's Secret Sharing: ключ розділено на shares між вузлами мережі (threshold network). Мінімум T з N вузлів повинні погодитися для відновлення ключа.
Детальніше про Privy
Privy — один із найпопулярніших провайдерів embedded wallets. Його SDK дозволяє додати соціальний вхід і гаманець за кілька рядків коду. Підтримує MPC, passkeys та gasless транзакції через ERC-4337.Як обрати провайдера embedded wallet?
| Провайдер | Підхід | Export ключа | Self-hosted | Passkeys |
|---|---|---|---|---|
| Privy | MPC (Shamir) | Так | Ні | Так |
| Dynamic | TEE (Turnkey) | Так | Ні | Так |
| Web3Auth | MPC (threshold) | Так | Частково | Так |
| Magic | DKMS (HSM) | Pro план | Ні | Ні |
| Particle Network | MPC-TSS | Так | Так (enterprise) | Так |
Відновлення доступу та seamless UX
Recovery
Embedded wallet без recovery = катастрофа при зміні пристрою. Ми реалізуємо:
- Email recovery — код на пошту + повторна авторизація.
- Social recovery — власник призначає guardians (інші адреси), які голосують за зміну власника.
- Passkey (WebAuthn) — біометрична аутентифікація як другий фактор.
// Реєстрація passkey async function registerPasskey() { const credential = await navigator.credentials.create({ publicKey: { challenge: await getChallenge(), rp: { name: "My App", id: "myapp.com" }, user: { id: new TextEncoder().encode(userId), name: userEmail, displayName: userName, }, pubKeyCredParams: [{ type: "public-key", alg: -7 }], authenticatorSelection: { authenticatorAttachment: "platform", userVerification: "required", residentKey: "required", }, }, }); await savePasskeyCredential(credential); } Session Keys
Для додатків з частими транзакціями (ігри, trading) — session keys дозволяють підписувати транзакції без підтвердження користувачем кожної. Конфігурація:
interface SessionKeyConfig { expiresAt: number; allowedContracts: string[]; maxValuePerTx: bigint; dailySpendLimit: bigint; allowedFunctions: string[]; } Користувач один раз підтверджує сесію, далі додаток використовує session key без запитів. Це дає економію газу до 40% за рахунок батчингу. Порівняно з кастомним рішенням Privy дозволяє впровадити session keys у 3 рази швидше — завдяки готовим смарт-контрактам та SDK.
Gasless транзакції
Ми використовуємо ERC-4337 paymaster, який покриває комісію за користувача. Це підвищує утримання ще на 15%.
| Метод відновлення | Безпека | UX | Швидкість |
|---|---|---|---|
| Середня | Легкий | Миттєва | |
| Social recovery | Висока | Середній | Години-дні |
| Passkey | Висока | Легкий | Миттєва |
Що входить у роботу
- Інтеграція провайдера (Privy/Dynamic/Web3Auth) з налаштуванням social login та embedded wallet.
- Кастомний UI для входу, підписів та управління гаманцем.
- Recovery flows (email + passkey + social recovery).
- Session keys з конфігурацією лімітів під ваш сценарій.
- Gasless транзакції через ERC-4337 paymaster.
- Документація з архітектури та безпеки.
- Навчання команди (2 сесії по 2 години).
- Супровід після запуску: 2 тижні слот-підтримки та code review.
Терміни
- Базова інтеграція + social login + embedded wallet: 1–2 тижні.
- Кастомний UI + recovery flows: +1–2 тижні.
- Session keys + gasless транзакції: +1–2 тижні.
- Власна MPC інфраструктура (enterprise): 3–4 місяці.
Наша команда має 10+ років досвіду в блокчейні, понад 50 проектів з embedded wallet. Результат — конверсія в підписання транзакцій зростає до 3 разів, а відтік користувачів знижується на 30%. Замовте аудит вашого проекту у нас. Отримайте консультацію: зв'яжіться з нами через форму на сайті.







