Thank you for contributing to NebGov, the permissionless governance framework for Stellar.
- Rust (stable toolchain) with
wasm32-unknown-unknowntarget - Stellar CLI (
stellar) for contract building and testing - Node.js 20+ with pnpm 9+
- Git
# Rust toolchain
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup target add wasm32-unknown-unknown
# Stellar CLI
cargo install --locked stellar-cli
# Node.js (via nvm)
nvm install 20
npm install -g pnpm@9git clone https://github.com/nebgov/nebgov && cd nebgov
# Build all Soroban contracts
stellar contract build
# Install JS dependencies
pnpm install
# Build the SDK
pnpm build:sdk# Rust contract tests
cargo test --workspace
# SDK unit tests
pnpm test:sdk
# Frontend tests
pnpm test:app
# E2E tests (requires running app)
cd app && npx playwright testWe use CoinFabrik Scout to automatically scan our Soroban contracts for security vulnerabilities.
To run Scout locally, you first need to install the scout-audit tool:
cargo install cargo-scout-auditThen, run the scanner from the repository root:
cargo scout-audit --output-format htmlThis will generate an audit_report.html file with the results.
- Critical/High: These findings will fail the CI build and must be addressed before merging.
- Medium/Low/Info: These findings do not fail the CI but should be reviewed and fixed if applicable.
If a finding is confirmed as a false positive, it can be suppressed in .scout.toml at the repository root. Each suppression must include a justification:
[[suppressions]]
detector = "detector_name"
reason = "Suppressed: [reason] — [date] — [author]"| Directory | Description |
|---|---|
contracts/governor |
Core governance contract (Rust/Soroban) |
contracts/timelock |
Delayed execution controller |
contracts/token-votes |
Voting power with checkpointing |
contracts/governor-factory |
Permissionless governor deployer |
contracts/treasury |
Multi-sig treasury |
sdk/ |
TypeScript SDK (@nebgov/sdk) |
app/ |
Next.js governance dashboard |
docs/ |
Architecture docs and ADRs |
Browse open issues. Each issue is tagged with:
complexity: trivial- small, well-scoped changecomplexity: medium- moderate implementation workcomplexity: high- significant feature or architectural change
When opening a new issue, please choose one of the repository's issue templates so your report includes all required details.
Issues tagged good first issue are recommended for first-time contributors.
feat/issue-<number>-<description>for featuresfix/issue-<number>-<description>for bug fixesdocs/issue-<number>-<description>for documentation
Use imperative mood with conventional prefixes:
feat: add vote delegationfix: correct quorum calculationdocs: update architecture diagramtest: add governor edge caseschore: update dependencies
- Fork the repo and create a branch from
main - Make your changes with tests for new features
- Ensure all CI checks pass:
cargo test --workspace && pnpm test:sdk - Update docs if you changed any public API
- Open a PR referencing the issue:
Closes #<number> - Wait for maintainer review. Note that reviewers are automatically assigned based on our CODEOWNERS configuration. For more details on our branch protection rules, see Branch Protection.
If you find a security vulnerability, do not open a public issue. Follow the private reporting process in SECURITY.md instead.
- Format with
cargo fmt - No
unsafecode - All public functions must have doc comments
- Tests live in
#[cfg(test)]modules
- Strict TypeScript, no
anytypes - Run
pnpm lintbefore pushing - Use named exports
Each issue is scoped to be completable in under one week by a single contributor. If you find an issue is larger than expected, comment on it so it can be split.
Open a discussion on GitHub or comment on the relevant issue.