| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- 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 端点查看结果。")
|