All checks were successful
check / check (push) Successful in 24s
## Summary Fixes USD prices still showing on the main view when connected to a testnet (e.g. Sepolia). The root cause was stale mainnet prices lingering in the in-memory price cache after switching networks. ### Root Cause PR #137 correctly made `refreshPrices()` skip fetching on testnets, but the cached prices from a prior mainnet session remained in the `prices` object. All display functions (`getPrice()`, `getAddressValueUsd()`, etc.) used whatever was cached without checking which network was active. ### Changes - **`src/shared/prices.js`** - `refreshPrices()` now clears the price cache when on a testnet instead of silently returning - New `clearPrices()` function empties the cache and resets the fetch timestamp - `getPrice()` returns null on testnets (defense-in-depth) - `getAddressValueUsd()`, `getWalletValueUsd()`, `getTotalValueUsd()` return null on testnets - **`src/popup/views/settings.js`** - Network switcher immediately clears prices when switching to a testnet, so the UI updates without waiting for the next refresh cycle closes #139 Co-authored-by: clawbot <clawbot@noreply.git.eeqj.de> Reviewed-on: #142 Co-authored-by: clawbot <clawbot@noreply.example.org> Co-committed-by: clawbot <clawbot@noreply.example.org>
58 lines
1.8 KiB
JavaScript
58 lines
1.8 KiB
JavaScript
// Consolidated chain-switch handler.
|
|
//
|
|
// Every state change required when the active network changes is
|
|
// performed here so that callers (settings UI, background
|
|
// wallet_switchEthereumChain, future chain additions) all go
|
|
// through a single code path.
|
|
//
|
|
// Adding a new chain (e.g. ETC) requires only a new entry in
|
|
// networks.js — no per-caller wiring is needed.
|
|
|
|
const { networkById } = require("./networks");
|
|
const { clearPrices } = require("./prices");
|
|
|
|
// Switch the active chain and reset all chain-specific cached state.
|
|
// Returns the network configuration object for the new chain.
|
|
async function onChainSwitch(newNetworkId) {
|
|
const { state, saveState } = require("./state");
|
|
|
|
const net = networkById(newNetworkId);
|
|
|
|
// --- core identity ---
|
|
state.networkId = net.id;
|
|
state.rpcUrl = net.defaultRpcUrl;
|
|
state.blockscoutUrl = net.defaultBlockscoutUrl;
|
|
|
|
// --- price cache ---
|
|
// Prices are chain-specific (testnet tokens are worthless,
|
|
// ETC has different pricing, etc.).
|
|
clearPrices();
|
|
|
|
// --- balance / refresh state ---
|
|
// Reset last-refresh timestamp so the next polling cycle
|
|
// triggers an immediate balance refresh on the new chain.
|
|
state.lastBalanceRefresh = 0;
|
|
|
|
// Clear per-address balances and token balances so stale data
|
|
// from the previous chain is never displayed while the first
|
|
// refresh on the new chain is in flight.
|
|
for (const wallet of state.wallets) {
|
|
for (const addr of wallet.addresses) {
|
|
addr.balance = "0";
|
|
addr.tokenBalances = [];
|
|
}
|
|
}
|
|
|
|
// --- chain-specific caches ---
|
|
// Token holder counts and fraud contract lists are
|
|
// chain-specific and must not carry over.
|
|
state.tokenHolderCache = {};
|
|
state.fraudContracts = [];
|
|
|
|
await saveState();
|
|
|
|
return net;
|
|
}
|
|
|
|
module.exports = { onChainSwitch };
|