fix: prevent crash in NIP-11 response when payments settings are absent - #682
Conversation
rootRequestHandler accessed settings.payments.feeSchedules unconditionally Signed-off-by: Priyanshubhartistm <bhartipriyanshustm@gmail.com>
🦋 Changeset detectedLatest commit: 727cd9a The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
There was a problem hiding this comment.
Pull request overview
Fixes a crash in rootRequestHandler when serving the NIP-11 relay information document and the payments settings block is absent, ensuring the handler returns an empty fees object instead of throwing. Adds a unit test to cover the regression and includes a changeset for the patch release.
Changes:
- Guard
feesconstruction behind asettings.paymentspresence check to avoidTypeErroron NIP-11 requests. - Add a unit test asserting
fees: {}and no throw whenpaymentsis omitted from settings. - Add a patch changeset documenting the fix.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| src/handlers/request-handlers/root-request-handler.ts | Adds a guard so NIP-11 fees resolves safely when payments is missing. |
| test/unit/handlers/request-handlers/root-request-handler.spec.ts | Adds regression coverage for missing payments block. |
| .changeset/root-handler-crash-payments-disabled.md | Adds release note for the bugfix. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Priyanshubhartistm
commented
Jul 19, 2026
@cameri, could you please take another look |
Uh oh!
There was an error while loading. Please reload this page.
Description
rootRequestHandlerbuilds the NIP-11 relay information document'sfeesfield by callingObject.getOwnPropertyNames(settings.payments.feeSchedules)with no guard onsettings.paymentsbeing present. Sincepaymentsis an optional field onSettings, any relay running without apaymentsblock insettings.yamlthrows aTypeErroron every request with anAccept: application/nostr+jsonheader. The fix mirrors the optional-chaining pattern already used elsewhere in this same file (e.g.hasAdmissionRestriction,payment_required): whensettings.paymentsis absent,feesnow resolves to{}instead of crashing.Related Issue
Issue #681
Motivation and Context
Any relay operator who omits the
paymentsblock fromsettings.yaml(rather than settingpayments.enabled: false, which ships with a full block by default) has their worker crash on every NIP-11 discovery request, sincepayments?: Paymentsis typed as optional but was accessed without a null check.How Has This Been Tested?
returns empty fees instead of crashing when the payments block is absent)that strips
paymentsfrom the stubbed settings object and assertsrootRequestHandlerdoes notthrow and returns
fees: {}.pnpm run test:unit— 1394 passing (up from 1393 with the new test).pnpm run test:cli— 73 passing.pnpm run cover:unit— passes;root-request-handler.tsat 98.21% statement coverage.pnpm run docker:test:integration— 99 scenarios / 489steps passing, including the existing umber features that exercise
this handler.
pnpm lint,pnpm exec biome format(on the touched files),pnpm check:deps,pnpm run build:check,pnpm run build, andpnpm run verify:cli:build— all clean.Screenshots (if appropriate):
N/A — backend-only change, no UI impact.
Types of changes
Checklist: