We encountered a situation where a GameFi project with 200k MAU was losing 30% of users at the MetaMask installation step. Conversion to signing the first transaction was below 5%. Users simply did not want to install an extension. Embedded wallet solved the problem: the user clicked "Sign in with Google," got a wallet in 2 seconds, and signed a transaction without pop-ups. Conversion soared to 40%. No backend changes were required—the integration took 4 weeks with a custom UI and recovery flows. On-chain activity tripled, and the average transaction value remained unchanged—we retained control over gas. Today, the same approach is used by major dApps: over 80% of transactions on Polygon, Optimism, and Base are conducted through embedded wallets. Savings on user onboarding reach $30,000 per month. In this article, we break down the technical implementation: from choosing a provider to configuring session keys and gasless transactions.
Embedded Wallet Development: How to Remove MetaMask and Boost Conversion
Requiring MetaMask installation kills conversion. According to ConsenSys, 99%+ of potential users have never interacted with cryptocurrencies. An embedded wallet removes this barrier: the application manages the wallet itself, providing a familiar UX. Key requirements for an embedded wallet: non-custodial (or verifiably MPC-based), recoverable, exportable, and seamless. In practice, this means the user never sees a seed phrase but can withdraw their tokens at any time. Based on our data, implementing an embedded wallet increases conversion to signing the first transaction from 5% to 40%, and repeat actions by 60%.
How the Technical Stack of Embedded Wallets Works
MPC (Multi-Party Computation). The key is split between the user's device, the application server, and optionally a third party. Signing requires interaction from at least two participants. Implementations: Privy, Dynamic (Turnkey under the hood), Particle Network, Web3Auth (threshold signatures).
Key Share 1: User device (localStorage encrypted / SecureEnclave) Key Share 2: Provider server (HSM) Key Share 3: Recovery factor (email/social provider) Signature = MPC protocol between Share 1 + Share 2 Recovery = MPC between Share 2 + Share 3 No single participant can reconstruct the full key alone.
TEE (Trusted Execution Environment). The key is generated and stored in a protected enclave environment (Intel SGX, AWS Nitro Enclaves). Turnkey uses this approach. Code in TEE is verifiable (attestation); the TEE operator cannot access the data inside.
Client-side encryption. The simplest approach: a key pair is generated in the browser, encrypted with the user's password, and the encrypted blob is stored in the cloud. Privy uses this as a fallback.
How to Implement an Embedded Wallet with Privy and Web3Auth
Step-by-Step Integration with Privy — Embedded System Development
- Register your application in the Privy Dashboard and obtain your
appId. - Install the SDK:
npm install @privy-io/react-auth. - Wrap your application in
PrivyProviderwith configuration for loginMethods and embeddedWallets. - Use the hooks
usePrivyanduseWalletsfor login and signing.
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> ); } Connecting 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 uses Shamir's Secret Sharing: the key is split into shares among network nodes (threshold network). At least T out of N nodes must agree to reconstruct the key.
More about Privy
Privy is one of the most popular embedded wallet providers. Its SDK allows adding social login and a wallet in just a few lines of code. Supports MPC, passkeys, and gasless transactions via ERC-4337.How to Choose an Embedded Wallet Provider
| Provider | Approach | Key Export | Self-hosted | Passkeys |
|---|---|---|---|---|
| Privy | MPC (Shamir) | Yes | No | Yes |
| Dynamic | TEE (Turnkey) | Yes | No | Yes |
| Web3Auth | MPC (threshold) | Yes | Partially | Yes |
| Magic | DKMS (HSM) | Pro plan | No | No |
| Particle Network | MPC-TSS | Yes | Yes (enterprise) | Yes |
Recovery and Seamless UX
Recovery
An embedded wallet without recovery is a disaster when changing devices. We implement:
- Email recovery — code to email + re-authentication.
- Social recovery — the owner appoints guardians (other addresses) who vote to change ownership.
- Passkey (WebAuthn) — biometric authentication as a second factor.
// Register 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
For applications with frequent transactions (games, trading) — session keys allow signing transactions without user confirmation for each one. Configuration:
interface SessionKeyConfig { expiresAt: number; allowedContracts: string[]; maxValuePerTx: bigint; dailySpendLimit: bigint; allowedFunctions: string[]; } The user confirms the session once; thereafter the application uses the session key without further prompts. This saves up to 40% on gas through batching. Compared to a custom solution, Privy allows implementing session keys 3x faster — thanks to ready-made smart contracts and SDK.
Gasless Transactions
We use an ERC-4337 paymaster to cover the fee for the user. This boosts retention by an additional 15%.
| Recovery Method | Security | UX | Speed |
|---|---|---|---|
| Medium | Easy | Instant | |
| Social recovery | High | Medium | Hours-days |
| Passkey | High | Easy | Instant |
What's Included in the Work
- Provider integration (Privy/Dynamic/Web3Auth) with social login and embedded wallet configuration.
- Custom UI for login, signing, and wallet management.
- Recovery flows (email + passkey + social recovery).
- Session keys with limit configuration for your scenario.
- Gasless transactions via ERC-4337 paymaster.
- Documentation on architecture and security.
- Team training (2 sessions of 2 hours).
- Post-launch support: 2 weeks of slot support and code review.
Timelines
- Basic integration + social login + embedded wallet: 1–2 weeks.
- Custom UI + recovery flows: +1–2 weeks.
- Session keys + gasless transactions: +1–2 weeks.
- Custom MPC infrastructure (enterprise): 3–4 months.
Integration costs start from $10,000. Our team has 10+ years of blockchain experience and over 50 projects with embedded wallets. Results: conversion to signing transactions increases up to 3x, user churn decreases by 30%. Order a project audit from us. Get a consultation: contact us through the form on our website.







