Thank you for your interest in contributing to StellarHunts. This document outlines the development workflow, coding standards, and pull request process for this monorepo.
By participating in this project, you agree to maintain a respectful and inclusive environment. Harassment, discriminatory language, and personal attacks are not tolerated.
- Node.js 18+
- npm or yarn
- PostgreSQL 13+
- Rust toolchain (stable) + Soroban / Stellar CLI 22.x
# Clone the repository
git clone https://github.com/UnityChainx/StellarHunts.git
cd StellarHunts
# Install frontend dependencies
cd frontend && npm install
# Install backend dependencies
cd ../backend && npm install
# Configure environment (backend)
# See backend/README.md for the required environment variables
# Start backend
npm run start:dev # API at http://localhost:3001
# In a separate terminal, start frontend
cd frontend
npm run dev # UI at http://localhost:3000main— Stable, production-ready code. All commits must pass CI.- Feature branches — Create from
mainusing the naming convention below. - Bug fixes — Prefix with
fix/(e.g.,fix/puzzle-timer-overflow). - Features — Prefix with
feat/(e.g.,feat/daily-challenge). - Refactoring — Prefix with
refactor/(e.g.,refactor/leaderboard-query). - Documentation — Prefix with
docs/(e.g.,docs/api-endpoints).
git checkout -b feat/your-feature-nameUse clear, descriptive commit messages following the Conventional Commits specification:
<type>(<scope>): <description>
[optional body]
| Type | Usage |
|---|---|
feat |
A new feature |
fix |
A bug fix |
refactor |
Code change that neither fixes a bug nor adds a feature |
style |
Formatting, missing semicolons, etc. |
docs |
Documentation only changes |
test |
Adding or updating tests |
chore |
Build process, tooling, or dependency changes |
ci |
CI configuration and scripts |
feat(puzzles): add difficulty-based scoring multiplier
fix(auth): handle expired tokens in middleware
docs(api): document rewards claim endpoint
- Linting: Run
npm run lintin thefrontend/directory (ESLint witheslint-config-next) - Components: Use functional components with hooks. Prefer composition over inheritance.
- Styling: Use Tailwind CSS utility classes. Avoid inline styles where possible.
- State: Use Zustand for global state, React state/hooks for local state.
- Imports: Order imports by: 1) external libraries, 2) internal components, 3) styles
- Linting: Run
npm run lintin thebackend/directory (ESLint + TypeScript) - Formatting: Run
npm run format(Prettier) before committing - Modules: Follow NestJS modular architecture — each feature gets its own module with
controller,service, andentityfiles - DTOs: Validate all inputs using
class-validatordecorators - API docs: Use Swagger decorators (
@ApiTags,@ApiOperation,@ApiResponse) for all endpoints
- Formatting: Run
cargo fmt --all -- --checkin theonchain/directory - Contracts: Follow the established patterns in
contracts/ - Storage: Use the
#[contracttype]enum pattern for storage keys - Errors: Use a
#[contracterror]enum with stable error codes (do not usepanic!("string")) - Authorization: Use
require_auth()on top-level callers; rely onenv.invoker()to gate cross-contract calls - Testing: Write
#[test]cases for all contract methods usingEnv::default()andenv.mock_all_auths()
All changes should include appropriate tests. Run the relevant test suite before submitting a PR.
When working on specific modules, run Jest in watch mode or filter by file path to speed up iteration:
# Filter backend tests by path pattern
cd backend && npm test -- --testPathPattern=auth
# Watch mode for a specific test file
cd backend && npm run test:watch -- src/auth/auth.service.spec.ts
# Filter frontend Vitest tests by filename
cd frontend && npm test -- puzzleReviewServiceTests live in frontend/tests/ and use .test.js (or .test.jsx) extensions.
cd onchain && cargo test --workspace
# Format check
cargo fmt --all -- --checkThe CI workflow (.github/workflows/build.yml) runs automatically on push to main and on pull requests:
- Format:
cargo fmt --all -- --check - Build:
cargo build --workspace --release - Test:
cargo test --workspace
All checks must pass before a pull request can be merged.
- Create a feature branch from
mainusing the naming convention above - Make your changes following the code style and testing guidelines
- Run linting and tests locally to verify nothing is broken
- Push your branch to the remote repository
- Open a pull request against
mainwith a clear title and description - Respond to review feedback — address all comments before the PR can be approved
- Merge — once approved, use squash merge or rebase merge to maintain a clean history
Before submitting, confirm:
- Code follows the project's style guidelines
- Linting passes without errors
- New and existing tests pass
- Added tests for new functionality
- Documentation is updated (README, API docs, etc.)
- Commit messages follow Conventional Commits
- Branch is up to date with
main(rebased if needed)
A PR template is available at .github/PULL_REQUEST_TEMPLATE.md and will auto-populate when you open a new pull request.
For contributions to the onchain/ directory:
- Contract changes must include corresponding tests
- Run
cargo build --workspace --releasebefore committing to ensure compilation succeeds - Be mindful of contract size and gas (resource) costs
- Document any state changes or new storage variables
- Follow the existing access-control patterns (
require_auth, env-level admin,env.invoker()checks for cross-contract calls)
If you have questions about the contribution process, open a discussion or issue in the repository. For urgent matters, contact the development team directly.