Overview
GRAVE is a non-custodial last-will protocol on Robinhood Chain. You lock assets in a vault only you can move; if you stop checking in, your beneficiaries claim their shares — no probate, no custodian, no admin key.
This guide walks through the full user journey in the GRAVE dApp, then provides the network and contract reference developers need to integrate or verify the protocol directly. For the design rationale and security model, read the whitepaper.
Each owner address controls exactly one vault. The factory maps your address to your vault, so re-connecting the same wallet always returns you to the same will.
Quick start
Five steps take you from a fresh wallet to a fully funded, self-executing will:
- Connect a wallet and switch to Robinhood Chain.
- Create your vault: set a check-in interval, a grace period, beneficiaries, and optional guardians.
- Deposit ETH and RWA Stock Tokens into your vault.
- Check in on schedule to prove you are alive and reset the countdown.
- If check-ins ever stop past the deadline, anyone can execute and your beneficiaries claim.
Connect a wallet
The dApp uses Reown AppKit (WalletConnect) — a multi-wallet modal supporting Trust, MetaMask, Binance, SafePal and 80+ wallets, including mobile via QR code and deeplink. If AppKit cannot load, the dApp automatically falls back to a basic injected-wallet connection.
- Open app.grave.cash and click Connect.
- Pick your wallet from the modal (or scan the QR with a mobile wallet).
- Approve the connection request in your wallet.
Add the network
If your wallet is not yet on Robinhood Chain, the dApp will prompt you to add and switch networks. Approve the request, or add it manually with the values in the network reference below. Gas is paid in ETH.
Create a will
Creating a vault deploys your own GraveVault contract through the factory. You set
four things:
| Field | What it means |
|---|---|
| Check-in interval | How long you may go silent before the grace period starts. Choose a cadence you can comfortably keep (e.g. monthly, quarterly). |
| Grace period | An extra buffer after the interval. A single check-in during this window resets everything, so give yourself room for travel or illness. |
| Beneficiaries | Addresses and their shares in basis points. All shares must sum to exactly 10,000 (100%). |
| Guardians (optional) | Trusted addresses allowed only to check in on your behalf. They can never withdraw, redirect, or trigger execution. |
Shares are expressed in basis points: 5,000 bps = 50%, 2,500 bps = 25%. The dApp validates that your allocation sums to 10,000 before letting you submit.
Deposit assets
Your vault can hold ETH and any ERC-20 — including RWA Stock Tokens — that you deposit.
ETH
Send ETH directly to your vault address, or use the deposit control in the dApp. The vault's
receive() function accepts ETH and emits a Deposited event.
RWA Stock Tokens & ERC-20s
Depositing a token is a two-step flow: first approve the vault to move the amount,
then call depositToken(token, amount), which pulls the tokens in and tracks them.
The dApp offers curated Stock Token shortcuts in the deposit panel, and any ERC-20 address also
works via manual entry.
// 1) Approve the vault on the token
token.approve(vault, amount);
// 2) Pull the tokens into the vault (owner only, while active)
vault.depositToken(token, amount);
If you transfer a token directly to the vault (without depositToken), call
trackToken(token) so it is included in the execution snapshot. Untracked tokens
are not distributed to beneficiaries.
Check in
A check-in is your proof of life. Calling checkIn() stamps the current time and
resets the countdown to the full interval plus grace period. You can check in any time — early
is fine — and you can do it as often as you like.
- The owner can always check in.
- Any guardian you appointed can also check in on your behalf.
- The onchain
deadline()andisExpired()views always show your current status.
The dApp surfaces your next deadline and can remind you before your window closes. Keeping a regular cadence is the single most important habit for a GRAVE owner.
Execution & claims
If check-ins stop and block.timestamp passes the deadline, the vault becomes
expirable. From that point:
- Anyone can call
execute(). It flips the vault to executed and snapshots ETH and every tracked token balance. - Each beneficiary calls
claim()once to pull their fixed share of ETH and every token:snapshot × bps / 10,000. previewClaim(address)shows what a beneficiary would receive before they claim.
Because balances are frozen at execution, beneficiaries can claim independently and in any order without affecting one another. Once executed, owner controls are permanently locked.
Manage your vault
While the vault is active and un-executed, the owner can adjust the will at any time:
| Action | Function |
|---|---|
| Change the schedule | setSchedule(interval, grace) |
| Update beneficiaries & shares | setBeneficiaries(accounts, bps) |
| Add or remove a guardian | setGuardian(guardian, enabled) |
| Withdraw ETH | withdrawETH(amount, to) |
| Withdraw a token | withdrawToken(token, amount, to) |
Updating the schedule also refreshes your last check-in, so changing your cadence never accidentally shortens your current window.
Network reference
GRAVE runs on Robinhood Chain, an Arbitrum-Orbit L2. Gas is paid in ETH.
| Network | Chain ID | RPC | Explorer |
|---|---|---|---|
| Mainnet | 4663 | https://rpc.mainnet.chain.robinhood.com | robinhoodchain.blockscout.com |
| Testnet | 46630 | https://rpc.testnet.chain.robinhood.com/rpc | explorer.testnet.chain.robinhood.com |
Get testnet ETH at faucet.testnet.chain.robinhood.com. The deployed
GraveFactory on mainnet is 0x3Fa87f229c42d892a91f0DfeFC85c21F4cddd6A0.
Contract reference
The protocol is two contracts. Read the full source in contracts/src/.
GraveFactory
| Function | Description |
|---|---|
createVault(interval, grace, accounts, bps, guardians) | Deploys the caller's vault and returns its address. |
vaultOf(address) → address | Returns the vault for an owner (or zero if none). |
vaultCount() → uint256 | Total vaults deployed. |
event VaultCreated(owner, vault) | Emitted on each deployment. |
GraveVault — owner
| Function | Description |
|---|---|
checkIn() | Proof of life. Owner or guardian; resets the countdown. |
depositToken(token, amount) | Pull an approved ERC-20 into the vault and track it. |
trackToken(token) | Register a token sent directly to the vault. |
withdrawETH(amount, to) / withdrawToken(token, amount, to) | Owner withdrawals while active. |
setSchedule(interval, grace) | Update the timing; refreshes last check-in. |
setBeneficiaries(accounts, bps) | Replace the beneficiary set; shares must sum to 10,000. |
setGuardian(guardian, enabled) | Add or remove a guardian. |
GraveVault — execution & views
| Function | Description |
|---|---|
execute() | Permissionless once expired. Snapshots balances, opens claims. |
claim() | A beneficiary pulls their fixed share, once. |
previewClaim(account) | Preview a beneficiary's ETH + token amounts. |
deadline() / isExpired() | Current expiry timestamp and status. |
getBeneficiaries() / getTokens() | Read the beneficiary set and tracked tokens. |
executed() / executedAt() | Execution status and timestamp. |
Deploy the factory (developers)
The factory is deployed with Foundry. Deploy once per network, then point the dApp config at the printed address.
# from contracts/
forge install foundry-rs/forge-std
export PRIVATE_KEY=0x... # a funded deployer key
# Testnet
forge script script/Deploy.s.sol:Deploy \
--rpc-url robinhood_testnet --broadcast --private-key $PRIVATE_KEY
# Mainnet
forge script script/Deploy.s.sol:Deploy \
--rpc-url robinhood --broadcast --private-key $PRIVATE_KEY
Copy the printed GraveFactory address into js/config.js
(FACTORY.testnet / FACTORY.mainnet), set your Reown project id in
WALLETCONNECT_PROJECT_ID, and allowlist your domain in the Reown dashboard.
FAQ
Does GRAVE ever take custody of my assets?
Never. Assets stay in a vault only you control until — and only until — your conditions are met onchain. GRAVE has no admin key and cannot move your funds.
What if I forget to check in?
You get a grace period after your interval, and reminders before it closes. A single check-in during the grace window resets everything. Guardians can also check in for you.
Is a GRAVE will legally binding?
GRAVE is a technical execution layer, not a law firm. It complements — not replaces — a legal will. Consult local regulations for your jurisdiction.
What if a beneficiary loses their wallet?
Plan beneficiary wallets carefully; social-recovery flows are on the roadmap. See the threat analysis for detail.