|
@@ -12,9 +12,8 @@ class Config:
|
|
|
"""Configuration class for the Hyperliquid trading bot."""
|
|
|
|
|
|
# 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_PRIVATE_KEY: Optional[str] = os.getenv('HYPERLIQUID_PRIVATE_KEY') # Wallet address
|
|
|
+ HYPERLIQUID_SECRET_KEY: Optional[str] = os.getenv('HYPERLIQUID_SECRET_KEY') # API generator key
|
|
|
HYPERLIQUID_TESTNET: bool = os.getenv('HYPERLIQUID_TESTNET', 'true').lower() == 'true'
|
|
|
|
|
|
# Trading Bot Configuration
|
|
@@ -48,11 +47,15 @@ class Config:
|
|
|
|
|
|
# Validate Hyperliquid settings
|
|
|
if not cls.HYPERLIQUID_PRIVATE_KEY:
|
|
|
- logger.error("❌ HYPERLIQUID_PRIVATE_KEY is required")
|
|
|
+ logger.error("❌ HYPERLIQUID_PRIVATE_KEY (wallet address) is required")
|
|
|
+ is_valid = False
|
|
|
+
|
|
|
+ if not cls.HYPERLIQUID_SECRET_KEY:
|
|
|
+ logger.error("❌ HYPERLIQUID_SECRET_KEY (API generator key) is required")
|
|
|
is_valid = False
|
|
|
|
|
|
# Validate wallet address or private key format
|
|
|
- if not cls.HYPERLIQUID_WALLET_ADDRESS and cls.HYPERLIQUID_PRIVATE_KEY:
|
|
|
+ if not cls.HYPERLIQUID_PRIVATE_KEY and cls.HYPERLIQUID_SECRET_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")
|
|
@@ -105,23 +108,14 @@ class Config:
|
|
|
}
|
|
|
|
|
|
# Add authentication if available
|
|
|
- # 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
|
|
|
-
|
|
|
+ # Hyperliquid CCXT implementation expects:
|
|
|
+ # - apiKey: API generator key (SECRET_KEY)
|
|
|
+ # - secret: wallet address (PRIVATE_KEY)
|
|
|
if cls.HYPERLIQUID_SECRET_KEY:
|
|
|
- config['secret'] = cls.HYPERLIQUID_SECRET_KEY
|
|
|
+ config['apiKey'] = cls.HYPERLIQUID_SECRET_KEY # API generator key
|
|
|
+
|
|
|
+ if cls.HYPERLIQUID_PRIVATE_KEY:
|
|
|
+ config['secret'] = cls.HYPERLIQUID_PRIVATE_KEY # Wallet address
|
|
|
|
|
|
return config
|
|
|
|
|
@@ -131,7 +125,6 @@ class Config:
|
|
|
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}")
|