Commit Graph

93 Commits

Author SHA1 Message Date
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
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
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
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
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
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
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
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
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
21ccecab46 Fix approval popup: init listeners before early return, rename view, space buttons
Some checks failed
check / check (push) Has been cancelled
The Allow/Deny buttons did nothing because approval.init(ctx) was
called after the early return for approval mode, so listeners were
never attached. Move it before the check.

Rename view from "approve" to "approve-site" to avoid ambiguity with
future transaction approval. Space Allow and Deny buttons apart with
justify-between to prevent misclicks.
2026-02-26 03:51:51 +07:00
4ea5eeabda Show sending address on send page with color dot and ENS name
Some checks failed
check / check (push) Has been cancelled
2026-02-26 03:47:48 +07:00
b8126c6080 Add Send and Receive buttons to main view using active address
Some checks failed
check / check (push) Has been cancelled
2026-02-26 03:47:04 +07:00
56fa56bc8a Add site connection permissions, approval flow, and active address
Some checks failed
check / check (push) Has been cancelled
- Add activeAddress, allowedSites, deniedSites, rememberSiteChoice to
  persisted state
- Replace auto-connect with permission checks: allowed sites connect
  automatically, denied sites are rejected, unknown sites trigger an
  approval popup
- Add approval popup UI with hostname display, active address preview,
  remember checkbox, and allow/deny buttons
- Add ACTIVE/[select] indicator on address rows in the main view to
  set the active web3 address
- Add allowed/denied site list management in settings with delete buttons
- Broadcast accountsChanged to connected dapps when active address changes
- Handle approval window close as implicit denial
2026-02-26 03:40:34 +07:00
166bb46149 Truncate addresses by 2 chars to compensate for color dot width
Some checks failed
check / check (push) Has been cancelled
Move truncateMiddle to helpers.js for reuse. Shorten displayed addresses
by 2 characters wherever a dot is shown: home view (40 char max), tx list
(maxAddr - 2), and address detail container (40ch width).
2026-02-26 03:29:09 +07:00
d28d5a5a51 Add address color dots and cached ENS reverse lookups
Some checks failed
check / check (push) Has been cancelled
Deterministic colored dots derived from address bytes (16-color palette)
displayed before every address. ENS reverse resolution for transaction
counterparties with 12-hour localStorage cache.
2026-02-26 03:26:52 +07:00
a1ddbd035b Fix balance line spacing: use width:42ch;max-width:100%
Some checks failed
check / check (push) Has been cancelled
2026-02-26 03:17:08 +07:00
e1bd3bab58 Increase right padding to pr-5 (20px) for scrollbar gutter
Some checks failed
check / check (push) Has been cancelled
2026-02-26 03:15:32 +07:00
4765bf835f Add right padding on #app for overlay scrollbar gutter
Some checks failed
check / check (push) Has been cancelled
2026-02-26 03:14:39 +07:00
75ec67617b Rewrite tx list with innerHTML, fix scrollbar overlay and overflow
Some checks failed
check / check (push) Has been cancelled
- Rebuilt tx list rendering using innerHTML instead of createElement
- scrollbar-gutter: stable on body to prevent content shift
- max-width:42ch instead of width:42ch to prevent horizontal overflow
- overflow-x:hidden on body and #app
2026-02-26 03:12:33 +07:00
d0cca13715 Fix tx list overflow: use truncate on left spans, shrink-0+pl-2 on right
All checks were successful
check / check (push) Successful in 13s
Left-side spans (age, address) get tailwind truncate class so they
can't push the row wider than its container. Right-side spans (direction,
amount) get shrink-0 so they keep their full text. Also added
overflow-hidden on #tx-list container.
2026-02-26 02:30:32 +07:00
cef3d2ad37 Fix horizontal overflow: overflow-x-hidden on body and app, remove shrink-0 from 42ch spans
All checks were successful
check / check (push) Successful in 13s
The 42ch fixed-width spans with shrink-0 prevented flex from shrinking
them when the container was narrower, causing horizontal scrolling.
Also added overflow-x: hidden on body and #app as a safety net.
2026-02-26 02:29:11 +07:00
bf9ae4919d Redesign transaction list and add transaction detail view
All checks were successful
check / check (push) Successful in 13s
Transaction list entries are now two lines with more spacing:
- Line 1: humanized age (hover for ISO datetime) + direction (Sent/Received)
- Line 2: counterparty address + amount with symbol
- Clickable rows navigate to transaction detail view

