01 · Ethereum mainnet

Portfolio Dashboard

Read-only lookup of any address — balances, USD values, allocation. Read-only mainnet over wallet-connect: mirrors Zapper/DeBank, and forces the hard problem — arbitrary wallets full of unknown tokens.

  • Server-side Alchemy + CoinGecko — keys never reach the browser
  • Priced by contract address, never by symbol
  • TTL cache + request dedup: repeat lookups in ~20ms
// GET /api/portfolio — abridged real response
{
  "totalUsd": 17639669.42,       // at lookup time
  "priced":   [ /* 17 holdings */ ],
  "unpriced": [ /* 92 spam/dust */ ],
  "truncated": true              // honesty over a pretty number
}
02 · Sepolia testnet

Token Swap

Wallet-connect swaps through Uniswap v3's deployed contracts. Integrate the battle-tested AMM instead of writing a toy one — the job skill is correct integration, not novel mechanism design.

  • SwapRouter02 + QuoterV2, addresses verified on-chain first
  • Native ETH both ways: payable wrap in, multicall unwrap out
  • Slippage becomes on-chain amountOutMinimum, not a display number
QuoterV2 · simulated refresh
0.001 WETH0.000045399 UNI
live quotes re-fetch every 15s — and freeze while your wallet prompt is open
03 · Sepolia · Foundry

Staking Vault

Custom ERC-20 + vault, verified on Etherscan, public faucet. Rewards minted on claim, never from principal — the demo-honest choice, with the Synthetix-style alternative documented in NatSpec.

  • Verified on Etherscan — source publicly provable, not claimed
  • 35 Foundry tests, 512-run fuzz, mutation-tested
  • 10% APR accrual, floor rounding in the protocol's favor
100 BWC staked right now would be accruing+0.000000000BWCcontract formula: staked × 1000 bps × elapsed ÷ (10,000 × 365 days)

Why this, not that

Every project is a set of trade-offs. The left column shipped; the right column was considered and deliberately rejected — with the reasons. Full write-ups in the deep-dives.

▸ shipped

  • Read-only mainnet lookup. Anyone can inspect any address in seconds — no wallet, no faucet friction, real data.
  • Pricing by contract address. ERC-20 symbols aren't unique; contract addresses make token identity unambiguous.
  • Server-side keys + TTL cache. Keys never reach the browser; 60s/24h caching with request dedup keeps free tiers happy — repeat lookups in ~20ms.
// src/lib/portfolio.ts — whale wallets exceed the free-tier scan cap
const truncated =
  tokenScan.truncated || tokenScan.balances.length > MAX_TOKENS;
// ...the API says so instead of presenting a partial total as truth
return { address, totalUsd, priced, unpriced, truncated, updatedAt };

▸ deliberately not

  • Testnet wallet-connect demo. Shows reviewers their own empty wallet and asks them to fight a faucet before seeing anything.
  • Symbol-keyed price mapping. Duplicate tickers collide silently; unlisted tokens get invented prices.
  • Client-side API calls. Every visitor's network tab becomes a free API key.
// the version we didn't ship: symbol-keyed pricing
const price = prices[token.symbol]; // "USDC"… which of the 14 USDCs?
// duplicate tickers collide, unlisted tokens get invented prices,
// and the client-side fetch would hand your API key to every visitor
ecosystem telemetrysimulated feed · shapes from the deployed contracts

--:--:-- [EVENT] BochiCredits FaucetClaimed(0x056f…febE, 100 BWC)

--:--:-- [EVENT] StakingVault Staked(0x056f…febE, 10 BWC)

--:--:-- [QUOTE] QuoterV2 0.001 WETH → UNI · gasEstimate 79,739

--:--:-- [CACHE] portfolio snapshot hit · 21ms

--:--:-- [EVENT] StakingVault RewardsClaimed · minted on claim

--:--:-- [RPC ] alchemy_getTokenBalances · 3 pages · truncated=true

Everything above is running right now

Look up a whale wallet, swap testnet tokens, mint BWC from the faucet and stake it — or read the code and the reasoning.