fix(wallet): clamp negative balances to 0 at ingest and display

Device-reported balances (e.g. Trust Wallet after a sweep) could carry
negative values that were stored verbatim by coinAttributesFromBalance
(only is_numeric was checked). BTC/ETH/BSC/SOL are not auto-refreshed
after ingest (only Tron is), so the negative persisted in the DB and
rendered in the UI. Clamp negatives to 0 at ingest and in formatAmount
so stale device-reported negatives never display.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
root
2026-10-02 20:40:08 +00:00
parent 529ae4aa38
commit 263fd917ac
+9
View File
@@ -78,6 +78,11 @@ class WalletAddress extends Model
if (! is_numeric($value)) {
continue;
}
// A wallet balance can never be negative; clamp device-reported negatives to 0.
if ((float) $value < 0) {
$out[$col] = '0';
continue;
}
$out[$col] = $value;
}
@@ -99,6 +104,10 @@ class WalletAddress extends Model
if (! is_numeric($amount)) {
return (string) $amount;
}
// Defensive: never render a negative balance (e.g. stale device-reported rows).
if ((float) $amount < 0) {
$amount = '0';
}
$decimals = self::displayDecimals($coin);
$formatted = number_format((float) $amount, $decimals, '.', '');