Is Sender Wallet safe?
We analyzed Sender Wallet version 2.2.11's actual code and gave it a 62/100 trust score. Sender Wallet is purpose-aligned but has broad page access, a…
Bottom line
Sender Wallet is purpose-aligned but has broad page access, a serious message-validation weakness, and hardware-wallet telemetry.
What it can access
It runs in every HTTP(S) frame, exposes wallet actions to webpages, and contacts many blockchain services, which fits a wallet but creates broad sensitive access.[Q1][Q21]
Security weaknesses
The wallet bridge accepts messages without checking their sender or origin, so an embedded page may misrepresent who requested a wallet action.[Q16][Q21]
Signs of misuse
When hardware-wallet features are used, the extension sends stable device and wallet-fingerprint information to Mixpanel without a separate telemetry choice.[Q6][Q13][Q14]
Code findings
What access does this extension ask for, and does that access make sense for what it claims to do?
It runs two scripts and CSS at document start in every HTTP(S) frame and can communicate with a privileged wallet background. That broad scope is expected for a dapp wallet, but it creates a high-consequence page-to-wallet boundary.
Declares all-frame content scripts on http://*/* and https://*/*, plus storage, alarms and unlimitedStorage. — manifest.json:1-2
Installs the Sender/near provider and exposes wallet request methods to webpages. — script.bundle.js:18-51
Which websites can it run on, and can it read or change what appears on those pages?
It changes every HTTP(S) page by injecting wallet-provider objects and packaged CSS. The reviewed bridge does not crawl page text, page fields or images.
Runs contentScript.bundle.js, script.bundle.js and content.styles.css in all frames at document_start. — manifest.json:1-2
Injects the web-accessible provider script and relays structured wallet messages rather than reading page DOM content. — contentScript.bundle.js:9-10
Can it see sensitive information you type, such as passwords, payment details, messages, or form entries?
No evidence of this behavior was found in the reviewed package.
The page relay handles messages carrying the wallet-specific type marker; no input, keypress, selection or form listener was found. — contentScript.bundle.js:9-10
Exposes defined wallet RPC methods rather than scraping webpage fields. — script.bundle.js:18-51
Can it access private browser data such as cookies, signed-in sessions, browsing history, bookmarks, or downloads?
No evidence of this behavior was found in the reviewed package.
Declares storage, alarms and unlimitedStorage only; cookie, history, bookmarks, downloads and tabs are absent. — manifest.json:1-2
Can it access anything else on your device, such as files, location, camera, microphone, clipboard, or installed applications?
The popup can request camera access to scan hardware-wallet QR codes and can copy wallet values to the clipboard on user action. It has no microphone, location, screen-capture, filesystem or native-app privilege.
QR scanner code calls navigator.mediaDevices.getUserMedia for video input. — popup.bundle.js:219
A copy helper uses document.execCommand("copy") from the wallet UI. — popup.bundle.js:237
No nativeMessaging, geolocation, desktopCapture or filesystem-style permission is declared. — manifest.json:1-2
Does it send information outside your browser? If so, what information is sent, where does it go, and why?
It sends public wallet addresses, balances, transaction/RPC data and service requests to configured Sender and blockchain services. Keystone use also sends a device identifier and master fingerprint to Mixpanel.
Lists Sender, NEAR, TON, Nearblocks, Calimero, Ref Finance, FastNEAR and other API/RPC host permissions. — manifest.json:1-2
Keystone sync/sign tracking POSTs distinct_id and xfp to api.mixpanel.com/import. — background.bundle.js:22
Wallet service handlers send account and transaction data to selected APIs and chain RPC nodes. — background.bundle.js:253-353
Does it download or run code, settings, or instructions supplied by a remote server?
Remote RPC and wallet services supply balances, token metadata, swap routes, scam-address status, network state and transaction results that influence wallet behavior and display. No downloaded JavaScript or remotely supplied executable instruction was found.
Calls multiple configured APIs, including ScamSniffer address checks, and consumes returned status/data. — popup.bundle.js:760-766
Uses configured RPC/service responses for chain reads, transaction submission and wallet operations. — background.bundle.js:253-353
Can it take actions without a clear user request, such as opening pages, redirecting searches, downloading files, or sending requests?
Sensitive signatures and transactions require an approval window, but Keystone telemetry is sent automatically when the user syncs or signs, without a separate telemetry choice. An embedded frame can also initiate an approval request without a direct click.
Keystone syncKeyringData and signTransaction call Mixpanel tracking automatically. — background.bundle.js:22
Dapp transaction/signature methods create approve-transaction, personal-sign, switch-chain or sign-message windows before execution. — background.bundle.js:353
Forwards tagged window messages without requiring a user gesture. — contentScript.bundle.js:9-10
Can it change important browser settings, including your proxy, search engine, homepage, privacy settings, or other extensions?
No evidence of this behavior was found in the reviewed package.
Contains no settings override, search provider, chrome_url_overrides, proxy, privacy, management or debugger permission. — manifest.json:1-2
Is any important behavior difficult to inspect because the code is hidden, heavily obfuscated, dynamically generated, or supplied by third parties?
Nearly all logic is bundled and heavily minified, including large cryptography, blockchain, UI and QR libraries. This makes review harder, although recognizable module boundaries and literal behavior remain visible.
Lists multi-megabyte popup/background bundles and minified provider/content bundles. — inventory.json:1
Combines third-party libraries and first-party wallet logic into minified webpack modules. — background.bundle.js:1-353
Does it use eval(), new Function(), or string-based timers to turn text into executable code?
No evidence of this behavior was found in the reviewed package.
A hash-library environment shim uses fixed-string eval to obtain Node modules when running under Node. — background.bundle.js:109, 237
Webpack's global-object fallback uses new Function('return this') only after ordinary globalThis/window checks. — background.bundle.js:353
Contains equivalent bundled compatibility fallbacks, not remote-code loaders. — script.bundle.js:18-51
Does it track the websites, pages, searches, or links you visit?
No evidence of this behavior was found in the reviewed package.
Derives the requesting origin from the content-script sender URL for wallet authorization and popup context; no general URL-upload loop was found. — background.bundle.js:353
No tabs or history permission is declared. — manifest.json:1-2
Does it create a persistent ID or browser fingerprint to recognize you?
The Keystone path reports a hardware device identifier as distinct_id and the wallet's master fingerprint (xfp) to Mixpanel, creating a stable hardware-wallet activity identifier.
Mixpanel event properties contain distinct_id, xfp, time and a request ID; sync and sign events call the tracker. — background.bundle.js:22
Does it send cookies, session details, authentication data, or page contents elsewhere?
Public addresses, requested transaction contents and signed transactions are sent to wallet/chain services as required, while Keystone identifiers go to Mixpanel. I found no password, seed phrase, private key, cookie or arbitrary page-content upload.
Decrypts keys locally for signing and sends resulting transactions or RPC requests to configured chain services. — background.bundle.js:253-353
Sends Keystone device and xfp identifiers to Mixpanel on hardware sync/sign. — background.bundle.js:22
Uses encrypted keystore/password flows for stored wallet secrets. — background.bundle.js:9, 109
Does it record typing, form entries, clipboard contents, or screenshots?
It can use the camera for user-initiated QR scanning and write selected wallet values to the clipboard. It does not monitor typing, forms or clipboard contents, and it does not capture screenshots or microphone audio.
Contains the QR camera reader and a copy-to-clipboard helper in the extension popup. — popup.bundle.js:219, 237
Contains no keyboard, input, form, paste or selection listener. — contentScript.bundle.js:9-10
Can a website or remote server send commands that make the extension take actions?
Websites can command the wallet provider to request accounts, signatures, transactions, chain switches and RPC calls. This is intentional and sensitive actions require approval, but the bridge's missing source/origin validation lets embedded frames misuse the parent site's identity.
Exposes Sender provider methods through page postMessage requests. — script.bundle.js:18-51
Forwards every message with type sender-wallet-fromPage without checking event.source or event.origin. — contentScript.bundle.js:9-10
Routes sensitive methods into approval windows and derives the displayed origin from sender.url. — background.bundle.js:353
Does it alter links, referral codes, advertisements, shopping carts, or search results?
No evidence of this behavior was found in the reviewed package.
The content bridge injects a provider and relays messages; it does not modify links, ads or commerce elements. — contentScript.bundle.js:9-10
Does it redirect or modify web traffic, request headers, downloads, or proxy settings?
No evidence of this behavior was found in the reviewed package.
No proxy, webRequest, declarativeNetRequest, debugger or downloads permission is present. — manifest.json:1-2
Can it communicate with software on the computer or services running on localhost?
No evidence of this behavior was found in the reviewed package.
Includes http://34.201.128.53:8000 as a host permission but no localhost/private-address pattern or nativeMessaging permission. — manifest.json:1-2
Does it decode, decrypt, or unpack hidden data and then execute or inject it?
No evidence of this behavior was found in the reviewed package.
Crypto and encoding routines feed wallet operations; remote responses were not traced to eval, new Function or script insertion. — background.bundle.js:9-353
Injects only the packaged chrome.runtime.getURL('script.bundle.js') resource. — contentScript.bundle.js:9-10
Can ordinary websites access privileged extension features through messaging or exposed files?
The page bridge is exposed to ordinary websites and fails to verify the message source or origin. A cross-origin child iframe can post a wallet request to its parent, which is relayed under the parent frame's URL and can mislabel the requester in approval UI.
Runs the bridge in all HTTP(S) frames and exposes script.bundle.js as a web-accessible resource. — manifest.json:1-2
The window message listener checks only data.type and then calls chrome.runtime.sendMessage; it never checks event.source === window or event.origin. — contentScript.bundle.js:9-10
Uses new URL(sender.url).origin as the dapp identity, which reflects the receiving content-script frame rather than the original postMessage sender. — background.bundle.js:353
Does suspicious behavior activate only for certain users, websites, dates, or remote settings?
No evidence of this behavior was found in the reviewed package.
Branches on requested wallet method, chain, account and signer type; no covert targeting gate was identified. — background.bundle.js:253-353
Does it perform hidden resource-intensive work, such as cryptocurrency mining?
No evidence of this behavior was found in the reviewed package.
Contains wallet cryptography and chain clients but no mining loop, worker farm or proof-of-work service. — background.bundle.js:1-353
Does it change form fields or where a form sends its information?
No evidence of this behavior was found in the reviewed package.
No form/input query, value assignment, submit listener or action rewrite is present in the content bridge. — contentScript.bundle.js:9-10
Defines wallet-provider APIs without manipulating host-page forms. — script.bundle.js:18-51