Locks no one can open early.

Lock tokenized stocks or meme-token supply on Robinhood Chain. No admin keys: only you can withdraw, after your date.

Asset
1 year
Virtuallock lock receiptPreview
Asset
TSLATesla, Inc., stock token
Unlocks
11 Oct 2027 19:00 UTC
Burn at exit
Off for stock tokens
Fee
0.0025 ETH flat, read from the contract

withdraw() reverts until 11 Oct 2027 19:00 UTC

No one can withdraw before this date. Not even us.

Logos are trademarks of their owners and are shown for identification only.

One contract, two kinds of lock.

Tokens

Lock your supply. Prove it on-chain.

Liquidity and team tokens, locked by a contract with no owner.

  • Optional burn-on-exit, up to 100%
  • A public proof page and receipt for every lock
  • Unlock dates can only move later
Lock a token
Active locks
0
Tokens locked
0
Next unlock
None scheduled
See token locks

How a lock works

  1. 01 / Deposit

    Deposit

    Pick a token, an amount and an unlock date. The tokens move into the contract in one transaction.

  2. 02 / Wait

    Wait

    The countdown runs on chain time. Nobody, including us, can release the tokens early.

  3. 03 / Extend

    Extend

    The depositor can push the unlock date later to show commitment. It can never move earlier.

  4. 04 / Exit

    Withdraw or burn

    After the date, only the depositor can withdraw. Any burn-on-exit share goes to the dead address in the same transaction.

Live on-chain

Every lock and burn is public.

Latest activity

See all on Explore

No locks on this network yet.

Be the first lock

Next unlocks

No upcoming unlocks.

Active locks

Ring: lock length. Position: time to unlock.

Burn

Burn with a public receipt.

Send tokens to the dead address, or cut total supply where the token supports it, through one router with no admin. Every burn gets an id anyone can check.

  • One flat fee per burn, never a share of your tokens.
  • A lock can also burn a share at withdrawal: set it once, it runs when the depositor withdraws.
  • Stock tokens are never burned. Burning a tokenized share would destroy the claim behind it.

Coming soon on this network.

Virtuallock burn receiptExample
Burned
25,000,000 ROCKET
Method
Sent to the dead address
Memo
season-2
Example receipt. A real one links its transaction.

Airdrops

Airdrops that prove they're funded.

Deposit the whole drop before you announce it. Holders see funded, claimed and remaining on the claim page, straight from a contract with no admin.

  • Fully funded at creation. The list can't change and nobody can pull the tokens mid-drop.
  • Tokens arrive liquid, or locked or vesting on a schedule the project sets.
  • After the deadline, the project can reclaim whatever is left unclaimed.
Create an airdrop
$DEMO community dropExample
Funded
2,500,000
Claimed
974,520
In escrow
1,525,480
503 of 1,284 walletsDeadline 15 Jan 2027
Funded
100% before announcement
Admin keys
None
Example drop. A real one links its escrow and funding transaction.

Developers

Build on the same contracts.

@vaultline-app/sdk
const { lockId } = await vl.lock({
  token: "0xToken",
  amount: 25_000_000n * 10n ** 18n,
  unlockAt: new Date("2027-10-03"),
});
await vl.extendLock({ lockId, unlockAt: new Date("2028-01-01") });

Typed TypeScript on viem. Fees are read on-chain before each call; none is hardcoded.

Public API

Any token's locked and burned figures as JSON. Free, no key.

GET /api/v1/tokens

Embeddable badge

Show what is locked on your own site. It updates itself.

Live Virtuallock lock badgeGet the snippet on a token page

Partner fee

Apps that route burns receive part of each burn fee, paid on-chain by the router. Pass your address as partner in the SDK.

Read it yourself in five minutes.

Ownership
None. No admin role exists
Upgradeability
None. Immutable, no proxy
Unlock direction
Extend-only
Reentrancy guard
Enabled
Static analysis
Slither on every change, 0 high-severity findings
Source
Verified, open source
TokenLock.solline 131
function extendLock(uint256 lockId, uint64 newUnlockTime) external {
    LockInfo storage lock = _locks[lockId];
    if (lock.owner == address(0)) revert LockNotFound();
    if (msg.sender != lock.owner) revert NotLockOwner();
    if (lock.withdrawn) revert AlreadyWithdrawn();
    if (newUnlockTime <= lock.unlockTime) revert UnlockTimeCannotDecrease();

    lock.unlockTime = newUnlockTime;
    emit LockExtended(lockId, newUnlockTime);
}

The only function that changes an unlock date. A new date at or before the current one reverts.

Every lock comes with a receipt.

Each lock gets a public page with every term and a link to the transaction behind it. It's an on-chain record anyone can check.

Lock passExample
Lock #842 · Robinhood ChainLocked

250,000,000ROCKET

Rocket (example meme token) · 0x0000…00e1

182days left
Unlocks
11 Apr 2027
Burn at exit
10%
tx
0x9e3779b9…1d0c18e95found
block
21,904,118 8 Oct 2026 · 18:27 UTCfinal
contract
TokenLock no owner · no upgradeverified
event
LockCreated decoded7 / 7
lockId
842uint256
token
ROCKET 0x0000…00e1address
amount
250,000,000uint256
depositor
0x0000…00a1address
unlockTime
11 Apr 2027 · 18:27 UTCuint64
burnBps
1000 (10%)uint16
lockedAt
8 Oct 2026 · 18:27 UTCuint64
Read from the chain, not from our database.