Holdfast

Commitment device · Base · USDC

Lock it away.
No early exit.

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
$0
total locked

Verify, don't trust

every promise here is enforced by code you can read

Immutable

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.

Ownerless

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.

Non-custodial

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.

No early exit

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.

Fee capped in code

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.

The fee, in full

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.

Read the contracts yourself

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.

A one-minute check before you deposit:
  1. On Basescan, confirm the green “Contract Source Code Verified” badge — it means the code shown is the code running.
  2. Read withdraw(): funds go only to the recorded recipient, and only once block.timestamp >= unlockTime. The caller can never redirect them.
  3. Search the source for owner, selfdestruct, delegatecall, or any upgrade/proxy hook — there are none.
  4. Read 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.

What's been checked — and what hasn't

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.

  • Built on OpenZeppelin (SafeERC20, ReentrancyGuard)
  • 33 automated tests, including fuzzing and a reentrancy-attack test
  • Full lifecycle proven on Base Sepolia — lock → fee → matured → release
  • Static analysis clean — Slither and Aderyn, no high or medium findings
  • Source verified on Basescan; ownerless and immutable, no admin key

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:

01

Choose a lock

each is its own immutable contract — the address is the promise
02

Lock USDC

MAX USDC
ME

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.

03

Your locks

Nothing locked yet
Once it's locked, it's locked. Choose a duration above and commit an amount.