Commitment device · Base · USDC
Move USDC into a vault with a fixed timer. Until it runs out, nobody can pull it back — not even you. No admin key, no support line, no "unlock anyway" button. Made for the weekend you'd rather not fund.
Don't trust us — verify the contracts →The rules are fixed in bytecode at deploy. lockDuration, feeBps and the
fee address are immutable — no setter exists, and there is no proxy or upgrade path.
A 1-day vault can never become anything else.
There is no owner, admin, or Ownable — no pause switch and no privileged withdraw.
Nobody, including the author, can move, redirect, or unlock your funds. The privileged
surface is exactly zero.
This site never touches your money — it only builds transactions your wallet signs. Funds sit in
the vault contract and are released solely to the recipient you set, and only after
the timer ends.
withdraw() reverts until the deposit matures — the only gate is
block.timestamp >= unlockTime. There is deliberately no emergency exit and no
rescue function, for you or anyone else.
The fee is taken once at deposit and is hard-capped at 5% in the constructor — it can never be raised, switched on, or redirected later, and it grants no power over funds already locked.
Holdfast takes a small protocol fee.
It's charged once, at the moment you deposit — there is no withdrawal fee and
no ongoing fee, ever. The rate, the cap, and the address that collects it are all
immutable constructor values — and the rate can never exceed 5%, a hard ceiling
(MAX_FEE_BPS) enforced in the constructor so no vault can ever be deployed above it.
Nobody, including the author, can raise the fee, uncap it, or redirect it after a vault is live. The
fee touches only the fee slice at deposit and grants no power over funds already locked. The
figures above are read live from the deployed contract, not just printed here.
Each duration is its own deployed TimeLockVault, with source publicly verified on
Basescan. Open any of them and read the exact code that will hold your funds — line for line,
before you deposit a cent. This is the whole point: you don't have to take our word for anything.
withdraw(): funds go only to the recorded recipient, and only
once block.timestamp >= unlockTime. The caller can never redirect them.owner, selfdestruct,
delegatecall, or any upgrade/proxy hook — there are none.feeBps and feeCap straight off the contract and confirm they
match what's shown here. They're immutable, so they can't change after you lock.Holdfast holds money in an immutable contract — a bug could never be patched. Here's an honest account of the assurance behind it, strengths and limits.
SafeERC20, ReentrancyGuard)Not professionally audited. Automated tools and tests don't replace a human audit. This is a small personal project — only lock what you'd be comfortable losing.
Don't take our word for it — the raw tool output and the exact source are published:
This is the only address the funds can ever go to, and it's fixed the moment you lock — it can never be changed. It must be a self-custody wallet whose keys you hold. Never use an exchange or gambling-site deposit address: those are custodial and often one-time-use, so funds arriving later are typically not credited and are lost for good. The ME button fills in your connected wallet.
Connect a wallet to begin.