Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
Free 30-min Web3 Consultation
Book Consultation
Smart Contract Security Audits
View Audit Services
Custom DeFi Protocol Development
Explore DeFi
Full-Stack Web3 dApp Development
View App Services
LABS
Guides

How to Architect a Recovery System Using Trusted Contacts

A technical guide for developers implementing a social recovery system. Covers guardian models, secure invitation flows, recovery ceremonies with MPC, and mitigating sybil attacks.
Chainscore © 2026
introduction
SOCIAL RECOVERY

How to Architect a Recovery System Using Trusted Contacts

A guide to designing a secure, decentralized account recovery mechanism that replaces seed phrases with a network of trusted individuals or devices.

Social recovery is a key management mechanism that shifts security from a single point of failure—a seed phrase—to a distributed network of trusted contacts (guardians). Popularized by projects like Vitalik Buterin's Ethereum wallet design and implemented by Safe (formerly Gnosis Safe) and Argent, it allows a user to recover access to their wallet if they lose their primary device. The core principle is that a predefined majority of your guardians (e.g., 3 out of 5) can collectively authorize a transaction to reset the wallet's signing key to a new one you control. This architecture significantly reduces the risk of permanent fund loss while maintaining user sovereignty.

Architecting this system requires several key smart contract components. First, a recovery module must be attached to the main account contract (like a Safe or an ERC-4337 smart account). This module stores a list of guardian addresses, which can be EOA wallets, other smart accounts, or even hardware wallets. It also defines a recovery threshold (e.g., threshold = 3). The module exposes a function, typically initiateRecovery(address newOwner), which starts a time-delayed process. During this delay, guardians submit their approvals by calling confirmRecovery(bytes32 recoveryId). Once the number of confirmations meets the threshold, the recovery can be executed, transferring ownership.

Here is a simplified Solidity snippet illustrating the storage and confirmation logic for a recovery module:

solidity
contract SocialRecoveryModule {
    address public owner;
    address[] public guardians;
    uint256 public threshold;
    mapping(bytes32 => uint256) public confirmations;
    
    function confirmRecovery(bytes32 recoveryId) external {
        require(isGuardian(msg.sender), "Not a guardian");
        confirmations[recoveryId]++;
        
        if (confirmations[recoveryId] >= threshold) {
            _executeRecovery(recoveryId);
        }
    }
    
    function isGuardian(address addr) internal view returns (bool) {
        for(uint i = 0; i < guardians.length; i++) {
            if (guardians[i] == addr) return true;
        }
        return false;
    }
}

This shows the basic flow: guardians call confirmRecovery, and the contract automatically executes once the threshold is met.

Choosing guardians is a critical security decision. A robust setup uses a diverse set of trust anchors: - Personal devices: A laptop or old phone you control. - Trusted individuals: Family members or close friends. - Institutional guardians: Services like Coinbase's cloud-based recovery or Safe's dedicated guardian service. To prevent collusion, avoid making all guardians from the same social circle. The recovery delay is also crucial; a 1-7 day window allows the legitimate owner to notice and cancel a malicious recovery attempt. For maximum decentralization, consider using multi-sig safes as guardians or integrating with Ethereum Attestation Service (EAS) for on-chain verification of guardian identities.

When implementing, you must handle key edge cases. The system needs functions to add/remove guardians and change the threshold, which should themselves be protected by a similar multi-signature or time-delay process. Integration with ERC-4337 account abstraction is a powerful next step, allowing the social recovery module to be a native validator for a smart account. Furthermore, to reduce gas costs for guardians, you can implement signature aggregation using a library like EIP-1271 for contract signatures or EIP-4337's aggregateSignatures, allowing multiple off-chain approvals to be submitted in a single transaction.

In practice, always audit the recovery logic and consider using established, audited implementations like those from Safe or ZeroDev's kernel for production. Social recovery is not a silver bullet—it introduces social engineering risks and dependency on guardian availability—but when architected with careful threshold settings, diverse guardians, and proper time delays, it creates a user-friendly and resilient security model superior to seed phrase management for most users.