Transaction detail view (placeholder) shows:
- Status, time, amount, from, to, transaction hash
- Back button returns to address detail

Also added "transaction" to VIEWS list in helpers.
2026-02-26 02:20:13 +07:00
3bd2b58543 Token auto-discovery, tx history, balance polling, EIP-6963, UI overhaul
All checks were successful
check / check (push) Successful in 14s
Major changes:
- Fetch token balances and tx history from Blockscout API (configurable)
- Remove manual token discovery (discoverTokens) in favor of Blockscout
- HD address gap scanning on mnemonic import
- Duplicate mnemonic detection on wallet add
- EIP-6963 multi-wallet discovery + selectedAddress updates in inpage
- Two-tier balance refresh: 10s while popup open, 60s background
- Fix $0.00 flash before prices load (return null when no prices)
- No-layout-shift: min-height on total value element
- Aligned balance columns (42ch address width, consistent USD column)
- All errors use flash messages instead of off-screen error divs
- Settings gear in global title bar, add-wallet moved to settings pane
- Settings wells with light grey background, configurable Blockscout URL
- Consistent "< Back" buttons top-left on all views
- Address titles (Address 1.1, 1.2, etc.) on main and detail views
- Send view shows current balance of selected asset
- Clickable affordance policy added to README
- Shortened mnemonic backup warning
- Fix broken background script constant imports
2026-02-26 02:13:39 +07:00
2b2137716c Add transaction confirmation screen and password modal
All checks were successful
check / check (push) Successful in 13s
New send flow: Send → Confirm → Password → Broadcast.

Send view: collects To (with ENS resolution), Amount, Token.
"Review" button advances to confirmation. No password field.

Confirm Transaction view: shows From, To (with ENS name),
Amount (with USD value), and runs pre-send checks:
- Scam address warning (checked against local blocklist)
- Self-send warning
- Insufficient balance error (disables Send button)

Password modal: full-screen overlay, appears only after user
clicks Send on the confirmation screen. Decrypts the wallet
secret, signs and broadcasts the transaction. Wrong password
is caught inline.

scamlist.js: hardcoded set of known scam/fraud addresses
(Tornado Cash sanctioned, drainer contracts, address
poisoning). Checked locally, no external API.
2026-02-25 18:55:42 +07:00
2a8c051377 Add total portfolio value, cached prices and balances
All checks were successful
check / check (push) Successful in 16s
Total USD value displayed in 2x type above wallet list on Home.
Value aggregation: getAddressValueUsd (ETH + all tokens) →
getWalletValueUsd → getTotalValueUsd. Price API cached for 5
minutes, balance fetches cached for 60 seconds. Both caches
are app-wide — repeated calls to refreshPrices/refreshBalances
are no-ops within the TTL.
2026-02-25 18:44:29 +07:00
64bd541013 Global title bar on all screens, screen name in DEBUG banner
All checks were successful
check / check (push) Successful in 14s
Move "AutistMask by @sneak" to a global title bar that appears
on every screen. Per-view headings demoted to h2 sub-headings.
Settings button moved to bottom of main view alongside Add
wallet. In DEBUG mode, the red banner now shows the current
screen name in parentheses (e.g. "DEBUG / INSECURE (main)").
2026-02-25 18:38:33 +07:00
98b5eef21b Update header to "AutistMask by @sneak" with link
All checks were successful
check / check (push) Successful in 5s
2026-02-25 18:33:01 +07:00
cbb92f2a69 Add common token picker on Add Token screen
All checks were successful
check / check (push) Successful in 14s
Shows the top 25 tokens by market cap as clickable buttons
below the contract address input. Clicking a token fills in
its contract address automatically.
2026-02-25 18:31:39 +07:00
f2e22cadf2 Encrypt secrets with libsodium, password required to send
All checks were successful
check / check (push) Successful in 14s
vault.js: Argon2id key derivation + XSalsa20-Poly1305 encryption
via libsodium-wrappers-sumo. No raw crypto primitives.

Wallet creation now requires a password. The mnemonic or private
key is encrypted before storage — only the ciphertext blob
(salt, nonce, ciphertext) is persisted. The plaintext secret
is never stored.

