Category: Frontend UX | Priority: Medium | Dependencies: none | Out of scope: moving the keeper into the frontend (stays backend); notifications (own issue)
Description & Context: SDK helpers bumpStreamTtl/bumpContractTtl exist but nothing calls them from the UI. Judges can't see the TTL story, and users have no fallback if the backend keeper is down.
Acceptance Criteria / DoD:
How to verify: Against Testnet: create a stream, lower the TTL threshold via env, confirm the button appears and a bump tx lands; stop the keeper and confirm the degraded banner within one refresh interval.
Category: Frontend UX | Priority: Medium | Dependencies: none | Out of scope: moving the keeper into the frontend (stays backend); notifications (own issue)
Description & Context: SDK helpers
bumpStreamTtl/bumpContractTtlexist but nothing calls them from the UI. Judges can't see the TTL story, and users have no fallback if the backend keeper is down.Acceptance Criteria / DoD:
getRemainingTtl(streamId)infrontend/src/lib/contracts/stream-core.ts(reads the stream entry'sliveUntilLedgerSeqvia RPCgetLedgerEntries, converts to an estimated days-remaining)bumpStreamTtl; result surfaced viadecodeSorobanErrorGET {BACKEND_URL}/status:ok/degraded+lastPass.ts, refreshed on an interval;degradedrenders a warning bannertsc -bclean; reuses the error-decoder unit tests from the frontend-testing issueHow to verify: Against Testnet: create a stream, lower the TTL threshold via env, confirm the button appears and a
bumptx lands; stop the keeper and confirm the degraded banner within one refresh interval.