Search projects, hackathons, sponsors and tech

    ← All projects

    Legacy

    Self-custodial crypto inheritance on World Chain: check in with World ID, or heirs inherit.

    Demo

    About

    Legacy is a way to make sure your crypto goes to the right people if something happens to you, without needing a lawyer, a bank, or anyone else holding your assets in the meantime. The problem: If you hold crypto and you pass away or become unable to access your wallet, your family usually has no way to get it. There's no company to call, no account recovery form, no paper trail. The assets just sit there, locked forever, unless you've shared your private keys with someone, which brings its own risks. How Legacy works: You create a vault, which is a smart contract that only you control. You move assets into it, and you choose who your heirs are. To prove you're still alive and in control, you check in from time to time using World ID, which scans your eyes to confirm you're a real, unique person, without ever storing your face or sharing your identity with anyone. Each check-in resets a timer. If you keep checking in, nothing happens. Your vault stays active and only you can use it. If you stop checking in, the vault moves through three stages: 1. Active. You're checking in on schedule. Full control stays with you. 2. Grace period. You missed a check-in, but there's a buffer window before anything changes. One check-in during this time brings you right back to normal. 3. Claims open. The grace period has passed. Your heirs can now start a claim on the assets assigned to them. Even after a claim starts, you're not locked out. There's a waiting period built in, and if you check in with World ID at any point during it, the claim is cancelled immediately. This protects against mistakes, like a claim started because you were traveling or lost access temporarily, not because anything actually happened to you. You can also name guardians, people you trust, who can confirm that you've passed away. If all of them agree, the waiting periods shrink dramatically so your heirs don't have to wait unnecessarily. What you can leave behind: You can assign specific assets, ETH, ERC-20 tokens, or NFTs, to specific heirs. You can also leave a private message or video for an heir, sealed so that only they can open it, and only after the vault has passed to them. Nobody, including us, can open it before that. Why it's safe: Every vault is its own separate contract. Nothing is pooled together, so there's no shared risk between users. There's no admin key, no company account, and no way for anyone else to move your assets. The rules are enforced entirely by code on World Chain, and anyone can look up a vault's status publicly to check whether an owner is still active. Who it's for: Anyone holding crypto who wants a plan for what happens to it if they're no longer around to manage it themselves, without giving up control while they're alive, and without trusting a third party to hold the keys.

    How it's made

    Smart contracts: The core is written in Solidity and built with Foundry. LegacyVault holds the actual logic: check-ins, heirs, guardians, and asset claims. Instead of deploying a full copy of that contract for every user, a LegacyVaultFactory uses EIP-1167 minimal proxy clones, so creating a new vault is cheap and each one is still fully independent, with its own storage and no shared risk between users. We used OpenZeppelin's Initializable for the clone pattern and ReentrancyGuardTransient to protect the asset claim function. For proof of life, a WorldIDVerifierAdapter wraps World ID's Semaphore verifier. It checks a zero knowledge proof against a nullifier tied to each vault, so we can confirm a real, unique human checked in without ever learning who they are. On testnet we point this at a mock verifier, since World ID's canonical bridged Merkle tree can't be populated permissionlessly outside its production router, so this is the one piece where testnet and mainnet behavior genuinely differ, and we made sure the frontend warns users clearly when a vault is on the wrong one. Assets are handled through small adapter contracts, one each for ERC20, ERC721, and ENS names, all implementing the same IVaultExecutor interface. This means adding support for a new asset type later just means writing one more adapter, not touching the vault itself. Frontend: It's a Next.js app using wagmi and viem to talk to the chain, and Reown AppKit for wallet connections. The World ID orb proof itself comes from the official IDKit widget. One detail we had to work around: right after deploying a new vault, reading it back from the factory sometimes hit an RPC node that hadn't caught up yet, so the app now polls for a few seconds until the new vault actually shows up before opening it. Off chain layer: A few things don't belong on chain: vault nicknames, heir names, email alerts, and the sealed messages themselves. These live in MongoDB, but only as metadata. No off chain data ever decides who owns anything; the contract state is always the source of truth. The sealed message trick. This is the part we're most proud of. Owners can leave a private note or video for a specific heir, readable only after succession, and not even we can read it. Instead of asking users to manage a separate encryption key, we derive one from a wallet signature: personal_sign is deterministic, so signing the same fixed message always produces the same signature, which we hash into an X25519 keypair. The heir can always regenerate their key just by signing in again, with nothing to back up or lose. The owner encrypts to the heir's public key using an ephemeral keypair and XChaCha20-Poly1305, so the message is sealed the moment it's written and the owner has no way to open it again. Video works the same way, just at a different scale: the encrypted bytes go to blob storage instead of a database field, since videos are too large to store directly, and before decrypting, the heir's browser re-hashes the downloaded file and checks it against the hash the owner signed at seal time, so a swapped or corrupted file is caught before it's ever decrypted.