crypttrace 0.24.0__tar.gz → 0.27.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. {crypttrace-0.24.0/src/crypttrace.egg-info → crypttrace-0.27.0}/PKG-INFO +14 -5
  2. {crypttrace-0.24.0 → crypttrace-0.27.0}/README.md +13 -4
  3. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/__init__.py +1 -1
  4. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/analysis.py +2 -2
  5. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/assess.py +15 -4
  6. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/evidence.py +2 -1
  7. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/labels/known.json +50 -2
  8. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/poisoning.py +24 -0
  9. {crypttrace-0.24.0 → crypttrace-0.27.0/src/crypttrace.egg-info}/PKG-INFO +14 -5
  10. {crypttrace-0.24.0 → crypttrace-0.27.0}/LICENSE +0 -0
  11. {crypttrace-0.24.0 → crypttrace-0.27.0}/pyproject.toml +0 -0
  12. {crypttrace-0.24.0 → crypttrace-0.27.0}/setup.cfg +0 -0
  13. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/addresses.py +0 -0
  14. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/assets.py +0 -0
  15. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/bridges.py +0 -0
  16. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/chains.py +0 -0
  17. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/cli.py +0 -0
  18. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/config.py +0 -0
  19. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/drain.py +0 -0
  20. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/fetchers/__init__.py +0 -0
  21. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/fetchers/bitcoin.py +0 -0
  22. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/fetchers/etherscan.py +0 -0
  23. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/fetchers/http.py +0 -0
  24. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/fetchers/solana.py +0 -0
  25. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/fetchers/ton.py +0 -0
  26. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/fetchers/tron.py +0 -0
  27. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/freeze.py +0 -0
  28. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/funder.py +0 -0
  29. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/gascluster.py +0 -0
  30. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/investigate.py +0 -0
  31. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/labels/__init__.py +0 -0
  32. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/labels/audit.py +0 -0
  33. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/labels/bulk.py +0 -0
  34. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/labels/labels.py +0 -0
  35. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/labels/names.py +0 -0
  36. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/labels/partial.json +0 -0
  37. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/labels/tonapi.py +0 -0
  38. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/labels/tronscan.py +0 -0
  39. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/offramp.py +0 -0
  40. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/prices.py +0 -0
  41. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/render.py +0 -0
  42. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/report.py +0 -0
  43. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/spam.py +0 -0
  44. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/store.py +0 -0
  45. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/trace.py +0 -0
  46. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/verify.py +0 -0
  47. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/watch.py +0 -0
  48. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/web/index.html +0 -0
  49. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace/webapp.py +0 -0
  50. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace.egg-info/SOURCES.txt +0 -0
  51. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace.egg-info/dependency_links.txt +0 -0
  52. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace.egg-info/entry_points.txt +0 -0
  53. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace.egg-info/requires.txt +0 -0
  54. {crypttrace-0.24.0 → crypttrace-0.27.0}/src/crypttrace.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crypttrace
3
- Version: 0.24.0
3
+ Version: 0.27.0
4
4
  Summary: OSINT toolkit for crypto investigations: trace stolen funds across Ethereum, Bitcoin, Tron, Solana and TON
5
5
  Author: bobslayerX
6
6
  License-Expression: MIT
@@ -555,7 +555,9 @@ On Bitcoin, Tron and Solana the labels cover the reserve wallets of Binance,
555
555
  OKX and HTX, plus Bybit's older 2022 list — each taken from the address list the
556
556
  exchange publishes itself for proof-of-reserves; on TON and the EVM chains
557
557
  (Ethereum, BNB Chain, Arbitrum, Polygon, Base, Optimism), Binance's reserve
558
- wallets. That is what lets `offramp` flag deposit addresses on those chains. Funds sent to an exchange not on that
558
+ wallets. MEXC's reserve wallets are covered on every one of these chains, from
559
+ the "verified wallets" table of its monthly Hacken proof-of-reserves audit.
560
+ That is what lets `offramp` flag deposit addresses on those chains. Funds sent to an exchange not on that
559
561
  list still show as `unknown`. Every label records where it came from — see
560
562
  `crypttrace labels audit`.
561
563
 
@@ -710,14 +712,14 @@ src/crypttrace/
710
712
  webapp.py # Flask backend for the web UI
711
713
  web/index.html # single-page frontend (interactive graph)
712
714
  selftest.py # offline end-to-end checks, run by CI
715
+ tools/refresh_por.py # maintainer: refresh exchange reserve-wallet labels
713
716
  cases/ # worked investigations with their data
