crypttrace 0.24.0__tar.gz → 0.26.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.
- {crypttrace-0.24.0/src/crypttrace.egg-info → crypttrace-0.26.0}/PKG-INFO +6 -4
- {crypttrace-0.24.0 → crypttrace-0.26.0}/README.md +5 -3
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/__init__.py +1 -1
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/analysis.py +2 -2
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/assess.py +15 -4
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/evidence.py +2 -1
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/labels/known.json +43 -1
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/poisoning.py +24 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0/src/crypttrace.egg-info}/PKG-INFO +6 -4
- {crypttrace-0.24.0 → crypttrace-0.26.0}/LICENSE +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/pyproject.toml +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/setup.cfg +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/addresses.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/assets.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/bridges.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/chains.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/cli.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/config.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/drain.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/fetchers/__init__.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/fetchers/bitcoin.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/fetchers/etherscan.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/fetchers/http.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/fetchers/solana.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/fetchers/ton.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/fetchers/tron.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/freeze.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/funder.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/gascluster.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/investigate.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/labels/__init__.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/labels/audit.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/labels/bulk.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/labels/labels.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/labels/names.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/labels/partial.json +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/labels/tonapi.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/labels/tronscan.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/offramp.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/prices.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/render.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/report.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/spam.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/store.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/trace.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/verify.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/watch.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/web/index.html +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace/webapp.py +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace.egg-info/SOURCES.txt +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace.egg-info/dependency_links.txt +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace.egg-info/entry_points.txt +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.0}/src/crypttrace.egg-info/requires.txt +0 -0
- {crypttrace-0.24.0 → crypttrace-0.26.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.
|
|
3
|
+
Version: 0.26.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.
|
|
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
|
|
|
@@ -715,8 +717,8 @@ cases/ # worked investigations with their data
|
|
|
715
717
|
|
|
716
718
|
## Roadmap
|
|
717
719
|
|
|
718
|
-
- More exchanges on Bitcoin, Tron, Solana (now: Binance, OKX, HTX, Bybit),
|
|
719
|
-
and the EVM chains (now: Binance),
|
|
720
|
+
- More exchanges on Bitcoin, Tron, Solana (now: Binance, OKX, HTX, Bybit, MEXC),
|
|
721
|
+
TON and the EVM chains (now: Binance, MEXC),
|
|
720
722
|
and refreshing these lists as the exchanges republish them
|
|
721
723
|
- More label sources: Chainabuse, CryptoScamDB, exchange deposit-address sets
|
|
722
724
|
|
|
@@ -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.
|
|
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
|
|
|
@@ -681,8 +683,8 @@ cases/ # worked investigations with their data
|
|
|
681
683
|
|
|
682
684
|
## Roadmap
|
|
683
685
|
|
|
684
|
-
- More exchanges on Bitcoin, Tron, Solana (now: Binance, OKX, HTX, Bybit),
|
|
685
|
-
and the EVM chains (now: Binance),
|
|
686
|
+
- More exchanges on Bitcoin, Tron, Solana (now: Binance, OKX, HTX, Bybit, MEXC),
|
|
687
|
+
TON and the EVM chains (now: Binance, MEXC),
|
|
686
688
|
and refreshing these lists as the exchanges republish them
|
|
687
689
|
- More label sources: Chainabuse, CryptoScamDB, exchange deposit-address sets
|
|
688
690
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""crypttrace — OSINT crypto investigation CLI."""
|
|
2
|
-
__version__ = "0.
|
|
2
|
+
__version__ = "0.26.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
|
|
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(
|
|
64
|
-
"""Identical amounts arriving from unrelated addresses — batch automation.
|
|
65
|
-
|
|
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
|
-
|
|
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
|
|
|
@@ -364,5 +364,47 @@
|
|
|
364
364
|
|
|
365
365
|
"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
366
|
"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"}
|
|
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"},
|
|
368
|
+
|
|
369
|
+
"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"},
|
|
370
|
+
"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"},
|
|
371
|
+
"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"},
|
|
372
|
+
"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"},
|
|
373
|
+
"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"},
|
|
374
|
+
"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"},
|
|
375
|
+
"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"},
|
|
376
|
+
"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"},
|
|
377
|
+
"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"},
|
|
378
|
+
"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"},
|
|
379
|
+
"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"},
|
|
380
|
+
"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"},
|
|
381
|
+
"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"},
|
|
382
|
+
"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"},
|
|
383
|
+
"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"},
|
|
384
|
+
"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"},
|
|
385
|
+
"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"},
|
|
386
|
+
"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"},
|
|
387
|
+
"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"},
|
|
388
|
+
"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"},
|
|
389
|
+
"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"},
|
|
390
|
+
"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"},
|
|
391
|
+
"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"},
|
|
392
|
+
"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"},
|
|
393
|
+
"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"},
|
|
394
|
+
"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"},
|
|
395
|
+
"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"},
|
|
396
|
+
"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"},
|
|
397
|
+
"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"},
|
|
398
|
+
"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"},
|
|
399
|
+
"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"},
|
|
400
|
+
"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"},
|
|
401
|
+
"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"},
|
|
402
|
+
"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"},
|
|
403
|
+
"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"},
|
|
404
|
+
"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"},
|
|
405
|
+
"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"},
|
|
406
|
+
"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"},
|
|
407
|
+
"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"},
|
|
408
|
+
"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"},
|
|
409
|
+
"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
410
|
}
|
|
@@ -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.
|
|
3
|
+
Version: 0.26.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.
|
|
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
|
|
|
@@ -715,8 +717,8 @@ cases/ # worked investigations with their data
|
|
|
715
717
|
|
|
716
718
|
## Roadmap
|
|
717
719
|
|
|
718
|
-
- More exchanges on Bitcoin, Tron, Solana (now: Binance, OKX, HTX, Bybit),
|
|
719
|
-
and the EVM chains (now: Binance),
|
|
720
|
+
- More exchanges on Bitcoin, Tron, Solana (now: Binance, OKX, HTX, Bybit, MEXC),
|
|
721
|
+
TON and the EVM chains (now: Binance, MEXC),
|
|
720
722
|
and refreshing these lists as the exchanges republish them
|
|
721
723
|
- More label sources: Chainabuse, CryptoScamDB, exchange deposit-address sets
|
|
722
724
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|