prerequisites
ARCHITECTURE FOUNDATION

Prerequisites and System Requirements

Before building a trusted contact recovery system, you must establish the core technical and security prerequisites. This ensures your architecture is secure, resilient, and maintainable.

A trusted contact recovery system is a social recovery mechanism for smart contract wallets or decentralized applications. It allows a user to designate a set of trusted individuals or devices (contacts) who can collectively help recover access to an account if the primary key is lost. The core requirement is a smart contract that acts as the account's owner, implementing a multi-signature logic where a threshold of M out of N trusted contacts is required to execute a recovery transaction, such as changing the account's signing key.

Your development environment must be configured for smart contract development and testing. Essential tools include Node.js (v18+), a package manager like npm or yarn, and the Hardhat or Foundry framework. You will need to write, compile, and deploy contracts, so familiarity with Solidity (^0.8.0) is required. For interacting with the system, a library like ethers.js (v6) or viem is necessary to build the frontend or backend logic that manages guardians and initiates recovery flows.

Security is the paramount non-functional requirement. The system must be designed to resist common threats: - Guardian collusion: The threshold M must be set high enough to prevent a malicious subset from taking control. - Sybil attacks: The process for adding or removing guardians must be permissioned by the account owner. - Transaction replay: Recovery requests should be time-bound or use nonces. - Front-running: Critical state changes should be protected. A comprehensive audit of the recovery logic is mandatory before mainnet deployment.

You will need access to a blockchain network for testing and deployment. Start with a local development chain like Hardhat Network for rapid iteration. For staging, use a testnet such as Sepolia or Goerli. Ensure you have test ETH from a faucet to pay for gas. The final production deployment will be on a mainnet like Ethereum, Polygon, or Arbitrum. Consider gas optimization early, as recovery transactions involving multiple signatures can be expensive.

The architecture requires off-chain components to manage the social layer. You need a backend service (or a decentralized alternative) to: 1. Notify guardians when a recovery is requested (via email, push notification, or a signed message). 2. Collect signatures from guardians in a secure, tamper-evident manner. 3. Submit the batched recovery transaction to the blockchain. This service must be highly available and should not become a central point of failure or trust.

Finally, define clear operational procedures. Document the steps for users to add/remove guardians, initiate recovery, and for guardians to approve requests. Create a disaster recovery plan for the off-chain service itself. Establish monitoring for key events (recovery initiated, threshold met) using tools like The Graph for indexing or dedicated blockchain listeners. Without these operational foundations, even the most secure smart contract can fail in practice.

key-concepts-text
CORE CONCEPTS

Architecting a Recovery System with Trusted Contacts

A guide to implementing a secure, decentralized account recovery system using the concepts of guardians, secret shares, and threshold cryptography.

A social recovery or trusted contact system allows a user to regain access to their account if they lose their primary key, without relying on a centralized custodian. The core architecture involves three components: the user's wallet, a set of guardians, and a recovery module (often a smart contract). The user designates trusted individuals or devices as guardians, who collectively hold the power to authorize a recovery request. This model shifts security from a single point of failure (a seed phrase) to a distributed network of trust, significantly improving resilience against loss.

The security of this system relies on threshold cryptography, specifically Shamir's Secret Sharing (SSS). Instead of backing up the full private key, the wallet uses SSS to split the recovery secret into multiple encrypted shares. A defined threshold (e.g., 3 out of 5) of these shares is required to reconstruct the original secret. Each share is distributed to a different guardian. This ensures no single guardian can compromise the account, and the user can lose access to some guardians without locking themselves out. Protocols like ERC-4337 account abstraction often integrate this logic directly into the wallet's validation mechanism.

A recovery ceremony is the process executed when access is needed. The user initiates a recovery request through the recovery module, specifying a new signing key. The guardians are notified, and each approved guardian submits their cryptographic share or a signature approving the request. The recovery contract verifies the signatures or reconstructs the secret once the threshold is met. Only then does it authorize the key rotation. This process is transparent and verifiable on-chain, with timers and challenge periods often added to prevent malicious recovery attempts.

