Make the call. Keep the proof.
Velo turns a real DreamDEX Event Contract position into a public market Call that can be shared while it is live and kept as a permanent receipt after settlement.
People make market calls publicly every day, but screenshots and posts do not prove they actually took the position. Velo connects the opinion to a real trade.
A Call only exists after Velo verifies that the connected wallet actually filled a DreamDEX position on Somnia.
- Landing: https://velo-rho-jet.vercel.app/
- Markets: https://velo-rho-jet.vercel.app/app
Choose a live DreamDEX market
↓
Pick Higher or Lower
↓
Enter stake and sign the real trade
↓
DreamDEX fills the position
↓
Velo verifies the transaction + fill
↓
Public Call is created
↓
Share it while live
↓
Another trader can independently Back the Call
↓
Market settles
↓
The same Call becomes a permanent receipt
↓
Receipts compound into the trader's public profile
Velo is not an automatic copy-trading system. Backing a Call creates a new independent position at the price available when the second trader acts.
DreamDEX already provides the hard market infrastructure: live Event Contracts, probability-priced order books, outcome tokens, execution and settlement.
Velo adds the identity and proof layer around those primitives.
The core idea is simple:
A market opinion should be able to carry proof that the trader actually acted on it.
Instead of disappearing as a screenshot or post, a Call becomes part of a persistent record of conviction and outcomes.
/app
The main product surface reads real DreamDEX binary Event Contract windows and presents them as a live market board.
Users can:
- filter BTC and ETH markets
- filter available time windows
- switch between card and list views
- see Higher / Lower probabilities from the live order book
- inspect real market probability history
- see countdowns to market close
- open only markets that still have enough time to execute safely
- connect a browser wallet and publish a Call
Velo progressively hydrates market charts instead of loading every candle series at once so the market board stays responsive even when many rolling windows are active.
Opening a market brings up the Call composer.
The trader chooses:
- Higher or Lower
- stake size
- one of the quick stake presets or a custom amount
On Somnia testnet, Event Contract collateral is shown as tUSDC. STT is used for gas.
The UI estimates contracts, payout and profit before submission. Final values come from the actual fill, not the estimate shown before the trade.
The first trade against a pool may require two wallet confirmations:
- collateral approval
- the actual DreamDEX order
After the trade confirms, Velo verifies the fill before creating the public Call.
/call/:id
A Call is a shareable public page for one verified position.
While the market is live it shows:
- trader identity
- asset and interval
- market question
- Higher / Lower side
- entry probability
- actual position cost
- market probability chart
- countdown
- sharing controls
- proof controls
- Back this Call action
After settlement, the same URL becomes a permanent receipt with the result and settlement context.
Public Call reads are based on the verified record Velo persisted at creation time. Fresh DreamDEX and onchain data enrich the page when available, but a temporary live-indexer failure does not erase an already verified Velo record.
A visitor opening a live Call can independently take a position in the same underlying DreamDEX Event Contract.
This is intentionally not automatic copying.
The second trader:
- opens the public Call
- sees the original trader's side and entry
- chooses a side for themselves
- trades at the current available market price
- receives their own independently verified Call
/profile/:address
Profiles turn individual Calls into a public record.
A profile can show:
- total public Calls
- accuracy across settled Won / Lost Calls
- live Calls
- settled receipts
- claimable winnings
- real market history on active Calls
Void and unsettled Calls are not counted as wins or losses.
Profiles also support an optional display name. The name is not trusted from a plain API request. The wallet owner must sign a message proving ownership before the profile metadata is updated.
The wallet address always remains the underlying identity.
Velo does not create a public Call from frontend state alone.
After the wallet submits a trade, the server verifies the transaction before saving the record.
The verification path checks:
- the submitted market exists
- the transaction exists on Somnia
- the transaction sender matches the connected wallet
- the receipt succeeded
- the receipt contains an
OrderFilledevent for the expected DreamDEX pool - DreamDEX indexed fills include a nonzero buy fill from that wallet
- actual quantity, cost and entry probability are derived from the confirmed fill
Only then is the Call stored and given a public ID.
Browser wallet
│
│ signed DreamDEX order
▼
Somnia / DreamDEX
│
│ tx + receipt + fill
▼
Velo verification API
│
│ verified public record
▼
Neon Postgres
│
├── /call/:id
└── /profile/:address
Velo intentionally avoids fake product data.
There are no seeded:
- users
- Calls
- fills
- probabilities
- settlements
- win rates
- leaderboards
- PnL records
If no verified Call exists, the product shows an empty state.
If DreamDEX does not provide candle history for a market, Velo shows that no trade history is available instead of drawing a fake chart.
Velo reads current DreamDEX / Somnia market state to determine whether a Call is still live, settled or voided.
For public records, the verified persisted record is the base truth. Onchain status and current market information are treated as live enrichment.
This means a Call does not disappear just because a rolling market is no longer returned by the live market indexer.
The read-only endpoint:
GET /api/claimable/:address
reports real resolved positions that the wallet can redeem.
The server never claims funds automatically. Redemption remains a wallet-confirmed action from the client.
┌─────────────────────────┐
│ DreamDEX Markets │
│ SDK + Event Contracts │
└────────────┬────────────┘
│
│ markets / books / fills
│ candles / settlement
▼
┌─────────────────┐ ┌─────────────────────────┐
│ Browser Wallet │───────▶│ Velo Web │
│ MetaMask / EIP │ trade │ Vite + vanilla modules │
└────────┬────────┘ └────────────┬────────────┘
│ │
│ Somnia tx │ verified Call request
▼ ▼
┌─────────────────┐ ┌─────────────────────────┐
│ Somnia Network │◀──────▶│ Velo API │
│ tx + events │ verify │ verification + profiles │
└─────────────────┘ └────────────┬────────────┘
│
▼
┌─────────────────────────┐
│ Neon Postgres │
│ Calls + profile metadata│
└─────────────────────────┘
| Route | Purpose |
|---|---|
/ |
Landing page |
/app |
Live DreamDEX market board |
/call/:id |
Public live Call / settled receipt |
/profile/:address |
Trader public record |
/api/health |
API and storage health |
/api/calls |
Persist a newly verified Call |
/api/calls/:id |
Read a public Call |
/api/profile/:address |
Read a public profile |
/api/profile-meta/:address |
Read / update signed display-name metadata |
/api/claimable/:address |
Read claimable DreamDEX positions |
Velo uses @somnia-chain/markets-sdk for the live Event Contract integration.
Current integration includes:
- live binary market discovery
- onchain market-state checks
- binary order books
- probability conversion
- wallet-backed market orders
- fill verification
- user fills
- candle history
- claimable positions
- redemption
- settlement / resolution context
The current build defaults to the official Somnia testnet configuration.
- JavaScript / ES modules
- Vite 6
@somnia-chain/markets-sdk- viem
- Neon serverless Postgres
- Vercel serverless functions
- Somnia testnet
- DreamDEX Event Contracts
Requirements:
- Node.js
- npm
- browser wallet such as MetaMask
Install and run:
npm install
npm run devBuild production assets:
npm run buildPreview the build:
npm run previewThe repository also contains a Node server entry for local / non-Vercel deployments:
npm startCopy the example environment file:
cp .env.example .env.localAvailable configuration:
# Defaults to testnet
VITE_DREAMDEX_NETWORK=testnet
# Optional DreamDEX endpoint overrides
VITE_DREAMDEX_INDEXER_URL=
VITE_DREAMDEX_WS_RPC_URL=
# Server-only Neon connection string
DATABASE_URL=
# Used by the standalone Node server
PORT=8787
HOST=0.0.0.0Do not place a private key or database URL inside a VITE_ variable.
The Velo server does not need a trader private key. Users sign their own transactions in their browser wallet.
Production uses Neon Postgres through DATABASE_URL.
Local development can fall back to the ignored JSON persistence layer when no database URL is supplied.
An existing local verified record can be migrated into Neon with:
npm run migrate:dataBuild check:
npm run buildSettlement-focused tests:
npm run test:phase15A real end-to-end product test should follow the user path:
Open Markets
→ choose a live BTC / ETH window
→ Higher or Lower
→ enter tUSDC stake
→ confirm wallet transaction(s)
→ Velo verifies the fill
→ View Call
→ open Profile
→ wait for settlement
→ receipt remains in the public record
Velo follows a few hard product rules:
- real positions only
- no fake social activity
- no fake performance history
- empty states are better than seeded credibility
- DreamDEX stays the execution layer underneath the consumer experience
- proof is available but does not dominate the main UX
- a public Call should be understandable without knowing the backend architecture
Velo is a hackathon build for the Somnia x DreamDEX Event Contracts track.
The core flow is implemented end to end on Somnia testnet:
market discovery → wallet trade → verified Call → public receipt → profile record
The project remains testnet-first and should not be treated as production financial software.