diff --git a/crypto/sol/app.py b/crypto/sol/app.py
index 3ac8efe..6ec719f 100644
--- a/crypto/sol/app.py
+++ b/crypto/sol/app.py
@@ -43,8 +43,17 @@ import random
app = Flask(__name__)
+# config = load_config()
load_dotenv()
-load_dotenv('.env.secret') # ToDo - make it work
+load_dotenv('.env.secret')
+# Configuration
+DEVELOPER_CHAT_ID = os.getenv("DEVELOPER_CHAT_ID")
+FOLLOWED_WALLET = os.getenv("FOLLOWED_WALLET")
+YOUR_WALLET = os.getenv("YOUR_WALLET")
+TELEGRAM_BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN")
+SOLANA_WS_URL = os.getenv("SOLANA_WS_URL")
+SOLANA_HTTP_URL = os.getenv("SOLANA_HTTP_URL")
+DISPLAY_CURRENCY = os.getenv('DISPLAY_CURRENCY', 'USD')
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.DEBUG)
@@ -102,30 +111,8 @@ async def retry_last_log():
-
-# Configuration
-DEVELOPER_CHAT_ID = os.getenv("DEVELOPER_CHAT_ID")
-FOLLOWED_WALLET = os.getenv("FOLLOWED_WALLET")
-YOUR_WALLET = os.getenv("YOUR_WALLET")
-TELEGRAM_BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN")
-SOLANA_WS_URL = os.getenv("SOLANA_WS_URL")
-SOLANA_HTTP_URL = os.getenv("SOLANA_HTTP_URL")
-DISPLAY_CURRENCY = os.getenv('DISPLAY_CURRENCY', 'USD')
-
-
-# Use the production Solana RPC endpoint
-solana_client = AsyncClient(SOLANA_HTTP_URL)
-dexscreener_client = DexscreenerClient()
-
-
-# Initialize Telegram Bot
-# Create a custom connection pool
-conn_pool = aiohttp.TCPConnector(limit=100) # Increase the connection limit
-timeout = aiohttp.ClientTimeout(total=30) # Set a longer timeout
-
# Create the bot with the custom connection pool
-bot = Bot(TELEGRAM_BOT_TOKEN, request=aiohttp.ClientSession(connector=conn_pool, timeout=timeout).request)
-
+bot = None
# Token addresses (initialize with some known tokens)
TOKEN_ADDRESSES = {
"SOL": "So11111111111111111111111111111111111111112",
@@ -346,6 +333,8 @@ async def get_sol_price_from_dexscreener() -> float:
# # # # # # # # # # SOLANA BLOCKCHAIN # # # # # # # # # #
+solana_client = AsyncClient(SOLANA_HTTP_URL)
+
async def get_token_balance_rpc(wallet_address, token_address):
url = SOLANA_HTTP_URL
headers = {"Content-Type": "application/json"}
@@ -1155,12 +1144,12 @@ async def follow_move(move):
try:
notification = (
- f"Initiating move:\n (decimals: {token_info.get('decimals')})\n"
+ f"Initiating move:\n"
f"Swapping {move['percentage_swapped']:.2f}% ({amount_to_swap:.2f}) {token_name_in} for {token_name_out}"
)
- logging.info(notification)
- error_logger.info(notification)
- await send_telegram_message(notification)
+ # logging.info(notification)
+ # error_logger.info(notification)
+ # await send_telegram_message(notification)
except Exception as e:
logging.error(f"Error sending notification: {e}")
@@ -1187,6 +1176,9 @@ async def follow_move(move):
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 send_telegram_message(f"Follow Transaction Sent: {transaction_id}")
tx_details = await get_transaction_details_with_retry(transaction_id)
@@ -1265,7 +1257,7 @@ SUBSCRIBE_INTERVAL = 1*60 # Resubscribe every 10 minutes
_first_subscription = True
_process_task = None
async def wallet_watch_loop():
- global first_subscription, process_task
+ global _first_subscription, _process_task
reconnect_delay = 5
max_reconnect_delay = 60
@@ -1431,9 +1423,40 @@ async def check_PK():
async def main():
+ global bot, PROCESSING_LOG
+ # Initialize Telegram Bot
+ # Create a custom connection pool
+ conn_pool = aiohttp.TCPConnector(limit=100) # Increase the connection limit
+ timeout = aiohttp.ClientTimeout(total=30) # Set a longer timeout
+
+ bot = Bot(TELEGRAM_BOT_TOKEN) # , request=aiohttp.ClientSession(connector=conn_pool, timeout=timeout).request)
+
await send_telegram_message("Solana Agent Started. Connecting to mainnet...")
await check_PK()
- await wallet_watch_loop()
+ # new: restart wallet_watch_loop every hour
+ while True:
+ wallet_watch_task = asyncio.create_task(wallet_watch_loop())
+
+ try:
+ # Wait for an hour or until the task completes, whichever comes first
+ await asyncio.wait_for(wallet_watch_task, timeout=3600)
+ except asyncio.TimeoutError:
+ # If an hour has passed, cancel the task if not PROCESSING
+ if PROCESSING_LOG:
+ logging.info("wallet_watch_loop is processing logs. Will not restart.")
+ await send_telegram_message("wallet_watch_loop is processing logs. Will not restart.")
+ else:
+ wallet_watch_task.cancel()
+ try:
+ await wallet_watch_task
+ except asyncio.CancelledError:
+ logging.info("wallet_watch_loop was cancelled after running for an hour")
+ except Exception as e:
+ logging.error(f"Error in wallet_watch_loop: {str(e)}")
+ await send_telegram_message(f"Error in wallet_watch_loop: {str(e)}")
+
+ logging.info("Restarting wallet_watch_loop")
+ await send_telegram_message("Restarting wallet_watch_loop")
async def run_flask():
loop = asyncio.get_running_loop()