When architecting this system, key design decisions include: - Guardian selection: Choosing individuals, other hardware wallets, or institutional services. - Threshold configuration: Balancing security (higher threshold) with convenience (lower threshold). - Share distribution: Securely transmitting encrypted shares to guardians, often via their own wallet addresses. - Recovery logic: Implementing the smart contract with functions for addGuardian, removeGuardian, initiateRecovery, and executeRecovery. Frameworks like Safe{Wallet}'s Zodiac module or OpenZeppelin's libraries provide audited starting points.

For developers, a basic recovery contract outline in Solidity involves a mapping of guardians, a threshold state variable, and a struct for pending recovery requests. The executeRecovery function would require ecrecover to validate signatures from a sufficient number of guardian addresses before updating the wallet's owner. It's critical to include a delay period (e.g., 24-48 hours) between initiation and execution, allowing the original owner to cancel if the request is fraudulent. All state changes should emit clear events for off-chain monitoring and user interfaces.

In practice, successful implementation requires careful consideration of the user experience for both the account owner and the guardians. The system must provide clear instructions, secure channels for share backup, and intuitive interfaces for participating in a recovery. By combining decentralized trust, threshold cryptography, and on-chain execution, this architecture creates a robust and user-owned safety net, fundamentally aligning with the self-custody principles of Web3.

ARCHITECTURE COMPARISON

On-Chain vs Off-Chain Guardian Models

Key technical and operational differences between implementing guardian logic directly on-chain versus coordinating it off-chain.

FeatureOn-Chain GuardiansOff-Chain GuardiansHybrid Model

Guardian Logic Location

Smart contract on the target chain

External server or multi-sig wallet

Logic split between contract and external service

Transaction Signing

Direct signature via contract call

Off-chain signature aggregation (e.g., EIP-712)

On-chain execution of pre-signed off-chain messages

Gas Cost for Recovery

High (pays for all guardian logic on-chain)

Low (only pays for final execution tx)

Medium (pays for verification and execution)

Recovery Latency

Block time + contract execution

Off-chain coordination time + block time

Off-chain coordination + block time

Censorship Resistance

Guardian Anonymity

Upgrade Flexibility

Requires contract migration or proxy

Server logic can be updated instantly

Off-chain component can be updated independently

Implementation Complexity

High (secure multi-sig contract)

Medium (signature coordination service)

High (secure coordination between systems)

Example Protocols

Safe{Wallet} modules, Argent V1

Ethereum Name Service (ENS) recovery

Uniswap's Permit2 with off-chain approvals

invitation-verification-flow
SOCIAL RECOVERY

Designing Secure Invitation and Verification Flows

This guide explains how to architect a secure social recovery system using trusted contacts, detailing the cryptographic principles and user flows for invitation, verification, and key shard management.

A social recovery system allows a user to regain access to their account by proving ownership through a set of trusted contacts, or guardians. This is a critical alternative to seed phrases, shifting security from a single point of failure to a social graph. The core architecture involves three phases: invitation, verification, and recovery. The system's security hinges on properly implementing each phase to prevent impersonation and unauthorized recovery attempts. Protocols like Ethereum's ERC-4337 have popularized this model for smart contract wallets.

The invitation flow begins when a user (the recoverer) designates guardians, typically by providing their on-chain addresses or decentralized identifiers (DIDs). The system must then send a secure, verifiable invitation to each guardian. This is often done by having the user's wallet generate and sign an invitation token containing the recoverer's address and a unique session identifier. The guardian receives this token off-chain (e.g., via a QR code or deep link) and must cryptographically verify the signature before proceeding. This step ensures the invitation is authentic and not a phishing attempt.

During the verification flow, the guardian confirms their identity and intent to participate. A common method is for the guardian's client to sign a message containing the invitation token's details, proving they control the private key for the address to which they were invited. This guardian signature is then submitted to a recovery manager contract or stored off-chain in a secure location like IPFS. The contract logic must validate that the signing address matches an address in the recoverer's guardian set and that the invitation is still valid (not expired or revoked).

