Rolling your own.
A timelock is twenty lines, and we will not pretend otherwise. The contract was never the hard part — everything that has to exist around it is, and that is where an afternoon turns into ongoing maintenance nobody budgeted for.
The part that is easy#
A single-beneficiary timelock is short enough to read in one screen, and there is nothing clever in it.
contract Timelock {
address public immutable owner;
IERC20 public immutable token;
uint256 public immutable unlockTime;
constructor(address t, uint256 u) { owner = msg.sender; token = IERC20(t); unlockTime = u; }
function withdraw() external {
require(msg.sender == owner, "not owner");
require(block.timestamp >= unlockTime, "locked");
token.transfer(owner, token.balanceOf(address(this)));
}
}If your team writes Solidity, deploying this is an afternoon including tests. Anyone claiming the mechanism itself is hard is selling something.
The part that is not#
The contract is the smallest component of the job. What follows is the rest of it.
| What you still need | Why it is not optional |
|---|---|
| Verified source on the explorer | An unverified lock contract proves nothing to anyone. If they cannot read it, they cannot check it. |
| A page a non-technical holder can read | Most of the people you are reassuring cannot read a contract. A link to a raw address does not do the job. |
| Correct handling of odd tokens | Fee-on-transfer tokens deposit less than you sent. Tokens that return no boolean break naive transfers. Both are common. |
| An extend path | Without one you have to withdraw and re-lock, which creates exactly the gap a lock exists to avoid. |
| Ongoing discoverability | A bespoke contract appears in no explorer, no aggregator and no directory. Nobody finds it unless you tell them. |
| Credibility of a contract only you have seen | A one-off address is precisely the shape a fake lock takes. Yours is real; it looks the same from outside. |
That last row is the one teams underestimate. A custom lock contract asks holders to audit your code before they can trust your commitment, which is a larger ask than the commitment itself, and most of them will simply decline.
The narrow case for building it#
It is worth naming honestly, because it is narrower than it first looks.
- You need logic no general locker has. Multi-sig release, oracle conditions, milestone-gated unlocks, governance-controlled schedules.
- The asset is not an ERC-20. An NFT position, a staked receipt or a bespoke token standard needs a contract built for it.
- You are locking at a scale where a per-lock fee actually matters. At a large enough count, deployment amortises.
- Your team already ships audited Solidity and the lock is a small addition to an existing system you maintain anyway.
Where the reasoning usually breaks down#
- To save the fee. A flat 0.005 ETH against an afternoon of engineering plus indefinite maintenance is not a close call.
- Because a general locker feels like a dependency. It is not one — the contracts run without our site, and you can call
withdrawfrom a block explorer if hoodlock.tech vanishes entirely. - Because you want control. A lock exists to remove your control. A contract you wrote and could redeploy reads as less binding, not more.
That third point is the counterintuitive one. The value of using a shared, public, verified locker is precisely that you did not write it. Nobody has to consider whether you left yourself a door. The security model names the functions to check, and they are the same functions on every lock we hold.
What most teams land on#
Lock the ordinary balances — creator supply, treasury, LP — where they are discoverable and checkable without effort, and reserve bespoke contracts for the rare case that genuinely needs logic nothing offers. Teams that start by building their own almost always end up wanting a shared, public locker for the straightforward cases anyway, because that is where the credibility comes from rather than the mechanics.
What you would be comparing against#
| Your own contract | HoodLock | |
|---|---|---|
| Cost | Engineering time, then gas | 0.005 ETH flat, plus gas |
| Verification | Yours to do | Verified on Blockscout |
| Public proof page | Yours to build | Generated per record |
| Extend without a gap | Yours to implement | Built in, free |
| Fee-on-transfer safety | Yours to handle | Records the balance gained; rebasing tokens unsupported |
| Discoverable by strangers | No | In the explorer |
| Custom release logic | Anything you write | Linear vesting, or a single date |
How to choose a token locker covers the criteria to apply to any option, including this one.
Skip the afternoon of engineering
Flat 0.005 ETH per lock, a verified contract you did not have to write, and a proof page generated for you.
Open HoodLock →