retry on failed transactions with smaller ammount;
fix flask API
This commit is contained in:
parent
8033907431
commit
8a371e4c8c
@ -41,6 +41,8 @@ from typing import List, Dict, Any, Tuple
|
||||
import random
|
||||
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
load_dotenv()
|
||||
load_dotenv('.env.secret') # ToDo - make it work
|
||||
|
||||
@ -60,11 +62,6 @@ error_logger.setLevel(logging.ERROR)
|
||||
error_logger.addHandler(error_file_handler)
|
||||
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
ENV_FILE = '.env'
|
||||
|
||||
|
||||
# Function to find the latest log file
|
||||
def get_latest_log_file():
|
||||
log_dir = './logs'
|
||||
@ -73,7 +70,7 @@ def get_latest_log_file():
|
||||
# filter files mask log_20241005_004103_143116.json
|
||||
files = [f for f in os.listdir(log_dir) if os.path.isfile(os.path.join(log_dir, f)) and f.startswith('log_')]
|
||||
|
||||
latest_file = max(files, key=lambda x: os.path.getctime(os.path.join(log_dir, x)))
|
||||
latest_file = max(files, key=lambda x: os.path.getmtime(os.path.join(log_dir, x)))
|
||||
return os.path.join(log_dir, latest_file)
|
||||
except Exception as e:
|
||||
logging.error(f"Error fetching latest log file: {e}")
|
||||
@ -81,7 +78,7 @@ def get_latest_log_file():
|
||||
|
||||
# Flask route to retry processing the last log
|
||||
@app.route('/retry-last-log', methods=['GET'])
|
||||
def retry_last_log():
|
||||
async def retry_last_log():
|
||||
latest_log_file = get_latest_log_file()
|
||||
if not latest_log_file:
|
||||
return jsonify({"error": "No log files found"}), 404
|
||||
@ -91,10 +88,13 @@ def retry_last_log():
|
||||
with open(latest_log_file, 'r') as f:
|
||||
log = json.load(f)
|
||||
|
||||
# await process_log(log)
|
||||
# Run the asynchronous process_log function
|
||||
asyncio.run(process_log(log))
|
||||
return jsonify({"status": "Log dump processed successfully"}), 200
|
||||
result = await process_log(log)
|
||||
|
||||
return jsonify({
|
||||
"file": latest_log_file,
|
||||
"status": "Log dump processed successfully",
|
||||
"result": result
|
||||
}), 200
|
||||
|
||||
except Exception as e:
|
||||
logging.error(f"Error processing log dump: {e}")
|
||||
@ -469,7 +469,7 @@ async def get_wallet_balances(wallet_address, doGetTokenName=True):
|
||||
# sleep for 1 second to avoid rate limiting
|
||||
await asyncio.sleep(2)
|
||||
|
||||
TOKENS_INFO[mint]['holdedAmount'] = amount
|
||||
TOKENS_INFO[mint]['holdedAmount'] = round(amount,decimals)
|
||||
TOKENS_INFO[mint]['decimals'] = decimals
|
||||
balances[mint] = {
|
||||
'name': token_name or 'N/A',
|
||||
@ -477,8 +477,8 @@ async def get_wallet_balances(wallet_address, doGetTokenName=True):
|
||||
'amount': amount,
|
||||
'decimals': decimals
|
||||
}
|
||||
# sleep for 1 second to avoid rate limiting
|
||||
logging.debug(f"Balance for {token_name} ({mint}): {amount}")
|
||||
# sleep for 1 second to avoid rate limiting
|
||||
logging.debug(f"Account balance for {token_name} ({mint}): {amount}")
|
||||
else:
|
||||
logging.warning(f"Unexpected data format for account: {account}")
|
||||
except Exception as e:
|
||||
@ -943,13 +943,13 @@ async def process_log(log_result):
|
||||
except Exception as e:
|
||||
logging.error(f"Error aquiring log details and following: {e}")
|
||||
await send_telegram_message(f"Not followed! Error following move.")
|
||||
return
|
||||
|
||||
|
||||
except Exception as e:
|
||||
logging.error(f"Error processing log: {e}")
|
||||
|
||||
|
||||
|
||||
return tr_details
|
||||
# "Program log: Instruction: Swap2",
|
||||
# "Program log: order_id: 13985890735038016",
|
||||
# "Program log: AbrMJWfDVRZ2EWCQ1xSCpoVeVgZNpq1U2AoYG98oRXfn", source
|
||||
@ -995,7 +995,7 @@ async def follow_move(move):
|
||||
your_balance_info = next((balance for balance in your_balances.values() if balance['address'] == move['token_in']), None)
|
||||
if your_balance_info is not None:
|
||||
# Use the balance
|
||||
print(f"Your balance: {your_balance_info['amount']}")
|
||||
print(f"Your balance: {your_balance_info['amount']} {move['symbol_in']}")
|
||||
else:
|
||||
print("No ballance found for {move['symbol_in']}. Skipping move.")
|
||||
await send_telegram_message(f"No ballance found for {move['symbol_in']}. Skipping move.")
|
||||
@ -1009,7 +1009,7 @@ async def follow_move(move):
|
||||
token_name_out = TOKENS_INFO[move['token_out']].get('symbol') or await get_token_metadata_symbol(move['token_out'])
|
||||
|
||||
if not your_balance:
|
||||
msg = f"<b>Move Failed:</b>\nNo balance found for token {move['token_in']}. Cannot follow move."
|
||||
msg = f"<b>Move not followed:</b>\nNo balance found for token {move['symbol_in']}. Cannot follow move."
|
||||
logging.warning(msg)
|
||||
await send_telegram_message(msg)
|
||||
return
|
||||
@ -1021,9 +1021,11 @@ async def follow_move(move):
|
||||
# # always get 99% of the amount to swap
|
||||
# amount_to_swap = amount_to_swap * 0.95
|
||||
|
||||
decimals = token_info.get('decimals')
|
||||
# Convert to lamports
|
||||
# if decimals is 6, then amount = amount * 1e6; if 9, then amount = amount * 1e9
|
||||
amount = int(amount_to_swap * 10**token_info.get('decimals') )
|
||||
amount = int(amount_to_swap * 10**decimals)
|
||||
|
||||
|
||||
if your_balance < amount_to_swap:
|
||||
msg = (
|
||||
@ -1190,6 +1192,7 @@ async def subscribe_to_wallet():
|
||||
logger.error(f"WebSocket error: {e}")
|
||||
except Exception as e:
|
||||
logger.error(f"An unexpected error occurred: {e}")
|
||||
await unsubscribe(websocket, subscription_id)
|
||||
await send_telegram_message("reconnecting...")
|
||||
logger.info(f"Attempting to reconnect in {reconnect_delay} seconds...")
|
||||
await asyncio.sleep(reconnect_delay)
|
||||
@ -1248,6 +1251,7 @@ async def process_messages(websocket, subscription_id):
|
||||
except websockets.exceptions.ConnectionClosedError as e:
|
||||
logger.error(f"Connection closed unexpectedly: {e}")
|
||||
await send_telegram_message("Connection to Solana network was closed. Not listening for transactions right now. Attempting to reconnect...")
|
||||
pass
|
||||
except json.JSONDecodeError as e:
|
||||
logger.error(f"Failed to decode JSON: {e}")
|
||||
except Exception as e:
|
||||
@ -1274,6 +1278,8 @@ async def check_PK():
|
||||
logging.error("Private key not found in environment variables. Will not be able to sign transactions.")
|
||||
# send TG warning message
|
||||
await send_telegram_message("<b>Warning:</b> Private key not found in environment variables. Will not be able to sign transactions.")
|
||||
|
||||
|
||||
|
||||
|
||||
async def main():
|
||||
@ -1281,19 +1287,15 @@ async def main():
|
||||
await check_PK()
|
||||
await subscribe_to_wallet()
|
||||
|
||||
def run_flask():
|
||||
# Run Flask app without the reloader, so we can run the async main function
|
||||
app.run(debug=False, port=3001, use_reloader=False)
|
||||
async def run_flask():
|
||||
loop = asyncio.get_running_loop()
|
||||
await loop.run_in_executor(None, lambda: app.run(debug=False, port=3001, use_reloader=False))
|
||||
|
||||
async def run_all():
|
||||
await asyncio.gather(
|
||||
main(),
|
||||
run_flask()
|
||||
)
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
# Create an event loop for the async tasks
|
||||
loop = asyncio.get_event_loop()
|
||||
loop.run_until_complete(main())
|
||||
# Start Flask in a separate thread
|
||||
# flask_thread = threading.Thread(target=run_flask)
|
||||
# flask_thread.start()
|
||||
|
||||
# Run the async main function
|
||||
asyncio.run(main())
|
||||
run_flask()
|
||||
asyncio.run(run_all())
|
Loading…
x
Reference in New Issue
Block a user