Thank you for considering a contribution to FlowPay. This document covers everything you need to know to get your changes merged cleanly.
- Code of Conduct
- Ways to Contribute
- Good First Issues
- Development Setup
- Branching & Workflow
- Contract Contribution Guidelines
- Frontend Contribution Guidelines
- Commit Style
- Pull Request Checklist
- Questions
Be respectful. We welcome contributors of all experience levels. Harassment, gatekeeping, or dismissive behaviour will not be tolerated.
- Fix a bug (open an issue first if it's non-trivial)
- Add a feature from the roadmap
- Improve documentation or fix typos
- Write additional contract tests
- Build a keeper/scheduler service
- Review open pull requests
These are well-scoped tasks that don't require deep knowledge of the whole codebase:
| Task | Area | Difficulty |
|---|---|---|
| Add USDC / custom SAC token support | Contract | Medium |
Build a Node.js keeper service that calls charge() on a schedule |
Backend | Medium |
| Add subscription pause/resume functions | Contract | Medium |
| Improve frontend error messages with human-readable contract panics | Frontend | Easy |
Add test_pay_per_use unit test |
Contract | Easy |
Add test_double_initialize unit test |
Contract | Easy |
| Display transaction history using contract events | Frontend | Hard |
# Install Rust
curl https://sh.rustup.rs -sSf | sh
# Add WASM target
rustup target add wasm32-unknown-unknown
# Install Soroban CLI
cargo install --locked soroban-cli
# Run tests
cd contract
cargo testcd frontend
npm install
cp .env.example .env.local # then fill in VITE_CONTRACT_ID
npm run dev- Fork the repository
- Create a feature branch from
main:git checkout -b feat/your-feature-name # or git checkout -b fix/bug-description - Make your changes
- Run tests — they must all pass before opening a PR
- Push your branch and open a Pull Request against
main
Branch naming conventions:
feat/— new featurefix/— bug fixdocs/— documentation onlytest/— adding or improving testsrefactor/— code changes with no behaviour change
- Keep
#![no_std]— Soroban contracts cannot use the Rust standard library - Every new public function must have at least one test in
test.rs - Any function that moves funds or mutates user state must call
user.require_auth() - Use
env.storage().persistent()for user data,env.storage().instance()for contract-wide config - Emit an event via
env.events().publish()for every state-changing action - Do not introduce floating point — use integer arithmetic in stroops (1 XLM = 10,000,000 stroops)
- Run
cargo clippyand resolve all warnings before submitting
- All contract calls must go through
src/stellar.ts— React components should never import@stellar/stellar-sdkdirectly - Do not add external UI component libraries — keep the bundle minimal
- Use TypeScript strictly — no
anyunless absolutely necessary and commented - Keep components small and focused on a single responsibility
- Run
npm run lintto check for ESLint errors before submitting - Run
npm run formatto auto-format all source files with Prettier - Run
npm run buildto confirm there are no TypeScript errors before submitting
We follow Conventional Commits:
feat: add pause/resume subscription functions
fix: prevent double-initialize on contract
docs: expand DEPLOYMENT.md with mainnet steps
test: add pay_per_use unit test
refactor: extract token client helper in lib.rs
Before opening a PR, confirm:
-
cargo testpasses (contract changes) -
npm run lintpasses with no errors (frontend changes) -
npm run buildpasses (frontend changes) - New functions have tests
- No secrets or
.envfiles committed - PR description explains what changed and why
- Linked to a relevant issue if one exists
Open a GitHub Discussion or leave a comment on the relevant issue. We're happy to help you get unstuck.