|
@@ -14,6 +14,7 @@ class Config:
|
|
|
# Hyperliquid API Configuration
|
|
|
HYPERLIQUID_PRIVATE_KEY: Optional[str] = os.getenv('HYPERLIQUID_PRIVATE_KEY')
|
|
|
HYPERLIQUID_SECRET_KEY: Optional[str] = os.getenv('HYPERLIQUID_SECRET_KEY')
|
|
|
+ HYPERLIQUID_WALLET_ADDRESS: Optional[str] = os.getenv('HYPERLIQUID_WALLET_ADDRESS')
|
|
|
HYPERLIQUID_TESTNET: bool = os.getenv('HYPERLIQUID_TESTNET', 'true').lower() == 'true'
|
|
|
|
|
|
# Trading Bot Configuration
|
|
@@ -50,6 +51,14 @@ class Config:
|
|
|
logger.error("❌ HYPERLIQUID_PRIVATE_KEY is required")
|
|
|
is_valid = False
|
|
|
|
|
|
+ # Validate wallet address or private key format
|
|
|
+ if not cls.HYPERLIQUID_WALLET_ADDRESS and cls.HYPERLIQUID_PRIVATE_KEY:
|
|
|
+ # Check if private key looks like an address
|
|
|
+ if not cls.HYPERLIQUID_PRIVATE_KEY.startswith('0x') and len(cls.HYPERLIQUID_PRIVATE_KEY) < 40:
|
|
|
+ logger.warning("⚠️ HYPERLIQUID_WALLET_ADDRESS not set - will attempt to use private key as address")
|
|
|
+ elif len(cls.HYPERLIQUID_PRIVATE_KEY) < 64:
|
|
|
+ logger.warning("⚠️ HYPERLIQUID_WALLET_ADDRESS not set and private key appears short - consider setting explicit wallet address")
|
|
|
+
|
|
|
# Validate Telegram settings (if enabled)
|
|
|
if cls.TELEGRAM_ENABLED:
|
|
|
if not cls.TELEGRAM_BOT_TOKEN:
|
|
@@ -96,11 +105,21 @@ class Config:
|
|
|
}
|
|
|
|
|
|
# Add authentication if available
|
|
|
- # Hyperliquid CCXT implementation expects 'privateKey' credential
|
|
|
+ # Hyperliquid CCXT implementation expects 'privateKey' and 'walletAddress' credentials
|
|
|
if cls.HYPERLIQUID_PRIVATE_KEY:
|
|
|
config['privateKey'] = cls.HYPERLIQUID_PRIVATE_KEY
|
|
|
config['apiKey'] = cls.HYPERLIQUID_PRIVATE_KEY # Keep for backward compatibility
|
|
|
|
|
|
+ if cls.HYPERLIQUID_WALLET_ADDRESS:
|
|
|
+ config['walletAddress'] = cls.HYPERLIQUID_WALLET_ADDRESS
|
|
|
+ elif cls.HYPERLIQUID_PRIVATE_KEY:
|
|
|
+ # If no explicit wallet address, try to use the private key as address
|
|
|
+ # (This might work if the private key is actually the wallet address)
|
|
|
+ wallet_addr = cls.HYPERLIQUID_PRIVATE_KEY
|
|
|
+ if not wallet_addr.startswith('0x'):
|
|
|
+ wallet_addr = f"0x{wallet_addr}"
|
|
|
+ config['walletAddress'] = wallet_addr
|
|
|
+
|
|
|
if cls.HYPERLIQUID_SECRET_KEY:
|
|
|
config['secret'] = cls.HYPERLIQUID_SECRET_KEY
|
|
|
|
|
@@ -109,14 +128,22 @@ class Config:
|
|
|
@classmethod
|
|
|
def print_config(cls):
|
|
|
"""Print current configuration (hiding sensitive data)."""
|
|
|
- print("🔧 Current Configuration:")
|
|
|
- print(f" HYPERLIQUID_TESTNET: {cls.HYPERLIQUID_TESTNET}")
|
|
|
- print(f" DEFAULT_TRADING_TOKEN: {cls.DEFAULT_TRADING_TOKEN}")
|
|
|
- print(f" RISK_MANAGEMENT_ENABLED: {cls.RISK_MANAGEMENT_ENABLED}")
|
|
|
- print(f" STOP_LOSS_PERCENTAGE: {cls.STOP_LOSS_PERCENTAGE}%")
|
|
|
- print(f" TELEGRAM_ENABLED: {cls.TELEGRAM_ENABLED}")
|
|
|
- print(f" LOG_LEVEL: {cls.LOG_LEVEL}")
|
|
|
- print(f" PRIVATE_KEY: {'✅ Set' if cls.HYPERLIQUID_PRIVATE_KEY else '❌ Not Set'}")
|
|
|
- print(f" SECRET_KEY: {'✅ Set' if cls.HYPERLIQUID_SECRET_KEY else '❌ Not Set'}")
|
|
|
- print(f" TELEGRAM_BOT_TOKEN: {'✅ Set' if cls.TELEGRAM_BOT_TOKEN else '❌ Not Set'}")
|
|
|
- print(f" TELEGRAM_CHAT_ID: {'✅ Set' if cls.TELEGRAM_CHAT_ID else '❌ Not Set'}")
|
|
|
+ logger.info("🔧 Configuration:")
|
|
|
+ logger.info(f" 📡 Hyperliquid Testnet: {cls.HYPERLIQUID_TESTNET}")
|
|
|
+ logger.info(f" 🔑 Private Key: {'✅ Set' if cls.HYPERLIQUID_PRIVATE_KEY else '❌ Missing'}")
|
|
|
+ logger.info(f" 🏠 Wallet Address: {'✅ Set' if cls.HYPERLIQUID_WALLET_ADDRESS else '⚠️ Will derive from private key'}")
|
|
|
+ logger.info(f" 🔐 Secret Key: {'✅ Set' if cls.HYPERLIQUID_SECRET_KEY else '⚠️ Missing (may be optional)'}")
|
|
|
+ logger.info(f" 📱 Telegram: {'✅ Enabled' if cls.TELEGRAM_ENABLED else '❌ Disabled'}")
|
|
|
+ logger.info(f" 🔍 Log Level: {cls.LOG_LEVEL}")
|
|
|
+ logger.info(f" 💾 Log to File: {cls.LOG_TO_FILE}")
|
|
|
+ logger.info(f" ⏱️ Heartbeat: {cls.BOT_HEARTBEAT_SECONDS}s")
|
|
|
+ logger.info(f" 💰 DEFAULT_TRADING_TOKEN: {cls.DEFAULT_TRADING_TOKEN}")
|
|
|
+ logger.info(f" 🧮 RISK_MANAGEMENT_ENABLED: {cls.RISK_MANAGEMENT_ENABLED}")
|
|
|
+ logger.info(f" 🔄 STOP_LOSS_PERCENTAGE: {cls.STOP_LOSS_PERCENTAGE}%")
|
|
|
+ logger.info(f" 🤖 TELEGRAM_BOT_TOKEN: {'✅ Set' if cls.TELEGRAM_BOT_TOKEN else '❌ Not Set'}")
|
|
|
+ logger.info(f" 💬 TELEGRAM_CHAT_ID: {'✅ Set' if cls.TELEGRAM_CHAT_ID else '❌ Not Set'}")
|
|
|
+ logger.info(f" 🔍 LOG_FILE_PATH: {cls.LOG_FILE_PATH}")
|
|
|
+ logger.info(f" 🔄 LOG_MAX_SIZE_MB: {cls.LOG_MAX_SIZE_MB} MB")
|
|
|
+ logger.info(f" 🔄 LOG_BACKUP_COUNT: {cls.LOG_BACKUP_COUNT}")
|
|
|
+ logger.info(f" 🔄 LOG_ROTATION_TYPE: {cls.LOG_ROTATION_TYPE}")
|
|
|
+ logger.info(f" 🔄 LOG_ROTATION_INTERVAL: {cls.LOG_ROTATION_INTERVAL}")
|