W9-C5 Full market context lost on single indexer failure — order book, trade tape, and chart all go blank simultaneously #165

Closed
opened 2026-05-12 17:51:42 +00:00 by totdking · 14 comments
totdking commented 2026-05-12 17:51:42 +00:00 (Migrated from gitlab.com)
No description provided.
totdking commented 2026-05-12 17:55:19 +00:00 (Migrated from gitlab.com)

Issue Summary

When the indexer becomes unavailable, the order book, recent trades tape, and chart all go blank at the same time. A trader attempting to place an order during an indexer outage has no book depth, no tape, and no chart, zero market context. The order ticket remains accessible but the trader is effectively blind to current market conditions.


Reproduction Steps

  1. Start the app with all services running and navigate to the Trade tab
  2. Confirm order book, recent trades, and chart are all rendering normally
  3. Stop the indexer process
  4. Observe the simultaneous loss of order book, recent trades, and chart data

Expected Behavior

Graceful degradation should preserve as much market context as possible from alternative data sources (LCD/chain direct queries) when the indexer is unavailable. At minimum, the UI should communicate clearly what each affected section is missing and why, rather than going blank.


Actual Behavior

Order book shows "Book unavailable (indexer or LCD)." Recent trades section goes empty. Chart goes blank. All three surfaces fail simultaneously from a single service going down, leaving the order ticket as the only functional element.


Screenshot

image.png{width=900 height=549}


Environment Details

Field Value
OS macOS (Apple M1 Pro, 14-inch)
Browser Google Chrome (desktop)
Viewport ~1440px desktop
Network localterra (local Docker)
Frontend VITE_NETWORK=local npm run dev
Indexer Stopped to simulate outage

Wallet / Device Details

  • Wallet: Keplr browser extension
  • Wallet state: Connected — localterra

Severity / Impact

P2 Polish. Order placement remains technically possible but placing an order with no book, no tape, and no chart is a meaningful operational risk for traders. On a live exchange an indexer outage would leave traders unable to make informed decisions while still being able to submit transactions. Found under W9-C5 (Empty and error rows — Updates and Trader use dimensions).

cc: @PlasticDigits

### Issue Summary When the indexer becomes unavailable, the order book, recent trades tape, and chart all go blank at the same time. A trader attempting to place an order during an indexer outage has no book depth, no tape, and no chart, zero market context. The order ticket remains accessible but the trader is effectively blind to current market conditions. --- ### Reproduction Steps 1. Start the app with all services running and navigate to the Trade tab 2. Confirm order book, recent trades, and chart are all rendering normally 3. Stop the indexer process 4. Observe the simultaneous loss of order book, recent trades, and chart data --- ### Expected Behavior Graceful degradation should preserve as much market context as possible from alternative data sources (LCD/chain direct queries) when the indexer is unavailable. At minimum, the UI should communicate clearly what each affected section is missing and why, rather than going blank. --- ### Actual Behavior Order book shows "Book unavailable (indexer or LCD)." Recent trades section goes empty. Chart goes blank. All three surfaces fail simultaneously from a single service going down, leaving the order ticket as the only functional element. --- ## Screenshot ![image.png](/uploads/7c48956a822064ae98ebc9ab0f8f6080/image.png){width=900 height=549} --- ### Environment Details | Field | Value | |-------|-------| | OS | macOS (Apple M1 Pro, 14-inch) | | Browser | Google Chrome (desktop) | | Viewport | \~1440px desktop | | Network | `localterra` (local Docker) | | Frontend | `VITE_NETWORK=local npm run dev` | | Indexer | Stopped to simulate outage | --- ### Wallet / Device Details - **Wallet:** Keplr browser extension - **Wallet state:** Connected — localterra --- ### Severity / Impact **P2 Polish.** Order placement remains technically possible but placing an order with no book, no tape, and no chart is a meaningful operational risk for traders. On a live exchange an indexer outage would leave traders unable to make informed decisions while still being able to submit transactions. Found under **W9-C5** (Empty and error rows — Updates and Trader use dimensions). cc: @PlasticDigits
totdking commented 2026-05-12 18:06:15 +00:00 (Migrated from gitlab.com)

mentioned in issue #116

mentioned in issue #116
PlasticDigits commented 2026-05-13 04:23:41 +00:00 (Migrated from gitlab.com)

Marked as low priority as indexer outage requires multiple fallback services, which is not necessary for our current uptime targets.

Marked as low priority as indexer outage requires multiple fallback services, which is not necessary for our current uptime targets.
PlasticDigits commented 2026-05-27 05:45:47 +00:00 (Migrated from gitlab.com)

mentioned in commit 5f2563a182

mentioned in commit 5f2563a182bfb24a1e19ee8c654491b38751f8ac
PlasticDigits commented 2026-05-27 05:45:47 +00:00 (Migrated from gitlab.com)

