wip
This commit is contained in:
@ -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
|
@ -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):
|
||||||
|
@ -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:
|
||||||
|
Reference in New Issue
Block a user