Frontend for grapedao.org & grape.art built with Next.js + Material UI.
This UI combines a product landing experience with dedicated operational pages for Identity and Token Tools.
- Next.js (App Router + TypeScript)
- Material UI (dark theme + motion styling)
- Solana Wallet Adapter (Phantom + Solflare)
- Solana Web3 + SPL Token
- Metaplex Token Metadata program support for legacy NFT full burn flow
- Hero with product positioning and external links:
- Docs:
https://grapedao.gitbook.io - Discord:
https://discord.gg/grapedao
- Docs:
Grape DAOsection with cards for:- OG Reputation Spaces
- Grape Verification
- Grape Access
- GSPL Directory
- Governance UI
- Live Solana signals panel:
- TPS
- Avg slot time
- Slot
- Block height
- Epoch + progress
- Animated waveform telemetry
Route: /identity
- Connect/disconnect wallet
- RPC provider switcher
- Shyft is default
- Custom RPC supported
- Shyft URL is intentionally hidden in visible UI state
- Workspace tabs:
TransactAddress Book + LabelsClaim Round ManagerStakingApprovalsRecoveryHoldings
Route: /token (/tokentools redirects to /token)
- Dedicated token authority workspace
- Create mint
- Mint supply to destination owner ATA
- Batch mint and distribute to many wallets from recipient list input
- Update mint/freeze authority
- Write metadata JSON in-app with a pre-filled token template
- Set token image URI directly or upload token image file to Irys and auto-write image fields
- Upload metadata JSON to Irys mainnet and auto-fill URI
- Create metadata account
- Update metadata authority
- Update metadata URI only
- Send SOL
- Send SPL token
- Burn SPL token
- Close empty token account
- Metaplex full burn (legacy NFT flow)
Before execution, users can simulate and inspect:
- Instruction-by-instruction breakdown
- Program and account list
- Token deltas
- Rent impact
- Estimated fee
- Runtime logs
- Risk flags
- Detect token/NFT delegates
- Revoke single delegate
- Revoke all delegates
- Highlight suspicious close authorities
- Includes warning + confirmation dialogs
- Local/team label registry for wallets, delegates, programs, validators, mints, and safe destinations
- Export/import JSON for shared operational context
- Label-aware integrations in incident response, delegate explorer, and claim flow
- Track round versioning with distributor/mint/vault, root history, lifecycle, and governance settings
- Define index policy + index ranges to reduce
(distributor, claimant, index)collision risk - Configure lifecycle windows (
start,end,clawback) and generate shareable claim URLs - Detect overlapping index ranges per distributor and surface warnings
- Scan empty token accounts
- Select accounts to close in batch
- Estimate SOL rent recovery
- Estimate transaction count
- Includes warning + confirmation dialog
- SOL balance
- SPL balances
- Token metadata enrichment (symbol/name when available)
src/app/page.tsx: landing page and top-level sectionssrc/app/identity/page.tsx: dedicated Identity route for Wallet Consolesrc/app/token/page.tsx: dedicated Token Tools routesrc/components/providers/mui-theme-provider.tsx: theme + global motion stylessrc/components/providers/solana-wallet-provider.tsx: Solana connection and RPC contextsrc/components/solana/live-signals-panel.tsx: live network telemetrysrc/components/wallet/wallet-section.tsx: Wallet Console shell + navigationsrc/components/wallet/token-tools-section.tsx: token tools shell + holdings layoutsrc/components/wallet/identity-actions.tsx: transact + simulator/decodersrc/components/wallet/token-authority-manager.tsx: token authority and metadata operationssrc/components/wallet/delegate-manager.tsx: approvals/revoke toolingsrc/components/wallet/rent-recovery-sweeper.tsx: rent reclaim toolingsrc/components/wallet/holdings-panel.tsx: holdings UIsrc/hooks/use-wallet-holdings.ts: balances + token accountssrc/hooks/use-token-metadata.ts: metadata lookupsrc/lib/grape.ts: product cards and canonical links
npm install
npm run devnpm run lint
npm run buildFor repeatable operator workflows, the app exposes local API endpoints and a CLI wrapper.
GET /api/power/holdings?owner=<PUBKEY>&rpcEndpoint=<optional>POST /api/power/revoke-plan- body:
{ "owner": "...", "rpcEndpoint": "...", "maxInstructionsPerTx": 8 }
- body:
POST /api/power/sweep-plan- body:
{ "owner": "...", "safeWallet": "...", "reserveSol": "0.02", "rpcEndpoint": "...", "maxInstructionsPerTx": 6 }
- body:
All plan endpoints return serialized instruction batches so power users can script/inspect flows before signing.
# wallet snapshot
npm run power:cli -- holdings --owner <PUBKEY>
# delegate revoke plan
npm run power:cli -- revoke-plan --owner <PUBKEY> --batch-size 8
# incident sweep plan
npm run power:cli -- sweep-plan --owner <PUBKEY> --safe-wallet <PUBKEY> --reserve-sol 0.02- Optional:
NEXT_PUBLIC_SOLANA_DEFAULT_RPC_URL- Overrides default RPC endpoint at build/runtime
NEXT_HELIUS_API_KEY- Enables server-side Helius enhanced transaction lookups used by Signature Decoder
DISCORD_BOT_TOKEN- Required for Discord cron posting via bot auth
DISCORD_CHANNEL_ID- Target channel for Discord cron posting
DISCORD_CRON_MESSAGE- Optional static message override for cron posts
- RPC selection is also persisted in browser local storage.
- Endpoint:
GET /api/cron/discord - Auth:
- If
CRON_SECRETis set, request must includeAuthorization: Bearer <CRON_SECRET>. - If
CRON_SECRETis not set, the endpoint accepts unauthenticated calls.
- If
- Expected Discord bot permissions in target channel:
- View Channel
- Send Messages
- Default mode is user-funded from connected wallet (no server key required).
- Optional client config:
NEXT_PUBLIC_IRYS_NODE_URL(default:https://uploader.irys.xyz)NEXT_PUBLIC_IRYS_GATEWAY_URL(default:https://gateway.irys.xyz)
- Disabled by default.
- Enable with
IRYS_SERVER_UPLOAD_ENABLED=true. - Required when enabled:
IRYS_SOLANA_PRIVATE_KEY(server-only JSON array keypair)
- Optional server config:
IRYS_NETWORK(default:mainnet)IRYS_GATEWAY_URL(default:https://gateway.irys.xyz)IRYS_RPC_URL(optional override)IRYS_MAX_UPLOAD_BYTES(default:10485760)IRYS_OP_TIMEOUT_MS(default:8000)IRYS_UPLOAD_TIMEOUT_MS(default:25000)IRYS_AUTO_FUND(default:false)- fallback RPC envs used when
IRYS_RPC_URLis not set:NEXT_PUBLIC_RPC_SHYFT_MAINNETorNEXT_PUBLIC_SOLANA_DEFAULT_RPC_URLfor mainnetNEXT_PUBLIC_RPC_SHYFT_DEVNETfor devnet