fix: honour a dust threshold of 0 and compare addresses case-insensitively (closes #179)
All checks were successful
check / check (push) Successful in 41s
All checks were successful
check / check (push) Successful in 41s
Two defects in the anti-poisoning filters, both silent over-filtering: the wallet hid transactions the user had asked to see. A dust threshold of 0 was read as `filters.dustThresholdGwei || 100000`, so the one value a user would pick to mean "show everything" was swallowed and replaced by the default. It is now `??`, making 0 a real threshold that hides nothing and agrees exactly with clearing the hide-dust checkbox. The Settings input rejects empty, negative, fractional and non-numeric entries outright instead of coercing them, and resyncs the field to the stored value so it never displays a threshold the wallet is not using. isSpoofedSymbol compared the contract address with `===` against a lowercased known address. EIP-55 mixed case is a checksum, not identity, so a genuine token arriving checksummed was classified as a spoof and hidden. All address comparisons in the module now go through one normalizeAddress helper, which also normalises the fraud contracts recorded from a detected spoof. Tests cover threshold 0 versus unset versus a set value, and the contract comparison in lowercase, uppercase and EIP-55 form as well as against a genuinely different address. The two `current behaviour:` tests pinning the old behaviour are inverted into regression guards, and a fixture pairing a real contract address with a null holder count pins the `tx.holders !== null` guard that no fixture previously reached.
This commit is contained in:
@@ -304,11 +304,17 @@ function init(ctx) {
|
||||
|
||||
$("settings-dust-threshold").value = state.dustThresholdGwei;
|
||||
$("settings-dust-threshold").addEventListener("change", async () => {
|
||||
const val = parseInt($("settings-dust-threshold").value, 10);
|
||||
if (!isNaN(val) && val >= 0) {
|
||||
const raw = $("settings-dust-threshold").value.trim();
|
||||
const val = Number(raw);
|
||||
// 0 is accepted and means "hide nothing". Empty, negative,
|
||||
// fractional and non-numeric input is rejected outright rather than
|
||||
// coerced, and the field is put back to the stored threshold so it
|
||||
// never shows a value the wallet is not using.
|
||||
if (raw !== "" && Number.isInteger(val) && val >= 0) {
|
||||
state.dustThresholdGwei = val;
|
||||
await saveState();
|
||||
}
|
||||
$("settings-dust-threshold").value = state.dustThresholdGwei;
|
||||
});
|
||||
|
||||
$("settings-utc-timestamps").checked = state.utcTimestamps;
|
||||
|
||||
Reference in New Issue
Block a user