714
717
  ```
715
718
 
716
719
  ## Roadmap
717
720
 
718
- - More exchanges on Bitcoin, Tron, Solana (now: Binance, OKX, HTX, Bybit), TON
719
- and the EVM chains (now: Binance),
720
- and refreshing these lists as the exchanges republish them
721
+ - More exchanges on Bitcoin, Tron, Solana (now: Binance, OKX, HTX, Bybit, MEXC),
722
+ TON and the EVM chains (now: Binance, HTX, MEXC)
721
723
  - More label sources: Chainabuse, CryptoScamDB, exchange deposit-address sets
722
724
 
723
725
  ## Contributing
@@ -729,6 +731,13 @@ a `source` a reader can check and a `source_kind` (`self-published`,
729
731
  `crypttrace labels audit` and `python selftest.py` before opening a PR.
730
732
  Accuracy matters more than volume — a wrong label is worse than no label.
731
733
 
734
+ Exchanges republish their reserve-wallet lists (Binance continuously, HTX and
735
+ MEXC monthly). `python tools/refresh_por.py binance htx` shows what changed
736
+ since the labels were taken; `--write` adds the newly listed wallets and marks
737
+ the ones no longer listed as possibly retired (their labels stay: old funds
738
+ still lead there). For MEXC, download the latest Hacken audit PDF from
739
+ mexc.com/proof-of-reserve/audit-report and pass it with `--mexc FILE`.
740
+
732
741
  ## Licence
733
742
 
734
743
  MIT — see [LICENSE](LICENSE).
@@ -521,7 +521,9 @@ On Bitcoin, Tron and Solana the labels cover the reserve wallets of Binance,
521
521
  OKX and HTX, plus Bybit's older 2022 list — each taken from the address list the
522
522
  exchange publishes itself for proof-of-reserves; on TON and the EVM chains
523
523
  (Ethereum, BNB Chain, Arbitrum, Polygon, Base, Optimism), Binance's reserve
524
- wallets. That is what lets `offramp` flag deposit addresses on those chains. Funds sent to an exchange not on that
524
+ wallets. MEXC's reserve wallets are covered on every one of these chains, from
525
+ the "verified wallets" table of its monthly Hacken proof-of-reserves audit.
526
+ That is what lets `offramp` flag deposit addresses on those chains. Funds sent to an exchange not on that
525
527
  list still show as `unknown`. Every label records where it came from — see
526
528
  `crypttrace labels audit`.
527
529
 
@@ -676,14 +678,14 @@ src/crypttrace/
676
678
  webapp.py # Flask backend for the web UI
677
679
  web/index.html # single-page frontend (interactive graph)
678
680
  selftest.py # offline end-to-end checks, run by CI
681
+ tools/refresh_por.py # maintainer: refresh exchange reserve-wallet labels
679
682
  cases/ # worked investigations with their data
680
683
  ```
681
684
 
682
685
  ## Roadmap
683
686
 
684
- - More exchanges on Bitcoin, Tron, Solana (now: Binance, OKX, HTX, Bybit), TON
685
- and the EVM chains (now: Binance),
686
- and refreshing these lists as the exchanges republish them
687
+ - More exchanges on Bitcoin, Tron, Solana (now: Binance, OKX, HTX, Bybit, MEXC),
688
+ TON and the EVM chains (now: Binance, HTX, MEXC)
687
689
  - More label sources: Chainabuse, CryptoScamDB, exchange deposit-address sets
688
690
 
689
691
  ## Contributing
