Problem
Lightning payment filtering was done server-side in lnbits.ts, filtering to only status === 'success'. This caused a regression when Drawbridge ran stale code — pending payments leaked through to the UI.
Additionally, the UI had no way to distinguish between settled, pending, failed, or expired payments.
Solution
- Remove server-side filtering — pass all payments through with full state
- Extend
LightningPaymentRecord type with status and expiry fields
- Derive display status client-side:
settled, pending, failed, or expired
expired is derived for any pending payment whose expiry timestamp has passed (incoming or outgoing)
- Update payments table UI across all four client apps: Date, Amount (sats), Fee, Status, Memo columns with fixed widths (
tableLayout: fixed)
Affected files
packages/gatekeeper/src/types.ts
services/drawbridge/server/src/lnbits.ts
apps/react-wallet/src/components/LightningTab.tsx
apps/browser-extension/src/components/LightningTab.tsx
apps/gatekeeper-client/src/KeymasterUI.jsx
apps/keymaster-client/src/KeymasterUI.jsx
Problem
Lightning payment filtering was done server-side in
lnbits.ts, filtering to onlystatus === 'success'. This caused a regression when Drawbridge ran stale code — pending payments leaked through to the UI.Additionally, the UI had no way to distinguish between settled, pending, failed, or expired payments.
Solution
LightningPaymentRecordtype withstatusandexpiryfieldssettled,pending,failed, orexpiredexpiredis derived for any pending payment whoseexpirytimestamp has passed (incoming or outgoing)tableLayout: fixed)Affected files
packages/gatekeeper/src/types.tsservices/drawbridge/server/src/lnbits.tsapps/react-wallet/src/components/LightningTab.tsxapps/browser-extension/src/components/LightningTab.tsxapps/gatekeeper-client/src/KeymasterUI.jsxapps/keymaster-client/src/KeymasterUI.jsx