Merge branch 'master' of http://git.d-popov.com/popov/ai-kevin
This commit is contained in:
commit
6fc307a8f2
@ -668,10 +668,12 @@ async def get_transaction_details_rpc(tx_signature, readfromDump=False):
|
|||||||
|
|
||||||
if parsed_result["token_in"] is None:
|
if parsed_result["token_in"] is None:
|
||||||
parsed_result["token_in"] = transfer['mint']
|
parsed_result["token_in"] = transfer['mint']
|
||||||
|
parsed_result["symbol_in"] = TOKENS_INFO[transfer['mint']]['symbol']
|
||||||
parsed_result["amount_in"] = transfer['amount']/10**TOKENS_INFO[transfer['mint']]['decimals']
|
parsed_result["amount_in"] = transfer['amount']/10**TOKENS_INFO[transfer['mint']]['decimals']
|
||||||
parsed_result["amount_in_USD"] = parsed_result["amount_in"] * TOKENS_INFO[transfer['mint']].get('price', current_price[transfer['mint']])
|
parsed_result["amount_in_USD"] = parsed_result["amount_in"] * TOKENS_INFO[transfer['mint']].get('price', current_price[transfer['mint']])
|
||||||
elif parsed_result["token_out"] is None:
|
elif parsed_result["token_out"] is None:
|
||||||
parsed_result["token_out"] = transfer['mint']
|
parsed_result["token_out"] = transfer['mint']
|
||||||
|
parsed_result["symbol_out"] = TOKENS_INFO[transfer['mint']]['symbol']
|
||||||
parsed_result["amount_out"] = transfer['amount']/10**TOKENS_INFO[transfer['mint']]['decimals']
|
parsed_result["amount_out"] = transfer['amount']/10**TOKENS_INFO[transfer['mint']]['decimals']
|
||||||
parsed_result["amount_out_USD"] = parsed_result["amount_out"] * TOKENS_INFO[transfer['mint']]['price']
|
parsed_result["amount_out_USD"] = parsed_result["amount_out"] * TOKENS_INFO[transfer['mint']]['price']
|
||||||
|
|
||||||
@ -811,7 +813,7 @@ async def save_token_info():
|
|||||||
with open('./logs/token_info.json', 'w') as f:
|
with open('./logs/token_info.json', 'w') as f:
|
||||||
json.dump(TOKENS_INFO, f, indent=2)
|
json.dump(TOKENS_INFO, f, indent=2)
|
||||||
|
|
||||||
async def get_transaction_details_with_retry(transaction_id, retry_delay = 5, max_retries = 12):
|
async def get_transaction_details_with_retry(transaction_id, retry_delay = 7, max_retries = 11):
|
||||||
# wait for the transaction to be confirmed
|
# wait for the transaction to be confirmed
|
||||||
# await async_client.wait_for_confirmation(Signature.from_string(transaction_id))
|
# await async_client.wait_for_confirmation(Signature.from_string(transaction_id))
|
||||||
# qwery every 5 seconds for the transaction details untill not None or 30 seconds
|
# qwery every 5 seconds for the transaction details untill not None or 30 seconds
|
||||||
@ -919,9 +921,9 @@ async def process_log(log_result):
|
|||||||
tr_details["percentage_swapped"] = tr_details["percentage_swapped"] / 1000
|
tr_details["percentage_swapped"] = tr_details["percentage_swapped"] / 1000
|
||||||
|
|
||||||
|
|
||||||
# update token info
|
# update token info: ToDo: check, but already did
|
||||||
all_token_addresses = list(set([tr_details["token_in"], tr_details["token_out"]]))
|
# all_token_addresses = list(set([tr_details["token_in"], tr_details["token_out"]]))
|
||||||
await get_token_prices(all_token_addresses)
|
# await get_token_prices(all_token_addresses)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
token_in = TOKENS_INFO[tr_details["token_in"]]
|
token_in = TOKENS_INFO[tr_details["token_in"]]
|
||||||
@ -968,17 +970,17 @@ async def get_transaction_details_info(tx_signature_str: str, logs: List[str]) -
|
|||||||
|
|
||||||
tr_info = await get_transaction_details_with_retry(tx_signature_str)
|
tr_info = await get_transaction_details_with_retry(tx_signature_str)
|
||||||
|
|
||||||
# Fetch token prices
|
# Fetch token prices: ToDo: check, but already did
|
||||||
token_prices = await get_token_prices([tr_info['token_in'], tr_info['token_out']])
|
# token_prices = await get_token_prices([tr_info['token_in'], tr_info['token_out']])
|
||||||
# for token, price in token_prices.items():
|
# # for token, price in token_prices.items():
|
||||||
# if not token in TOKENS_INFO or not TOKENS_INFO[token].get('symbol'):
|
# # if not token in TOKENS_INFO or not TOKENS_INFO[token].get('symbol'):
|
||||||
# token_name = await get_token_metadata_symbol(token)
|
# # token_name = await get_token_metadata_symbol(token)
|
||||||
# TOKENS_INFO[token] = {'symbol': token_name}
|
# # TOKENS_INFO[token] = {'symbol': token_name}
|
||||||
# TOKENS_INFO[token] = {'price': price}
|
# # TOKENS_INFO[token] = {'price': price}
|
||||||
|
|
||||||
# Calculate USD values
|
# # Calculate USD values
|
||||||
tr_info['amount_in_USD'] = tr_info['amount_in'] * token_prices.get(tr_info['token_in'], 0)
|
# tr_info['amount_in_USD'] = tr_info['amount_in'] * token_prices.get(tr_info['token_in'], 0)
|
||||||
tr_info['amount_out_USD'] = tr_info['amount_out'] * token_prices.get(tr_info['token_out'], 0)
|
# tr_info['amount_out_USD'] = tr_info['amount_out'] * token_prices.get(tr_info['token_out'], 0)
|
||||||
|
|
||||||
# Calculate the percentage of the source balance that was swapped; ToDo: fix decimals for percentage
|
# Calculate the percentage of the source balance that was swapped; ToDo: fix decimals for percentage
|
||||||
try:
|
try:
|
||||||
@ -1051,6 +1053,7 @@ async def follow_move(move):
|
|||||||
amount=amount,
|
amount=amount,
|
||||||
slippage_bps=100, # Increased to 1%
|
slippage_bps=100, # Increased to 1%
|
||||||
)
|
)
|
||||||
|
logging.info(f"Initiating move. Transaction data:\n {transaction_data}")
|
||||||
error_logger.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))
|
raw_transaction = VersionedTransaction.from_bytes(base64.b64decode(transaction_data))
|
||||||
signature = private_key.sign_message(message.to_bytes_versioned(raw_transaction.message))
|
signature = private_key.sign_message(message.to_bytes_versioned(raw_transaction.message))
|
||||||
@ -1062,7 +1065,7 @@ async def follow_move(move):
|
|||||||
|
|
||||||
transaction_id = json.loads(result.to_json())['result']
|
transaction_id = json.loads(result.to_json())['result']
|
||||||
print(f"Follow Transaction Sent: https://solscan.io/tx/{transaction_id}")
|
print(f"Follow Transaction Sent: https://solscan.io/tx/{transaction_id}")
|
||||||
send_telegram_message(f"Follow Transaction Sent: {transaction_id}")
|
await send_telegram_message(f"Follow Transaction Sent: {transaction_id}")
|
||||||
tx_details = await get_transaction_details_with_retry(transaction_id)
|
tx_details = await get_transaction_details_with_retry(transaction_id)
|
||||||
|
|
||||||
if tx_details is not None:
|
if tx_details is not None:
|
||||||
@ -1076,7 +1079,7 @@ async def follow_move(move):
|
|||||||
if tx_details is None:
|
if tx_details is None:
|
||||||
logging.info(f"Failed to get transaction details for {transaction_id}")
|
logging.info(f"Failed to get transaction details for {transaction_id}")
|
||||||
notification = (
|
notification = (
|
||||||
f"<b>Move Followed:</b>\n"
|
f"<b>Move Followed, failed to get transaction details.</b>\n"
|
||||||
f"Swapped {amount_to_swap:.6f} {token_name_in} ({move['token_in']}) "
|
f"Swapped {amount_to_swap:.6f} {token_name_in} ({move['token_in']}) "
|
||||||
f"(same {move['percentage_swapped']:.2f}% as followed wallet)\n"
|
f"(same {move['percentage_swapped']:.2f}% as followed wallet)\n"
|
||||||
f"\n\n<b>Transaction:</b> <a href='https://solscan.io/tx/{transaction_id}'>{transaction_id}</a>"
|
f"\n\n<b>Transaction:</b> <a href='https://solscan.io/tx/{transaction_id}'>{transaction_id}</a>"
|
||||||
@ -1103,13 +1106,6 @@ async def follow_move(move):
|
|||||||
error_logger.error(error_message)
|
error_logger.error(error_message)
|
||||||
error_logger.exception(e)
|
error_logger.exception(e)
|
||||||
# await send_telegram_message(error_message)
|
# await send_telegram_message(error_message)
|
||||||
# else:
|
|
||||||
# msg = (
|
|
||||||
# f"<b>Move Not Followed:</b>\n"
|
|
||||||
# f"Insufficient balance to swap {amount_to_swap:.6f} {token_name_in} ({move['token_in']})"
|
|
||||||
# )
|
|
||||||
# logging.warning(msg)
|
|
||||||
# await send_telegram_message(msg)
|
|
||||||
|
|
||||||
|
|
||||||
# Helper functions (implement these according to your needs)
|
# Helper functions (implement these according to your needs)
|
||||||
@ -1152,10 +1148,11 @@ async def subscribe_to_wallet():
|
|||||||
|
|
||||||
await websocket.send(json.dumps(request))
|
await websocket.send(json.dumps(request))
|
||||||
logger.info("Subscription request sent")
|
logger.info("Subscription request sent")
|
||||||
|
conn_active = False
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
response = await websocket.recv()
|
response = await websocket.recv()
|
||||||
|
conn_active = True
|
||||||
response_data = json.loads(response)
|
response_data = json.loads(response)
|
||||||
logger.debug(f"Received response: {response_data}")
|
logger.debug(f"Received response: {response_data}")
|
||||||
if 'result' in response_data:
|
if 'result' in response_data:
|
||||||
@ -1175,7 +1172,9 @@ async def subscribe_to_wallet():
|
|||||||
|
|
||||||
except websockets.exceptions.ConnectionClosedError as e:
|
except websockets.exceptions.ConnectionClosedError as e:
|
||||||
logger.error(f"Connection closed unexpectedly: {e}")
|
logger.error(f"Connection closed unexpectedly: {e}")
|
||||||
break
|
if conn_active:
|
||||||
|
conn_active = False
|
||||||
|
await send_telegram_message("Connection to Solana network was closed. Not listening for transactions right now. Attempting to reconnect...")
|
||||||
except json.JSONDecodeError as e:
|
except json.JSONDecodeError as e:
|
||||||
logger.error(f"Failed to decode JSON: {e}")
|
logger.error(f"Failed to decode JSON: {e}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
@ -14,3 +14,4 @@ services:
|
|||||||
sh -c "pip install -r requirements.txt &&
|
sh -c "pip install -r requirements.txt &&
|
||||||
python app.py"
|
python app.py"
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user