├── .env.example ├── .gitignore ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── src └── index.ts └── tsconfig.json /.env.example: -------------------------------------------------------------------------------- 1 | KEY_PATH=/home/sol/pump8rbGjRWKnfKe3RTwjEBuSHh3TR3h3ombvXUdgun.json 2 | RPC_URL=http://127.0.0.1:8899 3 | JITO_BLOCK_ENGINE_URL=https://frankfurt.mainnet.block-engine.jito.wtf 4 | WAITING_TIME=5 5 | ROUNDS=5 6 | JITO_TIP=1000 7 | BUFF_TIP=False -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* 131 | 132 | .idea -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 ChainBuff Community 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 | # Solana Jito Landing Benchmark 2 | 3 | > Using this at your own risk. 4 | 5 | This is a demo to test Jito landing rate and average slot gap for successful RPC calls to Jito landing. 6 | 7 | ## .env config 8 | 9 | - `KEY_PATH`: Solana wallet private key file path. 10 | - `RPC_URL`: Solana RPC endpoint. 11 | - `JITO_BLOCK_ENGINE_URL`: Jito block engine mainnet address, refer to [Jito mainnet address](https://jito-labs.gitbook.io/mev/searcher-resources/block-engine/mainnet-addresses). 12 | - `WAITING_TIME`: Waiting time between sending a bundle and getting the status of the bundle. 13 | - `ROUNDS`: Total rounds of sending bundles. 14 | - `JITO_TIP`: Tips sent to Jito Tip Accounts in lamports. The minimum is 1000. 15 | - `BUFF_TIP`: `True` or `False`. Donate tips to the Buff community in lamports. The default amount is 10% of `JITO_TIP`. 16 | 17 | Example .env 18 | 19 | ``` 20 | KEY_PATH=/home/sol/pump8rbGjRWKnfKe3RTwjEBuSHh3TR3h3ombvXUdgun.json 21 | RPC_URL=http://127.0.0.1:8899 22 | JITO_BLOCK_ENGINE_URL=https://frankfurt.mainnet.block-engine.jito.wtf 23 | WAITING_TIME=5 24 | ROUNDS=5 25 | JITO_TIP=1000 26 | BUFF_TIP=True 27 | ``` 28 | 29 | ## Running 30 | 31 | Before running, make sure that the `.env.example` file is renamed to `.env` and that the parameters are configured correctly. 32 | 33 | ```bash 34 | npm install 35 | npm run start 36 | ``` 37 | 38 | Example output: 39 | 40 | ``` 41 | payer: pump8rbGjRWKnfKe3RTwjEBuSHh3TR3h3ombvXUdgun 42 | balance: 2969159 lamports 43 | Current Slot: 295763238 44 | Bundle sent, id: d57a85a3f47e6595a303a8a67e2024675bc905aa476a7fdd18a70939f33140a6 45 | Slot behind: 4 46 | balance: 2963059 lamports 47 | Current Slot: 295763251 48 | Bundle sent, id: 3c483e73c0615d6e03ce41920d41538bbc4b7b3f2246fadb3bc59eabdc24e3c3 49 | Slot behind: 4 50 | balance: 2956959 lamports 51 | Current Slot: 295763262 52 | Bundle sent, id: 66acc2a9fd1ec899e1f526dbef9150369fb00e53ad7dba2a3cd7474b6c597216 53 | Slot behind: 5 54 | balance: 2950859 lamports 55 | Current Slot: 295763274 56 | Bundle sent, id: 3fa700dc80a2faec6ce218d924b28083e249ff543419de702b5c622d54d39998 57 | Slot behind: 6 58 | balance: 2944759 lamports 59 | Current Slot: 295763285 60 | Bundle sent, id: 54b21d533266a7644997eac77b19e989fe7adcdd7f2b3f4cf0e951fb8d85f5c6 61 | Slot behind: 4 62 | 63 | --- 64 | Average slots behind: 4.6 65 | Success Rate: 100.00% 66 | ``` 67 | 68 | Example transaction: 69 | 70 | https://solscan.io/tx/4cty82ZXXNwrcfKy5kHytvN7R71umGUr2i6RPK6U25scrWDEKofVYzC1BKaYZvVzzCXDijDAMj4swj8EX8EioehW 71 | 72 | ## Feedback 73 | 74 | Buff community: https://t.me/chainbuff 75 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jito-landing-benchmark", 3 | "version": "0.0.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "jito-landing-benchmark", 9 | "version": "0.0.1", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@solana/web3.js": "^1.95.3", 13 | "axios": "^1.7.7", 14 | "bs58": "^6.0.0", 15 | "dotenv": "^16.4.5", 16 | "mathjs": "^13.2.0", 17 | "typescript": "^5.6.3" 18 | } 19 | }, 20 | "node_modules/@babel/runtime": { 21 | "version": "7.25.7", 22 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", 23 | "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", 24 | "license": "MIT", 25 | "dependencies": { 26 | "regenerator-runtime": "^0.14.0" 27 | }, 28 | "engines": { 29 | "node": ">=6.9.0" 30 | } 31 | }, 32 | "node_modules/@noble/curves": { 33 | "version": "1.6.0", 34 | "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz", 35 | "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==", 36 | "license": "MIT", 37 | "dependencies": { 38 | "@noble/hashes": "1.5.0" 39 | }, 40 | "engines": { 41 | "node": "^14.21.3 || >=16" 42 | }, 43 | "funding": { 44 | "url": "https://paulmillr.com/funding/" 45 | } 46 | }, 47 | "node_modules/@noble/hashes": { 48 | "version": "1.5.0", 49 | "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", 50 | "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", 51 | "license": "MIT", 52 | "engines": { 53 | "node": "^14.21.3 || >=16" 54 | }, 55 | "funding": { 56 | "url": "https://paulmillr.com/funding/" 57 | } 58 | }, 59 | "node_modules/@solana/buffer-layout": { 60 | "version": "4.0.1", 61 | "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz", 62 | "integrity": "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==", 63 | "license": "MIT", 64 | "dependencies": { 65 | "buffer": "~6.0.3" 66 | }, 67 | "engines": { 68 | "node": ">=5.10" 69 | } 70 | }, 71 | "node_modules/@solana/web3.js": { 72 | "version": "1.95.3", 73 | "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.95.3.tgz", 74 | "integrity": "sha512-O6rPUN0w2fkNqx/Z3QJMB9L225Ex10PRDH8bTaIUPZXMPV0QP8ZpPvjQnXK+upUczlRgzHzd6SjKIha1p+I6og==", 75 | "license": "MIT", 76 | "dependencies": { 77 | "@babel/runtime": "^7.25.0", 78 | "@noble/curves": "^1.4.2", 79 | "@noble/hashes": "^1.4.0", 80 | "@solana/buffer-layout": "^4.0.1", 81 | "agentkeepalive": "^4.5.0", 82 | "bigint-buffer": "^1.1.5", 83 | "bn.js": "^5.2.1", 84 | "borsh": "^0.7.0", 85 | "bs58": "^4.0.1", 86 | "buffer": "6.0.3", 87 | "fast-stable-stringify": "^1.0.0", 88 | "jayson": "^4.1.1", 89 | "node-fetch": "^2.7.0", 90 | "rpc-websockets": "^9.0.2", 91 | "superstruct": "^2.0.2" 92 | } 93 | }, 94 | "node_modules/@solana/web3.js/node_modules/base-x": { 95 | "version": "3.0.10", 96 | "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", 97 | "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", 98 | "license": "MIT", 99 | "dependencies": { 100 | "safe-buffer": "^5.0.1" 101 | } 102 | }, 103 | "node_modules/@solana/web3.js/node_modules/bs58": { 104 | "version": "4.0.1", 105 | "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", 106 | "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", 107 | "license": "MIT", 108 | "dependencies": { 109 | "base-x": "^3.0.2" 110 | } 111 | }, 112 | "node_modules/@swc/helpers": { 113 | "version": "0.5.13", 114 | "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", 115 | "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==", 116 | "license": "Apache-2.0", 117 | "dependencies": { 118 | "tslib": "^2.4.0" 119 | } 120 | }, 121 | "node_modules/@types/connect": { 122 | "version": "3.4.38", 123 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", 124 | "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", 125 | "license": "MIT", 126 | "dependencies": { 127 | "@types/node": "*" 128 | } 129 | }, 130 | "node_modules/@types/node": { 131 | "version": "12.20.55", 132 | "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", 133 | "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", 134 | "license": "MIT" 135 | }, 136 | "node_modules/@types/uuid": { 137 | "version": "8.3.4", 138 | "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", 139 | "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", 140 | "license": "MIT" 141 | }, 142 | "node_modules/@types/ws": { 143 | "version": "7.4.7", 144 | "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", 145 | "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", 146 | "license": "MIT", 147 | "dependencies": { 148 | "@types/node": "*" 149 | } 150 | }, 151 | "node_modules/agentkeepalive": { 152 | "version": "4.5.0", 153 | "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", 154 | "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", 155 | "license": "MIT", 156 | "dependencies": { 157 | "humanize-ms": "^1.2.1" 158 | }, 159 | "engines": { 160 | "node": ">= 8.0.0" 161 | } 162 | }, 163 | "node_modules/asynckit": { 164 | "version": "0.4.0", 165 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 166 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", 167 | "license": "MIT" 168 | }, 169 | "node_modules/axios": { 170 | "version": "1.7.7", 171 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", 172 | "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", 173 | "license": "MIT", 174 | "dependencies": { 175 | "follow-redirects": "^1.15.6", 176 | "form-data": "^4.0.0", 177 | "proxy-from-env": "^1.1.0" 178 | } 179 | }, 180 | "node_modules/base-x": { 181 | "version": "5.0.0", 182 | "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.0.tgz", 183 | "integrity": "sha512-sMW3VGSX1QWVFA6l8U62MLKz29rRfpTlYdCqLdpLo1/Yd4zZwSbnUaDfciIAowAqvq7YFnWq9hrhdg1KYgc1lQ==", 184 | "license": "MIT" 185 | }, 186 | "node_modules/base64-js": { 187 | "version": "1.5.1", 188 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 189 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 190 | "funding": [ 191 | { 192 | "type": "github", 193 | "url": "https://github.com/sponsors/feross" 194 | }, 195 | { 196 | "type": "patreon", 197 | "url": "https://www.patreon.com/feross" 198 | }, 199 | { 200 | "type": "consulting", 201 | "url": "https://feross.org/support" 202 | } 203 | ], 204 | "license": "MIT" 205 | }, 206 | "node_modules/bigint-buffer": { 207 | "version": "1.1.5", 208 | "resolved": "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz", 209 | "integrity": "sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==", 210 | "hasInstallScript": true, 211 | "license": "Apache-2.0", 212 | "dependencies": { 213 | "bindings": "^1.3.0" 214 | }, 215 | "engines": { 216 | "node": ">= 10.0.0" 217 | } 218 | }, 219 | "node_modules/bindings": { 220 | "version": "1.5.0", 221 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 222 | "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 223 | "license": "MIT", 224 | "dependencies": { 225 | "file-uri-to-path": "1.0.0" 226 | } 227 | }, 228 | "node_modules/bn.js": { 229 | "version": "5.2.1", 230 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", 231 | "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", 232 | "license": "MIT" 233 | }, 234 | "node_modules/borsh": { 235 | "version": "0.7.0", 236 | "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", 237 | "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", 238 | "license": "Apache-2.0", 239 | "dependencies": { 240 | "bn.js": "^5.2.0", 241 | "bs58": "^4.0.0", 242 | "text-encoding-utf-8": "^1.0.2" 243 | } 244 | }, 245 | "node_modules/borsh/node_modules/base-x": { 246 | "version": "3.0.10", 247 | "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", 248 | "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", 249 | "license": "MIT", 250 | "dependencies": { 251 | "safe-buffer": "^5.0.1" 252 | } 253 | }, 254 | "node_modules/borsh/node_modules/bs58": { 255 | "version": "4.0.1", 256 | "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", 257 | "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", 258 | "license": "MIT", 259 | "dependencies": { 260 | "base-x": "^3.0.2" 261 | } 262 | }, 263 | "node_modules/bs58": { 264 | "version": "6.0.0", 265 | "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", 266 | "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", 267 | "license": "MIT", 268 | "dependencies": { 269 | "base-x": "^5.0.0" 270 | } 271 | }, 272 | "node_modules/buffer": { 273 | "version": "6.0.3", 274 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", 275 | "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 276 | "funding": [ 277 | { 278 | "type": "github", 279 | "url": "https://github.com/sponsors/feross" 280 | }, 281 | { 282 | "type": "patreon", 283 | "url": "https://www.patreon.com/feross" 284 | }, 285 | { 286 | "type": "consulting", 287 | "url": "https://feross.org/support" 288 | } 289 | ], 290 | "license": "MIT", 291 | "dependencies": { 292 | "base64-js": "^1.3.1", 293 | "ieee754": "^1.2.1" 294 | } 295 | }, 296 | "node_modules/bufferutil": { 297 | "version": "4.0.8", 298 | "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", 299 | "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", 300 | "hasInstallScript": true, 301 | "license": "MIT", 302 | "optional": true, 303 | "dependencies": { 304 | "node-gyp-build": "^4.3.0" 305 | }, 306 | "engines": { 307 | "node": ">=6.14.2" 308 | } 309 | }, 310 | "node_modules/combined-stream": { 311 | "version": "1.0.8", 312 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 313 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 314 | "license": "MIT", 315 | "dependencies": { 316 | "delayed-stream": "~1.0.0" 317 | }, 318 | "engines": { 319 | "node": ">= 0.8" 320 | } 321 | }, 322 | "node_modules/commander": { 323 | "version": "2.20.3", 324 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 325 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 326 | "license": "MIT" 327 | }, 328 | "node_modules/complex.js": { 329 | "version": "2.3.0", 330 | "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.3.0.tgz", 331 | "integrity": "sha512-wWHzifVdUPbPBhh+ObvpVGIzrAQjTvmnnEJKBfLW5YbyAB6OXQ0r+Q92fByMIrSSlxUuCujqxriJSR6R/kVxPA==", 332 | "license": "MIT", 333 | "engines": { 334 | "node": "*" 335 | }, 336 | "funding": { 337 | "type": "github", 338 | "url": "https://github.com/sponsors/rawify" 339 | } 340 | }, 341 | "node_modules/decimal.js": { 342 | "version": "10.4.3", 343 | "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", 344 | "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", 345 | "license": "MIT" 346 | }, 347 | "node_modules/delay": { 348 | "version": "5.0.0", 349 | "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", 350 | "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", 351 | "license": "MIT", 352 | "engines": { 353 | "node": ">=10" 354 | }, 355 | "funding": { 356 | "url": "https://github.com/sponsors/sindresorhus" 357 | } 358 | }, 359 | "node_modules/delayed-stream": { 360 | "version": "1.0.0", 361 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 362 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 363 | "license": "MIT", 364 | "engines": { 365 | "node": ">=0.4.0" 366 | } 367 | }, 368 | "node_modules/dotenv": { 369 | "version": "16.4.5", 370 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", 371 | "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", 372 | "license": "BSD-2-Clause", 373 | "engines": { 374 | "node": ">=12" 375 | }, 376 | "funding": { 377 | "url": "https://dotenvx.com" 378 | } 379 | }, 380 | "node_modules/es6-promise": { 381 | "version": "4.2.8", 382 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 383 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", 384 | "license": "MIT" 385 | }, 386 | "node_modules/es6-promisify": { 387 | "version": "5.0.0", 388 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 389 | "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", 390 | "license": "MIT", 391 | "dependencies": { 392 | "es6-promise": "^4.0.3" 393 | } 394 | }, 395 | "node_modules/escape-latex": { 396 | "version": "1.2.0", 397 | "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", 398 | "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==", 399 | "license": "MIT" 400 | }, 401 | "node_modules/eventemitter3": { 402 | "version": "5.0.1", 403 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", 404 | "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", 405 | "license": "MIT" 406 | }, 407 | "node_modules/eyes": { 408 | "version": "0.1.8", 409 | "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", 410 | "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", 411 | "engines": { 412 | "node": "> 0.1.90" 413 | } 414 | }, 415 | "node_modules/fast-stable-stringify": { 416 | "version": "1.0.0", 417 | "resolved": "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz", 418 | "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==", 419 | "license": "MIT" 420 | }, 421 | "node_modules/file-uri-to-path": { 422 | "version": "1.0.0", 423 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 424 | "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", 425 | "license": "MIT" 426 | }, 427 | "node_modules/follow-redirects": { 428 | "version": "1.15.9", 429 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", 430 | "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", 431 | "funding": [ 432 | { 433 | "type": "individual", 434 | "url": "https://github.com/sponsors/RubenVerborgh" 435 | } 436 | ], 437 | "license": "MIT", 438 | "engines": { 439 | "node": ">=4.0" 440 | }, 441 | "peerDependenciesMeta": { 442 | "debug": { 443 | "optional": true 444 | } 445 | } 446 | }, 447 | "node_modules/form-data": { 448 | "version": "4.0.1", 449 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", 450 | "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", 451 | "license": "MIT", 452 | "dependencies": { 453 | "asynckit": "^0.4.0", 454 | "combined-stream": "^1.0.8", 455 | "mime-types": "^2.1.12" 456 | }, 457 | "engines": { 458 | "node": ">= 6" 459 | } 460 | }, 461 | "node_modules/fraction.js": { 462 | "version": "4.3.7", 463 | "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", 464 | "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", 465 | "license": "MIT", 466 | "engines": { 467 | "node": "*" 468 | }, 469 | "funding": { 470 | "type": "patreon", 471 | "url": "https://github.com/sponsors/rawify" 472 | } 473 | }, 474 | "node_modules/humanize-ms": { 475 | "version": "1.2.1", 476 | "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", 477 | "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", 478 | "license": "MIT", 479 | "dependencies": { 480 | "ms": "^2.0.0" 481 | } 482 | }, 483 | "node_modules/ieee754": { 484 | "version": "1.2.1", 485 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 486 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 487 | "funding": [ 488 | { 489 | "type": "github", 490 | "url": "https://github.com/sponsors/feross" 491 | }, 492 | { 493 | "type": "patreon", 494 | "url": "https://www.patreon.com/feross" 495 | }, 496 | { 497 | "type": "consulting", 498 | "url": "https://feross.org/support" 499 | } 500 | ], 501 | "license": "BSD-3-Clause" 502 | }, 503 | "node_modules/isomorphic-ws": { 504 | "version": "4.0.1", 505 | "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", 506 | "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", 507 | "license": "MIT", 508 | "peerDependencies": { 509 | "ws": "*" 510 | } 511 | }, 512 | "node_modules/javascript-natural-sort": { 513 | "version": "0.7.1", 514 | "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", 515 | "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==", 516 | "license": "MIT" 517 | }, 518 | "node_modules/jayson": { 519 | "version": "4.1.2", 520 | "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.2.tgz", 521 | "integrity": "sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA==", 522 | "license": "MIT", 523 | "dependencies": { 524 | "@types/connect": "^3.4.33", 525 | "@types/node": "^12.12.54", 526 | "@types/ws": "^7.4.4", 527 | "commander": "^2.20.3", 528 | "delay": "^5.0.0", 529 | "es6-promisify": "^5.0.0", 530 | "eyes": "^0.1.8", 531 | "isomorphic-ws": "^4.0.1", 532 | "json-stringify-safe": "^5.0.1", 533 | "JSONStream": "^1.3.5", 534 | "uuid": "^8.3.2", 535 | "ws": "^7.5.10" 536 | }, 537 | "bin": { 538 | "jayson": "bin/jayson.js" 539 | }, 540 | "engines": { 541 | "node": ">=8" 542 | } 543 | }, 544 | "node_modules/json-stringify-safe": { 545 | "version": "5.0.1", 546 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 547 | "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", 548 | "license": "ISC" 549 | }, 550 | "node_modules/jsonparse": { 551 | "version": "1.3.1", 552 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", 553 | "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", 554 | "engines": [ 555 | "node >= 0.2.0" 556 | ], 557 | "license": "MIT" 558 | }, 559 | "node_modules/JSONStream": { 560 | "version": "1.3.5", 561 | "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", 562 | "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", 563 | "license": "(MIT OR Apache-2.0)", 564 | "dependencies": { 565 | "jsonparse": "^1.2.0", 566 | "through": ">=2.2.7 <3" 567 | }, 568 | "bin": { 569 | "JSONStream": "bin.js" 570 | }, 571 | "engines": { 572 | "node": "*" 573 | } 574 | }, 575 | "node_modules/mathjs": { 576 | "version": "13.2.0", 577 | "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-13.2.0.tgz", 578 | "integrity": "sha512-P5PZoiUX2Tkghkv3tsSqlK0B9My/ErKapv1j6wdxd0MOrYQ30cnGE4LH/kzYB2gA5rN46Njqc4cFgJjaxgijoQ==", 579 | "license": "Apache-2.0", 580 | "dependencies": { 581 | "@babel/runtime": "^7.25.6", 582 | "complex.js": "^2.1.1", 583 | "decimal.js": "^10.4.3", 584 | "escape-latex": "^1.2.0", 585 | "fraction.js": "^4.3.7", 586 | "javascript-natural-sort": "^0.7.1", 587 | "seedrandom": "^3.0.5", 588 | "tiny-emitter": "^2.1.0", 589 | "typed-function": "^4.2.1" 590 | }, 591 | "bin": { 592 | "mathjs": "bin/cli.js" 593 | }, 594 | "engines": { 595 | "node": ">= 18" 596 | } 597 | }, 598 | "node_modules/mime-db": { 599 | "version": "1.52.0", 600 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 601 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 602 | "license": "MIT", 603 | "engines": { 604 | "node": ">= 0.6" 605 | } 606 | }, 607 | "node_modules/mime-types": { 608 | "version": "2.1.35", 609 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 610 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 611 | "license": "MIT", 612 | "dependencies": { 613 | "mime-db": "1.52.0" 614 | }, 615 | "engines": { 616 | "node": ">= 0.6" 617 | } 618 | }, 619 | "node_modules/ms": { 620 | "version": "2.1.3", 621 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 622 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 623 | "license": "MIT" 624 | }, 625 | "node_modules/node-fetch": { 626 | "version": "2.7.0", 627 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 628 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 629 | "license": "MIT", 630 | "dependencies": { 631 | "whatwg-url": "^5.0.0" 632 | }, 633 | "engines": { 634 | "node": "4.x || >=6.0.0" 635 | }, 636 | "peerDependencies": { 637 | "encoding": "^0.1.0" 638 | }, 639 | "peerDependenciesMeta": { 640 | "encoding": { 641 | "optional": true 642 | } 643 | } 644 | }, 645 | "node_modules/node-gyp-build": { 646 | "version": "4.8.2", 647 | "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", 648 | "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", 649 | "license": "MIT", 650 | "optional": true, 651 | "bin": { 652 | "node-gyp-build": "bin.js", 653 | "node-gyp-build-optional": "optional.js", 654 | "node-gyp-build-test": "build-test.js" 655 | } 656 | }, 657 | "node_modules/proxy-from-env": { 658 | "version": "1.1.0", 659 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 660 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", 661 | "license": "MIT" 662 | }, 663 | "node_modules/regenerator-runtime": { 664 | "version": "0.14.1", 665 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", 666 | "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", 667 | "license": "MIT" 668 | }, 669 | "node_modules/rpc-websockets": { 670 | "version": "9.0.4", 671 | "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-9.0.4.tgz", 672 | "integrity": "sha512-yWZWN0M+bivtoNLnaDbtny4XchdAIF5Q4g/ZsC5UC61Ckbp0QczwO8fg44rV3uYmY4WHd+EZQbn90W1d8ojzqQ==", 673 | "license": "LGPL-3.0-only", 674 | "dependencies": { 675 | "@swc/helpers": "^0.5.11", 676 | "@types/uuid": "^8.3.4", 677 | "@types/ws": "^8.2.2", 678 | "buffer": "^6.0.3", 679 | "eventemitter3": "^5.0.1", 680 | "uuid": "^8.3.2", 681 | "ws": "^8.5.0" 682 | }, 683 | "funding": { 684 | "type": "paypal", 685 | "url": "https://paypal.me/kozjak" 686 | }, 687 | "optionalDependencies": { 688 | "bufferutil": "^4.0.1", 689 | "utf-8-validate": "^5.0.2" 690 | } 691 | }, 692 | "node_modules/rpc-websockets/node_modules/@types/ws": { 693 | "version": "8.5.12", 694 | "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", 695 | "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", 696 | "license": "MIT", 697 | "dependencies": { 698 | "@types/node": "*" 699 | } 700 | }, 701 | "node_modules/rpc-websockets/node_modules/ws": { 702 | "version": "8.18.0", 703 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", 704 | "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", 705 | "license": "MIT", 706 | "engines": { 707 | "node": ">=10.0.0" 708 | }, 709 | "peerDependencies": { 710 | "bufferutil": "^4.0.1", 711 | "utf-8-validate": ">=5.0.2" 712 | }, 713 | "peerDependenciesMeta": { 714 | "bufferutil": { 715 | "optional": true 716 | }, 717 | "utf-8-validate": { 718 | "optional": true 719 | } 720 | } 721 | }, 722 | "node_modules/safe-buffer": { 723 | "version": "5.2.1", 724 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 725 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 726 | "funding": [ 727 | { 728 | "type": "github", 729 | "url": "https://github.com/sponsors/feross" 730 | }, 731 | { 732 | "type": "patreon", 733 | "url": "https://www.patreon.com/feross" 734 | }, 735 | { 736 | "type": "consulting", 737 | "url": "https://feross.org/support" 738 | } 739 | ], 740 | "license": "MIT" 741 | }, 742 | "node_modules/seedrandom": { 743 | "version": "3.0.5", 744 | "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", 745 | "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", 746 | "license": "MIT" 747 | }, 748 | "node_modules/superstruct": { 749 | "version": "2.0.2", 750 | "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", 751 | "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==", 752 | "license": "MIT", 753 | "engines": { 754 | "node": ">=14.0.0" 755 | } 756 | }, 757 | "node_modules/text-encoding-utf-8": { 758 | "version": "1.0.2", 759 | "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", 760 | "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==" 761 | }, 762 | "node_modules/through": { 763 | "version": "2.3.8", 764 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 765 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", 766 | "license": "MIT" 767 | }, 768 | "node_modules/tiny-emitter": { 769 | "version": "2.1.0", 770 | "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", 771 | "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", 772 | "license": "MIT" 773 | }, 774 | "node_modules/tr46": { 775 | "version": "0.0.3", 776 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 777 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", 778 | "license": "MIT" 779 | }, 780 | "node_modules/tslib": { 781 | "version": "2.7.0", 782 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", 783 | "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", 784 | "license": "0BSD" 785 | }, 786 | "node_modules/typed-function": { 787 | "version": "4.2.1", 788 | "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-4.2.1.tgz", 789 | "integrity": "sha512-EGjWssW7Tsk4DGfE+5yluuljS1OGYWiI1J6e8puZz9nTMM51Oug8CD5Zo4gWMsOhq5BI+1bF+rWTm4Vbj3ivRA==", 790 | "license": "MIT", 791 | "engines": { 792 | "node": ">= 18" 793 | } 794 | }, 795 | "node_modules/typescript": { 796 | "version": "5.6.3", 797 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", 798 | "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", 799 | "license": "Apache-2.0", 800 | "bin": { 801 | "tsc": "bin/tsc", 802 | "tsserver": "bin/tsserver" 803 | }, 804 | "engines": { 805 | "node": ">=14.17" 806 | } 807 | }, 808 | "node_modules/utf-8-validate": { 809 | "version": "5.0.10", 810 | "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", 811 | "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", 812 | "hasInstallScript": true, 813 | "license": "MIT", 814 | "optional": true, 815 | "dependencies": { 816 | "node-gyp-build": "^4.3.0" 817 | }, 818 | "engines": { 819 | "node": ">=6.14.2" 820 | } 821 | }, 822 | "node_modules/uuid": { 823 | "version": "8.3.2", 824 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 825 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 826 | "license": "MIT", 827 | "bin": { 828 | "uuid": "dist/bin/uuid" 829 | } 830 | }, 831 | "node_modules/webidl-conversions": { 832 | "version": "3.0.1", 833 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 834 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", 835 | "license": "BSD-2-Clause" 836 | }, 837 | "node_modules/whatwg-url": { 838 | "version": "5.0.0", 839 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 840 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 841 | "license": "MIT", 842 | "dependencies": { 843 | "tr46": "~0.0.3", 844 | "webidl-conversions": "^3.0.0" 845 | } 846 | }, 847 | "node_modules/ws": { 848 | "version": "7.5.10", 849 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", 850 | "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", 851 | "license": "MIT", 852 | "engines": { 853 | "node": ">=8.3.0" 854 | }, 855 | "peerDependencies": { 856 | "bufferutil": "^4.0.1", 857 | "utf-8-validate": "^5.0.2" 858 | }, 859 | "peerDependenciesMeta": { 860 | "bufferutil": { 861 | "optional": true 862 | }, 863 | "utf-8-validate": { 864 | "optional": true 865 | } 866 | } 867 | } 868 | } 869 | } 870 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jito-landing-benchmark", 3 | "version": "0.0.1", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "tsc && node dist/index.js", 8 | "build": "tsc", 9 | "test": "echo \"Error: no test specified\" && exit 1" 10 | }, 11 | "keywords": [], 12 | "author": "", 13 | "license": "ISC", 14 | "dependencies": { 15 | "@solana/web3.js": "^1.95.3", 16 | "axios": "^1.7.7", 17 | "bs58": "^6.0.0", 18 | "dotenv": "^16.4.5", 19 | "mathjs": "^13.2.0", 20 | "typescript": "^5.6.3" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import dotenv from 'dotenv'; 2 | import fs from 'fs'; 3 | import { 4 | Keypair, 5 | Connection, 6 | SystemProgram, 7 | PublicKey, 8 | TransactionMessage, 9 | VersionedTransaction 10 | } from '@solana/web3.js'; 11 | import bs58 from 'bs58'; 12 | import axios from "axios"; 13 | import { mean } from "mathjs"; 14 | 15 | dotenv.config(); 16 | 17 | const JITO_BLOCK_ENGINE_URL = `${process.env.JITO_BLOCK_ENGINE_URL}/api/v1/bundles`; 18 | const JITO_TIP_ACCOUNTS = [ 19 | '96gYZGLnJYVFmbjzopPSU6QiEV5fGqZNyN9nmNhvrZU5', 20 | 'HFqU5x63VTqvQss8hp11i4wVV8bD44PvwucfZ2bU7gRe', 21 | 'Cw8CFyM9FkoMi7K7Crf6HNQqf4uEMzpKw6QNghXLvLkY', 22 | 'ADaUMid9yfUytqMBgopwjb2DTLSokTSzL1zt6iGPaS49', 23 | 'DfXygSm4jCyNCybVYYK6DwvWqjKee8pbDmJGcLWNDXjh', 24 | 'ADuUkR4vqLUMWXxW9gh6D6L8pMSawimctcNZ5pGwDcEt', 25 | 'DttWaMuVvTiduZRnguLF7jNxTgiMBZ1hyAumKUiL2KRL', 26 | '3AVi9Tg9Uo68tJfuvoKvqKNWKkC5wPdSSdeBnizKZ6jT', 27 | ]; 28 | 29 | const ROUNDS = parseInt(process.env.ROUNDS || "1", 10); 30 | const WAITING_TIME = parseInt(process.env.WAITING_TIME || "1", 10) * 1000; 31 | 32 | const rpcUrl = process.env.RPC_URL; 33 | const keyPath = process.env.KEY_PATH; 34 | if (!rpcUrl) { 35 | throw new Error('Missing RPC_URL in .env file'); 36 | } 37 | if (!keyPath) { 38 | throw new Error('Missing KEY_PATH in .env file'); 39 | } 40 | const connection = new Connection(rpcUrl, 'confirmed'); 41 | const payer = Keypair.fromSecretKey(Uint8Array.from( 42 | JSON.parse(fs.readFileSync(keyPath, 'utf-8')) 43 | )); 44 | console.log(`payer: ${payer.publicKey.toBase58()}`); 45 | 46 | const wait = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)); 47 | 48 | async function buildTransaction(jitoTipAccount: string, tip: number, BUFF_TIP: boolean) { 49 | let ixs = []; 50 | 51 | ixs.push( 52 | SystemProgram.transfer({ 53 | fromPubkey: payer.publicKey, 54 | toPubkey: new PublicKey(jitoTipAccount), 55 | lamports: tip, 56 | }) 57 | ); 58 | 59 | if (BUFF_TIP) { 60 | ixs.push( 61 | SystemProgram.transfer({ 62 | fromPubkey: payer.publicKey, 63 | toPubkey: new PublicKey('buffaAJKmNLao65TDTUGq8oB9HgxkfPLGqPMFQapotJ'), 64 | lamports: tip * 0.1, 65 | }) 66 | ); 67 | } 68 | 69 | const { blockhash } = await connection.getLatestBlockhash(); 70 | const messageV0 = new TransactionMessage({ 71 | payerKey: payer.publicKey, 72 | recentBlockhash: blockhash, 73 | instructions: ixs, 74 | }).compileToV0Message(); 75 | 76 | const transaction = new VersionedTransaction(messageV0); 77 | transaction.sign([payer]); 78 | 79 | return bs58.encode(transaction.serialize()); 80 | } 81 | 82 | async function main() { 83 | const slotsBehind: number[] = []; 84 | let successCount = 0; 85 | 86 | for (let i = 1; i <= ROUNDS; i++) { 87 | const balance = await connection.getBalance(payer.publicKey); 88 | console.log(`balance: ${balance} lamports`); 89 | 90 | const currentSlot = await connection.getSlot(); 91 | console.log("Current Slot:", currentSlot); 92 | 93 | const randomIndex = Math.floor(Math.random() * JITO_TIP_ACCOUNTS.length); 94 | const jitoTipAccount = JITO_TIP_ACCOUNTS[randomIndex]; 95 | 96 | const tip = parseFloat(process.env.JITO_TIP || "0"); 97 | const buffTip = process.env.BUFF_TIP === 'True'; 98 | 99 | const base58Transaction = await buildTransaction(jitoTipAccount, tip, buffTip); 100 | 101 | const bundleData = { 102 | jsonrpc: "2.0", 103 | id: 1, 104 | method: "sendBundle", 105 | params: [[base58Transaction]] 106 | }; 107 | 108 | try { 109 | const bundleResp = await axios.post(JITO_BLOCK_ENGINE_URL, bundleData, { 110 | headers: { 111 | 'Content-Type': 'application/json' 112 | } 113 | }); 114 | const bundleId = bundleResp.data.result; 115 | console.log(`Bundle sent, id: ${bundleId}`); 116 | 117 | await wait(WAITING_TIME); 118 | 119 | const bundleStatusData = { 120 | jsonrpc: "2.0", 121 | id: 1, 122 | method: "getBundleStatuses", 123 | params: [[bundleId]] 124 | }; 125 | 126 | const bundleStatusResp = await axios.post(JITO_BLOCK_ENGINE_URL, bundleStatusData, { 127 | headers: { 128 | 'Content-Type': 'application/json' 129 | } 130 | }); 131 | 132 | if (bundleStatusResp.data.result.value && bundleStatusResp.data.result.value.length > 0) { 133 | const landingSlot = bundleStatusResp.data.result.value[0].slot; 134 | console.log(`Slot behind: ${landingSlot - currentSlot}`); 135 | slotsBehind.push(landingSlot - currentSlot); 136 | successCount++; 137 | } else { 138 | console.log('Landing failed'); 139 | } 140 | 141 | } catch (error) { 142 | console.error("Error sending bundle or fetching status:", error); 143 | } 144 | } 145 | 146 | console.log("\n---"); 147 | 148 | if (slotsBehind.length > 0) { 149 | console.log(`Average slots behind: ${mean(slotsBehind)}`); 150 | } else { 151 | console.log("No valid slots behind data collected."); 152 | } 153 | 154 | const successRate = (successCount / ROUNDS) * 100; 155 | console.log(`Success Rate: ${successRate.toFixed(2)}%`); 156 | } 157 | 158 | main().catch(console.error); 159 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig to read more about this file */ 4 | 5 | /* Projects */ 6 | // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ 7 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 8 | // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ 9 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ 10 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 11 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 12 | 13 | /* Language and Environment */ 14 | "target": "es6", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ 15 | // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 16 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 17 | // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ 18 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 19 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ 20 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 21 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ 22 | // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ 23 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 24 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 25 | // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ 26 | 27 | /* Modules */ 28 | "module": "commonjs", /* Specify what module code is generated. */ 29 | // "rootDir": "./", /* Specify the root folder within your source files. */ 30 | // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ 31 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ 32 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 33 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 34 | // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ 35 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */ 36 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 37 | // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ 38 | // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ 39 | // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ 40 | // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ 41 | // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ 42 | // "noUncheckedSideEffectImports": true, /* Check side effect imports. */ 43 | // "resolveJsonModule": true, /* Enable importing .json files. */ 44 | // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ 45 | // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ 46 | 47 | /* JavaScript Support */ 48 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ 49 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 50 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ 51 | 52 | /* Emit */ 53 | // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ 54 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */ 55 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 56 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 57 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 58 | // "noEmit": true, /* Disable emitting files from a compilation. */ 59 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ 60 | "outDir": "./dist", /* Specify an output folder for all emitted files. */ 61 | // "removeComments": true, /* Disable emitting comments. */ 62 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 63 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 64 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 65 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 66 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 67 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 68 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 69 | // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ 70 | // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ 71 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 72 | // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ 73 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 74 | 75 | /* Interop Constraints */ 76 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 77 | // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ 78 | // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ 79 | // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ 80 | "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ 81 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ 82 | "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ 83 | 84 | /* Type Checking */ 85 | "strict": true, /* Enable all strict type-checking options. */ 86 | // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ 87 | // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ 88 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 89 | // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ 90 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ 91 | // "strictBuiltinIteratorReturn": true, /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */ 92 | // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ 93 | // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ 94 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 95 | // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ 96 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ 97 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 98 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 99 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 100 | // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ 101 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 102 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ 103 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 104 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 105 | 106 | /* Completeness */ 107 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 108 | "skipLibCheck": true /* Skip type checking all .d.ts files. */ 109 | }, 110 | "include": ["src/*"], 111 | "exclude": ["node_modules"] 112 | } 113 | --------------------------------------------------------------------------------