import requests import json import time import logging from config import wallet from decimal import Decimal # 使用 Decimal 来表示精确的金额和价差 from checker.config import arb logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') # --- 配置 arb_executor.py 的 HTTP 地址和端口 --- ARB_EXECUTOR_URL = arb["ARB_EXECUTOR_URL"] # --- 模拟的套利机会数据 --- # 这是一个示例,实际数据应来自你的 price_checker 逻辑 def create_mock_arbitrage_data(): from checker import ok_chain_client CHAIN_ID = 1 IN_TOKEN_ADDRESS = '0xdAC17F958D2ee523a2206206994597C13D831ec7' # USDT on Ethereum IN_TOKEN_DECIMALS = 6 EXCHANGE_OUT_AMOUNT = Decimal(2500) IN_AMOUNT_TO_QUERY = Decimal(25) OUT_TOKEN_ADDRESS = '0x9eAeBd7E73D97E78c77fAB743e6FFA1b550e224c' # RXS on Ethereum USER_WALLET = wallet["user_wallet"] USER_EXCHANGE_WALLET = wallet["user_exchange_wallet"] SLIPPAGE = 1 MEXC_TARGET_PAIR_USDT = 'RXS_USDT' # MEXC 现货交易对 # 询价,注意!!!这里直接把交易所地址当收款方,省去transfer的流程 data = ok_chain_client.swap(CHAIN_ID, IN_AMOUNT_TO_QUERY * (10 ** IN_TOKEN_DECIMALS), IN_TOKEN_ADDRESS, OUT_TOKEN_ADDRESS, SLIPPAGE, USER_WALLET, USER_EXCHANGE_WALLET, # 这里直接把交易所地址当收款方,省去transfer的流程!!! ) print(data) d = data['data'][0] tx = d['tx'] router_result = d['routerResult'] in_dec, out_dec = int(router_result['fromToken']['decimal']), int(router_result['toToken']['decimal']) atomic_in_base, atomic_out_target = Decimal(router_result['fromTokenAmount']), Decimal(router_result['toTokenAmount']) human_in_base = atomic_in_base / (10 ** in_dec) human_out_target = atomic_out_target / (10 ** out_dec) # 构造提交给 arb_executor 的数据体 data = { "tx": tx, "profit": str(5), "profitLimit": str(0), "symbol": MEXC_TARGET_PAIR_USDT, "fromToken": IN_TOKEN_ADDRESS, "fromTokenAmountHuman": str(human_in_base), "fromTokenDecimal": str(in_dec), "toToken": OUT_TOKEN_ADDRESS, "toTokenAmountHuman": str(human_out_target), "toTokenDecimal": str(out_dec), "exchangeOutAmount": str(EXCHANGE_OUT_AMOUNT), "strategy": "erc20_to_mexc", } return data # --- 发送请求函数 --- def submit_arbitrage_process(arbitrage_data): """ 向 arb_executor 服务提交套利处理请求。 """ print(f"正在提交套利数据到 {ARB_EXECUTOR_URL}") try: # 发送 POST 请求 response = requests.post(ARB_EXECUTOR_URL, json=arbitrage_data) # 检查响应状态码 if response.status_code == 201: print("\n请求成功! 套利流程已启动。") elif response.status_code == 200: print("\n请求接收成功,但未达到利润阈值,未启动套利流程。") elif response.status_code == 400: print("\n请求失败! 无效的请求数据。") else: print(f"\n请求失败! 状态码: {response.status_code}") # 使用 response.json() 解析响应体 try: response_data = response.json() logging.info(f"\n响应数据: {response_data}") except requests.exceptions.JSONDecodeError: logging.error("无法解析响应体为 JSON。") logging.info(f"原始响应文本: {response.text}") except requests.exceptions.ConnectionError as e: print(f"\n连接错误: 无法连接到 {ARB_EXECUTOR_URL}。请确保 arb_executor.py 正在运行。") print(f"错误详情: {e}") except Exception as e: print(f"\n发送请求时发生未知错误: {e}") # --- 主执行逻辑 --- if __name__ == "__main__": print("--- 模拟 Price Checker 发现套利机会 ---") # 模拟一个达到利润阈值的套利机会 arb_opportunity_met = create_mock_arbitrage_data() submit_arbitrage_process(arb_opportunity_met) print("\n模拟完成。请检查 arb_executor.py 的控制台输出和 /processing, /history 端点查看结果。")