An All-in-One On-Chain Governance and Fundraising Tool for Open Source Development Teams
Yet another Vue/Vite-based frontend for the ultimate funding tool for real Zakos only
ZakoBox/ZakoPako is a dedicated on-chain governance and fundraising tool developed for Project Airi's Core-Dev-DAO (ZakoDAO). It addresses pain points in team collaboration, fund management, and decision governance for decentralized open-source projects.
Built as an ETHOnline 2025 hackathon project, ZakoBox aims to become an on-chain version of OpenCollective, combining features from Guild.xyz, SAFE frontend, and Snapshot/Aragon. Unlike traditional DAO platforms, it focuses on internal development team governance rather than large-scale community governance.
๐ฆ Treasury Management
- ZakoBox smart contract vault for fund storage and management
- Multi-signature wallet integration (SAFE)
- Real-time treasury balance display
- Multi-token support (ETH, USDC, USDT, PYUSD)
- Secure fund withdrawal mechanisms
๐ฐ On-Chain Fundraising
- GitHub integration with one-click donation to designated vaults
- Direct on-chain donation portal
- PYUSD stablecoin priority support (hackathon bonus points)
- Cross-chain asset bridging (Jumper aggregator integration)
๐ Data Transparency
- Deep integration with Blockscout SDK (hackathon bonus points)
- Simplified donation/crowdfunding data dashboard
- Real-time fund flow tracking
- Transaction history visualization
๐ Web3 Integration
- Multi-wallet support (MetaMask, WalletConnect)
- Automatic network switching (Sepolia testnet)
- Real-time transaction status tracking
- Wallet signature-based authentication
- DAO creation and management
- On-chain voting governance system
- Proposal system with execution mechanisms
- Token economic system
- Community incentive programs
- Multi-chain deployment support
- Vue 3.6 - Progressive JavaScript framework (Alpha with Vapor mode support)
- TypeScript 5.9+ - Type-safe JavaScript superset
- Rolldown Vite 7.1 - Rust-based high-performance build tool
- Pinia 3.0+ - Intuitive state management for Vue
- Vue Router 4.5+ - Official router for Vue.js
- unplugin-vue-router - File-system based routing
- Viem 2.38+ - Type-safe TypeScript Ethereum interface library
- Sepolia testnet support
- MetaMask wallet connection
- UnoCSS 66.5+ - Instant on-demand atomic CSS engine
- shadcn-vue - Accessible component library
- Reka UI - Unstyled Vue component library
- Tailwind CSS compatible syntax
- Vitest 3.2+ - Unit testing framework powered by Vite
- Oxlint - High-performance Rust linter
- ESLint 9 - JavaScript/TypeScript code linting
- pnpm 10.18+ - Fast, disk space efficient package manager
- Vue I18n 11+ - Internationalization plugin for Vue.js
- VueUse - Collection of Vue Composition API utilities
- feaxios - Enhanced Axios HTTP client
- Node.js >= 20.0.0
- pnpm >= 10.18.0
- Modern browser with MetaMask support
# Clone the repository
git clone https://github.com/ZakoDAO/ZakoBox-ZakoPako-Frontend.git
cd ZakoBox-ZakoPako-Frontend
# Install dependencies
pnpm install# Start development server on port 3334
pnpm devVisit http://localhost:3334 to view the application.
- Install the MetaMask browser extension
- Create a new wallet or import an existing one
- Switch to Sepolia Test Network
- Click the network dropdown in MetaMask
- Enable "Show test networks" in Settings if needed
- Select "Sepolia"
You'll need Sepolia ETH to interact with the application:
- Visit Sepolia Faucet
- Or use Alchemy Sepolia Faucet
- Or Infura Sepolia Faucet
- Enter your wallet address and request test ETH
The development server proxies /api/v1 requests to http://localhost:3001/api/v1.
If you have the backend service available:
# Navigate to backend directory
cd ../ZakoBox-ZakoPako-Backend
# Follow backend README to start the service
# Typically: npm run dev or similarNote: The frontend can run without the backend for wallet connection and basic UI testing.
# Start the development server
pnpm dev
# For HTTPS testing (if needed for wallet connections)
pnpm preview-httpsThe application will be available at http://localhost:3334
- Open your browser and navigate to http://localhost:3334
- Click the "Connect Wallet" button in the UI
- A MetaMask popup will appear - click "Connect"
- Select the account(s) you want to connect
- Confirm the connection
- If prompted, switch to Sepolia network
- Verify that your wallet address is displayed correctly in the UI
Troubleshooting Wallet Connection:
- Ensure MetaMask is unlocked
- Check browser console for errors (F12 โ Console tab)
- Try refreshing the page
- Restart your browser if issues persist
- Navigate to the GitHub connection page
- Click "Connect GitHub" to authorize
- Complete the OAuth flow
- Verify GitHub account information is displayed correctly
- Navigate to "My Vault" page
- View current vault balance
- Check transaction history
- Test withdrawal operations (requires multi-sig wallet permissions)
- Navigate to "Create Vault" page
- Fill in vault information:
- Vault name
- Description
- Initial settings
- Submit the transaction
- Confirm the transaction in MetaMask
- Wait for transaction confirmation
- Verify the new vault appears in your vault list
# Run all tests
pnpm test
# Run tests with coverage report
pnpm test --coverage
# Run tests in watch mode (re-runs on file changes)
pnpm test --watch
# Run specific test file
pnpm test src/stores/wallet.test.ts# Run linters (Oxlint + ESLint)
pnpm lint
# Auto-fix linting issues
pnpm lint:fix
# TypeScript type checking
pnpm typecheck
# Find unused files, dependencies, and exports
pnpm knip# Build production bundle
pnpm build
# Preview production build locally
pnpm preview
# Analyze bundle size
pnpm sizecheckThe build output will be in the dist/ directory.
Problem: MetaMask not detected
- Solution: Ensure MetaMask extension is installed and enabled
- Solution: Try refreshing the page or restarting the browser
Problem: Wrong network
- Solution: Manually switch to Sepolia in MetaMask
- Solution: The app should prompt for network switch automatically
Problem: Connection rejected
- Solution: Check MetaMask is unlocked
- Solution: Review and accept the connection in MetaMask popup
Problem: 404 errors on /api/v1 endpoints
- Solution: Ensure backend service is running on
localhost:3001 - Solution: Check proxy configuration in
vite.config.ts
Problem: CORS errors
- Solution: Verify backend CORS settings allow
localhost:3334 - Solution: Use the backend's configured allowed origins
Problem: Insufficient funds
- Solution: Get more test ETH from Sepolia faucets
- Solution: Check your wallet balance in MetaMask
Problem: Transaction reverted
- Solution: Check contract requirements (e.g., minimum amount, permissions)
- Solution: Review transaction details in block explorer
- Solution: Verify you're on the correct network (Sepolia)
Problem: Gas estimation failed
- Solution: Ensure you have enough ETH for gas fees
- Solution: Try increasing gas limit manually in MetaMask
Problem: TypeScript compilation errors
- Solution: Run
pnpm typecheckto see detailed errors - Solution: Ensure all dependencies are installed correctly
- Solution: Delete
node_modulesandpnpm-lock.yaml, then runpnpm install
Problem: Module not found
- Solution: Check the path alias (
~/) is configured correctly - Solution: Restart your IDE/editor TypeScript server
Problem: Out of memory during build
- Solution: Increase Node.js memory:
NODE_OPTIONS=--max-old-space-size=4096 pnpm build
Problem: Module resolution errors
- Solution: Check
tsconfig.jsonandvite.config.tspath configurations - Solution: Clear Vite cache:
rm -rf node_modules/.vite
ZakoBox-ZakoPako-Frontend/
โโโ docs/ # Project documentation
โ โโโ requirements_zh.md # Chinese requirements document
โโโ locales/ # Internationalization translation files
โ โโโ en.yml # English translations
โ โโโ zh-CN.yml # Chinese translations
โโโ public/ # Static assets
โโโ src/
โ โโโ api/ # API interface layer
โ โ โโโ index.ts # Unified HTTP client
โ โ โโโ sessions.ts # Session API
โ โ โโโ sessionMessages.ts # Session messages API
โ โ โโโ github-connection.ts # GitHub connection API
โ โโโ components/ # Vue components
โ โ โโโ ui/ # shadcn-vue UI components
โ โโโ composables/ # Vue composable functions
โ โ โโโ dark.ts # Dark mode composable
โ โโโ layouts/ # Page layouts
โ โ โโโ default.vue # Default layout
โ โ โโโ 404.vue # 404 page layout
โ โโโ modules/ # Application modules
โ โ โโโ i18n.ts # Internationalization setup
โ โ โโโ nprogress.ts # Progress bar configuration
โ โ โโโ pinia.ts # State management initialization
โ โโโ pages/ # Page routes (file-system routing)
โ โ โโโ index.vue # Home page
โ โ โโโ create-vault.vue # Create vault page
โ โ โโโ my-vault.vue # My vault page
โ โ โโโ withdraw.vue # Withdraw page
โ โโโ stores/ # Pinia state stores
โ โ โโโ wallet.ts # Wallet state
โ โ โโโ sessions.ts # Session state
โ โ โโโ github-connection.ts # GitHub connection state
โ โโโ styles/ # Global styles
โ โ โโโ main.css # Main stylesheet
โ โโโ types/ # TypeScript type definitions
โ โโโ utils/ # Utility functions
โ โโโ App.vue # Root component
โ โโโ main.ts # Application entry point
โ โโโ typed-router.d.ts # Router type definitions
โโโ CLAUDE.md # Claude Code guidance
โโโ README.md # Project documentation (this file)
โโโ components.json # shadcn-vue configuration
โโโ eslint.config.ts # ESLint configuration
โโโ package.json # Project dependencies and scripts
โโโ tsconfig.json # TypeScript configuration
โโโ uno.config.ts # UnoCSS configuration
โโโ vite.config.ts # Vite configuration
โโโ vitest.config.ts # Vitest configuration
The application uses a modular initialization pattern. Each module in src/modules/ exports an install function that is automatically invoked during app startup.
Creating a new module:
// src/modules/example.ts
import type { UserModule } from '~/types'
export const install: UserModule = (app, router) => {
// Initialize plugin
app.use(somePlugin)
// Add router guards
router.beforeEach((to, from) => {
// Your logic here
})
}Routes are automatically generated from the file structure in src/pages/.
Adding a new page:
- Create a
.vuefile insrc/pages/ - The route is automatically generated based on the filename
- Use type-safe navigation:
import { useRouter } from 'vue-router'
const router = useRouter()
router.push({ name: '/my-vault' })Creating a new API module:
// src/api/example.ts
import type { AxiosInstance } from 'axios'
export function useExampleApi(client: AxiosInstance) {
return {
getItems: () => client.get('/items'),
createItem: (data: any) => client.post('/items', data),
}
}Registering the API:
// src/api/index.ts
import { useExampleApi } from './example'
export const Api = {
// ... existing APIs
example: useExampleApi(httpClient),
}Creating a new Pinia store:
// src/stores/example.ts
import { defineStore } from 'pinia'
import { computed, ref } from 'vue'
export const useExampleStore = defineStore('example', () => {
const count = ref(0)
const doubleCount = computed(() => count.value * 2)
function increment() {
count.value++
}
return { count, doubleCount, increment }
})Using the store in a component:
<script setup lang="ts">
import { useExampleStore } from '~/stores/example'
const store = useExampleStore()
</script>
<template>
<div>
<p>Count: {{ store.count }}</p>
<button @click="store.increment">
Increment
</button>
</div>
</template>UnoCSS provides Tailwind-compatible utility classes:
<template>
<div class="flex items-center justify-center bg-teal-700 p-4 hover:bg-teal-800">
<button class="btn">
Click me
</button>
</div>
</template>Custom shortcuts are defined in uno.config.ts:
btn- Pre-styled buttonicon-btn- Icon button with hover effects
# Development
pnpm dev # Start dev server on port 3334
pnpm build # Build for production
pnpm preview # Preview production build
pnpm preview-https # Preview with HTTPS
# Testing
pnpm test # Run all tests
pnpm test:unit # Run unit tests
# Code Quality
pnpm lint # Run oxlint and eslint
pnpm lint:fix # Auto-fix linting issues
pnpm typecheck # Run TypeScript type checking
# Utilities
pnpm sizecheck # Analyze bundle size
pnpm knip # Find unused files/dependencies
pnpm up # Update dependencies to latest major versionsWe welcome contributions from the community! Here's how you can help:
- Fork the repository
- Clone your fork:
git clone https://github.com/YOUR_USERNAME/ZakoBox-ZakoPako-Frontend.git - Create a feature branch:
git checkout -b feature/AmazingFeature - Make your changes
- Commit your changes:
git commit -m 'Add some AmazingFeature' - Push to the branch:
git push origin feature/AmazingFeature - Open a Pull Request
- Follow @antfu/eslint-config guidelines
- Pre-commit hooks automatically run lint-staged
- Maintain TypeScript type safety - no
anytypes without justification - Write unit tests for new features and bug fixes
- Update documentation for API changes
Follow the conventional commits specification:
feat:- New featurefix:- Bug fixdocs:- Documentation changesstyle:- Code style changes (formatting, etc.)refactor:- Code refactoringtest:- Adding or updating testschore:- Maintenance tasks
This project is licensed under the MIT License - see the LICENSE file for details.
- GitHub Issues: Submit an issue
- ZakoDAO: Project homepage
- ETHOnline 2025: Hackathon project submission
- Built for ETHOnline 2025 hackathon
- Developed by ZakoDAO for Project Airi
- Inspired by OpenCollective, Guild.xyz, SAFE, Snapshot, and Aragon
Made with โค๏ธ by ZakoDAO
For real Zakos only