- Make app/domains/auth/ and app/core/redis.py mypy-clean under strict. - Add mypy-gate.ini and Makefile mypy-gate target; promote typecheck-gate in CI. - Consolidate domains into app/domains/: bulletin, admin, intelligence, markets. - Extract referral domain incl. DeFi partner DEX ref links; keep Telegram bot wired. - Move app/mcp/ package and app/api/v1/mcp/router into app/domains/mcp/. - Archive dead app/mcp_router.py.
362 lines
15 KiB
Python
362 lines
15 KiB
Python
"""x402 tool manager - loads and exposes tool bundles across free/trial/premium tiers."""
|
|
|
|
import logging
|
|
from dataclasses import dataclass
|
|
|
|
from .x402_bundles import X402Bundle
|
|
|
|
logger = logging.getLogger("x402_tool_manager")
|
|
|
|
|
|
@dataclass
|
|
class X402ToolManager:
|
|
"""Manages all x402 tool bundles including free/trial/premium."""
|
|
|
|
def __init__(self):
|
|
self._bundles = self._load_all_bundles()
|
|
self._index = {b.bundle_id: b for b in self._bundles}
|
|
self._index.update({b.name.lower(): b for b in self._bundles})
|
|
logger.info("X402ToolManager initialized with %d bundles", len(self._bundles))
|
|
|
|
def _load_all_bundles(self) -> list[X402Bundle]:
|
|
"""Load complete catalog: free, trial, standard, premium."""
|
|
|
|
return [
|
|
# ========== FREE TIER ==========
|
|
X402Bundle(
|
|
bundle_id="free-health",
|
|
name="Free Health Check",
|
|
description="Free system health and status endpoints",
|
|
category="free",
|
|
endpoints=[
|
|
{"method": "GET", "path": "/health", "description": "System health"},
|
|
{"method": "GET", "path": "/status", "description": "System status"},
|
|
{"method": "GET", "path": "/version", "description": "API version"},
|
|
],
|
|
price_usd=0.0,
|
|
tier="free",
|
|
is_premium=False,
|
|
requires_payment=False,
|
|
),
|
|
X402Bundle(
|
|
bundle_id="free-discovery",
|
|
name="Free Tool Discovery",
|
|
description="Discover all available tools without payment",
|
|
category="free",
|
|
endpoints=[
|
|
{"method": "GET", "path": "/.well-known/x402", "description": "x402 discovery"},
|
|
{"method": "GET", "path": "/v1/bundles", "description": "List all bundles"},
|
|
{"method": "GET", "path": "/v1/bundles/{id}", "description": "Bundle details"},
|
|
],
|
|
price_usd=0.0,
|
|
tier="free",
|
|
is_premium=False,
|
|
requires_payment=False,
|
|
),
|
|
# ========== TRIAL TIER ==========
|
|
X402Bundle(
|
|
bundle_id="trial-security",
|
|
name="Trial Security Suite",
|
|
description="7-day trial of premium security tools",
|
|
category="trial",
|
|
endpoints=[
|
|
{"method": "POST", "path": "/scan/contract", "description": "Smart contract scan"},
|
|
{"method": "POST", "path": "/scan/token", "description": "Token risk scan"},
|
|
{"method": "POST", "path": "/scan/wallet", "description": "Wallet risk scan"},
|
|
],
|
|
price_usd=0.0,
|
|
tier="trial",
|
|
is_premium=False,
|
|
requires_payment=False,
|
|
),
|
|
X402Bundle(
|
|
bundle_id="trial-intelligence",
|
|
name="Trial Intelligence Suite",
|
|
description="7-day trial of market intelligence tools",
|
|
category="trial",
|
|
endpoints=[
|
|
{"method": "GET", "path": "/market/pulse", "description": "Token pulse"},
|
|
{"method": "GET", "path": "/market/trends", "description": "Market trends"},
|
|
{"method": "GET", "path": "/market/whales", "description": "Whale tracking"},
|
|
],
|
|
price_usd=0.0,
|
|
tier="trial",
|
|
is_premium=False,
|
|
requires_payment=False,
|
|
),
|
|
# ========== STANDARD TIER ==========
|
|
X402Bundle(
|
|
bundle_id="token-pulse",
|
|
name="Token Pulse",
|
|
description="Real-time market momentum, volume, whale alerts",
|
|
category="market",
|
|
endpoints=[
|
|
{"method": "GET", "path": "/tokens", "description": "Token listings"},
|
|
{"method": "GET", "path": "/tokens/{address}", "description": "Token details"},
|
|
{
|
|
"method": "GET",
|
|
"path": "/lp/{address}",
|
|
"description": "Liquidity pool analysis",
|
|
},
|
|
],
|
|
price_usd=0.01,
|
|
tier="standard",
|
|
),
|
|
X402Bundle(
|
|
bundle_id="url-scam-detector",
|
|
name="URL Scam Detector",
|
|
description="Detect phishing sites, fake docs, malicious redirects",
|
|
category="security",
|
|
endpoints=[
|
|
{"method": "POST", "path": "/scan/url", "description": "URL scan"},
|
|
{"method": "POST", "path": "/scan/domain", "description": "Domain analysis"},
|
|
],
|
|
price_usd=0.01,
|
|
tier="standard",
|
|
),
|
|
X402Bundle(
|
|
bundle_id="wallet-profiler",
|
|
name="Wallet Profiler",
|
|
description="Full wallet analysis with persona detection",
|
|
category="wallet",
|
|
endpoints=[
|
|
{"method": "POST", "path": "/wallet/profile", "description": "Profile wallet"},
|
|
{
|
|
"method": "POST",
|
|
"path": "/wallet/history",
|
|
"description": "Transaction history",
|
|
},
|
|
],
|
|
price_usd=0.05,
|
|
tier="standard",
|
|
),
|
|
X402Bundle(
|
|
bundle_id="social-sentiment",
|
|
name="Social Sentiment",
|
|
description="Cross-platform sentiment analysis",
|
|
category="market",
|
|
endpoints=[
|
|
{
|
|
"method": "POST",
|
|
"path": "/sentiment/analyze",
|
|
"description": "Analyze sentiment",
|
|
},
|
|
{
|
|
"method": "GET",
|
|
"path": "/sentiment/trends",
|
|
"description": "Trending topics",
|
|
},
|
|
],
|
|
price_usd=0.03,
|
|
tier="standard",
|
|
),
|
|
# ========== PREMIUM TIER ==========
|
|
X402Bundle(
|
|
bundle_id="suspicious-transfers",
|
|
name="Suspicious Transfers Scanner",
|
|
description="Cross-chain anomaly detection with RugMunch intelligence",
|
|
category="security",
|
|
endpoints=[
|
|
{"method": "POST", "path": "/scan/transfers", "description": "Scan transfers"},
|
|
{"method": "GET", "path": "/scan/results", "description": "Get results"},
|
|
{"method": "POST", "path": "/scan/anomaly", "description": "Anomaly detection"},
|
|
],
|
|
price_usd=0.15,
|
|
tier="premium",
|
|
is_premium=True,
|
|
),
|
|
X402Bundle(
|
|
bundle_id="wallet-labeler",
|
|
name="Wallet Labeler",
|
|
description="Behavioral reputation engine (Arkham+Nansen+Alchemy)",
|
|
category="security",
|
|
endpoints=[
|
|
{"method": "POST", "path": "/label/wallet", "description": "Label wallet"},
|
|
{"method": "GET", "path": "/label/history", "description": "Label history"},
|
|
{
|
|
"method": "POST",
|
|
"path": "/label/cluster",
|
|
"description": "Cluster detection",
|
|
},
|
|
],
|
|
price_usd=0.20,
|
|
tier="premium",
|
|
is_premium=True,
|
|
),
|
|
X402Bundle(
|
|
bundle_id="memory-bank",
|
|
name="Memory Bank",
|
|
description="Unified agent knowledge store with GCS export",
|
|
category="ai",
|
|
endpoints=[
|
|
{"method": "POST", "path": "/memory/store", "description": "Store knowledge"},
|
|
{"method": "GET", "path": "/memory/query", "description": "Query knowledge"},
|
|
{"method": "POST", "path": "/memory/export", "description": "Export to GCS"},
|
|
],
|
|
price_usd=0.12,
|
|
tier="premium",
|
|
is_premium=True,
|
|
),
|
|
X402Bundle(
|
|
bundle_id="deep-contract-audit",
|
|
name="Deep Contract Audit",
|
|
description="Smart contract audit, honeypot detection, hidden mint functions",
|
|
category="security",
|
|
endpoints=[
|
|
{
|
|
"method": "POST",
|
|
"path": "/audit/contract",
|
|
"description": "Full contract audit",
|
|
},
|
|
{"method": "POST", "path": "/audit/honeypot", "description": "Honeypot check"},
|
|
{
|
|
"method": "POST",
|
|
"path": "/audit/proxy",
|
|
"description": "Proxy pattern check",
|
|
},
|
|
],
|
|
price_usd=0.05,
|
|
tier="premium",
|
|
is_premium=True,
|
|
),
|
|
X402Bundle(
|
|
bundle_id="token-forensics",
|
|
name="Token Forensics",
|
|
description="Deep forensics from DexScreener, GeckoTerminal, CoinGecko",
|
|
category="forensics",
|
|
endpoints=[
|
|
{
|
|
"method": "POST",
|
|
"path": "/forensics/token",
|
|
"description": "Token forensics",
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/forensics/report",
|
|
"description": "Generate report",
|
|
},
|
|
],
|
|
price_usd=0.10,
|
|
tier="premium",
|
|
is_premium=True,
|
|
),
|
|
X402Bundle(
|
|
bundle_id="whale-decoder",
|
|
name="Whale Decoder",
|
|
description="Advanced whale wallet analysis across chains",
|
|
category="wallet",
|
|
endpoints=[
|
|
{
|
|
"method": "POST",
|
|
"path": "/whale/decode",
|
|
"description": "Decode whale strategy",
|
|
},
|
|
{"method": "GET", "path": "/whale/positions", "description": "Track positions"},
|
|
],
|
|
price_usd=0.15,
|
|
tier="premium",
|
|
is_premium=True,
|
|
),
|
|
X402Bundle(
|
|
bundle_id="darkroom-security",
|
|
name="Darkroom Security Suite",
|
|
description="Advanced security analysis, threat detection, forensics",
|
|
category="security",
|
|
endpoints=[
|
|
{"method": "POST", "path": "/security/scan", "description": "Security scan"},
|
|
{
|
|
"method": "POST",
|
|
"path": "/security/threats",
|
|
"description": "Threat database",
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/security/forensics",
|
|
"description": "Forensic analysis",
|
|
},
|
|
],
|
|
price_usd=0.20,
|
|
tier="premium",
|
|
is_premium=True,
|
|
),
|
|
X402Bundle(
|
|
bundle_id="solana-mcp",
|
|
name="Solana MCP Server",
|
|
description="Native Solana blockchain queries via MCP protocol",
|
|
category="mcp",
|
|
endpoints=[
|
|
{
|
|
"method": "POST",
|
|
"path": "/mcp/solana/balance",
|
|
"description": "Get SOL balance",
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/mcp/solana/transaction",
|
|
"description": "Get transaction",
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/mcp/solana/tokens",
|
|
"description": "Get token accounts",
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/mcp/solana/simulate",
|
|
"description": "Simulate transaction",
|
|
},
|
|
],
|
|
price_usd=0.08,
|
|
tier="premium",
|
|
is_premium=True,
|
|
),
|
|
X402Bundle(
|
|
bundle_id="ethereum-mcp",
|
|
name="Ethereum MCP Server",
|
|
description="Native Ethereum blockchain queries via MCP protocol",
|
|
category="mcp",
|
|
endpoints=[
|
|
{
|
|
"method": "POST",
|
|
"path": "/mcp/eth/balance",
|
|
"description": "Get ETH balance",
|
|
},
|
|
{
|
|
"method": "POST",
|
|
"path": "/mcp/eth/transaction",
|
|
"description": "Get transaction",
|
|
},
|
|
{"method": "POST", "path": "/mcp/eth/call", "description": "Call contract"},
|
|
{"method": "POST", "path": "/mcp/eth/logs", "description": "Get event logs"},
|
|
{"method": "POST", "path": "/mcp/eth/ens", "description": "Resolve ENS"},
|
|
],
|
|
price_usd=0.08,
|
|
tier="premium",
|
|
is_premium=True,
|
|
),
|
|
]
|
|
|
|
def list_bundles(self, tier: str | None = None) -> list[X402Bundle]:
|
|
"""List all or filtered bundles."""
|
|
if tier:
|
|
return [b for b in self._bundles if b.tier == tier]
|
|
return self._bundles
|
|
|
|
def get_bundle(self, identifier: str) -> X402Bundle | None:
|
|
return self._index.get(identifier.lower())
|
|
|
|
@property
|
|
def free_bundles(self) -> list[X402Bundle]:
|
|
return [b for b in self._bundles if b.tier == "free"]
|
|
|
|
@property
|
|
def trial_bundles(self) -> list[X402Bundle]:
|
|
return [b for b in self._bundles if b.tier == "trial"]
|
|
|
|
@property
|
|
def premium_bundles(self) -> list[X402Bundle]:
|
|
return [b for b in self._bundles if b.is_premium]
|
|
|
|
@property
|
|
def total_endpoints(self) -> int:
|
|
return sum(len(b.endpoints) for b in self._bundles)
|