Renovate and Dependabot handle routine minor/patch updates automatically (see CONTRIBUTING.md § Renovate and § Dependency Vulnerability Management). This guide is scoped to the manual verification steps automation can't cover: major-version bumps and the packages renovate.json deliberately pins or groups for manual review.
Apply this to any major-version bump, not just the packages below:
- Read the changelog / release notes for every version between the current pin and the target — not just the target version's notes, since intermediate majors can each carry breaking changes.
- Grep the codebase for the package's API surface to gauge blast radius before upgrading (e.g.
grep -rn "from '@stellar/stellar-sdk'"). - Run the full test suite:
npm run test:coverage(andnpm run test:contracts,npm run test:propertyif the package is used in those layers). - Targeted manual testing of the flows that exercise the package (see package-specific sections below).
- Check
npm auditpost-upgrade to confirm the bump didn't introduce a new advisory. - Open the PR with the changelog link and a summary of what was manually tested — reviewers shouldn't have to re-derive that from the diff.
Pinned to an exact version in renovate.json (rangeStrategy: pin) — see CONTRIBUTING.md's Renovate table. This is the highest-risk dependency in the repo: it talks directly to the Stellar network, and a breaking change here can silently corrupt transactions rather than just fail a build.
What to test on testnet before merging (exercise these against HORIZON_URL=https://horizon-testnet.stellar.org, per README.md § Testnet Setup):
| Flow | Backend entry point |
|---|---|
| Account creation + Friendbot funding | createAccount() in backend/src/services/stellar.js |
| Balance query | getBalance() in backend/src/services/stellar.js |
| Payment send (XLM and a non-native asset) | sendPayment() in backend/src/services/stellar.js |
| Path payment | backend/src/services/pathPayment.js |
| Trustline create/update/remove | createTrustline() / updateTrustlineLimit() / removeTrustline() in backend/src/services/stellar.js |
| Payment streaming | backend/src/services/paymentNotificationMonitor.js — needs STREAM_SECRET_ENCRYPTION_KEY set; see backend/STREAMING_SECURITY.md |
| Fee bump / multi-sig | wrapWithFeeBump() in backend/src/services/stellar.js, backend/src/services/multiSig.js |
Specifically watch for:
- Changes to
StellarSDK.TransactionBuilder,Operation,Asset, orMemoconstructor signatures — these are used directly insendPayment(). - Changes to Horizon error response shapes —
extractStellarErrorCode()inbackend/src/utils/stellarErrors.jspattern-matches onerror.data.extras.result_codes,error.status, anderror.name; a shape change there breaks error mapping silently rather than throwing. See docs/guides/stellar-errors.md. - Sequence-number and retry behavior —
withHorizonRetry()inbackend/src/services/stellar.jsretries transient failures but explicitly does not retry 400/404/409; confirm the new SDK version still raises the same status codes for those cases. - Network passphrase /
Networks.TESTNET/Networks.PUBLICconstants, if the SDK restructures its network config.
Grouped together by Renovate to stay in sync (renovate.json's Prisma packageRule) — never upgrade the CLI and client independently.
- After bumping, regenerate the client and diff the output:
cd backend npx prisma generate git diff --stat # generated types shouldn't need review, but confirm nothing unexpected changed
- Check for pending schema drift before deploying:
npx prisma migrate diff \ --from-schema-datasource prisma/schema.prisma \ --to-schema-datamodel prisma/schema.prisma
- Run migrations against a local database and confirm they still apply cleanly:
See backend/CONFIGURATION.md for
DATABASE_URL="<value>" npx prisma migrate deployDATABASE_URL/DB_SHARD_0_URLand the other Prisma-related env vars. - Run
npm run test:coverage— Prisma major bumps have historically changed generated type shapes and$queryRaw/$executeRawbehavior (see docs/guides/security.md § SQL / NoSQL Injection for the safe-usage pattern this codebase relies on). - If the bump changes migration file format or history table structure, read the Prisma migration guide for that version before touching production — this is the one case where the general checklist isn't sufficient on its own.
No renovate.json grouping today, but the frontend stack has already been through at least one significant migration (frontend/REACT_QUERY_MIGRATION.md) — treat future majors with the same care.
- Read the React or Vite release notes for removed APIs, changed defaults (e.g. Vite's
build.target, React's strict-mode behavior changes), and plugin compatibility —@vitejs/plugin-reactmust support the target Vite major. - Run
npm run build --workspace=frontendand confirm the build succeeds with no new warnings. - Run
npm run typecheck --workspace=frontendand the frontend unit test suite (npm run test --workspace=frontend). - Run the E2E suite (
npx playwright test, per CONTRIBUTING.md § Writing E2E tests) — React major bumps are more likely to break runtime behavior (effects, suspense boundaries) than to fail a type check. - Manually click through the golden path in a dev build (
npm run dev:frontend) — account creation, payment send, balance check — since visual/runtime regressions from a renderer change won't necessarily show up in existing tests.
If a dependency upgrade turns out to be broken after merge:
- Revert the merge commit (the Renovate/Dependabot PR merge, or your manual-upgrade PR merge) with
git revert, not a force-push — this preserves history and re-triggers CI on the revert. - Redeploy from the reverted
mainfollowing your normal deploy process. - If the break was caught in production rather than CI, follow docs/runbook.md for incident handling (triage, incident record, containment) before or alongside the revert.
- Re-open the upgrade as a fresh PR once the underlying issue (in the package or in this codebase's usage of it) is understood, rather than re-merging the same commit.