├── LICENSE ├── README.md ├── accounts.txt ├── index.js ├── package.json └── proxy.txt /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Furqonflynn 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🌀 voltix-bot-js 2 | Voltix Task Automation: Main Tasks , Daily Tasks 3 | 4 | > [!WARNING] 5 | > ## The bot is currently not working! 6 | > ## Cloudflare Protection! 7 | 8 | > [!WARNING] 9 | > The use of this bot is entirely at your own risk. I assume no liability for any losses, damages, or consequences arising from its use. 10 | 11 | ## 🦾 Bot Script Features 12 | 13 | - Complete All Task (Main and Daily Task) 14 | 15 | ## 🔓 Register 16 | 17 | - If you don't have a VOLTIX-AI account yet 18 | - Signup Here [https://voltix.ai/](https://voltix.ai/dashboard/salenodes?ref=AOU0Q) 19 | - Connect With New Solana Wallet 20 | 21 | ## 🤔 How To Do 22 | 23 | - Clone This Repo 24 | - ```bash 25 | git clone https://github.com/cmalf/voltix-bot-js.git 26 | ``` 27 | - Go To Folder 28 | - ```bash 29 | cd voltix-bot-js 30 | ``` 31 | - [Configuration](https://github.com/cmalf/voltix-bot-js/main/README.md#%EF%B8%8F-configuration) 32 | - Run the script 33 | 34 | ```bash 35 | npm install 36 | ``` 37 | ```bash 38 | npm start 39 | ``` 40 | 41 | ## ⚙️ Configuration 42 | 43 | - Add your Account information (Bearer Token) to the accounts.txt file. 44 | - Add proxy to proxy.txt file. 45 | 46 | ## [◉°] ScreenShoot 47 | 48 | 49 | -------------------------------------------------------------------------------- /accounts.txt: -------------------------------------------------------------------------------- 1 | token1 2 | token2 3 | etc -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | /** 4 | ######################################################## 5 | # # 6 | # CODE : VOLTIX Bot v1.0.0 # 7 | # NodeJs: v23.6.1 # 8 | # Author: Furqonflynn (cmalf) # 9 | # TG : https://t.me/furqonflynn # 10 | # GH : https://github.com/cmalf # 11 | # # 12 | ######################################################## 13 | */ 14 | /** 15 | * This code is open-source and welcomes contributions! 16 | * 17 | * If you'd like to add features or improve this code, please follow these steps: 18 | * 1. Fork this repository to your own GitHub account. 19 | * 2. Make your changes in your forked repository. 20 | * 3. Submit a pull request to the original repository. 21 | * 22 | * This allows me to review your contributions and ensure the codebase maintains high quality. 23 | * 24 | * Let's work together to improve this project! 25 | * 26 | * P.S. Remember to always respect the original author's work and avoid plagiarism. 27 | * Let's build a community of ethical and collaborative developers. 28 | */ 29 | 30 | const fs = require('fs'); 31 | const readline = require('readline'); 32 | const axios = require('axios'); 33 | const { HttpsProxyAgent } = require('https-proxy-agent'); 34 | const { SocksProxyAgent } = require('socks-proxy-agent'); 35 | 36 | let CoderMarkPrinted = false; 37 | 38 | const TOKEN_FILE = 'accounts.txt'; 39 | const PROXY_FILE = 'proxy.txt'; 40 | 41 | const Colors = { 42 | Gold: "\x1b[38;5;220m", 43 | Red: "\x1b[31m", 44 | Teal: "\x1b[38;5;51m", 45 | Green: "\x1b[32m", 46 | Neon: "\x1b[38;5;198m", 47 | Blue: "\x1b[34m", 48 | Magenta: "\x1b[95m", 49 | Dim: "\x1b[2m", 50 | Yellow: "\x1b[33m", 51 | RESET: "\x1b[0m" 52 | }; 53 | 54 | function CoderMark() { 55 | if (!CoderMarkPrinted) { 56 | console.log(` 57 | ╭━━━╮╱╱╱╱╱╱╱╱╱╱╱╱╱╭━━━┳╮ 58 | ┃╭━━╯╱╱╱╱╱╱╱╱╱╱╱╱╱┃╭━━┫┃${Colors.Green} 59 | ┃╰━━┳╮╭┳━┳━━┳━━┳━╮┃╰━━┫┃╭╮╱╭┳━╮╭━╮ 60 | ┃╭━━┫┃┃┃╭┫╭╮┃╭╮┃╭╮┫╭━━┫┃┃┃╱┃┃╭╮┫╭╮╮${Colors.Blue} 61 | ┃┃╱╱┃╰╯┃┃┃╰╯┃╰╯┃┃┃┃┃╱╱┃╰┫╰━╯┃┃┃┃┃┃┃ 62 | ╰╯╱╱╰━━┻╯╰━╯┣━━┻╯╰┻╯╱╱╰━┻━╮╭┻╯╰┻╯╰╯${Colors.RESET} 63 | ╱╱╱╱╱╱╱╱╱╱╱┃┃╱╱╱╱╱╱╱╱╱╱╭━╯┃${Colors.Blue}{${Colors.Neon}cmalf${Colors.Blue}}${Colors.RESET} 64 | ╱╱╱╱╱╱╱╱╱╱╱╰╯╱╱╱╱╱╱╱╱╱╱╰━━╯ 65 | \n${Colors.RESET}VOLTIX Bot ${Colors.Blue}{ ${Colors.Neon}JS${Colors.Blue} }${Colors.RESET} 66 | \n${Colors.Green}${'―'.repeat(50)} 67 | \n${Colors.Gold}[+]${Colors.RESET} DM : ${Colors.Teal}https://t.me/furqonflynn 68 | \n${Colors.Gold}[+]${Colors.RESET} GH : ${Colors.Teal}https://github.com/cmalf/ 69 | \n${Colors.Green}${'―'.repeat(50)} 70 | \n${Colors.Gold}]-> ${Colors.Blue}{ ${Colors.RESET}BOT${Colors.Neon} v1.0.0${Colors.Blue} } ${Colors.RESET} 71 | \n${Colors.Green}${'―'.repeat(50)} 72 | `); 73 | CoderMarkPrinted = true; 74 | } 75 | } 76 | 77 | class ProxyError extends Error { 78 | constructor(message, proxy) { 79 | super(message); 80 | this.name = "ProxyError"; 81 | this.proxy = proxy; 82 | } 83 | } 84 | 85 | function maskAddress(address) { 86 | if (!address || address.length <= 12) return address; 87 | return address.substring(0, 6) + ":::" + address.substring(address.length - 6); 88 | } 89 | 90 | function loadTokens() { 91 | try { 92 | const content = fs.readFileSync(TOKEN_FILE, 'utf8'); 93 | return content.split('\n').map(line => line.trim()).filter(Boolean); 94 | } catch (error) { 95 | console.error(Colors.Red, 'Error loading tokens:', error.message, Colors.RESET); 96 | return []; 97 | } 98 | } 99 | 100 | function loadProxies() { 101 | try { 102 | const content = fs.readFileSync(PROXY_FILE, 'utf8'); 103 | return content.split('\n').map(line => line.trim()).filter(Boolean); 104 | } catch (error) { 105 | console.error(Colors.Red, 'Error loading proxies:', error.message, Colors.RESET); 106 | return []; 107 | } 108 | } 109 | 110 | function getRandomProxy(proxies) { 111 | if (!proxies.length) return null; 112 | return proxies[Math.floor(Math.random() * proxies.length)]; 113 | } 114 | 115 | async function createProxyAgent(proxy) { 116 | if (!proxy) { 117 | throw new ProxyError("Proxy URL is required", proxy); 118 | } 119 | try { 120 | if (proxy.startsWith("http://") || proxy.startsWith("https://")) { 121 | return new HttpsProxyAgent(proxy); 122 | } 123 | if (proxy.startsWith("socks://") || proxy.startsWith("socks5://")) { 124 | return new SocksProxyAgent(proxy); 125 | } 126 | throw new ProxyError(`Unsupported proxy protocol: ${proxy}`, proxy); 127 | } catch (error) { 128 | if (error instanceof ProxyError) { 129 | throw error; 130 | } 131 | throw new ProxyError(`Failed to create proxy agent: ${error.message}`, proxy); 132 | } 133 | } 134 | 135 | async function sleep(ms) { 136 | return new Promise(resolve => setTimeout(resolve, ms)); 137 | } 138 | 139 | async function fetchUserIdentity(account) { 140 | try { 141 | const response = await account.api.get('/users'); 142 | if (response.data && response.data.data && response.data.data.raw_address) { 143 | account.raw_address = response.data.data.raw_address; 144 | } else { 145 | console.error(`${Colors.Red}Failed to retrieve identity data for an account.${Colors.RESET}`); 146 | } 147 | } catch (error) { 148 | console.error(`${Colors.Red}Error fetching user identity: ${error.message}${Colors.RESET}`); 149 | } 150 | } 151 | 152 | async function claimTaskWithRetry(taskId, account, maxRetries = 3) { 153 | for (let attempt = 0; attempt <= maxRetries; attempt++) { 154 | try { 155 | const claimResponse = await account.api.post(`/user-tasks/social/${taskId}/claim`); 156 | return claimResponse; 157 | } catch (error) { 158 | if (attempt === maxRetries) { 159 | throw error; 160 | } 161 | console.log(`${Colors.Yellow}Retry attempt ${attempt + 1} for task ${taskId}${Colors.RESET}`); 162 | await sleep(5000); 163 | } 164 | } 165 | } 166 | 167 | async function completeTask(category, account) { 168 | if (!account.raw_address) { 169 | await fetchUserIdentity(account); 170 | } 171 | const maskedAddr = maskAddress(account.raw_address); 172 | console.log(`${Colors.Neon}]> ${Colors.RESET}Processing Account: ${Colors.Teal}${maskedAddr}${Colors.RESET}`); 173 | console.log(`${Colors.Neon}]> ${Colors.Gold}Starting Voltix Bot to Complete Task (${category === 'ONE' ? 'Once Time' : 'Daily'})${Colors.RESET}`); 174 | 175 | try { 176 | const tasksResponse = await account.api.get('/tasks/socials'); 177 | const allTasks = tasksResponse.data.data.filter(task => task.category === category); 178 | 179 | const completedResponse = await account.api.get('/user-tasks/social/completed'); 180 | let completedTasks = completedResponse.data.data; 181 | 182 | const tasksToClaim = completedTasks.filter(t => t.status === 'COMPLETED'); 183 | for (const t of tasksToClaim) { 184 | console.log(`\n${Colors.RESET}${maskedAddr}${Colors.Teal} ]> Task ${Colors.Neon}${t.task_id}${Colors.RESET} has status COMPLETED, attempting claim...`); 185 | await sleep(5000); 186 | try { 187 | const claimResp = await claimTaskWithRetry(t.task_id, account); 188 | if (claimResp.data && claimResp.data.data === 1) { 189 | console.log(`${Colors.RESET}${maskedAddr}${Colors.Teal} ]> ${Colors.Green}Successfully claimed completed task ${Colors.Neon}${t.task_id}${Colors.RESET}\n`); 190 | } else { 191 | console.log(`${Colors.RESET}${maskedAddr}${Colors.Teal} ]> ${Colors.Red}Failed to claim completed task ${Colors.Neon}${t.task_id}${Colors.RESET}\n`); 192 | } 193 | } catch (error) { 194 | console.log(`${Colors.RESET}${maskedAddr}${Colors.Teal} ]> ${Colors.Red}Error claiming completed task ${Colors.Neon}${t.task_id}: ${Colors.Red}${error.message}${Colors.RESET}`); 195 | } 196 | } 197 | 198 | const newCompletedResponse = await account.api.get('/user-tasks/social/completed'); 199 | completedTasks = newCompletedResponse.data.data; 200 | 201 | const tasksToProcess = allTasks.filter(task => { 202 | const completedTask = completedTasks.find(t => t.task_id === task.id); 203 | return !(completedTask && completedTask.status === 'CLAIMED'); 204 | }); 205 | 206 | if (tasksToProcess.length === 0) { 207 | console.log(`\n${Colors.Yellow}No More Tasks for account: ${Colors.Teal}${maskedAddr}${Colors.RESET}! All tasks complete.\n`); 208 | return; 209 | } 210 | 211 | const failedTasks = []; 212 | for (const task of tasksToProcess) { 213 | try { 214 | const verifyResponse = await account.api.post(`/user-tasks/social/verify/${task.id}`, {}); 215 | if (verifyResponse.data.data.status === 'IN_PROGRESS') { 216 | console.log(`\n${Colors.Dim}${'―'.repeat(50)}${Colors.RESET}`); 217 | console.log(`${Colors.RESET}${maskedAddr}${Colors.Teal} ]>${Colors.RESET} Processing Task ID: ${Colors.Neon}${task.id}${Colors.RESET}`); 218 | console.log(`${Colors.RESET}${maskedAddr}${Colors.Teal} ]>${Colors.RESET} Task: ${Colors.Neon}${task.title}${Colors.RESET}`); 219 | console.log(`\n${Colors.Dim}${'―'.repeat(50)}${Colors.RESET}`); 220 | 221 | await sleep(30000); 222 | try { 223 | const claimResponse = await claimTaskWithRetry(task.id, account); 224 | if (claimResponse.data && claimResponse.data.data === 1) { 225 | const newCompletedResponse = await account.api.get('/user-tasks/social/completed'); 226 | const newCompletedTask = newCompletedResponse.data.data.find(t => t.task_id === task.id); 227 | if (newCompletedTask && newCompletedTask.status === 'CLAIMED') { 228 | console.log(`${Colors.Teal}[${maskedAddr}]> ${Colors.Green}Task successfully claimed${Colors.RESET}\n`); 229 | } else { 230 | console.log(`${Colors.Teal}[${maskedAddr}]> ${Colors.Red}Task claim verification failed${Colors.RESET}\n`); 231 | failedTasks.push(task.id); 232 | } 233 | } 234 | } catch (claimError) { 235 | console.log(`${Colors.Teal}[${maskedAddr}]> ${Colors.Red}Error claiming task: ${task.id}${Colors.RESET}`); 236 | failedTasks.push(task.id); 237 | } 238 | } 239 | } catch (error) { 240 | console.log(`${Colors.Teal}[${maskedAddr}]> ${Colors.Red}Error processing task: ${task.id}${Colors.RESET}`); 241 | failedTasks.push(task.id); 242 | } 243 | } 244 | 245 | if (failedTasks.length > 0) { 246 | console.log(`${Colors.Red}[${maskedAddr}]> Retrying failed tasks: ${failedTasks.join(', ')}${Colors.RESET}`); 247 | await completeTask(category, account); 248 | } 249 | } catch (error) { 250 | console.error(`${Colors.Red}[${maskedAddr}]> Error: ${error.message}${Colors.RESET}`); 251 | } 252 | } 253 | 254 | async function fetchRewards(account) { 255 | if (!account.raw_address) { 256 | await fetchUserIdentity(account); 257 | } 258 | const maskedAddr = maskAddress(account.raw_address); 259 | try { 260 | const response = await account.api.get('/stat/rewards'); 261 | if (response.data && response.data.data) { 262 | const rewards = response.data.data; 263 | const totalPoints = rewards.reduce((sum, reward) => sum + (reward.total_points || 0), 0); 264 | 265 | console.log(`\n${Colors.Dim}${'―'.repeat(50)}${Colors.RESET}`); 266 | console.log(`${Colors.RESET}Account Address: ${Colors.Teal}${maskedAddr}${Colors.RESET}`); 267 | console.log(`${Colors.RESET}Total Points : ${Colors.Green}${totalPoints}${Colors.RESET} PTS`); 268 | console.log(`${Colors.Dim}${'―'.repeat(50)}${Colors.RESET}\n`); 269 | } 270 | } catch (error) { 271 | console.error(`${Colors.Red}[${maskedAddr}]> Error fetching rewards: ${error.message}${Colors.RESET}`); 272 | } 273 | } 274 | 275 | function showMenu(accounts) { 276 | const rl = readline.createInterface({ 277 | input: process.stdin, 278 | output: process.stdout 279 | }); 280 | 281 | console.log(`\n${Colors.Teal}=== Voltix Task Automation ===${Colors.RESET}\n`); 282 | console.log(`${Colors.Gold}1. ${Colors.RESET}Complete Main Tasks`); 283 | console.log(`${Colors.Gold}2. ${Colors.RESET}Complete Daily Tasks`); 284 | console.log(`${Colors.Gold}3. ${Colors.Red}Exit${Colors.RESET}\n`); 285 | 286 | rl.question('Select option: ', async (answer) => { 287 | let category; 288 | switch (answer.trim()) { 289 | case '1': 290 | console.clear(); 291 | category = 'ONE'; 292 | break; 293 | case '2': 294 | console.clear(); 295 | category = 'DAILY'; 296 | break; 297 | case '3': 298 | console.log(`${Colors.Teal}Goodbye!${Colors.RESET}`); 299 | process.exit(0); 300 | break; 301 | default: 302 | console.log(`${Colors.Red}Invalid option${Colors.RESET}`); 303 | rl.close(); 304 | return showMenu(accounts); 305 | } 306 | 307 | // Process each account sequentially. 308 | for (const account of accounts) { 309 | await fetchUserIdentity(account); 310 | await fetchRewards(account); 311 | await completeTask(category, account); 312 | } 313 | 314 | rl.close(); 315 | // Redisplay the menu after processing. 316 | showMenu(accounts); 317 | }); 318 | } 319 | 320 | // Main function to initialize accounts. 321 | async function main() { 322 | const tokens = loadTokens(); 323 | const proxies = loadProxies(); 324 | 325 | if (tokens.length === 0) { 326 | console.error(Colors.Red, 'No tokens found. Exiting.', Colors.RESET); 327 | process.exit(1); 328 | } 329 | 330 | const accounts = []; 331 | 332 | for (const token of tokens) { 333 | let agent = null; 334 | const proxyUrl = getRandomProxy(proxies); 335 | if (proxyUrl) { 336 | try { 337 | agent = await createProxyAgent(proxyUrl); 338 | } catch (error) { 339 | console.error(`${Colors.Red}Error with proxy: ${error.message}${Colors.RESET}`); 340 | } 341 | } 342 | const instanceConfig = { 343 | baseURL: 'https://api.voltix.ai', 344 | headers: { 345 | 'Authorization': `Bearer ${token}`, 346 | 'Content-Type': 'application/json', 347 | 'Accept': 'application/json' 348 | } 349 | }; 350 | if (agent) { 351 | instanceConfig.httpAgent = agent; 352 | instanceConfig.httpsAgent = agent; 353 | } 354 | const apiInstance = axios.create(instanceConfig); 355 | accounts.push({ 356 | token, 357 | api: apiInstance, 358 | proxy: proxyUrl || "None" 359 | }); 360 | } 361 | 362 | if (accounts.length === 0) { 363 | console.error(`${Colors.Red}No valid accounts loaded. Exiting.${Colors.RESET}`); 364 | process.exit(1); 365 | } 366 | showMenu(accounts); 367 | } 368 | 369 | console.clear(); 370 | CoderMark(); 371 | main(); 372 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "VOLTIX-BOT-JS", 3 | "version": "1.0.0", 4 | "description": "https://github.com/cmalf/voltix-bot-js", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index.js" 8 | }, 9 | "author": "furqonflynn", 10 | "dependencies": { 11 | "axios": "^1.7.9", 12 | "fs": "^0.0.1-security", 13 | "https-proxy-agent": "^7.0.6", 14 | "readline": "^1.3.0", 15 | "socks-proxy-agent": "^8.0.5" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /proxy.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cmalf/voltix-bot-js/d92012dcf766554298436e5367087884e030ce36/proxy.txt --------------------------------------------------------------------------------