Browse Source

容錯機制

skyfffire 5 months ago
parent
commit
abab8a17c3
4 changed files with 40 additions and 32 deletions
  1. 9 2
      arbitrage_process.py
  2. 2 2
      mexc_client.py
  3. 4 4
      price_checker_ok.py
  4. 25 24
      web3_py_client.py

+ 9 - 2
arbitrage_process.py

@@ -406,8 +406,15 @@ class ArbitrageProcess:
             if receipt.status == 1:
                 # 在这里根据实际链上交易结果更新实际买入数量,用于后续流程
                 # 这里要用确认后数量减去确认前数量,才知道具体买入了多少
-                self.arbitrage_details["chain_amount_after_trade"] = web3.get_erc20_balance(self.to_token_addr, self.user_exchange_wallet)
-                actual_buy_amount = self.arbitrage_details["chain_amount_after_trade"] - self.arbitrage_details["chain_amount_before_trade"]
+                actual_buy_amount = Decimal(0)
+                while True:
+                    self.arbitrage_details["chain_amount_after_trade"] = web3.get_erc20_balance(self.to_token_addr, self.user_exchange_wallet)
+                    
+                    actual_buy_amount = self.arbitrage_details["chain_amount_after_trade"] - self.arbitrage_details["chain_amount_before_trade"]
+                    if actual_buy_amount > Decimal(0):
+                        break
+                    
+                    time.sleep(1)
 
                 buy_amount_human = actual_buy_amount.quantize(Decimal('1e-2'), rounding=ROUND_DOWN)
                 sell_amount_human = self.arbitrage_details["chain_usdt_use"]

+ 2 - 2
mexc_client.py

@@ -549,7 +549,7 @@ if __name__ == '__main__':
             #     "symbol": "RATOUSDT",  # 使用常见的交易对,如 MXUSDT 或 BTCUSDT
             #     "side": "SELL",
             #     "type": "MARKET",
-            #     "quantity": "2300000",   # 根据交易对的最小名义价值/数量调整数量
+            #     "quantity": "30000000",   # 根据交易对的最小名义价值/数量调整数量
             #     # "price": "0.0000290"     # 调整价格以便于测试
             # }
             # print(f"  测试订单参数: {test_order_params}")
@@ -561,7 +561,7 @@ if __name__ == '__main__':
             #     'coin': 'USDT',
             #     'netWork': 'ETH',
             #     'address': '0xb1f33026db86a86372493a3b124d7123e9045bb4',
-            #     'amount': 32
+            #     'amount': 378
             # }
             # withdraw_rst = client.wallet.post_withdraw(withdraw_params)
             # print(f"  提笔响应:{withdraw_rst}")

+ 4 - 4
price_checker_ok.py

@@ -26,14 +26,14 @@ ARB_EXECUTOR_URL = "http://localhost:5002/submit_process"
 
 # --- 配置部分 ---
 IN_AMOUNT_TO_QUERY = decimal.Decimal('350')
-EXCHANGE_OUT_AMOUNT = decimal.Decimal('30000000')
-PROFIT_LIMIT = 0.02                                                 # 触发交易的利润阈值
+EXCHANGE_OUT_AMOUNT = decimal.Decimal('20000000')
+PROFIT_LIMIT = 0.01                                                 # 触发交易的利润阈值
 IN_TOKEN_ADDRESS = '0xdAC17F958D2ee523a2206206994597C13D831ec7'     # USDT on Ethereum
 IN_TOKEN_DECIMALS = 6
 OUT_TOKEN_ADDRESS = '0xf816507E690f5Aa4E29d164885EB5fa7a5627860'    # RATO on Ethereum
 USER_WALLET = '0xb1f33026Db86a86372493a3B124d7123e9045Bb4'
 USER_EXCHANGE_WALLET = '0xc71835a042F4d870B0F4296cc89cAeb921a9f3DA'
-SLIPPAGE = 1
+SLIPPAGE = PROFIT_LIMIT
 MEXC_TARGET_PAIR_USDT = 'RATO_USDT'                                 # MEXC 现货交易对
 CHAIN_ID = 1
 
@@ -58,7 +58,7 @@ BASE_CURRENCY_SYMBOL = MEXC_TARGET_PAIR_USDT.split('_')[1] # e.g., USDT (assumed
 def get_chain_price_vs_target_currency(chain_id, in_token_addr, out_token_addr, amount, in_token_decimals, slippage, user_wallet_addr, user_exchange_wallet_addr):
     try:
         in_token_amount = amount * (10 ** in_token_decimals)
