diff --git a/.gitignore b/.gitignore index f2239b2..e4a1ce7 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,4 @@ crypto/sol/logs/error.log crypto/sol/logs/token_info.json crypto/sol/logs/transation_details.json .env +app_data.db diff --git a/app_data.db b/app_data.db index 1d388bb..91105cc 100644 Binary files a/app_data.db and b/app_data.db differ diff --git a/crypto/sol/app.py b/crypto/sol/app.py index ce16f04..990f9b7 100644 --- a/crypto/sol/app.py +++ b/crypto/sol/app.py @@ -207,161 +207,161 @@ async def process_log(log_result): -async def follow_move_legacy(move): - global pk - if pk is None: - pk = await get_pk() - your_balances = await SAPI.dex.get_wallet_balances(YOUR_WALLET, doGetTokenName=False) - 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']} {move['symbol_in']}") - else: - print(f"No ballance found for {move['symbol_in']}. Skipping move.") - await telegram_utils.send_telegram_message(f"No ballance found for {move['symbol_in']}. Skipping move.") - return +# async def follow_move_legacy(move): +# global pk +# if pk is None: +# pk = await get_pk() +# your_balances = await SAPI.dex.get_wallet_balances(YOUR_WALLET, doGetTokenName=False) +# 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']} {move['symbol_in']}") +# else: +# print(f"No ballance found for {move['symbol_in']}. Skipping move.") +# await telegram_utils.send_telegram_message(f"No ballance found for {move['symbol_in']}. Skipping move.") +# return - your_balance = your_balance_info['amount'] +# your_balance = your_balance_info['amount'] - token_info = SAPI.dex.TOKENS_INFO.get(move['token_in']) - token_name_in = token_info.get('symbol') or await SAPI.get_token_metadata(move['token_in']) - token_name_out = SAPI.dex.TOKENS_INFO[move['token_out']].get('symbol') or await SAPI.get_token_metadata_symbol(move['token_out']) +# token_info = SAPI.dex.TOKENS_INFO.get(move['token_in']) +# token_name_in = token_info.get('symbol') or await SAPI.get_token_metadata(move['token_in']) +# token_name_out = SAPI.dex.TOKENS_INFO[move['token_out']].get('symbol') or await SAPI.get_token_metadata_symbol(move['token_out']) - if not your_balance: - msg = f"Move not followed:\nNo balance found for token {move['symbol_in']}. Cannot follow move." - logging.warning(msg) - await telegram_utils.send_telegram_message(msg) - return +# if not your_balance: +# msg = f"Move not followed:\nNo balance found for token {move['symbol_in']}. Cannot follow move." +# logging.warning(msg) +# await telegram_utils.send_telegram_message(msg) +# return - if FOLLOW_AMOUNT == 'percentage': - # Calculate the amount to swap based on the same percentage as the followed move - amount_to_swap = your_balance * (move['percentage_swapped'] / 100) - elif FOLLOW_AMOUNT == 'exact': - amount_to_swap = move['amount_in'] - else: - try: - fixed_amount = float(FOLLOW_AMOUNT) # un USD - fixed_amount_in_token = fixed_amount / move["token_in_price"] - amount_to_swap = min(fixed_amount_in_token, your_balance) - except ValueError: - msg = f"Move not followed:\nInvalid FOLLOW_AMOUNT '{FOLLOW_AMOUNT}'. Must be 'percentage' or a number." - logging.warning(msg) - await telegram_utils.send_telegram_message(msg) - return +# if FOLLOW_AMOUNT == 'percentage': +# # Calculate the amount to swap based on the same percentage as the followed move +# amount_to_swap = your_balance * (move['percentage_swapped'] / 100) +# elif FOLLOW_AMOUNT == 'exact': +# amount_to_swap = move['amount_in'] +# else: +# try: +# fixed_amount = float(FOLLOW_AMOUNT) # un USD +# fixed_amount_in_token = fixed_amount / move["token_in_price"] +# amount_to_swap = min(fixed_amount_in_token, your_balance) +# except ValueError: +# msg = f"Move not followed:\nInvalid FOLLOW_AMOUNT '{FOLLOW_AMOUNT}'. Must be 'percentage' or a number." +# logging.warning(msg) +# await telegram_utils.send_telegram_message(msg) +# return - amount_to_swap = min(amount_to_swap, your_balance) # Ensure we're not trying to swap more than we have +# amount_to_swap = min(amount_to_swap, your_balance) # Ensure we're not trying to swap more than we have - 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**decimals) - amount = int(amount) - logging.debug(f"Calculated amount in lamports: {amount}") +# 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**decimals) +# amount = int(amount) +# logging.debug(f"Calculated amount in lamports: {amount}") - if your_balance < amount_to_swap: # should not happen - msg = ( - f"Warning:\n" - f"Insufficient balance: {your_balance:.6f} {token_name_in}. We want to swap {amount_to_swap:.6f}\n({move['symbol_in']}, decimals {token_info.get('decimals')} amount {amount}).\n This will probably fail. But we will try anyway." - ) - logging.warning(msg) - await telegram_utils.send_telegram_message(msg) - try: +# if your_balance < amount_to_swap: # should not happen +# msg = ( +# f"Warning:\n" +# f"Insufficient balance: {your_balance:.6f} {token_name_in}. We want to swap {amount_to_swap:.6f}\n({move['symbol_in']}, decimals {token_info.get('decimals')} amount {amount}).\n This will probably fail. But we will try anyway." +# ) +# logging.warning(msg) +# await telegram_utils.send_telegram_message(msg) +# try: - try: - notification = ( - f"Initiating move:\n" - f"Swapping {amount_to_swap:.2f} {token_name_in} for {token_name_out}" - + (f" ({move['percentage_swapped']:.2f}%)" if 'percentage_swapped' in move else "") - ) - # logging.info(notification) - # error_logger.info(notification) - await telegram_utils.send_telegram_message(notification) - except Exception as e: - logging.error(f"Error sending notification: {e}") +# try: +# notification = ( +# f"Initiating move:\n" +# f"Swapping {amount_to_swap:.2f} {token_name_in} for {token_name_out}" +# + (f" ({move['percentage_swapped']:.2f}%)" if 'percentage_swapped' in move else "") +# ) +# # logging.info(notification) +# # error_logger.info(notification) +# await telegram_utils.send_telegram_message(notification) +# except Exception as e: +# logging.error(f"Error sending notification: {e}") - for retry in range(3): - try: - private_key = Keypair.from_bytes(base58.b58decode(pk)) - async_client = AsyncClient(SOLANA_WS_URL) - jupiter = Jupiter(async_client, private_key) - transaction_data = await jupiter.swap( - input_mint=move['token_in'], - output_mint=move['token_out'], - amount=amount, - slippage_bps=300, # Increased to 3% - ) - logging.info(f"Initiating move. Transaction data:\n {transaction_data}") - error_logger.info(f"Initiating move. Transaction data:\n {transaction_data}") - raw_transaction = VersionedTransaction.from_bytes(base64.b64decode(transaction_data)) - message = raw_transaction.message - signature = private_key.sign_message(message.to_bytes_versioned()) - signed_txn = VersionedTransaction.populate(raw_transaction.message, [signature]) - opts = TxOpts(skip_preflight=False, preflight_commitment=Processed) +# for retry in range(3): +# try: +# private_key = Keypair.from_bytes(base58.b58decode(pk)) +# async_client = AsyncClient(SOLANA_WS_URL) +# jupiter = Jupiter(async_client, private_key) +# transaction_data = await jupiter.swap( +# input_mint=move['token_in'], +# output_mint=move['token_out'], +# amount=amount, +# slippage_bps=300, # Increased to 3% +# ) +# logging.info(f"Initiating move. Transaction data:\n {transaction_data}") +# error_logger.info(f"Initiating move. Transaction data:\n {transaction_data}") +# raw_transaction = VersionedTransaction.from_bytes(base64.b64decode(transaction_data)) +# message = raw_transaction.message +# signature = private_key.sign_message(message.to_bytes_versioned()) +# signed_txn = VersionedTransaction.populate(raw_transaction.message, [signature]) +# opts = TxOpts(skip_preflight=False, preflight_commitment=Processed) - # send the transaction - result = await async_client.send_raw_transaction(txn=bytes(signed_txn), opts=opts) +# # send the transaction +# result = await async_client.send_raw_transaction(txn=bytes(signed_txn), opts=opts) - transaction_id = json.loads(result.to_json())['result'] - print(f"Follow Transaction Sent: https://solscan.io/tx/{transaction_id}") - # append to notification - notification += f"\n\nTransaction: {transaction_id}" +# transaction_id = json.loads(result.to_json())['result'] +# print(f"Follow Transaction Sent: https://solscan.io/tx/{transaction_id}") +# # append to notification +# notification += f"\n\nTransaction: {transaction_id}" - await telegram_utils.send_telegram_message(f"Follow Transaction Sent: {transaction_id}") - tx_details = await SAPI.get_transaction_details_with_retry(transaction_id) +# await telegram_utils.send_telegram_message(f"Follow Transaction Sent: {transaction_id}") +# tx_details = await SAPI.get_transaction_details_with_retry(transaction_id) - if tx_details is not None: - break - else: - logging.warning(f"Failed to get transaction details for {transaction_id}. Probably transaction failed. Retrying again...") - await asyncio.sleep(3) - except Exception as e: - error_message = f"Move Failed:\n{str(e)}\n{transaction_data}\n{move}" - logging.error(error_message) - # log the errors to /logs/errors.log - error_logger.error(error_message) - error_logger.exception(e) - await telegram_utils.send_telegram_message(error_message) - amount = amount * 0.75 +# if tx_details is not None: +# break +# else: +# logging.warning(f"Failed to get transaction details for {transaction_id}. Probably transaction failed. Retrying again...") +# await asyncio.sleep(3) +# except Exception as e: +# error_message = f"Move Failed:\n{str(e)}\n{transaction_data}\n{move}" +# logging.error(error_message) +# # log the errors to /logs/errors.log +# error_logger.error(error_message) +# error_logger.exception(e) +# await telegram_utils.send_telegram_message(error_message) +# amount = amount * 0.75 - await SAPI.dex.get_wallet_balances(YOUR_WALLET, doGetTokenName=False) +# await SAPI.dex.get_wallet_balances(YOUR_WALLET, doGetTokenName=False) - try: - if tx_details is None: - logging.info(f"Failed to get transaction details for {transaction_id}") - notification = ( - f"Move Followed, failed to get transaction details.\n" - f"Swapped {amount_to_swap:.6f} {token_name_in} ({move['token_in']}) " - f"(same {move['percentage_swapped']:.2f}% as followed wallet)\n" - f"\n\nTransaction: {transaction_id}" - # log_successful_swap () - ) +# try: +# if tx_details is None: +# logging.info(f"Failed to get transaction details for {transaction_id}") +# notification = ( +# f"Move Followed, failed to get transaction details.\n" +# f"Swapped {amount_to_swap:.6f} {token_name_in} ({move['token_in']}) " +# f"(same {move['percentage_swapped']:.2f}% as followed wallet)\n" +# f"\n\nTransaction: {transaction_id}" +# # log_successful_swap () +# ) - else: - notification = ( - f"Move Followed:\n" - f"Swapped {amount_to_swap:.6f} {token_name_in} ({move['symbol_in']}) " - f"(same {move['percentage_swapped']:.2f}% as followed wallet)\n" - f"for {tx_details['amount_out']:.2f} {token_name_out}" - # f"Amount In USD: {tr_details['amount_in_USD']}\n" - f"\n\nTransaction: {transaction_id}" - ) - logging.info(notification) - await telegram_utils.send_telegram_message(notification) - except Exception as e: - logging.error(f"Error sending notification: {e}") +# else: +# notification = ( +# f"Move Followed:\n" +# f"Swapped {amount_to_swap:.6f} {token_name_in} ({move['symbol_in']}) " +# f"(same {move['percentage_swapped']:.2f}% as followed wallet)\n" +# f"for {tx_details['amount_out']:.2f} {token_name_out}" +# # f"Amount In USD: {tr_details['amount_in_USD']}\n" +# f"\n\nTransaction: {transaction_id}" +# ) +# logging.info(notification) +# await telegram_utils.send_telegram_message(notification) +# except Exception as e: +# logging.error(f"Error sending notification: {e}") - except Exception as e: - error_message = f"Swap Follow Error:\n{str(e)}" - logging.error(error_message) - # log the errors to /logs/errors.log - error_logger.error(error_message) - error_logger.exception(e) \ - # if error_message contains 'Program log: Error: insufficient funds' - if 'insufficient funds' in error_message: - await telegram_utils.send_telegram_message("Insufficient funds. Cannot follow move. Please check your balance.") - else: - await telegram_utils.send_telegram_message(error_message) +# except Exception as e: +# error_message = f"Swap Follow Error:\n{str(e)}" +# logging.error(error_message) +# # log the errors to /logs/errors.log +# error_logger.error(error_message) +# error_logger.exception(e) \ +# # if error_message contains 'Program log: Error: insufficient funds' +# if 'insufficient funds' in error_message: +# await telegram_utils.send_telegram_message("Insufficient funds. Cannot follow move. Please check your balance.") +# else: +# await telegram_utils.send_telegram_message(error_message) # Helper functions @@ -401,7 +401,8 @@ async def process_messages(websocket): pk = None -app = init_app(follow_move_legacy) +app = init_app() +# app = init_app(follow_move_legacy) # Convert Flask app to ASGI asgi_app = WsgiToAsgi(app) diff --git a/crypto/sol/modules/SolanaAPI.py b/crypto/sol/modules/SolanaAPI.py index b152671..82c1435 100644 --- a/crypto/sol/modules/SolanaAPI.py +++ b/crypto/sol/modules/SolanaAPI.py @@ -276,15 +276,15 @@ class SolanaAPI: if solana_ws.websocket: await solana_ws.close() await async_safe_call(self.on_bot_message,"Reconnecting...") - if self.receive_task and not self.receive_task.cancelled(): + if receive_task and not receive_task.cancelled(): receive_task.cancel() - if self.process_task and not self.process_task.cancelled(): + if process_task and not process_task.cancelled(): process_task.cancel() except Exception as e: logger.error(f"An error occurred while unsubscribing: {e}") finally: - self.receive_task = None - self.process_task = None + receive_task = None + process_task = None await asyncio.sleep(5) diff --git a/crypto/sol/modules/webui.py b/crypto/sol/modules/webui.py index 0ea4aec..142d0c6 100644 --- a/crypto/sol/modules/webui.py +++ b/crypto/sol/modules/webui.py @@ -304,7 +304,7 @@ def get_latest_log_file(wh:bool): # files = [f for f in os.listdir(log_dir) if os.path.isfile(os.path.join(log_dir, f))] # filter files mask log_20241005_004103_143116.json if wh: - files = [f for f in os.listdir(log_dir) if os.path.isfile(os.path.join(log_dir, f)) and f.startswith('wh-')] + files = [f for f in os.listdir(log_dir) if os.path.isfile(os.path.join(log_dir, f)) and f.startswith('wh_')] else: files = [f for f in os.listdir(log_dir) if os.path.isfile(os.path.join(log_dir, f)) and f.startswith('log_')]