submit_process_demo.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import requests
  2. import json
  3. import time
  4. import logging
  5. from decimal import Decimal # 使用 Decimal 来表示精确的金额和价差
  6. from checker.config import arb
  7. logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
  8. # --- 配置 arb_executor.py 的 HTTP 地址和端口 ---
  9. ARB_EXECUTOR_URL = arb["ARB_EXECUTOR_URL"]
  10. # --- 模拟的套利机会数据 ---
  11. # 这是一个示例,实际数据应来自你的 price_checker 逻辑
  12. def create_mock_arbitrage_data():
  13. from checker import ok_chain_client
  14. CHAIN_ID = 1
  15. IN_TOKEN_ADDRESS = '0xdAC17F958D2ee523a2206206994597C13D831ec7' # USDT on Ethereum
  16. IN_TOKEN_DECIMALS = 6
  17. EXCHANGE_OUT_AMOUNT = Decimal(2200000)
  18. IN_AMOUNT_TO_QUERY = Decimal(12)
  19. OUT_TOKEN_ADDRESS = '0xf816507E690f5Aa4E29d164885EB5fa7a5627860' # RATO on Ethereum
  20. USER_WALLET = '0xb1f33026Db86a86372493a3B124d7123e9045Bb4'
  21. USER_EXCHANGE_WALLET = '0xc71835a042F4d870B0F4296cc89cAeb921a9f3DA'
  22. SLIPPAGE = 1
  23. MEXC_TARGET_PAIR_USDT = 'RATO_USDT' # MEXC 现货交易对
  24. # 询价,注意!!!这里直接把交易所地址当收款方,省去transfer的流程
  25. data = ok_chain_client.swap(CHAIN_ID,
  26. IN_AMOUNT_TO_QUERY * (10 ** IN_TOKEN_DECIMALS),
  27. IN_TOKEN_ADDRESS,
  28. OUT_TOKEN_ADDRESS,
  29. SLIPPAGE,
  30. USER_WALLET,
  31. USER_EXCHANGE_WALLET, # 这里直接把交易所地址当收款方,省去transfer的流程!!!
  32. )
  33. print(data)
  34. d = data['data'][0]
  35. tx = d['tx']
  36. router_result = d['routerResult']
  37. in_dec, out_dec = int(router_result['fromToken']['decimal']), int(router_result['toToken']['decimal'])
  38. atomic_in_base, atomic_out_target = Decimal(router_result['fromTokenAmount']), Decimal(router_result['toTokenAmount'])
  39. human_in_base = atomic_in_base / (10 ** in_dec)
  40. human_out_target = atomic_out_target / (10 ** out_dec)
  41. # 构造提交给 arb_executor 的数据体
  42. data = {
  43. "tx": tx,
  44. "profit": str(5),
  45. "profitLimit": str(0),
  46. "symbol": MEXC_TARGET_PAIR_USDT,
  47. "fromToken": IN_TOKEN_ADDRESS,
  48. "fromTokenAmountHuman": str(human_in_base),
  49. "fromTokenDecimal": str(in_dec),
  50. "toToken": OUT_TOKEN_ADDRESS,
  51. "toTokenAmountHuman": str(human_out_target),
  52. "toTokenDecimal": str(out_dec),
  53. "exchangeOutAmount": str(EXCHANGE_OUT_AMOUNT)
  54. }
  55. return data
  56. # --- 发送请求函数 ---
  57. def submit_arbitrage_process(arbitrage_data):
  58. """
  59. 向 arb_executor 服务提交套利处理请求。
  60. """
  61. print(f"正在提交套利数据到 {ARB_EXECUTOR_URL}")
  62. try:
  63. # 发送 POST 请求
  64. response = requests.post(ARB_EXECUTOR_URL, json=arbitrage_data)
  65. # 检查响应状态码
  66. if response.status_code == 201:
  67. print("\n请求成功! 套利流程已启动。")
  68. elif response.status_code == 200:
  69. print("\n请求接收成功,但未达到利润阈值,未启动套利流程。")
  70. elif response.status_code == 400:
  71. print("\n请求失败! 无效的请求数据。")
  72. else:
  73. print(f"\n请求失败! 状态码: {response.status_code}")
  74. # 使用 response.json() 解析响应体
  75. try:
  76. response_data = response.json()
  77. logging.info(f"\n响应数据: {response_data}")
  78. except requests.exceptions.JSONDecodeError:
  79. logging.error("无法解析响应体为 JSON。")
  80. logging.info(f"原始响应文本: {response.text}")
  81. except requests.exceptions.ConnectionError as e:
  82. print(f"\n连接错误: 无法连接到 {ARB_EXECUTOR_URL}。请确保 arb_executor.py 正在运行。")
  83. print(f"错误详情: {e}")
  84. except Exception as e:
  85. print(f"\n发送请求时发生未知错误: {e}")
  86. # --- 主执行逻辑 ---
  87. if __name__ == "__main__":
  88. print("--- 模拟 Price Checker 发现套利机会 ---")
  89. # 模拟一个达到利润阈值的套利机会
  90. arb_opportunity_met = create_mock_arbitrage_data()
  91. submit_arbitrage_process(arb_opportunity_met)
  92. print("\n模拟完成。请检查 arb_executor.py 的控制台输出和 /processing, /history 端点查看结果。")