Documentation

Velo Protocol

Velo is an oracle-priced perpetual futures protocol with a social layer, fully operational on Base Sepolia. Every order, position, and settlement happens on-chain — no off-chain matching engine, no custody, no trust required.

17 markets up to 25× leverage Priced by Pyth Base Sepolia · 84532

Introduction

Velo is a decentralised perpetual futures exchange where every trade is a real blockchain transaction. Underneath the trading terminal, a full social product lets traders post, follow, copy-trade, and compete on a transparent, on-chain-verified leaderboard. The trading floor and the community are the same room.

The protocol is live on Base Sepolia today. Mainnet follows a security audit — see the roadmap.

Testnet

Velo currently runs on Base Sepolia with mock USDC (mUSDC) minted from a faucet. No real funds are at risk while the protocol is in testnet.

What Velo is

There is no traditional order book matching buyers and sellers. Instead, every trade is priced against a live Pyth Network oracle feed, collateral is held in the VeloPerps smart contract, and PnL is settled against a liquidity pool on close. This architecture means:

  • Zero slippage on execution up to pool capacity — you get the oracle price, not a market-impact price.
  • Instant settlement — positions open and close in a single transaction.
  • Trustless liquidations — anyone can liquidate an underwater position for a 1% bounty; Velo runs its own keeper as a safety net.
  • Verifiable everything — every position has a transaction hash; every closed trade has an on-chain proof.

How it works end-to-end

Onboarding — one signature, no popups

  1. Connect a wallet via Reown AppKit (MetaMask, WalletConnect, Coinbase Wallet, or social login).
  2. Choose a @username — validated for format, verified on-chain for uniqueness via VeloRegistry.
  3. Sign one personal_sign message — this derives your Velo Trading Wallet.
  4. The rest is automatic: the gas sponsor sends 0.01 ETH, the wallet mints 1,000 mUSDC from the faucet, and your handle registers on-chain — with zero further popups.

Opening & closing a position

Pick a pair, choose LONG or SHORT, set collateral and leverage (up to 25×), and submit — the trading wallet signs locally. The contract fetches the Pyth price, pulls collateral, charges a 0.10% open fee, and stores the position. Closing reads the current oracle price, computes PnL, deducts a 0.10% close fee, and returns the net payout.

The Velo Trading Wallet

The Velo Trading Wallet (a session key, sometimes called the burner) is what makes Velo feel like a web2 app. It is a regular Ethereum account whose private key is derived deterministically from a single MetaMask signature.

Main Wallet (MetaMask) → signs VELO_DERIVATION_MESSAGE (fixed string + chain ID) → 65-byte signature (r ‖ s ‖ v) → keccak256(signature) → 32-byte hash → this hash is the trading wallet's private key

Because personal_sign is deterministic, the same main wallet always derives the same trading wallet. Recovery is automatic — sign the same message on any device to re-derive the same key.

  • Every trade signs locally in the browser — zero MetaMask popups after setup.
  • The trading wallet holds only the funds you explicitly move there; the main wallet stays cold.
  • The key can be exported from Settings and imported into any EVM wallet.

Order types & execution

Market

Executes immediately at the current Pyth oracle price; confirms in one block.

Limit & Stop

Set a trigger price. The order is stored fully on-chain with collateral locked immediately. A keeper scans open orders every minute and executes when the mark reaches the trigger — the contract re-validates the trigger on-chain, so a keeper cannot fill at the wrong price.

Take-profit & Stop-loss

Set via setTriggers(). The TP/SL keeper calls closeIfTriggered() when the mark crosses the trigger. A 0.25% keeper bounty is paid from the close payout.

Partial close

Close any fraction of a position (1–100%); the contract resizes proportionally and returns the payout pro-rata.

Trigger price vs fill price

This is the most important thing to understand about oracle-priced perps, and it is identical behaviour to GMX, Gains Network, and every other oracle perp. When a keeper executes an order, a fresh Pyth price is pushed on-chain and used for both the trigger check and the PnL calculation.

The price you set is the trigger — the threshold the keeper watches. The fill is the live oracle price at the moment the keeper's transaction mines, which can differ by a few dollars depending on movement in the window between the trigger being hit and the keeper's next tick.

Example

A limit buy on ETH at $2,000 fills at $1,998 if price dipped when the keeper fired — price improvement. On mainnet with a fast keeper this spread narrows to near-zero; on Base Sepolia's once-per-minute cron you may see a few dollars of variance in volatile markets. This is a testnet infrastructure characteristic, not a protocol flaw.

