diff --git a/app/components/AppShell.tsx b/app/components/AppShell.tsx index 33d1dc2..becb68c 100644 --- a/app/components/AppShell.tsx +++ b/app/components/AppShell.tsx @@ -9,7 +9,7 @@ import { Toaster } from 'sonner'; import { getActiveParent, NAV_ITEMS, NavChild, NavIcon } from '../navigation'; import { BLUE, BORDER, BRAND_BLUE, DISABLED, INK, MUTED, SELECTED } from '../theme'; import { getChangeBySlug } from '../upgrades/data/changes'; -import { demoLabel } from '../demos/catalogue'; +import { demoLabel } from '../vibenet/demos/catalogue'; import { getUpgradeById } from '../upgrades/data/upgrades'; import { titleForPath } from '../navigation'; @@ -641,7 +641,7 @@ function GlobalBanner({ dismissed, onDismiss, className }: GlobalBannerProps) { New! EIP-8130: Native Account Abstraction - + Test on Vibenet @@ -789,27 +789,19 @@ export function AppShell({ children }: PropsWithChildren) { /> ); } - const demoMatch = pathname.match(/^\/demos\/(.+)$/); - if (demoMatch) { - const slug = demoMatch[1].split('/')[0]; - return ( - - ); - } if (pathname.startsWith('/vibenet') && pathname !== '/vibenet') { let childLabel = title; let middle: { label: string; href: string } | undefined; const explorerDetailMatch = pathname.match(/^\/vibenet\/explorer\/(tx|block|address)\/(.+)$/); + const demoMatch = pathname.match(/^\/vibenet\/demos\/(.+)$/); if (explorerDetailMatch) { middle = { label: 'Explorer', href: '/vibenet/explorer' }; const raw = explorerDetailMatch[2]; childLabel = raw.startsWith('0x') && raw.length > 12 ? `${raw.slice(0, 6)}…${raw.slice(-4)}` : raw; + } else if (demoMatch) { + childLabel = demoLabel(demoMatch[1].split('/')[0]); } return ( - - {children} - - ); -} diff --git a/app/demos/layout.tsx b/app/demos/layout.tsx deleted file mode 100644 index d805fe2..0000000 --- a/app/demos/layout.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import type { ReactNode } from 'react'; - -// Metadata lives on the routes themselves: app/demos/page.tsx for the index and -// app/demos/account/layout.tsx for the demo. - -type DemosLayoutProps = { - children: ReactNode; -}; - -// Section chrome only. Demos run on whichever test network carries the feature -// they show, so nothing network-specific belongs here — a demo that depends on -// a particular network owns that concern (see app/demos/account/layout.tsx, -// which carries Vibenet's maintenance notice). -export default function DemosLayout({ children }: DemosLayoutProps) { - return ( -
{children}
- ); -} diff --git a/app/demos/loading.tsx b/app/demos/loading.tsx deleted file mode 100644 index 643bc04..0000000 --- a/app/demos/loading.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { Skeleton } from '../components/ui/Skeleton'; - -export default function DemosLoading() { - return ( -
- {[0, 1].map((i) => ( -
- - - - -
- {[0, 1, 2].map((j) => ( -
- - -
- ))} -
-
- ))} -
- ); -} diff --git a/app/demos/page.tsx b/app/demos/page.tsx deleted file mode 100644 index ad8cfa7..0000000 --- a/app/demos/page.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import type { Metadata } from 'next'; - -import { Card, LinkCard } from '../components/ui/Card'; -import { Text } from '../components/ui/Text'; -import { Badge } from './account/components/primitives'; -import { DEMOS, type DemoEntry } from './catalogue'; - -export const metadata: Metadata = { - title: 'Demos · Base Chain', - description: - 'Interactive demos of in-flight Base features. Each demo runs on the test network that carries the feature it shows.', -}; - -export default function DemosIndexPage() { - return ( -
-
- {DEMOS.map((demo) => - demo.available ? ( - - - - ) : ( - - - - ), - )} -
-
- ); -} - -function DemoCardBody({ demo }: { demo: DemoEntry }) { - return ( - <> -
-
- {demo.title} - {demo.eyebrow} - {!demo.available ? ( - - Coming soon - - ) : null} -
- - {demo.summary} - -
-
    - {demo.points.map((point) => ( -
  • -
  • - ))} -
- - ); -} diff --git a/app/navigation.ts b/app/navigation.ts index e5323a3..42987c5 100644 --- a/app/navigation.ts +++ b/app/navigation.ts @@ -31,7 +31,6 @@ export const NAV_ITEMS: NavItem[] = [ { label: 'Explorer', href: '/vibenet/explorer', icon: 'explorer' }, ], }, - { label: 'Demos', href: '/demos', icon: 'demos', enabled: true }, { label: 'Upgrades', href: '/upgrades', icon: 'upgrades', enabled: true }, { label: 'Changelog', href: '/upgrades/changelog', icon: 'changelog', enabled: true }, { label: 'Snapshots', href: '/snapshots', icon: 'snapshots', enabled: true }, diff --git a/app/sitemap.ts b/app/sitemap.ts index 861f742..6908f5e 100644 --- a/app/sitemap.ts +++ b/app/sitemap.ts @@ -23,9 +23,8 @@ export default function sitemap(): MetadataRoute.Sitemap { { path: '/vibenet', priority: 0.8, changeFrequency: 'weekly' }, { path: '/vibenet/explorer', priority: 0.6, changeFrequency: 'daily' }, { path: '/vibenet/faucet', priority: 0.5, changeFrequency: 'monthly' }, - { path: '/demos', priority: 0.6, changeFrequency: 'weekly' }, - { path: '/demos/account', priority: 0.5, changeFrequency: 'weekly' }, - { path: '/demos/b20', priority: 0.5, changeFrequency: 'weekly' }, + { path: '/vibenet/demos/account', priority: 0.5, changeFrequency: 'weekly' }, + { path: '/vibenet/demos/b20', priority: 0.5, changeFrequency: 'weekly' }, ]; return routes.map(({ path, priority, changeFrequency }) => ({ diff --git a/app/upgrades/data/vibenet.ts b/app/upgrades/data/vibenet.ts index 707a347..d7a68c7 100644 --- a/app/upgrades/data/vibenet.ts +++ b/app/upgrades/data/vibenet.ts @@ -21,12 +21,12 @@ const vibenetAvailability: VibenetAvailability[] = [ timestamp: '2026-07-02', featured: true, image: '/images/upgrades/layered-squares.png', - demo: '/demos/account' + demo: '/vibenet/demos/account' }, { changeId: 'base-0005', status: 'live', - demo: '/demos/b20' + demo: '/vibenet/demos/b20' }, ]; diff --git a/app/upgrades/library/upgrades.test.ts b/app/upgrades/library/upgrades.test.ts index afb58b6..dfc6622 100644 --- a/app/upgrades/library/upgrades.test.ts +++ b/app/upgrades/library/upgrades.test.ts @@ -178,7 +178,7 @@ describe('upgrades route helpers', () => { it('links the B20 changelog entry to its Vibenet demo', () => { const b20 = getVibenetChangeById('base-0005'); expect(b20?.vibenet.status).toBe('live'); - expect(b20?.vibenet.demo).toBe('/demos/b20'); + expect(b20?.vibenet.demo).toBe('/vibenet/demos/b20'); // Not featured — the demo link surfaces on the changelog entry, not the // featured-changes rail. expect(b20?.vibenet.featured).toBe(false); diff --git a/app/vibenet/data/features.ts b/app/vibenet/data/features.ts index 5090059..b089b1e 100644 --- a/app/vibenet/data/features.ts +++ b/app/vibenet/data/features.ts @@ -31,7 +31,7 @@ export const FEATURES: VibenetFeature[] = [ // The account demo has shipped, so the card links straight to it and shows // as `live` (which hides the "coming-soon" badge). "Build your own" points at // the EIP-8130 build guide. - cta: { label: 'Try It Out', href: '/demos/account' }, + cta: { label: 'Try It Out', href: '/vibenet/demos/account' }, secondaryCta: { label: 'Build Your Own', href: 'https://docs.base.org/base-chain/specs/upgrades/cobalt/eip-8130', external: true }, links: [{ label: 'EIP-8130', href: 'https://eip.tools/eip/8130', external: true }], }, diff --git a/app/demos/_components/AnimatedAmount.tsx b/app/vibenet/demos/_components/AnimatedAmount.tsx similarity index 97% rename from app/demos/_components/AnimatedAmount.tsx rename to app/vibenet/demos/_components/AnimatedAmount.tsx index 9cef75e..55fa203 100644 --- a/app/demos/_components/AnimatedAmount.tsx +++ b/app/vibenet/demos/_components/AnimatedAmount.tsx @@ -3,7 +3,7 @@ import { useCallback, useEffect, useRef, useState } from 'react'; import { animate, motion, useMotionValue, useTransform } from 'motion/react'; -import { cn } from '../../components/ui/cn'; +import { cn } from '../../../components/ui/cn'; type AnimatedAmountProps = { text: string; diff --git a/app/demos/_components/DemoHeader.tsx b/app/vibenet/demos/_components/DemoHeader.tsx similarity index 95% rename from app/demos/_components/DemoHeader.tsx rename to app/vibenet/demos/_components/DemoHeader.tsx index ed892a4..709be53 100644 --- a/app/demos/_components/DemoHeader.tsx +++ b/app/vibenet/demos/_components/DemoHeader.tsx @@ -1,6 +1,6 @@ import type { ReactNode } from 'react'; -import { Text } from '../../components/ui/Text'; +import { Text } from '../../../components/ui/Text'; type DemoHeaderProps = { eyebrow?: string; diff --git a/app/demos/_components/DemoTabs.tsx b/app/vibenet/demos/_components/DemoTabs.tsx similarity index 97% rename from app/demos/_components/DemoTabs.tsx rename to app/vibenet/demos/_components/DemoTabs.tsx index fc9dbbe..5e583e6 100644 --- a/app/demos/_components/DemoTabs.tsx +++ b/app/vibenet/demos/_components/DemoTabs.tsx @@ -2,7 +2,7 @@ import { motion } from 'motion/react'; -import { cn } from '../../components/ui/cn'; +import { cn } from '../../../components/ui/cn'; export type DemoTabItem = { value: string; diff --git a/app/demos/_components/Stat.tsx b/app/vibenet/demos/_components/Stat.tsx similarity index 100% rename from app/demos/_components/Stat.tsx rename to app/vibenet/demos/_components/Stat.tsx diff --git a/app/demos/account/AccountDemo.tsx b/app/vibenet/demos/account/AccountDemo.tsx similarity index 99% rename from app/demos/account/AccountDemo.tsx rename to app/vibenet/demos/account/AccountDemo.tsx index 054aacb..7f0bff5 100644 --- a/app/demos/account/AccountDemo.tsx +++ b/app/vibenet/demos/account/AccountDemo.tsx @@ -58,19 +58,19 @@ import Link from 'next/link'; import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { AnimatePresence, motion } from 'motion/react'; -import { Button } from '../../components/ui/Button'; -import { Card } from '../../components/ui/Card'; -import { cn } from '../../components/ui/cn'; -import { AnimatedArrowIcon, CloseIcon } from '../../components/ui/icons'; -import { Modal } from '../../components/ui/Modal'; -import { Select } from '../../components/ui/Select'; -import { Text } from '../../components/ui/Text'; +import { Button } from '../../../components/ui/Button'; +import { Card } from '../../../components/ui/Card'; +import { cn } from '../../../components/ui/cn'; +import { AnimatedArrowIcon, CloseIcon } from '../../../components/ui/icons'; +import { Modal } from '../../../components/ui/Modal'; +import { Select } from '../../../components/ui/Select'; +import { Text } from '../../../components/ui/Text'; import { toast } from 'sonner'; -import { vibenetApi } from '../../vibenet/library/client'; -import { ACCOUNT_RPC_URL, VIBENET_EXPLORER_PATH } from '../../vibenet/library/config'; +import { vibenetApi } from '../../library/client'; +import { ACCOUNT_RPC_URL, VIBENET_EXPLORER_PATH } from '../../library/config'; import { AnimatedAmount } from '../_components/AnimatedAmount'; -import { Spinner } from '../../components/ui/Spinner'; -import { Tabs } from '../../components/ui/Tabs'; +import { Spinner } from '../../../components/ui/Spinner'; +import { Tabs } from '../../../components/ui/Tabs'; import { Stat } from '../_components/Stat'; import { ActivityLog } from './components/ActivityLog'; import { AppsView } from './components/AppsView'; diff --git a/app/demos/account/components/ActivityLog.tsx b/app/vibenet/demos/account/components/ActivityLog.tsx similarity index 97% rename from app/demos/account/components/ActivityLog.tsx rename to app/vibenet/demos/account/components/ActivityLog.tsx index 9093394..8d127dd 100644 --- a/app/demos/account/components/ActivityLog.tsx +++ b/app/vibenet/demos/account/components/ActivityLog.tsx @@ -2,10 +2,10 @@ import Link from 'next/link'; import { useEffect, useRef, useState } from 'react'; import { motion, useReducedMotion } from 'motion/react'; -import { Button } from '../../../components/ui/Button'; -import { cn } from '../../../components/ui/cn'; -import { Text } from '../../../components/ui/Text'; -import { VIBENET_EXPLORER_PATH } from '../../../vibenet/library/config'; +import { Button } from '../../../../components/ui/Button'; +import { cn } from '../../../../components/ui/cn'; +import { Text } from '../../../../components/ui/Text'; +import { VIBENET_EXPLORER_PATH } from '../../../library/config'; import { type ActivityEntry, type StoredAccount, formatTime } from '../library/model'; import { short } from '../shared'; import { AccountIdentity, Badge } from './primitives'; diff --git a/app/demos/account/components/AppsView.tsx b/app/vibenet/demos/account/components/AppsView.tsx similarity index 97% rename from app/demos/account/components/AppsView.tsx rename to app/vibenet/demos/account/components/AppsView.tsx index 7d24743..e3e02da 100644 --- a/app/demos/account/components/AppsView.tsx +++ b/app/vibenet/demos/account/components/AppsView.tsx @@ -1,9 +1,9 @@ 'use client'; -import { Button } from '../../../components/ui/Button'; -import { Card } from '../../../components/ui/Card'; -import { cn } from '../../../components/ui/cn'; -import { Text } from '../../../components/ui/Text'; +import { Button } from '../../../../components/ui/Button'; +import { Card } from '../../../../components/ui/Card'; +import { cn } from '../../../../components/ui/cn'; +import { Text } from '../../../../components/ui/Text'; import type { DemoApp } from '../library/apps'; import type { DemoChain } from '../library/chains'; import { formatExpiry, type AppSessionKey, type AppSubAccount, type StoredAccount } from '../library/model'; diff --git a/app/demos/account/components/ConfigView.tsx b/app/vibenet/demos/account/components/ConfigView.tsx similarity index 98% rename from app/demos/account/components/ConfigView.tsx rename to app/vibenet/demos/account/components/ConfigView.tsx index 418f1c7..648516f 100644 --- a/app/demos/account/components/ConfigView.tsx +++ b/app/vibenet/demos/account/components/ConfigView.tsx @@ -5,14 +5,14 @@ import type { Address, Hex } from '@aa'; import Link from 'next/link'; import { AnimatePresence, motion } from 'motion/react'; -import { Button } from '../../../components/ui/Button'; -import { Card } from '../../../components/ui/Card'; -import { cn } from '../../../components/ui/cn'; -import { CloseIcon } from '../../../components/ui/icons'; -import { Spinner } from '../../../components/ui/Spinner'; -import { Select } from '../../../components/ui/Select'; -import { Text } from '../../../components/ui/Text'; -import { VIBENET_EXPLORER_PATH } from '../../../vibenet/library/config'; +import { Button } from '../../../../components/ui/Button'; +import { Card } from '../../../../components/ui/Card'; +import { cn } from '../../../../components/ui/cn'; +import { CloseIcon } from '../../../../components/ui/icons'; +import { Spinner } from '../../../../components/ui/Spinner'; +import { Select } from '../../../../components/ui/Select'; +import { Text } from '../../../../components/ui/Text'; +import { VIBENET_EXPLORER_PATH } from '../../../library/config'; import { AnimatedAmount } from '../../_components/AnimatedAmount'; import { DEMO_CHAINS, diff --git a/app/demos/account/components/primitives.tsx b/app/vibenet/demos/account/components/primitives.tsx similarity index 98% rename from app/demos/account/components/primitives.tsx rename to app/vibenet/demos/account/components/primitives.tsx index ac707eb..fdbaf42 100644 --- a/app/demos/account/components/primitives.tsx +++ b/app/vibenet/demos/account/components/primitives.tsx @@ -1,8 +1,8 @@ import type { ReactNode } from 'react'; import { AnimatePresence, motion } from 'motion/react'; -import { cn } from '../../../components/ui/cn'; -import { Text } from '../../../components/ui/Text'; +import { cn } from '../../../../components/ui/cn'; +import { Text } from '../../../../components/ui/Text'; import type { SignerKind } from '../library/model'; import { KIND_LABEL, short } from '../shared'; diff --git a/app/demos/account/layout.tsx b/app/vibenet/demos/account/layout.tsx similarity index 66% rename from app/demos/account/layout.tsx rename to app/vibenet/demos/account/layout.tsx index 01b9d9c..18fb041 100644 --- a/app/demos/account/layout.tsx +++ b/app/vibenet/demos/account/layout.tsx @@ -1,8 +1,6 @@ import type { Metadata } from 'next'; import type { ReactNode } from 'react'; -import { MaintenanceBanner } from '../../vibenet/components/MaintenanceBanner'; - // The account demo page is a client component; this passthrough layout carries // its title/description. // @@ -12,19 +10,13 @@ import { MaintenanceBanner } from '../../vibenet/components/MaintenanceBanner'; // generator resolves a template to its `default` and would publish the bare page // title, disagreeing with what the browser renders. export const metadata: Metadata = { - title: 'Native Account Abstraction · Demos', + title: 'Native Account Abstraction · Vibenet', description: 'Create native account abstraction accounts from in-browser keys, fund them from the faucet, and inspect balances on Vibenet.', }; -// This demo runs on Vibenet, so it carries Vibenet's maintenance notice — the -// demo is unusable while the devnet is down. Scoped here rather than to the -// /demos section, since other demos may run on other test networks. +// Passthrough. The demo runs on Vibenet and lives under /vibenet/demos, so it +// inherits Vibenet's maintenance notice from app/vibenet/layout.tsx. export default function AccountDemoLayout({ children }: { children: ReactNode }) { - return ( - <> - - {children} - - ); + return <>{children}; } diff --git a/app/demos/account/library/apps.ts b/app/vibenet/demos/account/library/apps.ts similarity index 100% rename from app/demos/account/library/apps.ts rename to app/vibenet/demos/account/library/apps.ts diff --git a/app/demos/account/library/calls.ts b/app/vibenet/demos/account/library/calls.ts similarity index 100% rename from app/demos/account/library/calls.ts rename to app/vibenet/demos/account/library/calls.ts diff --git a/app/demos/account/library/chains.ts b/app/vibenet/demos/account/library/chains.ts similarity index 99% rename from app/demos/account/library/chains.ts rename to app/vibenet/demos/account/library/chains.ts index b453205..3e89916 100644 --- a/app/demos/account/library/chains.ts +++ b/app/vibenet/demos/account/library/chains.ts @@ -5,7 +5,7 @@ import { vibenetDevnetDeployment, } from "@aa"; -import { isAddress } from "../../../vibenet/library/format"; +import { isAddress } from "../../../library/format"; /** * Last-known-good vibenet EIP-8130 system contracts — a STATIC FALLBACK only. @@ -100,7 +100,7 @@ export function deploymentFromContracts( import { ACCOUNT_BUNDLER_URL, ACCOUNT_PAYER_URL, -} from "../../../vibenet/library/config"; +} from "../../../library/config"; /** * How EIP-8130 accounts execute on a given chain: diff --git a/app/demos/account/library/model.ts b/app/vibenet/demos/account/library/model.ts similarity index 100% rename from app/demos/account/library/model.ts rename to app/vibenet/demos/account/library/model.ts diff --git a/app/demos/account/library/policy.ts b/app/vibenet/demos/account/library/policy.ts similarity index 99% rename from app/demos/account/library/policy.ts rename to app/vibenet/demos/account/library/policy.ts index 3a520ba..728821e 100644 --- a/app/demos/account/library/policy.ts +++ b/app/vibenet/demos/account/library/policy.ts @@ -12,7 +12,7 @@ import { parseUnits, } from '@aa'; -import { vibenetApi } from '../../../vibenet/library/client'; +import { vibenetApi } from '../../../library/client'; import { BASE_SEPOLIA_USDC } from './chains'; import { SCOPE, scopeChips } from './model'; import { short } from '../shared'; diff --git a/app/demos/account/library/templates.ts b/app/vibenet/demos/account/library/templates.ts similarity index 100% rename from app/demos/account/library/templates.ts rename to app/vibenet/demos/account/library/templates.ts diff --git a/app/demos/account/loading.tsx b/app/vibenet/demos/account/loading.tsx similarity index 97% rename from app/demos/account/loading.tsx rename to app/vibenet/demos/account/loading.tsx index b78ddf5..1ad3fe6 100644 --- a/app/demos/account/loading.tsx +++ b/app/vibenet/demos/account/loading.tsx @@ -1,4 +1,4 @@ -import { Skeleton } from '../../components/ui/Skeleton'; +import { Skeleton } from '../../../components/ui/Skeleton'; export default function Loading() { return ( diff --git a/app/demos/account/page.tsx b/app/vibenet/demos/account/page.tsx similarity index 100% rename from app/demos/account/page.tsx rename to app/vibenet/demos/account/page.tsx diff --git a/app/demos/account/shared.ts b/app/vibenet/demos/account/shared.ts similarity index 95% rename from app/demos/account/shared.ts rename to app/vibenet/demos/account/shared.ts index a230abb..879c87f 100644 --- a/app/demos/account/shared.ts +++ b/app/vibenet/demos/account/shared.ts @@ -2,7 +2,7 @@ import type { Address, Hex } from '@aa'; -import type { AccountBalancesResponse } from '../../vibenet/library/api-types'; +import type { AccountBalancesResponse } from '../../library/api-types'; import type { ActivityEntry, SignerKind, StoredAccount } from './library/model'; /** An in-browser signer key held in the demo wallet. */ diff --git a/app/demos/b20/B20Demo.tsx b/app/vibenet/demos/b20/B20Demo.tsx similarity index 88% rename from app/demos/b20/B20Demo.tsx rename to app/vibenet/demos/b20/B20Demo.tsx index 34d3d65..551d412 100644 --- a/app/demos/b20/B20Demo.tsx +++ b/app/vibenet/demos/b20/B20Demo.tsx @@ -1,16 +1,15 @@ 'use client'; -import Link from 'next/link'; import { useCallback, useEffect, useState } from 'react'; import { formatEther, isAddress, type Address, type Hex } from 'viem'; -import { trackB20Action, trackB20ModuleSelect, trackB20WalletConnection } from '../../analytics/events'; -import { Button } from '../../components/ui/Button'; -import { cn } from '../../components/ui/cn'; -import { Tabs } from '../../components/ui/Tabs'; -import { textVariantClasses } from '../../components/ui/Text'; -import { CopyableValue } from '../../vibenet/components/CopyableValue'; -import { VIBENET_EXPLORER_PATH, VIBENET_RPC_URL } from '../../vibenet/library/config'; +import { trackB20Action, trackB20ModuleSelect, trackB20WalletConnection } from '../../../analytics/events'; +import { Button } from '../../../components/ui/Button'; +import { cn } from '../../../components/ui/cn'; +import { Tabs } from '../../../components/ui/Tabs'; +import { textVariantClasses } from '../../../components/ui/Text'; +import { CopyableValue } from '../../components/CopyableValue'; +import { VIBENET_EXPLORER_PATH, VIBENET_RPC_URL } from '../../library/config'; import { addEthereumChain, getChainId, @@ -19,7 +18,7 @@ import { isUserRejection, switchEthereumChain, walletErrorMessage, -} from '../../vibenet/library/wallet'; +} from '../../library/wallet'; import { Activity } from './components/Activity'; import { AnnouncementModule, SampleAnnouncementViewer } from './components/AnnouncementModule'; import { DeployModule } from './components/DeployModule'; @@ -384,45 +383,36 @@ export function B20Demo() { : 'disconnected'; return (
-
-
- - Vibenet - - - Faucet - - {wallet ? ( -
- - - {walletBalance === null ? '…' : `${Number(formatEther(walletBalance)).toFixed(3)} ETH`} - -
- ) : ( - - )} -
-
-
- selectModule(value as Module)} - ariaLabel="B20 modules" - /> +
+
+ selectModule(value as Module)} + ariaLabel="B20 modules" + /> +
+
+ {wallet ? ( +
+ + + {walletBalance === null ? '…' : `${Number(formatEther(walletBalance)).toFixed(3)} ETH`} + +
+ ) : ( + + )} +
{module === 'policy' ? ( diff --git a/app/demos/b20/components/Activity.tsx b/app/vibenet/demos/b20/components/Activity.tsx similarity index 92% rename from app/demos/b20/components/Activity.tsx rename to app/vibenet/demos/b20/components/Activity.tsx index b5f9ef9..67cbb85 100644 --- a/app/demos/b20/components/Activity.tsx +++ b/app/vibenet/demos/b20/components/Activity.tsx @@ -1,8 +1,8 @@ import Link from 'next/link'; -import { Card } from '../../../components/ui/Card'; -import { Text } from '../../../components/ui/Text'; -import { VIBENET_EXPLORER_PATH } from '../../../vibenet/library/config'; +import { Card } from '../../../../components/ui/Card'; +import { Text } from '../../../../components/ui/Text'; +import { VIBENET_EXPLORER_PATH } from '../../../library/config'; import { shortAddress } from '../lib/protocol'; import type { ActivityItem } from '../lib/types'; diff --git a/app/demos/b20/components/AnnouncementModule.tsx b/app/vibenet/demos/b20/components/AnnouncementModule.tsx similarity index 97% rename from app/demos/b20/components/AnnouncementModule.tsx rename to app/vibenet/demos/b20/components/AnnouncementModule.tsx index d315ec7..c9eeb6b 100644 --- a/app/demos/b20/components/AnnouncementModule.tsx +++ b/app/vibenet/demos/b20/components/AnnouncementModule.tsx @@ -4,13 +4,13 @@ import Link from 'next/link'; import { useCallback, useEffect, useState } from 'react'; import { encodeFunctionData, type Address, type Hex } from 'viem'; -import { Button } from '../../../components/ui/Button'; -import { Card } from '../../../components/ui/Card'; -import { cn } from '../../../components/ui/cn'; -import { InfoTooltip } from '../../../components/ui/InfoTooltip'; -import { Text } from '../../../components/ui/Text'; -import { VIBENET_EXPLORER_PATH } from '../../../vibenet/library/config'; -import { walletErrorMessage } from '../../../vibenet/library/wallet'; +import { Button } from '../../../../components/ui/Button'; +import { Card } from '../../../../components/ui/Card'; +import { cn } from '../../../../components/ui/cn'; +import { InfoTooltip } from '../../../../components/ui/InfoTooltip'; +import { Text } from '../../../../components/ui/Text'; +import { VIBENET_EXPLORER_PATH } from '../../../library/config'; +import { walletErrorMessage } from '../../../library/wallet'; import { client } from '../lib/constants'; import { B20_HELP } from '../lib/glossary'; import { amount, assetAbi, b20Abi, roleId } from '../lib/protocol'; diff --git a/app/demos/b20/components/AttachPolicy.tsx b/app/vibenet/demos/b20/components/AttachPolicy.tsx similarity index 94% rename from app/demos/b20/components/AttachPolicy.tsx rename to app/vibenet/demos/b20/components/AttachPolicy.tsx index 296f8bc..7e63aff 100644 --- a/app/demos/b20/components/AttachPolicy.tsx +++ b/app/vibenet/demos/b20/components/AttachPolicy.tsx @@ -4,12 +4,12 @@ import Link from 'next/link'; import { useEffect, useState } from 'react'; import { encodeFunctionData, type Address, type Hex } from 'viem'; -import { Button } from '../../../components/ui/Button'; -import { Card } from '../../../components/ui/Card'; -import { Select } from '../../../components/ui/Select'; -import { Text } from '../../../components/ui/Text'; -import { VIBENET_EXPLORER_PATH } from '../../../vibenet/library/config'; -import { walletErrorMessage } from '../../../vibenet/library/wallet'; +import { Button } from '../../../../components/ui/Button'; +import { Card } from '../../../../components/ui/Card'; +import { Select } from '../../../../components/ui/Select'; +import { Text } from '../../../../components/ui/Text'; +import { VIBENET_EXPLORER_PATH } from '../../../library/config'; +import { walletErrorMessage } from '../../../library/wallet'; import { client } from '../lib/constants'; import { b20Abi, diff --git a/app/demos/b20/components/CopyPromptButton.tsx b/app/vibenet/demos/b20/components/CopyPromptButton.tsx similarity index 91% rename from app/demos/b20/components/CopyPromptButton.tsx rename to app/vibenet/demos/b20/components/CopyPromptButton.tsx index d66fc28..e3b14ec 100644 --- a/app/demos/b20/components/CopyPromptButton.tsx +++ b/app/vibenet/demos/b20/components/CopyPromptButton.tsx @@ -2,9 +2,9 @@ import { useCallback, useEffect, useRef, useState } from 'react'; -import { trackB20PromptCopy } from '../../../analytics/events'; -import { CheckIcon, ClipboardIcon } from '../../../components/ui/icons'; -import { cn } from '../../../components/ui/cn'; +import { trackB20PromptCopy } from '../../../../analytics/events'; +import { CheckIcon, ClipboardIcon } from '../../../../components/ui/icons'; +import { cn } from '../../../../components/ui/cn'; import type { B20Prompt } from '../lib/prompts'; type CopyPromptButtonProps = { diff --git a/app/demos/b20/components/CreatePolicy.tsx b/app/vibenet/demos/b20/components/CreatePolicy.tsx similarity index 97% rename from app/demos/b20/components/CreatePolicy.tsx rename to app/vibenet/demos/b20/components/CreatePolicy.tsx index 709c18c..faa7f54 100644 --- a/app/demos/b20/components/CreatePolicy.tsx +++ b/app/vibenet/demos/b20/components/CreatePolicy.tsx @@ -4,14 +4,14 @@ import Link from 'next/link'; import { useEffect, useRef, useState } from 'react'; import { encodeFunctionData, isAddress, type Address, type Hex } from 'viem'; -import { Button } from '../../../components/ui/Button'; -import { Card } from '../../../components/ui/Card'; -import { cn } from '../../../components/ui/cn'; -import { Select } from '../../../components/ui/Select'; -import { Text } from '../../../components/ui/Text'; -import { CopyableValue } from '../../../vibenet/components/CopyableValue'; -import { VIBENET_EXPLORER_PATH } from '../../../vibenet/library/config'; -import { walletErrorMessage } from '../../../vibenet/library/wallet'; +import { Button } from '../../../../components/ui/Button'; +import { Card } from '../../../../components/ui/Card'; +import { cn } from '../../../../components/ui/cn'; +import { Select } from '../../../../components/ui/Select'; +import { Text } from '../../../../components/ui/Text'; +import { CopyableValue } from '../../../components/CopyableValue'; +import { VIBENET_EXPLORER_PATH } from '../../../library/config'; +import { walletErrorMessage } from '../../../library/wallet'; import { client } from '../lib/constants'; import { ACTIVATION_REGISTRY, diff --git a/app/demos/b20/components/DeployModule.tsx b/app/vibenet/demos/b20/components/DeployModule.tsx similarity index 98% rename from app/demos/b20/components/DeployModule.tsx rename to app/vibenet/demos/b20/components/DeployModule.tsx index 9ef4448..f8ebcdd 100644 --- a/app/demos/b20/components/DeployModule.tsx +++ b/app/vibenet/demos/b20/components/DeployModule.tsx @@ -4,15 +4,15 @@ import Link from 'next/link'; import { useEffect, useState, type CSSProperties } from 'react'; import { encodeFunctionData, type Address, type Hex } from 'viem'; -import { Button } from '../../../components/ui/Button'; -import { Card } from '../../../components/ui/Card'; -import { cn } from '../../../components/ui/cn'; -import { InfoTooltip } from '../../../components/ui/InfoTooltip'; -import { Select } from '../../../components/ui/Select'; -import { Text } from '../../../components/ui/Text'; -import { CopyableValue } from '../../../vibenet/components/CopyableValue'; -import { VIBENET_EXPLORER_PATH } from '../../../vibenet/library/config'; -import { walletErrorMessage } from '../../../vibenet/library/wallet'; +import { Button } from '../../../../components/ui/Button'; +import { Card } from '../../../../components/ui/Card'; +import { cn } from '../../../../components/ui/cn'; +import { InfoTooltip } from '../../../../components/ui/InfoTooltip'; +import { Select } from '../../../../components/ui/Select'; +import { Text } from '../../../../components/ui/Text'; +import { CopyableValue } from '../../../components/CopyableValue'; +import { VIBENET_EXPLORER_PATH } from '../../../library/config'; +import { walletErrorMessage } from '../../../library/wallet'; import { client, INITIAL_ALLOCATION_MAX, INITIAL_ALLOCATION_MEMO } from '../lib/constants'; import { B20_HELP, SCOPE_HELP } from '../lib/glossary'; import { diff --git a/app/demos/b20/components/MemoHistory.tsx b/app/vibenet/demos/b20/components/MemoHistory.tsx similarity index 97% rename from app/demos/b20/components/MemoHistory.tsx rename to app/vibenet/demos/b20/components/MemoHistory.tsx index 4e79f11..827970f 100644 --- a/app/demos/b20/components/MemoHistory.tsx +++ b/app/vibenet/demos/b20/components/MemoHistory.tsx @@ -4,9 +4,9 @@ import Link from 'next/link'; import { parseEventLogs, zeroAddress, type Address, type Hex } from 'viem'; import { useEffect, useState } from 'react'; -import { Card } from '../../../components/ui/Card'; -import { Text } from '../../../components/ui/Text'; -import { VIBENET_EXPLORER_PATH } from '../../../vibenet/library/config'; +import { Card } from '../../../../components/ui/Card'; +import { Text } from '../../../../components/ui/Text'; +import { VIBENET_EXPLORER_PATH } from '../../../library/config'; import { client } from '../lib/constants'; import { bytes32ToMemo, formatAmount, shortAddress } from '../lib/protocol'; diff --git a/app/demos/b20/components/MemoModule.tsx b/app/vibenet/demos/b20/components/MemoModule.tsx similarity index 96% rename from app/demos/b20/components/MemoModule.tsx rename to app/vibenet/demos/b20/components/MemoModule.tsx index 83fad8c..b0d4b1b 100644 --- a/app/demos/b20/components/MemoModule.tsx +++ b/app/vibenet/demos/b20/components/MemoModule.tsx @@ -3,10 +3,10 @@ import { useState } from 'react'; import { encodeFunctionData, isAddress, type Address, type Hex } from 'viem'; -import { Button } from '../../../components/ui/Button'; -import { Card } from '../../../components/ui/Card'; -import { Text } from '../../../components/ui/Text'; -import { walletErrorMessage } from '../../../vibenet/library/wallet'; +import { Button } from '../../../../components/ui/Button'; +import { Card } from '../../../../components/ui/Card'; +import { Text } from '../../../../components/ui/Text'; +import { walletErrorMessage } from '../../../library/wallet'; import { B20_HELP } from '../lib/glossary'; import { amount, b20Abi, formatAmount, memoToBytes32, shortAddress } from '../lib/protocol'; import { READ_MEMO_PROMPT } from '../lib/prompts'; diff --git a/app/demos/b20/components/PolicyIdSummary.tsx b/app/vibenet/demos/b20/components/PolicyIdSummary.tsx similarity index 98% rename from app/demos/b20/components/PolicyIdSummary.tsx rename to app/vibenet/demos/b20/components/PolicyIdSummary.tsx index 323e1dc..d5f1884 100644 --- a/app/demos/b20/components/PolicyIdSummary.tsx +++ b/app/vibenet/demos/b20/components/PolicyIdSummary.tsx @@ -3,7 +3,7 @@ import { useEffect, useState } from 'react'; import type { Address } from 'viem'; -import { cn } from '../../../components/ui/cn'; +import { cn } from '../../../../components/ui/cn'; import { client } from '../lib/constants'; import { normalizePolicyId, diff --git a/app/demos/b20/components/PolicyModule.tsx b/app/vibenet/demos/b20/components/PolicyModule.tsx similarity index 97% rename from app/demos/b20/components/PolicyModule.tsx rename to app/vibenet/demos/b20/components/PolicyModule.tsx index 4125e8e..42582bf 100644 --- a/app/demos/b20/components/PolicyModule.tsx +++ b/app/vibenet/demos/b20/components/PolicyModule.tsx @@ -4,12 +4,12 @@ import Link from 'next/link'; import { useState } from 'react'; import type { Address, Hex } from 'viem'; -import { Button } from '../../../components/ui/Button'; -import { Card } from '../../../components/ui/Card'; -import { cn } from '../../../components/ui/cn'; -import { InfoTooltip } from '../../../components/ui/InfoTooltip'; -import { Text } from '../../../components/ui/Text'; -import { VIBENET_EXPLORER_PATH } from '../../../vibenet/library/config'; +import { Button } from '../../../../components/ui/Button'; +import { Card } from '../../../../components/ui/Card'; +import { cn } from '../../../../components/ui/cn'; +import { InfoTooltip } from '../../../../components/ui/InfoTooltip'; +import { Text } from '../../../../components/ui/Text'; +import { VIBENET_EXPLORER_PATH } from '../../../library/config'; import { B20_HELP, SCOPE_HELP } from '../lib/glossary'; import { formatAmount, MAX_SUPPLY_CAP, policyKindFromId, policyKindLabel, shortAddress } from '../lib/protocol'; import { READ_POLICY_PROMPT } from '../lib/prompts'; diff --git a/app/demos/b20/components/primitives.tsx b/app/vibenet/demos/b20/components/primitives.tsx similarity index 94% rename from app/demos/b20/components/primitives.tsx rename to app/vibenet/demos/b20/components/primitives.tsx index fd902fe..2eae7c9 100644 --- a/app/demos/b20/components/primitives.tsx +++ b/app/vibenet/demos/b20/components/primitives.tsx @@ -9,9 +9,9 @@ import { type ReactNode, } from 'react'; -import { cn } from '../../../components/ui/cn'; -import { InfoTooltip } from '../../../components/ui/InfoTooltip'; -import { Text, textVariantClasses } from '../../../components/ui/Text'; +import { cn } from '../../../../components/ui/cn'; +import { InfoTooltip } from '../../../../components/ui/InfoTooltip'; +import { Text, textVariantClasses } from '../../../../components/ui/Text'; // Small presentational building blocks shared across the B20 demo modules. diff --git a/app/vibenet/demos/b20/layout.tsx b/app/vibenet/demos/b20/layout.tsx new file mode 100644 index 0000000..0069e25 --- /dev/null +++ b/app/vibenet/demos/b20/layout.tsx @@ -0,0 +1,14 @@ +import type { Metadata } from 'next'; +import type { ReactNode } from 'react'; + +// Title convention: a page inside a section is "{Page} · {Section}". +export const metadata: Metadata = { + title: 'B20 Playground · Vibenet', + description: 'Explore, configure, and issue Base-native B20 tokens on Vibenet.', +}; + +// Passthrough. The demo runs on Vibenet and lives under /vibenet/demos, so it +// inherits Vibenet's maintenance notice from app/vibenet/layout.tsx. +export default function B20DemoLayout({ children }: { children: ReactNode }) { + return <>{children}; +} diff --git a/app/demos/b20/lib/constants.ts b/app/vibenet/demos/b20/lib/constants.ts similarity index 92% rename from app/demos/b20/lib/constants.ts rename to app/vibenet/demos/b20/lib/constants.ts index ee1840e..8dac5d9 100644 --- a/app/demos/b20/lib/constants.ts +++ b/app/vibenet/demos/b20/lib/constants.ts @@ -1,6 +1,6 @@ import { createPublicClient, http } from 'viem'; -import { VIBENET_RPC_URL } from '../../../vibenet/library/config'; +import { VIBENET_RPC_URL } from '../../../library/config'; import type { Module } from './types'; // The Vibenet demo purposefully uses a raw EIP-1193 wallet rather than adding a diff --git a/app/demos/b20/lib/glossary.ts b/app/vibenet/demos/b20/lib/glossary.ts similarity index 100% rename from app/demos/b20/lib/glossary.ts rename to app/vibenet/demos/b20/lib/glossary.ts diff --git a/app/demos/b20/lib/prompts.test.ts b/app/vibenet/demos/b20/lib/prompts.test.ts similarity index 100% rename from app/demos/b20/lib/prompts.test.ts rename to app/vibenet/demos/b20/lib/prompts.test.ts diff --git a/app/demos/b20/lib/prompts.ts b/app/vibenet/demos/b20/lib/prompts.ts similarity index 100% rename from app/demos/b20/lib/prompts.ts rename to app/vibenet/demos/b20/lib/prompts.ts diff --git a/app/demos/b20/lib/protocol.test.ts b/app/vibenet/demos/b20/lib/protocol.test.ts similarity index 100% rename from app/demos/b20/lib/protocol.test.ts rename to app/vibenet/demos/b20/lib/protocol.test.ts diff --git a/app/demos/b20/lib/protocol.ts b/app/vibenet/demos/b20/lib/protocol.ts similarity index 100% rename from app/demos/b20/lib/protocol.ts rename to app/vibenet/demos/b20/lib/protocol.ts diff --git a/app/demos/b20/lib/recent.test.ts b/app/vibenet/demos/b20/lib/recent.test.ts similarity index 100% rename from app/demos/b20/lib/recent.test.ts rename to app/vibenet/demos/b20/lib/recent.test.ts diff --git a/app/demos/b20/lib/recent.ts b/app/vibenet/demos/b20/lib/recent.ts similarity index 100% rename from app/demos/b20/lib/recent.ts rename to app/vibenet/demos/b20/lib/recent.ts diff --git a/app/demos/b20/lib/samples.test.ts b/app/vibenet/demos/b20/lib/samples.test.ts similarity index 100% rename from app/demos/b20/lib/samples.test.ts rename to app/vibenet/demos/b20/lib/samples.test.ts diff --git a/app/demos/b20/lib/samples.ts b/app/vibenet/demos/b20/lib/samples.ts similarity index 100% rename from app/demos/b20/lib/samples.ts rename to app/vibenet/demos/b20/lib/samples.ts diff --git a/app/demos/b20/lib/types.ts b/app/vibenet/demos/b20/lib/types.ts similarity index 100% rename from app/demos/b20/lib/types.ts rename to app/vibenet/demos/b20/lib/types.ts diff --git a/app/demos/b20/page.tsx b/app/vibenet/demos/b20/page.tsx similarity index 100% rename from app/demos/b20/page.tsx rename to app/vibenet/demos/b20/page.tsx diff --git a/app/demos/catalogue.test.ts b/app/vibenet/demos/catalogue.test.ts similarity index 84% rename from app/demos/catalogue.test.ts rename to app/vibenet/demos/catalogue.test.ts index 60674c6..265c35c 100644 --- a/app/demos/catalogue.test.ts +++ b/app/vibenet/demos/catalogue.test.ts @@ -8,7 +8,7 @@ describe('demoLabel', () => { }); it('prefers shortTitle over title when both are set', () => { - const account = DEMOS.find((d) => d.href === '/demos/account'); + const account = DEMOS.find((d) => d.href === '/vibenet/demos/account'); expect(account?.title).toBe('Native Account Abstraction'); expect(demoLabel('account')).toBe(account?.shortTitle); }); @@ -31,9 +31,9 @@ describe('demoLabel', () => { }); describe('DEMOS', () => { - it('gives every entry a /demos/ href, so demoLabel can resolve it', () => { + it('gives every entry a /vibenet/demos/ href, so demoLabel can resolve it', () => { for (const demo of DEMOS) { - expect(demo.href.startsWith('/demos/')).toBe(true); + expect(demo.href.startsWith('/vibenet/demos/')).toBe(true); } }); diff --git a/app/demos/catalogue.ts b/app/vibenet/demos/catalogue.ts similarity index 88% rename from app/demos/catalogue.ts rename to app/vibenet/demos/catalogue.ts index 3848192..f78d141 100644 --- a/app/demos/catalogue.ts +++ b/app/vibenet/demos/catalogue.ts @@ -4,7 +4,7 @@ // can read it too. export type DemoEntry = { - /** Route for the demo, e.g. `/demos/account`. */ + /** Route for the demo, e.g. `/vibenet/demos/account`. */ href: string; /** Short tag shown beside the title on the card, usually the spec or network. */ eyebrow: string; @@ -23,7 +23,7 @@ export type DemoEntry = { export const DEMOS: DemoEntry[] = [ { - href: '/demos/b20', + href: '/vibenet/demos/b20', eyebrow: 'B20', title: 'B20 Playground', shortTitle: 'B20 Playground', @@ -37,7 +37,7 @@ export const DEMOS: DemoEntry[] = [ available: true, }, { - href: '/demos/account', + href: '/vibenet/demos/account', eyebrow: 'EIP-8130', title: 'Native Account Abstraction', shortTitle: 'Account', @@ -62,11 +62,11 @@ function prettifySlug(slug: string): string { } /** - * Breadcrumb label for the first path segment under /demos. Prefers the + * Breadcrumb label for the first path segment under /vibenet/demos. Prefers the * catalogue so the crumb matches the demo's real name, and degrades to a * title-cased slug for anything not registered. */ export function demoLabel(slug: string): string { - const demo = DEMOS.find((entry) => entry.href === `/demos/${slug}`); + const demo = DEMOS.find((entry) => entry.href === `/vibenet/demos/${slug}`); return demo?.shortTitle ?? demo?.title ?? prettifySlug(slug); } diff --git a/app/vibenet/page.tsx b/app/vibenet/page.tsx index e68dcec..c98ebed 100644 --- a/app/vibenet/page.tsx +++ b/app/vibenet/page.tsx @@ -5,12 +5,14 @@ import type { ReactNode } from 'react'; import Link from 'next/link'; import { Button } from '../components/ui/Button'; -import { Card } from '../components/ui/Card'; +import { Card, LinkCard } from '../components/ui/Card'; import { Text } from '../components/ui/Text'; import { CopyableValue } from './components/CopyableValue'; import { FeatureCard } from './components/FeatureCard'; import { WatchAssetButton } from './components/WatchAssetButton'; +import { Badge } from './demos/account/components/primitives'; +import { DEMOS, type DemoEntry } from './demos/catalogue'; import { resolveContracts } from './data/contracts'; import { FEATURES, featuresFromConfig } from './data/features'; import type { ConfigResponse } from './library/api-types'; @@ -199,6 +201,31 @@ export default function VibenetHomePage() { ) : null} +
+ Demos +
+ {DEMOS.map((demo) => + demo.available ? ( + + + + ) : ( + + + + ), + )} +
+
+
Connect @@ -272,3 +299,32 @@ export default function VibenetHomePage() {
); } + +function DemoCardBody({ demo }: { demo: DemoEntry }) { + return ( + <> +
+
+ {demo.title} + {demo.eyebrow} + {!demo.available ? ( + + Coming soon + + ) : null} +
+ + {demo.summary} + +
+
    + {demo.points.map((point) => ( +
  • +
  • + ))} +
+ + ); +} diff --git a/next.config.mjs b/next.config.mjs index d707851..bedfc29 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -15,18 +15,23 @@ const nextConfig = { // ignores this and uses its own runtime, so it's a no-op there. output: 'standalone', - // Demos moved from /vibenet/demos to the top-level /demos. Both old paths - // were in the published sitemap and /vibenet/demos/account is linked from the - // site-wide announcement banner, so they are permanently redirected rather - // than left to 404 for existing links and search results. + // Demos live under /vibenet/demos. They briefly sat at the top-level /demos, + // whose paths were published in the sitemap and linked externally, so those + // old paths are permanently redirected rather than left to 404 for existing + // links and search results. // // Internal Explorer moved from /tips to /internal-explorer. Legacy redirects // are internal-only: the public build 404s both prefixes via middleware so // it never advertises the internal surface. async redirects() { return [ - { source: '/vibenet/demos', destination: '/demos', permanent: true }, - { source: '/vibenet/demos/:path*', destination: '/demos/:path*', permanent: true }, + // The old demos index merged into the Vibenet overview; deep demo links + // map straight to their new home under /vibenet/demos. + { source: '/demos', destination: '/vibenet', permanent: true }, + { source: '/demos/:path*', destination: '/vibenet/demos/:path*', permanent: true }, + // /vibenet/demos has no index page — the demo list lives on the Vibenet + // overview, so send the bare path there. + { source: '/vibenet/demos', destination: '/vibenet', permanent: true }, ...(TARGET === 'internal' ? [ { source: '/tips', destination: '/internal-explorer', permanent: true }, diff --git a/public/AGENTS.md b/public/AGENTS.md index 28cf11d..70e7a18 100644 --- a/public/AGENTS.md +++ b/public/AGENTS.md @@ -27,7 +27,7 @@ Machine-readable entry point for agents working with Base Chain network state. | /upgrades/changelog | per release | re-fetch before stating an activation status | | /vibenet/faucet | monthly | stable within a session | | /api/snapshots | daily | re-fetch every session; never cache across sessions | -| /, /demos, /demos/account, /demos/b20, /vibenet | infrequent | stable within a session | +| /, /vibenet, /vibenet/demos/account, /vibenet/demos/b20 | infrequent | stable within a session | ## Machine-readable endpoints @@ -86,15 +86,11 @@ Discovered from the Next.js app directory. **Vibenet developer network** - [/vibenet](https://chain.base.org/vibenet) — Explore Vibenet, the Base devnet for testing in-flight protocol features. +- [/vibenet/demos/account](https://chain.base.org/vibenet/demos/account) — Create native account abstraction accounts from in-browser keys, fund them from the faucet, and inspect balances on Vibenet. +- [/vibenet/demos/b20](https://chain.base.org/vibenet/demos/b20) — Explore, configure, and issue Base-native B20 tokens on Vibenet. - [/vibenet/explorer](https://chain.base.org/vibenet/explorer) — Browse blocks, transactions, and addresses on the Vibenet devnet. - [/vibenet/faucet](https://chain.base.org/vibenet/faucet) — Request testnet tokens on Vibenet to fund accounts and try in-flight Base features. -**Other** - -- [/demos](https://chain.base.org/demos) — Interactive demos of in-flight Base features. Each demo runs on the test network that carries the feature it shows. -- [/demos/account](https://chain.base.org/demos/account) — Create native account abstraction accounts from in-browser keys, fund them from the faucet, and inspect balances on Vibenet. -- [/demos/b20](https://chain.base.org/demos/b20) — Explore, configure, and issue Base-native B20 tokens on Vibenet. - ## Generation - Script: `scripts/agents.mjs` diff --git a/public/llms-full.txt b/public/llms-full.txt index 98e8812..d7ad4d0 100644 --- a/public/llms-full.txt +++ b/public/llms-full.txt @@ -19,14 +19,11 @@ ## Vibenet developer network - [Vibenet · Base Chain](https://chain.base.org/vibenet): Explore Vibenet, the Base devnet for testing in-flight protocol features. +- [Native Account Abstraction · Vibenet](https://chain.base.org/vibenet/demos/account): Create native account abstraction accounts from in-browser keys, fund them from the faucet, and inspect balances on Vibenet. +- [B20 Playground · Vibenet](https://chain.base.org/vibenet/demos/b20): Explore, configure, and issue Base-native B20 tokens on Vibenet. - [Explorer · Vibenet](https://chain.base.org/vibenet/explorer): Browse blocks, transactions, and addresses on the Vibenet devnet. (changes daily; re-fetch before relying on it) - [Faucet · Vibenet](https://chain.base.org/vibenet/faucet): Request testnet tokens on Vibenet to fund accounts and try in-flight Base features. (changes monthly; re-fetch before relying on it) -## Other -- [Demos · Base Chain](https://chain.base.org/demos): Interactive demos of in-flight Base features. Each demo runs on the test network that carries the feature it shows. -- [Native Account Abstraction · Demos](https://chain.base.org/demos/account): Create native account abstraction accounts from in-browser keys, fund them from the faucet, and inspect balances on Vibenet. -- [B20 Playground · Demos](https://chain.base.org/demos/b20): Explore, configure, and issue Base-native B20 tokens on Vibenet. - ## Machine-readable endpoints - [Chain health](https://chain.base.org/api/health): JSON liveness probe for the chain.base.org service. Call this instead of parsing the homepage. - [Snapshots manifest](https://chain.base.org/api/snapshots): JSON array of the latest node snapshots per chain: chainId, chainName, block height, timestamp, client version, profile, total byte size, and a per-component breakdown. Call this instead of scraping /snapshots. diff --git a/public/llms.txt b/public/llms.txt index 9720909..74840d9 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -17,14 +17,11 @@ Freshness: /snapshots and /vibenet/explorer change daily. /vibenet/faucet change ## Vibenet developer network - [Vibenet · Base Chain](https://chain.base.org/vibenet): Explore Vibenet, the Base devnet for testing in-flight protocol features. +- [Native Account Abstraction · Vibenet](https://chain.base.org/vibenet/demos/account): Create native account abstraction accounts from in-browser keys, fund them from the faucet, and inspect balances on Vibenet. +- [B20 Playground · Vibenet](https://chain.base.org/vibenet/demos/b20): Explore, configure, and issue Base-native B20 tokens on Vibenet. - [Explorer · Vibenet](https://chain.base.org/vibenet/explorer): Browse blocks, transactions, and addresses on the Vibenet devnet. - [Faucet · Vibenet](https://chain.base.org/vibenet/faucet): Request testnet tokens on Vibenet to fund accounts and try in-flight Base features. -## Other -- [Demos · Base Chain](https://chain.base.org/demos): Interactive demos of in-flight Base features. Each demo runs on the test network that carries the feature it shows. -- [Native Account Abstraction · Demos](https://chain.base.org/demos/account): Create native account abstraction accounts from in-browser keys, fund them from the faucet, and inspect balances on Vibenet. -- [B20 Playground · Demos](https://chain.base.org/demos/b20): Explore, configure, and issue Base-native B20 tokens on Vibenet. - ## Machine-readable endpoints - [Chain health](https://chain.base.org/api/health): JSON liveness probe for the chain.base.org service. Call this instead of parsing the homepage. - [Snapshots manifest](https://chain.base.org/api/snapshots): JSON array of the latest node snapshots per chain: chainId, chainName, block height, timestamp, client version, profile, total byte size, and a per-component breakdown. Call this instead of scraping /snapshots.