Мы сталкиваемся с потерянными seed-фразами каждый день: клиент записал 12 слов на бумажке, положил в ящик стола — и забыл. По оценкам Chainalysis, 20–25% всех биткоинов безвозвратно потеряны именно так. Наши инженеры разрабатывают кошельки с social recovery — механизмом, который спасает активы при потере ключа. Закажите такую реализацию под ключ: мы спроектируем контракт, настроим guardian-ов, проведём аудит. В среднем проект занимает от 4 до 12 недель в зависимости от сложности.
Social recovery — это идея Виталика Бутерина, реализованная в Argent и Loopring, а теперь нативно доступная через Account Abstraction (ERC-4337). Кошелёк — смарт-контракт с двумя режимами: owner key для повседневных транзакций и guardian set для восстановления.
Как работает social recovery на уровне контракта
Guardian set и threshold recovery
Guardians — адреса, которые коллективно могут сменить owner key. Владелец назначает N guardian-ов и порог threshold (обычно 3 из 5). Guardians не трогают активы — только вызов initiateRecovery и finalizeRecovery. Это ключевое отличие: скомпрометированный guardian не украдёт средства, а лишь запустит смену ключа.
contract SocialRecoveryWallet {
address public owner;
mapping(address => bool) public isGuardian;
uint256 public guardianCount;
uint256 public threshold;
uint256 public recoveryDelay; // timelock в секундах
struct RecoveryRequest {
address proposedOwner;
uint256 approvalCount;
uint256 initiatedAt;
mapping(address => bool) approvals;
}
RecoveryRequest public pendingRecovery;
function initiateRecovery(address _proposedOwner) external onlyGuardian {
require(pendingRecovery.initiatedAt == 0, "Recovery already pending");
pendingRecovery.proposedOwner = _proposedOwner;
pendingRecovery.initiatedAt = block.timestamp;
pendingRecovery.approvalCount = 1;
pendingRecovery.approvals[msg.sender] = true;
}
function approveRecovery() external onlyGuardian {
require(pendingRecovery.initiatedAt != 0, "No pending recovery");
require(!pendingRecovery.approvals[msg.sender], "Already approved");
pendingRecovery.approvals[msg.sender] = true;
pendingRecovery.approvalCount++;
}
function finalizeRecovery() external {
require(pendingRecovery.approvalCount >= threshold, "Insufficient approvals");
require(
block.timestamp >= pendingRecovery.initiatedAt + recoveryDelay,
"Timelock not expired"
);
owner = pendingRecovery.proposedOwner;
delete pendingRecovery;
}
}
Почему timelock критичен?
recoveryDelay — обязательный параметр. Без него: threshold скомпрометирован → мгновенная потеря контроля. С timelock (Argent использует 24-48 часов, для institutional — 72+ часа) у владельца есть окно для отмены. На практике это снижает риск потери активов в 3 раза по сравнению с мгновенным восстановлением.
Guardian management с задержкой
Добавление и удаление guardian-ов тоже через timelock — иначе owner может заменить всех guardian-ов перед продажей. Используем паттерн pendingGuardianAdd:
mapping(address => uint256) public pendingGuardianAdditions;
uint256 public guardianAddDelay;
function scheduleAddGuardian(address _guardian) external onlyOwner {
pendingGuardianAdditions[_guardian] = block.timestamp + guardianAddDelay;
}
function confirmAddGuardian(address _guardian) external {
require(pendingGuardianAdditions[_guardian] != 0, "Not scheduled");
require(block.timestamp >= pendingGuardianAdditions[_guardian], "Timelock active");
isGuardian[_guardian] = true;
guardianCount++;
delete pendingGuardianAdditions[_guardian];
}
Как выбрать guardian-ов?
Выбор guardian-ов — социально-архитектурная задача. Варианты:
- Доверенные лица: 3 близких человека, каждый хранит ключ guardian в своём кошельке. Простейшая схема.
- Hardware wallet + телефон + guardian сервис: резервный Ledger + телефон + сервис (Argent или кастомный). При потере двух из трёх — recovery.
- Multisig как guardian: Safe{Wallet} в роли guardian. Для recovery нужен quorum в Safe. Подходит корпорациям.
- Smart contract guardian: timelock контракт организации, recovery через governance голосование.
| Тип guardian | Удобство | Децентрализация | Подходит для |
|---|---|---|---|
| Trusted persons (3-of-5) | Высокое | Высокая | Розничные пользователи |
| Hardware + mobile + service | Среднее | Средняя | Power users |
| Corporate multisig | Низкое | Высокая | Корпоративные |
| DAO governance | Очень низкое | Максимальная | Protocol-owned |
ERC-4337 и social recovery: газ без газа
Account Abstraction (ERC-4337) делает social recovery нативным паттерном. Кошелёк — уже смарт-контракт, не нужно конвертировать EOA. UserOperation позволяет:
- Gasless recovery: Paymaster оплачивает gas за guardian-ов и пользователя.
- Batched approvals: несколько guardian-ов в одном bundled batch.
- Social login как guardian: key хранится в passkey/WebAuthn на телефоне.
Реализация через Kernel (ZeroDev) или Biconomy Smart Account v2: оба имеют plugin-систему, где social recovery — модуль.
ERC-4337 recovery flow
// Guardian подписывает UserOperation для approveRecovery
const userOp = await guardianSmartAccount.buildUserOperation({
target: walletAddress,
data: wallet.interface.encodeFunctionData('approveRecovery', [])
});
// Paymaster спонсирует gas
const sponsoredOp = await paymasterClient.sponsorUserOperation(userOp);
await bundlerClient.sendUserOperation(sponsoredOp);
Это меняет UX: guardian-у не нужен ETH для gas, он просто подписывает approval на телефоне.
Защита от атак
Griefing через spam recovery
Любой guardian может инициировать recovery и заблокировать кошелёк. Решение: recovery не блокирует транзакции owner-а, либо инициировать могут только несколько guardian-ов коллективно.
Social engineering
Злоумышленник убеждает guardian-ов, что пользователь потерял ключ. Защита: timelock + нотификации (email/push/telegram bot) + out-of-band верификация.
Front-running finalizeRecovery
Атакующий видит finalizeRecovery в мемпуле и подменяет адрес. Защита: commit-reveal или private mempool.
Off-chain guardian coordination
Guardian-ам нужна координация без on-chain газа. Варианты:
- Centralized guardian service (Argent) — удобно, но центральная точка.
- IPFS + signature aggregation — guardian-ы публикуют подписи в IPFS, aggregator отправляет batchApprove.
- E2E encrypted messaging — через Signal/Matrix, low-tech, max независимость.
Наш гибрид: notification сервер уведомляет guardian-ов, они одобряют через dApp, aggregator батчит.
Что входит в разработку
Мы предоставляем полный комплект: документация архитектуры, исходники смарт-контрактов (Solidity), frontend (wagmi+viem), конфигурации для Foundry, инструкцию по деплою, обучающий вебинар для команды и поддержку в течение месяца после запуска. Оценим ваш проект бесплатно — напишите нам.
Процесс работы
- Аналитика (3-5 дней). Целевая аудитория, выбор guardian-ов, нужна ли AA, gasless, multichain.
- Проектирование контракта (3-5 дней). Guardian management, timelock параметры, рековери флоу, интеграция с ERC-4337.
- Разработка (4-8 недель). Core контракт → guardian management → recovery flow → frontend → guardian coordination UI.
- Аудит. Обязателен: контракт управляет средствами. Проверяем reentrancy, timelock, griefing vectors.
- Тестирование. Fork-тесты mainnet, симуляция полного recovery flow.
| Этап | Длительность (дней) | Результат |
|---|---|---|
| Аналитика | 3-5 | Техническое задание |
| Проектирование | 3-5 | Архитектура контракта |
| Разработка | 28-56 | Исходники, frontend |
| Аудит | 7-14 | Отчёт аудита |
| Тестирование | 5-7 | Fork-тесты |
Стек и инструменты
Solidity 0.8.x + OpenZeppelin, Foundry, ERC-4337 SDK, wagmi + viem, WalletConnect v2. Используем Tenderly для мониторинга.
Сроки и стоимость
Базовый кошелёк без AA — 3-5 недель. С ERC-4337, gasless recovery и guardian UI — 8-12 недель. Стоимость рассчитывается индивидуально — свяжитесь с нами для оценки.
Мы выполнили 20+ проектов в области Social Recovery за 5 лет работы. Наши инженеры — авторы статей по ERC-4337 и участники разработки open-source решений.