-        data = ok_chain_client.swap(chain_id, in_token_amount, in_token_addr, out_token_addr, slippage, user_wallet_addr, user_exchange_wallet_addr)
+        data = ok_chain_client.swap(chain_id, in_token_amount, in_token_addr, out_token_addr, slippage, user_wallet_addr, user_exchange_wallet_addr, 'fast')
 
         if data.get('code') == '0' and data.get('data'):
             d = data['data'][0]

+ 25 - 24
web3_py_client.py

@@ -357,43 +357,44 @@ if __name__ == "__main__":
 
     client = EthClient()
 
-    CHAIN_ID = 1
-    IN_AMOUNT_TO_QUERY = decimal.Decimal('1')
-    IN_TOKEN_ADDRESS = '0xdAC17F958D2ee523a2206206994597C13D831ec7'     # USDT on Ethereum
-    IN_TOKEN_DECIMALS = decimal.Decimal(6)
-    OUT_TOKEN_ADDRESS = '0xf816507E690f5Aa4E29d164885EB5fa7a5627860'    # RATO on Ethereum
+    # CHAIN_ID = 1
+    # IN_AMOUNT_TO_QUERY = decimal.Decimal('1')
+    # IN_TOKEN_ADDRESS = '0xdAC17F958D2ee523a2206206994597C13D831ec7'     # USDT on Ethereum
+    # IN_TOKEN_DECIMALS = decimal.Decimal(6)
+    # OUT_TOKEN_ADDRESS = '0xf816507E690f5Aa4E29d164885EB5fa7a5627860'    # RATO on Ethereum
     USER_WALLET = '0xb1f33026Db86a86372493a3B124d7123e9045Bb4'
-    SLIPPAGE = 1
-    USER_EXCHANGE_WALLET = '0xc71835a042F4d870B0F4296cc89cAeb921a9f3DA'
+    # SLIPPAGE = 1
+    # USER_EXCHANGE_WALLET = '0xc71835a042F4d870B0F4296cc89cAeb921a9f3DA'
 
-    rst = swap(CHAIN_ID, IN_AMOUNT_TO_QUERY * (10 ** IN_TOKEN_DECIMALS), IN_TOKEN_ADDRESS, OUT_TOKEN_ADDRESS, SLIPPAGE, USER_WALLET, USER_EXCHANGE_WALLET)
-    data = rst['data'][0]
-    tx = data['tx']
+    # rst = swap(CHAIN_ID, IN_AMOUNT_TO_QUERY * (10 ** IN_TOKEN_DECIMALS), IN_TOKEN_ADDRESS, OUT_TOKEN_ADDRESS, SLIPPAGE, USER_WALLET, USER_EXCHANGE_WALLET)
+    # data = rst['data'][0]
+    # tx = data['tx']
     try:
-        tx.pop('gasPrice', None)
-        tx.pop('value', None)
-        tx.pop('minReceiveAmount', None)
-        tx.pop('slippage', None)
-        tx.pop('maxSpendAmount', None)
-        tx.pop('signatureData', None)
+        # tx.pop('gasPrice', None)
+        # tx.pop('value', None)
+        # tx.pop('minReceiveAmount', None)
+        # tx.pop('slippage', None)
+        # tx.pop('maxSpendAmount', None)
+        # tx.pop('signatureData', None)
 
+        tx = {
+            'from': USER_WALLET, 
+            'to': USER_WALLET, 
+            'gas': '40000',
+            'value': 1,
+            'maxPriorityFeePerGas': '1800000000'
+        }
         latest_block = client.w3.eth.get_block('latest')
         tx['maxPriorityFeePerGas'] = int(tx['maxPriorityFeePerGas'])
         tx['maxFeePerGas'] = int(int(latest_block['baseFeePerGas']) * 2 + tx['maxPriorityFeePerGas'])
 
-        # tx = {
-        #     'from': '0xb1f33026Db86a86372493a3B124d7123e9045Bb4', 
-        #     'to': '0xb1f33026Db86a86372493a3B124d7123e9045Bb4', 
-        #     'gas': '423000',
-        #     'value': 12345
-        # }
         pprint.pprint(tx)
         estimated_gas = client.w3.eth.estimate_gas(tx)
         estimated_wei = estimated_gas * (tx['maxPriorityFeePerGas'] + tx['maxFeePerGas'])
         estimated_eth = estimated_wei / (10 ** 18)
-        print(f"估算的燃气量: {estimated_gas}, eth消耗: {estimated_eth}")
+        logging.info(f"估算的燃气量: {estimated_gas}, eth消耗: {estimated_eth}")
 
-        print(f"餘額:{client.w3.eth.get_balance(USER_WALLET)}")
+        logging.info(f"餘額:{client.w3.eth.get_balance(USER_WALLET)}")
 
         # tx_hash = client._sign_and_send_transaction(tx)
         # receipt = client.wait_for_transaction_receipt(tx_hash)