This commit is contained in:
Dobromir Popov
2024-10-24 14:06:07 +03:00
parent 1a31455d98
commit 25384ec5a8
3 changed files with 58 additions and 41 deletions

View File

@ -9,7 +9,7 @@ DEVELOPER_CHAT_ID="777826553" # https://api.telegram.org/bot{token}/getUpdates
TELEGRAM_BOT_TOKEN="6805059978:AAHNJKuOeazMSJHc3-BXRCsFfEVyFHeFnjw" TELEGRAM_BOT_TOKEN="6805059978:AAHNJKuOeazMSJHc3-BXRCsFfEVyFHeFnjw"
# dev, @artitherobot: # dev, @artitherobot:
BOT_NAME="DEV" BOT_NAME="DEV0"
DEVELOPER_CHAT_ID="777826553" DEVELOPER_CHAT_ID="777826553"
TELEGRAM_BOT_TOKEN="6749075936:AAHUHiPTDEIu6JH7S2fQdibwsu6JVG3FNG0" TELEGRAM_BOT_TOKEN="6749075936:AAHUHiPTDEIu6JH7S2fQdibwsu6JVG3FNG0"
@ -21,6 +21,6 @@ YOUR_WALLET="7QXGLRjvyFAmxdRaP9Wk18KwWTMfspF4Na2sr3o3PzxV"
PK=3FxXjNrtEqwAKYj4BpkuLAJPzuKRWykkvjeBYQEVuFqRFWRm9eVcWrrYKbns2M31ESMoASG2WV39w9Dpx532sPUH PK=3FxXjNrtEqwAKYj4BpkuLAJPzuKRWykkvjeBYQEVuFqRFWRm9eVcWrrYKbns2M31ESMoASG2WV39w9Dpx532sPUH
# Sync to main [DEV] # Sync to main [DEV]
#FOLLOWED_WALLET="7QXGLRjvyFAmxdRaP9Wk18KwWTMfspF4Na2sr3o3PzxV" FOLLOWED_WALLET="7QXGLRjvyFAmxdRaP9Wk18KwWTMfspF4Na2sr3o3PzxV"
#YOUR_WALLET="65nzyZXTLC81MthTo52a2gRJjqryTizWVqpK2fDKLye5" YOUR_WALLET="65nzyZXTLC81MthTo52a2gRJjqryTizWVqpK2fDKLye5"
#PK=5ccrMf3BFFE1HMsXt17btK1tMSNay7aBoY27saPHrqg2JEjxKBmBbxUABD9Jh7Gisf1bhM51oGzWdyLUgHdrUJPw PK=5ccrMf3BFFE1HMsXt17btK1tMSNay7aBoY27saPHrqg2JEjxKBmBbxUABD9Jh7Gisf1bhM51oGzWdyLUgHdrUJPw

View File

@ -11,7 +11,6 @@ import os
import base58 import base58
from dotenv import load_dotenv, set_key from dotenv import load_dotenv, set_key
import aiohttp import aiohttp
from typing import List, Dict, Any, Tuple
import requests import requests
import re import re
import random import random
@ -167,7 +166,7 @@ async def process_log(log_result):
try: try:
if tr_details["token_in"] is None or tr_details["token_out"] is None or tr_details["amount_in"] == 0 or tr_details["amount_out"] == 0: if tr_details["token_in"] is None or tr_details["token_out"] is None or tr_details["amount_in"] == 0 or tr_details["amount_out"] == 0:
logging.warning("Incomplete swap details found in logs. Getting details from transaction") logging.warning("Incomplete swap details found in logs. Getting details from transaction")
tr_details = await get_transaction_details_info(tx_signature_str, logs) tr_details = await SAPI.get_transaction_details_info(tx_signature_str, logs)
# onlt needed if no details got # onlt needed if no details got
if before_source_balance > 0 and source_token_change > 0: if before_source_balance > 0 and source_token_change > 0:
tr_details["percentage_swapped"] = (source_token_change / before_source_balance) * 100 tr_details["percentage_swapped"] = (source_token_change / before_source_balance) * 100
@ -214,33 +213,8 @@ async def process_log(log_result):
PROCESSING_LOG = False PROCESSING_LOG = False
return tr_details return tr_details
# "Program log: Instruction: Swap2",
# "Program log: order_id: 13985890735038016",
# "Program log: AbrMJWfDVRZ2EWCQ1xSCpoVeVgZNpq1U2AoYG98oRXfn", source
# "Program log: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", target
# "Program log: before_source_balance: 58730110139, before_destination_balance: 202377778, amount_in: 58730110139, expect_amount_out: 270109505, min_return: 267408410",
# "Program log: after_source_balance: 0, after_destination_balance: 472509072",
# "Program log: source_token_change: 58730110139, destination_token_change: 270131294",
async def get_transaction_details_info(tx_signature_str: str, logs: List[str]) -> Dict[str, Any]:
global TOKENS_INFO
tr_info = await SAPI.get_transaction_details_with_retry(tx_signature_str)
try:
tr_info['percentage_swapped'] = (tr_info['amount_in'] / tr_info['before_source_balance']) * 100 if tr_info['before_source_balance'] > 0 else 50
except Exception as e:
logging.error(f"Error calculating percentage swapped: {e}")
return tr_info
def _get_pre_balance(transaction_details: Dict[str, Any], token: str) -> float:
pre_balances = transaction_details.get('meta', {}).get('preTokenBalances', [])
for balance in pre_balances:
if balance['mint'] == token:
return float(balance['uiTokenAmount']['amount'])
return 0.0
async def follow_move(move): async def follow_move(move):

