- closes #223 — E2E tests for wallet connect flow (Playwright)
- closes #228 — ESLint
no-consolerule for frontend - closes #235 — Timeout + retry logic for
stellarService.jsHorizon calls - closes #238 — Confirmation dialog improvements before sending payment
Added a dedicated Playwright spec that covers the three acceptance criteria:
- No extension — unauthenticated dashboard shows "Connect your wallet to get started" and the "Connect Freighter Wallet" button; same check on
/transactions. - After mock connect — clicking the button with the fixture-injected Freighter stub results in the wallet address label and XLM balance being visible on the dashboard.
- Transactions page post-connect — navigating to
/transactionsafter connecting renders the transaction list view (not the wallet-gate screen).
Uses the existing fixtures.ts for the authenticated scenarios (mocked Freighter, Horizon, and backend auth endpoints).
Added the no-console rule at warn level, allowing console.warn and console.error to pass through:
"no-console": ["warn", { "allow": ["warn", "error"] }]This surfaces direct console.log calls during next lint / CI so developers are reminded to use the project's logging abstraction, without breaking any existing console.warn / console.error calls.
Introduced a withTimeoutAndRetry(fn, timeoutMs) helper that:
- Races each Horizon call against a 10-second
AbortControllertimer. - Retries up to 3 times on transient errors (
5xx,ECONNRESET,ETIMEDOUT,AbortError) using exponential back-off (100 ms × 2ⁿ). - Does not retry
404responses (account not found is definitive).
Applied to all three Horizon call sites:
server.loadAccount(publicKey)insidegetAccountquery.call()insidegetPaymentsop.transaction()(memo fetch) insidegetPayments
Updated SendConfirmationModal to fully satisfy the acceptance criteria:
- Destination now shows both the shortened form (
GABCD…WXYZ) and the full address in monospace below it — users can spot accidental paste errors at a glance. - Renamed the primary CTA from
Confirm & Send→Confirm & Signto match the acceptance criteria and reflect that Freighter signing occurs on confirmation. - Added
role="dialog",aria-modal="true", andaria-labelledbyfor accessibility.
- Run
npm run test:e2einfrontend/—wallet-connect.spec.tspasses in Chromium. - Run
npm run lintinfrontend/—no-consolewarnings appear for anyconsole.logcalls. - Restart the backend and send a payment with a slow/unreachable Horizon URL — the server returns a timeout error after ~10 s instead of hanging indefinitely.
- On the dashboard, fill in a destination and amount, click Send — the confirmation modal shows shortened + full address, fee, optional memo, and a Confirm & Sign button. Clicking Cancel returns to the form.
🤖 Generated with Claude Code