Closes #
Required: Every PR must be linked to an open issue. PRs without a linked issue will not be reviewed.
What changed?
Why was it changed?
How was it implemented?
- Bug fix (non-breaking change that fixes an issue)
- New feature (non-breaking change that adds functionality)
- Breaking change (fix or feature that would cause existing functionality to break)
- Security fix
- Refactor (no functional change)
- Documentation update
- Tests only
- Configuration / DevOps change
Required for changes under
contracts/earn-quest/src/**or any contract storage, event, or interface change.
- No contract implementation changes - not applicable
- Updated
contracts/earn-quest/CHANGELOG.mdunder## [Unreleased] - If breaking, added a
### Breaking Changesentry with impact, affected files, and migration steps - If breaking, used Conventional Commit breaking metadata (
type(scope)!:) in the PR title or commit history - If breaking, included a
BREAKING CHANGE:explanation below
BREAKING CHANGE details (required for breaking contract changes):
BREAKING CHANGE:
Required: All PRs must include test evidence. PRs missing this section will be blocked from merging.
- New unit tests added for changed logic
- All existing unit tests pass (
npm run test) - Coverage does not regress (
npm run test:cov)
Test output / screenshot:
<!-- Paste relevant test output here -->
- E2E tests added or updated (
npm run test:e2e) - Tested manually against a local environment
Endpoints tested:
| Method | Endpoint | Expected | Result |
|---|---|---|---|
GET |
/api/... |
200 OK | [x] |
Required for any endpoint changes.
- No API changes - Swagger update not applicable
- New endpoints documented with
@ApiOperation,@ApiResponse, and@ApiBearerAuthdecorators - Updated DTOs annotated with
@ApiProperty/@ApiPropertyOptional - Swagger UI verified locally at
/api/docsand responses are accurate - Breaking changes to existing contracts are documented in the description above
All items below must be verified before requesting review.
- Appropriate NestJS HTTP exceptions used (
NotFoundException,BadRequestException,ForbiddenException,UnauthorizedException,ConflictException, etc.) - No raw
Errorthrown where an HTTP exception is expected - Global exception filter handles all unhandled errors gracefully
- Error responses follow the project's standard error shape
- All incoming request bodies and query params have a corresponding DTO
- DTOs use
class-validatordecorators (@IsString,@IsUUID,@IsNotEmpty,@IsOptional, etc.) -
class-transformerdecorators applied where necessary (@Transform,@Type,@Expose) -
ValidationPipeis applied globally or at the controller level - raw unvalidated input is never used
- Endpoints requiring authentication are protected with
@UseGuards(JwtAuthGuard)or equivalent - Admin-only endpoints use the appropriate admin guard / role check
- Public endpoints are explicitly marked with
@Public()decorator where applicable - Throttler guard behaviour verified - rate limits are not unintentionally bypassed
- Significant operations and state transitions are logged using the project's Winston logger (
LoggerService) - Errors are logged at
errorlevel with stack traces - No sensitive data (passwords, secrets, private keys, tokens) is included in log output
- Incoming request / response logging is handled by the global
LoggerMiddleware- no duplicate logs added
- Contract calls wrapped in try/catch with descriptive error messages
- Horizon / Soroban RPC failures do not crash the service - fallback or retry logic applied where appropriate
- Transaction signing uses environment-provided keys only - no hardcoded secrets
- No database changes - not applicable
- TypeORM migration created and tested (
npm run typeorm:generate-migration) - Migration is reversible (down migration implemented)
- Seed data updated if required (
seed.ts)
Required if your PR modifies any file under
FrontEnd/my-app/lib/types/**,FrontEnd/my-app/lib/api/**,FrontEnd/my-app/lib/schemas/**,FrontEnd/my-app/lib/validation/**, orFrontEnd/my-app/context/walletTypes.ts.Full policy:
FrontEnd/my-app/docs/TYPE_CHANGES_POLICY.md
- My PR touches none of the watched type/model paths — not applicable.
- I classified my change as: ☐
breaking-types☐breaking-runtime☐added☐changed☐deprecated☐removed☐fixed☐security - I added a bullet to
## [Unreleased]inFrontEnd/my-app/CHANGELOG.mdOR a new file inFrontEnd/my-app/.changeset/. - If breaking, my entry includes a before/after
Migration:code block. -
cd FrontEnd/my-app && npm run changelog:checkpasses locally. - If I am asserting this change is non-breaking despite touching a watched file, I added the
changelog-skiplabel or[changelog-skip]to the PR title.
- Branch is up to date with
main/master - Linting passes (
npm run lint) - Formatting passes (
npm run format) - No
console.log/ debug statements left in production code - No hardcoded secrets, API keys, or environment-specific values in source code
-
.env.exampleupdated if new environment variables were introduced -
BackEnd/README.mdorReadMe Frontend.mdupdated if setup steps changed - Self-review completed - I have read through every line of the diff