mentioned in commit 24ff20e505

mentioned in commit 24ff20e5059820975d14b8a3d6018954bacfdbc1
PlasticDigits commented 2026-05-27 05:45:55 +00:00 (Migrated from gitlab.com)

Verification & fix (GitLab #165)

Problem: When the indexer HTTP API was unreachable, the Trade page banner appeared but the order book, recent trades tape, and price chart could still go blank with no explanation.

Fix (merged to main, 24ff20e):

  • Added shared retail copy in indexerTradeOutageCopy.ts for each panel (book / tape / chart).
  • Extracted TradeMarketDataUnavailableNotice, TradeRecentTradesSection, and detectTradeIndexerOutage() so outage detection and messaging stay modular.
  • OrderBookPanel and PriceChart now render dashed status rows instead of empty panels when isIndexerUnavailableError applies.
  • Outage banner triggers when either pair metadata or tape fails (not only getPair).

Verification:

  • Unit tests: TradePage.test.tsx, indexerTradeOutageCopy.test.ts, tradeIndexerOutage.test.ts, PriceChart.test.tsx — all pass.
  • E2E (indexer stopped): PLAYWRIGHT_SKIP_CHAIN=1 E2E_INDEXER_OUTAGE=1 npx playwright test e2e/trade-indexer-outage.spec.ts — banner + trade-book-unavailable-*, trade-tape-unavailable, trade-chart-unavailable all visible.
  • W9-C5 (empty/error rows): each surface shows skeleton → explicit message on failure; no silent blank panels.

Note: Full LCD fallback for depth/tape/candles is intentionally out of scope per product invariants (#164); this delivers the minimum acceptable degradation — clear per-panel communication.

## Verification & fix (GitLab #165) **Problem:** When the indexer HTTP API was unreachable, the Trade page banner appeared but the order book, recent trades tape, and price chart could still go blank with no explanation. **Fix (merged to `main`, `24ff20e`):** - Added shared retail copy in `indexerTradeOutageCopy.ts` for each panel (book / tape / chart). - Extracted `TradeMarketDataUnavailableNotice`, `TradeRecentTradesSection`, and `detectTradeIndexerOutage()` so outage detection and messaging stay modular. - `OrderBookPanel` and `PriceChart` now render dashed status rows instead of empty panels when `isIndexerUnavailableError` applies. - Outage banner triggers when **either** pair metadata **or** tape fails (not only `getPair`). **Verification:** - Unit tests: `TradePage.test.tsx`, `indexerTradeOutageCopy.test.ts`, `tradeIndexerOutage.test.ts`, `PriceChart.test.tsx` — all pass. - E2E (indexer stopped): `PLAYWRIGHT_SKIP_CHAIN=1 E2E_INDEXER_OUTAGE=1 npx playwright test e2e/trade-indexer-outage.spec.ts` — banner + `trade-book-unavailable-*`, `trade-tape-unavailable`, `trade-chart-unavailable` all visible. - W9-C5 (empty/error rows): each surface shows skeleton → explicit message on failure; no silent blank panels. **Note:** Full LCD fallback for depth/tape/candles is intentionally out of scope per product invariants (#164); this delivers the minimum acceptable degradation — clear per-panel communication.
PlasticDigits (Migrated from gitlab.com) closed this issue 2026-05-27 05:46:01 +00:00
PlasticDigits commented 2026-05-27 05:56:40 +00:00 (Migrated from gitlab.com)

mentioned in commit 4f230d35cf

mentioned in commit 4f230d35cfe2d0d90c771711b866788562a78fcd
PlasticDigits commented 2026-05-27 05:56:59 +00:00 (Migrated from gitlab.com)

mentioned in issue #164

mentioned in issue #164
PlasticDigits commented 2026-05-29 03:13:21 +00:00 (Migrated from gitlab.com)

mentioned in issue #211

mentioned in issue #211
PlasticDigits commented 2026-05-29 03:17:54 +00:00 (Migrated from gitlab.com)

mentioned in issue #215

mentioned in issue #215
PlasticDigits commented 2026-05-29 03:17:55 +00:00 (Migrated from gitlab.com)

marked as related to #215

marked as related to #215
PlasticDigits commented 2026-05-29 05:35:41 +00:00 (Migrated from gitlab.com)

mentioned in issue #218

mentioned in issue #218
PlasticDigits commented 2026-05-29 05:41:31 +00:00 (Migrated from gitlab.com)

mentioned in issue #228

mentioned in issue #228
PlasticDigits commented 2026-05-29 05:41:33 +00:00 (Migrated from gitlab.com)

marked as related to #228

marked as related to #228
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
code/cl8y-dex-terraclassic#165
No description provided.