Part I · The story
1.Friday, 4pm
At 4pm New York time on Friday, the US stock market closes until Monday morning. Tokenized stocks on BNB Chain don’t: they keep trading through the weekend.
The reference price they track freezes at Friday’s close. The token can drift away from it, or sit on a stale number that looks live. Most apps show a price and a Buy button, and don’t tell you what you’re actually buying: how deep the market is, how wide the spread is, or that the real exchange is shut.
2.Meet Ada
Illustrative example
It’s Saturday, and Ada wants to buy her first tokenized Nvidia. She opens Bystok and finds two versions: NVDAB (bStocks) and NVDAon (Ondo).
- The market status says Closed, with a countdown to Monday’s open.
- NVDAB shows live liquidity and a spread from a real quote. In our test on Saturday 3 October 2026, its spread was under 0.1%.
- NVDAon’s spread shows Unavailable until she connects a wallet. In the same test, with a wallet connected, it was 2.03%.
- If a token’s price exactly matches the frozen reference price, Bystok says it may be pegged rather than live.
The verdict reads Proceed with care, with the reasons listed. Ada still decides, but now she knows what she’s buying.
3.What Bystok checks
- Liquidity: how much money sits in the token’s pools. More means your order moves the price less.
- Spread: the gap between the buy and sell price, a hidden cost on every round trip.
- Price deviation: how far the token is from the real share price.
- Market status: whether the real stock is trading right now.
- Token provider and backing: who issues the token, how many shares it tracks, and their attestation report when published.
- Key risks, in plain English, and an overall verdict.
4.Why it exists
Bystok was built solo from Nigeria for BNB Hack: Tokenized Stocks Edition.
Getting started was the hardest part. The Binance developer portal and API wouldn’t load on my MTN connection. I needed a VPN to get the API key, which took about 16 hours, then a DNS change, then moving the server region before the app could reach the API reliably.
That’s also why Bystok tells you plainly when live data can’t be loaded, instead of quietly showing something old.
5.The honest part
What doesn’t work yet:
- Buying isn’t built. You can connect a wallet and see a live quote, but the button reads “Swap coming next” and no transaction is ever sent.
- Ondo tokens need a wallet for quotes, so their spread shows Unavailable until one is connected.
- Ondo liquidity is always Unavailable: Ondo trades through market makers that don’t publish pool sizes.
- Prices can be pegged while the market is closed. Bystok flags an exact match, but can’t tell what a fill would really cost.
- If the API fails, the app shows clearly labelled sample data (made-up numbers).
Part II · How it works
1.Overview
Bystok is a Next.js web app. The browser only talks to Bystok’s own server routes; the server signs every Binance Web3 API request with the API key, which never reaches the browser.
- The market list loads light data for the top 30 stocks: price, 24h change and 24h volume.
- Full details (pools, spread quote, issuer profile) load only for the stock you select.
- Search covers all 488 listed tokens by ticker or company name.
- A connected wallet adds balances and a live buy quote.
2.Data sources
All calls go to https://web3.binance.com/build, signed with HMAC-SHA256. Data is for BNB Chain only.
GET /api/v1/dex/market/rwa/tokens- The list of tokenized stocks on BNB Chain: price, issuer and trading status.
GET /api/v1/dex/market/rwa/platforms- Issuer details (Ondo, bStocks).
GET /api/v1/dex/market/rwa/search- Search fallback, for stocks the token list leaves out.
GET /api/v1/dex/market/rwa/price- Token price vs the real stock's reference price.
GET /api/v1/dex/market/rwa/underlying-profile- Shares per token and the issuer's attestation report.
GET /api/v1/dex/market/rwa/underlying-market- Market cap and market status of the real stock.
POST /api/v1/dex/market/price-info- 24h on-chain volume, 24h change and holders, up to 100 tokens per call.
GET /api/v1/dex/market/token/top-liquidity- Liquidity: the token's trading pools.
GET /api/v1/dex/aggregator/quote- Spread (a $100 buy and sell-back quote) and the live buy quote.
POST /api/v1/dex/balance/token-balances-by-address- The connected wallet's USDT and BNB balances.
GET /api/v1/dex/balance/all-token-balances-by-address- Every token the connected wallet holds, filtered to tokenized stocks for MyStocks.
GET /api/v1/dex/market/portfolio/token/latest-pnl- Average on-chain buy price per holding, for MyStocks profit/loss.
Note: /rwa/tokens returned 442 of 458 Ondo tokens and 46 of 91 bStock tokens in our tests. The rest are only reachable through search.
3.The checks and thresholds
Thresholds live in lib/analysis.ts:
Liquidity
- Good
- $1M or more
- Caution
- $250K to $1M
- Risky
- below $250K
Total value in the token's pools. Unavailable counts as Caution.
Spread
- Good
- 0.3% or less
- Caution
- up to 1%
- Risky
- above 1%
Gap between buy and sell price on a $100 round trip. Unavailable counts as Caution.
Price deviation
- Good
- within ±0.5%
- Caution
- within ±1.5%
- Risky
- beyond ±1.5%
Token price vs share price × shares per token. An exact match counts as Caution: the price may be pegged.
Market status
- Good
- US market open
- Caution
- US market closed
- Risky
- n/a
Regular NYSE/NASDAQ session in New York time.
4.How the verdict is decided
- Any check Risky → High risk.
- Otherwise, any check Caution → Proceed with care.
- Otherwise → Looks healthy.
Missing data never passes: an Unavailable liquidity or spread counts as Caution. The key risks list explains each non-Good check, then adds the issuer’s live notices (for example a weekend trading pause) and general tokenized-stock risks.
5.Market hours and the weekend gap
The market clock uses the regular NYSE/NASDAQ session: 9:30am to 4:00pm New York time, Monday to Friday, in the America/New_York time zone, so daylight saving is automatic. It updates every second. Exchange holidays and early closes aren’t handled yet.
What we saw on a Saturday (3 October 2026):
- All 46 listed bStock tokens reported “trading”.
- 411 Ondo tokens reported closed (“Weekend or Holiday”) and 31 reported “off-hours” but still tradable.
- Ondo’s session showed a short break: close Sunday 7:55pm ET, reopen 8:05pm ET.
With the reference price frozen, a token that matches it exactly is flagged as possibly pegged.
6.Ondo vs bStock
bStock (e.g. NVDAB)
- Quotes without a wallet.
- Trades in AMM pools (PancakeSwap, Uniswap) and through market makers.
- Pools report USD liquidity, so liquidity is measurable.
- Reported “trading” on a Saturday in our tests.
Ondo (e.g. NVDAon)
- Quotes need a wallet address: “userWalletAddress is required for RFQ (Ondo) quote”.
- Pools report no USD liquidity, so liquidity is Unavailable.
- Closed tokens return error 40367: “The stock market is currently closed. Expected to open in…”
Every quote we saw reported execution mode SWAP, even when routed through market makers (“Rfq Halfmoon”, “Rfq Bebop”). The bStock market-hours error, 40369, never appeared in our tests.
7.Reliability
- Server-side cache of 30 seconds; identical in-flight requests are shared.
- Calls to the same endpoint are spaced 220ms apart (the API allows 5 per second).
- One retry on rate limits (42900) and stale timestamps (40103).
- Requests send
X-OC-RECV-WINDOW: 60000; by default, a timestamp only about 3 seconds old is rejected. - The page refreshes data every 30 seconds while visible. The “updated” time turns into a Delayed warning after 90 seconds or a failed refresh.
- If the API can’t be reached, clearly labelled sample data is shown instead.
- API errors are shown in plain English, never as raw codes or keys.
8.Wallet connect
- Desktop: wallets found in the browser (Binance Web3 Wallet, MetaMask, …) are listed under Installed.
- Phones: a normal mobile browser has no wallet, so Bystok offers Open in MetaMask, which reopens the page inside MetaMask’s browser.
- Other wallets (MetaMask mobile, Trust, Binance Wallet, OKX…) connect through WalletConnect, when a project ID is configured.
- Wallets on another network get a Switch to BNB Chain prompt.
- Once connected: USDT and BNB balances, a live quote that refreshes every 30 seconds, and warnings for not enough USDT or less than 0.002 BNB for fees.
Bystok never sees private keys; the wallet signs everything.
9.Planned buy flow
Planned, not built
For bStock tokens:
- Approve the exact USDT amount for the swap, never unlimited.
- Build the swap from the same quote, within 30 seconds; re-quote if it’s older than 25 seconds.
- Simulate the transaction and stop with the reason if it would fail.
- Show what you pay, the minimum you receive after 1% slippage, the router and the network fee.
- Your wallet signs; Bystok then tracks the transaction until confirmed or failed.
Safety rules:
- A cap of 20 USDT per buy.
- The transaction must come from your connected wallet and go to an allowlisted router address, with no BNB attached.
- The risk checkboxes stay required; High risk needs an extra confirmation.
- Ondo buying stays disabled until its separate flow is built.
10.Tech stack
- Next.js 16, React 19, TypeScript
- Tailwind CSS 4
- wagmi 3 and viem 2 for wallets, WalletConnect for mobile wallet apps
- TanStack Query for data fetching and refresh
- Binance Web3 API for all market and wallet data
- Hosted on Vercel
11.What's next
- bStock buying, with the safety rules above.
- Ondo buying: sign the market maker’s order in the wallet and track it until filled.
- US exchange holidays and early closes in the market clock.
- Price and spread alerts for watchlist stocks.