Currently blockchain balances are cached in-memory via @cache_response_timewise on ChainsAggregator. This means:
- Cache is lost on restart (forces a full re-query)
- No way to show cached balances instantly on app load
- Single API conflates "give me what you have" with "go refresh from nodes"
This plan moves the cache to SQLCipher (user DB), splits the API into fetch-from-cache and refresh, and tracks per-chain staleness.