// block-bay Boilerplate Repository
// ======================== // 1. PROJECT STRUCTURE OVERVIEW // ======================== // apps/ // - web/ (Next.js frontend) // - mobile/ (React Native app) // - api/ (Node.js/Express backend) // contracts/ // - solana-treuhand/ // - Anchor-based escrow contract // shared/ // - ui/ (shared components with Tailwind) // - utils/ (shared utils, web3 helpers) // - types/ (shared TypeScript types)
// ======================== // 2. PACKAGE.JSON (ROOT) { "name": "block-bay-monorepo", "private": true, "workspaces": [ "apps/web", "apps/mobile", "apps/api", "contracts/solana-treuhand", "shared/*" ] }
// ======================== // 3. FRONTEND: Next.js (apps/web) // - Listings page (auction & fixed) // - Wallet connect // - Product page // - Buyer/Seller dashboard // - Smart contract interaction
// Example: apps/web/pages/index.tsx import { useEffect, useState } from 'react'; import { ProductCard } from '@/components/ProductCard';
export default function HomePage() { const [products, setProducts] = useState([]); useEffect(() => { fetch('/api/products').then(res => res.json()).then(setProducts); }, []);
return (
<div className="grid grid-cols-1 md:grid-cols-3 gap-4 p-4"> {products.map(p => <ProductCard key={p._id} product={p} />)} </div> ); }// ======================== // 4. BACKEND: Node.js/Express (apps/api) // - REST API for users, products, transactions // - Connects to MongoDB
// Example: apps/api/routes/products.js const express = require('express'); const router = express.Router(); const Product = require('../models/Product');
router.get('/', async (req, res) => { const products = await Product.find(); res.json(products); });
module.exports = router;
// ======================== // 5. SMART CONTRACT: Solana Treuhand (contracts/solana-treuhand) // - Escrow contract with USDT support
// Anchor.toml [programs.localnet] treuhand = "YourProgramIDHere"
// lib.rs use anchor_lang::prelude::*;
#[program] pub mod treuhand { use super::*;
pub fn initialize(ctx: Context<Initialize>, amount: u64) -> Result<()> {
let escrow = &mut ctx.accounts.escrow;
escrow.buyer = *ctx.accounts.buyer.key;
escrow.seller = *ctx.accounts.seller.key;
escrow.amount = amount;
escrow.approved_by_buyer = false;
escrow.approved_by_seller = false;
Ok(())
}
pub fn approve(ctx: Context<Approve>) -> Result<()> {
let escrow = &mut ctx.accounts.escrow;
let signer = ctx.accounts.signer.key;
if signer == &escrow.buyer {
escrow.approved_by_buyer = true;
} else if signer == &escrow.seller {
escrow.approved_by_seller = true;
}
if escrow.approved_by_buyer && escrow.approved_by_seller {
// Transfer USDT to seller minus 1% fee
// Use CPI with SPL token program
}
Ok(())
}
}
// ======================== // 6. MOBILE APP: React Native (apps/mobile) // - Uses Expo + Wallet Adapter // - Pages: Home, Product, Chat, Wallet
// Example: apps/mobile/App.tsx import React from 'react'; import { NavigationContainer } from '@react-navigation/native'; import { createNativeStackNavigator } from '@react-navigation/native-stack'; import Home from './screens/Home';
const Stack = createNativeStackNavigator(); export default function App() { return ( <NavigationContainer> <Stack.Navigator> <Stack.Screen name="Home" component={Home} /> </Stack.Navigator> </NavigationContainer> ); }
// ======================== // 7. UTILS (shared/utils/web3.ts) // - Solana connection, wallet utils
// ======================== // 8. DEPLOYMENT // - Vercel (apps/web) // - Render or Railway (apps/api) // - MongoDB Atlas // - Solana Devnet/Mainnet (QuickNode)
// ======================== // 9. .ENV EXAMPLES // MONGODB_URI=... // NEXT_PUBLIC_SOLANA_RPC=https://api.devnet.solana.com // BACKEND_URL=http://localhost:4000