The actual recovery mechanism uses threshold cryptography. Instead of storing a full private key, the user's account access key is split into Shamir Secret Shares distributed among the guardians. For recovery, a predefined threshold (e.g., 3 out of 5) of guardians must submit their verified shards. A smart contract or secure off-chain service then reconstructs the key. It's vital that shards are never transmitted during the invitation phase; they are only generated and shared at the moment of recovery, often via a secure multi-party computation (MPC) ceremony to prevent any single guardian from having sufficient information beforehand.

Key security considerations include guardian revocation and invitation expiry. Users must be able to remove guardians or change the threshold without compromising security, requiring updates to the on-chain guardian set and potentially redistributing shards. Invitations should have a short time-to-live (TTL) to limit attack windows. Furthermore, the system should guard against Sybil attacks by ensuring guardians are distinct, independent entities, potentially by requiring a minimum stake or proof of unique identity.

Implementing this flow requires careful smart contract design. Below is a simplified example of a recovery contract function for verifying a guardian's commitment:

solidity
function verifyGuardian(
    address recoverer,
    address guardian,
    bytes memory guardianSignature,
    uint256 expiry
) public {
    bytes32 messageHash = keccak256(abi.encodePacked(recoverer, expiry));
    bytes32 ethSignedMessageHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", messageHash));
    require(isGuardian(recoverer, guardian), "Not a guardian");
    require(expiry > block.timestamp, "Invitation expired");
    require(recover(ethSignedMessageHash, guardianSignature) == guardian, "Invalid signature");
    // Store verification
    verifications[recoverer][guardian] = true;
}

This function checks the guardian's status, the invitation's expiry, and the cryptographic signature before recording the verification.

implementing-mpc-recovery
ARCHITECTURE GUIDE

Implementing Recovery with MPC and Threshold Signatures

Design a secure, user-friendly recovery system for smart accounts using Multi-Party Computation (MPC) and a trusted contact model.

A recovery system using Multi-Party Computation (MPC) and trusted contacts allows a user to regain access to their account if they lose their primary key. The core principle is threshold cryptography: a new signing key is generated and split into secret shares distributed among a set of trusted contacts (e.g., friends, family, or hardware devices). No single contact holds the complete key. To recover, a predefined threshold of contacts (e.g., 3 out of 5) must collaborate to reconstruct the key, which then authorizes a recovery transaction on-chain to assign a new primary key to the user's smart account.

Architecting this system requires a secure key generation ceremony. Using an MPC protocol like GG20 or Frost, the user and their contacts jointly generate a new ECDSA key pair in a decentralized manner. The private key is never assembled in one place. Instead, each participant receives a secret share. The corresponding public key is registered as the recovery key on the user's smart account contract, often via a module like a Safe{Wallet} module or a custom ERC-4337 account recovery extension. This setup is performed once during account initialization.

The on-chain smart contract is the enforcement layer. It defines the recovery policy: the list of trusted contacts (as Ethereum addresses), the required threshold, and a mandatory time-lock delay (e.g., 48 hours) to thwart malicious recovery attempts. When the threshold of contacts submits their shares, the MPC protocol reconstructs a signature authorizing the recovery. This signature, along with proof of the time-lock's expiration, is sent to the smart contract, which then executes the recovery—typically transferring ownership or updating the entry point for an ERC-4337 account.

Implementing the client-side logic involves libraries like ZenGo's multi-party-ecdsa or Bitcoin-S's frost. A basic flow in a Node.js environment for signature generation might look like:

javascript
// Participants generate shares
const participants = generateParticipants(n, t);
// Each participant runs this locally
const myShare = await mpcSign(participants[myIndex], messageHash);
// Shares are collected and combined off-chain
const finalSignature = await combineShares(collectedShares);

The recovered signature is then used in the contract call executeRecovery(newOwner, finalSignature).

Security considerations are paramount. The trusted contact set must be chosen carefully and updated over time. Using a social recovery module like Safe{Wallet}'s provides a battle-tested base. For ERC-4337, design your validateUserOp logic to check the recovery signature and time-lock. Always include a guardian revocation period and consider multi-factor recovery by mixing device shares with social shares. The system's resilience depends on the distribution and independence of the secret shares.

