Buy in.
Sell slowly.

HODL is the coin you can't dump. Every purchase starts locked and unlocks 5% at a time, every 5 minutes, until all of it is yours to sell 100 minutes later.

Total supply
Vested · locked
Unvested · sellable

How it works

One rule, applied to every purchase, enforced by the token itself.

  1. 01

    You buy

    Your tokens land in your wallet, but they start locked. There's no selling straight after buying.

  2. 02

    5% unlocks every 5 minutes

    Each purchase unlocks in 20 equal clips. Buy $100 and $5 becomes sellable every 5 minutes.

  3. 03

    Fully unlocked in 100 minutes

    After 20 clips the whole purchase is free to sell. Buy again and that purchase runs its own clock.

Enforced on-chain by the token contract on every transfer. Nothing to claim — clips unlock on their own as time passes.

Try it

Pick an amount and slide through the first 100 minutes.

Any amount. The rule is the same at every size.

Sellable now
$15.003 of 20 clips
Still locked
$85.00
Per clip
$5.00every 5 min

The contracts

HODL's sell rules live in the token contract itself, in the transfer function that runs on every sell and every send. It's verified on Blockscout and can't be changed: the schedule and the exempt list are written once at launch, there is no release function, and ownership of the token is renounced before trading opens.

LaunchToken.solSolidity · excerpt
// LaunchToken.sol — the sell-vesting functions, copied without changes from the verified token contract.
//
//   - every buy is recorded per wallet with the block time it arrived (one lot per buy)
//   - each lot unlocks 5% every 5 minutes (20 tranches, fully unlocked 100 minutes after that buy)
//   - anything leaving a wallet must come out of the unlocked part, or the transfer reverts

/// @notice Tokens `a` cannot move yet. Each lot unlocks 1 / vestSteps per step, counted from the exact time the
///         lot arrived, so the first tranche is sellable exactly one step after the buy.
function lockedBalanceOf(address a) public view returns (uint256 locked) {
    if (vestSteps == 0 || vestExempt[a]) return 0;
    Lot[] storage lots = _lots[a];
    for (uint256 i = _lotHead[a]; i < lots.length; ++i) {
        (, uint256 lockedAmt) = _lotState(lots[i]);
        locked += lockedAmt;
    }
}

/// @notice What `a` can sell or send right now.
function unlockedBalanceOf(address a) external view returns (uint256) {
    uint256 bal = balanceOf(a);
    uint256 locked = lockedBalanceOf(a);
    return bal > locked ? bal - locked : 0;
}

/// @dev A lot's amount and how much of it is still locked (0 once fully vested). Rounded up: a wei never unlocks early.
function _lotState(Lot storage l) private view returns (uint256 amount, uint256 lockedAmt) {
    uint256 steps = vestSteps;
    uint256 elapsed = (block.timestamp - l.start) / vestStepSeconds;
    amount = l.amount;
    if (elapsed < steps) lockedAmt = (amount * (steps - elapsed) + steps - 1) / steps;
}

function _requireUnlocked(address from, uint256 value) private {
    _prune(from);
    uint256 locked = lockedBalanceOf(from);
    if (locked == 0) return;
    uint256 bal = balanceOf(from);
    uint256 free = bal > locked ? bal - locked : 0;
    if (value > free) revert TokensStillVesting(free, value);
}

/// @dev Stamp a purchase with the block time. Past MAX_LIVE_LOTS live lots the buy merges into the newest lot with
///      an amount-weighted start: dust cannot move a real purchase's clock and a large buy cannot borrow an older
///      clock, since the weighted start sits between the two and total unlocked value is preserved.
function _recordLot(address to, uint256 value) private {
    if (value == 0) return;
    (Lot[] storage lots, uint256 head) = _prune(to);
    if (lots.length - head >= MAX_LIVE_LOTS) {
        Lot storage last = lots[lots.length - 1];
        uint256 total = uint256(last.amount) + value;
        uint64 start = uint64((uint256(last.start) * last.amount + block.timestamp * value) / total);
        last.start = start;
        last.amount = uint192(total);
        emit VestingLot(to, start, value);
    } else {
        lots.push(Lot({start: uint64(block.timestamp), amount: uint192(value)}));
        emit VestingLot(to, uint64(block.timestamp), value);
    }
}

/// @dev Every transfer, sell and send goes through here.
function _update(address from, address to, uint256 value) internal override {
    if (vestSteps != 0) {
        // Whatever leaves a non-exempt address must be unlocked; whatever a non-exempt address receives from
        // exempt plumbing (a buy) starts a lot. Mints and exempt-to-exempt moves are untouched.
        if (from != address(0) && !vestExempt[from]) _requireUnlocked(from, value);
        super._update(from, to, value);
        if (to != address(0) && !vestExempt[to] && vestExempt[from]) _recordLot(to, value);
        return;
    }
    super._update(from, to, value);
}