Commit Graph

118 Commits

Author SHA1 Message Date
e58f113cda Fix display consistency across all views
All checks were successful
check / check (push) Successful in 18s
Receive view: address now shows color dot and etherscan link,
matching every other address display in the app.

Send view "From": address now includes etherscan link alongside
the existing color dot.

Send view "What to send" (ERC-20 from token view): shows token
symbol as bold heading, then full contract address below with
color dot, copy-on-click, and etherscan link.

Approval views: tx approval From/To addresses now show color
dots and etherscan links instead of bare text. Site approval
address adds etherscan link. Tx approval value uses 4 decimal
places consistent with all other amount displays.

Home tx list: row padding changed from py-1 to py-2, matching
addressDetail and addressToken transaction lists.
2026-02-27 12:01:34 +07:00
a43e8f20ea Show blockies on confirm page, put USD values inline in parentheses
All checks were successful
check / check (push) Successful in 17s
From and To addresses now render with 48px blockie identicons,
color dots, and etherscan links — matching the transaction detail
view pattern. USD estimates for amount, balance, and network fee
are shown in parentheses after the value on the same line, not on
a separate line below.
2026-02-27 11:58:04 +07:00
b85eac1e75 Enhance confirm transaction page with full verification details
All checks were successful
check / check (push) Successful in 17s
The confirmation page now shows:
- Transaction type (Native ETH transfer vs ERC-20 token transfer)
- Full ERC-20 token contract address with etherscan link
- Token symbol throughout (not raw contract address)
- Current balance of the token being sent, with USD value
- Estimated network fee in ETH and USD (fetched async)
- USD value for ERC-20 token amounts (not just ETH)
- Insufficient balance errors for ERC-20 tokens

Also implements actual ERC-20 token transfers via the token contract's
transfer() function, rather than only supporting native ETH sends.
2026-02-27 11:42:42 +07:00
01201d54b2 Fix send balance display when sending from address-token view
All checks were successful
check / check (push) Successful in 17s
Read token from state.selectedToken when set, falling back to the
select element. This ensures the correct token balance is shown even
when the select dropdown is hidden or its value didn't take because
the token was filtered out by renderSendTokenSelect.
2026-02-27 11:39:50 +07:00
fbb0def267 Replace send token dropdown with static display when token is locked
All checks were successful
check / check (push) Successful in 17s
When sending from the address-token view, show the token symbol as
plain text instead of a disabled dropdown. ERC-20 tokens include an
etherscan link to the contract address. The dropdown is restored when
navigating back or entering send from other views.
2026-02-27 11:38:42 +07:00
a1b181a471 Move ERC-20 warning from address-token view to receive/QR view
All checks were successful
check / check (push) Successful in 17s
The warning about only sending ERC-20 tokens on the Ethereum network
belongs on the receive page where the QR code is shown, not on the
token detail view. Non-token receive flows hide the warning.
2026-02-27 11:37:18 +07:00
21fe854fa4 Add address-token detail view for per-token transaction filtering
All checks were successful
check / check (push) Successful in 17s
Clicking a token balance on the address detail view navigates to a
focused view showing only that token's transactions. Send pre-selects
and locks the token dropdown, Receive shows an ERC-20 warning for
non-ETH tokens, and all back buttons return to the correct parent view.
2026-02-27 11:26:59 +07:00
a5b2470dba Implement eth_sendTransaction for dApp-initiated transactions
All checks were successful
check / check (push) Successful in 17s
Show a confirmation popup with tx details (from, to, value, data) and
password prompt when a dApp calls eth_sendTransaction. Sign and broadcast
the transaction in the background, returning the tx hash to the dApp.
2026-02-26 18:39:09 +07:00
c131b89732 Fix spacing inconsistencies on home screen
All checks were successful
check / check (push) Successful in 16s
- Remove mb-1 from Recent Transactions header (wallet headers have
  no bottom margin, so this should match)
- Remove mb-3 wrapper from wallet sections (section header bg
  provides the visual break, extra margin created uneven gaps)
