├── .github └── workflows │ └── npm-publish.yml ├── .gitignore ├── LICENSE ├── README.md ├── accounts └── accounts_tmp.js ├── config ├── config_tmp.js └── deployer_config.js ├── deploy.js ├── index.js ├── package-lock.json ├── package.json ├── src ├── core │ ├── contract │ │ ├── deployed_token.js │ │ └── erc20_token.js │ ├── core.js │ ├── db │ │ └── sqlite.js │ ├── deployer │ │ ├── SkelDropHuntToken.sol │ │ └── artifacts │ │ │ └── .gitignore │ └── network │ │ └── rpc.js └── utils │ ├── helper.js │ ├── logger.js │ └── twist.js └── test.js /.github/workflows/npm-publish.yml: -------------------------------------------------------------------------------- 1 | # This workflow will run tests using node and then publish a package to GitHub Packages when a release is created 2 | # For more information see: https://docs.github.com/en/actions/publishing-packages/publishing-nodejs-packages 3 | 4 | name: Node.js Package Publish 5 | on: 6 | release: 7 | types: [created] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v3 14 | - uses: actions/setup-node@v3 15 | with: 16 | node-version: 22 17 | - run: npm ci 18 | 19 | publish-npm: 20 | needs: build 21 | runs-on: ubuntu-latest 22 | steps: 23 | - uses: actions/checkout@v3 24 | - uses: actions/setup-node@v3 25 | with: 26 | node-version: 22 27 | registry-url: https://registry.npmjs.org/ 28 | - run: npm install 29 | - run: npm publish 30 | env: 31 | NODE_AUTH_TOKEN: ${{secrets.NPMJS_TOKEN}} 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | log/* 3 | sessions/* 4 | accounts/accounts.js 5 | src/reference/* 6 | # package-lock.json 7 | .DS_Store 8 | build-config.json 9 | config/config.js 10 | app/accounts 11 | app/config 12 | database.db 13 | config/proxy_list.js -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Widianto Eka saputro 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # EVM TX & DEPLOYER BOT 2 | The Evm Testnet Bot is a powerful tool designed for interacting with EVM-compatible networks. This bot automates transaction processes, enabling users to perform actions such as ETH to WETH swap interactions seamlessly and daily. Additionally, it provides a built-in smart contract deployment feature, making it an ideal solution for you to do your testnet airdrop. 3 | 4 | ## Table Of Contents 5 | - [EVM TX \& DEPLOYER BOT](#evm-tx--deployer-bot) 6 | - [Table Of Contents](#table-of-contents) 7 | - [Prerequisite](#prerequisite) 8 | - [Join My Telegram Channel](#join-my-telegram-channel) 9 | - [BOT FEATURE](#bot-feature) 10 | - [Setup \& Configure BOT](#setup--configure-bot) 11 | - [Linux](#linux) 12 | - [Windows](#windows) 13 | - [Update Bot](#update-bot) 14 | - [IMPORTANT NOTE (READ IT THIS IS NOT DECORATION)](#important-note-read-it-this-is-not-decoration) 15 | - [UNDERSTANDING CONFIG](#understanding-config) 16 | - [Config Template File](#config-template-file) 17 | - [Example Config](#example-config) 18 | - [CONTRIBUTE](#contribute) 19 | - [SUPPORT](#support) 20 | 21 | ## Prerequisite 22 | - Git 23 | - Node JS (v22) 24 | 25 | ## Join My Telegram Channel 26 | ``` 27 | 28 | ... 29 | .;:. 30 | .;ol,. 31 | .;ooc:' 32 | .. .;ooccc:'. .. 33 | .',....'cdxlccccc;.....,'. 34 | .;;..'';clolccccccc:,''..;;. 35 | ':c'..':cccccccccccccc;...'c:. 36 | ':cc,.'ccccccccccccccccc:..;cc:' 37 | ...:cc;.':cccccccccccccccccc:..:cc:... 38 | .;';cc;.':;;:cccccccccccccc:;;;'.;cc,,;. 39 | .cc':c:.',.....;cccccccccc;.....,..:c:'c: 40 | ,x:'cc;.,' .':cccccc:'. ',.;cc':x' 41 | lO,'cc;.;, .;cccc:. ,;.;cc';0l 42 | .o0;.;c;.,:'......',''''''......':,.;c;.:0l. 43 | .lxl,.;,..;c::::;:,. .,:;::::c;..,;.,oxl. 44 | .lkxOl.. ..'..;::'..''..'::;..'.. ..c0xkl. 45 | .cKMx. .;c:;:cc:;:c:. .xMKc. 46 | ;KX: ;o::l:;cc;o:. ;KK; 47 | :KK:. ,d,cd,'ol'o: .:0K: 48 | ;0NOl:;:loo;. ... .. .;ldlc::lkN0: 49 | .lONNNKOx0Xd,;;'.,:,lKKkk0XNN0o. 50 | .','.. .lX0doooodOXd. .','. 51 | .,okkddxkd;. 52 | 'oxxd;. 53 | ........................................ 54 | .OWo xNd lox xxl Ald xoc dakkkkkxsx. 55 | .OWo o0W cXW dM0 MMN lNK laddKMNkso. 56 | .kMKoxsNN oWX dW0 MMMWO lWK axM0 . 57 | .OMWXNaMX dM0 kM0 MMKxNXKW0 axMk . 58 | .OMk dWK oWX XWdx Mxx XMMO akMx . 59 | 'OWo dM0 'kNNXNNd DMD OWk aoWd . 60 | ........................................ 61 | 62 | ``` 63 | 64 | 65 | 66 | Anyway i create new telegram channel just for sharing bot or airdrop, join here 67 | [**https://t.me/skeldrophunt**](https://t.me/skeldrophunt). 68 | 69 | 70 | ## BOT FEATURE 71 | - Multi Account 72 | - Support PK & SEED 73 | - Auto TX Daily (Wrap Unwrap ETH) 74 | - Auto TX Daily With RAW TX DATA 75 | - Auto TX Daily (SELF TRANSFER) 76 | - Deploy Smart Contract 77 | 78 | 79 | ## Setup & Configure BOT 80 | 81 | ### Linux 82 | 1. Clone project repo 83 | ``` 84 | git clone https://github.com/Widiskel/evm-tx-deployer-bot.git && cd evm-tx-deployer-bot 85 | ``` 86 | 2. Run 87 | ``` 88 | npm install 89 | ``` 90 | 3. Run 91 | ``` 92 | cp -r accounts/accounts_tmp.js accounts/accounts.js && cp -r config/config_tmp.js config/config.js 93 | ``` 94 | 4. Configure your accounts 95 | ``` 96 | nano accounts/accounts.js 97 | ``` 98 | 5. Configure the bot config 99 | ``` 100 | nano config/config.js 101 | ``` 102 | 6. To run Auto TX 103 | ``` 104 | npm run start 105 | ``` 106 | 7. To run Contract Deployer 107 | ``` 108 | npm run deploy 109 | ``` 110 | 111 | ### Windows 112 | 1. Open your `Command Prompt` or `Power Shell`. 113 | 2. Clone project repo 114 | ``` 115 | git clone https://github.com/Widiskel/evm-tx-deployer-bot.git 116 | ``` 117 | and cd to project dir 118 | ``` 119 | cd evm-tx-deployer-bot 120 | ``` 121 | 3. Run 122 | ``` 123 | npm install 124 | ``` 125 | 5. Navigate to `evm-tx-deployer-bot` directory. 126 | 6. Navigate to `accounts` folder and rename `accounts_tmp.js` to `accounts.js`. 127 | 7. Now open `acccounts.js` and setup your accounts. 128 | 8. Now Back to `evm-tx-deployer-bot` directory and Navigate to `config` and rename `config_tmp.js` to `config.js` adjust the `config.js` as needed. 129 | 9. Back to `evm-tx-deployer-bot` directory. 130 | 10. To start the app open your `Command Prompt` or `Power Shell` 131 | 11. To run auto Tx Bot 132 | ``` 133 | npm run start 134 | ``` 135 | 12. To run Smart Contract Deployer 136 | ``` 137 | npm run deploy 138 | ``` 139 | 140 | ## Update Bot 141 | 142 | To update bot follow this step : 143 | 1. run 144 | ``` 145 | git pull 146 | ``` 147 | or 148 | ``` 149 | git pull --rebase 150 | ``` 151 | if error run 152 | ``` 153 | git stash && git pull 154 | ``` 155 | 2. run 156 | ``` 157 | npm update 158 | ``` 159 | 3. start the bot 160 | 4. if any eror happen check `log/app.log` 161 | 162 | 163 | ## IMPORTANT NOTE (READ IT THIS IS NOT DECORATION) 164 | DWYOR & Always use a new wallet when running the bot, I am not responsible for any loss of assets. 165 | 166 | If any error regarding SQL, try to delete `database.db` first 167 | 168 | 169 | ## UNDERSTANDING CONFIG 170 | Config `config.js` file is a configuration file for this bot, it contains this kinds of parameter 171 | 172 | ## Config Template File 173 | config template file is on `config_tmp.js` 174 | ```js 175 | export class Config { 176 | static GWEIPRICE = 0.15; //GWEI PRICE 177 | static WAITFORBLOCKCONFIRMATION = true; //IF TRUE AFTER TX EXECUTED BOT WILL WAIT TX TO BE MINED FIRST, IF FALSE AFTER TX EXECUTED BOT WILL CONTINUE TO NEXT TX 178 | static TXAMOUNTMIN = 0.0001; //TX AMOUNT MIN 179 | static TXAMOUNTMAX = 0.001; //TX AMOUNT MAX 180 | 181 | //WRAP UNWRAP SECTION 182 | static USEWRAPUNWRAP = false; //IF TRUE THE BOT WILL EXECUTE WRAP UNWRAP TX 183 | static WRAPUNWRAPCOUNT = 10; //1 WRAPUNWRAPCOUNT = 2x TX (Wrap / Unwrap) OR (SWAP ETH TO WETH AND SWAP BACK) 184 | static WETHCONTRACTADDRESS = undefined; //WETH SMART CONTRACT ADDRESS EX: "0x" 185 | 186 | //RAW TX SECTION 187 | static USERAWTXDATA = false; //IF TRUE THE BOT WILL EXECUTE USE RAW TX 188 | static RAWTXCOUNT = 10; //COUNT OF RAW TX 189 | static RAWTXAMOUNT = 0; //RAW DATA TRANSACTION VALUE AMOUNT CHECK ON YOUR TRANSACTION EXPLORER > VALUE EX : 0 ANOTHER EX : 0.1 190 | static RAWTX = []; //RAW DATA FROM A TRANSACTION EX: ["0x0fxxxxxxxxforacc1","0x0fxxxxxxxxforacc2","0x0fxxxxxxxxforacc3"] BASED ON HOUW MANY OF YOUR ACCOUNTS, EACH ACCOUNT HAVE 1 RAW DATA, MAKE SURE THIS IS RAW DATA OF TRANSACTION THAT MATCH YOUR RAWTX AMOUNT 191 | static RAWTXCONTRACTADDRESS = undefined; //CONTRACT ADDRESS OF RAW TX 192 | 193 | //TRANSFER SECTION 194 | static USETRANSFER = true; 195 | static SELFTRANSFERCOUNT = 10; //TRANSFER NATIVE TOKEN TO YOUR SELF 196 | static OTHERUSERTRANSFERCOUNT = 0; //TRANSFER NATIVE TOKEN TO OTHER USER 197 | static OTHERUSERADDRESSLIST = []; //OTHER USER LIST ["0xuser1","0xuser2","0xuser3"] USER WILL RANDOMLY PICKED 198 | 199 | //INTERACTION WITH DEPLOYED CONTRACT SECTION 200 | static DEPLOYCONTRACTINTERACTION = false; 201 | static DEPLOYCONTRACTINTERACTIONCOUNT = 10; 202 | static DEPLOYCONTRACTADDRESS = undefined; //EX : "0x0000000000" MAKE SURE CONTRACT ALREADY VERIFIED 203 | 204 | //RPC PROVIDER SECTION 205 | static RPC = { 206 | CHAINID: undefined, //CHAIN ID EX: 123123 207 | RPCURL: undefined, //RPC URL EX : "https://xxx" 208 | EXPLORER: undefined, //BLOCK EXPLORER EX "https://explorer" 209 | SYMBOL: "ETH", //CURRENCY SYMBOL EX: "ETH" 210 | }; 211 | } 212 | 213 | ``` 214 | im already provide description for each parameter, hope you can understand. 215 | 216 | 217 | ## Example Config 218 | For refference i will provide my `config.js` file for Story Oddyssey Testnet 219 | ```js 220 | export class Config { 221 | static GWEIPRICE = 25; 222 | static WAITFORBLOCKCONFIRMATION = true; 223 | static TXAMOUNTMIN = 0.0001; 224 | static TXAMOUNTMAX = 0.001; 225 | 226 | static USEWRAPUNWRAP = false; 227 | static WRAPUNWRAPCOUNT = 0; 228 | static WRAPPEDTOKENCONTRACTADDRESS = undefined; 229 | 230 | static USERAWTXDATA = true; 231 | static RAWTXCOUNT = 10; 232 | static RAWTX = [ 233 | "0x773acdef0000000000000000000000000000000000000000000000000000000000000001", 234 | ]; 235 | static RAWTXAMOUNT = 0; 236 | static RAWTXCONTRACTADDRESS = "0x2ADb4Da762E8Ad3Ebf050cEe0DaEF23d0f3C1Ed2"; 237 | 238 | static USETRANSFER = true; 239 | static SELFTRANSFERCOUNT = 10; 240 | static OTHERUSERTRANSFERCOUNT = 0; 241 | static OTHERUSERADDRESSLIST = []; 242 | 243 | static DEPLOYCONTRACTINTERACTION = true; 244 | static DEPLOYCONTRACTINTERACTIONCOUNT = 10; 245 | static DEPLOYCONTRACTADDRESS = "0x2ADb4Da762E8Ad3Ebf050cEe0DaEF23d0f3C1Ed2"; 246 | 247 | static RPC = { 248 | CHAINID: 1516, 249 | RPCURL: "https://odyssey-evm.spidernode.net", 250 | EXPLORER: "https://odyssey-testnet-explorer.storyscan.xyz/", 251 | SYMBOL: "IP", 252 | }; 253 | } 254 | ``` 255 | Explanation : 256 | | Parameter | Description | 257 | |------------------------------------|-------------| 258 | | **GWEIPRICE** | Gas price used for transactions, measured in Eth. Example: `25` it will converted to gwei later. | 259 | | **WAITFORBLOCKCONFIRMATION** | Whether to wait for block confirmation after executing a transaction. Example: `true`. | 260 | | **TXAMOUNTMIN** | Minimum transaction amount in ETH. Example: `0.0001`. | 261 | | **TXAMOUNTMAX** | Maximum transaction amount in ETH. Example: `0.001`. | 262 | | **USEWRAPUNWRAP** | Whether to use the wrap/unwrap feature for tokens. Example: `false`. | 263 | | **WRAPUNWRAPCOUNT** | Number of wrap/unwrap operations to perform. Example: `0`. | 264 | | **WRAPPEDTOKENCONTRACTADDRESS** | Address of the wrapped token contract. Example: `undefined`. | 265 | | **USERAWTXDATA** | Whether to use raw transaction data. Example: `true`. | 266 | | **RAWTXCOUNT** | Number of raw transactions to send. Example: `10`. | 267 | | **RAWTX** | List of raw transaction data in hex format. Example: `["0x773acdef0000000000000000000000000000000000000000000000000000000000000001"]`. | 268 | | **RAWTXAMOUNT** | Amount to send in raw transactions. Example: `0`. | 269 | | **RAWTXCONTRACTADDRESS** | Contract address for raw transactions. Example: `"0x2ADb4Da762E8Ad3Ebf050cEe0DaEF23d0f3C1Ed2"`. | 270 | | **USETRANSFER** | Whether to enable self or other user transfers. Example: `true`. | 271 | | **SELFTRANSFERCOUNT** | Number of self-transfers to perform. Example: `10`. | 272 | | **OTHERUSERTRANSFERCOUNT** | Number of transfers to other users. Example: `0`. | 273 | | **OTHERUSERADDRESSLIST** | List of addresses for transferring funds. Example: `[]` (empty array). | 274 | | **DEPLOYCONTRACTINTERACTION** | Whether to interact with a deployed contract. Example: `true`. | 275 | | **DEPLOYCONTRACTINTERACTIONCOUNT** | Number of interactions with a deployed contract. Example: `10`. | 276 | | **DEPLOYCONTRACTADDRESS** | Address of the deployed contract to interact with. Example: `"0x2ADb4Da762E8Ad3Ebf050cEe0DaEF23d0f3C1Ed2"`. | 277 | | **RPC.CHAINID** | The blockchain network ID. Example: `1516`. | 278 | | **RPC.RPCURL** | The RPC URL used to connect to the blockchain. Example: `"https://odyssey-evm.spidernode.net"`. | 279 | | **RPC.EXPLORER** | Block explorer URL for transaction tracking. Example: `"https://odyssey-testnet-explorer.storyscan.xyz/"`. | 280 | | **RPC.SYMBOL** | The ticker symbol of the blockchain's native currency. Example: `"IP"`. | 281 | 282 | what contract address is it ? that is contract address that i've deployed on story chain. 283 | 284 | on the deployer contract i create function called ping just for interaction. so you can interact with your own deployed contract on this tool 285 | 286 | ## CONTRIBUTE 287 | 288 | Feel free to fork and contribute adding more feature thanks. 289 | 290 | ## SUPPORT 291 | 292 | want to support me for creating another bot ? 293 | **star** my repo or buy me a coffee on 294 | 295 | EVM : `0x1f0ea6e0b3590e1ab6c12ea0a24d3d0d9bf7707d` 296 | 297 | SOLANA : `3tE3Hs7P2wuRyVxyMD7JSf8JTAmEekdNsQWqAnayE1CN` 298 | -------------------------------------------------------------------------------- /accounts/accounts_tmp.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Private key list file 3 | * write your private key here like this 4 | * export const privateKey = [ 5 | * "PK1", 6 | * "PK2", 7 | * "PK3", 8 | * "SEED1", 9 | * "SEED2", 10 | * ]; 11 | */ 12 | 13 | export const privateKey = []; 14 | -------------------------------------------------------------------------------- /config/config_tmp.js: -------------------------------------------------------------------------------- 1 | export class Config { 2 | static GWEIPRICE = 0.15; //GWEI PRICE check on explorer , on the top left it will show recomended gas price 3 | static WAITFORBLOCKCONFIRMATION = true; //IF TRUE AFTER TX EXECUTED BOT WILL WAIT TX TO BE MINED FIRST, IF FALSE AFTER TX EXECUTED BOT WILL CONTINUE TO NEXT TX 4 | static TXAMOUNTMIN = 0.0001; //TX AMOUNT MIN 5 | static TXAMOUNTMAX = 0.001; //TX AMOUNT MAX 6 | 7 | //DELAY SECTION 8 | //DELAY FOR EACH TX WILL BE RANDOM FROM MIN UNTIL MAX 9 | static MINDELAYEACHTXINSEC = 10; //MINIMUM DELAY FOR EACH TX 10 | static MAXDELAYEACHTXINSEC = 120; //MAXIMUM DELAY FOR EACH TX 11 | 12 | //WRAP UNWRAP SECTION 13 | static USEWRAPUNWRAP = false; //IF TRUE THE BOT WILL EXECUTE WRAP UNWRAP TX 14 | static WRAPUNWRAPCOUNT = 10; //1 WRAPUNWRAPCOUNT = 2x TX (Wrap / Unwrap) OR (SWAP ETH TO WETH AND SWAP BACK) 15 | static WRAPPEDTOKENCONTRACTADDRESS = undefined; //WETH SMART CONTRACT ADDRESS EX: "0x" 16 | 17 | //RAW TX SECTION 18 | static USERAWTXDATA = false; //IF TRUE THE BOT WILL EXECUTE USE RAW TX 19 | static RAWTXCOUNT = 10; //COUNT OF RAW TX 20 | static RAWTXAMOUNT = 0; //RAW DATA TRANSACTION VALUE AMOUNT CHECK ON YOUR TRANSACTION EXPLORER > VALUE EX : 0 ANOTHER EX : 0.1 21 | static RAWTX = []; //RAW DATA FROM A TRANSACTION EX: ["0x0fxxxxxxxxforacc1","0x0fxxxxxxxxforacc2","0x0fxxxxxxxxforacc3"] BASED ON HOUW MANY OF YOUR ACCOUNTS, EACH ACCOUNT HAVE 1 RAW DATA, MAKE SURE THIS IS RAW DATA OF TRANSACTION THAT MATCH YOUR RAWTX AMOUNT 22 | static RAWTXCONTRACTADDRESS = undefined; //CONTRACT ADDRESS OF RAW TX 23 | 24 | //TRANSFER SECTION 25 | static USETRANSFER = true; 26 | static SELFTRANSFERCOUNT = 10; //TRANSFER NATIVE TOKEN TO YOUR SELF 27 | static OTHERUSERTRANSFERCOUNT = 0; //TRANSFER NATIVE TOKEN TO OTHER USER 28 | static OTHERUSERADDRESSLIST = []; //OTHER USER LIST ["0xuser1","0xuser2","0xuser3"] USER WILL RANDOMLY PICKED 29 | 30 | //INTERACTION WITH DEPLOYED CONTRACT SECTION 31 | static DEPLOYCONTRACTINTERACTION = false; 32 | static DEPLOYCONTRACTINTERACTIONCOUNT = 10; 33 | static DEPLOYCONTRACTADDRESS = undefined; //EX : "0x0000000000" MAKE SURE CONTRACT ALREADY VERIFIED 34 | 35 | //RPC PROVIDER SECTION 36 | static RPC = { 37 | CHAINID: undefined, //CHAIN ID EX: 123123 38 | RPCURL: undefined, //RPC URL EX : "https://xxx" 39 | EXPLORER: undefined, //BLOCK EXPLORER EX "https://explorer" 40 | SYMBOL: "ETH", //CURRENCY SYMBOL EX: "ETH" 41 | }; 42 | } 43 | -------------------------------------------------------------------------------- /config/deployer_config.js: -------------------------------------------------------------------------------- 1 | export class DeployerConfig { 2 | static GWEIPRICE = 0.15; //check on explorer , on the top left it will show recomended gas price 3 | static EVMVERSION = "default"; // EX: "shanghai", "default" , "istanbul" depends on chain; 4 | static GASLIMIT = 1000000; //IF TRANSACTION FAILED REGARDING TO GASS YOU CAN ADJUST THIS HIGHER OR LOWER 5 | } 6 | -------------------------------------------------------------------------------- /deploy.js: -------------------------------------------------------------------------------- 1 | import solc from "solc"; 2 | import fs from "fs"; 3 | import path from "path"; 4 | import { privateKey } from "./accounts/accounts.js"; 5 | import { Helper } from "./src/utils/helper.js"; 6 | import input from "input"; 7 | import { RPC } from "./src/core/network/rpc.js"; 8 | import { ethers } from "ethers"; 9 | import { DeployerConfig } from "./config/deployer_config.js"; 10 | 11 | const basePath = "src/core/deployer"; 12 | const provider = new ethers.JsonRpcProvider(RPC.RPCURL, RPC.CHAINID); 13 | const maxError = 5; 14 | let currentError = 0; 15 | async function compileContract() { 16 | console.log("Compiling Contract..."); 17 | const contractPath = path.resolve(basePath, "SkelDropHuntToken.sol"); 18 | const contractSource = fs.readFileSync(contractPath, "utf8"); 19 | console.log("Contract path :", contractPath); 20 | const input = { 21 | language: "Solidity", 22 | sources: { 23 | ["SkelDropHuntToken.sol"]: { 24 | content: contractSource, 25 | }, 26 | }, 27 | settings: { 28 | outputSelection: { 29 | "*": { 30 | "*": ["abi", "evm.bytecode"], 31 | }, 32 | }, 33 | optimizer: { 34 | enabled: true, 35 | runs: 200, 36 | }, 37 | evmVersion: 38 | DeployerConfig.EVMVERSION != "default" 39 | ? DeployerConfig.EVMVERSION 40 | : undefined, 41 | }, 42 | }; 43 | 44 | const compiledContract = JSON.parse(solc.compile(JSON.stringify(input))); 45 | const contract = compiledContract.contracts["SkelDropHuntToken.sol"]; 46 | const contractName = Object.keys(contract)[0]; 47 | const abi = contract[contractName].abi; 48 | const bytecode = contract[contractName].evm.bytecode.object; 49 | 50 | const abiPath = path.resolve( 51 | `${basePath}/artifacts`, 52 | `${contractName}.abi.json` 53 | ); 54 | const bytecodePath = path.resolve( 55 | `${basePath}/artifacts`, 56 | `${contractName}.bytecode.txt` 57 | ); 58 | 59 | fs.writeFileSync(abiPath, JSON.stringify(abi, null, 2)); 60 | fs.writeFileSync(bytecodePath, bytecode); 61 | 62 | console.log(`Contract ${contractName} Compiled successfully!`); 63 | console.log(`ABI saved to: ${abiPath}`); 64 | console.log(`Bytecode saved to: ${bytecodePath}`); 65 | 66 | return { abi, bytecode }; 67 | } 68 | 69 | async function deployContract( 70 | wallet, 71 | abi, 72 | bytecode, 73 | name, 74 | symbol, 75 | initialSupply, 76 | gas 77 | ) { 78 | const factory = new ethers.ContractFactory(abi, bytecode, wallet); 79 | const initialSupplyBigNumber = ethers.parseUnits(initialSupply, 18); 80 | console.log( 81 | `Deploying Contract... 82 | 83 | Name : ${name} 84 | Symbol : ${symbol} 85 | Supply : ${initialSupplyBigNumber} 86 | ` 87 | ); 88 | 89 | try { 90 | if (!gas) { 91 | gas = BigInt(DeployerConfig.GASLIMIT); 92 | } else { 93 | gas = gas + BigInt(DeployerConfig.GASLIMIT); 94 | } 95 | const fee = await provider.getFeeData(); 96 | const customGasPrice = ethers.parseUnits( 97 | DeployerConfig.GWEIPRICE.toString(), 98 | "gwei" 99 | ); 100 | const gasPrice = 101 | fee.gasPrice > customGasPrice ? fee.gasPrice : customGasPrice; 102 | console.log("Deploying using gasLimit : ", gas); 103 | console.log("Deploying using gasPrice : ", gasPrice); 104 | 105 | const contract = await factory.deploy( 106 | name, 107 | symbol, 108 | initialSupplyBigNumber, 109 | { 110 | gasLimit: gas, 111 | gasPrice: gasPrice, 112 | } 113 | ); 114 | await confirmDeployment(contract); 115 | } catch (error) { 116 | console.warn( 117 | `Deployment attempt failed, ${ 118 | currentError != maxError ? "Retrying" : "Max Error Reached" 119 | }` 120 | ); 121 | console.error(error.message); 122 | if (currentError != maxError) { 123 | currentError += 1; 124 | await deployContract( 125 | wallet, 126 | abi, 127 | bytecode, 128 | name, 129 | symbol, 130 | initialSupply, 131 | gas 132 | ); 133 | } 134 | } 135 | } 136 | 137 | async function confirmDeployment(contract) { 138 | console.log( 139 | `Contract Deployment Tx Sent: ${RPC.EXPLORER}tx/${ 140 | contract.deploymentTransaction().hash 141 | }, Waiting for Block Confirmation` 142 | ); 143 | const result = await contract.deploymentTransaction().wait(); 144 | console.log(`\nContract Adress: ${result.contractAddress}`); 145 | console.log( 146 | `Contract Address On Explorer : ${RPC.EXPLORER}address/${result.contractAddress}` 147 | ); 148 | console.log( 149 | `Please Verify Your Contract Using This Detail : 150 | 151 | Contract Verification Link : ${RPC.EXPLORER}address/${result.contractAddress}/contract-verification 152 | Contract License : MIT License (MIT) 153 | Verification methid (Compiler Type) : Solidity (Single File) 154 | Compiler : v0.8.28 155 | EVM Version : ${DeployerConfig.EVMVERSION} 156 | Optimization Enabled : TRUE (200) 157 | Contract Code : Copy Paste Everything from /src/core/deployer/SkelDropHuntToken.sol 158 | 159 | 160 | Thanks for using our EVM TX DEPLOYER tool 161 | Regards: Widiskel (Skel Drop Hunt) 162 | ` 163 | ); 164 | } 165 | 166 | (async () => { 167 | try { 168 | console.log("Contract Deployer Bot"); 169 | console.log(); 170 | console.log("By : Widiskel"); 171 | console.log("Follow On : https://github.com/Widiskel"); 172 | console.log("Join Channel : https://t.me/skeldrophunt"); 173 | console.log("Dont forget to run git pull to keep up to date"); 174 | console.log(); 175 | Helper.showSkelLogo(); 176 | console.log(); 177 | if (privateKey.length == 0) 178 | throw Error("Please input your account first on accounts.js file"); 179 | 180 | let ctx = "Account List \n"; 181 | for (const item of privateKey) { 182 | ctx += `${privateKey.indexOf(item) + 1}. Account ${ 183 | privateKey.indexOf(item) + 1 184 | }\n`; 185 | } 186 | ctx += `\n \nSelect Account To Deploy Contract : `; 187 | const opt = await input.text(ctx); 188 | if (!privateKey[opt - 1]) throw Error(`Invalid Input`); 189 | 190 | const acc = privateKey[opt - 1]; 191 | let wallet; 192 | const data = acc; 193 | const type = Helper.determineType(data); 194 | 195 | if (type == "Secret Phrase") { 196 | /** 197 | * @type {Wallet} 198 | */ 199 | wallet = ethers.Wallet.fromPhrase(data, provider); 200 | } else if (type == "Private Key") { 201 | /** 202 | * @type {Wallet} 203 | */ 204 | wallet = new ethers.Wallet(data.trim(), provider); 205 | } else { 206 | throw Error("Invalid account Secret Phrase or Private Key"); 207 | } 208 | 209 | const name = await input.text("Enter token name: "); 210 | const symbol = await input.text("Enter token symbol: "); 211 | const initialSupply = await input.text("Enter initial supply: "); 212 | const { abi, bytecode } = await compileContract(); 213 | await deployContract(wallet, abi, bytecode, name, symbol, initialSupply); 214 | } catch (error) { 215 | console.log("Error During executing bot", error); 216 | } 217 | })(); 218 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import { privateKey } from "./accounts/accounts.js"; 2 | import { Config } from "./config/config.js"; 3 | import Core from "./src/core/core.js"; 4 | import sqlite from "./src/core/db/sqlite.js"; 5 | import { RPC } from "./src/core/network/rpc.js"; 6 | import { Helper } from "./src/utils/helper.js"; 7 | import logger from "./src/utils/logger.js"; 8 | import twist from "./src/utils/twist.js"; 9 | 10 | async function operation(acc) { 11 | await sqlite.connectToDatabase(); 12 | await sqlite.createTable(); 13 | const core = new Core(acc); 14 | try { 15 | await core.connectWallet(); 16 | await core.getBalance(); 17 | 18 | if (core.balance.ETH < Config.TXAMOUNTMAX) { 19 | await Helper.delay( 20 | 100000, 21 | acc, 22 | `Minimum ${RPC.SYMBOL} Balance Is ${Config.TXAMOUNTMAX} ${RPC.SYMBOL}`, 23 | core 24 | ); 25 | await operation(acc); 26 | } 27 | 28 | const delayTxMin = Config.MINDELAYEACHTXINSEC ?? 60; 29 | const delayTxMax = Config.MAXDELAYEACHTXINSEC ?? 120; 30 | const delaytx = Helper.random(delayTxMin * 1000, delayTxMax * 1000); 31 | 32 | if (Config.USEWRAPUNWRAP ?? true) { 33 | if (Config.WRAPPEDTOKENCONTRACTADDRESS == undefined) 34 | throw Error("Please Configure WRAPPEDTOKENCONTRACTADDRESS first"); 35 | const currentCount = 36 | Number(Config.WRAPUNWRAPCOUNT) - 37 | Number((await sqlite.getTodayTxLog(core.address, "tx")).length); 38 | const txCount = currentCount > 0 ? currentCount : 0; 39 | for (const count of Array(txCount)) { 40 | if (core.balance.ETH < Config.TXAMOUNTMAX) 41 | throw Error( 42 | `Balance is less than ${Config.TXAMOUNTMAX} ${RPC.SYMBOL}, please fill up your balance` 43 | ); 44 | try { 45 | await core.deposit(); 46 | await core.withdraw(); 47 | await sqlite.insertData(core.address, new Date().toISOString(), "tx"); 48 | } catch (error) { 49 | await Helper.delay( 50 | 3000, 51 | acc, 52 | `Error during deposit/withdraw operation: ${error.message}`, 53 | core 54 | ); 55 | } 56 | 57 | await Helper.delay( 58 | delaytx, 59 | acc, 60 | `Delaying for ${Helper.msToTime(delaytx)} Before Executing Next TX`, 61 | core 62 | ); 63 | } 64 | } 65 | 66 | if (Config.USETRANSFER ?? false) { 67 | const selfTransferCount = 68 | Number(Config.SELFTRANSFERCOUNT) - 69 | Number((await sqlite.getTodayTxLog(core.address, "self")).length); 70 | const txCount = selfTransferCount > 0 ? selfTransferCount : 0; 71 | const otherTransferCount = 72 | Number(Config.OTHERUSERTRANSFERCOUNT) - 73 | Number((await sqlite.getTodayTxLog(core.address, "other")).length); 74 | const otherTxCount = otherTransferCount > 0 ? otherTransferCount : 0; 75 | for (const tx of Array(txCount)) { 76 | await core.transfer(); 77 | await sqlite.insertData(core.address, new Date().toISOString(), "self"); 78 | 79 | await Helper.delay( 80 | delaytx, 81 | acc, 82 | `Delaying for ${Helper.msToTime(delaytx)} Before Executing Next TX`, 83 | core 84 | ); 85 | } 86 | for (const tx of Array(otherTxCount)) { 87 | await core.transfer(false); 88 | await sqlite.insertData( 89 | core.address, 90 | new Date().toISOString(), 91 | "other" 92 | ); 93 | 94 | await Helper.delay( 95 | delaytx, 96 | acc, 97 | `Delaying for ${Helper.msToTime(delaytx)} Before Executing Next TX`, 98 | core 99 | ); 100 | } 101 | } 102 | 103 | if (Config.DEPLOYCONTRACTINTERACTION ?? false) { 104 | if ( 105 | (Config.DEPLOYCONTRACTADDRESS == undefined) & 106 | (Config.DEPLOYCONTRACTADDRESS == "") 107 | ) 108 | throw Error( 109 | "Please set DEPLOYCONTRACTADDRESS with your deployed contract address first " 110 | ); 111 | 112 | const deployedContractInteractCount = 113 | Number(Config.DEPLOYCONTRACTINTERACTIONCOUNT) - 114 | Number((await sqlite.getTodayTxLog(core.address, "deployed")).length); 115 | const txCount = 116 | deployedContractInteractCount > 0 ? deployedContractInteractCount : 0; 117 | 118 | for (const tx of Array(txCount)) { 119 | await core.deployedContractTx(); 120 | await sqlite.insertData( 121 | core.address, 122 | new Date().toISOString(), 123 | "deployed" 124 | ); 125 | await Helper.delay( 126 | delaytx, 127 | acc, 128 | `Delaying for ${Helper.msToTime(delaytx)} Before Executing Next TX`, 129 | core 130 | ); 131 | } 132 | } 133 | 134 | if (Config.USERAWTXDATA ?? false) { 135 | if (Config.RAWTX == undefined || Config.RAWTX == []) 136 | throw Error("Please Configure RAWTX first"); 137 | if (Config.RAWTXCONTRACTADDRESS == undefined) 138 | throw Error("Please Configure RAWTXCONTRACTADDRESS first"); 139 | const currentCount = 140 | Number(Config.RAWTXCOUNT) - 141 | Number((await sqlite.getTodayTxLog(core.address, "raw")).length); 142 | const txCount = currentCount > 0 ? currentCount : 0; 143 | for (const tx of Array(txCount)) { 144 | await core.rawTx(); 145 | await sqlite.insertData(core.address, new Date().toISOString(), "raw"); 146 | await Helper.delay( 147 | delaytx, 148 | acc, 149 | `Delaying for ${Helper.msToTime(delaytx)} Before Executing Next TX`, 150 | core 151 | ); 152 | } 153 | } 154 | 155 | const delay = 60000 * 60 * 24; 156 | await Helper.delay( 157 | delay, 158 | acc, 159 | `Account ${ 160 | privateKey.indexOf(acc) + 1 161 | } Processing Done, Delaying for ${Helper.msToTime(delay)}`, 162 | core 163 | ); 164 | await operation(acc); 165 | } catch (error) { 166 | if (error.message) { 167 | await Helper.delay( 168 | 10000, 169 | acc, 170 | `Error : ${error.message}, Retry again after 10 Second`, 171 | core 172 | ); 173 | } else { 174 | await Helper.delay( 175 | 10000, 176 | acc, 177 | `Error :${JSON.stringify(error)}, Retry again after 10 Second`, 178 | core 179 | ); 180 | } 181 | 182 | await operation(acc); 183 | } 184 | } 185 | 186 | async function startBot() { 187 | return new Promise(async (resolve, reject) => { 188 | try { 189 | logger.info(`BOT STARTED`); 190 | if (privateKey.length == 0) 191 | throw Error("Please input your account first on accounts.js file"); 192 | const promiseList = []; 193 | 194 | for (const acc of privateKey) { 195 | promiseList.push(operation(acc)); 196 | } 197 | 198 | await Promise.all(promiseList); 199 | resolve(); 200 | } catch (error) { 201 | logger.info(`BOT STOPPED`); 202 | logger.error(JSON.stringify(error)); 203 | reject(error); 204 | } 205 | }); 206 | } 207 | 208 | (async () => { 209 | try { 210 | logger.clear(); 211 | logger.info(""); 212 | logger.info("Application Started"); 213 | console.log("EVM TX DEPLOYER BOT"); 214 | console.log(); 215 | console.log("By : Widiskel"); 216 | console.log("Follow On : https://github.com/Widiskel"); 217 | console.log("Join Channel : https://t.me/skeldrophunt"); 218 | console.log("Dont forget to run git pull to keep up to date"); 219 | console.log(); 220 | console.log(); 221 | Helper.showSkelLogo(); 222 | await startBot(); 223 | } catch (error) { 224 | twist.clear(); 225 | twist.clearInfo(); 226 | console.log("Error During executing bot", error); 227 | await startBot(); 228 | } 229 | })(); 230 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "evm-tx-deployer-bot.git", 3 | "version": "2.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "evm-tx-deployer-bot.git", 9 | "version": "2.0.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "bip39": "^3.1.0", 13 | "ethers": "^6.13.2", 14 | "input": "^1.0.1", 15 | "moment-timezone": "^0.5.45", 16 | "node-fetch": "^3.3.2", 17 | "solc": "^0.8.28", 18 | "sqlite": "^5.1.1", 19 | "sqlite3": "^5.1.7", 20 | "twisters": "^1.1.0", 21 | "winston": "^3.13.0" 22 | } 23 | }, 24 | "node_modules/@adraffy/ens-normalize": { 25 | "version": "1.10.1", 26 | "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", 27 | "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==" 28 | }, 29 | "node_modules/@colors/colors": { 30 | "version": "1.6.0", 31 | "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", 32 | "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", 33 | "engines": { 34 | "node": ">=0.1.90" 35 | } 36 | }, 37 | "node_modules/@dabh/diagnostics": { 38 | "version": "2.0.3", 39 | "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", 40 | "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", 41 | "dependencies": { 42 | "colorspace": "1.1.x", 43 | "enabled": "2.0.x", 44 | "kuler": "^2.0.0" 45 | } 46 | }, 47 | "node_modules/@gar/promisify": { 48 | "version": "1.1.3", 49 | "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", 50 | "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", 51 | "optional": true 52 | }, 53 | "node_modules/@noble/curves": { 54 | "version": "1.2.0", 55 | "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", 56 | "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", 57 | "dependencies": { 58 | "@noble/hashes": "1.3.2" 59 | }, 60 | "funding": { 61 | "url": "https://paulmillr.com/funding/" 62 | } 63 | }, 64 | "node_modules/@noble/hashes": { 65 | "version": "1.3.2", 66 | "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", 67 | "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", 68 | "engines": { 69 | "node": ">= 16" 70 | }, 71 | "funding": { 72 | "url": "https://paulmillr.com/funding/" 73 | } 74 | }, 75 | "node_modules/@npmcli/fs": { 76 | "version": "1.1.1", 77 | "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", 78 | "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", 79 | "optional": true, 80 | "dependencies": { 81 | "@gar/promisify": "^1.0.1", 82 | "semver": "^7.3.5" 83 | } 84 | }, 85 | "node_modules/@npmcli/fs/node_modules/semver": { 86 | "version": "7.6.3", 87 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", 88 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", 89 | "optional": true, 90 | "bin": { 91 | "semver": "bin/semver.js" 92 | }, 93 | "engines": { 94 | "node": ">=10" 95 | } 96 | }, 97 | "node_modules/@npmcli/move-file": { 98 | "version": "1.1.2", 99 | "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", 100 | "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", 101 | "deprecated": "This functionality has been moved to @npmcli/fs", 102 | "optional": true, 103 | "dependencies": { 104 | "mkdirp": "^1.0.4", 105 | "rimraf": "^3.0.2" 106 | }, 107 | "engines": { 108 | "node": ">=10" 109 | } 110 | }, 111 | "node_modules/@tootallnate/once": { 112 | "version": "1.1.2", 113 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", 114 | "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", 115 | "optional": true, 116 | "engines": { 117 | "node": ">= 6" 118 | } 119 | }, 120 | "node_modules/@types/node": { 121 | "version": "18.15.13", 122 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", 123 | "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" 124 | }, 125 | "node_modules/@types/triple-beam": { 126 | "version": "1.3.5", 127 | "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", 128 | "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" 129 | }, 130 | "node_modules/abbrev": { 131 | "version": "1.1.1", 132 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 133 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 134 | "optional": true 135 | }, 136 | "node_modules/aes-js": { 137 | "version": "4.0.0-beta.5", 138 | "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", 139 | "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" 140 | }, 141 | "node_modules/agentkeepalive": { 142 | "version": "4.5.0", 143 | "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", 144 | "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", 145 | "optional": true, 146 | "dependencies": { 147 | "humanize-ms": "^1.2.1" 148 | }, 149 | "engines": { 150 | "node": ">= 8.0.0" 151 | } 152 | }, 153 | "node_modules/aggregate-error": { 154 | "version": "3.1.0", 155 | "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", 156 | "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", 157 | "optional": true, 158 | "dependencies": { 159 | "clean-stack": "^2.0.0", 160 | "indent-string": "^4.0.0" 161 | }, 162 | "engines": { 163 | "node": ">=8" 164 | } 165 | }, 166 | "node_modules/ansi-regex": { 167 | "version": "5.0.1", 168 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 169 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 170 | "engines": { 171 | "node": ">=8" 172 | } 173 | }, 174 | "node_modules/aproba": { 175 | "version": "2.0.0", 176 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", 177 | "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", 178 | "optional": true 179 | }, 180 | "node_modules/are-we-there-yet": { 181 | "version": "3.0.1", 182 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", 183 | "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", 184 | "deprecated": "This package is no longer supported.", 185 | "optional": true, 186 | "dependencies": { 187 | "delegates": "^1.0.0", 188 | "readable-stream": "^3.6.0" 189 | }, 190 | "engines": { 191 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 192 | } 193 | }, 194 | "node_modules/async": { 195 | "version": "3.2.5", 196 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", 197 | "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" 198 | }, 199 | "node_modules/babel-runtime": { 200 | "version": "6.26.0", 201 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", 202 | "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", 203 | "dependencies": { 204 | "core-js": "^2.4.0", 205 | "regenerator-runtime": "^0.11.0" 206 | } 207 | }, 208 | "node_modules/balanced-match": { 209 | "version": "1.0.2", 210 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 211 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 212 | "optional": true 213 | }, 214 | "node_modules/base64-js": { 215 | "version": "1.5.1", 216 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 217 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 218 | "funding": [ 219 | { 220 | "type": "github", 221 | "url": "https://github.com/sponsors/feross" 222 | }, 223 | { 224 | "type": "patreon", 225 | "url": "https://www.patreon.com/feross" 226 | }, 227 | { 228 | "type": "consulting", 229 | "url": "https://feross.org/support" 230 | } 231 | ] 232 | }, 233 | "node_modules/bindings": { 234 | "version": "1.5.0", 235 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 236 | "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 237 | "dependencies": { 238 | "file-uri-to-path": "1.0.0" 239 | } 240 | }, 241 | "node_modules/bip39": { 242 | "version": "3.1.0", 243 | "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", 244 | "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", 245 | "dependencies": { 246 | "@noble/hashes": "^1.2.0" 247 | } 248 | }, 249 | "node_modules/bl": { 250 | "version": "4.1.0", 251 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 252 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 253 | "dependencies": { 254 | "buffer": "^5.5.0", 255 | "inherits": "^2.0.4", 256 | "readable-stream": "^3.4.0" 257 | } 258 | }, 259 | "node_modules/brace-expansion": { 260 | "version": "1.1.11", 261 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 262 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 263 | "optional": true, 264 | "dependencies": { 265 | "balanced-match": "^1.0.0", 266 | "concat-map": "0.0.1" 267 | } 268 | }, 269 | "node_modules/buffer": { 270 | "version": "5.7.1", 271 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 272 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 273 | "funding": [ 274 | { 275 | "type": "github", 276 | "url": "https://github.com/sponsors/feross" 277 | }, 278 | { 279 | "type": "patreon", 280 | "url": "https://www.patreon.com/feross" 281 | }, 282 | { 283 | "type": "consulting", 284 | "url": "https://feross.org/support" 285 | } 286 | ], 287 | "dependencies": { 288 | "base64-js": "^1.3.1", 289 | "ieee754": "^1.1.13" 290 | } 291 | }, 292 | "node_modules/bufferutil": { 293 | "version": "4.0.8", 294 | "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", 295 | "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", 296 | "hasInstallScript": true, 297 | "optional": true, 298 | "peer": true, 299 | "dependencies": { 300 | "node-gyp-build": "^4.3.0" 301 | }, 302 | "engines": { 303 | "node": ">=6.14.2" 304 | } 305 | }, 306 | "node_modules/cacache": { 307 | "version": "15.3.0", 308 | "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", 309 | "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", 310 | "optional": true, 311 | "dependencies": { 312 | "@npmcli/fs": "^1.0.0", 313 | "@npmcli/move-file": "^1.0.1", 314 | "chownr": "^2.0.0", 315 | "fs-minipass": "^2.0.0", 316 | "glob": "^7.1.4", 317 | "infer-owner": "^1.0.4", 318 | "lru-cache": "^6.0.0", 319 | "minipass": "^3.1.1", 320 | "minipass-collect": "^1.0.2", 321 | "minipass-flush": "^1.0.5", 322 | "minipass-pipeline": "^1.2.2", 323 | "mkdirp": "^1.0.3", 324 | "p-map": "^4.0.0", 325 | "promise-inflight": "^1.0.1", 326 | "rimraf": "^3.0.2", 327 | "ssri": "^8.0.1", 328 | "tar": "^6.0.2", 329 | "unique-filename": "^1.1.1" 330 | }, 331 | "engines": { 332 | "node": ">= 10" 333 | } 334 | }, 335 | "node_modules/chownr": { 336 | "version": "2.0.0", 337 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", 338 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", 339 | "engines": { 340 | "node": ">=10" 341 | } 342 | }, 343 | "node_modules/clean-stack": { 344 | "version": "2.2.0", 345 | "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", 346 | "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", 347 | "optional": true, 348 | "engines": { 349 | "node": ">=6" 350 | } 351 | }, 352 | "node_modules/cli-cursor": { 353 | "version": "1.0.2", 354 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", 355 | "integrity": "sha512-25tABq090YNKkF6JH7lcwO0zFJTRke4Jcq9iX2nr/Sz0Cjjv4gckmwlW6Ty/aoyFd6z3ysR2hMGC2GFugmBo6A==", 356 | "dependencies": { 357 | "restore-cursor": "^1.0.1" 358 | }, 359 | "engines": { 360 | "node": ">=0.10.0" 361 | } 362 | }, 363 | "node_modules/cli-width": { 364 | "version": "2.2.1", 365 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", 366 | "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" 367 | }, 368 | "node_modules/code-point-at": { 369 | "version": "1.1.0", 370 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 371 | "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", 372 | "engines": { 373 | "node": ">=0.10.0" 374 | } 375 | }, 376 | "node_modules/color": { 377 | "version": "3.2.1", 378 | "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", 379 | "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", 380 | "dependencies": { 381 | "color-convert": "^1.9.3", 382 | "color-string": "^1.6.0" 383 | } 384 | }, 385 | "node_modules/color-convert": { 386 | "version": "1.9.3", 387 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 388 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 389 | "dependencies": { 390 | "color-name": "1.1.3" 391 | } 392 | }, 393 | "node_modules/color-name": { 394 | "version": "1.1.3", 395 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 396 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" 397 | }, 398 | "node_modules/color-string": { 399 | "version": "1.9.1", 400 | "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", 401 | "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", 402 | "dependencies": { 403 | "color-name": "^1.0.0", 404 | "simple-swizzle": "^0.2.2" 405 | } 406 | }, 407 | "node_modules/color-support": { 408 | "version": "1.1.3", 409 | "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", 410 | "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", 411 | "optional": true, 412 | "bin": { 413 | "color-support": "bin.js" 414 | } 415 | }, 416 | "node_modules/colorspace": { 417 | "version": "1.1.4", 418 | "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", 419 | "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", 420 | "dependencies": { 421 | "color": "^3.1.3", 422 | "text-hex": "1.0.x" 423 | } 424 | }, 425 | "node_modules/command-exists": { 426 | "version": "1.2.9", 427 | "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", 428 | "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" 429 | }, 430 | "node_modules/commander": { 431 | "version": "8.3.0", 432 | "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", 433 | "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", 434 | "engines": { 435 | "node": ">= 12" 436 | } 437 | }, 438 | "node_modules/concat-map": { 439 | "version": "0.0.1", 440 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 441 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 442 | "optional": true 443 | }, 444 | "node_modules/console-control-strings": { 445 | "version": "1.1.0", 446 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 447 | "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", 448 | "optional": true 449 | }, 450 | "node_modules/core-js": { 451 | "version": "2.6.12", 452 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", 453 | "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", 454 | "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", 455 | "hasInstallScript": true 456 | }, 457 | "node_modules/data-uri-to-buffer": { 458 | "version": "4.0.1", 459 | "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", 460 | "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", 461 | "engines": { 462 | "node": ">= 12" 463 | } 464 | }, 465 | "node_modules/debug": { 466 | "version": "4.3.7", 467 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", 468 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", 469 | "optional": true, 470 | "dependencies": { 471 | "ms": "^2.1.3" 472 | }, 473 | "engines": { 474 | "node": ">=6.0" 475 | }, 476 | "peerDependenciesMeta": { 477 | "supports-color": { 478 | "optional": true 479 | } 480 | } 481 | }, 482 | "node_modules/decompress-response": { 483 | "version": "6.0.0", 484 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", 485 | "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", 486 | "dependencies": { 487 | "mimic-response": "^3.1.0" 488 | }, 489 | "engines": { 490 | "node": ">=10" 491 | }, 492 | "funding": { 493 | "url": "https://github.com/sponsors/sindresorhus" 494 | } 495 | }, 496 | "node_modules/deep-extend": { 497 | "version": "0.6.0", 498 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 499 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 500 | "engines": { 501 | "node": ">=4.0.0" 502 | } 503 | }, 504 | "node_modules/delegates": { 505 | "version": "1.0.0", 506 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 507 | "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", 508 | "optional": true 509 | }, 510 | "node_modules/detect-libc": { 511 | "version": "2.0.3", 512 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", 513 | "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", 514 | "engines": { 515 | "node": ">=8" 516 | } 517 | }, 518 | "node_modules/emoji-regex": { 519 | "version": "8.0.0", 520 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 521 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 522 | }, 523 | "node_modules/enabled": { 524 | "version": "2.0.0", 525 | "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", 526 | "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" 527 | }, 528 | "node_modules/encoding": { 529 | "version": "0.1.13", 530 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", 531 | "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", 532 | "optional": true, 533 | "dependencies": { 534 | "iconv-lite": "^0.6.2" 535 | } 536 | }, 537 | "node_modules/end-of-stream": { 538 | "version": "1.4.4", 539 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 540 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 541 | "dependencies": { 542 | "once": "^1.4.0" 543 | } 544 | }, 545 | "node_modules/env-paths": { 546 | "version": "2.2.1", 547 | "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", 548 | "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", 549 | "optional": true, 550 | "engines": { 551 | "node": ">=6" 552 | } 553 | }, 554 | "node_modules/err-code": { 555 | "version": "2.0.3", 556 | "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", 557 | "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", 558 | "optional": true 559 | }, 560 | "node_modules/escape-string-regexp": { 561 | "version": "1.0.5", 562 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 563 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 564 | "engines": { 565 | "node": ">=0.8.0" 566 | } 567 | }, 568 | "node_modules/ethers": { 569 | "version": "6.13.2", 570 | "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.2.tgz", 571 | "integrity": "sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg==", 572 | "funding": [ 573 | { 574 | "type": "individual", 575 | "url": "https://github.com/sponsors/ethers-io/" 576 | }, 577 | { 578 | "type": "individual", 579 | "url": "https://www.buymeacoffee.com/ricmoo" 580 | } 581 | ], 582 | "dependencies": { 583 | "@adraffy/ens-normalize": "1.10.1", 584 | "@noble/curves": "1.2.0", 585 | "@noble/hashes": "1.3.2", 586 | "@types/node": "18.15.13", 587 | "aes-js": "4.0.0-beta.5", 588 | "tslib": "2.4.0", 589 | "ws": "8.17.1" 590 | }, 591 | "engines": { 592 | "node": ">=14.0.0" 593 | } 594 | }, 595 | "node_modules/ethers/node_modules/tslib": { 596 | "version": "2.4.0", 597 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", 598 | "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" 599 | }, 600 | "node_modules/exit-hook": { 601 | "version": "1.1.1", 602 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", 603 | "integrity": "sha512-MsG3prOVw1WtLXAZbM3KiYtooKR1LvxHh3VHsVtIy0uiUu8usxgB/94DP2HxtD/661lLdB6yzQ09lGJSQr6nkg==", 604 | "engines": { 605 | "node": ">=0.10.0" 606 | } 607 | }, 608 | "node_modules/expand-template": { 609 | "version": "2.0.3", 610 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 611 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", 612 | "engines": { 613 | "node": ">=6" 614 | } 615 | }, 616 | "node_modules/fecha": { 617 | "version": "4.2.3", 618 | "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", 619 | "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" 620 | }, 621 | "node_modules/fetch-blob": { 622 | "version": "3.2.0", 623 | "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", 624 | "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", 625 | "funding": [ 626 | { 627 | "type": "github", 628 | "url": "https://github.com/sponsors/jimmywarting" 629 | }, 630 | { 631 | "type": "paypal", 632 | "url": "https://paypal.me/jimmywarting" 633 | } 634 | ], 635 | "dependencies": { 636 | "node-domexception": "^1.0.0", 637 | "web-streams-polyfill": "^3.0.3" 638 | }, 639 | "engines": { 640 | "node": "^12.20 || >= 14.13" 641 | } 642 | }, 643 | "node_modules/figures": { 644 | "version": "1.7.0", 645 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 646 | "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", 647 | "dependencies": { 648 | "escape-string-regexp": "^1.0.5", 649 | "object-assign": "^4.1.0" 650 | }, 651 | "engines": { 652 | "node": ">=0.10.0" 653 | } 654 | }, 655 | "node_modules/file-uri-to-path": { 656 | "version": "1.0.0", 657 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 658 | "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" 659 | }, 660 | "node_modules/fn.name": { 661 | "version": "1.1.0", 662 | "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", 663 | "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" 664 | }, 665 | "node_modules/follow-redirects": { 666 | "version": "1.15.9", 667 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", 668 | "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", 669 | "funding": [ 670 | { 671 | "type": "individual", 672 | "url": "https://github.com/sponsors/RubenVerborgh" 673 | } 674 | ], 675 | "engines": { 676 | "node": ">=4.0" 677 | }, 678 | "peerDependenciesMeta": { 679 | "debug": { 680 | "optional": true 681 | } 682 | } 683 | }, 684 | "node_modules/formdata-polyfill": { 685 | "version": "4.0.10", 686 | "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", 687 | "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", 688 | "dependencies": { 689 | "fetch-blob": "^3.1.2" 690 | }, 691 | "engines": { 692 | "node": ">=12.20.0" 693 | } 694 | }, 695 | "node_modules/fs-constants": { 696 | "version": "1.0.0", 697 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 698 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 699 | }, 700 | "node_modules/fs-minipass": { 701 | "version": "2.1.0", 702 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", 703 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", 704 | "dependencies": { 705 | "minipass": "^3.0.0" 706 | }, 707 | "engines": { 708 | "node": ">= 8" 709 | } 710 | }, 711 | "node_modules/fs.realpath": { 712 | "version": "1.0.0", 713 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 714 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 715 | "optional": true 716 | }, 717 | "node_modules/gauge": { 718 | "version": "4.0.4", 719 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", 720 | "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", 721 | "deprecated": "This package is no longer supported.", 722 | "optional": true, 723 | "dependencies": { 724 | "aproba": "^1.0.3 || ^2.0.0", 725 | "color-support": "^1.1.3", 726 | "console-control-strings": "^1.1.0", 727 | "has-unicode": "^2.0.1", 728 | "signal-exit": "^3.0.7", 729 | "string-width": "^4.2.3", 730 | "strip-ansi": "^6.0.1", 731 | "wide-align": "^1.1.5" 732 | }, 733 | "engines": { 734 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 735 | } 736 | }, 737 | "node_modules/github-from-package": { 738 | "version": "0.0.0", 739 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 740 | "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" 741 | }, 742 | "node_modules/glob": { 743 | "version": "7.2.3", 744 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 745 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 746 | "deprecated": "Glob versions prior to v9 are no longer supported", 747 | "optional": true, 748 | "dependencies": { 749 | "fs.realpath": "^1.0.0", 750 | "inflight": "^1.0.4", 751 | "inherits": "2", 752 | "minimatch": "^3.1.1", 753 | "once": "^1.3.0", 754 | "path-is-absolute": "^1.0.0" 755 | }, 756 | "engines": { 757 | "node": "*" 758 | }, 759 | "funding": { 760 | "url": "https://github.com/sponsors/isaacs" 761 | } 762 | }, 763 | "node_modules/graceful-fs": { 764 | "version": "4.2.11", 765 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 766 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", 767 | "optional": true 768 | }, 769 | "node_modules/has-ansi": { 770 | "version": "2.0.0", 771 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 772 | "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", 773 | "dependencies": { 774 | "ansi-regex": "^2.0.0" 775 | }, 776 | "engines": { 777 | "node": ">=0.10.0" 778 | } 779 | }, 780 | "node_modules/has-ansi/node_modules/ansi-regex": { 781 | "version": "2.1.1", 782 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 783 | "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", 784 | "engines": { 785 | "node": ">=0.10.0" 786 | } 787 | }, 788 | "node_modules/has-unicode": { 789 | "version": "2.0.1", 790 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 791 | "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", 792 | "optional": true 793 | }, 794 | "node_modules/http-cache-semantics": { 795 | "version": "4.1.1", 796 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", 797 | "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", 798 | "optional": true 799 | }, 800 | "node_modules/http-proxy-agent": { 801 | "version": "4.0.1", 802 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", 803 | "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", 804 | "optional": true, 805 | "dependencies": { 806 | "@tootallnate/once": "1", 807 | "agent-base": "6", 808 | "debug": "4" 809 | }, 810 | "engines": { 811 | "node": ">= 6" 812 | } 813 | }, 814 | "node_modules/http-proxy-agent/node_modules/agent-base": { 815 | "version": "6.0.2", 816 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 817 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 818 | "optional": true, 819 | "dependencies": { 820 | "debug": "4" 821 | }, 822 | "engines": { 823 | "node": ">= 6.0.0" 824 | } 825 | }, 826 | "node_modules/humanize-ms": { 827 | "version": "1.2.1", 828 | "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", 829 | "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", 830 | "optional": true, 831 | "dependencies": { 832 | "ms": "^2.0.0" 833 | } 834 | }, 835 | "node_modules/iconv-lite": { 836 | "version": "0.6.3", 837 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", 838 | "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", 839 | "optional": true, 840 | "dependencies": { 841 | "safer-buffer": ">= 2.1.2 < 3.0.0" 842 | }, 843 | "engines": { 844 | "node": ">=0.10.0" 845 | } 846 | }, 847 | "node_modules/ieee754": { 848 | "version": "1.2.1", 849 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 850 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 851 | "funding": [ 852 | { 853 | "type": "github", 854 | "url": "https://github.com/sponsors/feross" 855 | }, 856 | { 857 | "type": "patreon", 858 | "url": "https://www.patreon.com/feross" 859 | }, 860 | { 861 | "type": "consulting", 862 | "url": "https://feross.org/support" 863 | } 864 | ] 865 | }, 866 | "node_modules/imurmurhash": { 867 | "version": "0.1.4", 868 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 869 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 870 | "optional": true, 871 | "engines": { 872 | "node": ">=0.8.19" 873 | } 874 | }, 875 | "node_modules/indent-string": { 876 | "version": "4.0.0", 877 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", 878 | "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", 879 | "optional": true, 880 | "engines": { 881 | "node": ">=8" 882 | } 883 | }, 884 | "node_modules/infer-owner": { 885 | "version": "1.0.4", 886 | "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", 887 | "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", 888 | "optional": true 889 | }, 890 | "node_modules/inflight": { 891 | "version": "1.0.6", 892 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 893 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 894 | "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", 895 | "optional": true, 896 | "dependencies": { 897 | "once": "^1.3.0", 898 | "wrappy": "1" 899 | } 900 | }, 901 | "node_modules/inherits": { 902 | "version": "2.0.4", 903 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 904 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 905 | }, 906 | "node_modules/ini": { 907 | "version": "1.3.8", 908 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 909 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" 910 | }, 911 | "node_modules/input": { 912 | "version": "1.0.1", 913 | "resolved": "https://registry.npmjs.org/input/-/input-1.0.1.tgz", 914 | "integrity": "sha512-5DKQKQ7Nm/CaPGYKF74uUvk5ftC3S04fLYWcDrNG2rOVhhRgB4E2J8JNb7AAh+RlQ/954ukas4bEbrRQ3/kPGA==", 915 | "dependencies": { 916 | "babel-runtime": "^6.6.1", 917 | "chalk": "^1.1.1", 918 | "inquirer": "^0.12.0", 919 | "lodash": "^4.6.1" 920 | }, 921 | "engines": { 922 | "node": ">=0.12" 923 | } 924 | }, 925 | "node_modules/input/node_modules/ansi-regex": { 926 | "version": "2.1.1", 927 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 928 | "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", 929 | "engines": { 930 | "node": ">=0.10.0" 931 | } 932 | }, 933 | "node_modules/input/node_modules/ansi-styles": { 934 | "version": "2.2.1", 935 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 936 | "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", 937 | "engines": { 938 | "node": ">=0.10.0" 939 | } 940 | }, 941 | "node_modules/input/node_modules/chalk": { 942 | "version": "1.1.3", 943 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 944 | "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", 945 | "dependencies": { 946 | "ansi-styles": "^2.2.1", 947 | "escape-string-regexp": "^1.0.2", 948 | "has-ansi": "^2.0.0", 949 | "strip-ansi": "^3.0.0", 950 | "supports-color": "^2.0.0" 951 | }, 952 | "engines": { 953 | "node": ">=0.10.0" 954 | } 955 | }, 956 | "node_modules/input/node_modules/strip-ansi": { 957 | "version": "3.0.1", 958 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 959 | "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", 960 | "dependencies": { 961 | "ansi-regex": "^2.0.0" 962 | }, 963 | "engines": { 964 | "node": ">=0.10.0" 965 | } 966 | }, 967 | "node_modules/input/node_modules/supports-color": { 968 | "version": "2.0.0", 969 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 970 | "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", 971 | "engines": { 972 | "node": ">=0.8.0" 973 | } 974 | }, 975 | "node_modules/inquirer": { 976 | "version": "0.12.0", 977 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", 978 | "integrity": "sha512-bOetEz5+/WpgaW4D1NYOk1aD+JCqRjqu/FwRFgnIfiP7FC/zinsrfyO1vlS3nyH/R7S0IH3BIHBu4DBIDSqiGQ==", 979 | "dependencies": { 980 | "ansi-escapes": "^1.1.0", 981 | "ansi-regex": "^2.0.0", 982 | "chalk": "^1.0.0", 983 | "cli-cursor": "^1.0.1", 984 | "cli-width": "^2.0.0", 985 | "figures": "^1.3.5", 986 | "lodash": "^4.3.0", 987 | "readline2": "^1.0.1", 988 | "run-async": "^0.1.0", 989 | "rx-lite": "^3.1.2", 990 | "string-width": "^1.0.1", 991 | "strip-ansi": "^3.0.0", 992 | "through": "^2.3.6" 993 | } 994 | }, 995 | "node_modules/inquirer/node_modules/ansi-escapes": { 996 | "version": "1.4.0", 997 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", 998 | "integrity": "sha512-wiXutNjDUlNEDWHcYH3jtZUhd3c4/VojassD8zHdHCY13xbZy2XbW+NKQwA0tWGBVzDA9qEzYwfoSsWmviidhw==", 999 | "engines": { 1000 | "node": ">=0.10.0" 1001 | } 1002 | }, 1003 | "node_modules/inquirer/node_modules/ansi-regex": { 1004 | "version": "2.1.1", 1005 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 1006 | "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", 1007 | "engines": { 1008 | "node": ">=0.10.0" 1009 | } 1010 | }, 1011 | "node_modules/inquirer/node_modules/ansi-styles": { 1012 | "version": "2.2.1", 1013 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 1014 | "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", 1015 | "engines": { 1016 | "node": ">=0.10.0" 1017 | } 1018 | }, 1019 | "node_modules/inquirer/node_modules/chalk": { 1020 | "version": "1.1.3", 1021 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 1022 | "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", 1023 | "dependencies": { 1024 | "ansi-styles": "^2.2.1", 1025 | "escape-string-regexp": "^1.0.2", 1026 | "has-ansi": "^2.0.0", 1027 | "strip-ansi": "^3.0.0", 1028 | "supports-color": "^2.0.0" 1029 | }, 1030 | "engines": { 1031 | "node": ">=0.10.0" 1032 | } 1033 | }, 1034 | "node_modules/inquirer/node_modules/is-fullwidth-code-point": { 1035 | "version": "1.0.0", 1036 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1037 | "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", 1038 | "dependencies": { 1039 | "number-is-nan": "^1.0.0" 1040 | }, 1041 | "engines": { 1042 | "node": ">=0.10.0" 1043 | } 1044 | }, 1045 | "node_modules/inquirer/node_modules/string-width": { 1046 | "version": "1.0.2", 1047 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1048 | "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", 1049 | "dependencies": { 1050 | "code-point-at": "^1.0.0", 1051 | "is-fullwidth-code-point": "^1.0.0", 1052 | "strip-ansi": "^3.0.0" 1053 | }, 1054 | "engines": { 1055 | "node": ">=0.10.0" 1056 | } 1057 | }, 1058 | "node_modules/inquirer/node_modules/strip-ansi": { 1059 | "version": "3.0.1", 1060 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1061 | "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", 1062 | "dependencies": { 1063 | "ansi-regex": "^2.0.0" 1064 | }, 1065 | "engines": { 1066 | "node": ">=0.10.0" 1067 | } 1068 | }, 1069 | "node_modules/inquirer/node_modules/supports-color": { 1070 | "version": "2.0.0", 1071 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1072 | "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", 1073 | "engines": { 1074 | "node": ">=0.8.0" 1075 | } 1076 | }, 1077 | "node_modules/ip-address": { 1078 | "version": "9.0.5", 1079 | "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", 1080 | "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", 1081 | "optional": true, 1082 | "dependencies": { 1083 | "jsbn": "1.1.0", 1084 | "sprintf-js": "^1.1.3" 1085 | }, 1086 | "engines": { 1087 | "node": ">= 12" 1088 | } 1089 | }, 1090 | "node_modules/is-arrayish": { 1091 | "version": "0.3.2", 1092 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", 1093 | "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" 1094 | }, 1095 | "node_modules/is-fullwidth-code-point": { 1096 | "version": "3.0.0", 1097 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1098 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1099 | "engines": { 1100 | "node": ">=8" 1101 | } 1102 | }, 1103 | "node_modules/is-lambda": { 1104 | "version": "1.0.1", 1105 | "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", 1106 | "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", 1107 | "optional": true 1108 | }, 1109 | "node_modules/is-stream": { 1110 | "version": "2.0.1", 1111 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", 1112 | "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", 1113 | "engines": { 1114 | "node": ">=8" 1115 | }, 1116 | "funding": { 1117 | "url": "https://github.com/sponsors/sindresorhus" 1118 | } 1119 | }, 1120 | "node_modules/isexe": { 1121 | "version": "2.0.0", 1122 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1123 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1124 | "optional": true 1125 | }, 1126 | "node_modules/js-sha3": { 1127 | "version": "0.8.0", 1128 | "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", 1129 | "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" 1130 | }, 1131 | "node_modules/jsbn": { 1132 | "version": "1.1.0", 1133 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", 1134 | "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", 1135 | "optional": true 1136 | }, 1137 | "node_modules/kuler": { 1138 | "version": "2.0.0", 1139 | "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", 1140 | "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" 1141 | }, 1142 | "node_modules/lodash": { 1143 | "version": "4.17.21", 1144 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1145 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1146 | }, 1147 | "node_modules/logform": { 1148 | "version": "2.6.0", 1149 | "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", 1150 | "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", 1151 | "dependencies": { 1152 | "@colors/colors": "1.6.0", 1153 | "@types/triple-beam": "^1.3.2", 1154 | "fecha": "^4.2.0", 1155 | "ms": "^2.1.1", 1156 | "safe-stable-stringify": "^2.3.1", 1157 | "triple-beam": "^1.3.0" 1158 | }, 1159 | "engines": { 1160 | "node": ">= 12.0.0" 1161 | } 1162 | }, 1163 | "node_modules/lru-cache": { 1164 | "version": "6.0.0", 1165 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1166 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1167 | "optional": true, 1168 | "dependencies": { 1169 | "yallist": "^4.0.0" 1170 | }, 1171 | "engines": { 1172 | "node": ">=10" 1173 | } 1174 | }, 1175 | "node_modules/make-fetch-happen": { 1176 | "version": "9.1.0", 1177 | "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", 1178 | "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", 1179 | "optional": true, 1180 | "dependencies": { 1181 | "agentkeepalive": "^4.1.3", 1182 | "cacache": "^15.2.0", 1183 | "http-cache-semantics": "^4.1.0", 1184 | "http-proxy-agent": "^4.0.1", 1185 | "https-proxy-agent": "^5.0.0", 1186 | "is-lambda": "^1.0.1", 1187 | "lru-cache": "^6.0.0", 1188 | "minipass": "^3.1.3", 1189 | "minipass-collect": "^1.0.2", 1190 | "minipass-fetch": "^1.3.2", 1191 | "minipass-flush": "^1.0.5", 1192 | "minipass-pipeline": "^1.2.4", 1193 | "negotiator": "^0.6.2", 1194 | "promise-retry": "^2.0.1", 1195 | "socks-proxy-agent": "^6.0.0", 1196 | "ssri": "^8.0.0" 1197 | }, 1198 | "engines": { 1199 | "node": ">= 10" 1200 | } 1201 | }, 1202 | "node_modules/make-fetch-happen/node_modules/agent-base": { 1203 | "version": "6.0.2", 1204 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 1205 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 1206 | "optional": true, 1207 | "dependencies": { 1208 | "debug": "4" 1209 | }, 1210 | "engines": { 1211 | "node": ">= 6.0.0" 1212 | } 1213 | }, 1214 | "node_modules/make-fetch-happen/node_modules/https-proxy-agent": { 1215 | "version": "5.0.1", 1216 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 1217 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", 1218 | "optional": true, 1219 | "dependencies": { 1220 | "agent-base": "6", 1221 | "debug": "4" 1222 | }, 1223 | "engines": { 1224 | "node": ">= 6" 1225 | } 1226 | }, 1227 | "node_modules/memorystream": { 1228 | "version": "0.3.1", 1229 | "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", 1230 | "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", 1231 | "engines": { 1232 | "node": ">= 0.10.0" 1233 | } 1234 | }, 1235 | "node_modules/mimic-fn": { 1236 | "version": "2.1.0", 1237 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1238 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1239 | "engines": { 1240 | "node": ">=6" 1241 | } 1242 | }, 1243 | "node_modules/mimic-response": { 1244 | "version": "3.1.0", 1245 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", 1246 | "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", 1247 | "engines": { 1248 | "node": ">=10" 1249 | }, 1250 | "funding": { 1251 | "url": "https://github.com/sponsors/sindresorhus" 1252 | } 1253 | }, 1254 | "node_modules/minimatch": { 1255 | "version": "3.1.2", 1256 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1257 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1258 | "optional": true, 1259 | "dependencies": { 1260 | "brace-expansion": "^1.1.7" 1261 | }, 1262 | "engines": { 1263 | "node": "*" 1264 | } 1265 | }, 1266 | "node_modules/minimist": { 1267 | "version": "1.2.8", 1268 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1269 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1270 | "funding": { 1271 | "url": "https://github.com/sponsors/ljharb" 1272 | } 1273 | }, 1274 | "node_modules/minipass": { 1275 | "version": "3.3.6", 1276 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", 1277 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", 1278 | "dependencies": { 1279 | "yallist": "^4.0.0" 1280 | }, 1281 | "engines": { 1282 | "node": ">=8" 1283 | } 1284 | }, 1285 | "node_modules/minipass-collect": { 1286 | "version": "1.0.2", 1287 | "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", 1288 | "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", 1289 | "optional": true, 1290 | "dependencies": { 1291 | "minipass": "^3.0.0" 1292 | }, 1293 | "engines": { 1294 | "node": ">= 8" 1295 | } 1296 | }, 1297 | "node_modules/minipass-fetch": { 1298 | "version": "1.4.1", 1299 | "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", 1300 | "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", 1301 | "optional": true, 1302 | "dependencies": { 1303 | "minipass": "^3.1.0", 1304 | "minipass-sized": "^1.0.3", 1305 | "minizlib": "^2.0.0" 1306 | }, 1307 | "engines": { 1308 | "node": ">=8" 1309 | }, 1310 | "optionalDependencies": { 1311 | "encoding": "^0.1.12" 1312 | } 1313 | }, 1314 | "node_modules/minipass-flush": { 1315 | "version": "1.0.5", 1316 | "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", 1317 | "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", 1318 | "optional": true, 1319 | "dependencies": { 1320 | "minipass": "^3.0.0" 1321 | }, 1322 | "engines": { 1323 | "node": ">= 8" 1324 | } 1325 | }, 1326 | "node_modules/minipass-pipeline": { 1327 | "version": "1.2.4", 1328 | "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", 1329 | "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", 1330 | "optional": true, 1331 | "dependencies": { 1332 | "minipass": "^3.0.0" 1333 | }, 1334 | "engines": { 1335 | "node": ">=8" 1336 | } 1337 | }, 1338 | "node_modules/minipass-sized": { 1339 | "version": "1.0.3", 1340 | "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", 1341 | "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", 1342 | "optional": true, 1343 | "dependencies": { 1344 | "minipass": "^3.0.0" 1345 | }, 1346 | "engines": { 1347 | "node": ">=8" 1348 | } 1349 | }, 1350 | "node_modules/minizlib": { 1351 | "version": "2.1.2", 1352 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", 1353 | "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", 1354 | "dependencies": { 1355 | "minipass": "^3.0.0", 1356 | "yallist": "^4.0.0" 1357 | }, 1358 | "engines": { 1359 | "node": ">= 8" 1360 | } 1361 | }, 1362 | "node_modules/mkdirp": { 1363 | "version": "1.0.4", 1364 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 1365 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", 1366 | "bin": { 1367 | "mkdirp": "bin/cmd.js" 1368 | }, 1369 | "engines": { 1370 | "node": ">=10" 1371 | } 1372 | }, 1373 | "node_modules/mkdirp-classic": { 1374 | "version": "0.5.3", 1375 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 1376 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" 1377 | }, 1378 | "node_modules/moment": { 1379 | "version": "2.30.1", 1380 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", 1381 | "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", 1382 | "engines": { 1383 | "node": "*" 1384 | } 1385 | }, 1386 | "node_modules/moment-timezone": { 1387 | "version": "0.5.45", 1388 | "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz", 1389 | "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==", 1390 | "dependencies": { 1391 | "moment": "^2.29.4" 1392 | }, 1393 | "engines": { 1394 | "node": "*" 1395 | } 1396 | }, 1397 | "node_modules/ms": { 1398 | "version": "2.1.3", 1399 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1400 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1401 | }, 1402 | "node_modules/mute-stream": { 1403 | "version": "0.0.5", 1404 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", 1405 | "integrity": "sha512-EbrziT4s8cWPmzr47eYVW3wimS4HsvlnV5ri1xw1aR6JQo/OrJX5rkl32K/QQHdxeabJETtfeaROGhd8W7uBgg==" 1406 | }, 1407 | "node_modules/napi-build-utils": { 1408 | "version": "1.0.2", 1409 | "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", 1410 | "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" 1411 | }, 1412 | "node_modules/negotiator": { 1413 | "version": "0.6.4", 1414 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", 1415 | "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", 1416 | "optional": true, 1417 | "engines": { 1418 | "node": ">= 0.6" 1419 | } 1420 | }, 1421 | "node_modules/node-abi": { 1422 | "version": "3.71.0", 1423 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", 1424 | "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", 1425 | "dependencies": { 1426 | "semver": "^7.3.5" 1427 | }, 1428 | "engines": { 1429 | "node": ">=10" 1430 | } 1431 | }, 1432 | "node_modules/node-abi/node_modules/semver": { 1433 | "version": "7.6.3", 1434 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", 1435 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", 1436 | "bin": { 1437 | "semver": "bin/semver.js" 1438 | }, 1439 | "engines": { 1440 | "node": ">=10" 1441 | } 1442 | }, 1443 | "node_modules/node-addon-api": { 1444 | "version": "7.1.1", 1445 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", 1446 | "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==" 1447 | }, 1448 | "node_modules/node-domexception": { 1449 | "version": "1.0.0", 1450 | "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", 1451 | "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", 1452 | "funding": [ 1453 | { 1454 | "type": "github", 1455 | "url": "https://github.com/sponsors/jimmywarting" 1456 | }, 1457 | { 1458 | "type": "github", 1459 | "url": "https://paypal.me/jimmywarting" 1460 | } 1461 | ], 1462 | "engines": { 1463 | "node": ">=10.5.0" 1464 | } 1465 | }, 1466 | "node_modules/node-fetch": { 1467 | "version": "3.3.2", 1468 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", 1469 | "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", 1470 | "dependencies": { 1471 | "data-uri-to-buffer": "^4.0.0", 1472 | "fetch-blob": "^3.1.4", 1473 | "formdata-polyfill": "^4.0.10" 1474 | }, 1475 | "engines": { 1476 | "node": "^12.20.0 || ^14.13.1 || >=16.0.0" 1477 | }, 1478 | "funding": { 1479 | "type": "opencollective", 1480 | "url": "https://opencollective.com/node-fetch" 1481 | } 1482 | }, 1483 | "node_modules/node-gyp": { 1484 | "version": "8.4.1", 1485 | "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", 1486 | "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", 1487 | "optional": true, 1488 | "dependencies": { 1489 | "env-paths": "^2.2.0", 1490 | "glob": "^7.1.4", 1491 | "graceful-fs": "^4.2.6", 1492 | "make-fetch-happen": "^9.1.0", 1493 | "nopt": "^5.0.0", 1494 | "npmlog": "^6.0.0", 1495 | "rimraf": "^3.0.2", 1496 | "semver": "^7.3.5", 1497 | "tar": "^6.1.2", 1498 | "which": "^2.0.2" 1499 | }, 1500 | "bin": { 1501 | "node-gyp": "bin/node-gyp.js" 1502 | }, 1503 | "engines": { 1504 | "node": ">= 10.12.0" 1505 | } 1506 | }, 1507 | "node_modules/node-gyp-build": { 1508 | "version": "4.8.1", 1509 | "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", 1510 | "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", 1511 | "optional": true, 1512 | "peer": true, 1513 | "bin": { 1514 | "node-gyp-build": "bin.js", 1515 | "node-gyp-build-optional": "optional.js", 1516 | "node-gyp-build-test": "build-test.js" 1517 | } 1518 | }, 1519 | "node_modules/node-gyp/node_modules/semver": { 1520 | "version": "7.6.3", 1521 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", 1522 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", 1523 | "optional": true, 1524 | "bin": { 1525 | "semver": "bin/semver.js" 1526 | }, 1527 | "engines": { 1528 | "node": ">=10" 1529 | } 1530 | }, 1531 | "node_modules/nopt": { 1532 | "version": "5.0.0", 1533 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", 1534 | "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", 1535 | "optional": true, 1536 | "dependencies": { 1537 | "abbrev": "1" 1538 | }, 1539 | "bin": { 1540 | "nopt": "bin/nopt.js" 1541 | }, 1542 | "engines": { 1543 | "node": ">=6" 1544 | } 1545 | }, 1546 | "node_modules/npmlog": { 1547 | "version": "6.0.2", 1548 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", 1549 | "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", 1550 | "deprecated": "This package is no longer supported.", 1551 | "optional": true, 1552 | "dependencies": { 1553 | "are-we-there-yet": "^3.0.0", 1554 | "console-control-strings": "^1.1.0", 1555 | "gauge": "^4.0.3", 1556 | "set-blocking": "^2.0.0" 1557 | }, 1558 | "engines": { 1559 | "node": "^12.13.0 || ^14.15.0 || >=16.0.0" 1560 | } 1561 | }, 1562 | "node_modules/number-is-nan": { 1563 | "version": "1.0.1", 1564 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1565 | "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", 1566 | "engines": { 1567 | "node": ">=0.10.0" 1568 | } 1569 | }, 1570 | "node_modules/object-assign": { 1571 | "version": "4.1.1", 1572 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1573 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1574 | "engines": { 1575 | "node": ">=0.10.0" 1576 | } 1577 | }, 1578 | "node_modules/once": { 1579 | "version": "1.4.0", 1580 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1581 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1582 | "dependencies": { 1583 | "wrappy": "1" 1584 | } 1585 | }, 1586 | "node_modules/one-time": { 1587 | "version": "1.0.0", 1588 | "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", 1589 | "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", 1590 | "dependencies": { 1591 | "fn.name": "1.x.x" 1592 | } 1593 | }, 1594 | "node_modules/onetime": { 1595 | "version": "1.1.0", 1596 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", 1597 | "integrity": "sha512-GZ+g4jayMqzCRMgB2sol7GiCLjKfS1PINkjmx8spcKce1LiVqcbQreXwqs2YAFXC6R03VIG28ZS31t8M866v6A==", 1598 | "engines": { 1599 | "node": ">=0.10.0" 1600 | } 1601 | }, 1602 | "node_modules/os-tmpdir": { 1603 | "version": "1.0.2", 1604 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1605 | "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", 1606 | "engines": { 1607 | "node": ">=0.10.0" 1608 | } 1609 | }, 1610 | "node_modules/p-map": { 1611 | "version": "4.0.0", 1612 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", 1613 | "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", 1614 | "optional": true, 1615 | "dependencies": { 1616 | "aggregate-error": "^3.0.0" 1617 | }, 1618 | "engines": { 1619 | "node": ">=10" 1620 | }, 1621 | "funding": { 1622 | "url": "https://github.com/sponsors/sindresorhus" 1623 | } 1624 | }, 1625 | "node_modules/path-is-absolute": { 1626 | "version": "1.0.1", 1627 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1628 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1629 | "optional": true, 1630 | "engines": { 1631 | "node": ">=0.10.0" 1632 | } 1633 | }, 1634 | "node_modules/prebuild-install": { 1635 | "version": "7.1.2", 1636 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", 1637 | "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", 1638 | "dependencies": { 1639 | "detect-libc": "^2.0.0", 1640 | "expand-template": "^2.0.3", 1641 | "github-from-package": "0.0.0", 1642 | "minimist": "^1.2.3", 1643 | "mkdirp-classic": "^0.5.3", 1644 | "napi-build-utils": "^1.0.1", 1645 | "node-abi": "^3.3.0", 1646 | "pump": "^3.0.0", 1647 | "rc": "^1.2.7", 1648 | "simple-get": "^4.0.0", 1649 | "tar-fs": "^2.0.0", 1650 | "tunnel-agent": "^0.6.0" 1651 | }, 1652 | "bin": { 1653 | "prebuild-install": "bin.js" 1654 | }, 1655 | "engines": { 1656 | "node": ">=10" 1657 | } 1658 | }, 1659 | "node_modules/promise-inflight": { 1660 | "version": "1.0.1", 1661 | "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", 1662 | "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", 1663 | "optional": true 1664 | }, 1665 | "node_modules/promise-retry": { 1666 | "version": "2.0.1", 1667 | "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", 1668 | "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", 1669 | "optional": true, 1670 | "dependencies": { 1671 | "err-code": "^2.0.2", 1672 | "retry": "^0.12.0" 1673 | }, 1674 | "engines": { 1675 | "node": ">=10" 1676 | } 1677 | }, 1678 | "node_modules/pump": { 1679 | "version": "3.0.2", 1680 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", 1681 | "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", 1682 | "dependencies": { 1683 | "end-of-stream": "^1.1.0", 1684 | "once": "^1.3.1" 1685 | } 1686 | }, 1687 | "node_modules/rc": { 1688 | "version": "1.2.8", 1689 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 1690 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 1691 | "dependencies": { 1692 | "deep-extend": "^0.6.0", 1693 | "ini": "~1.3.0", 1694 | "minimist": "^1.2.0", 1695 | "strip-json-comments": "~2.0.1" 1696 | }, 1697 | "bin": { 1698 | "rc": "cli.js" 1699 | } 1700 | }, 1701 | "node_modules/readable-stream": { 1702 | "version": "3.6.2", 1703 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 1704 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 1705 | "dependencies": { 1706 | "inherits": "^2.0.3", 1707 | "string_decoder": "^1.1.1", 1708 | "util-deprecate": "^1.0.1" 1709 | }, 1710 | "engines": { 1711 | "node": ">= 6" 1712 | } 1713 | }, 1714 | "node_modules/readline2": { 1715 | "version": "1.0.1", 1716 | "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", 1717 | "integrity": "sha512-8/td4MmwUB6PkZUbV25uKz7dfrmjYWxsW8DVfibWdlHRk/l/DfHKn4pU+dfcoGLFgWOdyGCzINRQD7jn+Bv+/g==", 1718 | "dependencies": { 1719 | "code-point-at": "^1.0.0", 1720 | "is-fullwidth-code-point": "^1.0.0", 1721 | "mute-stream": "0.0.5" 1722 | } 1723 | }, 1724 | "node_modules/readline2/node_modules/is-fullwidth-code-point": { 1725 | "version": "1.0.0", 1726 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1727 | "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", 1728 | "dependencies": { 1729 | "number-is-nan": "^1.0.0" 1730 | }, 1731 | "engines": { 1732 | "node": ">=0.10.0" 1733 | } 1734 | }, 1735 | "node_modules/regenerator-runtime": { 1736 | "version": "0.11.1", 1737 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", 1738 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" 1739 | }, 1740 | "node_modules/restore-cursor": { 1741 | "version": "1.0.1", 1742 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", 1743 | "integrity": "sha512-reSjH4HuiFlxlaBaFCiS6O76ZGG2ygKoSlCsipKdaZuKSPx/+bt9mULkn4l0asVzbEfQQmXRg6Wp6gv6m0wElw==", 1744 | "dependencies": { 1745 | "exit-hook": "^1.0.0", 1746 | "onetime": "^1.0.0" 1747 | }, 1748 | "engines": { 1749 | "node": ">=0.10.0" 1750 | } 1751 | }, 1752 | "node_modules/retry": { 1753 | "version": "0.12.0", 1754 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", 1755 | "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", 1756 | "optional": true, 1757 | "engines": { 1758 | "node": ">= 4" 1759 | } 1760 | }, 1761 | "node_modules/rimraf": { 1762 | "version": "3.0.2", 1763 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1764 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1765 | "deprecated": "Rimraf versions prior to v4 are no longer supported", 1766 | "optional": true, 1767 | "dependencies": { 1768 | "glob": "^7.1.3" 1769 | }, 1770 | "bin": { 1771 | "rimraf": "bin.js" 1772 | }, 1773 | "funding": { 1774 | "url": "https://github.com/sponsors/isaacs" 1775 | } 1776 | }, 1777 | "node_modules/run-async": { 1778 | "version": "0.1.0", 1779 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", 1780 | "integrity": "sha512-qOX+w+IxFgpUpJfkv2oGN0+ExPs68F4sZHfaRRx4dDexAQkG83atugKVEylyT5ARees3HBbfmuvnjbrd8j9Wjw==", 1781 | "dependencies": { 1782 | "once": "^1.3.0" 1783 | } 1784 | }, 1785 | "node_modules/rx-lite": { 1786 | "version": "3.1.2", 1787 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", 1788 | "integrity": "sha512-1I1+G2gteLB8Tkt8YI1sJvSIfa0lWuRtC8GjvtyPBcLSF5jBCCJJqKrpER5JU5r6Bhe+i9/pK3VMuUcXu0kdwQ==" 1789 | }, 1790 | "node_modules/safe-buffer": { 1791 | "version": "5.2.1", 1792 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1793 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1794 | "funding": [ 1795 | { 1796 | "type": "github", 1797 | "url": "https://github.com/sponsors/feross" 1798 | }, 1799 | { 1800 | "type": "patreon", 1801 | "url": "https://www.patreon.com/feross" 1802 | }, 1803 | { 1804 | "type": "consulting", 1805 | "url": "https://feross.org/support" 1806 | } 1807 | ] 1808 | }, 1809 | "node_modules/safe-stable-stringify": { 1810 | "version": "2.4.3", 1811 | "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", 1812 | "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", 1813 | "engines": { 1814 | "node": ">=10" 1815 | } 1816 | }, 1817 | "node_modules/safer-buffer": { 1818 | "version": "2.1.2", 1819 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1820 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1821 | "optional": true 1822 | }, 1823 | "node_modules/semver": { 1824 | "version": "5.7.2", 1825 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", 1826 | "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", 1827 | "bin": { 1828 | "semver": "bin/semver" 1829 | } 1830 | }, 1831 | "node_modules/set-blocking": { 1832 | "version": "2.0.0", 1833 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1834 | "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", 1835 | "optional": true 1836 | }, 1837 | "node_modules/signal-exit": { 1838 | "version": "3.0.7", 1839 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", 1840 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" 1841 | }, 1842 | "node_modules/simple-concat": { 1843 | "version": "1.0.1", 1844 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 1845 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", 1846 | "funding": [ 1847 | { 1848 | "type": "github", 1849 | "url": "https://github.com/sponsors/feross" 1850 | }, 1851 | { 1852 | "type": "patreon", 1853 | "url": "https://www.patreon.com/feross" 1854 | }, 1855 | { 1856 | "type": "consulting", 1857 | "url": "https://feross.org/support" 1858 | } 1859 | ] 1860 | }, 1861 | "node_modules/simple-get": { 1862 | "version": "4.0.1", 1863 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", 1864 | "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", 1865 | "funding": [ 1866 | { 1867 | "type": "github", 1868 | "url": "https://github.com/sponsors/feross" 1869 | }, 1870 | { 1871 | "type": "patreon", 1872 | "url": "https://www.patreon.com/feross" 1873 | }, 1874 | { 1875 | "type": "consulting", 1876 | "url": "https://feross.org/support" 1877 | } 1878 | ], 1879 | "dependencies": { 1880 | "decompress-response": "^6.0.0", 1881 | "once": "^1.3.1", 1882 | "simple-concat": "^1.0.0" 1883 | } 1884 | }, 1885 | "node_modules/simple-swizzle": { 1886 | "version": "0.2.2", 1887 | "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 1888 | "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", 1889 | "dependencies": { 1890 | "is-arrayish": "^0.3.1" 1891 | } 1892 | }, 1893 | "node_modules/smart-buffer": { 1894 | "version": "4.2.0", 1895 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", 1896 | "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", 1897 | "optional": true, 1898 | "engines": { 1899 | "node": ">= 6.0.0", 1900 | "npm": ">= 3.0.0" 1901 | } 1902 | }, 1903 | "node_modules/socks": { 1904 | "version": "2.8.3", 1905 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", 1906 | "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", 1907 | "optional": true, 1908 | "dependencies": { 1909 | "ip-address": "^9.0.5", 1910 | "smart-buffer": "^4.2.0" 1911 | }, 1912 | "engines": { 1913 | "node": ">= 10.0.0", 1914 | "npm": ">= 3.0.0" 1915 | } 1916 | }, 1917 | "node_modules/socks-proxy-agent": { 1918 | "version": "6.2.1", 1919 | "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", 1920 | "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", 1921 | "optional": true, 1922 | "dependencies": { 1923 | "agent-base": "^6.0.2", 1924 | "debug": "^4.3.3", 1925 | "socks": "^2.6.2" 1926 | }, 1927 | "engines": { 1928 | "node": ">= 10" 1929 | } 1930 | }, 1931 | "node_modules/socks-proxy-agent/node_modules/agent-base": { 1932 | "version": "6.0.2", 1933 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", 1934 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", 1935 | "optional": true, 1936 | "dependencies": { 1937 | "debug": "4" 1938 | }, 1939 | "engines": { 1940 | "node": ">= 6.0.0" 1941 | } 1942 | }, 1943 | "node_modules/solc": { 1944 | "version": "0.8.28", 1945 | "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.28.tgz", 1946 | "integrity": "sha512-AFCiJ+b4RosyyNhnfdVH4ZR1+TxiL91iluPjw0EJslIu4LXGM9NYqi2z5y8TqochC4tcH9QsHfwWhOIC9jPDKA==", 1947 | "dependencies": { 1948 | "command-exists": "^1.2.8", 1949 | "commander": "^8.1.0", 1950 | "follow-redirects": "^1.12.1", 1951 | "js-sha3": "0.8.0", 1952 | "memorystream": "^0.3.1", 1953 | "semver": "^5.5.0", 1954 | "tmp": "0.0.33" 1955 | }, 1956 | "bin": { 1957 | "solcjs": "solc.js" 1958 | }, 1959 | "engines": { 1960 | "node": ">=10.0.0" 1961 | } 1962 | }, 1963 | "node_modules/sprintf-js": { 1964 | "version": "1.1.3", 1965 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", 1966 | "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", 1967 | "optional": true 1968 | }, 1969 | "node_modules/sqlite": { 1970 | "version": "5.1.1", 1971 | "resolved": "https://registry.npmjs.org/sqlite/-/sqlite-5.1.1.tgz", 1972 | "integrity": "sha512-oBkezXa2hnkfuJwUo44Hl9hS3er+YFtueifoajrgidvqsJRQFpc5fKoAkAor1O5ZnLoa28GBScfHXs8j0K358Q==" 1973 | }, 1974 | "node_modules/sqlite3": { 1975 | "version": "5.1.7", 1976 | "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", 1977 | "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", 1978 | "hasInstallScript": true, 1979 | "dependencies": { 1980 | "bindings": "^1.5.0", 1981 | "node-addon-api": "^7.0.0", 1982 | "prebuild-install": "^7.1.1", 1983 | "tar": "^6.1.11" 1984 | }, 1985 | "optionalDependencies": { 1986 | "node-gyp": "8.x" 1987 | }, 1988 | "peerDependencies": { 1989 | "node-gyp": "8.x" 1990 | }, 1991 | "peerDependenciesMeta": { 1992 | "node-gyp": { 1993 | "optional": true 1994 | } 1995 | } 1996 | }, 1997 | "node_modules/ssri": { 1998 | "version": "8.0.1", 1999 | "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", 2000 | "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", 2001 | "optional": true, 2002 | "dependencies": { 2003 | "minipass": "^3.1.1" 2004 | }, 2005 | "engines": { 2006 | "node": ">= 8" 2007 | } 2008 | }, 2009 | "node_modules/stack-trace": { 2010 | "version": "0.0.10", 2011 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", 2012 | "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", 2013 | "engines": { 2014 | "node": "*" 2015 | } 2016 | }, 2017 | "node_modules/string_decoder": { 2018 | "version": "1.3.0", 2019 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 2020 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 2021 | "dependencies": { 2022 | "safe-buffer": "~5.2.0" 2023 | } 2024 | }, 2025 | "node_modules/string-width": { 2026 | "version": "4.2.3", 2027 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2028 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2029 | "dependencies": { 2030 | "emoji-regex": "^8.0.0", 2031 | "is-fullwidth-code-point": "^3.0.0", 2032 | "strip-ansi": "^6.0.1" 2033 | }, 2034 | "engines": { 2035 | "node": ">=8" 2036 | } 2037 | }, 2038 | "node_modules/strip-ansi": { 2039 | "version": "6.0.1", 2040 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2041 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2042 | "dependencies": { 2043 | "ansi-regex": "^5.0.1" 2044 | }, 2045 | "engines": { 2046 | "node": ">=8" 2047 | } 2048 | }, 2049 | "node_modules/strip-json-comments": { 2050 | "version": "2.0.1", 2051 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2052 | "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", 2053 | "engines": { 2054 | "node": ">=0.10.0" 2055 | } 2056 | }, 2057 | "node_modules/tar": { 2058 | "version": "6.2.1", 2059 | "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", 2060 | "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", 2061 | "dependencies": { 2062 | "chownr": "^2.0.0", 2063 | "fs-minipass": "^2.0.0", 2064 | "minipass": "^5.0.0", 2065 | "minizlib": "^2.1.1", 2066 | "mkdirp": "^1.0.3", 2067 | "yallist": "^4.0.0" 2068 | }, 2069 | "engines": { 2070 | "node": ">=10" 2071 | } 2072 | }, 2073 | "node_modules/tar-fs": { 2074 | "version": "2.1.1", 2075 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", 2076 | "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", 2077 | "dependencies": { 2078 | "chownr": "^1.1.1", 2079 | "mkdirp-classic": "^0.5.2", 2080 | "pump": "^3.0.0", 2081 | "tar-stream": "^2.1.4" 2082 | } 2083 | }, 2084 | "node_modules/tar-fs/node_modules/chownr": { 2085 | "version": "1.1.4", 2086 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 2087 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" 2088 | }, 2089 | "node_modules/tar-stream": { 2090 | "version": "2.2.0", 2091 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", 2092 | "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", 2093 | "dependencies": { 2094 | "bl": "^4.0.3", 2095 | "end-of-stream": "^1.4.1", 2096 | "fs-constants": "^1.0.0", 2097 | "inherits": "^2.0.3", 2098 | "readable-stream": "^3.1.1" 2099 | }, 2100 | "engines": { 2101 | "node": ">=6" 2102 | } 2103 | }, 2104 | "node_modules/tar/node_modules/minipass": { 2105 | "version": "5.0.0", 2106 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", 2107 | "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", 2108 | "engines": { 2109 | "node": ">=8" 2110 | } 2111 | }, 2112 | "node_modules/text-hex": { 2113 | "version": "1.0.0", 2114 | "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", 2115 | "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" 2116 | }, 2117 | "node_modules/through": { 2118 | "version": "2.3.8", 2119 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2120 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" 2121 | }, 2122 | "node_modules/tmp": { 2123 | "version": "0.0.33", 2124 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 2125 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 2126 | "dependencies": { 2127 | "os-tmpdir": "~1.0.2" 2128 | }, 2129 | "engines": { 2130 | "node": ">=0.6.0" 2131 | } 2132 | }, 2133 | "node_modules/triple-beam": { 2134 | "version": "1.4.1", 2135 | "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", 2136 | "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", 2137 | "engines": { 2138 | "node": ">= 14.0.0" 2139 | } 2140 | }, 2141 | "node_modules/tunnel-agent": { 2142 | "version": "0.6.0", 2143 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2144 | "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", 2145 | "dependencies": { 2146 | "safe-buffer": "^5.0.1" 2147 | }, 2148 | "engines": { 2149 | "node": "*" 2150 | } 2151 | }, 2152 | "node_modules/twisters": { 2153 | "version": "1.1.0", 2154 | "resolved": "https://registry.npmjs.org/twisters/-/twisters-1.1.0.tgz", 2155 | "integrity": "sha512-sl1XvWbIF7H8tuGXkjcUMrxKeyhco0fhzckXHZFJ9+IIDQPy/tLkKkRSWC85D883nJaMdJxxkNAO00hN/TD/Dg==", 2156 | "dependencies": { 2157 | "cli-cursor": "^3.1.0", 2158 | "mute-stream": "^0.0.8", 2159 | "string-width": "^4.2.0", 2160 | "wrap-ansi": "^7.0.0" 2161 | } 2162 | }, 2163 | "node_modules/twisters/node_modules/cli-cursor": { 2164 | "version": "3.1.0", 2165 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 2166 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 2167 | "dependencies": { 2168 | "restore-cursor": "^3.1.0" 2169 | }, 2170 | "engines": { 2171 | "node": ">=8" 2172 | } 2173 | }, 2174 | "node_modules/twisters/node_modules/mute-stream": { 2175 | "version": "0.0.8", 2176 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 2177 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" 2178 | }, 2179 | "node_modules/twisters/node_modules/onetime": { 2180 | "version": "5.1.2", 2181 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", 2182 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", 2183 | "dependencies": { 2184 | "mimic-fn": "^2.1.0" 2185 | }, 2186 | "engines": { 2187 | "node": ">=6" 2188 | }, 2189 | "funding": { 2190 | "url": "https://github.com/sponsors/sindresorhus" 2191 | } 2192 | }, 2193 | "node_modules/twisters/node_modules/restore-cursor": { 2194 | "version": "3.1.0", 2195 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 2196 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 2197 | "dependencies": { 2198 | "onetime": "^5.1.0", 2199 | "signal-exit": "^3.0.2" 2200 | }, 2201 | "engines": { 2202 | "node": ">=8" 2203 | } 2204 | }, 2205 | "node_modules/unique-filename": { 2206 | "version": "1.1.1", 2207 | "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", 2208 | "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", 2209 | "optional": true, 2210 | "dependencies": { 2211 | "unique-slug": "^2.0.0" 2212 | } 2213 | }, 2214 | "node_modules/unique-slug": { 2215 | "version": "2.0.2", 2216 | "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", 2217 | "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", 2218 | "optional": true, 2219 | "dependencies": { 2220 | "imurmurhash": "^0.1.4" 2221 | } 2222 | }, 2223 | "node_modules/utf-8-validate": { 2224 | "version": "5.0.10", 2225 | "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", 2226 | "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", 2227 | "hasInstallScript": true, 2228 | "optional": true, 2229 | "peer": true, 2230 | "dependencies": { 2231 | "node-gyp-build": "^4.3.0" 2232 | }, 2233 | "engines": { 2234 | "node": ">=6.14.2" 2235 | } 2236 | }, 2237 | "node_modules/util-deprecate": { 2238 | "version": "1.0.2", 2239 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2240 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 2241 | }, 2242 | "node_modules/web-streams-polyfill": { 2243 | "version": "3.3.3", 2244 | "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", 2245 | "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", 2246 | "engines": { 2247 | "node": ">= 8" 2248 | } 2249 | }, 2250 | "node_modules/which": { 2251 | "version": "2.0.2", 2252 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2253 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2254 | "optional": true, 2255 | "dependencies": { 2256 | "isexe": "^2.0.0" 2257 | }, 2258 | "bin": { 2259 | "node-which": "bin/node-which" 2260 | }, 2261 | "engines": { 2262 | "node": ">= 8" 2263 | } 2264 | }, 2265 | "node_modules/wide-align": { 2266 | "version": "1.1.5", 2267 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", 2268 | "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", 2269 | "optional": true, 2270 | "dependencies": { 2271 | "string-width": "^1.0.2 || 2 || 3 || 4" 2272 | } 2273 | }, 2274 | "node_modules/winston": { 2275 | "version": "3.13.0", 2276 | "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz", 2277 | "integrity": "sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==", 2278 | "dependencies": { 2279 | "@colors/colors": "^1.6.0", 2280 | "@dabh/diagnostics": "^2.0.2", 2281 | "async": "^3.2.3", 2282 | "is-stream": "^2.0.0", 2283 | "logform": "^2.4.0", 2284 | "one-time": "^1.0.0", 2285 | "readable-stream": "^3.4.0", 2286 | "safe-stable-stringify": "^2.3.1", 2287 | "stack-trace": "0.0.x", 2288 | "triple-beam": "^1.3.0", 2289 | "winston-transport": "^4.7.0" 2290 | }, 2291 | "engines": { 2292 | "node": ">= 12.0.0" 2293 | } 2294 | }, 2295 | "node_modules/winston-transport": { 2296 | "version": "4.7.0", 2297 | "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz", 2298 | "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==", 2299 | "dependencies": { 2300 | "logform": "^2.3.2", 2301 | "readable-stream": "^3.6.0", 2302 | "triple-beam": "^1.3.0" 2303 | }, 2304 | "engines": { 2305 | "node": ">= 12.0.0" 2306 | } 2307 | }, 2308 | "node_modules/wrap-ansi": { 2309 | "version": "7.0.0", 2310 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2311 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2312 | "dependencies": { 2313 | "ansi-styles": "^4.0.0", 2314 | "string-width": "^4.1.0", 2315 | "strip-ansi": "^6.0.0" 2316 | }, 2317 | "engines": { 2318 | "node": ">=10" 2319 | }, 2320 | "funding": { 2321 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2322 | } 2323 | }, 2324 | "node_modules/wrap-ansi/node_modules/ansi-styles": { 2325 | "version": "4.3.0", 2326 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2327 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2328 | "dependencies": { 2329 | "color-convert": "^2.0.1" 2330 | }, 2331 | "engines": { 2332 | "node": ">=8" 2333 | }, 2334 | "funding": { 2335 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2336 | } 2337 | }, 2338 | "node_modules/wrap-ansi/node_modules/color-convert": { 2339 | "version": "2.0.1", 2340 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2341 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2342 | "dependencies": { 2343 | "color-name": "~1.1.4" 2344 | }, 2345 | "engines": { 2346 | "node": ">=7.0.0" 2347 | } 2348 | }, 2349 | "node_modules/wrap-ansi/node_modules/color-name": { 2350 | "version": "1.1.4", 2351 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2352 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 2353 | }, 2354 | "node_modules/wrappy": { 2355 | "version": "1.0.2", 2356 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2357 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 2358 | }, 2359 | "node_modules/ws": { 2360 | "version": "8.17.1", 2361 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", 2362 | "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", 2363 | "engines": { 2364 | "node": ">=10.0.0" 2365 | }, 2366 | "peerDependencies": { 2367 | "bufferutil": "^4.0.1", 2368 | "utf-8-validate": ">=5.0.2" 2369 | }, 2370 | "peerDependenciesMeta": { 2371 | "bufferutil": { 2372 | "optional": true 2373 | }, 2374 | "utf-8-validate": { 2375 | "optional": true 2376 | } 2377 | } 2378 | }, 2379 | "node_modules/yallist": { 2380 | "version": "4.0.0", 2381 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2382 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 2383 | } 2384 | } 2385 | } 2386 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "evm-tx-deployer-bot.git", 3 | "version": "2.0.0", 4 | "type": "module", 5 | "description": "The Evm Testnet Bot is a powerful tool designed for interacting with EVM-compatible test networks. This bot automates transaction processes, enabling users to perform actions such as ETH to WETH swap interactions seamlessly and daily. Additionally, it provides a built-in smart contract deployment feature, making it an ideal solution for you to do your testnet airdrop.", 6 | "main": "index.js", 7 | "scripts": { 8 | "start": "node index.js", 9 | "deploy": "node deploy.js", 10 | "test": "node test.js" 11 | }, 12 | "keywords": [ 13 | "testnet-bot", 14 | "evm-tx-deployer-bot.git", 15 | "evm-bot", 16 | "smartcontract", 17 | "widiskel", 18 | "smartcontract-deployer" 19 | ], 20 | "author": "Widiskel", 21 | "license": "MIT", 22 | "repository": { 23 | "type": "git", 24 | "url": "git+https://github.com/Widiskel/evm-tx-deployer-bot.git.git" 25 | }, 26 | "dependencies": { 27 | "bip39": "^3.1.0", 28 | "ethers": "^6.13.2", 29 | "input": "^1.0.1", 30 | "moment-timezone": "^0.5.45", 31 | "node-fetch": "^3.3.2", 32 | "solc": "^0.8.28", 33 | "sqlite": "^5.1.1", 34 | "sqlite3": "^5.1.7", 35 | "twisters": "^1.1.0", 36 | "winston": "^3.13.0" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/core/contract/deployed_token.js: -------------------------------------------------------------------------------- 1 | import { Config } from "../../../config/config.js"; 2 | 3 | export class DEPLOYEDTOKEN { 4 | static CONTRACTADDRESS = Config.DEPLOYCONTRACTADDRESS; 5 | static ABI = [ 6 | { 7 | inputs: [ 8 | { 9 | internalType: "string", 10 | name: "_name", 11 | type: "string", 12 | }, 13 | { 14 | internalType: "string", 15 | name: "_symbol", 16 | type: "string", 17 | }, 18 | { 19 | internalType: "uint256", 20 | name: "_initialSupply", 21 | type: "uint256", 22 | }, 23 | ], 24 | stateMutability: "nonpayable", 25 | type: "constructor", 26 | }, 27 | { 28 | anonymous: false, 29 | inputs: [ 30 | { 31 | indexed: true, 32 | internalType: "address", 33 | name: "src", 34 | type: "address", 35 | }, 36 | { 37 | indexed: true, 38 | internalType: "address", 39 | name: "guy", 40 | type: "address", 41 | }, 42 | { 43 | indexed: false, 44 | internalType: "uint256", 45 | name: "wad", 46 | type: "uint256", 47 | }, 48 | ], 49 | name: "Approval", 50 | type: "event", 51 | }, 52 | { 53 | anonymous: false, 54 | inputs: [ 55 | { 56 | indexed: true, 57 | internalType: "address", 58 | name: "dst", 59 | type: "address", 60 | }, 61 | { 62 | indexed: false, 63 | internalType: "uint256", 64 | name: "wad", 65 | type: "uint256", 66 | }, 67 | ], 68 | name: "Deposit", 69 | type: "event", 70 | }, 71 | { 72 | anonymous: false, 73 | inputs: [ 74 | { 75 | indexed: true, 76 | internalType: "address", 77 | name: "src", 78 | type: "address", 79 | }, 80 | { 81 | indexed: true, 82 | internalType: "address", 83 | name: "dst", 84 | type: "address", 85 | }, 86 | { 87 | indexed: false, 88 | internalType: "uint256", 89 | name: "wad", 90 | type: "uint256", 91 | }, 92 | ], 93 | name: "Transfer", 94 | type: "event", 95 | }, 96 | { 97 | anonymous: false, 98 | inputs: [ 99 | { 100 | indexed: true, 101 | internalType: "address", 102 | name: "src", 103 | type: "address", 104 | }, 105 | { 106 | indexed: false, 107 | internalType: "uint256", 108 | name: "wad", 109 | type: "uint256", 110 | }, 111 | ], 112 | name: "Withdrawal", 113 | type: "event", 114 | }, 115 | { 116 | inputs: [ 117 | { 118 | internalType: "address", 119 | name: "", 120 | type: "address", 121 | }, 122 | { 123 | internalType: "address", 124 | name: "", 125 | type: "address", 126 | }, 127 | ], 128 | name: "allowance", 129 | outputs: [ 130 | { 131 | internalType: "uint256", 132 | name: "", 133 | type: "uint256", 134 | }, 135 | ], 136 | stateMutability: "view", 137 | type: "function", 138 | }, 139 | { 140 | inputs: [ 141 | { 142 | internalType: "address", 143 | name: "_spender", 144 | type: "address", 145 | }, 146 | { 147 | internalType: "uint256", 148 | name: "_amount", 149 | type: "uint256", 150 | }, 151 | ], 152 | name: "approve", 153 | outputs: [ 154 | { 155 | internalType: "bool", 156 | name: "", 157 | type: "bool", 158 | }, 159 | ], 160 | stateMutability: "nonpayable", 161 | type: "function", 162 | }, 163 | { 164 | inputs: [ 165 | { 166 | internalType: "address", 167 | name: "", 168 | type: "address", 169 | }, 170 | ], 171 | name: "balanceOf", 172 | outputs: [ 173 | { 174 | internalType: "uint256", 175 | name: "", 176 | type: "uint256", 177 | }, 178 | ], 179 | stateMutability: "view", 180 | type: "function", 181 | }, 182 | { 183 | inputs: [], 184 | name: "decimals", 185 | outputs: [ 186 | { 187 | internalType: "uint8", 188 | name: "", 189 | type: "uint8", 190 | }, 191 | ], 192 | stateMutability: "view", 193 | type: "function", 194 | }, 195 | { 196 | inputs: [], 197 | name: "deposit", 198 | outputs: [], 199 | stateMutability: "payable", 200 | type: "function", 201 | }, 202 | { 203 | inputs: [ 204 | { 205 | internalType: "address", 206 | name: "_account", 207 | type: "address", 208 | }, 209 | ], 210 | name: "getBalance", 211 | outputs: [ 212 | { 213 | internalType: "uint256", 214 | name: "", 215 | type: "uint256", 216 | }, 217 | ], 218 | stateMutability: "view", 219 | type: "function", 220 | }, 221 | { 222 | inputs: [ 223 | { 224 | internalType: "uint256", 225 | name: "_amount", 226 | type: "uint256", 227 | }, 228 | ], 229 | name: "mint", 230 | outputs: [], 231 | stateMutability: "nonpayable", 232 | type: "function", 233 | }, 234 | { 235 | inputs: [], 236 | name: "name", 237 | outputs: [ 238 | { 239 | internalType: "string", 240 | name: "", 241 | type: "string", 242 | }, 243 | ], 244 | stateMutability: "view", 245 | type: "function", 246 | }, 247 | { 248 | inputs: [], 249 | name: "owner", 250 | outputs: [ 251 | { 252 | internalType: "address", 253 | name: "", 254 | type: "address", 255 | }, 256 | ], 257 | stateMutability: "view", 258 | type: "function", 259 | }, 260 | { 261 | inputs: [ 262 | { 263 | internalType: "uint256", 264 | name: "_amount", 265 | type: "uint256", 266 | }, 267 | ], 268 | name: "ping", 269 | outputs: [], 270 | stateMutability: "nonpayable", 271 | type: "function", 272 | }, 273 | { 274 | inputs: [], 275 | name: "symbol", 276 | outputs: [ 277 | { 278 | internalType: "string", 279 | name: "", 280 | type: "string", 281 | }, 282 | ], 283 | stateMutability: "view", 284 | type: "function", 285 | }, 286 | { 287 | inputs: [], 288 | name: "totalSupply", 289 | outputs: [ 290 | { 291 | internalType: "uint256", 292 | name: "", 293 | type: "uint256", 294 | }, 295 | ], 296 | stateMutability: "view", 297 | type: "function", 298 | }, 299 | { 300 | inputs: [ 301 | { 302 | internalType: "address", 303 | name: "_to", 304 | type: "address", 305 | }, 306 | { 307 | internalType: "uint256", 308 | name: "_amount", 309 | type: "uint256", 310 | }, 311 | ], 312 | name: "transfer", 313 | outputs: [ 314 | { 315 | internalType: "bool", 316 | name: "", 317 | type: "bool", 318 | }, 319 | ], 320 | stateMutability: "nonpayable", 321 | type: "function", 322 | }, 323 | { 324 | inputs: [ 325 | { 326 | internalType: "address", 327 | name: "_from", 328 | type: "address", 329 | }, 330 | { 331 | internalType: "address", 332 | name: "_to", 333 | type: "address", 334 | }, 335 | { 336 | internalType: "uint256", 337 | name: "_amount", 338 | type: "uint256", 339 | }, 340 | ], 341 | name: "transferFrom", 342 | outputs: [ 343 | { 344 | internalType: "bool", 345 | name: "", 346 | type: "bool", 347 | }, 348 | ], 349 | stateMutability: "nonpayable", 350 | type: "function", 351 | }, 352 | { 353 | inputs: [ 354 | { 355 | internalType: "uint256", 356 | name: "_amount", 357 | type: "uint256", 358 | }, 359 | ], 360 | name: "withdraw", 361 | outputs: [], 362 | stateMutability: "nonpayable", 363 | type: "function", 364 | }, 365 | ]; 366 | } 367 | -------------------------------------------------------------------------------- /src/core/contract/erc20_token.js: -------------------------------------------------------------------------------- 1 | import { Config } from "../../../config/config.js"; 2 | 3 | export class ERC20TOKEN { 4 | static WRAPPEDTOKEN = Config.WRAPPEDTOKENCONTRACTADDRESS; 5 | 6 | static ABI = [ 7 | { 8 | constant: true, 9 | inputs: [], 10 | name: "name", 11 | outputs: [{ name: "", type: "string" }], 12 | payable: false, 13 | stateMutability: "view", 14 | type: "function", 15 | }, 16 | { 17 | constant: false, 18 | inputs: [ 19 | { name: "guy", type: "address" }, 20 | { name: "wad", type: "uint256" }, 21 | ], 22 | name: "approve", 23 | outputs: [{ name: "", type: "bool" }], 24 | payable: false, 25 | stateMutability: "nonpayable", 26 | type: "function", 27 | }, 28 | { 29 | constant: true, 30 | inputs: [], 31 | name: "totalSupply", 32 | outputs: [{ name: "", type: "uint256" }], 33 | payable: false, 34 | stateMutability: "view", 35 | type: "function", 36 | }, 37 | { 38 | constant: false, 39 | inputs: [ 40 | { name: "src", type: "address" }, 41 | { name: "dst", type: "address" }, 42 | { name: "wad", type: "uint256" }, 43 | ], 44 | name: "transferFrom", 45 | outputs: [{ name: "", type: "bool" }], 46 | payable: false, 47 | stateMutability: "nonpayable", 48 | type: "function", 49 | }, 50 | { 51 | constant: false, 52 | inputs: [{ name: "wad", type: "uint256" }], 53 | name: "withdraw", 54 | outputs: [], 55 | payable: false, 56 | stateMutability: "nonpayable", 57 | type: "function", 58 | }, 59 | { 60 | constant: true, 61 | inputs: [], 62 | name: "decimals", 63 | outputs: [{ name: "", type: "uint8" }], 64 | payable: false, 65 | stateMutability: "view", 66 | type: "function", 67 | }, 68 | { 69 | constant: true, 70 | inputs: [{ name: "", type: "address" }], 71 | name: "balanceOf", 72 | outputs: [{ name: "", type: "uint256" }], 73 | payable: false, 74 | stateMutability: "view", 75 | type: "function", 76 | }, 77 | { 78 | constant: true, 79 | inputs: [], 80 | name: "symbol", 81 | outputs: [{ name: "", type: "string" }], 82 | payable: false, 83 | stateMutability: "view", 84 | type: "function", 85 | }, 86 | { 87 | constant: false, 88 | inputs: [ 89 | { name: "dst", type: "address" }, 90 | { name: "wad", type: "uint256" }, 91 | ], 92 | name: "transfer", 93 | outputs: [{ name: "", type: "bool" }], 94 | payable: false, 95 | stateMutability: "nonpayable", 96 | type: "function", 97 | }, 98 | { 99 | constant: false, 100 | inputs: [], 101 | name: "deposit", 102 | outputs: [], 103 | payable: true, 104 | stateMutability: "payable", 105 | type: "function", 106 | }, 107 | { 108 | constant: true, 109 | inputs: [ 110 | { name: "", type: "address" }, 111 | { name: "", type: "address" }, 112 | ], 113 | name: "allowance", 114 | outputs: [{ name: "", type: "uint256" }], 115 | payable: false, 116 | stateMutability: "view", 117 | type: "function", 118 | }, 119 | { payable: true, stateMutability: "payable", type: "fallback" }, 120 | { 121 | anonymous: false, 122 | inputs: [ 123 | { indexed: true, name: "src", type: "address" }, 124 | { indexed: true, name: "guy", type: "address" }, 125 | { indexed: false, name: "wad", type: "uint256" }, 126 | ], 127 | name: "Approval", 128 | type: "event", 129 | }, 130 | { 131 | anonymous: false, 132 | inputs: [ 133 | { indexed: true, name: "src", type: "address" }, 134 | { indexed: true, name: "dst", type: "address" }, 135 | { indexed: false, name: "wad", type: "uint256" }, 136 | ], 137 | name: "Transfer", 138 | type: "event", 139 | }, 140 | { 141 | anonymous: false, 142 | inputs: [ 143 | { indexed: true, name: "dst", type: "address" }, 144 | { indexed: false, name: "wad", type: "uint256" }, 145 | ], 146 | name: "Deposit", 147 | type: "event", 148 | }, 149 | { 150 | anonymous: false, 151 | inputs: [ 152 | { indexed: true, name: "src", type: "address" }, 153 | { indexed: false, name: "wad", type: "uint256" }, 154 | ], 155 | name: "Withdrawal", 156 | type: "event", 157 | }, 158 | ]; 159 | } 160 | -------------------------------------------------------------------------------- /src/core/core.js: -------------------------------------------------------------------------------- 1 | import { ethers } from "ethers"; 2 | import { privateKey } from "../../accounts/accounts.js"; 3 | import { Helper } from "../utils/helper.js"; 4 | import logger from "../utils/logger.js"; 5 | import { RPC } from "./network/rpc.js"; 6 | import { Config } from "../../config/config.js"; 7 | import { ERC20TOKEN } from "./contract/erc20_token.js"; 8 | import { DEPLOYEDTOKEN } from "./contract/deployed_token.js"; 9 | 10 | export default class Core { 11 | constructor(acc) { 12 | this.acc = acc; 13 | this.provider = new ethers.JsonRpcProvider(RPC.RPCURL, RPC.CHAINID); 14 | } 15 | 16 | async connectWallet() { 17 | try { 18 | const data = this.acc; 19 | const accIdx = privateKey.indexOf(this.acc); 20 | await Helper.delay( 21 | 500, 22 | this.acc, 23 | `Connecting to Account : ${accIdx + 1}`, 24 | this 25 | ); 26 | const type = Helper.determineType(data); 27 | logger.info(`Account Type : ${type}`); 28 | if (type == "Secret Phrase") { 29 | /** 30 | * @type {Wallet} 31 | */ 32 | this.wallet = ethers.Wallet.fromPhrase(data, this.provider); 33 | } else if (type == "Private Key") { 34 | /** 35 | * @type {Wallet} 36 | */ 37 | this.wallet = new ethers.Wallet(data.trim(), this.provider); 38 | } else { 39 | throw Error("Invalid account Secret Phrase or Private Key"); 40 | } 41 | this.address = this.wallet.address; 42 | this.onchainCount = await this.provider.getTransactionCount(this.address); 43 | 44 | await Helper.delay( 45 | 500, 46 | this.acc, 47 | `Wallet connected ${JSON.stringify(this.wallet.address)}`, 48 | this 49 | ); 50 | } catch (error) { 51 | throw error; 52 | } 53 | } 54 | 55 | async getBalance(update = false) { 56 | try { 57 | if (!update) { 58 | await Helper.delay( 59 | 500, 60 | this.acc, 61 | `Getting Wallet Balance of ${this.wallet.address}`, 62 | this 63 | ); 64 | } 65 | 66 | const ethBalance = ethers.formatEther( 67 | await this.provider.getBalance(this.wallet.address) 68 | ); 69 | 70 | this.balance = { 71 | ETH: ethBalance, 72 | }; 73 | 74 | await Helper.delay(500, this.acc, `Balance updated`, this); 75 | } catch (error) { 76 | throw error; 77 | } 78 | } 79 | async deposit() { 80 | try { 81 | await Helper.delay(500, this.acc, `Try To Wrap ${RPC.SYMBOL}`, this); 82 | 83 | const wrappedTOken = new ethers.Contract( 84 | ERC20TOKEN.WRAPPEDTOKEN, 85 | ERC20TOKEN.ABI, 86 | this.wallet 87 | ); 88 | const amountInWei = ethers.parseEther( 89 | Helper.randomFloat(Config.TXAMOUNTMIN, Config.TXAMOUNTMAX).toString() 90 | ); 91 | const data = wrappedTOken.deposit.populateTransaction(); 92 | const tx = await this.buildTxBody(data, amountInWei); 93 | 94 | await this.executeTx(tx); 95 | } catch (error) { 96 | throw error; 97 | } 98 | } 99 | 100 | async withdraw() { 101 | try { 102 | await Helper.delay(500, this.acc, `Trying to Unwrap Token`, this); 103 | 104 | const wrappedTOken = new ethers.Contract( 105 | ERC20TOKEN.WRAPPEDTOKEN, 106 | ERC20TOKEN.ABI, 107 | this.wallet 108 | ); 109 | const wethBalance = await wrappedTOken.balanceOf(this.wallet.address); 110 | const amountInWei = wethBalance; 111 | const amountInEth = ethers.formatEther(amountInWei); 112 | logger.info(`Unwrapping ${amountInEth} Token`); 113 | 114 | const data = wrappedTOken.withdraw.populateTransaction(amountInWei); 115 | const tx = await this.buildTxBody(data, 0); 116 | 117 | await this.executeTx(tx); 118 | } catch (error) { 119 | throw error; 120 | } 121 | } 122 | 123 | async rawTx() { 124 | try { 125 | await Helper.delay( 126 | 500, 127 | this.acc, 128 | `Try To Executing RAW Transaction`, 129 | this 130 | ); 131 | 132 | const amountInWei = ethers.parseEther(Config.RAWTXAMOUNT.toString()); 133 | const accIdx = privateKey.indexOf(this.acc); 134 | const data = { 135 | data: Config.RAWTX[accIdx], 136 | to: Config.RAWTXCONTRACTADDRESS, 137 | }; 138 | const tx = await this.buildTxBody( 139 | data, 140 | amountInWei == 0 ? 0 : amountInWei 141 | ); 142 | 143 | await this.executeTx(tx); 144 | } catch (error) { 145 | throw error; 146 | } 147 | } 148 | 149 | async deployedContractTx() { 150 | try { 151 | await Helper.delay( 152 | 500, 153 | this.acc, 154 | `Try To Executing Deployed Contract Transaction`, 155 | this 156 | ); 157 | 158 | const contract = new ethers.Contract( 159 | DEPLOYEDTOKEN.CONTRACTADDRESS, 160 | DEPLOYEDTOKEN.ABI, 161 | this.wallet 162 | ); 163 | 164 | const amountInWei = ethers.parseEther("0"); 165 | await this.tokenApproval(DEPLOYEDTOKEN.CONTRACTADDRESS, this.address); 166 | const data = await contract.ping.populateTransaction(amountInWei); 167 | const tx = await this.buildTxBody(data, amountInWei); 168 | 169 | await this.executeTx(tx); 170 | } catch (error) { 171 | throw error; 172 | } 173 | } 174 | 175 | async transfer(toaddr = true, dest = undefined) { 176 | const amount = Helper.randomFloat(Config.TXAMOUNTMIN, Config.TXAMOUNTMAX); 177 | const amountInWei = ethers.parseEther(amount.toString()); 178 | try { 179 | let tx; 180 | if (toaddr) { 181 | await Helper.delay( 182 | 500, 183 | this.acc, 184 | `Trying to transfer ${amount} ${RPC.SYMBOL} to ${this.address}`, 185 | this 186 | ); 187 | 188 | tx = await this.buildTxBody( 189 | undefined, 190 | amountInWei, 191 | dest ?? this.address 192 | ); 193 | } else { 194 | if (Config.OTHERUSERADDRESSLIST.length == 1) 195 | throw Error("Please set OTHERUSERADDRESSLIST on config file"); 196 | const destAddress = 197 | Config.OTHERUSERADDRESSLIST[ 198 | Helper.random(Config.OTHERUSERADDRESSLIST - 1) 199 | ]; 200 | await Helper.delay( 201 | 500, 202 | this.acc, 203 | `Trying to transfer ${amount}${RPC.SYMBOL} to ${destAddress}`, 204 | this 205 | ); 206 | 207 | tx = await this.buildTxBody(undefined, amountInWei, destAddress); 208 | } 209 | 210 | await this.executeTx(tx); 211 | } catch (error) { 212 | throw error; 213 | } 214 | } 215 | 216 | /** 217 | * 218 | * @param {ethers.Transaction} tx 219 | * 220 | */ 221 | async executeTx(tx) { 222 | try { 223 | logger.info(`TX DATA ${JSON.stringify(Helper.serializeBigInt(tx))}`); 224 | const explorer = RPC.EXPLORER; 225 | 226 | await Helper.delay(500, this.acc, `Executing TX...`, this); 227 | const txRes = await this.wallet.sendTransaction(tx); 228 | 229 | if (Config.WAITFORBLOCKCONFIRMATION) { 230 | logger.info(`Tx Executed \n${explorer}tx/${txRes.hash}`); 231 | await Helper.delay( 232 | 500, 233 | this.acc, 234 | `Tx Executed Waiting For Block Confirmation...`, 235 | this 236 | ); 237 | const txRev = await this.waitWithTimeout(txRes, 5 * 60 * 500); // 5 minutes timeout 238 | 239 | logger.info(`Tx Confirmed and Finalizing: ${JSON.stringify(txRev)}`); 240 | await Helper.delay( 241 | 3000, 242 | this.acc, 243 | `Tx Executed and Confirmed \n${explorer}tx/${txRev.hash}`, 244 | this 245 | ); 246 | } else { 247 | await Helper.delay(500, this.acc, `Tx Executed...`, this); 248 | await Helper.delay( 249 | 3000, 250 | this.acc, 251 | `Tx Executed \n${explorer}tx/${txRes.hash}`, 252 | this 253 | ); 254 | } 255 | 256 | await this.getBalance(); 257 | this.onchainCount = await this.provider.getTransactionCount(this.address); 258 | } catch (error) { 259 | if (error.message.includes("504")) { 260 | await Helper.delay(5000, this.acc, error.message, this); 261 | } else { 262 | logger.error(`Error in executing transaction: ${error.message}`); 263 | throw error; 264 | } 265 | } 266 | } 267 | 268 | async getOptimalNonce() { 269 | try { 270 | const latestNonce = await this.provider.getTransactionCount( 271 | this.address, 272 | "latest" 273 | ); 274 | const pendingNonce = await this.provider.getTransactionCount( 275 | this.address, 276 | "pending" 277 | ); 278 | const optimalNonce = 279 | pendingNonce > latestNonce ? pendingNonce : latestNonce; 280 | return optimalNonce; 281 | } catch (error) { 282 | throw error; 283 | } 284 | } 285 | 286 | async estimateGasWithRetry( 287 | address, 288 | amount, 289 | rawdata, 290 | directThrow = false, 291 | retries = 3, 292 | delay = 3000 293 | ) { 294 | for (let attempt = 0; attempt < retries; attempt++) { 295 | try { 296 | logger.info(`Estimating Gas for ${rawdata} TX`); 297 | const gasLimit = await this.provider.estimateGas({ 298 | from: this.address, 299 | to: address, 300 | value: amount, 301 | data: rawdata, 302 | }); 303 | 304 | return gasLimit; 305 | } catch (err) { 306 | if (directThrow) { 307 | throw err; 308 | } else { 309 | await Helper.delay( 310 | delay, 311 | this.acc, 312 | `${err.reason ?? err.shortMessage}... Attempt ${ 313 | attempt + 1 314 | } of ${retries}`, 315 | this 316 | ); 317 | 318 | if (attempt === retries - 1) { 319 | throw Error(`Failed to estimate gas after ${retries} attempts.`); 320 | } 321 | } 322 | } 323 | } 324 | } 325 | 326 | /** 327 | * Builds the transaction body with optimal nonce and optional gas estimation. 328 | * 329 | * @param {boolean} [options.estimateGas=true] - Whether to estimate gas. 330 | * @returns {Promise} - The constructed transaction object. 331 | */ 332 | async buildTxBody(data, value = 0, to, estimateGas = true) { 333 | const nonce = await this.getOptimalNonce(); 334 | const recipient = to ?? data?.to; 335 | const txData = data?.data; 336 | const fee = await this.provider.getFeeData(); 337 | const customGasPrice = ethers.parseUnits( 338 | Config.GWEIPRICE.toString(), 339 | "gwei" 340 | ); 341 | 342 | /** 343 | * @type {ethers.Transaction} 344 | */ 345 | const baseTx = { 346 | to: recipient, 347 | from: this.address, 348 | value, 349 | fee, 350 | gasPrice: fee.gasPrice > customGasPrice ? fee.gasPrice : customGasPrice, 351 | nonce, 352 | data: txData, 353 | }; 354 | 355 | if (estimateGas) { 356 | const gasLimit = await this.estimateGasWithRetry( 357 | recipient, 358 | value, 359 | txData 360 | ); 361 | baseTx.gasLimit = gasLimit; 362 | } 363 | 364 | return baseTx; 365 | } 366 | 367 | async tokenApproval(tokenCA, spenderCA) { 368 | const contract = new ethers.Contract( 369 | tokenCA, 370 | DEPLOYEDTOKEN.ABI, 371 | this.wallet 372 | ); 373 | const allowanceRes = await contract.allowance(this.address, spenderCA); 374 | 375 | if (Number(allowanceRes) < Config.TXAMOUNTMAX) { 376 | await Helper.delay(500, this.acc, `Try To Approving Token Spend`, this); 377 | const approval = await contract.approve(spenderCA, ethers.MaxUint256); 378 | await approval.wait(); 379 | await Helper.delay(500, this.acc, `Token Approved`, this); 380 | } 381 | } 382 | 383 | async waitWithTimeout(txRes, timeout) { 384 | let timedOut = false; 385 | 386 | const timeoutPromise = new Promise((_, reject) => { 387 | setTimeout(() => { 388 | timedOut = true; 389 | reject( 390 | new Error("Transaction confirmation timed out after 5 minutes.") 391 | ); 392 | }, timeout); 393 | }); 394 | 395 | try { 396 | const txRev = await Promise.race([txRes.wait(), timeoutPromise]); 397 | return txRev; 398 | } catch (error) { 399 | if (timedOut) { 400 | logger.warn("Re-executing transaction due to timeout."); 401 | return this.executeTx(txRes); 402 | } 403 | throw error; 404 | } 405 | } 406 | } 407 | -------------------------------------------------------------------------------- /src/core/db/sqlite.js: -------------------------------------------------------------------------------- 1 | import sqlite3 from "sqlite3"; 2 | import { open } from "sqlite"; 3 | 4 | class SQLITE { 5 | async connectToDatabase() { 6 | return open({ 7 | filename: "./database.db", 8 | driver: sqlite3.Database, 9 | }); 10 | } 11 | 12 | async createTable() { 13 | const db = await this.connectToDatabase(); 14 | await db.exec(` 15 | CREATE TABLE IF NOT EXISTS tx_log ( 16 | id INTEGER PRIMARY KEY AUTOINCREMENT, 17 | address TEXT NOT NULL, 18 | tx_date DATE NOT NULL, 19 | type TEXT CHECK(type IN ('raw', 'tx', 'self', 'other', 'deployed')) 20 | ) 21 | `); 22 | 23 | await db.close(); 24 | } 25 | 26 | async insertData(address, txDate, type) { 27 | const db = await this.connectToDatabase(); 28 | await db.run( 29 | "INSERT INTO tx_log (address, tx_date, type) VALUES (?, ?, ?)", 30 | [address, txDate, type] 31 | ); 32 | await db.close(); 33 | } 34 | 35 | async getTodayTxLog(address, type) { 36 | const db = await this.connectToDatabase(); 37 | const todayISO = new Date().toISOString().split("T")[0]; 38 | const todayTxLog = await db.all( 39 | ` 40 | SELECT * FROM tx_log 41 | WHERE DATE(tx_date) = ? AND address = ? AND type = ? 42 | ORDER BY tx_date DESC 43 | `, 44 | [todayISO, address, type] 45 | ); 46 | 47 | await db.close(); 48 | 49 | return todayTxLog; 50 | } 51 | } 52 | 53 | const sqlite = new SQLITE(); 54 | await sqlite.createTable(); 55 | 56 | export default sqlite; 57 | -------------------------------------------------------------------------------- /src/core/deployer/SkelDropHuntToken.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity ^0.8.0; 3 | 4 | contract SkelDropHuntToken { 5 | string public name; 6 | string public symbol; 7 | uint8 public decimals = 18; 8 | uint256 public totalSupply; 9 | 10 | mapping(address => uint256) public balanceOf; 11 | mapping(address => mapping(address => uint256)) public allowance; 12 | 13 | address public owner; 14 | 15 | constructor(string memory _name, string memory _symbol, uint256 _initialSupply) { 16 | name = _name; 17 | symbol = _symbol; 18 | owner = msg.sender; 19 | _mint(msg.sender, _initialSupply); 20 | } 21 | 22 | modifier onlyOwner() { 23 | require(msg.sender == owner, "Only owner can execute this"); 24 | _; 25 | } 26 | 27 | function _mint(address _to, uint256 _amount) internal { 28 | totalSupply += _amount; 29 | balanceOf[_to] += _amount; 30 | emit Transfer(address(0), _to, _amount); 31 | } 32 | 33 | function mint(uint256 _amount) external onlyOwner { 34 | _mint(msg.sender, _amount); 35 | } 36 | 37 | function deposit() external payable { 38 | balanceOf[msg.sender] += msg.value; 39 | emit Deposit(msg.sender, msg.value); 40 | } 41 | 42 | function withdraw(uint256 _amount) external { 43 | require(balanceOf[msg.sender] >= _amount, "Insufficient balance"); 44 | balanceOf[msg.sender] -= _amount; 45 | payable(msg.sender).transfer(_amount); 46 | emit Withdrawal(msg.sender, _amount); 47 | } 48 | 49 | function transfer(address _to, uint256 _amount) external returns (bool) { 50 | require(balanceOf[msg.sender] >= _amount, "Insufficient balance"); 51 | balanceOf[msg.sender] -= _amount; 52 | balanceOf[_to] += _amount; 53 | emit Transfer(msg.sender, _to, _amount); 54 | return true; 55 | } 56 | 57 | function approve(address _spender, uint256 _amount) external returns (bool) { 58 | allowance[msg.sender][_spender] = _amount; 59 | emit Approval(msg.sender, _spender, _amount); 60 | return true; 61 | } 62 | 63 | function transferFrom(address _from, address _to, uint256 _amount) external returns (bool) { 64 | require(balanceOf[_from] >= _amount, "Insufficient balance"); 65 | require(allowance[_from][msg.sender] >= _amount, "Allowance exceeded"); 66 | 67 | balanceOf[_from] -= _amount; 68 | balanceOf[_to] += _amount; 69 | allowance[_from][msg.sender] -= _amount; 70 | 71 | emit Transfer(_from, _to, _amount); 72 | return true; 73 | } 74 | 75 | function getBalance(address _account) public view returns (uint256) { 76 | return balanceOf[_account]; 77 | } 78 | 79 | function ping(uint256 _amount) external { 80 | require(balanceOf[msg.sender] >= _amount, "Insufficient balance"); 81 | 82 | balanceOf[msg.sender] -= _amount; 83 | balanceOf[address(this)] += _amount; 84 | emit Transfer(msg.sender, address(this), _amount); 85 | 86 | balanceOf[address(this)] -= _amount; 87 | balanceOf[msg.sender] += _amount; 88 | emit Transfer(address(this), msg.sender, _amount); 89 | } 90 | 91 | event Transfer(address indexed src, address indexed dst, uint256 wad); 92 | event Deposit(address indexed dst, uint256 wad); 93 | event Withdrawal(address indexed src, uint256 wad); 94 | event Approval(address indexed src, address indexed guy, uint256 wad); 95 | } 96 | -------------------------------------------------------------------------------- /src/core/deployer/artifacts/.gitignore: -------------------------------------------------------------------------------- 1 | SkelDropHuntToken.abi.json 2 | SkelDropHuntToken.bytecode.txt -------------------------------------------------------------------------------- /src/core/network/rpc.js: -------------------------------------------------------------------------------- 1 | import { Config } from "../../../config/config.js"; 2 | 3 | export class RPC { 4 | static CHAINID = Config.RPC.CHAINID ?? 1301; 5 | static RPCURL = Config.RPC.RPCURL ?? "https://sepolia.unichain.org"; 6 | static EXPLORER = Config.RPC.EXPLORER ?? "https://sepolia.uniscan.xyz/"; 7 | static SYMBOL = Config.RPC.SYMBOL ?? "ETH"; 8 | } 9 | -------------------------------------------------------------------------------- /src/utils/helper.js: -------------------------------------------------------------------------------- 1 | import bip39 from "bip39"; 2 | import twist from "./twist.js"; 3 | import moment from "moment-timezone"; 4 | import { ethers } from "ethers"; 5 | 6 | export class Helper { 7 | static delay = (ms, acc, msg, obj) => { 8 | return new Promise(async (resolve) => { 9 | let remainingMilliseconds = ms; 10 | 11 | if (acc != undefined) { 12 | await twist.log(msg, acc, obj, `Delaying for ${this.msToTime(ms)}`); 13 | } else { 14 | twist.info(`Delaying for ${this.msToTime(ms)}`); 15 | } 16 | 17 | const interval = setInterval(async () => { 18 | remainingMilliseconds -= 1000; 19 | if (acc != undefined) { 20 | await twist.log( 21 | msg, 22 | acc, 23 | obj, 24 | `Delaying for ${this.msToTime(remainingMilliseconds)}` 25 | ); 26 | } else { 27 | twist.info(`Delaying for ${this.msToTime(remainingMilliseconds)}`); 28 | } 29 | 30 | if (remainingMilliseconds <= 0) { 31 | clearInterval(interval); 32 | resolve(); 33 | } 34 | }, 1000); 35 | 36 | setTimeout(async () => { 37 | clearInterval(interval); 38 | await twist.clearInfo(); 39 | if (acc) { 40 | await twist.log(msg, acc, obj); 41 | } 42 | resolve(); 43 | }, ms); 44 | }); 45 | }; 46 | 47 | static randomUserAgent() { 48 | const list_useragent = [ 49 | "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/125.0.6422.80 Mobile/15E148 Safari/604.1", 50 | "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 EdgiOS/125.2535.60 Mobile/15E148 Safari/605.1.15", 51 | "Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.113 Mobile Safari/537.36 EdgA/124.0.2478.104", 52 | "Mozilla/5.0 (Linux; Android 10; Pixel 3 XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.113 Mobile Safari/537.36 EdgA/124.0.2478.104", 53 | "Mozilla/5.0 (Linux; Android 10; VOG-L29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.113 Mobile Safari/537.36 OPR/76.2.4027.73374", 54 | "Mozilla/5.0 (Linux; Android 10; SM-N975F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.6422.113 Mobile Safari/537.36 OPR/76.2.4027.73374", 55 | ]; 56 | return list_useragent[Math.floor(Math.random() * list_useragent.length)]; 57 | } 58 | 59 | static readTime(milliseconds) { 60 | const date = moment.unix(milliseconds); 61 | return date.format("YYYY-MM-DD HH:mm:ss"); 62 | } 63 | 64 | static getCurrentTimestamp() { 65 | const timestamp = moment().tz("Asia/Singapore").unix(); 66 | return timestamp.toString(); 67 | } 68 | 69 | static random(min, max) { 70 | const rand = Math.floor(Math.random() * (max - min + 1)) + min; 71 | return rand; 72 | } 73 | 74 | static randomFloat(min, max, fixed = 4) { 75 | const rand = Math.random() * (max - min) + min; 76 | return parseFloat(rand.toFixed(fixed)); 77 | } 78 | 79 | static msToTime(milliseconds) { 80 | const hours = Math.floor(milliseconds / (1000 * 60 * 60)); 81 | const remainingMillisecondsAfterHours = milliseconds % (1000 * 60 * 60); 82 | const minutes = Math.floor(remainingMillisecondsAfterHours / (1000 * 60)); 83 | const remainingMillisecondsAfterMinutes = 84 | remainingMillisecondsAfterHours % (1000 * 60); 85 | const seconds = Math.round(remainingMillisecondsAfterMinutes / 1000); 86 | 87 | return `${hours} Hours ${minutes} Minutes ${seconds} Seconds`; 88 | } 89 | 90 | static generateRandomString(length) { 91 | const characters = 92 | "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; 93 | let result = ""; 94 | const charactersLength = characters.length; 95 | for (let i = 0; i < length; i++) { 96 | result += characters.charAt(Math.floor(Math.random() * charactersLength)); 97 | } 98 | return result; 99 | } 100 | 101 | static serializeBigInt = (obj) => { 102 | return JSON.parse( 103 | JSON.stringify(obj, (key, value) => 104 | typeof value === "bigint" ? value.toString() : value 105 | ) 106 | ); 107 | }; 108 | 109 | static isMnemonic(input) { 110 | return bip39.validateMnemonic(input); 111 | } 112 | 113 | static isPrivateKey(input) { 114 | const data = input.replace(/^0x/, ""); 115 | const regex = /^[a-fA-F0-9]{64}$/; 116 | return regex.test(data); 117 | } 118 | 119 | static determineType(input) { 120 | if (this.isMnemonic(input)) { 121 | return "Secret Phrase"; 122 | } else if (this.isPrivateKey(input)) { 123 | return "Private Key"; 124 | } else { 125 | return "Unknown"; 126 | } 127 | } 128 | 129 | static generateNonce() { 130 | return ethers.hexlify(ethers.randomBytes(16)); 131 | } 132 | 133 | static isToday(date) { 134 | const lastCheckInDate = new Date(date); 135 | const today = new Date(); 136 | today.setHours(0, 0, 0, 0); 137 | const lastCheckInDateOnly = new Date(lastCheckInDate); 138 | lastCheckInDateOnly.setHours(0, 0, 0, 0); 139 | if (lastCheckInDateOnly.getTime() === today.getTime()) { 140 | return true; 141 | } else { 142 | return false; 143 | } 144 | } 145 | 146 | static findFunctionBySelector(targetSelector, ABIs) { 147 | for (const abi of ABIs) { 148 | for (const item of abi) { 149 | if (item.type === "function") { 150 | const functionSignature = `${item.name}(${item.inputs 151 | .map((input) => input.type) 152 | .join(",")})`; 153 | const selector = 154 | "0x" + 155 | ethers.keccak256(ethers.toUtf8Bytes(functionSignature)).slice(0, 8); 156 | 157 | // Check if the computed selector matches the target selector 158 | if (selector.includes(targetSelector)) { 159 | console.log(`Function found: ${functionSignature}`); 160 | return functionSignature; // or return item if you need the whole item 161 | } 162 | } 163 | } 164 | } 165 | console.log("Function not found"); 166 | return null; 167 | } 168 | 169 | static showSkelLogo() { 170 | console.log(` 171 | 172 | ... 173 | .;:. 174 | .;ol,. 175 | .;ooc:' 176 | .. .;ooccc:'. .. 177 | .',....'cdxlccccc;.....,'. 178 | .;;..'';clolccccccc:,''..;;. 179 | ':c'..':cccccccccccccc;...'c:. 180 | ':cc,.'ccccccccccccccccc:..;cc:' 181 | ...:cc;.':cccccccccccccccccc:..:cc:... 182 | .;';cc;.':;;:cccccccccccccc:;;;'.;cc,,;. 183 | .cc':c:.',.....;cccccccccc;.....,..:c:'c: 184 | ,x:'cc;.,' .':cccccc:'. ',.;cc':x' 185 | lO,'cc;.;, .;cccc:. ,;.;cc';0l 186 | .o0;.;c;.,:'......',''''''......':,.;c;.:0l. 187 | .lxl,.;,..;c::::;:,. .,:;::::c;..,;.,oxl. 188 | .lkxOl.. ..'..;::'..''..'::;..'.. ..c0xkl. 189 | .cKMx. .;c:;:cc:;:c:. .xMKc. 190 | ;KX: ;o::l:;cc;o:. ;KK; 191 | :KK:. ,d,cd,'ol'o: .:0K: 192 | ;0NOl:;:loo;. ... .. .;ldlc::lkN0: 193 | .lONNNKOx0Xd,;;'.,:,lKKkk0XNN0o. 194 | .','.. .lX0doooodOXd. .','. 195 | .,okkddxkd;. 196 | 'oxxd;. 197 | ........................................ 198 | .OWo xNd lox xxl Ald xoc dakkkkkxsx. 199 | .OWo o0W cXW dM0 MMN lNK laddKMNkso. 200 | .kMKoxsNN oWX dW0 MMMWO lWK axM0 . 201 | .OMWXNaMX dM0 kM0 MMKxNXKW0 axMk . 202 | .OMk dWK oWX XWdx Mxx XMMO akMx . 203 | 'OWo dM0 'kNNXNNd DMD OWk aoWd . 204 | ........................................ 205 | 206 | `); 207 | } 208 | } 209 | -------------------------------------------------------------------------------- /src/utils/logger.js: -------------------------------------------------------------------------------- 1 | import { createLogger, format, transports } from "winston"; 2 | import fs from "fs"; 3 | const { combine, timestamp, printf, colorize } = format; 4 | 5 | const customFormat = printf(({ level, message, timestamp }) => { 6 | return `${timestamp} [${level}]: ${message}`; 7 | }); 8 | 9 | class Logger { 10 | constructor() { 11 | this.logger = createLogger({ 12 | level: "debug", 13 | format: combine( 14 | timestamp({ 15 | format: "YYYY-MM-DD HH:mm:ss", 16 | }), 17 | colorize(), 18 | customFormat 19 | ), 20 | transports: [new transports.File({ filename: "log/app.log" })], 21 | exceptionHandlers: [new transports.File({ filename: "log/app.log" })], 22 | rejectionHandlers: [new transports.File({ filename: "log/app.log" })], 23 | }); 24 | } 25 | 26 | info(message) { 27 | this.logger.info(message); 28 | } 29 | 30 | warn(message) { 31 | this.logger.warn(message); 32 | } 33 | 34 | error(message) { 35 | this.logger.error(message); 36 | } 37 | 38 | debug(message) { 39 | this.logger.debug(message); 40 | } 41 | 42 | setLevel(level) { 43 | this.logger.level = level; 44 | } 45 | 46 | clear() { 47 | fs.truncate("log/app.log", 0, (err) => { 48 | if (err) { 49 | this.logger.error("Failed to clear the log file: " + err.message); 50 | } else { 51 | this.logger.info("Log file cleared"); 52 | } 53 | }); 54 | } 55 | } 56 | 57 | export default new Logger(); 58 | -------------------------------------------------------------------------------- /src/utils/twist.js: -------------------------------------------------------------------------------- 1 | import { Twisters } from "twisters"; 2 | import logger from "./logger.js"; 3 | import Core from "../core/core.js"; 4 | import { privateKey } from "../../accounts/accounts.js"; 5 | import { RPC } from "../core/network/rpc.js"; 6 | import { Config } from "../../config/config.js"; 7 | import sqlite from "../core/db/sqlite.js"; 8 | 9 | class Twist { 10 | constructor() { 11 | /** @type {Twisters}*/ 12 | this.twisters = new Twisters(); 13 | } 14 | 15 | /** 16 | * @param {string} acc 17 | * @param {Core} core 18 | * @param {string} msg 19 | * @param {string} delay 20 | */ 21 | async log(msg = "", acc = "", core = new Core(), delay) { 22 | const accIdx = privateKey.indexOf(acc); 23 | if (delay == undefined) { 24 | logger.info(`Account ${accIdx + 1} - ${msg}`); 25 | delay = "-"; 26 | } 27 | 28 | const address = core.address ?? "-"; 29 | const balance = core.balance ?? {}; 30 | const eth = balance.ETH ?? "-"; 31 | const txCount = core.onchainCount ?? "-"; 32 | 33 | const tx = (await sqlite.getTodayTxLog(address, "tx")).length; 34 | const txEnabled = Config.USEWRAPUNWRAP == true ? "ON" : "OFF"; 35 | const raw = (await sqlite.getTodayTxLog(address, "raw")).length; 36 | const rawEnabled = Config.USERAWTXDATA == true ? "ON" : "OFF"; 37 | const self = (await sqlite.getTodayTxLog(address, "self")).length; 38 | const other = (await sqlite.getTodayTxLog(address, "other")).length; 39 | const transferEnabled = Config.USETRANSFER == true ? "ON" : "OFF"; 40 | const deploy = (await sqlite.getTodayTxLog(address, "deployed")).length; 41 | const deployEnabled = 42 | Config.DEPLOYCONTRACTINTERACTION == true ? "ON" : "OFF"; 43 | 44 | this.twisters.put(acc, { 45 | text: ` 46 | ================== Account ${accIdx + 1} ================= 47 | Address : ${address} 48 | Balance : ${eth} ${RPC.SYMBOL} 49 | Onchain TX Total : ${txCount} Onchain Transaction 50 | Transfer Count : ${self} of ${ 51 | Config.SELFTRANSFERCOUNT ?? "?" 52 | } SELF & ${other} of ${ 53 | Config.OTHERUSERTRANSFERCOUNT ?? "?" 54 | } OTHER (${transferEnabled}) 55 | RAWTX Count : ${raw} of ${Config.RAWTXCOUNT ?? "?"} (${rawEnabled}) 56 | W/U Count : ${tx} of ${Config.WRAPUNWRAPCOUNT ?? "?"} (${txEnabled}) 57 | Deploy Tx Count : ${deploy} of ${ 58 | Config.DEPLOYCONTRACTINTERACTIONCOUNT ?? "?" 59 | } (${deployEnabled}) 60 | 61 | Status : ${msg} 62 | Delay : ${delay} 63 | ==============================================`, 64 | }); 65 | } 66 | /** 67 | * @param {string} msg 68 | */ 69 | info(msg = "") { 70 | this.twisters.put(2, { 71 | text: ` 72 | ============================================== 73 | Info : ${msg} 74 | ==============================================`, 75 | }); 76 | return; 77 | } 78 | 79 | clearInfo() { 80 | this.twisters.remove(2); 81 | } 82 | 83 | clear(acc) { 84 | this.twisters.remove(acc); 85 | } 86 | } 87 | export default new Twist(); 88 | -------------------------------------------------------------------------------- /test.js: -------------------------------------------------------------------------------- 1 | //HERE THE PLACE FOR YOU TO TEST SOMETHING, RUN WITH npm run test 2 | --------------------------------------------------------------------------------