ARCHITECTURE COMPARISON

Security Risk Assessment and Mitigations

Comparing security trade-offs for different trusted contact recovery system designs.

Risk VectorCentralized CustodianMulti-Sig CouncilSocial Recovery Module

Single Point of Failure

Censorship Resistance

User Onboarding Complexity

Low

High

Medium

Recovery Time

< 1 hour

2-7 days

1-3 days

Attack Surface

Custodian servers

Signer key security

Module logic & guardian selection

Gas Cost per Recovery

$0

$50-200

$20-80

Requires Smart Contract

User Privacy Leakage

High (custodian sees all)

Medium (council sees user)

Low (guardians see user)

guardian-incentives-privacy
ARCHITECTING RECOVERY SYSTEMS

Guardian Incentivization and Privacy Considerations

Designing a secure and usable social recovery system requires balancing incentives for guardians with robust privacy protections. This guide covers the architectural trade-offs.

A social recovery system allows a user to designate trusted individuals or entities—guardians—who can collectively help recover access to a wallet if keys are lost. The core challenge is ensuring guardians are both reliable and privacy-respecting. Without proper incentives, guardians may ignore recovery requests. Without privacy, the social graph of a user's financial contacts becomes exposed on-chain, creating a significant security risk. Systems like the Safe{Wallet} and Ethereum Name Service (ENS) have implemented variations of this model, highlighting the need for careful design.

