├── pvkey.txt ├── address.txt ├── addressERC20.txt ├── contractNFT.txt ├── contractERC20.txt ├── requirements.txt ├── proxies.txt ├── README-VN.md ├── README.md └── main.py /pvkey.txt: -------------------------------------------------------------------------------- 1 | PRIVATEKEY 1 2 | PRIVATEKEY 2 3 | PRIVATEKEY 3 4 | ... 5 | -------------------------------------------------------------------------------- /address.txt: -------------------------------------------------------------------------------- 1 | ADDRESS SENDTX 1 2 | ADDRESS SENDTX 2 3 | ADDRESS SENDTX 3 4 | ... 5 | -------------------------------------------------------------------------------- /addressERC20.txt: -------------------------------------------------------------------------------- 1 | ADDRESS SEND-ERC20 1 2 | ADDRESS SEND-ERC20 2 3 | ADDRESS SEND-ERC20 3 4 | ... 5 | -------------------------------------------------------------------------------- /contractNFT.txt: -------------------------------------------------------------------------------- 1 | ADDRESS CONTRACT NFT 1 2 | ADDRESS CONTRACT NFT 2 3 | ADDRESS CONTRACT NFT 3 4 | ... 5 | -------------------------------------------------------------------------------- /contractERC20.txt: -------------------------------------------------------------------------------- 1 | ADDRESS CONTRACT-ERC20 1 2 | ADDRESS CONTRACT-ERC20 2 3 | ADDRESS CONTRACT-ERC20 3 4 | ... 5 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | inquirer 2 | web3 3 | colorama 4 | py-solc-x 5 | eth-account 6 | aiohttp 7 | loguru 8 | aiohttp_socks 9 | -------------------------------------------------------------------------------- /proxies.txt: -------------------------------------------------------------------------------- 1 | PROXY 1 [socks5://user:pass@host:port ,...] 2 | PROXY 2 [socks5://user:pass@host:port ,...] 3 | PROXY 3 [socks5://user:pass@host:port ,...] 4 | ... 5 | -------------------------------------------------------------------------------- /README-VN.md: -------------------------------------------------------------------------------- 1 | # Inco Testnet Scripts 2 | 3 | Bộ sưu tập các script Python được thiết kế để tương tác với **Inco Testnet**, một mạng thử nghiệm blockchain dành cho các ứng dụng phi tập trung. Script chính, `main.py`, cung cấp giao diện dòng lệnh (CLI) thân thiện để thực hiện các thao tác như mint token, shield/unshield USDC, triển khai hợp đồng thông minh và gửi giao dịch. Được xây dựng bằng `web3.py`, các script này hỗ trợ thực thi không đồng bộ và cung cấp đầu ra song ngữ (tiếng Anh và tiếng Việt). 4 | 5 | ## ✨ Tính năng 6 | 7 | ### Tính năng chung 8 | 9 | - **Hỗ trợ đa tài khoản**: Thực hiện các thao tác trên nhiều ví bằng khóa riêng từ file `pvkey.txt`. 10 | - **Giao diện CLI màu sắc**: Sử dụng `colorama` để tạo đầu ra sinh động với viền và màu sắc. 11 | - **Thực thi không đồng bộ**: Tận dụng `asyncio` để tương tác blockchain hiệu quả. 12 | - **Xử lý lỗi mạnh mẽ**: Phát hiện và báo cáo lỗi giao dịch blockchain và RPC. 13 | - **Hỗ trợ song ngữ**: Hỗ trợ đầu ra bằng tiếng Anh và tiếng Việt tùy theo lựa chọn người dùng. 14 | - **Hỗ trợ proxy**: Tùy chọn sử dụng proxy qua file `proxies.txt` cho các yêu cầu mạng. 15 | 16 | ### Các Script Bao Gồm 17 | 18 | 1. **Mint USDC**: Mint token USDC trên Inco Testnet. 19 | 2. **Mint cUSDC**: Mint token cUSDC trên Inco Testnet. 20 | 3. **Shield USDC ➯ cUSDC**: Chuyển đổi USDC thành cUSDC thông qua hợp đồng shielding. 21 | 4. **Unshield cUSDC ➯ USDC**: Chuyển đổi cUSDC trở lại USDC thông qua hợp đồng unshielding. 22 | 5. **Triển Khai Hợp Đồng Thông Minh Mintair**: Triển khai hợp đồng thông minh Mintair trên Inco Testnet. 23 | 6. **Gửi TX (Ngẫu nhiên hoặc File)**: Gửi giao dịch ngẫu nhiên hoặc đến các địa chỉ trong `address.txt`. 24 | 7. **Triển Khai Hợp Đồng Token**: Triển khai hợp đồng token ERC20 trên Inco Testnet. 25 | 8. **Gửi Token ERC20 (Ngẫu nhiên hoặc File)**: Gửi token ERC20 đến các địa chỉ ngẫu nhiên hoặc trong `addressERC20.txt`. 26 | 9. **Triển Khai Hợp Đồng NFT**: Triển khai hợp đồng thông minh NFT trên Inco Testnet. 27 | 28 | ## 🛠 Yêu cầu trước khi sử dụng 29 | 30 | Đảm bảo các yêu cầu sau được cài đặt và cấu hình: 31 | 32 | - **Python**: Phiên bản 3.8 trở lên. 33 | - **pip**: Trình quản lý gói Python. 34 | - **Các gói phụ thuộc**: Cài đặt qua `pip install -r requirements.txt`. Các gói cần thiết bao gồm: ( `web3.py`, `colorama`, `asyncio`, `eth-account`, `aiohttp_socks` and `inquirer` ). 35 | - **pvkey.txt**: File chứa khóa riêng (mỗi dòng một khóa) để tự động hóa ví. 36 | - **Inco Testnet RPC**: Truy cập vào RPC của Inco Testnet (ví dụ: `https://sepolia.base.org` hoặc RPC dành riêng cho Inco). 37 | - **proxies.txt** (tùy chọn): Địa chỉ proxy cho các yêu cầu mạng. 38 | 39 | ## 📦 Cài đặt 40 | 41 | Thực hiện các bước sau để thiết lập dự án: 42 | 43 | 1. **Clone this repository:** 44 | - Mở cmd hoặc Shell, sau đó chạy lệnh: 45 | ```sh 46 | git clone https://github.com/thog9/Inco-testnet.git 47 | ``` 48 | ```sh 49 | cd Inco-testnet 50 | ``` 51 | 2. **Install Dependencies:** 52 | - Mở cmd hoặc Shell, sau đó chạy lệnh: 53 | ```sh 54 | pip install -r requirements.txt 55 | ``` 56 | 3. **Prepare Input Files:** 57 | - Mở `pvkey.txt`: Thêm khóa riêng của bạn (mỗi dòng một khóa) vào thư mục gốc. 58 | ```sh 59 | nano pvkey.txt 60 | ``` 61 | - Mở `address.txt`(tùy chọn): Thêm địa chỉ người nhận (mỗi dòng một khóa) cho `sendtx.py`, `nftcollection.py`, `deploytoken.py`, `sendtoken.py`, `proxies.txt`. 62 | ```sh 63 | nano address.txt 64 | ``` 65 | ```sh 66 | nano addressERC20.txt 67 | ``` 68 | ```sh 69 | nano contractNFT.txt 70 | ``` 71 | ```sh 72 | nano proxies.txt 73 | ``` 74 | ```sh 75 | nano contractERC20.txt 76 | ``` 77 | 4. **Run:** 78 | - Mở cmd hoặc Shell, sau đó chạy lệnh: 79 | ```sh 80 | python main.py 81 | ``` 82 | - Chọn ngôn ngữ (Tiếng Việt/Tiếng Anh). 83 | 84 | ## Liên hệ 85 | 86 | - **Telegram**: [thog099](https://t.me/thog099) 87 | - **Channel**: [CHANNEL](https://t.me/thogairdrops) 88 | - **Group**: [GROUP CHAT](https://t.me/thogchats) 89 | - **X**: [Thog](https://x.com/thog099) 90 | 91 | ---- 92 | 93 | BUYMECAFE: [BUY ME CAFE](https://buymecafe.vercel.app/) 94 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Inco Testnet Scripts 2 | 3 | This repository contains a collection of Python scripts designed to interact with the Inco Testnet, a blockchain test network for decentralized applications. The main script, main.py, provides a user-friendly command-line interface (CLI) to execute various operations on the Inco Testnet, such as minting tokens, shielding/unshielding USDC, deploying smart contracts, and sending transactions. Built with web3.py, the scripts support asynchronous execution and offer bilingual output (English and Vietnamese) for enhanced user interaction. 4 | 5 | Faucet: [Herafi Testnet Faucet](https://testnet.herafi.xyz/faucet) 6 | 7 | ## ✨ Features Overview 8 | 9 | ### General Features 10 | 11 | - **Multi-Account Support**: Reads private keys from `pvkey.txt` to perform actions across multiple accounts. 12 | - **Colorful CLI**: Uses `colorama` for visually appealing output with colored text and borders. 13 | - **Asynchronous Execution**: Built with `asyncio` for efficient blockchain interactions. 14 | - **Error Handling**: Comprehensive error catching for blockchain transactions and RPC issues. 15 | - **Bilingual Support**: Supports both English and Vietnamese output based on user selection. 16 | 17 | ### Included Scripts 18 | 19 | 1. **Mint USDC**: Mints USDC tokens on the Inco Testnet. 20 | 2. **Mint cUSDC**: Mints cUSDC tokens on the Inco Testnet. 21 | 3.**Shield USDC ➯ cUSDC**: Converts USDC to cUSDC via a shielding contract. 22 | 4.**Unshield cUSDC ➯ USDC**: Converts cUSDC back to USDC via an unshielding contract. 23 | 5.**Deploy Smart Contract Mintair**: Deploys the Mintair smart contract on the Inco Testnet. 24 | 6.**Send TX (Random or File)**: Sends random transactions or transactions to addresses listed in `address.txt`. 25 | 7.**Deploy Token Smart Contract**: Deploys an ERC20 token smart contract on the Inco Testnet. 26 | 8.**Send Token ERC20 (Random or File)**: Sends ERC20 tokens to random addresses or addresses listed in `addressERC20.txt`. 27 | 9.**Deploy NFT Smart Contract**: Deploys an NFT smart contract on the Inco Testnet. 28 | 29 | ## Prerequisites 30 | 31 | Before running the scripts, ensure you have the following installed: 32 | 33 | - Python 3.8+ 34 | - `pip` (Python package manager) 35 | - **Dependencies**: Install via `pip install -r requirements.txt` (ensure `web3.py`, `colorama`, `asyncio`, `eth-account`, `aiohttp_socks` and `inquirer` are included). 36 | - **pvkey.txt**: Add private keys (one per line) for wallet automation. 37 | - Access to the Inco Testnet RPC (e.g., https://sepolia.base.org or Inco-specific RPC). 38 | - **proxies.txt** (optional): Add proxy addresses for network requests, if needed. 39 | 40 | ## Installation 41 | 42 | 1. **Clone this repository:** 43 | - Open cmd or Shell, then run the command: 44 | ```sh 45 | git clone https://github.com/thog9/Inco-testnet.git 46 | ``` 47 | ```sh 48 | cd Inco-testnet 49 | ``` 50 | 2. **Install Dependencies:** 51 | - Open cmd or Shell, then run the command: 52 | ```sh 53 | pip install -r requirements.txt 54 | ``` 55 | 3. **Prepare Input Files:** 56 | - Open the `pvkey.txt`: Add your private keys (one per line) in the root directory. 57 | ```sh 58 | nano pvkey.txt 59 | ``` 60 | - Open the `address.txt`(optional): Add recipient addresses (one per line) for `sendtx.py`, `nftcollection.py`, `deploytoken.py`, `sendtoken.py`, `proxies.txt`. 61 | ```sh 62 | nano address.txt 63 | ``` 64 | ```sh 65 | nano addressERC20.txt 66 | ``` 67 | ```sh 68 | nano contractNFT.txt 69 | ``` 70 | ```sh 71 | nano proxies.txt 72 | ``` 73 | ```sh 74 | nano contractERC20.txt 75 | ``` 76 | 4. **Run:** 77 | - Open cmd or Shell, then run command: 78 | ```sh 79 | python main.py 80 | ``` 81 | - Choose a language (Vietnamese/English). 82 | 83 | ## Contact 84 | 85 | - **Telegram**: [thog099](https://t.me/thog099) 86 | - **Channel**: [CHANNEL](https://t.me/thogairdrops) 87 | - **Group**: [GROUP CHAT](https://t.me/thogchats) 88 | - **X**: [Thog](https://x.com/thog099) 89 | 90 | ---- 91 | 92 | BUYMECAFE: [BUY ME CAFE](https://buymecafe.vercel.app/) 93 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import asyncio 4 | from colorama import init, Fore, Style 5 | import inquirer 6 | 7 | # Khởi tạo colorama 8 | init(autoreset=True) 9 | 10 | # Độ rộng viền cố định 11 | BORDER_WIDTH = 80 12 | 13 | # Hàm hiển thị viền đẹp mắt 14 | def print_border(text: str, color=Fore.CYAN, width=BORDER_WIDTH): 15 | text = text.strip() 16 | if len(text) > width - 4: 17 | text = text[:width - 7] + "..." # Cắt dài và thêm "..." 18 | padded_text = f" {text} ".center(width - 2) 19 | print(f"{color}┌{'─' * (width - 2)}┐{Style.RESET_ALL}") 20 | print(f"{color}│{padded_text}│{Style.RESET_ALL}") 21 | print(f"{color}└{'─' * (width - 2)}┘{Style.RESET_ALL}") 22 | 23 | # Hàm hiển thị banner 24 | def _banner(): 25 | banner = r""" 26 | 27 | 28 | ░█████╗░░██████╗░  ░██████╗░░█████╗░██╗░░░░░██╗██╗░░░░░███████╗░█████╗░  ██╗░░░██╗██████╗░ 29 | ██╔══██╗██╔════╝░  ██╔════╝░██╔══██╗██║░░░░░██║██║░░░░░██╔════╝██╔══██╗  ██║░░░██║╚════██╗ 30 | ██║░░██║██║░░██╗░  ██║░░██╗░███████║██║░░░░░██║██║░░░░░█████╗░░██║░░██║  ╚██╗░██╔╝░█████╔╝ 31 | ██║░░██║██║░░╚██╗  ██║░░╚██╗██╔══██║██║░░░░░██║██║░░░░░██╔══╝░░██║░░██║  ░╚████╔╝░░╚═══██╗ 32 | ╚█████╔╝╚██████╔╝  ╚██████╔╝██║░░██║███████╗██║███████╗███████╗╚█████╔╝  ░░╚██╔╝░░██████╔╝ 33 | ░╚════╝░░╚═════╝░  ░╚═════╝░╚═╝░░╚═╝╚══════╝╚═╝╚══════╝╚══════╝░╚════╝░  ░░░╚═╝░░░╚═════╝░ 34 | 35 | 36 | """ 37 | print(f"{Fore.GREEN}{banner:^80}{Style.RESET_ALL}") 38 | print(f"{Fore.GREEN}{'═' * BORDER_WIDTH}{Style.RESET_ALL}") 39 | print_border("INCO TESTNET", Fore.GREEN) 40 | print(f"{Fore.YELLOW}│ {'Liên hệ / Contact'}: {Fore.CYAN}https://t.me/thog099{Style.RESET_ALL}") 41 | print(f"{Fore.YELLOW}│ {'Replit'}: {Fore.CYAN}Thog{Style.RESET_ALL}") 42 | print(f"{Fore.YELLOW}│ {'Channel Telegram'}: {Fore.CYAN}https://t.me/thogairdrops{Style.RESET_ALL}") 43 | print(f"{Fore.GREEN}{'═' * BORDER_WIDTH}{Style.RESET_ALL}") 44 | 45 | # Hàm xóa màn hình 46 | def _clear(): 47 | os.system('cls' if os.name == 'nt' else 'clear') 48 | 49 | # Các hàm giả lập cho các lệnh mới 50 | async def run_mintusdc(language: str): 51 | from scripts.mintusdc import run_mintusdc as mintusdc_run 52 | await mintusdc_run(language) 53 | 54 | async def run_mintcusdc(language: str): 55 | from scripts.mintcusdc import run_mintcusdc as mintcusdc_run 56 | await mintcusdc_run(language) 57 | 58 | async def run_shieldusdc(language: str): 59 | from scripts.shieldusdc import run_shieldusdc as shieldusdc_run 60 | await shieldusdc_run(language) 61 | 62 | async def run_unshieldcusdc(language: str): 63 | from scripts.unshieldcusdc import run_unshieldusdc as unshieldcusdc_run 64 | await unshieldcusdc_run(language) 65 | 66 | async def run_mintair(language: str): 67 | from scripts.mintair import run_mintair as mintair_run 68 | await mintair_run(language) 69 | 70 | async def run_deploytoken(language: str): 71 | from scripts.deploytoken import run_deploytoken as deploytoken_run 72 | await deploytoken_run(language) 73 | 74 | async def run_sendtoken(language: str): 75 | from scripts.sendtoken import run_sendtoken as sendtoken_run 76 | await sendtoken_run(language) 77 | 78 | async def run_nftcollection(language: str): 79 | from scripts.nftcollection import run_nftcollection as nftcollection_run 80 | await nftcollection_run(language) 81 | 82 | async def run_sendtx(language: str): 83 | from scripts.sendtx import run_sendtx as sendtx_run 84 | await sendtx_run(language) 85 | 86 | async def cmd_exit(language: str): 87 | messages = {"vi": "Đang thoát...", "en": "Exiting..."} 88 | print_border(messages[language], Fore.GREEN) 89 | sys.exit(0) 90 | 91 | # Danh sách lệnh menu 92 | SCRIPT_MAP = { 93 | "mintusdc": run_mintusdc, 94 | "mintcusdc": run_mintcusdc, 95 | "shieldusdc": run_shieldusdc, 96 | "unshieldcusdc": run_unshieldcusdc, 97 | "mintair": run_mintair, 98 | "sendtx": run_sendtx, 99 | "deploytoken": run_deploytoken, 100 | "sendtoken": run_sendtoken, 101 | "nftcollection": run_nftcollection, 102 | "exit": cmd_exit 103 | } 104 | 105 | # Danh sách script và thông báo theo ngôn ngữ 106 | def get_available_scripts(language): 107 | scripts = { 108 | 'vi': [ 109 | {"name": "1. Mint USDC │ Inco Testnet", "value": "mintusdc"}, 110 | {"name": "2. Mint cUSDC │ Inco Testnet", "value": "mintcusdc"}, 111 | {"name": "3. Shield USDC ➯ cUSDC │ Inco Testnet", "value": "shieldusdc"}, 112 | {"name": "4. Unshield cUSDC ➯ USDC │ Inco Testnet", "value": "unshieldcusdc"}, 113 | {"name": "5. Deploy Smart Contract Mintair | Inco Testnet", "value": "mintair"}, 114 | {"name": "6. Gửi TX ngẫu nhiên hoặc File (address.txt) | Inco Testnet", "value": "sendtx"}, 115 | {"name": "7. Deploy Token smart-contract | Inco Testnet", "value": "deploytoken"}, 116 | {"name": "8. Gửi Token ERC20 ngẫu nhiên hoặc File (addressERC20.txt) | Inco Testnet", "value": "sendtoken"}, 117 | {"name": "9. Deploy NFT smart-contract | Inco Testnet", "value": "nftcollection"}, 118 | 119 | {"name": "10. Thoát", "value": "exit"}, 120 | ], 121 | 'en': [ 122 | {"name": "1. Mint USDC │ Inco Testnet", "value": "mintusdc"}, 123 | {"name": "2. Mint cUSDC │ Inco Testnet", "value": "mintcusdc"}, 124 | {"name": "3. Shield USDC ➯ cUSDC │ Inco Testnet", "value": "shieldusdc"}, 125 | {"name": "4. Unshield cUSDC ➯ USDC │ Inco Testnet", "value": "unshieldcusdc"}, 126 | {"name": "5. Deploy Smart Contract Mintair | Inco Testnet", "value": "mintair"}, 127 | {"name": "6. Send Random TX or File (address.txt) | Inco Testnet", "value": "sendtx"}, 128 | {"name": "7. Deploy Token smart-contract | Inco Testnet", "value": "deploytoken"}, 129 | {"name": "8. Send ERC20 Token Random or File (addressERC20.txt) | Inco Testnet", "value": "sendtoken"}, 130 | {"name": "9. Deploy NFT smart-contract | Inco Testnet", "value": "nftcollection"}, 131 | 132 | {"name": "10. Exit", "value": "exit"}, 133 | ] 134 | } 135 | return scripts[language] 136 | 137 | def run_script(script_func, language): 138 | """Chạy script bất kể nó là async hay không.""" 139 | if asyncio.iscoroutinefunction(script_func): 140 | asyncio.run(script_func(language)) 141 | else: 142 | script_func(language) 143 | 144 | def select_language(): 145 | while True: 146 | _clear() 147 | _banner() 148 | print(f"{Fore.GREEN}{'═' * BORDER_WIDTH}{Style.RESET_ALL}") 149 | print_border("CHỌN NGÔN NGỮ / SELECT LANGUAGE", Fore.YELLOW) 150 | questions = [ 151 | inquirer.List('language', 152 | message=f"{Fore.CYAN}Vui lòng chọn / Please select:{Style.RESET_ALL}", 153 | choices=[("1. Tiếng Việt", 'vi'), ("2. English", 'en')], 154 | carousel=True) 155 | ] 156 | answer = inquirer.prompt(questions) 157 | if answer and answer['language'] in ['vi', 'en']: 158 | return answer['language'] 159 | print(f"{Fore.RED}❌ {'Lựa chọn không hợp lệ / Invalid choice':^76}{Style.RESET_ALL}") 160 | 161 | def main(): 162 | _clear() 163 | _banner() 164 | language = select_language() 165 | 166 | messages = { 167 | "vi": { 168 | "running": "Đang thực thi: {}", 169 | "completed": "Đã hoàn thành: {}", 170 | "error": "Lỗi: {}", 171 | "press_enter": "Nhấn Enter để tiếp tục...", 172 | "menu_title": "MENU CHÍNH", 173 | "select_script": "Chọn script để chạy" 174 | }, 175 | "en": { 176 | "running": "Running: {}", 177 | "completed": "Completed: {}", 178 | "error": "Error: {}", 179 | "press_enter": "Press Enter to continue...", 180 | "menu_title": "MAIN MENU", 181 | "select_script": "Select script to run" 182 | } 183 | } 184 | 185 | while True: 186 | _clear() 187 | _banner() 188 | print(f"{Fore.YELLOW}{'═' * BORDER_WIDTH}{Style.RESET_ALL}") 189 | print_border(messages[language]["menu_title"], Fore.YELLOW) 190 | print(f"{Fore.CYAN}│ {messages[language]['select_script'].center(BORDER_WIDTH - 4)} │{Style.RESET_ALL}") 191 | 192 | available_scripts = get_available_scripts(language) 193 | questions = [ 194 | inquirer.List('script', 195 | message=f"{Fore.CYAN}{messages[language]['select_script']}{Style.RESET_ALL}", 196 | choices=[script["name"] for script in available_scripts], 197 | carousel=True) 198 | ] 199 | answers = inquirer.prompt(questions) 200 | if not answers: 201 | continue 202 | 203 | selected_script_name = answers['script'] 204 | selected_script_value = next(script["value"] for script in available_scripts if script["name"] == selected_script_name) 205 | 206 | script_func = SCRIPT_MAP.get(selected_script_value) 207 | if script_func is None: 208 | print(f"{Fore.RED}{'═' * BORDER_WIDTH}{Style.RESET_ALL}") 209 | print_border(f"{'Chưa triển khai / Not implemented'}: {selected_script_name}", Fore.RED) 210 | input(f"{Fore.YELLOW}⏎ {messages[language]['press_enter']}{Style.RESET_ALL:^76}") 211 | continue 212 | 213 | try: 214 | print(f"{Fore.CYAN}{'═' * BORDER_WIDTH}{Style.RESET_ALL}") 215 | print_border(messages[language]["running"].format(selected_script_name), Fore.CYAN) 216 | run_script(script_func, language) 217 | print(f"{Fore.GREEN}{'═' * BORDER_WIDTH}{Style.RESET_ALL}") 218 | print_border(messages[language]["completed"].format(selected_script_name), Fore.GREEN) 219 | input(f"{Fore.YELLOW}⏎ {messages[language]['press_enter']}{Style.RESET_ALL:^76}") 220 | except Exception as e: 221 | print(f"{Fore.RED}{'═' * BORDER_WIDTH}{Style.RESET_ALL}") 222 | print_border(messages[language]["error"].format(str(e)), Fore.RED) 223 | input(f"{Fore.YELLOW}⏎ {messages[language]['press_enter']}{Style.RESET_ALL:^76}") 224 | 225 | if __name__ == "__main__": 226 | main() 227 | --------------------------------------------------------------------------------