Реализация Account Abstraction (ERC-4337) в мобильном криптокошельке
ERC-4337 меняет пользовательский опыт в крипто-кошельках радикально: вместо того чтобы пользователь хранил seed-фразу и лично оплачивал газ в ETH, транзакции упаковываются в UserOperation, отправляются через Bundler, а gas может оплачивать Paymaster — третья сторона. Для мобильного приложения это означает возможность реализовать web2-подобный UX: вход через Face ID, gasless транзакции, восстановление через социальный аккаунт.
Компоненты ERC-4337 и их роль в мобильном клиенте
Smart Account. Вместо EOA (Externally Owned Account) пользователь получает смарт-контракт-кошелёк (SimpleAccount, SafeAccount, LightAccount от Alchemy, Kernel от ZeroDev). Адрес контракта детерминирован через CREATE2 — его можно вычислить до деплоя. Мобильный клиент хранит ownerPrivateKey (ключ подписанта) в Secure Enclave (iOS) / Android Keystore, а не сам кошелёк.
EntryPoint контракт (0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789 — адрес одинаков на всех EVM-сетях) — глобальный синглтон, принимает UserOperation[] от Bundler'ов.
Bundler — нода, которая собирает UserOperation из мемпула, симулирует, пакует в обычную on-chain транзакцию. SDK для работы с bundler'ами: @alchemy/aa-core, permissionless.js, viem/account-abstraction (viem 2.x). В мобильном приложении bundler — это HTTP endpoint, куда клиент отправляет eth_sendUserOperation.
Paymaster — опциональный контракт, спонсирующий gas. Verifying Paymaster подписывает разрешение на оплату на сервере, ERC-20 Paymaster позволяет платить в USDC. В мобильном клиенте: перед отправкой UserOperation запрашиваем pm_sponsorUserOperation у Paymaster API (Alchemy, Pimlico, Biconomy).
Реализация в мобильном приложении
Подпись UserOperation. Смарт-аккаунт верифицирует подпись через isValidSignature (ERC-1271). Подписывает владелец (owner EOA). На iOS — SecKeyCreateSignature с kSecKeyAlgorithmECDSASignatureMessageX962SHA256 через Secure Enclave (ключ не покидает чип). На Android — KeyPairGenerator с AndroidKeyStore provider, подпись через Signature.getInstance("SHA256withECDSA").
Biometric authentication перед подписью — LocalAuthentication (iOS) / BiometricPrompt (Android). Приватный ключ доступен только после биометрической верификации — ключ помечен kSecAccessControlBiometryCurrentSet (iOS) или setUserAuthenticationRequired(true) (Android Keystore).
UserOperation структура и Gas estimation. Поля callGasLimit, verificationGasLimit, preVerificationGas нужно оценить до отправки. Bundler предоставляет eth_estimateUserOperationGas — вызываем перед показом пользователю суммы gas. Pimlico, Alchemy Gas Manager автоматизируют это. Без корректной оценки bundler отклонит операцию с AA21 didn't pay prefund.
Session Keys. ERC-4337 позволяет делегировать ограниченные права подписи. Пример: мобильная игра запрашивает session key с правом тратить до 5 USDC за транзакцию — пользователь подписывает один раз, дальнейшие микро-транзакции в игре проходят без подтверждения. Реализация через ISessionKeyPlugin (ERC-6900) или аналог в Kernel (ZeroDev).
Social Recovery. Смарт-аккаунт может поддерживать восстановление через guardians — доверенных адресов (например, email-recovery через ZeroDev Email Recovery или телефон через социальный вход через Web3Auth). Пользователь теряет ключ → обращается к guardian'ам → через timelock (обычно 48h) получает нового владельца. Для мобильного UX: в приложении — раздел «Восстановление», где можно добавить guardian'ов и настроить threshold.
Кейс. DeFi-мобильный кошелёк: Smart Account на базе LightAccount v1.1, bundler — Alchemy, Paymaster спонсирует первые 10 транзакций новых пользователей. Подпись через Secure Enclave (iOS) и Android Keystore. Onboarding без seed-фразы: пользователь создаёт аккаунт через Apple Sign In → генерируется ECDSA keypair в Secure Enclave → адрес смарт-аккаунта вычисляется через getCounterFactualAddress → при первом пополнении аккаунт деплоится через initCode в UserOperation. Пользователь никогда не видит приватный ключ или seed-фразу. Подключение к DApp через WalletConnect v2 (Sign API) — кошелёк подписывает EIP-712 сообщения.
Сложности и неочевидные моменты
Frontrunning UserOperations. Мемпул ERC-4337 публичный — bundler'ы видят незапакованные UserOperation. Для конфиденциальных операций используем private bundler (Flashbots, MEV Blocker) или paymaster с зашифрованными данными.
Multi-chain. EntryPoint v0.6 и v0.7 — разные адреса на разных сетях. Кошелёк должен поддерживать оба. SmartAccountClient из @alchemy/aa-core абстрагирует это, но конфигурация на каждую сеть — своя.
Gas estimation на Optimism/Base. L2 gas модель отличается: L1 data fee добавляется к L2 gas. eth_estimateUserOperationGas от bundler'а учитывает это, но стоит верифицировать на разных сетях отдельно.
Сроки
| Масштаб | Ориентировочные сроки |
|---|---|
| Базовый ERC-4337 кошелёк, gasless, biometric | 10–16 недель |
| Кошелёк с session keys и social recovery | 5–8 месяцев |
| DeFi-платформа с мультичейн поддержкой | 8–14 месяцев |
Стоимость рассчитывается индивидуально после анализа требований к смарт-контрактам, поддерживаемым сетям и UX-флоу онбординга.