Incentivization models for guardians can be explicit or implicit. An explicit model might involve staking mechanisms, where guardians deposit collateral (e.g., in ETH or a protocol's native token) that is slashed for non-compliance or malicious behavior. An implicit model relies on social trust and reputation, which is harder to enforce programmatically but avoids gas costs and tokenomics complexity. For decentralized protocols, a hybrid approach is common: using a bonding curve or reward pool to compensate guardians for their time and gas expenses when executing a recovery, funded by a small fee from the wallet creation or transaction fees.

Privacy is a paramount concern. A naive implementation that stores guardian addresses directly in a public smart contract reveals relationships. Solutions include using commit-reveal schemes, where only a hash of the guardian set is stored on-chain initially. The actual addresses are revealed only during a recovery event. More advanced techniques involve zero-knowledge proofs (ZKPs), such as those explored by zkEmail or Sismo, to prove guardianship without disclosing the guardian's identity. Secure multi-party computation (MPC) can also be used to allow guardians to collaboratively sign a recovery transaction without any single guardian learning the new private key.

From an architectural perspective, the recovery logic should be decoupled from the core wallet contract. A common pattern is a Recovery Module that implements the ISocialRecovery interface, which the main wallet contract references. This allows users to upgrade or change their recovery mechanism without migrating assets. The module handles the guardian set management, delay periods (a critical security feature to prevent hostile takeovers), and the final execution of the recovery transaction, which typically changes the wallet's owner or signer public key.

Here is a simplified Solidity snippet illustrating a recovery module's core structure, focusing on the delay mechanism and guardian confirmation:

solidity
contract SocialRecoveryModule {
    address public wallet;
    address[] public guardians;
    uint256 public recoveryThreshold;
    uint256 public delayPeriod;
    mapping(bytes32 => RecoveryRequest) public recoveryRequests;

    struct RecoveryRequest {
        address newOwner;
        uint256 initiateTime;
        mapping(address => bool) confirmations;
    }

    function initiateRecovery(address _newOwner) external onlyGuardian {
        bytes32 requestId = keccak256(abi.encodePacked(_newOwner, block.timestamp));
        recoveryRequests[requestId].newOwner = _newOwner;
        recoveryRequests[requestId].initiateTime = block.timestamp;
        // Emit event for other guardians
    }

    function executeRecovery(bytes32 requestId) external {
        RecoveryRequest storage request = recoveryRequests[requestId];
        require(block.timestamp >= request.initiateTime + delayPeriod, "Delay not met");
        require(guardianConfirmations(requestId) >= recoveryThreshold, "Insufficient confirmations");
        IWallet(wallet).changeOwner(request.newOwner); // Call into main wallet
    }
}

This code shows the essential flow: initiation, a waiting period, confirmation by a threshold of guardians, and final execution.

When deploying such a system, audit the recovery logic with the same rigor as the core wallet. Key risks include guardian collusion, front-running of recovery transactions, and gas griefing attacks. Use established libraries like OpenZeppelin for access control and consider integrating with Gelato or Chainlink Automation for reliable time-based execution. The goal is a system where recovery is a last-resort safety net that is secure, private, and reliable enough that users never need to think about it—until they absolutely do.

TRUSTED CONTACT RECOVERY

Frequently Asked Questions (FAQ)

Common questions and technical details for developers implementing or integrating a trusted contact recovery system for smart contract wallets.

A trusted contact recovery system is a social recovery mechanism for smart contract wallets that allows a user to designate a set of trusted individuals or devices ("guardians") who can collectively help recover access if the user loses their primary private key. The core mechanism involves a multi-signature scheme embedded in the wallet's smart contract logic.

How it works:

  1. The wallet owner pre-defines a list of guardian addresses (e.g., friends, hardware wallets, other smart contracts).
  2. A recovery threshold is set (e.g., 3 out of 5 guardians).
  3. If access is lost, the owner (or a designated executor) initiates a recovery request to change the wallet's signing key.
  4. Guardians submit their approval signatures to the recovery module.
  5. Once the threshold of signatures is met, the smart contract executes the key change, restoring user access.

This model shifts security from a single point of failure (a seed phrase) to a social and configurable consensus, popularized by implementations like Safe{Wallet} (formerly Gnosis Safe) and EIP-4337 Account Abstraction wallets.

conclusion-next-steps
IMPLEMENTATION SUMMARY

Conclusion and Next Steps

This guide has outlined the architectural principles for building a secure, decentralized recovery system using trusted contacts. The next steps involve implementing these concepts in a production environment.

A robust recovery system is a critical component for any self-custody wallet or smart account. The architecture we've discussed—centered on a RecoveryModule smart contract, a network of Guardians, and a clear, multi-step recovery process—balances security with user autonomy. Key takeaways include the importance of social trust graphs over single points of failure, the use of time-locks and quorum thresholds to prevent unilateral control, and the necessity of on-chain verification for all guardian actions. This model directly addresses the single largest point of failure in crypto: the loss of private keys.

For developers, the next step is to implement and test the core RecoveryModule contract. Start by forking and examining established implementations from projects like Safe{Wallet} (formerly Gnosis Safe) or Argent, which have battle-tested recovery mechanisms. Your implementation should include functions for addGuardian(address guardian), initiateRecovery(address newOwner), confirmRecovery(bytes32 recoveryId), and executeRecovery(bytes32 recoveryId). Thoroughly test the contract's behavior under various scenarios, including guardian collusion, key loss simulations, and attempts to bypass the time-lock. Use a framework like Foundry or Hardhat for comprehensive unit and fork testing.

Beyond the smart contract, you must design the off-chain guardian coordination layer. This typically involves a backend service or a decentralized protocol that notifies guardians of a pending recovery request, provides a secure interface for signing approvals, and submits the aggregated signatures to the blockchain. Consider using WalletConnect for secure signing sessions or a Lit Protocol-based decentralized network for managing guardian signatures. The user experience for both the account owner and the guardians must be seamless and secure, minimizing the risk of phishing or confusion during a critical recovery event.

Finally, consider advanced features and integrations to enhance the system. Multi-chain recovery is essential; ensure your recovery module can be deployed and function across EVM-compatible chains like Ethereum, Polygon, and Arbitrum, potentially using a cross-chain messaging layer like LayerZero or Wormhole. Explore integrating with biometric hardware (e.g., WebAuthn) as a guardian option for non-technical contacts. Continuously monitor and audit the system, as recovery mechanisms are high-value targets for attackers. The goal is to create a safety net so reliable that users feel confident embracing true self-custody.