Quality-focused release: correctness fixes, a debug logger with a live on/off switch, user-facing error toasts, a first test suite + CI, and a broad internal cleanup. No breaking changes.
✨ Added
- Runtime log toggle — flip debug logging on/off from the browser console without rebuilding:
dappLogs.on()/off()/toggle()/status()/reset()(persists across reloads). - Debug-gated logger — debug/log/info print only in development or when built with REACT_APP_DEBUG=true; warn/error always print. Replaces ~159 scattered console.* calls.
- Error toasts — wallet connect failures (Cardano & Ethereum) now surface a visible banner instead of only logging to the console.
- Tests & CI — Jest + React Testing Library suites (39 tests); a CI workflow runs format-check + lint + tests on every push/PR.
- Tooling & docs — lint / format scripts (+ prettier), an expanded README, and .env.example.
🐛 Fixed
- Network toggle unclickable on the titles — inactive tab panels were overlaying the top of the page and swallowing clicks on the Cardano/Ethereum labels.
- ApiCard button height was silently ignored (Tailwind purged the dynamically-built class).
- Provider "used outside provider" guards never triggered (checked the wrong default).
- NFT metadata chunking could exceed the 64-byte limit on non-ASCII text — now byte-correct.
🔧 Changed (internal)
- Renamed
yoroiProvider→cardanoProvider(useYoroi→useCardano). - Shared connection-state machine (
useConnectionState) across all chains + documented provider contract. - Large DRY pass:
runApiCall(22 cards),InputWithLabel(~22 inputs),useResponseState(7 subtabs),buildCert(8 governance panels), shared address/UTxO/credential/64-byte helpers, and shared UI (ChainStatusMessage,AccessButtonShell). - Memoized the Cardano provider; production builds ship with logging off.