View File

@ -35,6 +35,7 @@ from typing import Dict, List, Optional
import requests import requests
from datetime import datetime from datetime import datetime
from solana.rpc.types import TokenAccountOpts, TxOpts from solana.rpc.types import TokenAccountOpts, TxOpts
from typing import List, Dict, Any, Tuple
# # # solders/solana libs (solana_client) # # # # # # solders/solana libs (solana_client) # # #
@ -166,8 +167,11 @@ class SolanaWS:
async def process_messages(self, one = False): async def process_messages(self, one = False):
while True: while True:
message = await self.message_queue.get() message = await self.message_queue.get()
message = json.loads(message) if type(message) == int:
subscription_id = message
logger.info(f"Subscription id: {subscription_id}")
if self.on_message: if self.on_message:
#message = json.loads(message)
await self.on_message(message) await self.on_message(message)
logger.info(f"Received message: {message}") logger.info(f"Received message: {message}")
if one: if one:
@ -257,10 +261,15 @@ class SolanaAPI:
except Exception as e: except Exception as e:
logger.error(f"An unexpected error occurred: {e}") logger.error(f"An unexpected error occurred: {e}")
finally: finally:
await solana_ws.unsubscribe() try:
if solana_ws.websocket: await solana_ws.unsubscribe()
await solana_ws.close() if solana_ws.websocket:
await async_safe_call(self.on_bot_message,"Reconnecting...") await solana_ws.close()
await async_safe_call(self.on_bot_message,"Reconnecting...")
receive_task.cancel()
process_task.cancel()
except Exception as e:
logger.error(f"An error occurred while unsubscribing: {e}")
await asyncio.sleep(5) await asyncio.sleep(5)
async def get_last_transactions(self, account_address, check_interval=300, limit=1000): async def get_last_transactions(self, account_address, check_interval=300, limit=1000):
@ -464,8 +473,35 @@ class SolanaAPI:
except requests.exceptions.RequestException as e: except requests.exceptions.RequestException as e:
print("Error fetching transaction details:", e) print("Error fetching transaction details:", e)
# "Program log: Instruction: Swap2",
# "Program log: order_id: 13985890735038016",
# "Program log: AbrMJWfDVRZ2EWCQ1xSCpoVeVgZNpq1U2AoYG98oRXfn", source
# "Program log: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", target
# "Program log: before_source_balance: 58730110139, before_destination_balance: 202377778, amount_in: 58730110139, expect_amount_out: 270109505, min_return: 267408410",
# "Program log: after_source_balance: 0, after_destination_balance: 472509072",
# "Program log: source_token_change: 58730110139, destination_token_change: 270131294",
async def get_transaction_details_info(tx_signature_str: str, logs: List[str]) -> Dict[str, Any]:
global TOKENS_INFO
tr_info = await self.get_transaction_details_with_retry(tx_signature_str)
try:
tr_info['percentage_swapped'] = (tr_info['amount_in'] / tr_info['before_source_balance']) * 100 if tr_info['before_source_balance'] > 0 else 50
except Exception as e:
logging.error(f"Error calculating percentage swapped: {e}")
return tr_info
# def _get_pre_balance(transaction_details: Dict[str, Any], token: str) -> float:
# pre_balances = transaction_details.get('meta', {}).get('preTokenBalances', [])
# for balance in pre_balances:
# if balance['mint'] == token:
# return float(balance['uiTokenAmount']['amount'])
# return 0.0
async def get_transaction_details_with_retry(transaction_id, retry_delay = 5, max_retries = 16): async def get_transaction_details_with_retry(transaction_id, retry_delay = 5, max_retries = 16):
# 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))
@ -763,9 +799,16 @@ class SolanaDEX:
info = parsed_data['info'] info = parsed_data['info']
if isinstance(info, dict) and 'mint' in info and 'tokenAmount' in info: if isinstance(info, dict) and 'mint' in info and 'tokenAmount' in info:
mint = info['mint'] mint = info['mint']
decimals = info['tokenAmount']['decimals'] decimals = int(info['tokenAmount']['decimals'])
amount = float(info['tokenAmount']['amount'])/10**decimals amount = info['tokenAmount']['amount']
if amount > 0: try:
amount = float(amount)
except ValueError:
print(f"Error: amount '{amount}' cannot be converted to a float")
# You might want to add some error handling here
if amount > 0.0:
amount = amount /10**decimals
if mint in self.TOKENS_INFO: if mint in self.TOKENS_INFO:
token_name = self.TOKENS_INFO[mint].get('symbol') token_name = self.TOKENS_INFO[mint].get('symbol')
elif doGetTokenName: elif doGetTokenName: