// Sample data for the Stockbreak app (all pages). Plain TS, no framework imports; shared by react.tsx, vue.vue and svelte.svelte.
// Each page owns a prefixed section (exploreIndexes, feedPosts, ...); tickers, the index row type and the sparkline helpers are shared.
export interface TickerItem {
export interface IndexRowData {
tokens : { label : string }[];
/** Row link, used by the app navigation (`#/index` opens Index detail). */
const up = [ 1.0 , 1.01 , 1.03 , 1.02 , 1.04 , 1.04 , 1.05 , 1.06 ];
const down = [ 1.0 , 0.99 , 0.98 , 0.985 , 0.97 , 0.972 , 0.97 , 0.965 ];
const pre = " Pre-IPO · PreStocks " ;
const withHref = < T extends IndexRowData > ( rows : T [] ) : T [] =>
rows . map ( ( row ) => ( { ... row , href: " #/index " } ));
/** Maps a Stockbreak index onto the neutral shape of the `index-row` item (`avatars`, `owner`, `value`, `count`). */
export const toIndexRow = ( i : IndexRowData ) => ( {
/** Column labels of the Stockbreak index table (`IndexRowHeader labels`). */
export const indexRowLabels = {
const t = ( ... labels : string [] ) => labels . map ( ( label ) => ( { label } ));
export const tickers : TickerItem [] = [
{ symbol: " AAPLx " , price: " $339.86 " , change: " +0.42% " },
{ symbol: " NVDAx " , price: " $227.06 " , change: " +0.81% " },
{ symbol: " TSLAx " , price: " $370.21 " , change: " -0.31% " },
{ symbol: " MSFTx " , price: " $513.15 " , change: " +0.12% " },
{ symbol: " GOOGLx " , price: " $340.43 " , change: " +0.55% " },
{ symbol: " AMZNx " , price: " $247.93 " , change: " -0.20% " },
{ symbol: " METAx " , price: " $730.50 " , change: " +1.02% " },
{ symbol: " SPYx " , price: " $767.86 " , change: " +0.30% " },
const marketsIndexesRaw : IndexRowData [] = [
tokens: [{ label: " A " }, { label: " N " }, { label: " T " }],
tokens: [{ label: " N " }, { label: " M " }, { label: " G " }],
tokens: [{ label: " S " }, { label: " A " }, { label: " T " }],
tokens: [{ label: " A " }, { label: " N " }, { label: " T " }],
tags: [pre, " Follows MAG4 " ],
name: " Magnificent Four " ,
tokens: [{ label: " A " }, { label: " N " }, { label: " T " }],
export const marketsIndexes = withHref (marketsIndexesRaw);
export const marketsHumanVsAi = {
label: " Human · median 7d " ,
note: " 34 indexes · best MAGT " ,
ai: { label: " AI · median 7d " , value: " — " , note: " 0 indexes " },
export const marketsCreators = [
meta: " Level 2 · 2 indexes " ,
meta: " Level 4 · 2 indexes " ,
meta: " Level 2 · 2 indexes " ,
export const marketsActivity = [
text: " Joined · 983.75 shares " ,
text: " Joined · 987.03 shares " ,
{ symbol: " PHMAKER " , text: " Created " , ago: " 5d ago " , tone: " brand " },
text: " Claimed creator fees " ,
{ symbol: " MM41 " , text: " Paused " , ago: " 5d ago " , tone: " brand " },
export type exploreKind = " human " | " ai " ;
const exploreIndexesRaw : ( IndexRowData & { kind : exploreKind } )[] = [
tokens: t ( " A " , " N " , " T " ),
tokens: t ( " N " , " M " , " G " ),
tokens: t ( " S " , " A " , " T " ),
tokens: t ( " A " , " N " , " T " ),
tags: [pre, " Follows MAG4 " ],
name: " Magnificent Four " ,
tokens: t ( " A " , " N " , " T " ),
tokens: t ( " A " , " T " , " L " ),
tokens: t ( " A " , " M " , " G " ),
tokens: t ( " A " , " M " , " G " ),
export const exploreIndexes = withHref (exploreIndexesRaw);
export const exploreKinds = [
{ value: " all " , label: " All " },
{ value: " human " , label: " Human " },
{ value: " ai " , label: " AI " },
export const exploreStrategies = [
{ value: " any " , label: " Any strategy " },
{ value: " clone " , label: " Clone " },
{ value: " follow " , label: " Follows " },
export const exploreSorts = [
{ value: " aum " , label: " AUM " },
{ value: " change " , label: " 7d change " },
{ value: " holders " , label: " Holders " },
export interface leaderboardAllocationSegment {
export interface leaderboardPodiumEntry {
allocation : leaderboardAllocationSegment [];
export const leaderboardPodium : leaderboardPodiumEntry [] = [
{ label: " AAPLx " , value: 30 },
{ label: " NVDAx " , value: 40 },
{ label: " TSLAx " , value: 20 },
{ label: " SPACEX-pre " , value: 10 },
{ label: " NVDAx " , value: 30 },
{ label: " MSFTx " , value: 25 },
{ label: " GOOGLx " , value: 20 },
{ label: " OPENAI-pre " , value: 15 },
{ label: " ANTHRP-pre " , value: 10 },
{ label: " SPACEX-pre " , value: 40 },
{ label: " ANDURL-pre " , value: 30 },
{ label: " TSLAx " , value: 30 },
const leaderboardIndexesRaw : IndexRowData [] = [
tokens: t ( " A " , " N " , " T " ),
tokens: t ( " N " , " M " , " G " ),
tokens: t ( " S " , " A " , " T " ),
tokens: t ( " A " , " N " , " T " ),
tags: [pre, " Follows MAG4 " ],
name: " Magnificent Four " ,
tokens: t ( " A " , " N " , " T " ),
export const leaderboardIndexes = withHref (leaderboardIndexesRaw);
export const leaderboardTabs = [
{ value: " indexes " , label: " Indexes " },
{ value: " creators " , label: " Creators " },
export const leaderboardPeriods = [
{ value: " 24h " , label: " 24H " },
{ value: " 7d " , label: " 7D " },
{ value: " 30d " , label: " 30D " },
{ value: " all " , label: " ALL " },
export const leaderboardKinds = [
{ value: " all " , label: " All " },
{ value: " human " , label: " Human " },
{ value: " ai " , label: " AI " },
export const leaderboardBenchmark = " SPYx 7D: +0.48% " ;
export interface createAsset {
/** Source tag shown as a badge next to the symbol. */
export const createSteps = [
{ value: " assets " , label: " Assets " },
{ value: " weights " , label: " Weights " },
{ value: " strategy " , label: " Strategy " },
{ value: " fees " , label: " Fees " },
{ value: " review " , label: " Review " },
export type createStepValue = ( typeof createSteps)[ number ][ " value " ];
export const createAssets : createAsset [] = [
detail: " USD Coin · stable " ,
{ symbol: " AAPLx " , name: " Apple " , detail: " Apple " , price: " $339.86 " },
{ symbol: " NVDAx " , name: " NVIDIA " , detail: " NVIDIA " , price: " $227.06 " },
{ symbol: " TSLAx " , name: " Tesla " , detail: " Tesla " , price: " $370.21 " },
{ symbol: " MSFTx " , name: " Microsoft " , detail: " Microsoft " , price: " $513.15 " },
{ symbol: " GOOGLx " , name: " Alphabet " , detail: " Alphabet " , price: " $340.43 " },
{ symbol: " AMZNx " , name: " Amazon " , detail: " Amazon " , price: " $247.93 " },
{ symbol: " METAx " , name: " Meta " , detail: " Meta " , price: " $730.50 " },
detail: " SpaceX (pre-IPO) · pre-IPO " ,
detail: " OpenAI (pre-IPO) · pre-IPO " ,
detail: " Anthropic (pre-IPO) · pre-IPO " ,
export const createRebalance = [
{ value: " drift " , label: " On drift " },
{ value: " daily " , label: " Daily " },
{ value: " weekly " , label: " Weekly " },
{ value: " never " , label: " Never " },
export const createDefaults = {
export const feedViews = [
{ value: " following " , label: " Following " },
{ value: " all " , label: " All " },
export interface feedUpdate {
export const feedUpdates : feedUpdate [] = [
export interface feedPost {
index : { title : string ; description : string };
export const feedPosts : feedPost [] = [
text: " Rebalanced MAG4 after NVDAx drifted to 32.4%. Fees this week: 4.1 USDC. " ,
index: { title: " MAG4 · Magnificent Four " , description: " $1.00 · +2.38% " },
text: " Tilting toward pre-IPO names for the next epoch. Weights lock at launch, so read the mandate first. " ,
index: { title: " MAGT · Mag Four Tilt " , description: " $1.00 · +1.12% " },
export const feedMoreUpdates = 6 ;
export const feedMaxChars = 500 ;
export const agentsMcpUrl = " https://stockbreak.fun/api/mcp " ;
export interface agentsAgentStat {
export const agentsAgents : {
stats : agentsAgentStat [] ;
{ label: " Indexes " , value: " 0 " },
{ label: " AUM " , value: " $0.00 " },
{ label: " Best 7d " , value: " — " },
note: " Not running an index yet. " ,
export const agentsClients : {
" Settings → Connectors → Add custom connector " ,
" Settings → Connectors → Advanced → Developer mode " ,
" Create connector, name it Stockbreak " ,
` MCP server URL: ${ agentsMcpUrl } ` ,
steps: [ ` claude mcp add --transport http stockbreak ${ agentsMcpUrl } ` ],
export const agentsApiKeyNote =
" Create an agent and an API key under Your agents, then add the key as a header in a client that supports it (Claude Code, Cursor, your own script). Claude.ai and ChatGPT connectors cannot send it: there the AI prepares actions for you to sign, and Autopilot acts for the agent. " ;
export const agentsHeaderSnippet = ' --header "Authorization: Bearer sbk_…" ' ;
export const portfolioTotals = {
deltaNote: " -0.30% over 7d " ,
breakdown: " Positions $3,930.69 · USDC $1,040.00 " ,
usdc: { value: " 1,040 " , note: " Simulated · devnet " },
sol: { value: " 81.654 " , note: " For transaction fees " },
export interface portfolioPosition {
export const portfolioPositions : portfolioPosition [] = [
name: " Magnificent Four " ,
export const portfolioLooseAssets = [
{ symbol: " AAPLx " , letter: " A " , amount: " 0.0071 " },
{ symbol: " NVDAx " , letter: " N " , amount: " 0.0058 " },
{ symbol: " MSFTx " , letter: " M " , amount: " 0 " },
{ symbol: " METAx " , letter: " M " , amount: " 0 " },
{ symbol: " SPACEX-pre " , letter: " S " , amount: " 0.0051 " },
export const portfolioLooseNote = " $0.00 " ;
export const portfolioYourIndexes = [
{ name: " PHONEMAKER " , symbol: " PHMAKER " , aum: " $981.41 " , tokens: [ " G " , " A " ] },
{ name: " BIG FIVE " , symbol: " BIGF " , aum: " $980.48 " , tokens: [ " A " , " N " , " M " ] },
export const profileProfile = {
address: " abHaSb…ERumq7 " ,
badges: [ " First index " , " First join " , " Early on devnet " ] ,
export interface profileCreated {
export const profileCreated : profileCreated [] = [
export interface profilePosition {
export const profilePositions : profilePosition [] = [
name: " Magnificent Four " ,
export const faucetWallet = {
address: " abHaSbWAxCNM2DhyGe5U2eLRZzViRDSVLLMD7ERumq7 " ,
export const faucetSolFaucet = {
title: " 1. SOL for transaction fees " ,
" Sends 0.1 SOL from the app’s faucet wallet. Limited per wallet per day. " ,
linkLabel: " faucet.solana.com " ,
linkHref: " https://faucet.solana.com " ,
buttonLabel: " Open faucet.solana.com " ,
export const faucetUsdcFaucet = {
title: " 2. Simulated USDC " ,
" Minted by the mock market. Up to 10,000 per request. You sign one transaction. " ,
amounts: [ 1000 , 5000 , 10000 ] ,
export type landingLink = { label : string ; href : string };
export type landingSegment = { label : string ; value : number };
export type landingFeature = { index : string ; title : string ; body : string };
export type landingStep = { index : string ; title : string ; description : string };
export type landingStat = { value : string ; label : string };
export type landingFooterColumn = { title : string ; links : landingLink [] };
export const landingNav : landingLink [] = [
{ label: " How it works " , href: " #how " },
{ label: " Pre-IPO " , href: " #pre-ipo " },
{ label: " AI agents " , href: " #agents " },
{ label: " Creators " , href: " #creators " },
{ label: " FAQ " , href: " #faq " },
{ label: " GitHub " , href: " #github " },
export const landingHero = {
eyebrow: " The index launchpad for tokenized stocks, on Solana " ,
title: " Turn your stock thesis into an index token. " ,
lead: " Pick up to 10 tokenized stocks and pre-IPO names, set the weights and the rules. Others join with USDC in one click or one Blink. A Solana vault program enforces the rebalancing — not us. " ,
" Self-custodied · Redeem anytime · Rules enforced on-chain · PreStocks pre-IPO " ,
" Live on Solana devnet. Assets are simulated; prices follow real market data. Not investment advice. " ,
export const landingIndex = {
name: " Magnificent Four " ,
tags: [ " Pre-IPO·PreStocks " , " Simulated " ] ,
benchmark: " Is it beating SPYx? " ,
{ label: " AAPLx " , value: 40 },
{ label: " NVDAx " , value: 30 },
{ label: " TSLAx " , value: 20 },
{ label: " SPACEX-pre " , value: 10 },
] satisfies landingSegment [] ,
// viewBox 0 0 400 120 paths (index line + dashed benchmark)
line: " M0 92 C30 92 50 94 80 86 C110 78 130 70 160 66 C190 62 210 66 240 56 C270 46 300 38 330 34 C360 30 380 26 400 22 " ,
benchmarkLine: " M0 94 C60 92 120 88 180 84 C240 80 300 74 400 66 " ,
export const landingJoinRows = [{ label: " Estimated shares " , value: " 982.09 " }];
export const landingStats : landingStat [] = [
{ value: " [N]K+ " , label: " holders, all-time high " },
{ value: " $[N]B " , label: " volume in 30 days " },
{ value: " [N]%+ " , label: " of activity outside US hours " },
{ value: " [N]K " , label: " holders of Anthropic pre-IPO " },
export const landingStatsNote =
" Market data placeholders — fill with sourced figures before publishing. " ;
export const landingProblemTitle = {
lead: " Tokenized stocks are here. " ,
muted: " Portfolios aren't. " ,
export const landingProblems : landingFeature [] = [
title: " Every token is one ticker. " ,
body: " If you believe in AI infrastructure plus Anthropic and SpaceX, you're managing ten positions by hand — and rebalancing them yourself, forever. " ,
title: " Creators can't ship their thesis. " ,
body: " Packaging a thesis into something people can buy still means starting a fund. Copy apps are off-chain, US-only and run on subscriptions. " ,
title: " Pre-IPO tokens come with deadlines. " ,
body: " After an IPO, pre-IPO tokens must be swapped into the listed stock before a deadline — or they expire. Holders who forget lose everything. " ,
export const landingStepsTitle = {
lead: " From thesis to token " ,
export const landingSteps : landingStep [] = [
" Pick up to 10 assets, set weights, choose a strategy and your fees. " ,
" Every index gets a link, an OG image, a feed card and a Solana Blink. " ,
" Investors pay in USDC. Stockbreak swaps into every asset and mints share tokens. " ,
" When weights drift past your rule, a permissionless keeper rebalances atomically. " ,
export const landingCta = {
title: " Your thesis deserves a ticker. " ,
body: " Create an index in minutes. Share it anywhere. Let the program keep it honest. " ,
export const landingPricing = [
tagline: " Join any index " ,
note: " Plus the 1% management fee set by each creator. " ,
" Browse and join every index " ,
" Leaderboard and portfolio " ,
lead: " Everything in Holder, plus: " ,
tagline: " Launch your own index " ,
note: " Earn the management fee on every holder's share. " ,
" Custom weights and mandate " ,
" Share cards and Blinks " ,
lead: " Everything in Creator, plus: " ,
tagline: " Automate rebalancing " ,
price: " 5% drift trigger " ,
note: " Keeper rebalances when weights drift past your limit. " ,
export const landingFooter = {
description: " Index launchpad for tokenized stocks, on Solana. " ,
{ label: " Explore " , href: " #explore " },
{ label: " Leaderboard " , href: " #leaderboard " },
{ label: " Create index " , href: " #create " },
{ label: " Docs " , href: " #docs " },
{ label: " MCP server " , href: " #mcp " },
{ label: " GitHub " , href: " #github " },
{ label: " About " , href: " #about " },
{ label: " Careers " , href: " #careers " },
{ label: " News " , href: " #news " },
] satisfies landingFooterColumn [] ,
legal: " © 2026 Stockbreak " ,
note: " Devnet only · simulated assets · not investment advice " ,
export interface detailAllocationSegment {
export const detailIndex = {
name: " Magnificent Four " ,
tags: [ " Pre-IPO · PreStocks " , " Simulated " ] ,
navDelta: " +0.0055 (+0.55%) " ,
navNote: " Share price · NAV updated 2m ago " ,
retNote: " 7d return · benchmark SPYx " ,
export interface detailChartPoint {
0.0 , 0.0 , - 0.05 , 0.3 , 1.2 , 2.2 , 2.9 , 3.2 , 3.4 , 3.5 , 3.5 , 3.9 , 4.3 , 4.6 , 5.1 ,
export const detailChart : detailChartPoint [] = detailMag4 . map ( ( v , i ) => ( {
spyx: Math . round (((i * 2.2 ) / 18 ) * 100 ) / 100 ,
export const detailRanges = [ " 1D " , " 1W " , " 1M " , " 3M " , " 1Y " , " ALL " ];
export const detailStatGroups : { label : string ; value : string } [][] = [
{ label: " AUM " , value: " $14.1K " },
{ label: " Holders " , value: " 14 " },
{ label: " Clones " , value: " 2 " },
{ label: " Followers " , value: " 1 " },
{ label: " Rebalancing " , value: " Drift > 5% " },
{ label: " Max slippage " , value: " 1% " },
{ label: " Cooldown " , value: " 1 min " },
{ label: " Keeper " , value: " Allowed " },
{ label: " Mgmt fee " , value: " 1% / yr " },
{ label: " Entry / exit " , value: " 0% / 0% " },
{ label: " Timelock " , value: " 120s " },
{ label: " Created " , value: " Sep 20 " },
export const detailAssets = [
export const detailAllocation : detailAllocationSegment [] = [
{ label: " AAPLx " , value: 40 },
{ label: " NVDAx " , value: 30 },
{ label: " TSLAx " , value: 20 },
{ label: " SPACEX-pre " , value: 10 },
export const detailJoinTabs = [
{ value: " join " , label: " Join " },
{ value: " redeem " , label: " Redeem " },
export const detailQuickAmounts = [
{ label: " $10 " , value: " 10 " },
{ label: " $50 " , value: " 50 " },
{ label: " $100 " , value: " 100 " },
{ label: " Max " , value: " 1240 " },
export const detailJoinRows = [
{ label: " Estimated shares " , value: " 99.86 " },
{ label: " Entry fee " , value: " 0% " },
{ label: " Route " , value: " USDC → 4 swaps " },
{ label: " Network fee " , value: " ~$0.001 " },
export const detailMaxAmount = " 1,240 " ;
export const detailShareActions = [ " Copy link " , " Blink " , " X post " ];
export const detailCreator = {
meta: " Level 4 · 2 indexes " ,
// Hash links are intercepted by the app root (`#/<page>`), so the same data drives the navbar and the sidebar.
{ label: " Markets " , href: " #/markets " },
{ label: " Explore " , href: " #/explore " },
{ label: " Feed " , href: " #/feed " },
{ label: " Leaderboard " , href: " #/leaderboard " },
{ label: " AI " , href: " #/agents " },
{ label: " Portfolio " , href: " #/portfolio " },
export const sidebarNav = [
{ label: " Dashboard " , icon: " dashboard " , href: " #/markets " },
{ label: " Explore " , icon: " explore " , href: " #/explore " },
{ label: " Feed " , icon: " feed " , href: " #/feed " },
{ label: " Leaderboard " , icon: " leaderboard " , href: " #/leaderboard " },
{ label: " AI agents " , icon: " agents " , href: " #/agents " },
{ label: " Create index " , icon: " create " , href: " #/create " },
{ label: " Portfolio " , icon: " portfolio " , href: " #/portfolio " },
{ label: " Settings " , icon: " settings " , href: " #/profile " },
export const watchlist = [
/** Page ids and the nav entry each one highlights, per layout. */
export const pageTitles : Record < PageId , string > = {
leaderboard: " Leaderboard " ,
/** Which nav href is active for a page (detail pages belong to Explore, Create to the Create entry, ...). */
export const pageNav : Record < PageId , string > = {
leaderboard: " #/leaderboard " ,
portfolio: " #/portfolio " ,
export const pageIds = Object . keys (pageTitles) as PageId [];