#!/usr/bin/env python3 """ Debug MEXC Signature Generation Tests signature generation against known working examples """ import os import sys import time import hmac import hashlib import logging from pathlib import Path # Add project root to path project_root = Path(__file__).parent sys.path.insert(0, str(project_root)) # Enable debug logging logging.basicConfig(level=logging.DEBUG) def test_signature_generation(): """Test signature generation with known parameters""" print("MEXC Signature Generation Debug") print("=" * 50) # Get API credentials api_key = os.getenv('MEXC_API_KEY', '') api_secret = os.getenv('MEXC_SECRET_KEY', '') if not api_key or not api_secret: print("❌ No MEXC API credentials found") return False # Import the interface from NN.exchanges.mexc_interface import MEXCInterface mexc = MEXCInterface(api_key=api_key, api_secret=api_secret, test_mode=False) # Test 1: Manual signature generation (working method from examples) print("\n1. Manual signature generation (working method):") timestamp = str(int(time.time() * 1000)) # Parameters in exact order from working example params_string = f"timestamp={timestamp}&recvWindow=5000" print(f"Params string: {params_string}") signature_manual = hmac.new( api_secret.encode('utf-8'), params_string.encode('utf-8'), hashlib.sha256 ).hexdigest() print(f"Manual signature: {signature_manual}") # Test 2: Interface signature generation print("\n2. Interface signature generation:") params_dict = { 'timestamp': timestamp, 'recvWindow': '5000' } signature_interface = mexc._generate_signature(params_dict) print(f"Interface signature: {signature_interface}") # Compare if signature_manual == signature_interface: print("✅ Signatures match!") else: print("❌ Signatures don't match") print("This indicates a problem with the signature generation method") # Test 3: Try account request with manual signature print("\n3. Testing account request with manual method:") import requests url = f"https://api.mexc.com/api/v3/account" headers = { 'X-MEXC-APIKEY': api_key } params = { 'timestamp': timestamp, 'recvWindow': '5000', 'signature': signature_manual } print(f"Making request to: {url}") print(f"Headers: {headers}") print(f"Params: {params}") try: response = requests.get(url, headers=headers, params=params, timeout=10) print(f"Response status: {response.status_code}") print(f"Response: {response.text}") if response.status_code == 200: print("✅ Manual method works!") return True else: print("❌ Manual method failed") # Test 4: Try different parameter ordering print("\n4. Testing different parameter orderings:") # Try alphabetical ordering (current implementation) params_alpha = sorted(params_dict.items()) params_alpha_string = '&'.join([f"{k}={v}" for k, v in params_alpha]) print(f"Alphabetical: {params_alpha_string}") # Try the exact order from Postman collection params_postman_string = f"recvWindow=5000×tamp={timestamp}" print(f"Postman order: {params_postman_string}") sig_alpha = hmac.new(api_secret.encode('utf-8'), params_alpha_string.encode('utf-8'), hashlib.sha256).hexdigest() sig_postman = hmac.new(api_secret.encode('utf-8'), params_postman_string.encode('utf-8'), hashlib.sha256).hexdigest() print(f"Alpha signature: {sig_alpha}") print(f"Postman signature: {sig_postman}") # Test with postman order params_test = { 'timestamp': timestamp, 'recvWindow': '5000', 'signature': sig_postman } response2 = requests.get(url, headers=headers, params=params_test, timeout=10) print(f"Postman order response: {response2.status_code} - {response2.text}") except Exception as e: print(f"Request failed: {e}") return False return False if __name__ == "__main__": test_signature_generation()