diff --git a/crypto/sol/app.py b/crypto/sol/app.py index 3160d7a..33cd3fa 100644 --- a/crypto/sol/app.py +++ b/crypto/sol/app.py @@ -1,66 +1,102 @@ + from flask import Flask, render_template, request, jsonify -from solana.rpc.api import Client +from solana.rpc.async_api import AsyncClient +from solana.rpc.commitment import Confirmed +from solders.pubkey import Pubkey from dexscreener import DexscreenerClient import asyncio from telegram import Bot from telegram.constants import ParseMode import os +import datetime app = Flask(__name__) -solana_client = Client("https://api.mainnet-beta.solana.com") + +solana_client = AsyncClient("https://api.mainnet-beta.solana.com") dexscreener_client = DexscreenerClient() - - - - - # This can be your own ID, or one for a developer group/channel. # You can use the /start command of this bot to see your chat id. DEVELOPER_CHAT_ID = "777826553" - - # Replace with the wallet address you want to follow FOLLOWED_WALLET = "9U7D916zuQ8qcL9kQZqkcroWhHGho5vD8VNekvztrutN" - # Replace with your wallet address YOUR_WALLET = "65nzyZXTLC81MthTo52a2gRJjqryTizWVqpK2fDKLye5" - - -TELEGRAM_CHAT_ID = "777826553" -# Replace with your Telegram Bot Token -TELEGRAM_BOT_TOKEN = "6749075936:AAHUHiPTDEIu6JH7S2fQdibwsu6JVG3FNG0" - +# Channel DBot: +# TELEGRAM_CHAT_ID = "777826553" # Telegram Bot Token # t.me/kevin_ai_robot # TOKEN = '6805059978:AAHNJKuOeazMSJHc3-BXRCsFfEVyFHeFnjw' # t.me/artitherobot 6749075936:AAHUHiPTDEIu6JH7S2fQdibwsu6JVG3FNG0 +# Replace with your Telegram Bot Token +TELEGRAM_BOT_TOKEN = "6805059978:AAHNJKuOeazMSJHc3-BXRCsFfEVyFHeFnjw" + + # Initialize Telegram Bot bot = Bot(token=TELEGRAM_BOT_TOKEN) - -# Simulated wallet balances (replace with actual balance fetching logic) -wallet_balances = { - FOLLOWED_WALLET: {"SOL": 100, "USDC": 1000}, - YOUR_WALLET: {"SOL": 10, "USDC": 100} -} - -async def send_telegram_message(message): - await bot.send_message(chat_id=TELEGRAM_CHAT_ID, text=message, parse_mode=ParseMode.HTML) +t send_telegram_message(message) @app.route('/') def index(): return render_template('index.html') @app.route('/tokens', methods=['GET']) -def get_tokens(): - return jsonify(list(wallet_balances[YOUR_WALLET].keys())) +async def get_tokens(): + balances = await get_wallet_balances(YOUR_WALLET) + return jsonify(list(balances.keys())) @app.route('/balances', methods=['GET']) -def get_balances(): - return jsonify(wallet_balances[YOUR_WALLET]) +async def get_balances(): + balances = await get_wallet_balances(YOUR_WALLET) + return jsonify(balances) + + +@app.route('/follow_move', methods=['POST']) +async def follow_move(): + move = request.json + followed_balances = await get_wallet_balances(FOLLOWED_WALLET) + your_balances = await get_wallet_balances(YOUR_WALLET) + + if move['token'] not in followed_balances or move['token'] not in your_balances: + return jsonify({'status': 'error', 'message': 'Invalid token'}) + + followed_balance = followed_balances[move['token']] + your_balance = your_balances[move['token']] + + proportion = your_balance / followed_balance if followed_balance > 0 else 0 + amount_to_swap = move['amount'] * proportion + + if your_balance >= amount_to_swap: + # Here you would implement the actual swap logic + # For now, we'll just simulate the swap + pair = dexscreener_client.get_token_pair("solana", move['token']) + price = float(pair['priceUsd']) + received_amount = amount_to_swap * price + + await send_telegram_message( + f"Move Followed:\n" + f"Swapped {amount_to_swap:.6f} {move['token']} " + f"for {received_amount:.6f} {move['to_token']}" + ) + + return jsonify({ + 'status': 'success', + 'message': f"Swapped {amount_to_swap:.6f} {move['token']} for {received_amount:.6f} {move['to_token']}" + }) + else: + await send_telegram_message( + f"Move Failed:\n" + f"Insufficient balance to swap {amount_to_swap:.6f} {move['token']}" + ) + + return jsonify({ + 'status': 'error', + 'message': f"Insufficient balance to swap {amount_to_swap:.6f} {move['token']}" + }) + @app.route('/followed_wallet_moves', methods=['GET']) def get_followed_wallet_moves(): @@ -123,5 +159,69 @@ def follow_move(): 'message': f"Insufficient balance to swap {amount_to_swap:.4f} {move['token']}" }) + +async def get_wallet_balances(wallet_address): + balances = {} + for token, address in TOKEN_ADDRESSES.items(): + balances[token] = await get_token_balance(wallet_address, address) + return balances + +async def send_telegram_message(message): + return + # await bot.send_message(chat_id=TELEGRAM_CHAT_ID, text=message, parse_mode=ParseMode.HTML) + +async def get_non_zero_token_balances(wallet_address): + non_zero_balances = {} + for token, address in TOKEN_ADDRESSES.items(): + balance = await get_token_balance(wallet_address, address) + if balance > 0: + non_zero_balances[token] = address + return non_zero_balances + +async def list_initial_wallet_states(): + global TOKEN_ADDRESSES + + followed_wallet_balances = await get_wallet_balances(FOLLOWED_WALLET) + your_wallet_balances = await get_wallet_balances(YOUR_WALLET) + + followed_non_zero = await get_non_zero_token_balances(FOLLOWED_WALLET) + your_non_zero = await get_non_zero_token_balances(YOUR_WALLET) + + # Update TOKEN_ADDRESSES with non-zero balances from both wallets + TOKEN_ADDRESSES = {**followed_non_zero, **your_non_zero} + + followed_wallet_state = "\n".join([f"{token}: {amount:.6f}" for token, amount in followed_wallet_balances.items() if amount > 0]) + your_wallet_state = "\n".join([f"{token}: {amount:.6f}" for token, amount in your_wallet_balances.items() if amount > 0]) + + message = ( + "Initial Wallet States (Non-zero balances):\n\n" + f"Followed Wallet ({FOLLOWED_WALLET}):\n" + f"{followed_wallet_state}\n\n" + f"Your Wallet ({YOUR_WALLET}):\n" + f"{your_wallet_state}\n\n" + f"Monitored Tokens:\n" + f"{', '.join(TOKEN_ADDRESSES.keys())}" + ) + + await send_telegram_message(message) + + + + + +async def send_startup_message(): + current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + message = ( + f"Solana Agent Application Started\n\n" + f"Startup Time: {current_time}\n" + f"Followed Wallet: {FOLLOWED_WALLET}\n" + f"Your Wallet: {YOUR_WALLET}\n\n" + "The application is now running and ready to monitor wallet activities." + ) + await send_telegram_message(message) + if __name__ == '__main__': - app.run(debug=True) \ No newline at end of file + asyncio.run(send_startup_message()) + asyncio.run(list_initial_wallet_states()) + print(f"Monitored Tokens: {', '.join(TOKEN_ADDRESSES.keys())}") + app.run(debug=True, port=3009) \ No newline at end of file diff --git a/crypto/sol/readme.md b/crypto/sol/readme.md index b864354..130732b 100644 --- a/crypto/sol/readme.md +++ b/crypto/sol/readme.md @@ -1,8 +1,9 @@ -o run this Python Solana agent: +`Conda activate trade` +To run this Python Solana agent: Install the required libraries: -~pip install flask solana dexscreener~ +`pip install flask solana dexscreener python-telegram-bot` Replace REPLACE_WITH_WALLET_ADDRESS with the wallet address you want to follow. Replace REPLACE_WITH_YOUR_WALLET_ADDRESS with your own wallet address. @@ -10,4 +11,4 @@ Save the code in a file, e.g., solana_agent.py. Run the Flask application: -~python solana_agent.py~ \ No newline at end of file +`python app.py` \ No newline at end of file