Ми стикалися з ситуацією, коли 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%. Замовте аудит вашого проекту у нас. Отримайте консультацію: зв'яжіться з нами через форму на сайті.