- Change tx row padding from py-2 to py-1 to match address rows
2026-02-26 17:11:27 +07:00
44a078eaac Add visual spacer between recent transactions and add wallet link
Some checks are pending
check / check (push) Waiting to run
2026-02-26 17:02:39 +07:00
59eb02a022 Darker section header background to visually delimit sections
All checks were successful
check / check (push) Successful in 15s
Add --color-section (#dddddd) distinct from --color-well (#f5f5f5).
Section headers on the home screen use bg-section so they stand out
as visual dividers rather than blending with the price well.
2026-02-26 16:53:10 +07:00
24f04e509a Use wallet name in titles, replace hr dividers with grey stripe headers
All checks were successful
check / check (push) Successful in 12s
Address titles now use wallet name instead of wallet index (e.g.
"Wallet 1 — Address 2" instead of "Address 1.2"). This applies to
the address detail page title, the home address labels, and the
addressTitle() helper used on confirmation pages.

Section dividers on the home screen are now full-width grey
background stripes instead of horizontal rules, visually breaking
the page into wallet sections and a recent transactions section.
2026-02-26 16:49:52 +07:00
01048a1c3d Consistent headings on home: lighter title rules, thick section dividers
All checks were successful
check / check (push) Successful in 17s
Wallet and Recent Transactions headings now use border-border-light
for their bottom rule. Thick 2px black horizontal rules separate
wallet sections from each other and from the transactions section,
with generous vertical spacing.
2026-02-26 16:44:57 +07:00
e5ffbb4634 Show 25 most recent transactions from all addresses on home screen
All checks were successful
check / check (push) Successful in 15s
Fetch transactions for every address across all wallets in parallel,
merge and deduplicate by hash, apply anti-poisoning filters, sort by
block number, and display the top 25 below the wallet list. Clicking
a transaction navigates to the address detail page for the relevant
address. Shows "Loading..." placeholder to prevent layout shift.
2026-02-26 16:41:15 +07:00
4c04dc4878 Add breathing room to transaction detail section headings
All checks were successful
check / check (push) Successful in 15s
Increase section spacing from mb-3 to mb-4, add mb-1 gap between
each heading label and its content.
2026-02-26 16:37:41 +07:00
db5e968b1d Make tx detail blockies 48px to match address detail page
All checks were successful
check / check (push) Successful in 14s
Display consistency: blockies must be the same size everywhere.
2026-02-26 16:36:00 +07:00
f69ce7f9d2 Restore color dots, add blockies above addresses on tx detail page
All checks were successful
check / check (push) Successful in 14s
Blockies now appear above the from/to addresses on a separate line,
with color dots restored inline next to the address text. Increased
spacing between transaction detail fields from mb-2 to mb-3.
2026-02-26 16:33:42 +07:00
156e77b5cf Show blockie identicons on transaction detail page
All checks were successful
check / check (push) Successful in 16s
Replace color dots with 16px circular blockies next to from and to
addresses on the transaction detail view.
2026-02-26 16:31:36 +07:00
6ba9b2c057 Right-align address USD total to match token balance values
All checks were successful
check / check (push) Successful in 17s
2026-02-26 16:30:42 +07:00
a01161c3a3 Make blockie identicon circular with more breathing room
All checks were successful
check / check (push) Successful in 14s
2026-02-26 16:29:47 +07:00
b1b8807060 Add Etherscan-style blockie identicon to address detail page
All checks were successful
check / check (push) Successful in 27s
Show a 48px pixelated blockie (same style as Etherscan) centered
above the wallet title on the address detail page. Uses
ethereum-blockies-base64 which generates a base64 PNG from the
address. Replaces the previously added @metamask/jazzicon.
2026-02-26 16:27:47 +07:00
7dd688f571 Remove padding from [info] button to prevent address wrapping
Some checks failed
check / check (push) Has been cancelled
2026-02-26 16:18:01 +07:00
d9df8a05a5 Fix [info] button border not rendering
Some checks failed
check / check (push) Has been cancelled
px-0.5 was not being generated by Tailwind since it only appeared in
JS, not in scanned HTML. Use inline padding instead.
2026-02-26 16:16:03 +07:00
150a1a1a34 Clear scanning flash when address scan completes
Some checks failed
check / check (push) Has been cancelled
The "Scanning for addresses..." flash had a 30-second timeout and was
never cleared on completion. Now shows "Found N addresses." when
multiple are found, or briefly shows "Ready." for single-address
wallets.
2026-02-26 16:12:35 +07:00
6056699ac1 Toggle settings gear to go back when already on settings page
Some checks failed
check / check (push) Has been cancelled
2026-02-26 16:10:04 +07:00
73b592af35 Restore [info] button border and hover with tighter padding
Some checks failed
check / check (push) Has been cancelled
2026-02-26 16:08:58 +07:00
7c97eb55e5 Add "Add additional wallet..." link at bottom of main view
Some checks failed
check / check (push) Has been cancelled
2026-02-26 16:07:53 +07:00
e1c3fd8056 Shrink info button to prevent address line wrapping
Some checks failed
check / check (push) Has been cancelled
Remove border and padding from the info button, use dashed underline
text style instead. This saves enough horizontal space that the full
address no longer wraps.
2026-02-26 16:06:14 +07:00
fb89f5d27b Fix layout shift from ETH price well and Total subtitle
Some checks failed
check / check (push) Has been cancelled
Both elements now have min-height and placeholder content so they
reserve vertical space before API data arrives, preventing layout
jumps when prices load. This follows the No Layout Shift policy
in the README.
2026-02-26 16:05:32 +07:00
72cf4aab8c Swap address row click behavior: row selects active, [info] opens detail
Some checks failed
check / check (push) Has been cancelled
Clicking an address row now makes it the active address (bold title,
updates headline and active address display, broadcasts to dapps).
The [info] button on each row opens the address detail page. This
replaces the previous [ ]/ACTIVE toggle.
2026-02-26 16:04:23 +07:00
881217b16c Change ETH price label to "$x,xxx.xx USD/ETH"
Some checks failed
check / check (push) Has been cancelled
2026-02-26 16:01:26 +07:00
938861c12e Move USD total to its own line and add etherscan link on address page
Some checks failed
check / check (push) Has been cancelled
The address now sits on its own line with no other elements beside it,
followed by an etherscan external link icon. The USD total value moves
to a separate line below.
2026-02-26 16:00:50 +07:00
49dfd79d73 Show ETH price, split headline into ETH balance and total USD
Some checks failed
check / check (push) Has been cancelled
Headline shows active address ETH balance with ETH-only USD value
in parentheses. Small "Total:" subtitle below includes ETH + token
values. A centered well between Send/Receive buttons and the wallet
list displays the current ETH price in USD.
2026-02-26 15:58:39 +07:00
ba54f412d2 Show active address ETH balance and USD value in headline
Some checks failed
check / check (push) Has been cancelled
The headline now shows the active address's balance as
"x.yyyy ETH ($z.aa USD)" instead of the sum across all wallets.
2026-02-26 15:56:09 +07:00
e8e5edf5f2 Make active address display copyable with etherscan link
Some checks failed
check / check (push) Has been cancelled
Click the active address above Send/Receive to copy it. A small
box-arrow icon links to the address on etherscan.
2026-02-26 15:53:56 +07:00
fce907df55 Use compact [ ] select button and show active address above actions
Some checks failed
check / check (push) Has been cancelled
Replace [select] with [ ] to avoid wrapping the full address line.
ACTIVE label stays as-is for discoverability. Show the currently
active address (full, untruncated, with color dot) above the Send
and Receive buttons on the home screen.
2026-02-26 15:51:56 +07:00
fced156e3e Rearrange home address layout and widen rename input
Some checks failed
check / check (push) Has been cancelled
Each address now shows: title on its own line, full untruncated
address with ACTIVE/select marker on the next line, USD total
right-aligned on the next line, then token balances below. The
wallet rename input now fills the available width.
2026-02-26 15:48:09 +07:00
5d1873ac78 Allow renaming wallets by clicking the wallet name
Some checks failed
check / check (push) Has been cancelled
Click the wallet name on the home screen to edit it inline. The name
turns into a text input; press Enter or click away to save, Escape
to cancel. The dashed underline on the name indicates it is editable.
2026-02-26 15:44:17 +07:00
d24c10ca9c Debug-log every API request and response
Some checks failed
check / check (push) Has been cancelled
Add debugFetch wrapper in log.js that logs method, URL, and body on
request, and status code on response. Replace all fetch() calls
across balances, transactions, tokens, background RPC proxy, and
settings validation with debugFetch.
2026-02-26 15:40:09 +07:00
47e690f466 Show tracked tokens with zero balance on main and address pages
Some checks failed
check / check (push) Has been cancelled
Add showZeroBalanceTokens setting (default: on). When enabled,
balanceLinesForAddress merges state.trackedTokens with the address's
tokenBalances, showing 0.0000 lines for tracked tokens that have no
balance on that address. This gives users visibility into all tokens
they're watching across all addresses.
2026-02-26 15:37:39 +07:00
6c4b2753d9 Add copy-on-click and etherscan links to transaction detail page
Some checks failed
check / check (push) Has been cancelled
From address, to address, and tx hash are now clickable to copy.
Each also has a small box-arrow icon linking to the corresponding
etherscan page. ENS names and full addresses are both copyable.
2026-02-26 15:34:28 +07:00
69311f4444 Improve spam protection settings spacing and input type
Some checks failed
check / check (push) Has been cancelled
Add more vertical spacing between checkboxes in the Token Spam
Protection well. Change the gwei threshold from a number input
(with spinner arrows) to a plain text input with numeric keyboard
hint.
2026-02-26 15:31:59 +07:00
9a6d1f6255 Add dust transaction filter to catch native ETH poisoning
Some checks failed
check / check (push) Has been cancelled
Address poisoning attacks also use real native ETH dust transfers
(e.g. 1 gwei) from look-alike addresses. Token-level filters cannot
catch these. Add a configurable dust threshold (default 100,000 gwei
/ 0.0001 ETH) that hides transactions below the threshold from
history. The threshold is editable in Settings and the filter can be
disabled entirely. Document the specific attack tx in the README.
2026-02-26 15:29:48 +07:00
b5b4f75968 Add anti-poisoning filters for token transfers and send view
Some checks failed
check / check (push) Has been cancelled
Three layers of defense against address poisoning attacks:

1. Known symbol verification: tokens claiming a symbol from the
   hardcoded top-250 list (e.g. "ETH", "USDT") but from an
   unrecognized contract are identified as spoofs and always hidden.
   Their contract addresses are auto-added to the fraud blocklist.

2. Low-holder filtering: tokens with <1000 holders are hidden from
   both transaction history and the send token selector. Controlled
   by the "Hide tokens with fewer than 1,000 holders" setting.

3. Fraud contract blocklist: a persistent local list of detected
   fraud contract addresses. Transactions involving these contracts
   are hidden. Controlled by the "Hide transactions from detected
   fraud contracts" setting.

Both settings default to on and can be disabled in Settings.
Fetching and filtering are separated: fetchRecentTransactions returns
raw data, filterTransactions is a pure function applying heuristics.
Token holder counts are now passed through from the Blockscout API.
2026-02-26 15:22:11 +07:00
d05de16e9c Document address poisoning attack and AutistMask defenses in README
Some checks failed
check / check (push) Has been cancelled
Detail the specific attack observed against our test address: a fake
ERC-20 contract emitting spoofed Transfer events to plant a look-alike
scam address in transaction history. Document all planned defenses:
known token symbol verification, low-holder filtering, fraud contract
blocklist, send-side filtering, and the principle that all filters are
user-configurable.
2026-02-26 13:57:24 +07:00
df95522f48 Disable send button after broadcast, show tx link and elapsed timer
Some checks failed
check / check (push) Has been cancelled
Once a transaction is successfully broadcast: disable the send button
to prevent double-sends, immediately show an etherscan link for the
pending tx, and display a live elapsed-time counter that updates every
second until confirmation arrives.
2026-02-26 12:43:11 +07:00
2aebf3ddf9 Show full address without truncation on address detail page
Some checks failed
check / check (push) Has been cancelled
2026-02-26 12:40:57 +07:00
4bfcf17773 Show address titles on transaction confirmation page
Some checks failed
check / check (push) Has been cancelled
Add addressTitle() helper that looks up an address across all wallets
and returns its title (e.g. "Address 1.2"). The confirm page now shows
titles for both sender and receiver when they belong to our wallet.
formatAddressHtml gains an optional title parameter shown above the
full address, alongside any ENS name.
2026-02-26 12:38:34 +07:00
a590cfc3ad Show approval in browser-action popup instead of a separate window
Some checks failed
check / check (push) Has been cancelled
Use action.openPopup() to show the approval in the toolbar popup,
which is anchored to the browser window and cannot trigger a macOS
Space switch. Falls back to a separate window if openPopup() is
unavailable. A port connection detects when the popup is dismissed
without a response, and the popup URL is reset to the main UI after
every approval resolution.
2026-02-26 12:16:41 +07:00
dce3b4aa08 Center approval popup over focused window to avoid macOS Space switch
Some checks failed
check / check (push) Failing after 3h10m55s
Use getLastFocused to find the current Chrome window and position the
approval popup centered over it. This keeps the popup on the same
macOS virtual desktop instead of switching Spaces.
2026-02-26 04:03:45 +07:00