@@ -695,6 +697,13 @@ a `source` a reader can check and a `source_kind` (`self-published`,
695
697
  `crypttrace labels audit` and `python selftest.py` before opening a PR.
696
698
  Accuracy matters more than volume — a wrong label is worse than no label.
697
699
 
700
+ Exchanges republish their reserve-wallet lists (Binance continuously, HTX and
701
+ MEXC monthly). `python tools/refresh_por.py binance htx` shows what changed
702
+ since the labels were taken; `--write` adds the newly listed wallets and marks
703
+ the ones no longer listed as possibly retired (their labels stay: old funds
704
+ still lead there). For MEXC, download the latest Hacken audit PDF from
705
+ mexc.com/proof-of-reserve/audit-report and pass it with `--mexc FILE`.
706
+
698
707
  ## Licence
699
708
 
700
709
  MIT — see [LICENSE](LICENSE).
@@ -1,2 +1,2 @@
1
1
  """crypttrace — OSINT crypto investigation CLI."""
2
- __version__ = "0.24.0"
2
+ __version__ = "0.27.0"
@@ -243,5 +243,5 @@ def describe_burst(burst, total_events: int) -> Optional[str]:
243
243
  if minutes <= 60 * 24:
244
244
  return (f"{count} of {total_events} transfers fall inside {minutes/60:.1f} hours ({when})."
245
245
  " Activity is concentrated rather than spread out.")
246
- return (f"Activity is spread over {minutes/60/24:.0f} days — no burst pattern, "
247
- "which is what ordinary wallet use looks like.")
246
+ return (f"Activity is spread over {minutes/60/24:.0f} days — no burst pattern, so no sign "
247
+ "of an automated sweep (which says nothing about whose money it is).")
@@ -60,9 +60,16 @@ def constant_fee_signature(values: List[float], min_hits: int = 5) -> Optional[d
60
60
  return {"fee": delta, "hits": hits, "of": total, "share": hits / total}
61
61
 
62
62
 
63
- def repeated_amounts(values: List[float], min_repeat: int = 3) -> List[tuple]:
64
- """Identical amounts arriving from unrelated addresses — batch automation."""
65
- c = Counter(round(v, 8) for v in values if v > 0)
63
+ def repeated_amounts(payments: List[tuple], min_repeat: int = 3) -> List[tuple]:
64
+ """Identical amounts arriving from unrelated addresses — batch automation.
65
+
66
+ `payments` are (amount, sender); an amount counts once per distinct sender,
67
+ so one wallet paying the same sum again is not a batch."""
68
+ senders: Dict[float, set] = {}
69
+ for v, frm in payments:
70
+ if v > 0:
71
+ senders.setdefault(round(v, 8), set()).add(frm)
72
+ c = Counter({amt: len(s) for amt, s in senders.items()})
66
73
  return [(amt, n) for amt, n in c.most_common(5) if n >= min_repeat]
67
74
 
68
75
 
@@ -143,7 +150,11 @@ def assess(address: str, chain: str = "eth", asset: Optional[dict] = None,
143
150
  evidence={"count": b[1], "span_minutes": round(span_min, 1),
144
151
  "from_ts": b[2], "to_ts": b[3]}))
145
152
 
146
- rep = repeated_amounts([r.get("value", 0) for r in inbound])
153
+ # small sums are what spammers and lure campaigns send every known address, in
154
+ # fixed amounts by design; batch processing shows in money worth moving
155
+ floor = 100 * analysis.dust_threshold(chain, asset)
156
+ rep = repeated_amounts([(r.get("value", 0), r.get("from")) for r in inbound
157
+ if r.get("value", 0) >= floor and not r.get("kind")])
147
158
  if rep:
148
159
  top = rep[0]
149
160
  signals.append(Signal(
@@ -19,7 +19,8 @@ from crypttrace import __version__, chains, drain
19
19
  from crypttrace.labels import labels
20
20
 
21
21
  # law-enforcement request portals, only where checked against the exchange's own site
22
- LE_PORTALS = {"KuCoin": "https://www.kucoin.com/legal/requests"}
22
+ LE_PORTALS = {"KuCoin": "https://www.kucoin.com/legal/requests",
23
+ "MEXC": "https://www.mexc.com/support/ticket/submit/law-enforcement-requests"}
23
24
  SOURCES = {"ton": "toncenter.com (transactions), tonapi.io (account names)",
24
25
  "tron": "TronGrid", "btc": "mempool.space", "sol": "Solana JSON-RPC"}
25
26
 
@@ -326,7 +326,7 @@
326
326
 
327
327
  "143gLvWYUojXaWZRrxquRKpVNTkhmr415B": {"name": "HTX reserve wallet", "type": "exchange", "chain": "btc", "source": "HTX proof-of-reserves snapshot 2026-09-01 on HTX's official GitHub (github.com/huobiapi/Tool-Node.js-VerifyAddress, snapshot/huobi_por.csv); listed with an ownership signature (not verified by crypttrace)", "source_kind": "self-published", "added": "2026-09-23"},
328
328
  "12qTdZHx6f77aQ74CPCZGSY47VaRwYjVD8": {"name": "HTX reserve wallet", "type": "exchange", "chain": "btc", "source": "HTX proof-of-reserves snapshot 2026-09-01 on HTX's official GitHub (github.com/huobiapi/Tool-Node.js-VerifyAddress, snapshot/huobi_por.csv); listed with an ownership signature (not verified by crypttrace)", "source_kind": "self-published", "added": "2026-09-23"},
329
- "1HckjUpRGcrrRAtFaaCAUaGjsPx9oYmLaZ": {"name": "HTX reserve wallet", "type": "exchange", "chain": "btc", "source": "HTX proof-of-reserves snapshot 2026-09-01 on HTX's official GitHub (github.com/huobiapi/Tool-Node.js-VerifyAddress, snapshot/huobi_por.csv); listed with an ownership signature (not verified by crypttrace)", "source_kind": "self-published", "added": "2026-09-23"},
329
+ "1HckjUpRGcrrRAtFaaCAUaGjsPx9oYmLaZ": {"name": "HTX reserve wallet", "type": "exchange", "chain": "btc", "source": "HTX proof-of-reserves snapshot 2026-09-01 on HTX's official GitHub (github.com/huobiapi/Tool-Node.js-VerifyAddress, snapshot/huobi_por.csv); listed with an ownership signature (not verified by crypttrace); not in the 2026-10-01 list, so possibly retired", "source_kind": "self-published", "added": "2026-09-23"},
330
330
  "1LXzGrDQqKqVBqxfGDUyhC6rTRBN5s8Sbj": {"name": "HTX reserve wallet", "type": "exchange", "chain": "btc", "source": "HTX proof-of-reserves snapshot 2026-09-01 on HTX's official GitHub (github.com/huobiapi/Tool-Node.js-VerifyAddress, snapshot/huobi_por.csv); listed with an ownership signature (not verified by crypttrace)", "source_kind": "self-published", "added": "2026-09-23"},
331
331
  "12AxQ3mM2rwY2mwLa5qNVY65uHoQGfvSVF": {"name": "HTX reserve wallet", "type": "exchange", "chain": "btc", "source": "HTX proof-of-reserves snapshot 2026-09-01 on HTX's official GitHub (github.com/huobiapi/Tool-Node.js-VerifyAddress, snapshot/huobi_por.csv); listed without a signature", "source_kind": "self-published", "added": "2026-09-23"},
332
332
  "1AQLXAB6aXSVbRMjbhSBudLf1kcsbWSEjg": {"name": "HTX reserve wallet", "type": "exchange", "chain": "btc", "source": "HTX proof-of-reserves snapshot 2026-09-01 on HTX's official GitHub (github.com/huobiapi/Tool-Node.js-VerifyAddress, snapshot/huobi_por.csv); listed with an ownership signature (not verified by crypttrace)", "source_kind": "self-published", "added": "2026-09-23"},
@@ -348,6 +348,9 @@
348
348
  "TRSXRWudzfzY4jH7AaMowdMNUXDkHisbcd": {"name": "HTX reserve wallet", "type": "exchange", "chain": "tron", "source": "HTX proof-of-reserves snapshot 2026-09-01 on HTX's official GitHub (github.com/huobiapi/Tool-Node.js-VerifyAddress, snapshot/huobi_por.csv); listed with an ownership signature (not verified by crypttrace)", "source_kind": "self-published", "added": "2026-09-23"},
349
349
  "TCiRCBNFrL6bFKWL94yWQi5hNMGNp1Nu27": {"name": "HTX reserve wallet", "type": "exchange", "chain": "tron", "source": "HTX proof-of-reserves snapshot 2026-09-01 on HTX's official GitHub (github.com/huobiapi/Tool-Node.js-VerifyAddress, snapshot/huobi_por.csv); listed with an ownership signature (not verified by crypttrace)", "source_kind": "self-published", "added": "2026-09-23"},
350
350
  "TBuzWQynfzershAsPfGjo4A9sXUfZf8wsq": {"name": "HTX reserve wallet", "type": "exchange", "chain": "tron", "source": "HTX proof-of-reserves snapshot 2026-09-01 on HTX's official GitHub (github.com/huobiapi/Tool-Node.js-VerifyAddress, snapshot/huobi_por.csv); listed with an ownership signature (not verified by crypttrace)", "source_kind": "self-published", "added": "2026-09-23"},
351
+ "0x6663613fbd927ce78abbf7f5ca7e2c3fe0d96d18": {"name": "HTX reserve wallet", "type": "exchange", "source": "HTX proof-of-reserves snapshot 2026-10-01 on HTX's official GitHub (github.com/huobiapi/Tool-Node.js-VerifyAddress, snapshot/huobi_por.csv); listed without a signature", "source_kind": "self-published", "added": "2026-10-23"},
352
+ "0x9be5b8a7314552fa47feb1355cd5b4adc7bb7516": {"name": "HTX reserve wallet", "type": "exchange", "source": "HTX proof-of-reserves snapshot 2026-10-01 on HTX's official GitHub (github.com/huobiapi/Tool-Node.js-VerifyAddress, snapshot/huobi_por.csv); listed with an ownership signature (not verified by crypttrace)", "source_kind": "self-published", "added": "2026-10-23"},
353
+ "0x18709e89bd403f470088abdacebe86cc60dda12e": {"name": "HTX reserve wallet", "type": "exchange", "source": "HTX proof-of-reserves snapshot 2026-10-01 on HTX's official GitHub (github.com/huobiapi/Tool-Node.js-VerifyAddress, snapshot/huobi_por.csv); listed with an ownership signature (not verified by crypttrace)", "source_kind": "self-published", "added": "2026-10-23"},
351
354
 
352
355
  "TQVxjVy2sYt4at45ezD7VG4H6nQZtsua5C": {"name": "Bybit (2022 reserve list)", "type": "exchange", "chain": "tron", "source": "Bybit proof-of-reserves address list, Dec 2022 (static.bycustody.com/download/app/bybit_por_202212.csv, linked from Bybit's help center); may since be retired", "source_kind": "self-published", "added": "2026-09-23"},
353
356
  "TKFvdC4UC1vtCoHZgn8eviK34kormXaqJ7": {"name": "Bybit (2022 reserve list)", "type": "exchange", "chain": "tron", "source": "Bybit proof-of-reserves address list, Dec 2022 (static.bycustody.com/download/app/bybit_por_202212.csv, linked from Bybit's help center); may since be retired", "source_kind": "self-published", "added": "2026-09-23"},
@@ -364,5 +367,50 @@
364
367
 
365
368
  "UQAdCl0uTEHMLzvmsD6o69FXjxbNavwaP7pPAGMLCRf9aEbe": {"name": "Binance reserve wallet (custodied by Ceffu)", "type": "exchange", "chain": "ton", "source": "Binance proof-of-reserves address list (binance.com/bapi/apex/v1/public/apex/market/por/address), fetched 2026-09-23; listed since 2026-08-24", "source_kind": "self-published", "added": "2026-09-29"},
366
369
  "UQD4uGNdB4a3f52mYOZf0x1nCmdd1DAvrLppL0a1cetTYCQx": {"name": "Binance reserve wallet", "type": "exchange", "chain": "ton", "source": "Binance proof-of-reserves address list (binance.com/bapi/apex/v1/public/apex/market/por/address), fetched 2026-09-23; listed since 2025-10-15", "source_kind": "self-published", "added": "2026-09-29"},
367
- "UQDKHZ7e70CzqdvZCC83Z4WVR8POC_ZB0J1Y4zo88G-zCSRH": {"name": "Binance reserve wallet", "type": "exchange", "chain": "ton", "source": "Binance proof-of-reserves address list (binance.com/bapi/apex/v1/public/apex/market/por/address), fetched 2026-09-23; listed since 2025-10-15", "source_kind": "self-published", "added": "2026-09-29"}
370
+ "UQDKHZ7e70CzqdvZCC83Z4WVR8POC_ZB0J1Y4zo88G-zCSRH": {"name": "Binance reserve wallet", "type": "exchange", "chain": "ton", "source": "Binance proof-of-reserves address list (binance.com/bapi/apex/v1/public/apex/market/por/address), fetched 2026-09-23; listed since 2025-10-15", "source_kind": "self-published", "added": "2026-09-29"},
371
+ "34yeXcv1tQSQxwNRQXfS5qvFGSKDvk7Yiu": {"name": "Binance reserve wallet", "type": "exchange", "chain": "btc", "source": "Binance proof-of-reserves address list (binance.com/bapi/apex/v1/public/apex/market/por/address), fetched 2026-10-23; listed since 2026-10-22", "source_kind": "self-published", "added": "2026-10-23"},
372
+ "3HhbSpPhKsw4t7ond5Mv9oVZBtpQKFu5cx": {"name": "Binance reserve wallet", "type": "exchange", "chain": "btc", "source": "Binance proof-of-reserves address list (binance.com/bapi/apex/v1/public/apex/market/por/address), fetched 2026-10-23; listed since 2026-10-22", "source_kind": "self-published", "added": "2026-10-23"},
373
+ "3J6tf7fg3B5aWLCwnDqAFFmS72SssK5yeH": {"name": "Binance reserve wallet", "type": "exchange", "chain": "btc", "source": "Binance proof-of-reserves address list (binance.com/bapi/apex/v1/public/apex/market/por/address), fetched 2026-10-23; listed since 2026-10-22", "source_kind": "self-published", "added": "2026-10-23"},
374
+
375
+ "0x9b64203878f24eb0cdf55c8c6fa7d08ba0cf77e5": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for Arbitrum", "source_kind": "self-published", "added": "2026-10-23"},
376
+ "0xb86f1061e0d79e8319339d5fdbb187d4e7ad3300": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for Arbitrum", "source_kind": "self-published", "added": "2026-10-23"},
377
+ "0x4e3ae00e8323558fa5cac04b152238924aa31b60": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for Base", "source_kind": "self-published", "added": "2026-10-23"},
378
+ "13uZyaPbt4rTwYQ8xWFySVUzWH3pk2P5c7": {"name": "MEXC reserve wallet", "type": "exchange", "chain": "btc", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09", "source_kind": "self-published", "added": "2026-10-23"},
379
+ "17wgJkQ8v66fXTUawQS3sohEfzP4CCD8Xu": {"name": "MEXC reserve wallet", "type": "exchange", "chain": "btc", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09", "source_kind": "self-published", "added": "2026-10-23"},
380
+ "19KYQDpyssRUtpfa4pfAWiNQLeysThd1us": {"name": "MEXC reserve wallet", "type": "exchange", "chain": "btc", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09", "source_kind": "self-published", "added": "2026-10-23"},
381
+ "1Ak5Zk6P3Y7AbrdhWHif7GmEJhd6FqAS9J": {"name": "MEXC reserve wallet", "type": "exchange", "chain": "btc", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09", "source_kind": "self-published", "added": "2026-10-23"},
382
+ "1MDVjZdX8QD212pT8Z8EMP7DuFQHKqN3mx": {"name": "MEXC reserve wallet", "type": "exchange", "chain": "btc", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09", "source_kind": "self-published", "added": "2026-10-23"},
383
+ "1NEQFpjSqRMWuHLTrouSbmSgXuJr8zPCN7": {"name": "MEXC reserve wallet", "type": "exchange", "chain": "btc", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09", "source_kind": "self-published", "added": "2026-10-23"},
384
+ "35C2L1pCgwzBHNcDcVL1a5RuoefeWqyjAR": {"name": "MEXC reserve wallet", "type": "exchange", "chain": "btc", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09", "source_kind": "self-published", "added": "2026-10-23"},
385
+ "38RB6AuNgLjPyJqt92wJXoas7ZMYq12gHR": {"name": "MEXC reserve wallet", "type": "exchange", "chain": "btc", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09", "source_kind": "self-published", "added": "2026-10-23"},
386
+ "bc1qnzf53fl4a0lh00p9207c456xkk9fmgdnm6tyky": {"name": "MEXC reserve wallet", "type": "exchange", "chain": "btc", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09", "source_kind": "self-published", "added": "2026-10-23"},
387
+ "bc1qrlsks7xe755m05zfreyjdxn34rypc4lnghtcwc": {"name": "MEXC reserve wallet", "type": "exchange", "chain": "btc", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09", "source_kind": "self-published", "added": "2026-10-23"},
388
+ "0x2e8f79ad740de90dc5f5a9f0d8d9661a60725e64": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for BNB Chain", "source_kind": "self-published", "added": "2026-10-23"},
389
+ "0x4982085c9e2f89f2ecb8131eca71afad896e89cb": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for BNB Chain", "source_kind": "self-published", "added": "2026-10-23"},
390
+ "0x7354abb551e41bbd9fb32e2e79f44631349119b8": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for BNB Chain", "source_kind": "self-published", "added": "2026-10-23"},
391
+ "0x9bb6a22da110c6c9bab745bcaf0ee142ee83af37": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for BNB Chain", "source_kind": "self-published", "added": "2026-10-23"},
392
+ "0xa71180a5bfbc0dbd18f7b355e4afa101a319ff6a": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for BNB Chain", "source_kind": "self-published", "added": "2026-10-23"},
393
+ "0x0162cd2ba40e23378bf0fd41f919e1be075f025f": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for Ethereum", "source_kind": "self-published", "added": "2026-10-23"},
394
+ "0x12c5e4eeeaa20e25847b5453d23246983c512db7": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for Ethereum", "source_kind": "self-published", "added": "2026-10-23"},
395
+ "0x1f7370792a057227024e7a8cc15b40e3ed171ffc": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for Ethereum", "source_kind": "self-published", "added": "2026-10-23"},
396
+ "0x3cc936b795a188f0e246cbb2d74c5bd190aecf18": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for Ethereum", "source_kind": "self-published", "added": "2026-10-23"},
397
+ "0x75e89d5979e4f6fba9f97c104c2f0afb3f1dcb88": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for Ethereum", "source_kind": "self-published", "added": "2026-10-23"},
398
+ "0x76bf215ade956642b056b9043e014988941bbddd": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for Ethereum", "source_kind": "self-published", "added": "2026-10-23"},
399
+ "0x9642b23ed1e01df1092b92641051881a322f5d4e": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for Ethereum", "source_kind": "self-published", "added": "2026-10-23"},
400
+ "0xbcb302a64adb7f2c8697e17c1e948f5b058f0e49": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for Ethereum", "source_kind": "self-published", "added": "2026-10-23"},
401
+ "0xc411ab12837f63935b71b6c6643d0f7000e55e4b": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for Ethereum", "source_kind": "self-published", "added": "2026-10-23"},
402
+ "0xd67f25ef2399a0c769b1a35634c5ce77166714db": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for Ethereum", "source_kind": "self-published", "added": "2026-10-23"},
403
+ "0xe4e3eca65460c14a5245b09fee15a92ba09458b6": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for Ethereum", "source_kind": "self-published", "added": "2026-10-23"},
404
+ "0xe8832a868c091263ed190a9f4be304a03895dd91": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for Ethereum", "source_kind": "self-published", "added": "2026-10-23"},
405
+ "0xee136c0389733849dd710ac7104e92c6bf497574": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for Ethereum", "source_kind": "self-published", "added": "2026-10-23"},
406
+ "0xf016e1d45ef23bdd414e7a2e4d46e1b34577b508": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for Ethereum", "source_kind": "self-published", "added": "2026-10-23"},
407
+ "0xf95334a86d09a6eec74d69da344efaca424b13a9": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for Ethereum", "source_kind": "self-published", "added": "2026-10-23"},
408
+ "0xdf90c9b995a3b10a5b8570a47101e6c6a29eb945": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for Optimism", "source_kind": "self-published", "added": "2026-10-23"},
409
+ "0x51e3d44172868acc60d68ca99591ce4230bc75e0": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for Polygon", "source_kind": "self-published", "added": "2026-10-23"},
410
+ "0x576b81f0c21edbc920ad63feeeb2b0736b018a58": {"name": "MEXC reserve wallet", "type": "exchange", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09; listed for Polygon", "source_kind": "self-published", "added": "2026-10-23"},
411
+ "5PAhQiYdLBd6SVdjzBQDxUAEFyDdF5ExNPQfcscnPRj5": {"name": "MEXC reserve wallet", "type": "exchange", "chain": "sol", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09", "source_kind": "self-published", "added": "2026-10-23"},
412
+ "ASTyfSima4LLAdDgoFGkgqoKowG1LZFDr9fAQrg7iaJZ": {"name": "MEXC reserve wallet", "type": "exchange", "chain": "sol", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09", "source_kind": "self-published", "added": "2026-10-23"},
413
+ "UQDYh9Di0cT8QSbnHJcNM6sYlpQAAOrnA7sats7Mgwd344Mm": {"name": "MEXC reserve wallet", "type": "exchange", "chain": "ton", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09", "source_kind": "self-published", "added": "2026-10-23"},
414
+ "TB37WWozkkenGVYWD7Do2N5WT2CedqDktJ": {"name": "MEXC reserve wallet", "type": "exchange", "chain": "tron", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09", "source_kind": "self-published", "added": "2026-10-23"},
415
+ "TEPSrSYPDSQ7yXpMFPq91Fb1QEWpMkRGfn": {"name": "MEXC reserve wallet", "type": "exchange", "chain": "tron", "source": "MEXC proof-of-reserves audit by Hacken, 'Verified wallets' table (ownership proven by a test transaction from each address); MEXC_PoR_Audit_20261009.pdf, listed at mexc.com/proof-of-reserve/audit-report; snapshot 2026-10-09", "source_kind": "self-published", "added": "2026-10-23"}
368
416
  }
@@ -210,6 +210,16 @@ def _substantial(row: dict, chain: str) -> bool:
210
210
  return bool(real and real.get("stable") and contract == real["contract"].lower() and v >= 10)
211
211
 
212
212
 
213
+ def _set_up_by(wallet: str, me: str, chain: str) -> bool:
214
+ """Whether `me` funded `wallet` first — a wallet it set up, not a stranger."""
215
+ from crypttrace import funder
216
+ try:
217
+ ff = funder.first_funder(wallet, chain)
218
+ except chains.ChainError:
219
+ return False
220
+ return bool(ff) and chains.norm_addr(ff["funder"], chain) == me
221
+
222
+
213
223
  def baited_payments(address: str, chain: str, limit: int = 1000,
214
224
  confirm: int = 3) -> List[dict]:
215
225
  """Payers who sent `address` real money right after it lured them.
@@ -219,11 +229,22 @@ def baited_payments(address: str, chain: str, limit: int = 1000,
219
229
  makes it appear in the payer's history. For up to `confirm` payers their
220
230
  own history is read for the address this one imitates, which turns a
221
231
  pattern into a specific claim.
232
+
233
+ Not a lured payment: money a contract sent (an internal transaction — a
234
+ bridge or protocol paying out), money that arrived inside a transaction this
235
+ address signed itself (it called a contract that paid it), and money from a
236
+ wallet this address set up (its own wallet returning funds). A victim of
237
+ poisoning signs the payment themselves, from a wallet of their own.
222
238
  """
223
239
  me = chains.norm_addr(address, chain)
224
240
  if labels.type_of(me) == "exchange" and not labels.is_deposit(me):
225
241
  return [] # an exchange paying its own wallets lures no one
226
242
  rows = _history(address, chain, limit)
243
+ # transactions this address signed (TON hashes name the account's own transaction,
244
+ # whoever started it, so the rule cannot be read from them there)
245
+ signed = set() if chain == "ton" else {
246
+ r.get("hash") for r in rows
247
+ if r.get("from") == me and not r.get("contract") and not r.get("internal") and r.get("hash")}
227
248
  first_active = min((int(r.get("timestamp") or 0) for r in rows if r.get("timestamp")), default=0)
228
249
  lure: Dict[str, dict] = {} # counterparty -> earliest lure
229
250
  paid: Dict[Tuple[str, str], dict] = {}
@@ -238,6 +259,8 @@ def baited_payments(address: str, chain: str, limit: int = 1000,
238
259
  elif frm == me:
239
260
  kind = "small transfer from this address"
240
261
  elif _substantial(r, chain):
262
+ if r.get("internal") or r.get("hash") in signed:
263
+ continue # paid by a contract, or in this address's own transaction
241
264
  p = paid.setdefault((other, r.get("symbol") or "?"), {"value": 0.0, "first_ts": ts})
242
265
  p["value"] += v
243
266
  p["first_ts"] = min(p["first_ts"], ts)
@@ -259,6 +282,7 @@ def baited_payments(address: str, chain: str, limit: int = 1000,
259
282
  "address_age_s": p["first_ts"] - first_active if first_active else None,
260
283
  "imitates": None})
261
284
  out.sort(key=lambda x: -x["paid"])
285
+ out = [x for x in out if not _set_up_by(x["payer"], me, chain)]
262
286
  for x in out[:confirm]:
263
287
  try:
264
288
  for pair in lookalikes(x["payer"], chain, limit):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crypttrace
3
- Version: 0.24.0
3
+ Version: 0.27.0
4
4
  Summary: OSINT toolkit for crypto investigations: trace stolen funds across Ethereum, Bitcoin, Tron, Solana and TON
5
5
  Author: bobslayerX
6
6
  License-Expression: MIT
@@ -555,7 +555,9 @@ On Bitcoin, Tron and Solana the labels cover the reserve wallets of Binance,
555
555
  OKX and HTX, plus Bybit's older 2022 list — each taken from the address list the
556
556
  exchange publishes itself for proof-of-reserves; on TON and the EVM chains
557
557
  (Ethereum, BNB Chain, Arbitrum, Polygon, Base, Optimism), Binance's reserve
558
- wallets. That is what lets `offramp` flag deposit addresses on those chains. Funds sent to an exchange not on that
558
+ wallets. MEXC's reserve wallets are covered on every one of these chains, from
559
+ the "verified wallets" table of its monthly Hacken proof-of-reserves audit.
560
+ That is what lets `offramp` flag deposit addresses on those chains. Funds sent to an exchange not on that
559
561
  list still show as `unknown`. Every label records where it came from — see
560
562
  `crypttrace labels audit`.
561
563
 
@@ -710,14 +712,14 @@ src/crypttrace/
710
712
  webapp.py # Flask backend for the web UI
711
713
  web/index.html # single-page frontend (interactive graph)
712
714
  selftest.py # offline end-to-end checks, run by CI
715
+ tools/refresh_por.py # maintainer: refresh exchange reserve-wallet labels
713
716
  cases/ # worked investigations with their data
714
717
  ```
715
718
 
716
719
  ## Roadmap
717
720
 
718
- - More exchanges on Bitcoin, Tron, Solana (now: Binance, OKX, HTX, Bybit), TON
719
- and the EVM chains (now: Binance),
720
- and refreshing these lists as the exchanges republish them
721
+ - More exchanges on Bitcoin, Tron, Solana (now: Binance, OKX, HTX, Bybit, MEXC),
722
+ TON and the EVM chains (now: Binance, HTX, MEXC)
721
723
  - More label sources: Chainabuse, CryptoScamDB, exchange deposit-address sets
722
724
 
723
725
  ## Contributing
@@ -729,6 +731,13 @@ a `source` a reader can check and a `source_kind` (`self-published`,
729
731
  `crypttrace labels audit` and `python selftest.py` before opening a PR.
730
732
  Accuracy matters more than volume — a wrong label is worse than no label.
731
733
 
734
+ Exchanges republish their reserve-wallet lists (Binance continuously, HTX and
735
+ MEXC monthly). `python tools/refresh_por.py binance htx` shows what changed
736
+ since the labels were taken; `--write` adds the newly listed wallets and marks
737
+ the ones no longer listed as possibly retired (their labels stay: old funds
738
+ still lead there). For MEXC, download the latest Hacken audit PDF from
739
+ mexc.com/proof-of-reserve/audit-report and pass it with `--mexc FILE`.
740
+
732
741
  ## Licence
733
742
 
734
743
  MIT — see [LICENSE](LICENSE).
File without changes
File without changes
File without changes