diff --git a/src/popup/index.html b/src/popup/index.html
index dd83eb2..ef0f5d8 100644
--- a/src/popup/index.html
+++ b/src/popup/index.html
@@ -502,6 +502,19 @@
+
Ethereum RPC
diff --git a/src/popup/views/addressDetail.js b/src/popup/views/addressDetail.js
index 09d272b..83589ff 100644
--- a/src/popup/views/addressDetail.js
+++ b/src/popup/views/addressDetail.js
@@ -38,7 +38,11 @@ function show() {
} else {
ensEl.classList.add("hidden");
}
- $("address-balances").innerHTML = balanceLinesForAddress(addr);
+ $("address-balances").innerHTML = balanceLinesForAddress(
+ addr,
+ state.trackedTokens,
+ state.showZeroBalanceTokens,
+ );
renderSendTokenSelect(addr);
$("tx-list").innerHTML =
'
Loading...
';
diff --git a/src/popup/views/helpers.js b/src/popup/views/helpers.js
index dda007a..47011ac 100644
--- a/src/popup/views/helpers.js
+++ b/src/popup/views/helpers.js
@@ -85,16 +85,24 @@ function balanceLine(symbol, amount, price) {
);
}
-function balanceLinesForAddress(addr) {
+function balanceLinesForAddress(addr, trackedTokens, showZero) {
let html = balanceLine(
"ETH",
parseFloat(addr.balance || "0"),
getPrice("ETH"),
);
+ const seen = new Set();
for (const t of addr.tokenBalances || []) {
const bal = parseFloat(t.balance || "0");
- if (bal === 0) continue;
+ if (bal === 0 && !showZero) continue;
html += balanceLine(t.symbol, bal, getPrice(t.symbol));
+ seen.add(t.address.toLowerCase());
+ }
+ if (showZero && trackedTokens) {
+ for (const t of trackedTokens) {
+ if (seen.has(t.address.toLowerCase())) continue;
+ html += balanceLine(t.symbol, 0, getPrice(t.symbol));
+ }
}
return html;
}
diff --git a/src/popup/views/home.js b/src/popup/views/home.js
index cccc48d..abd052a 100644
--- a/src/popup/views/home.js
+++ b/src/popup/views/home.js
@@ -57,7 +57,11 @@ function render(ctx) {
html += `
${addr.ensName ? "" : dot}${truncateMiddle(addr.address, 40)}`;
html += `
${addrUsd}`;
html += `
`;
- html += balanceLinesForAddress(addr);
+ html += balanceLinesForAddress(
+ addr,
+ state.trackedTokens,
+ state.showZeroBalanceTokens,
+ );
html += ``;
});
diff --git a/src/popup/views/settings.js b/src/popup/views/settings.js
index ae44dd5..f892967 100644
--- a/src/popup/views/settings.js
+++ b/src/popup/views/settings.js
@@ -113,6 +113,12 @@ function init(ctx) {
showFlash("Saved.");
});
+ $("settings-show-zero-balances").checked = state.showZeroBalanceTokens;
+ $("settings-show-zero-balances").addEventListener("change", async () => {
+ state.showZeroBalanceTokens = $("settings-show-zero-balances").checked;
+ await saveState();
+ });
+
$("settings-hide-low-holders").checked = state.hideLowHolderTokens;
$("settings-hide-low-holders").addEventListener("change", async () => {
state.hideLowHolderTokens = $("settings-hide-low-holders").checked;
diff --git a/src/shared/state.js b/src/shared/state.js
index 5bac05c..955a181 100644
--- a/src/shared/state.js
+++ b/src/shared/state.js
@@ -18,6 +18,7 @@ const DEFAULT_STATE = {
allowedSites: {},
deniedSites: {},
rememberSiteChoice: true,
+ showZeroBalanceTokens: true,
hideLowHolderTokens: true,
hideFraudContracts: true,
hideDustTransactions: true,
@@ -44,6 +45,7 @@ async function saveState() {
allowedSites: state.allowedSites,
deniedSites: state.deniedSites,
rememberSiteChoice: state.rememberSiteChoice,
+ showZeroBalanceTokens: state.showZeroBalanceTokens,
hideLowHolderTokens: state.hideLowHolderTokens,
hideFraudContracts: state.hideFraudContracts,
hideDustTransactions: state.hideDustTransactions,
@@ -78,6 +80,10 @@ async function loadState() {
saved.rememberSiteChoice !== undefined
? saved.rememberSiteChoice
: true;
+ state.showZeroBalanceTokens =
+ saved.showZeroBalanceTokens !== undefined
+ ? saved.showZeroBalanceTokens
+ : true;
state.hideLowHolderTokens =
saved.hideLowHolderTokens !== undefined
? saved.hideLowHolderTokens