├── accounts.txt ├── proxy.txt ├── requirements.txt ├── README.md └── bot.py /accounts.txt: -------------------------------------------------------------------------------- 1 | your_private_key_1 2 | your_private_key_2 -------------------------------------------------------------------------------- /proxy.txt: -------------------------------------------------------------------------------- 1 | ip:port # Default Protcol HTTP. 2 | protocol://ip:port 3 | protocol://user:pass@ip:port -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | web3==7.11.1 2 | eth-account==0.13.7 3 | aiohttp-socks==0.9.1 4 | aiohttp==3.11.10 5 | colorama==0.4.6 6 | pytz==2024.1 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Turnkey BOT 2 | Turnkey BOT 3 | 4 | - Register Here : [Turnkey](https://wallet.tx.xyz/) 5 | - Signup With Google 6 | - Export Seed Phrase & Private Key 7 | - Save 8 | 9 | ## Features 10 | 11 | - Auto Get Account Information 12 | - Auto Run With [Proxyscrape Free Proxy](https://proxyscrape.com/free-proxy-list) - `Choose 1` 13 | - Auto Run With Private Proxy - `Choose 2` 14 | - Auto Run Without Proxy - `Choose 3` 15 | - Auto Perform Transfer to Random Address 16 | - Multi Accounts 17 | 18 | ## Requiremnets 19 | 20 | - Make sure you have Python3.9 or higher installed and pip. 21 | - ETH Sepolia, u can get it from [Google Clod Web3](https://cloud.google.com/application/web3/faucet/ethereum/sepolia) 22 | 23 | ## Instalation 24 | 25 | 1. **Clone The Repositories:** 26 | ```bash 27 | git clone https://github.com/vonssy/Turnkey-BOT.git 28 | ``` 29 | ```bash 30 | cd Turnkey-BOT 31 | ``` 32 | 33 | 2. **Install Requirements:** 34 | ```bash 35 | pip install -r requirements.txt #or pip3 install -r requirements.txt 36 | ``` 37 | 38 | ### Note: Check your web3 and eth-account libraries version first. If not same with version in requirements.txt, u must uninstall that library. 39 | - **Check Library Version** 40 | ```bash 41 | pip show libary_name 42 | ``` 43 | - **Uninstall Library** 44 | ```bash 45 | pip uninstall libary_name 46 | ``` 47 | - **Install Library With Version** 48 | ```bash 49 | pip install libary_name==version 50 | ``` 51 | 52 | ## Configuration 53 | 54 | - **accounts.txt:** You will find the file `accounts.txt` inside the project directory. Make sure `accounts.txt` contains data that matches the format expected by the script. Here are examples of file formats: 55 | ```bash 56 | your_private_key_1 57 | your_private_key_2 58 | ``` 59 | 60 | - **proxy.txt:** You will find the file `proxy.txt` inside the project directory. Make sure `proxy.txt` contains data that matches the format expected by the script. Here are examples of file formats: 61 | ```bash 62 | ip:port # Default Protcol HTTP. 63 | protocol://ip:port 64 | protocol://user:pass@ip:port 65 | ``` 66 | 67 | ## Run 68 | 69 | ```bash 70 | python bot.py #or python3 bot.py 71 | ``` 72 | 73 | ## Buy Me a Coffee 74 | 75 | - **EVM:** 0xe3c9ef9a39e9eb0582e5b147026cae524338521a 76 | - **TON:** UQBEFv58DC4FUrGqinBB5PAQS7TzXSm5c1Fn6nkiet8kmehB 77 | - **SOL:** E1xkaJYmAFEj28NPHKhjbf7GcvfdjKdvXju8d8AeSunf 78 | - **SUI:** 0xa03726ecbbe00b31df6a61d7a59d02a7eedc39fe269532ceab97852a04cf3347 79 | 80 | Thank you for visiting this repository, don't forget to contribute in the form of follows and stars. 81 | If you have questions, find an issue, or have suggestions for improvement, feel free to contact me or open an *issue* in this GitHub repository. 82 | 83 | **vonssy** -------------------------------------------------------------------------------- /bot.py: -------------------------------------------------------------------------------- 1 | from web3 import Web3 2 | from web3.exceptions import TransactionNotFound 3 | from eth_account import Account 4 | from aiohttp import ClientSession, ClientTimeout, ClientResponseError, BasicAuth 5 | from aiohttp_socks import ProxyConnector 6 | from datetime import datetime 7 | from colorama import * 8 | import asyncio, random, json, re, os, pytz 9 | 10 | wib = pytz.timezone('Asia/Jakarta') 11 | 12 | class Turnkey: 13 | def __init__(self) -> None: 14 | self.RPC_URL = "https://eth-sepolia.g.alchemy.com/v2/KatanYBT5TYSiPJ8Lr8iE_-kebTVnVvq" 15 | self.RECEIVER = "0x08d2b0a37F869FF76BACB5Bab3278E26ab7067B7" 16 | self.ERC20_CONTRACT_ABI = json.loads('''[ 17 | {"type":"function","name":"balanceOf","stateMutability":"view","inputs":[{"name":"address","type":"address"}],"outputs":[{"name":"","type":"uint256"}]} 18 | ]''') 19 | self.proxies = [] 20 | self.proxy_index = 0 21 | self.account_proxies = {} 22 | self.used_nonce = {} 23 | self.tx_count = 0 24 | self.min_amount = 0 25 | self.max_amount = 0 26 | self.min_delay = 0 27 | self.max_delay = 0 28 | 29 | def clear_terminal(self): 30 | os.system('cls' if os.name == 'nt' else 'clear') 31 | 32 | def log(self, message): 33 | print( 34 | f"{Fore.CYAN + Style.BRIGHT}[ {datetime.now().astimezone(wib).strftime('%x %X %Z')} ]{Style.RESET_ALL}" 35 | f"{Fore.WHITE + Style.BRIGHT} | {Style.RESET_ALL}{message}", 36 | flush=True 37 | ) 38 | 39 | def welcome(self): 40 | print( 41 | f""" 42 | {Fore.GREEN + Style.BRIGHT}Turnkey{Fore.BLUE + Style.BRIGHT} Auto BOT 43 | """ 44 | f""" 45 | {Fore.GREEN + Style.BRIGHT}Rey? {Fore.YELLOW + Style.BRIGHT} 46 | """ 47 | ) 48 | 49 | def format_seconds(self, seconds): 50 | hours, remainder = divmod(seconds, 3600) 51 | minutes, seconds = divmod(remainder, 60) 52 | return f"{int(hours):02}:{int(minutes):02}:{int(seconds):02}" 53 | 54 | async def load_proxies(self, use_proxy_choice: bool): 55 | filename = "proxy.txt" 56 | try: 57 | if use_proxy_choice == 1: 58 | async with ClientSession(timeout=ClientTimeout(total=30)) as session: 59 | async with session.get("https://raw.githubusercontent.com/monosans/proxy-list/refs/heads/main/proxies/http.txt") as response: 60 | response.raise_for_status() 61 | content = await response.text() 62 | with open(filename, 'w') as f: 63 | f.write(content) 64 | self.proxies = [line.strip() for line in content.splitlines() if line.strip()] 65 | else: 66 | if not os.path.exists(filename): 67 | self.log(f"{Fore.RED + Style.BRIGHT}File {filename} Not Found.{Style.RESET_ALL}") 68 | return 69 | with open(filename, 'r') as f: 70 | self.proxies = [line.strip() for line in f.read().splitlines() if line.strip()] 71 | 72 | if not self.proxies: 73 | self.log(f"{Fore.RED + Style.BRIGHT}No Proxies Found.{Style.RESET_ALL}") 74 | return 75 | 76 | self.log( 77 | f"{Fore.GREEN + Style.BRIGHT}Proxies Total : {Style.RESET_ALL}" 78 | f"{Fore.WHITE + Style.BRIGHT}{len(self.proxies)}{Style.RESET_ALL}" 79 | ) 80 | 81 | except Exception as e: 82 | self.log(f"{Fore.RED + Style.BRIGHT}Failed To Load Proxies: {e}{Style.RESET_ALL}") 83 | self.proxies = [] 84 | 85 | def check_proxy_schemes(self, proxies): 86 | schemes = ["http://", "https://", "socks4://", "socks5://"] 87 | if any(proxies.startswith(scheme) for scheme in schemes): 88 | return proxies 89 | return f"http://{proxies}" 90 | 91 | def get_next_proxy_for_account(self, token): 92 | if token not in self.account_proxies: 93 | if not self.proxies: 94 | return None 95 | proxy = self.check_proxy_schemes(self.proxies[self.proxy_index]) 96 | self.account_proxies[token] = proxy 97 | self.proxy_index = (self.proxy_index + 1) % len(self.proxies) 98 | return self.account_proxies[token] 99 | 100 | def rotate_proxy_for_account(self, token): 101 | if not self.proxies: 102 | return None 103 | proxy = self.check_proxy_schemes(self.proxies[self.proxy_index]) 104 | self.account_proxies[token] = proxy 105 | self.proxy_index = (self.proxy_index + 1) % len(self.proxies) 106 | return proxy 107 | 108 | def build_proxy_config(self, proxy=None): 109 | if not proxy: 110 | return None, None, None 111 | 112 | if proxy.startswith("socks"): 113 | connector = ProxyConnector.from_url(proxy) 114 | return connector, None, None 115 | 116 | elif proxy.startswith("http"): 117 | match = re.match(r"http://(.*?):(.*?)@(.*)", proxy) 118 | if match: 119 | username, password, host_port = match.groups() 120 | clean_url = f"http://{host_port}" 121 | auth = BasicAuth(username, password) 122 | return None, clean_url, auth 123 | else: 124 | return None, proxy, None 125 | 126 | raise Exception("Unsupported Proxy Type.") 127 | 128 | def generate_address(self, account: str): 129 | try: 130 | account = Account.from_key(account) 131 | address = account.address 132 | 133 | return address 134 | except Exception as e: 135 | self.log( 136 | f"{Fore.CYAN+Style.BRIGHT}Status:{Style.RESET_ALL}" 137 | f"{Fore.RED+Style.BRIGHT} Generate Address Failed {Style.RESET_ALL}" 138 | f"{Fore.MAGENTA+Style.BRIGHT}-{Style.RESET_ALL}" 139 | f"{Fore.YELLOW+Style.BRIGHT} {str(e)} {Style.RESET_ALL} " 140 | ) 141 | return None 142 | 143 | def mask_account(self, account): 144 | try: 145 | mask_account = account[:6] + '*' * 6 + account[-6:] 146 | return mask_account 147 | except Exception as e: 148 | return None 149 | 150 | async def get_web3_with_check(self, address: str, use_proxy: bool, retries=3, timeout=60): 151 | request_kwargs = {"timeout": timeout} 152 | 153 | proxy = self.get_next_proxy_for_account(address) if use_proxy else None 154 | 155 | if use_proxy and proxy: 156 | request_kwargs["proxies"] = {"http": proxy, "https": proxy} 157 | 158 | for attempt in range(retries): 159 | try: 160 | web3 = Web3(Web3.HTTPProvider(self.RPC_URL, request_kwargs=request_kwargs)) 161 | web3.eth.get_block_number() 162 | return web3 163 | except Exception as e: 164 | if attempt < retries - 1: 165 | await asyncio.sleep(3) 166 | continue 167 | raise Exception(f"Failed to Connect to RPC: {str(e)}") 168 | 169 | async def get_token_balance(self, address: str, use_proxy: bool): 170 | try: 171 | web3 = await self.get_web3_with_check(address, use_proxy) 172 | balance = web3.eth.get_balance(address) 173 | token_balance = balance / (10 ** 18) 174 | 175 | return token_balance 176 | except Exception as e: 177 | self.log( 178 | f"{Fore.CYAN+Style.BRIGHT} Message :{Style.RESET_ALL}" 179 | f"{Fore.RED+Style.BRIGHT} {str(e)} {Style.RESET_ALL}" 180 | ) 181 | return None 182 | 183 | async def send_raw_transaction_with_retries(self, account, web3, tx, retries=5): 184 | for attempt in range(retries): 185 | try: 186 | signed_tx = web3.eth.account.sign_transaction(tx, account) 187 | raw_tx = web3.eth.send_raw_transaction(signed_tx.raw_transaction) 188 | tx_hash = web3.to_hex(raw_tx) 189 | return tx_hash 190 | except TransactionNotFound: 191 | pass 192 | except Exception as e: 193 | pass 194 | await asyncio.sleep(2 ** attempt) 195 | raise Exception("Transaction Hash Not Found After Maximum Retries") 196 | 197 | async def wait_for_receipt_with_retries(self, web3, tx_hash, retries=5): 198 | for attempt in range(retries): 199 | try: 200 | receipt = await asyncio.to_thread(web3.eth.wait_for_transaction_receipt, tx_hash, timeout=300) 201 | return receipt 202 | except TransactionNotFound: 203 | pass 204 | except Exception as e: 205 | pass 206 | await asyncio.sleep(2 ** attempt) 207 | raise Exception("Transaction Receipt Not Found After Maximum Retries") 208 | 209 | async def perform_transfer(self, account: str, address: str, tx_amount: float, use_proxy: bool): 210 | try: 211 | web3 = await self.get_web3_with_check(address, use_proxy) 212 | 213 | amount_to_wei = web3.to_wei(tx_amount, "ether") 214 | 215 | tx = { 216 | "to": self.RECEIVER, 217 | "value": amount_to_wei, 218 | "gas": 21000, 219 | "maxFeePerGas": web3.to_wei(0.002, "gwei"), 220 | "maxPriorityFeePerGas": web3.to_wei(0.001, "gwei"), 221 | "nonce": self.used_nonce[address], 222 | "chainId": web3.eth.chain_id 223 | } 224 | 225 | tx_hash = await self.send_raw_transaction_with_retries(account, web3, tx) 226 | receipt = await self.wait_for_receipt_with_retries(web3, tx_hash) 227 | 228 | block_number = receipt.blockNumber 229 | self.used_nonce[address] += 1 230 | 231 | return tx_hash, block_number 232 | except Exception as e: 233 | self.log( 234 | f"{Fore.CYAN+Style.BRIGHT} Message :{Style.RESET_ALL}" 235 | f"{Fore.RED+Style.BRIGHT} {str(e)} {Style.RESET_ALL}" 236 | ) 237 | return None, None 238 | 239 | async def print_timer(self): 240 | for remaining in range(random.randint(self.min_delay, self.max_delay), 0, -1): 241 | print( 242 | f"{Fore.CYAN + Style.BRIGHT}[ {datetime.now().astimezone(wib).strftime('%x %X %Z')} ]{Style.RESET_ALL}" 243 | f"{Fore.WHITE + Style.BRIGHT} | {Style.RESET_ALL}" 244 | f"{Fore.BLUE + Style.BRIGHT}Wait For{Style.RESET_ALL}" 245 | f"{Fore.WHITE + Style.BRIGHT} {remaining} {Style.RESET_ALL}" 246 | f"{Fore.BLUE + Style.BRIGHT}Seconds For Next Tx...{Style.RESET_ALL}", 247 | end="\r", 248 | flush=True 249 | ) 250 | await asyncio.sleep(1) 251 | 252 | def print_question(self): 253 | 254 | while True: 255 | try: 256 | tx_count = int(input(f"{Fore.YELLOW + Style.BRIGHT}Tx Count For Each Wallet -> {Style.RESET_ALL}").strip()) 257 | if tx_count > 0: 258 | self.tx_count = tx_count 259 | break 260 | else: 261 | print(f"{Fore.RED + Style.BRIGHT}Tx Count must be > 0.{Style.RESET_ALL}") 262 | except ValueError: 263 | print(f"{Fore.RED + Style.BRIGHT}Invalid input. Enter a number.{Style.RESET_ALL}") 264 | 265 | while True: 266 | try: 267 | min_amount = float(input(f"{Fore.YELLOW + Style.BRIGHT}Enter Min Tx Amount ( ETH Sepolia ) [1 or 0.01 or 0.001, etc in decimals] -> {Style.RESET_ALL}").strip()) 268 | if min_amount > 0: 269 | self.min_amount = min_amount 270 | break 271 | else: 272 | print(f"{Fore.RED + Style.BRIGHT}Amount must be > 0.{Style.RESET_ALL}") 273 | except ValueError: 274 | print(f"{Fore.RED + Style.BRIGHT}Invalid input. Enter a float or decimal number.{Style.RESET_ALL}") 275 | 276 | while True: 277 | try: 278 | max_amount = float(input(f"{Fore.YELLOW + Style.BRIGHT}Enter Max TX Amount ( ETH Sepolia ) [1 or 0.01 or 0.001, etc in decimals] -> {Style.RESET_ALL}").strip()) 279 | if max_amount >= min_amount: 280 | self.max_amount = max_amount 281 | break 282 | else: 283 | print(f"{Fore.RED + Style.BRIGHT}Amount must be >= min tx amount.{Style.RESET_ALL}") 284 | except ValueError: 285 | print(f"{Fore.RED + Style.BRIGHT}Invalid input. Enter a float or decimal number.{Style.RESET_ALL}") 286 | 287 | while True: 288 | try: 289 | min_delay = int(input(f"{Fore.YELLOW + Style.BRIGHT}Min Delay For Each Tx -> {Style.RESET_ALL}").strip()) 290 | if min_delay >= 0: 291 | self.min_delay = min_delay 292 | break 293 | else: 294 | print(f"{Fore.RED + Style.BRIGHT}Min Delay must be >= 0.{Style.RESET_ALL}") 295 | except ValueError: 296 | print(f"{Fore.RED + Style.BRIGHT}Invalid input. Enter a number.{Style.RESET_ALL}") 297 | 298 | while True: 299 | try: 300 | max_delay = int(input(f"{Fore.YELLOW + Style.BRIGHT}Max Delay For Each Tx -> {Style.RESET_ALL}").strip()) 301 | if max_delay >= min_delay: 302 | self.max_delay = max_delay 303 | break 304 | else: 305 | print(f"{Fore.RED + Style.BRIGHT}Max Delay must be >= Min Delay.{Style.RESET_ALL}") 306 | except ValueError: 307 | print(f"{Fore.RED + Style.BRIGHT}Invalid input. Enter a number.{Style.RESET_ALL}") 308 | 309 | while True: 310 | try: 311 | print(f"{Fore.WHITE + Style.BRIGHT}1. Run With Free Proxyscrape Proxy{Style.RESET_ALL}") 312 | print(f"{Fore.WHITE + Style.BRIGHT}2. Run With Private Proxy{Style.RESET_ALL}") 313 | print(f"{Fore.WHITE + Style.BRIGHT}3. Run Without Proxy{Style.RESET_ALL}") 314 | choose = int(input(f"{Fore.BLUE + Style.BRIGHT}Choose [1/2/3] -> {Style.RESET_ALL}").strip()) 315 | 316 | if choose in [1, 2, 3]: 317 | proxy_type = ( 318 | "With Free Proxyscrape" if choose == 1 else 319 | "With Private" if choose == 2 else 320 | "Without" 321 | ) 322 | print(f"{Fore.GREEN + Style.BRIGHT}Run {proxy_type} Proxy Selected.{Style.RESET_ALL}") 323 | break 324 | else: 325 | print(f"{Fore.RED + Style.BRIGHT}Please enter either 1, 2 or 3.{Style.RESET_ALL}") 326 | except ValueError: 327 | print(f"{Fore.RED + Style.BRIGHT}Invalid input. Enter a number (1, 2 or 3).{Style.RESET_ALL}") 328 | 329 | rotate = False 330 | if choose in [1, 2]: 331 | while True: 332 | rotate = input(f"{Fore.BLUE + Style.BRIGHT}Rotate Invalid Proxy? [y/n] -> {Style.RESET_ALL}").strip() 333 | 334 | if rotate in ["y", "n"]: 335 | rotate = rotate == "y" 336 | break 337 | else: 338 | print(f"{Fore.RED + Style.BRIGHT}Invalid input. Enter 'y' or 'n'.{Style.RESET_ALL}") 339 | 340 | return choose, rotate 341 | 342 | async def check_connection(self, proxy_url=None): 343 | connector, proxy, proxy_auth = self.build_proxy_config(proxy_url) 344 | try: 345 | async with ClientSession(connector=connector, timeout=ClientTimeout(total=10)) as session: 346 | async with session.get(url="https://api.ipify.org?format=json", proxy=proxy, proxy_auth=proxy_auth) as response: 347 | response.raise_for_status() 348 | return True 349 | except (Exception, ClientResponseError) as e: 350 | self.log( 351 | f"{Fore.CYAN+Style.BRIGHT}Status:{Style.RESET_ALL}" 352 | f"{Fore.RED+Style.BRIGHT} Connection Not 200 OK {Style.RESET_ALL}" 353 | f"{Fore.MAGENTA+Style.BRIGHT}-{Style.RESET_ALL}" 354 | f"{Fore.YELLOW+Style.BRIGHT} {str(e)} {Style.RESET_ALL}" 355 | ) 356 | return None 357 | 358 | async def process_check_connection(self, address: int, use_proxy: bool, rotate_proxy: bool): 359 | while True: 360 | proxy = self.get_next_proxy_for_account(address) if use_proxy else None 361 | self.log( 362 | f"{Fore.CYAN + Style.BRIGHT}Proxy :{Style.RESET_ALL}" 363 | f"{Fore.WHITE + Style.BRIGHT} {proxy} {Style.RESET_ALL}" 364 | ) 365 | 366 | is_valid = await self.check_connection(proxy) 367 | if not is_valid: 368 | if rotate_proxy: 369 | proxy = self.rotate_proxy_for_account(address) 370 | continue 371 | 372 | return False 373 | 374 | return True 375 | 376 | async def process_perform_transfer(self, account: str, address: str, tx_amount: float, use_proxy: bool): 377 | tx_hash, block_number = await self.perform_transfer(account, address, tx_amount, use_proxy) 378 | if tx_hash and block_number: 379 | explorer = f"https://sepolia.etherscan.io/tx/{tx_hash}" 380 | self.log( 381 | f"{Fore.CYAN+Style.BRIGHT} Status :{Style.RESET_ALL}" 382 | f"{Fore.GREEN+Style.BRIGHT} Success {Style.RESET_ALL}" 383 | ) 384 | self.log( 385 | f"{Fore.CYAN+Style.BRIGHT} Block :{Style.RESET_ALL}" 386 | f"{Fore.WHITE+Style.BRIGHT} {block_number} {Style.RESET_ALL}" 387 | ) 388 | self.log( 389 | f"{Fore.CYAN+Style.BRIGHT} Tx Hash :{Style.RESET_ALL}" 390 | f"{Fore.WHITE+Style.BRIGHT} {tx_hash} {Style.RESET_ALL}" 391 | ) 392 | self.log( 393 | f"{Fore.CYAN+Style.BRIGHT} Explorer:{Style.RESET_ALL}" 394 | f"{Fore.WHITE+Style.BRIGHT} {explorer} {Style.RESET_ALL}" 395 | ) 396 | else: 397 | self.log( 398 | f"{Fore.CYAN+Style.BRIGHT} Status :{Style.RESET_ALL}" 399 | f"{Fore.RED+Style.BRIGHT} Perform On-Chain Failed {Style.RESET_ALL}" 400 | ) 401 | 402 | async def process_accounts(self, account: str, address: str, use_proxy: bool, rotate_proxy: bool): 403 | is_valid = await self.process_check_connection(address, use_proxy, rotate_proxy) 404 | if is_valid: 405 | web3 = await self.get_web3_with_check(address, use_proxy) 406 | if not web3: 407 | self.log( 408 | f"{Fore.CYAN + Style.BRIGHT}Status:{Style.RESET_ALL}" 409 | f"{Fore.RED + Style.BRIGHT} Web3 Not Connected {Style.RESET_ALL}" 410 | ) 411 | return 412 | 413 | self.used_nonce[address] = web3.eth.get_transaction_count(address, "pending") 414 | 415 | for i in range(self.tx_count): 416 | self.log( 417 | f"{Fore.MAGENTA+Style.BRIGHT} ● {Style.RESET_ALL}" 418 | f"{Fore.GREEN+Style.BRIGHT}Transfer{Style.RESET_ALL}" 419 | f"{Fore.WHITE+Style.BRIGHT} {i+1} {Style.RESET_ALL}" 420 | f"{Fore.MAGENTA+Style.BRIGHT}Of{Style.RESET_ALL}" 421 | f"{Fore.WHITE+Style.BRIGHT} {self.tx_count} {Style.RESET_ALL} " 422 | ) 423 | 424 | balance = await self.get_token_balance(address, use_proxy) 425 | 426 | tx_amount = round(random.uniform(self.min_amount, self.max_amount), 7) 427 | 428 | self.log( 429 | f"{Fore.CYAN+Style.BRIGHT} Balance :{Style.RESET_ALL}" 430 | f"{Fore.WHITE+Style.BRIGHT} {balance} ETH Sepolia {Style.RESET_ALL}" 431 | ) 432 | self.log( 433 | f"{Fore.CYAN+Style.BRIGHT} Amount :{Style.RESET_ALL}" 434 | f"{Fore.WHITE+Style.BRIGHT} {tx_amount} ETH Sepolia {Style.RESET_ALL}" 435 | ) 436 | self.log( 437 | f"{Fore.CYAN+Style.BRIGHT} Receiver:{Style.RESET_ALL}" 438 | f"{Fore.WHITE+Style.BRIGHT} {self.RECEIVER} {Style.RESET_ALL}" 439 | ) 440 | 441 | if not balance or balance <= tx_amount: 442 | self.log( 443 | f"{Fore.CYAN+Style.BRIGHT} Status :{Style.RESET_ALL}" 444 | f"{Fore.YELLOW+Style.BRIGHT} Insufficient ETH Sepolia Token Balance {Style.RESET_ALL}" 445 | ) 446 | return 447 | 448 | await self.process_perform_transfer(account, address, tx_amount, use_proxy) 449 | await self.print_timer() 450 | 451 | async def main(self): 452 | try: 453 | with open('accounts.txt', 'r') as file: 454 | accounts = [line.strip() for line in file if line.strip()] 455 | 456 | use_proxy_choice, rotate_proxy = self.print_question() 457 | 458 | use_proxy = False 459 | if use_proxy_choice in [1, 2]: 460 | use_proxy = True 461 | 462 | while True: 463 | self.clear_terminal() 464 | self.welcome() 465 | self.log( 466 | f"{Fore.GREEN + Style.BRIGHT}Account's Total: {Style.RESET_ALL}" 467 | f"{Fore.WHITE + Style.BRIGHT}{len(accounts)}{Style.RESET_ALL}" 468 | ) 469 | 470 | if use_proxy: 471 | await self.load_proxies(use_proxy_choice) 472 | 473 | separator = "=" * 25 474 | for account in accounts: 475 | if account: 476 | address = self.generate_address(account) 477 | 478 | self.log( 479 | f"{Fore.CYAN + Style.BRIGHT}{separator}[{Style.RESET_ALL}" 480 | f"{Fore.WHITE + Style.BRIGHT} {self.mask_account(address)} {Style.RESET_ALL}" 481 | f"{Fore.CYAN + Style.BRIGHT}]{separator}{Style.RESET_ALL}" 482 | ) 483 | 484 | if not address: 485 | self.log( 486 | f"{Fore.CYAN + Style.BRIGHT}Status:{Style.RESET_ALL}" 487 | f"{Fore.RED + Style.BRIGHT} Invalid Private Key or Library Version Not Supported {Style.RESET_ALL}" 488 | ) 489 | continue 490 | 491 | await self.process_accounts(account, address, use_proxy, rotate_proxy) 492 | await asyncio.sleep(3) 493 | 494 | self.log(f"{Fore.CYAN + Style.BRIGHT}={Style.RESET_ALL}"*72) 495 | seconds = 24 * 60 * 60 496 | while seconds > 0: 497 | formatted_time = self.format_seconds(seconds) 498 | print( 499 | f"{Fore.CYAN+Style.BRIGHT}[ Wait for{Style.RESET_ALL}" 500 | f"{Fore.WHITE+Style.BRIGHT} {formatted_time} {Style.RESET_ALL}" 501 | f"{Fore.CYAN+Style.BRIGHT}... ]{Style.RESET_ALL}" 502 | f"{Fore.WHITE+Style.BRIGHT} | {Style.RESET_ALL}" 503 | f"{Fore.BLUE+Style.BRIGHT}All Accounts Have Been Processed.{Style.RESET_ALL}", 504 | end="\r" 505 | ) 506 | await asyncio.sleep(1) 507 | seconds -= 1 508 | 509 | except FileNotFoundError: 510 | self.log(f"{Fore.RED}File 'accounts.txt' Not Found.{Style.RESET_ALL}") 511 | return 512 | except Exception as e: 513 | self.log(f"{Fore.RED+Style.BRIGHT}Error: {e}{Style.RESET_ALL}") 514 | raise e 515 | 516 | if __name__ == "__main__": 517 | try: 518 | bot = Turnkey() 519 | asyncio.run(bot.main()) 520 | except KeyboardInterrupt: 521 | print( 522 | f"{Fore.CYAN + Style.BRIGHT}[ {datetime.now().astimezone(wib).strftime('%x %X %Z')} ]{Style.RESET_ALL}" 523 | f"{Fore.WHITE + Style.BRIGHT} | {Style.RESET_ALL}" 524 | f"{Fore.RED + Style.BRIGHT}[ EXIT ] Turnkey - BOT{Style.RESET_ALL} " 525 | ) --------------------------------------------------------------------------------