-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathct.py
More file actions
130 lines (108 loc) · 6.07 KB
/
ct.py
File metadata and controls
130 lines (108 loc) · 6.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/usr/bin/env python3
"""
CryptoToolkit (ct) — 五合一鏈上投資工具
Usage:
ct smart-money --chain bsc
ct smart-money --chain bsc --resonance
ct safety --token 0x1234... --chain bsc
ct safety --token CAKE --chain bsc
ct dex --token USDC
ct dex --scan-alpha --min-spread 0.5
ct yield --token USDC
ct yield --scan-stablecoins
ct wallet --address 0xAb58... --chain eth
ct wallet --address 0xAb58... --all-chains
ct wallet --address 0xAb58... --chain bsc --token CAKE --cost 2.50
ct pipeline --chain bsc
ct pipeline --chain bsc --top 5
"""
import argparse
import sys
from utils.chains import resolve_chain_id
def _add_json(p):
p.add_argument("--json", action="store_true", help="Output raw JSON")
def _add_chain(p, required=False, default="bsc"):
p.add_argument("--chain", "-c",
default=None if required else default,
required=required,
help="Chain (bsc/eth/base/arb/polygon or chain ID)")
def main():
parser = argparse.ArgumentParser(
prog="ct",
description="CryptoToolkit — 五合一鏈上投資工具",
formatter_class=argparse.RawDescriptionHelpFormatter,
)
parser.add_argument("--version", action="version", version="CryptoToolkit 1.0.0")
sub = parser.add_subparsers(dest="command", metavar="COMMAND")
# ── smart-money ───────────────────────────────────────────────────────────
p_sm = sub.add_parser("smart-money", help="Smart Money Tracker (Skill #1)")
_add_chain(p_sm)
p_sm.add_argument("--resonance", action="store_true", help="Cross-signal resonance detection")
_add_json(p_sm)
# ── safety ────────────────────────────────────────────────────────────────
p_sf = sub.add_parser("safety", help="Token Safety Scanner (Skill #2)")
p_sf.add_argument("--token", "-t", required=True, help="Contract address or token symbol")
_add_chain(p_sf)
_add_json(p_sf)
# ── dex ───────────────────────────────────────────────────────────────────
p_dx = sub.add_parser("dex", help="Cross-Chain DEX Price Scanner (Skill #3)")
p_dx.add_argument("--token", "-t", help="Token symbol (e.g. USDC, CAKE)")
p_dx.add_argument("--chains", help="Comma-separated chain IDs (e.g. 56,1,8453)")
p_dx.add_argument("--scan-alpha", action="store_true", help="Scan Binance Alpha token list")
p_dx.add_argument("--min-spread", type=float, default=0.5, help="Minimum spread %% (default: 0.5)")
_add_json(p_dx)
# ── yield ─────────────────────────────────────────────────────────────────
p_yd = sub.add_parser("yield", help="DeFi Yield Scanner (Skill #4)")
p_yd.add_argument("--token", "-t", help="Token symbol (e.g. USDC, ETH)")
p_yd.add_argument("--compare", help="Compare protocol across chains (e.g. aave-v3)")
p_yd.add_argument("--scan-stablecoins", action="store_true", help="Best rates for major stablecoins")
p_yd.add_argument("--single-only", action="store_true", help="Only single-asset pools")
p_yd.add_argument("--chains", help="Filter by chains (comma-separated, e.g. Ethereum,BSC)")
_add_json(p_yd)
# ── wallet ────────────────────────────────────────────────────────────────
p_wl = sub.add_parser("wallet", help="Wallet PnL Analyzer (Skill #5)")
p_wl.add_argument("--address", "-a", required=True, help="Wallet address")
_add_chain(p_wl, required=False, default=None)
p_wl.add_argument("--all-chains", action="store_true", help="Scan all supported chains")
p_wl.add_argument("--token", "-t", help="Token symbol for PnL calculation")
p_wl.add_argument("--cost", type=float, help="Your average buy price for --token")
_add_json(p_wl)
# ── pipeline ──────────────────────────────────────────────────────────────
p_pl = sub.add_parser("pipeline", help="Full workflow: smart money → safety → dex → yield")
_add_chain(p_pl)
p_pl.add_argument("--token", "-t", help="Start from a specific token (skip discovery)")
p_pl.add_argument("--top", type=int, default=5, help="Show top N results (default: 5)")
_add_json(p_pl)
# ─────────────────────────────────────────────────────────────────────────
args = parser.parse_args()
if not args.command:
parser.print_help()
sys.exit(0)
# Resolve chain ID for all commands that have --chain
if hasattr(args, "chain") and args.chain is not None:
resolved = resolve_chain_id(args.chain)
if resolved is None:
print(f"Error: Unknown chain '{args.chain}'. Use: bsc, eth, base, arb, polygon (or chain ID)")
sys.exit(1)
args.chain = resolved
# Dispatch
if args.command == "smart-money":
from skills.smart_money import run
run(args)
elif args.command == "safety":
from skills.token_safety import run
run(args)
elif args.command == "dex":
from skills.dex_scanner import run
run(args)
elif args.command == "yield":
from skills.yield_scanner import run
run(args)
elif args.command == "wallet":
from skills.wallet_pnl import run
run(args)
elif args.command == "pipeline":
from pipeline.workflow import run
run(args)
if __name__ == "__main__":
main()