Sending requires the password to decrypt the secret, derive
the signing key, and construct the transaction. Wrong password
is caught and reported.
2026-02-25 18:23:09 +07:00
bfecddf2f7 Implement ETH send and QR code receive
All checks were successful
check / check (push) Successful in 22s
Send: stores mnemonic/private key with wallet data, derives
signing key from mnemonic + address index via ethers HDNodeWallet,
constructs transaction with parseEther, broadcasts via
sendTransaction, waits for confirmation, shows block number
and tx hash. ENS resolution in To field preserved.

Receive: QR code rendered to canvas via qrcode library (1.5.4).
Shows scannable QR above the full address text.

README updated with qrcode dependency and TODO progress.
2026-02-25 18:17:23 +07:00
933c13ad1a Add ENS support: reverse lookup and forward resolution
All checks were successful
check / check (push) Successful in 14s
Reverse ENS lookup on balance refresh — if an address has an
ENS name, it's shown in the wallet list and address detail view.
Send form accepts ENS names in the To field (resolves before
sending). Placeholder updated to indicate ENS support.
2026-02-25 17:09:44 +07:00
1b806fb9e9 Store xpubs unencrypted, remove password from viewing flow
All checks were successful
check / check (push) Successful in 12s
Xpubs and derived addresses stored unencrypted in extension
storage for instant read-only access without a password.
Password will only be required for signing transactions
(not yet implemented). Real addresses now derived from
mnemonic via ethers HDNodeWallet at wallet creation time.
Removed lock screen, password fields, and Lock button.
BIP-39 mnemonic validation added. README updated with split
storage model documentation.
2026-02-25 16:13:22 +07:00
e6d8f6acf4 Clarify password role, random die, updated wording
All checks were successful
check / check (push) Successful in 14s
- Password help text now explains it encrypts the recovery phrase
  on disk and is not used for address derivation
- Die button generates cryptographically random phrases using
  crypto.getRandomValues(), different each click
- "roll the die for a new one" wording
- README documents full encryption scheme (PBKDF2 + AES-256-GCM)
  and explicitly notes password is not part of BIP-39 derivation
2026-02-25 15:34:33 +07:00
3dbf885951 Consolidate to single Add Wallet button everywhere
All checks were successful
check / check (push) Successful in 12s
Welcome and main views now show one button: "Add wallet".
Private key import is accessible as a small link at the bottom
of the Add Wallet view ("Have a private key instead?").
2026-02-25 15:25:20 +07:00
1a49665210 Unify create/import into single Add Wallet view
All checks were successful
check / check (push) Successful in 13s
Merge "Create new wallet" and "Import recovery phrase" into one
"Add wallet" screen. The recovery phrase textarea starts empty.
A clickable die button generates a random phrase and shows a
backup warning. Users who already have a phrase just paste it.
Welcome screen simplified to two options: "Add wallet" and
"Import private key". README updated to match.
2026-02-25 15:24:24 +07:00
8431488849 Redesign UI for non-technical users
All checks were successful
check / check (push) Successful in 13s
Replace jargon-heavy terminal-style UI with plain-language views.
New data model: wallets (HD or private key) contain addresses.
Main view lists all addresses grouped by wallet with balances.
HD wallets get a "+" to add addresses; key wallets have one.
Two import paths: recovery phrase and private key.
All labels use plain English, full-sentence errors, inline help
text. README updated with full UI philosophy, language guide,
data model, and navigation docs.
2026-02-24 10:21:52 +07:00
d9eda1d503 Add basic monochrome popup UI with Tailwind CSS
All checks were successful
check / check (push) Successful in 11s
Black-on-white, monospace, Universal Paperclips aesthetic.
All views: lock, setup/create/import, main account, send,
receive, add token, settings, and approval. Vanilla JS view
switching with stub state. README updated with full UI design
philosophy, external services documentation, and view descriptions.
2026-02-24 10:12:19 +07:00
065f0eaa81 Add project scaffolding
All checks were successful
check / check (push) Successful in 10s
Makefile, Dockerfile, CI workflow, prettier config, manifests for
Chrome (MV3) and Firefox (MV2), source directory structure, and
minimal test suite. All checks pass.
2026-02-24 09:48:21 +07:00