Price oracle & execution model

Velo uses Pyth Network as its oracle with a pull-model architecture. Every transaction that needs a price fetches a fresh update from Pyth's Hermes gateway, passes it as calldata, and the contract charges the exact getUpdateFee() in ETH and reads a price no older than 60 seconds.

Velo reads Pyth and only Pyth across the entire interface, so every number agrees with the price you actually fill at — the live mark streams from Pyth's Hermes SSE endpoint, chart candles come from Pyth symbols, and fills, entries and PnL are the on-chain Pyth price.

BTCETHSOLAVAXLINKDOGENEARINJAPTARBOPSUITIASEIRENDERWLFIPOL

Keeper infrastructure

Velo runs three automated keeper jobs, each executing every minute via Vercel Pro cron:

  • Limit/Stop keeper — reads open conditional orders, fetches fresh Pyth prices, and executes triggered orders in parallel.
  • TP/SL keeper — reads open positions, evaluates TP/SL off-chain with the same arithmetic as the contract, and submits triggered closes.
  • Liquidation keeper — computes unrealised PnL off-chain and liquidates positions where loss ≥ 90% of collateral; the 1% bounty makes it partially self-funding.
Pyth fee exactness

The contract enforces msg.value == PYTH.getUpdateFee(updateData) with strict equality. All keepers query the exact fee on-chain before every submission — any deviation reverts with PythFeeMismatch.

Protocol fees

No spread, no withdrawal fee, no hidden markup. Fees accrue inside the contract and only the protocol owner can withdraw them.

ActionRate
Open fee0.10% of collateral
Close fee0.10% of gross payout
TP/SL keeper bounty0.25% of net payout
Liquidation bounty1.00% of collateral

The social layer

  • The feed — a real-time post feed with $TICKER cashtags; every embedded trade card carries an on-chain tx hash for verification.
  • Profiles — every wallet is a public profile with realised PnL, win rate, average leverage and full trade history.
  • Shareable trade cards — closed positions render to a 1200×675 canvas with Obsidian, Gradient, or Hologram styles.
  • On-chain handles@usernames live in VeloRegistry; the Send modal resolves a handle to an address on-chain.

Leaderboard & copy-trading

The leaderboard ranks every trader by realised PnL computed from on-chain trade history — rankings cannot be faked. Copy-trading lets any user subscribe to a trader's positions; when the leader opens a position, the copier's session key mirrors it proportionally.

Coming soon

One-click copy-trading is rolling out alongside on-chain Velo Vaults — see the roadmap below.

Cross-chain deposits & withdrawals

Velo mUSDC is a LayerZero V2 OFT deployed on four Sepolia testnets. Deposit from any chain into your Base Sepolia trading wallet, and withdraw to any chain or address. Cross-chain transfers arrive on Base in 1–3 minutes; the Send modal resolves @usernames via VeloRegistry.

Tech stack

Smart contracts

Solidity 0.8.22FoundryOpenZeppelin 5.xPyth EVM SDKLayerZero V2 OFT

Frontend

React 19Vite 6TypeScriptwagmi v2 + viemReown AppKitTradingView

Backend & infra

SupabasePyth HermesVercel ServerlessBase Sepolia

Deployed contracts

All contracts are verified on BaseScan. The active engine reports its version on-chain (VERSION = 31).

ContractChainAddress
VeloPerps v3.1
active engine
Base Sepolia0x41fD…e907 ↗
VeloMockUSDC
collateral · LZ OFT
Base Sepolia0x5EFa…6699 ↗
VeloRegistry
@handle resolver
Base Sepolia0x7e51…ECe2 ↗

Mainnet roadmap

  • Now — Testnet (Base Sepolia). Fully operational: all order types, three keepers, social layer, cross-chain bridging, provable trade history.
  • V2 — Mainnet (Base). After audit: real USDC, an insurance fund, hourly funding rate, a Chainlink sanity oracle, and 3-of-5 multisig ownership.
  • V3 — Velo Vaults. On-chain copy-trading vaults with rules (performance fee, lockup, max drawdown) coded in Solidity.
  • V4 — Governance token. Issued to early traders, vault leaders, and keepers by verifiable on-chain activity — no presale, no IDO.
  • V5 — Multi-venue routing. Vaults route to any compatible execution venue for best execution.