├── .env.example ├── .gitignore ├── docs ├── how.png └── sample.jpg ├── package.json ├── pnpm-lock.yaml ├── readme.md ├── src ├── index.ts ├── util.ts └── worker.ts └── tsconfig.json /.env.example: -------------------------------------------------------------------------------- 1 | PRIVATE_KEY=your private key here, dont share to anyone!!!!!!! 2 | PUBLIC_KEY=your public key here 3 | CPU_COUNT=you cpu count here 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .node_modules/ 3 | built/* 4 | tests/cases/rwc/* 5 | tests/cases/perf/* 6 | !tests/cases/webharness/compilerToString.js 7 | test-args.txt 8 | ~*.docx 9 | \#*\# 10 | .\#* 11 | tests/baselines/local/* 12 | tests/baselines/local.old/* 13 | tests/services/baselines/local/* 14 | tests/baselines/prototyping/local/* 15 | tests/baselines/rwc/* 16 | tests/baselines/reference/projectOutput/* 17 | tests/baselines/local/projectOutput/* 18 | tests/baselines/reference/testresults.tap 19 | tests/services/baselines/prototyping/local/* 20 | tests/services/browser/typescriptServices.js 21 | src/harness/*.js 22 | src/compiler/diagnosticInformationMap.generated.ts 23 | src/compiler/diagnosticMessages.generated.json 24 | src/parser/diagnosticInformationMap.generated.ts 25 | src/parser/diagnosticMessages.generated.json 26 | rwc-report.html 27 | *.swp 28 | build.json 29 | *.actual 30 | tests/webTestServer.js 31 | tests/webTestServer.js.map 32 | tests/webhost/*.d.ts 33 | tests/webhost/webtsc.js 34 | tests/cases/**/*.js 35 | tests/cases/**/*.js.map 36 | *.config 37 | scripts/eslint/built/ 38 | scripts/debug.bat 39 | scripts/run.bat 40 | scripts/**/*.js 41 | scripts/**/*.js.map 42 | coverage/ 43 | internal/ 44 | **/.DS_Store 45 | .settings 46 | **/.vs 47 | **/.vscode/* 48 | !**/.vscode/tasks.json 49 | !**/.vscode/settings.template.json 50 | !**/.vscode/launch.template.json 51 | !**/.vscode/extensions.json 52 | !tests/cases/projects/projectOption/**/node_modules 53 | !tests/cases/projects/NodeModulesSearch/**/* 54 | !tests/baselines/reference/project/nodeModules*/**/* 55 | .idea 56 | yarn.lock 57 | yarn-error.log 58 | .parallelperf.* 59 | tests/baselines/reference/dt 60 | .failed-tests 61 | TEST-results.xml 62 | package-lock.json 63 | .eslintcache 64 | *v8.log 65 | /lib/ 66 | .env 67 | -------------------------------------------------------------------------------- /docs/how.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ohroy/node-noss/103216f25d1326bc40ea8a5c1c26b5386d0d5486/docs/how.png -------------------------------------------------------------------------------- /docs/sample.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ohroy/node-noss/103216f25d1326bc40ea8a5c1c26b5386d0d5486/docs/sample.jpg -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module", 3 | "name": "noss", 4 | "version": "1.0.0", 5 | "description": "", 6 | "main": "index.js", 7 | "scripts": { 8 | "start": "node --no-warnings --loader ts-node/esm ./src/index.ts", 9 | "test": "echo \"Error: no test specified\" && exit 1" 10 | }, 11 | "keywords": [], 12 | "author": "", 13 | "license": "ISC", 14 | "devDependencies": { 15 | "@types/node": "^20.10.6", 16 | "@types/ws": "^8.5.10", 17 | "ts-node": "^10.9.2", 18 | "tsx": "^4.7.0" 19 | }, 20 | "dependencies": { 21 | "bip39": "^3.1.0", 22 | "dotenv": "^16.3.1", 23 | "nostr-tools": "^2.1.2", 24 | "nostr-wasm-ng": "^0.1.0", 25 | "web3": "^4.3.0", 26 | "winston": "^3.11.0", 27 | "ws": "^8.16.0" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | bip39: 9 | specifier: ^3.1.0 10 | version: 3.1.0 11 | dotenv: 12 | specifier: ^16.3.1 13 | version: 16.3.1 14 | nostr-tools: 15 | specifier: ^2.1.2 16 | version: 2.1.2(typescript@5.3.3) 17 | nostr-wasm-ng: 18 | specifier: ^0.1.0 19 | version: 0.1.0 20 | web3: 21 | specifier: ^4.3.0 22 | version: 4.3.0(typescript@5.3.3) 23 | winston: 24 | specifier: ^3.11.0 25 | version: 3.11.0 26 | ws: 27 | specifier: ^8.16.0 28 | version: 8.16.0 29 | 30 | devDependencies: 31 | '@types/node': 32 | specifier: ^20.10.6 33 | version: 20.10.6 34 | '@types/ws': 35 | specifier: ^8.5.10 36 | version: 8.5.10 37 | ts-node: 38 | specifier: ^10.9.2 39 | version: 10.9.2(@types/node@20.10.6)(typescript@5.3.3) 40 | tsx: 41 | specifier: ^4.7.0 42 | version: 4.7.0 43 | 44 | packages: 45 | 46 | /@adraffy/ens-normalize@1.10.0: 47 | resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} 48 | dev: false 49 | 50 | /@colors/colors@1.6.0: 51 | resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} 52 | engines: {node: '>=0.1.90'} 53 | dev: false 54 | 55 | /@cspotcode/source-map-support@0.8.1: 56 | resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 57 | engines: {node: '>=12'} 58 | dependencies: 59 | '@jridgewell/trace-mapping': 0.3.9 60 | dev: true 61 | 62 | /@dabh/diagnostics@2.0.3: 63 | resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} 64 | dependencies: 65 | colorspace: 1.1.4 66 | enabled: 2.0.0 67 | kuler: 2.0.0 68 | dev: false 69 | 70 | /@esbuild/aix-ppc64@0.19.11: 71 | resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} 72 | engines: {node: '>=12'} 73 | cpu: [ppc64] 74 | os: [aix] 75 | requiresBuild: true 76 | dev: true 77 | optional: true 78 | 79 | /@esbuild/android-arm64@0.19.11: 80 | resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} 81 | engines: {node: '>=12'} 82 | cpu: [arm64] 83 | os: [android] 84 | requiresBuild: true 85 | dev: true 86 | optional: true 87 | 88 | /@esbuild/android-arm@0.19.11: 89 | resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} 90 | engines: {node: '>=12'} 91 | cpu: [arm] 92 | os: [android] 93 | requiresBuild: true 94 | dev: true 95 | optional: true 96 | 97 | /@esbuild/android-x64@0.19.11: 98 | resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} 99 | engines: {node: '>=12'} 100 | cpu: [x64] 101 | os: [android] 102 | requiresBuild: true 103 | dev: true 104 | optional: true 105 | 106 | /@esbuild/darwin-arm64@0.19.11: 107 | resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} 108 | engines: {node: '>=12'} 109 | cpu: [arm64] 110 | os: [darwin] 111 | requiresBuild: true 112 | dev: true 113 | optional: true 114 | 115 | /@esbuild/darwin-x64@0.19.11: 116 | resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} 117 | engines: {node: '>=12'} 118 | cpu: [x64] 119 | os: [darwin] 120 | requiresBuild: true 121 | dev: true 122 | optional: true 123 | 124 | /@esbuild/freebsd-arm64@0.19.11: 125 | resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} 126 | engines: {node: '>=12'} 127 | cpu: [arm64] 128 | os: [freebsd] 129 | requiresBuild: true 130 | dev: true 131 | optional: true 132 | 133 | /@esbuild/freebsd-x64@0.19.11: 134 | resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} 135 | engines: {node: '>=12'} 136 | cpu: [x64] 137 | os: [freebsd] 138 | requiresBuild: true 139 | dev: true 140 | optional: true 141 | 142 | /@esbuild/linux-arm64@0.19.11: 143 | resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} 144 | engines: {node: '>=12'} 145 | cpu: [arm64] 146 | os: [linux] 147 | requiresBuild: true 148 | dev: true 149 | optional: true 150 | 151 | /@esbuild/linux-arm@0.19.11: 152 | resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} 153 | engines: {node: '>=12'} 154 | cpu: [arm] 155 | os: [linux] 156 | requiresBuild: true 157 | dev: true 158 | optional: true 159 | 160 | /@esbuild/linux-ia32@0.19.11: 161 | resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} 162 | engines: {node: '>=12'} 163 | cpu: [ia32] 164 | os: [linux] 165 | requiresBuild: true 166 | dev: true 167 | optional: true 168 | 169 | /@esbuild/linux-loong64@0.19.11: 170 | resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} 171 | engines: {node: '>=12'} 172 | cpu: [loong64] 173 | os: [linux] 174 | requiresBuild: true 175 | dev: true 176 | optional: true 177 | 178 | /@esbuild/linux-mips64el@0.19.11: 179 | resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} 180 | engines: {node: '>=12'} 181 | cpu: [mips64el] 182 | os: [linux] 183 | requiresBuild: true 184 | dev: true 185 | optional: true 186 | 187 | /@esbuild/linux-ppc64@0.19.11: 188 | resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} 189 | engines: {node: '>=12'} 190 | cpu: [ppc64] 191 | os: [linux] 192 | requiresBuild: true 193 | dev: true 194 | optional: true 195 | 196 | /@esbuild/linux-riscv64@0.19.11: 197 | resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} 198 | engines: {node: '>=12'} 199 | cpu: [riscv64] 200 | os: [linux] 201 | requiresBuild: true 202 | dev: true 203 | optional: true 204 | 205 | /@esbuild/linux-s390x@0.19.11: 206 | resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} 207 | engines: {node: '>=12'} 208 | cpu: [s390x] 209 | os: [linux] 210 | requiresBuild: true 211 | dev: true 212 | optional: true 213 | 214 | /@esbuild/linux-x64@0.19.11: 215 | resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} 216 | engines: {node: '>=12'} 217 | cpu: [x64] 218 | os: [linux] 219 | requiresBuild: true 220 | dev: true 221 | optional: true 222 | 223 | /@esbuild/netbsd-x64@0.19.11: 224 | resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} 225 | engines: {node: '>=12'} 226 | cpu: [x64] 227 | os: [netbsd] 228 | requiresBuild: true 229 | dev: true 230 | optional: true 231 | 232 | /@esbuild/openbsd-x64@0.19.11: 233 | resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} 234 | engines: {node: '>=12'} 235 | cpu: [x64] 236 | os: [openbsd] 237 | requiresBuild: true 238 | dev: true 239 | optional: true 240 | 241 | /@esbuild/sunos-x64@0.19.11: 242 | resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} 243 | engines: {node: '>=12'} 244 | cpu: [x64] 245 | os: [sunos] 246 | requiresBuild: true 247 | dev: true 248 | optional: true 249 | 250 | /@esbuild/win32-arm64@0.19.11: 251 | resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} 252 | engines: {node: '>=12'} 253 | cpu: [arm64] 254 | os: [win32] 255 | requiresBuild: true 256 | dev: true 257 | optional: true 258 | 259 | /@esbuild/win32-ia32@0.19.11: 260 | resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} 261 | engines: {node: '>=12'} 262 | cpu: [ia32] 263 | os: [win32] 264 | requiresBuild: true 265 | dev: true 266 | optional: true 267 | 268 | /@esbuild/win32-x64@0.19.11: 269 | resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} 270 | engines: {node: '>=12'} 271 | cpu: [x64] 272 | os: [win32] 273 | requiresBuild: true 274 | dev: true 275 | optional: true 276 | 277 | /@ethereumjs/rlp@4.0.1: 278 | resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} 279 | engines: {node: '>=14'} 280 | hasBin: true 281 | dev: false 282 | 283 | /@jridgewell/resolve-uri@3.1.1: 284 | resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} 285 | engines: {node: '>=6.0.0'} 286 | dev: true 287 | 288 | /@jridgewell/sourcemap-codec@1.4.15: 289 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 290 | dev: true 291 | 292 | /@jridgewell/trace-mapping@0.3.9: 293 | resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 294 | dependencies: 295 | '@jridgewell/resolve-uri': 3.1.1 296 | '@jridgewell/sourcemap-codec': 1.4.15 297 | dev: true 298 | 299 | /@noble/ciphers@0.2.0: 300 | resolution: {integrity: sha512-6YBxJDAapHSdd3bLDv6x2wRPwq4QFMUaB3HvljNBUTThDd12eSm7/3F+2lnfzx2jvM+S6Nsy0jEt9QbPqSwqRw==} 301 | dev: false 302 | 303 | /@noble/curves@1.1.0: 304 | resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} 305 | dependencies: 306 | '@noble/hashes': 1.3.1 307 | dev: false 308 | 309 | /@noble/curves@1.2.0: 310 | resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} 311 | dependencies: 312 | '@noble/hashes': 1.3.2 313 | dev: false 314 | 315 | /@noble/hashes@1.3.1: 316 | resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} 317 | engines: {node: '>= 16'} 318 | dev: false 319 | 320 | /@noble/hashes@1.3.2: 321 | resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} 322 | engines: {node: '>= 16'} 323 | dev: false 324 | 325 | /@scure/base@1.1.1: 326 | resolution: {integrity: sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==} 327 | dev: false 328 | 329 | /@scure/bip32@1.3.1: 330 | resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} 331 | dependencies: 332 | '@noble/curves': 1.1.0 333 | '@noble/hashes': 1.3.1 334 | '@scure/base': 1.1.1 335 | dev: false 336 | 337 | /@scure/bip39@1.2.1: 338 | resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} 339 | dependencies: 340 | '@noble/hashes': 1.3.1 341 | '@scure/base': 1.1.1 342 | dev: false 343 | 344 | /@tsconfig/node10@1.0.9: 345 | resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} 346 | dev: true 347 | 348 | /@tsconfig/node12@1.0.11: 349 | resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} 350 | dev: true 351 | 352 | /@tsconfig/node14@1.0.3: 353 | resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} 354 | dev: true 355 | 356 | /@tsconfig/node16@1.0.4: 357 | resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} 358 | dev: true 359 | 360 | /@types/node@20.10.6: 361 | resolution: {integrity: sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==} 362 | dependencies: 363 | undici-types: 5.26.5 364 | 365 | /@types/triple-beam@1.3.5: 366 | resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} 367 | dev: false 368 | 369 | /@types/ws@8.5.10: 370 | resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} 371 | dependencies: 372 | '@types/node': 20.10.6 373 | dev: true 374 | 375 | /@types/ws@8.5.3: 376 | resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} 377 | dependencies: 378 | '@types/node': 20.10.6 379 | dev: false 380 | 381 | /abitype@0.7.1(typescript@5.3.3): 382 | resolution: {integrity: sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==} 383 | peerDependencies: 384 | typescript: '>=4.9.4' 385 | zod: ^3 >=3.19.1 386 | peerDependenciesMeta: 387 | zod: 388 | optional: true 389 | dependencies: 390 | typescript: 5.3.3 391 | dev: false 392 | 393 | /acorn-walk@8.3.1: 394 | resolution: {integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==} 395 | engines: {node: '>=0.4.0'} 396 | dev: true 397 | 398 | /acorn@8.11.3: 399 | resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} 400 | engines: {node: '>=0.4.0'} 401 | hasBin: true 402 | dev: true 403 | 404 | /arg@4.1.3: 405 | resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} 406 | dev: true 407 | 408 | /async@3.2.5: 409 | resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} 410 | dev: false 411 | 412 | /available-typed-arrays@1.0.5: 413 | resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} 414 | engines: {node: '>= 0.4'} 415 | dev: false 416 | 417 | /bip39@3.1.0: 418 | resolution: {integrity: sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==} 419 | dependencies: 420 | '@noble/hashes': 1.3.2 421 | dev: false 422 | 423 | /call-bind@1.0.5: 424 | resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} 425 | dependencies: 426 | function-bind: 1.1.2 427 | get-intrinsic: 1.2.2 428 | set-function-length: 1.1.1 429 | dev: false 430 | 431 | /color-convert@1.9.3: 432 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 433 | dependencies: 434 | color-name: 1.1.3 435 | dev: false 436 | 437 | /color-name@1.1.3: 438 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 439 | dev: false 440 | 441 | /color-name@1.1.4: 442 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 443 | dev: false 444 | 445 | /color-string@1.9.1: 446 | resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} 447 | dependencies: 448 | color-name: 1.1.4 449 | simple-swizzle: 0.2.2 450 | dev: false 451 | 452 | /color@3.2.1: 453 | resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} 454 | dependencies: 455 | color-convert: 1.9.3 456 | color-string: 1.9.1 457 | dev: false 458 | 459 | /colorspace@1.1.4: 460 | resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} 461 | dependencies: 462 | color: 3.2.1 463 | text-hex: 1.0.0 464 | dev: false 465 | 466 | /crc-32@1.2.2: 467 | resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} 468 | engines: {node: '>=0.8'} 469 | hasBin: true 470 | dev: false 471 | 472 | /create-require@1.1.1: 473 | resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} 474 | dev: true 475 | 476 | /cross-fetch@4.0.0: 477 | resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} 478 | dependencies: 479 | node-fetch: 2.7.0 480 | transitivePeerDependencies: 481 | - encoding 482 | dev: false 483 | 484 | /define-data-property@1.1.1: 485 | resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} 486 | engines: {node: '>= 0.4'} 487 | dependencies: 488 | get-intrinsic: 1.2.2 489 | gopd: 1.0.1 490 | has-property-descriptors: 1.0.1 491 | dev: false 492 | 493 | /diff@4.0.2: 494 | resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} 495 | engines: {node: '>=0.3.1'} 496 | dev: true 497 | 498 | /dotenv@16.3.1: 499 | resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} 500 | engines: {node: '>=12'} 501 | dev: false 502 | 503 | /enabled@2.0.0: 504 | resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} 505 | dev: false 506 | 507 | /esbuild@0.19.11: 508 | resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} 509 | engines: {node: '>=12'} 510 | hasBin: true 511 | requiresBuild: true 512 | optionalDependencies: 513 | '@esbuild/aix-ppc64': 0.19.11 514 | '@esbuild/android-arm': 0.19.11 515 | '@esbuild/android-arm64': 0.19.11 516 | '@esbuild/android-x64': 0.19.11 517 | '@esbuild/darwin-arm64': 0.19.11 518 | '@esbuild/darwin-x64': 0.19.11 519 | '@esbuild/freebsd-arm64': 0.19.11 520 | '@esbuild/freebsd-x64': 0.19.11 521 | '@esbuild/linux-arm': 0.19.11 522 | '@esbuild/linux-arm64': 0.19.11 523 | '@esbuild/linux-ia32': 0.19.11 524 | '@esbuild/linux-loong64': 0.19.11 525 | '@esbuild/linux-mips64el': 0.19.11 526 | '@esbuild/linux-ppc64': 0.19.11 527 | '@esbuild/linux-riscv64': 0.19.11 528 | '@esbuild/linux-s390x': 0.19.11 529 | '@esbuild/linux-x64': 0.19.11 530 | '@esbuild/netbsd-x64': 0.19.11 531 | '@esbuild/openbsd-x64': 0.19.11 532 | '@esbuild/sunos-x64': 0.19.11 533 | '@esbuild/win32-arm64': 0.19.11 534 | '@esbuild/win32-ia32': 0.19.11 535 | '@esbuild/win32-x64': 0.19.11 536 | dev: true 537 | 538 | /ethereum-cryptography@2.1.2: 539 | resolution: {integrity: sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==} 540 | dependencies: 541 | '@noble/curves': 1.1.0 542 | '@noble/hashes': 1.3.1 543 | '@scure/bip32': 1.3.1 544 | '@scure/bip39': 1.2.1 545 | dev: false 546 | 547 | /fecha@4.2.3: 548 | resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} 549 | dev: false 550 | 551 | /fn.name@1.1.0: 552 | resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} 553 | dev: false 554 | 555 | /for-each@0.3.3: 556 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} 557 | dependencies: 558 | is-callable: 1.2.7 559 | dev: false 560 | 561 | /fsevents@2.3.3: 562 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 563 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 564 | os: [darwin] 565 | requiresBuild: true 566 | dev: true 567 | optional: true 568 | 569 | /function-bind@1.1.2: 570 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 571 | dev: false 572 | 573 | /get-intrinsic@1.2.2: 574 | resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} 575 | dependencies: 576 | function-bind: 1.1.2 577 | has-proto: 1.0.1 578 | has-symbols: 1.0.3 579 | hasown: 2.0.0 580 | dev: false 581 | 582 | /get-tsconfig@4.7.2: 583 | resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} 584 | dependencies: 585 | resolve-pkg-maps: 1.0.0 586 | dev: true 587 | 588 | /gopd@1.0.1: 589 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 590 | dependencies: 591 | get-intrinsic: 1.2.2 592 | dev: false 593 | 594 | /has-property-descriptors@1.0.1: 595 | resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} 596 | dependencies: 597 | get-intrinsic: 1.2.2 598 | dev: false 599 | 600 | /has-proto@1.0.1: 601 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 602 | engines: {node: '>= 0.4'} 603 | dev: false 604 | 605 | /has-symbols@1.0.3: 606 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 607 | engines: {node: '>= 0.4'} 608 | dev: false 609 | 610 | /has-tostringtag@1.0.0: 611 | resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} 612 | engines: {node: '>= 0.4'} 613 | dependencies: 614 | has-symbols: 1.0.3 615 | dev: false 616 | 617 | /hasown@2.0.0: 618 | resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} 619 | engines: {node: '>= 0.4'} 620 | dependencies: 621 | function-bind: 1.1.2 622 | dev: false 623 | 624 | /inherits@2.0.4: 625 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 626 | dev: false 627 | 628 | /is-arguments@1.1.1: 629 | resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} 630 | engines: {node: '>= 0.4'} 631 | dependencies: 632 | call-bind: 1.0.5 633 | has-tostringtag: 1.0.0 634 | dev: false 635 | 636 | /is-arrayish@0.3.2: 637 | resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} 638 | dev: false 639 | 640 | /is-callable@1.2.7: 641 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 642 | engines: {node: '>= 0.4'} 643 | dev: false 644 | 645 | /is-generator-function@1.0.10: 646 | resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} 647 | engines: {node: '>= 0.4'} 648 | dependencies: 649 | has-tostringtag: 1.0.0 650 | dev: false 651 | 652 | /is-stream@2.0.1: 653 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 654 | engines: {node: '>=8'} 655 | dev: false 656 | 657 | /is-typed-array@1.1.12: 658 | resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} 659 | engines: {node: '>= 0.4'} 660 | dependencies: 661 | which-typed-array: 1.1.13 662 | dev: false 663 | 664 | /isomorphic-ws@5.0.0(ws@8.16.0): 665 | resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} 666 | peerDependencies: 667 | ws: '*' 668 | dependencies: 669 | ws: 8.16.0 670 | dev: false 671 | 672 | /kuler@2.0.0: 673 | resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} 674 | dev: false 675 | 676 | /logform@2.6.0: 677 | resolution: {integrity: sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==} 678 | engines: {node: '>= 12.0.0'} 679 | dependencies: 680 | '@colors/colors': 1.6.0 681 | '@types/triple-beam': 1.3.5 682 | fecha: 4.2.3 683 | ms: 2.1.3 684 | safe-stable-stringify: 2.4.3 685 | triple-beam: 1.4.1 686 | dev: false 687 | 688 | /make-error@1.3.6: 689 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 690 | dev: true 691 | 692 | /mitata@0.1.6: 693 | resolution: {integrity: sha512-VKQ0r3jriTOU9E2Z+mwbZrUmbg4Li4QyFfi7kfHKl6reZhGzL0AYlu3wE0VPXzIwA5xnFzmEQoBwCcNT8stUkA==} 694 | dev: false 695 | 696 | /ms@2.1.3: 697 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 698 | dev: false 699 | 700 | /node-fetch@2.7.0: 701 | resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} 702 | engines: {node: 4.x || >=6.0.0} 703 | peerDependencies: 704 | encoding: ^0.1.0 705 | peerDependenciesMeta: 706 | encoding: 707 | optional: true 708 | dependencies: 709 | whatwg-url: 5.0.0 710 | dev: false 711 | 712 | /nostr-tools@2.1.2(typescript@5.3.3): 713 | resolution: {integrity: sha512-7a30ipG5N3pMeRT5tjNodFbYy8JO37Ndh54yshkGjSRa08umLDmEcmVzdIoSI7yxdac24WbFz4OBoJhR7kHFkw==} 714 | peerDependencies: 715 | typescript: '>=5.0.0' 716 | peerDependenciesMeta: 717 | typescript: 718 | optional: true 719 | dependencies: 720 | '@noble/ciphers': 0.2.0 721 | '@noble/curves': 1.2.0 722 | '@noble/hashes': 1.3.1 723 | '@scure/base': 1.1.1 724 | '@scure/bip32': 1.3.1 725 | '@scure/bip39': 1.2.1 726 | mitata: 0.1.6 727 | nostr-wasm: 0.1.0 728 | typescript: 5.3.3 729 | dev: false 730 | 731 | /nostr-wasm-ng@0.1.0: 732 | resolution: {integrity: sha512-fvATMPLxvuZUJuje5jBYEXUkaJX+/UIFLDldMbsIKjqicrp0Re9HEipQJJcQgY0LuATaVi39YvVaEFsKpP0B3w==} 733 | dev: false 734 | 735 | /nostr-wasm@0.1.0: 736 | resolution: {integrity: sha512-78BTryCLcLYv96ONU8Ws3Q1JzjlAt+43pWQhIl86xZmWeegYCNLPml7yQ+gG3vR6V5h4XGj+TxO+SS5dsThQIA==} 737 | dev: false 738 | 739 | /one-time@1.0.0: 740 | resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} 741 | dependencies: 742 | fn.name: 1.1.0 743 | dev: false 744 | 745 | /readable-stream@3.6.2: 746 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 747 | engines: {node: '>= 6'} 748 | dependencies: 749 | inherits: 2.0.4 750 | string_decoder: 1.3.0 751 | util-deprecate: 1.0.2 752 | dev: false 753 | 754 | /resolve-pkg-maps@1.0.0: 755 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 756 | dev: true 757 | 758 | /safe-buffer@5.2.1: 759 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 760 | dev: false 761 | 762 | /safe-stable-stringify@2.4.3: 763 | resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} 764 | engines: {node: '>=10'} 765 | dev: false 766 | 767 | /set-function-length@1.1.1: 768 | resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} 769 | engines: {node: '>= 0.4'} 770 | dependencies: 771 | define-data-property: 1.1.1 772 | get-intrinsic: 1.2.2 773 | gopd: 1.0.1 774 | has-property-descriptors: 1.0.1 775 | dev: false 776 | 777 | /setimmediate@1.0.5: 778 | resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} 779 | dev: false 780 | 781 | /simple-swizzle@0.2.2: 782 | resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} 783 | dependencies: 784 | is-arrayish: 0.3.2 785 | dev: false 786 | 787 | /stack-trace@0.0.10: 788 | resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} 789 | dev: false 790 | 791 | /string_decoder@1.3.0: 792 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 793 | dependencies: 794 | safe-buffer: 5.2.1 795 | dev: false 796 | 797 | /text-hex@1.0.0: 798 | resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} 799 | dev: false 800 | 801 | /tr46@0.0.3: 802 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 803 | dev: false 804 | 805 | /triple-beam@1.4.1: 806 | resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} 807 | engines: {node: '>= 14.0.0'} 808 | dev: false 809 | 810 | /ts-node@10.9.2(@types/node@20.10.6)(typescript@5.3.3): 811 | resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} 812 | hasBin: true 813 | peerDependencies: 814 | '@swc/core': '>=1.2.50' 815 | '@swc/wasm': '>=1.2.50' 816 | '@types/node': '*' 817 | typescript: '>=2.7' 818 | peerDependenciesMeta: 819 | '@swc/core': 820 | optional: true 821 | '@swc/wasm': 822 | optional: true 823 | dependencies: 824 | '@cspotcode/source-map-support': 0.8.1 825 | '@tsconfig/node10': 1.0.9 826 | '@tsconfig/node12': 1.0.11 827 | '@tsconfig/node14': 1.0.3 828 | '@tsconfig/node16': 1.0.4 829 | '@types/node': 20.10.6 830 | acorn: 8.11.3 831 | acorn-walk: 8.3.1 832 | arg: 4.1.3 833 | create-require: 1.1.1 834 | diff: 4.0.2 835 | make-error: 1.3.6 836 | typescript: 5.3.3 837 | v8-compile-cache-lib: 3.0.1 838 | yn: 3.1.1 839 | dev: true 840 | 841 | /tsx@4.7.0: 842 | resolution: {integrity: sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==} 843 | engines: {node: '>=18.0.0'} 844 | hasBin: true 845 | dependencies: 846 | esbuild: 0.19.11 847 | get-tsconfig: 4.7.2 848 | optionalDependencies: 849 | fsevents: 2.3.3 850 | dev: true 851 | 852 | /typescript@5.3.3: 853 | resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} 854 | engines: {node: '>=14.17'} 855 | hasBin: true 856 | 857 | /undici-types@5.26.5: 858 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 859 | 860 | /util-deprecate@1.0.2: 861 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 862 | dev: false 863 | 864 | /util@0.12.5: 865 | resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} 866 | dependencies: 867 | inherits: 2.0.4 868 | is-arguments: 1.1.1 869 | is-generator-function: 1.0.10 870 | is-typed-array: 1.1.12 871 | which-typed-array: 1.1.13 872 | dev: false 873 | 874 | /v8-compile-cache-lib@3.0.1: 875 | resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} 876 | dev: true 877 | 878 | /web3-core@4.3.2: 879 | resolution: {integrity: sha512-uIMVd/j4BgOnwfpY8ZT+QKubOyM4xohEhFZXz9xB8wimXWMMlYVlIK/TbfHqFolS9uOerdSGhsMbcK9lETae8g==} 880 | engines: {node: '>=14', npm: '>=6.12.0'} 881 | dependencies: 882 | web3-errors: 1.1.4 883 | web3-eth-accounts: 4.1.0 884 | web3-eth-iban: 4.0.7 885 | web3-providers-http: 4.1.0 886 | web3-providers-ws: 4.0.7 887 | web3-types: 1.3.1 888 | web3-utils: 4.1.0 889 | web3-validator: 2.0.3 890 | optionalDependencies: 891 | web3-providers-ipc: 4.0.7 892 | transitivePeerDependencies: 893 | - bufferutil 894 | - encoding 895 | - utf-8-validate 896 | dev: false 897 | 898 | /web3-errors@1.1.4: 899 | resolution: {integrity: sha512-WahtszSqILez+83AxGecVroyZsMuuRT+KmQp4Si5P4Rnqbczno1k748PCrZTS1J4UCPmXMG2/Vt+0Bz2zwXkwQ==} 900 | engines: {node: '>=14', npm: '>=6.12.0'} 901 | dependencies: 902 | web3-types: 1.3.1 903 | dev: false 904 | 905 | /web3-eth-abi@4.1.4(typescript@5.3.3): 906 | resolution: {integrity: sha512-YLOBVVxxxLYKXjaiwZjEWYEnkMmmrm0nswZsvzSsINy/UgbWbzfoiZU+zn4YNWIEhORhx1p37iS3u/dP6VyC2w==} 907 | engines: {node: '>=14', npm: '>=6.12.0'} 908 | dependencies: 909 | abitype: 0.7.1(typescript@5.3.3) 910 | web3-errors: 1.1.4 911 | web3-types: 1.3.1 912 | web3-utils: 4.1.0 913 | web3-validator: 2.0.3 914 | transitivePeerDependencies: 915 | - typescript 916 | - zod 917 | dev: false 918 | 919 | /web3-eth-accounts@4.1.0: 920 | resolution: {integrity: sha512-UFtAsOANsvihTQ6SSvOKguupmQkResyR9M9JNuOxYpKh7+3W+sTnbLXw2UbOSYIsKlc1mpqqW9bVr1SjqHDpUQ==} 921 | engines: {node: '>=14', npm: '>=6.12.0'} 922 | dependencies: 923 | '@ethereumjs/rlp': 4.0.1 924 | crc-32: 1.2.2 925 | ethereum-cryptography: 2.1.2 926 | web3-errors: 1.1.4 927 | web3-types: 1.3.1 928 | web3-utils: 4.1.0 929 | web3-validator: 2.0.3 930 | dev: false 931 | 932 | /web3-eth-contract@4.1.4(typescript@5.3.3): 933 | resolution: {integrity: sha512-tJ4z6QLgtu8EQu2sXnLA7g427oxmngnbAUh+9kJKbP6Yep/oe+z79PqJv7H3MwqwUNW9T+/FeB2PnSQSyxz6ig==} 934 | engines: {node: '>=14', npm: '>=6.12.0'} 935 | dependencies: 936 | web3-core: 4.3.2 937 | web3-errors: 1.1.4 938 | web3-eth: 4.3.1(typescript@5.3.3) 939 | web3-eth-abi: 4.1.4(typescript@5.3.3) 940 | web3-types: 1.3.1 941 | web3-utils: 4.1.0 942 | web3-validator: 2.0.3 943 | transitivePeerDependencies: 944 | - bufferutil 945 | - encoding 946 | - typescript 947 | - utf-8-validate 948 | - zod 949 | dev: false 950 | 951 | /web3-eth-ens@4.0.8(typescript@5.3.3): 952 | resolution: {integrity: sha512-nj0JfeD45BbzVJcVYpUJnSo8iwDcY9CQ7CZhhIVVOFjvpMAPw0zEwjTvZEIQyCW61OoDG9xcBzwxe2tZoYhMRw==} 953 | engines: {node: '>=14', npm: '>=6.12.0'} 954 | dependencies: 955 | '@adraffy/ens-normalize': 1.10.0 956 | web3-core: 4.3.2 957 | web3-errors: 1.1.4 958 | web3-eth: 4.3.1(typescript@5.3.3) 959 | web3-eth-contract: 4.1.4(typescript@5.3.3) 960 | web3-net: 4.0.7 961 | web3-types: 1.3.1 962 | web3-utils: 4.1.0 963 | web3-validator: 2.0.3 964 | transitivePeerDependencies: 965 | - bufferutil 966 | - encoding 967 | - typescript 968 | - utf-8-validate 969 | - zod 970 | dev: false 971 | 972 | /web3-eth-iban@4.0.7: 973 | resolution: {integrity: sha512-8weKLa9KuKRzibC87vNLdkinpUE30gn0IGY027F8doeJdcPUfsa4IlBgNC4k4HLBembBB2CTU0Kr/HAOqMeYVQ==} 974 | engines: {node: '>=14', npm: '>=6.12.0'} 975 | dependencies: 976 | web3-errors: 1.1.4 977 | web3-types: 1.3.1 978 | web3-utils: 4.1.0 979 | web3-validator: 2.0.3 980 | dev: false 981 | 982 | /web3-eth-personal@4.0.8(typescript@5.3.3): 983 | resolution: {integrity: sha512-sXeyLKJ7ddQdMxz1BZkAwImjqh7OmKxhXoBNF3isDmD4QDpMIwv/t237S3q4Z0sZQamPa/pHebJRWVuvP8jZdw==} 984 | engines: {node: '>=14', npm: '>=6.12.0'} 985 | dependencies: 986 | web3-core: 4.3.2 987 | web3-eth: 4.3.1(typescript@5.3.3) 988 | web3-rpc-methods: 1.1.4 989 | web3-types: 1.3.1 990 | web3-utils: 4.1.0 991 | web3-validator: 2.0.3 992 | transitivePeerDependencies: 993 | - bufferutil 994 | - encoding 995 | - typescript 996 | - utf-8-validate 997 | - zod 998 | dev: false 999 | 1000 | /web3-eth@4.3.1(typescript@5.3.3): 1001 | resolution: {integrity: sha512-zJir3GOXooHQT85JB8SrufE+Voo5TtXdjhf1D8IGXmxM8MrhI8AT+Pgt4siBTupJcu5hF17iGmTP/Nj2XnaibQ==} 1002 | engines: {node: '>=14', npm: '>=6.12.0'} 1003 | dependencies: 1004 | setimmediate: 1.0.5 1005 | web3-core: 4.3.2 1006 | web3-errors: 1.1.4 1007 | web3-eth-abi: 4.1.4(typescript@5.3.3) 1008 | web3-eth-accounts: 4.1.0 1009 | web3-net: 4.0.7 1010 | web3-providers-ws: 4.0.7 1011 | web3-rpc-methods: 1.1.4 1012 | web3-types: 1.3.1 1013 | web3-utils: 4.1.0 1014 | web3-validator: 2.0.3 1015 | transitivePeerDependencies: 1016 | - bufferutil 1017 | - encoding 1018 | - typescript 1019 | - utf-8-validate 1020 | - zod 1021 | dev: false 1022 | 1023 | /web3-net@4.0.7: 1024 | resolution: {integrity: sha512-SzEaXFrBjY25iQGk5myaOfO9ZyfTwQEa4l4Ps4HDNVMibgZji3WPzpjq8zomVHMwi8bRp6VV7YS71eEsX7zLow==} 1025 | engines: {node: '>=14', npm: '>=6.12.0'} 1026 | dependencies: 1027 | web3-core: 4.3.2 1028 | web3-rpc-methods: 1.1.4 1029 | web3-types: 1.3.1 1030 | web3-utils: 4.1.0 1031 | transitivePeerDependencies: 1032 | - bufferutil 1033 | - encoding 1034 | - utf-8-validate 1035 | dev: false 1036 | 1037 | /web3-providers-http@4.1.0: 1038 | resolution: {integrity: sha512-6qRUGAhJfVQM41E5t+re5IHYmb5hSaLc02BE2MaRQsz2xKA6RjmHpOA5h/+ojJxEpI9NI2CrfDKOAgtJfoUJQg==} 1039 | engines: {node: '>=14', npm: '>=6.12.0'} 1040 | dependencies: 1041 | cross-fetch: 4.0.0 1042 | web3-errors: 1.1.4 1043 | web3-types: 1.3.1 1044 | web3-utils: 4.1.0 1045 | transitivePeerDependencies: 1046 | - encoding 1047 | dev: false 1048 | 1049 | /web3-providers-ipc@4.0.7: 1050 | resolution: {integrity: sha512-YbNqY4zUvIaK2MHr1lQFE53/8t/ejHtJchrWn9zVbFMGXlTsOAbNoIoZWROrg1v+hCBvT2c9z8xt7e/+uz5p1g==} 1051 | engines: {node: '>=14', npm: '>=6.12.0'} 1052 | requiresBuild: true 1053 | dependencies: 1054 | web3-errors: 1.1.4 1055 | web3-types: 1.3.1 1056 | web3-utils: 4.1.0 1057 | dev: false 1058 | optional: true 1059 | 1060 | /web3-providers-ws@4.0.7: 1061 | resolution: {integrity: sha512-n4Dal9/rQWjS7d6LjyEPM2R458V8blRm0eLJupDEJOOIBhGYlxw5/4FthZZ/cqB7y/sLVi7K09DdYx2MeRtU5w==} 1062 | engines: {node: '>=14', npm: '>=6.12.0'} 1063 | dependencies: 1064 | '@types/ws': 8.5.3 1065 | isomorphic-ws: 5.0.0(ws@8.16.0) 1066 | web3-errors: 1.1.4 1067 | web3-types: 1.3.1 1068 | web3-utils: 4.1.0 1069 | ws: 8.16.0 1070 | transitivePeerDependencies: 1071 | - bufferutil 1072 | - utf-8-validate 1073 | dev: false 1074 | 1075 | /web3-rpc-methods@1.1.4: 1076 | resolution: {integrity: sha512-LTFNg4LFaeU8K9ecuT8fHDp/LOXyxCneeZjCrRYIW1u82Ly52SrY55FIzMIISGoG/iT5Wh7UiHOB3CQsWLBmbQ==} 1077 | engines: {node: '>=14', npm: '>=6.12.0'} 1078 | dependencies: 1079 | web3-core: 4.3.2 1080 | web3-types: 1.3.1 1081 | web3-validator: 2.0.3 1082 | transitivePeerDependencies: 1083 | - bufferutil 1084 | - encoding 1085 | - utf-8-validate 1086 | dev: false 1087 | 1088 | /web3-types@1.3.1: 1089 | resolution: {integrity: sha512-8fXi7h/t95VKRtgU4sxprLPZpsTh3jYDfSghshIDBgUD/OoGe5S+syP24SUzBZYllZ/L+hMr2gdp/0bGJa8pYQ==} 1090 | engines: {node: '>=14', npm: '>=6.12.0'} 1091 | dev: false 1092 | 1093 | /web3-utils@4.1.0: 1094 | resolution: {integrity: sha512-+VJWR6FtCsgwuJr5tvSvQlSEG06586df8h2CxGc9tcNtIDyJKNkSDDWJkdNPvyDhhXFzQYFh8QOGymD1CIP6fw==} 1095 | engines: {node: '>=14', npm: '>=6.12.0'} 1096 | dependencies: 1097 | ethereum-cryptography: 2.1.2 1098 | web3-errors: 1.1.4 1099 | web3-types: 1.3.1 1100 | web3-validator: 2.0.3 1101 | dev: false 1102 | 1103 | /web3-validator@2.0.3: 1104 | resolution: {integrity: sha512-fJbAQh+9LSNWy+l5Ze6HABreml8fra98o5+vS073T35jUcLbRZ0IOjF/ZPJhJNbJDt+jP1vseZsc3z3uX9mxxQ==} 1105 | engines: {node: '>=14', npm: '>=6.12.0'} 1106 | dependencies: 1107 | ethereum-cryptography: 2.1.2 1108 | util: 0.12.5 1109 | web3-errors: 1.1.4 1110 | web3-types: 1.3.1 1111 | zod: 3.22.4 1112 | dev: false 1113 | 1114 | /web3@4.3.0(typescript@5.3.3): 1115 | resolution: {integrity: sha512-YiLCsb5wmgJlSxRLzt7Z7H+CmlVVIKD8VaUQaZ+xKVG3Q7CpsO5Z6jmeKnlr6M9c6fDDsDnRM6G8g+nchZehbA==} 1116 | engines: {node: '>=14.0.0', npm: '>=6.12.0'} 1117 | dependencies: 1118 | web3-core: 4.3.2 1119 | web3-errors: 1.1.4 1120 | web3-eth: 4.3.1(typescript@5.3.3) 1121 | web3-eth-abi: 4.1.4(typescript@5.3.3) 1122 | web3-eth-accounts: 4.1.0 1123 | web3-eth-contract: 4.1.4(typescript@5.3.3) 1124 | web3-eth-ens: 4.0.8(typescript@5.3.3) 1125 | web3-eth-iban: 4.0.7 1126 | web3-eth-personal: 4.0.8(typescript@5.3.3) 1127 | web3-net: 4.0.7 1128 | web3-providers-http: 4.1.0 1129 | web3-providers-ws: 4.0.7 1130 | web3-rpc-methods: 1.1.4 1131 | web3-types: 1.3.1 1132 | web3-utils: 4.1.0 1133 | web3-validator: 2.0.3 1134 | transitivePeerDependencies: 1135 | - bufferutil 1136 | - encoding 1137 | - typescript 1138 | - utf-8-validate 1139 | - zod 1140 | dev: false 1141 | 1142 | /webidl-conversions@3.0.1: 1143 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 1144 | dev: false 1145 | 1146 | /whatwg-url@5.0.0: 1147 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 1148 | dependencies: 1149 | tr46: 0.0.3 1150 | webidl-conversions: 3.0.1 1151 | dev: false 1152 | 1153 | /which-typed-array@1.1.13: 1154 | resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} 1155 | engines: {node: '>= 0.4'} 1156 | dependencies: 1157 | available-typed-arrays: 1.0.5 1158 | call-bind: 1.0.5 1159 | for-each: 0.3.3 1160 | gopd: 1.0.1 1161 | has-tostringtag: 1.0.0 1162 | dev: false 1163 | 1164 | /winston-transport@4.6.0: 1165 | resolution: {integrity: sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==} 1166 | engines: {node: '>= 12.0.0'} 1167 | dependencies: 1168 | logform: 2.6.0 1169 | readable-stream: 3.6.2 1170 | triple-beam: 1.4.1 1171 | dev: false 1172 | 1173 | /winston@3.11.0: 1174 | resolution: {integrity: sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==} 1175 | engines: {node: '>= 12.0.0'} 1176 | dependencies: 1177 | '@colors/colors': 1.6.0 1178 | '@dabh/diagnostics': 2.0.3 1179 | async: 3.2.5 1180 | is-stream: 2.0.1 1181 | logform: 2.6.0 1182 | one-time: 1.0.0 1183 | readable-stream: 3.6.2 1184 | safe-stable-stringify: 2.4.3 1185 | stack-trace: 0.0.10 1186 | triple-beam: 1.4.1 1187 | winston-transport: 4.6.0 1188 | dev: false 1189 | 1190 | /ws@8.16.0: 1191 | resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} 1192 | engines: {node: '>=10.0.0'} 1193 | peerDependencies: 1194 | bufferutil: ^4.0.1 1195 | utf-8-validate: '>=5.0.2' 1196 | peerDependenciesMeta: 1197 | bufferutil: 1198 | optional: true 1199 | utf-8-validate: 1200 | optional: true 1201 | dev: false 1202 | 1203 | /yn@3.1.1: 1204 | resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} 1205 | engines: {node: '>=6'} 1206 | dev: true 1207 | 1208 | /zod@3.22.4: 1209 | resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} 1210 | dev: false 1211 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | 2 | ## 这是干嘛的? 3 | 4 | 懂的都懂。 5 | 6 | ![/docs/sample.jpg](/docs/sample.jpg) 7 | 8 | ## 怎么用? 9 | 10 | 把 `.env.example`改成`.env`,然后里面填上你的私钥和公钥,以及你电脑的cpu个数就可以了。 11 | 本项目完全开源,私钥安全自行保证。 12 | 13 | ```shell 14 | pnpm install 15 | pnpm start 16 | ``` 17 | 18 | ## node.js 会不会很慢? 19 | 事实上不会,因为关键代码是使用的 `wasm`,是由`c`语言编译而来。 20 | 21 | ## 原理 22 | 23 | **仅供技术交流,普通用户看不懂也没关系** 24 | 25 | 首先,我的看法是这个noss是非去中心化的,因为它本质上是基于nostr协议,是一个relay server,而relay server并不是去中心化的。 26 | 换言之,这个noss本质上就是可以被随意更改的。 27 | 它首先会获取eth链上最新的block,然后将这个block的hash作为自己的`seq_witness`,在这里和eth链上关联,但这种关联是单向的。 28 | 本质上,它是在模仿一种链,即每个event都要和上一个event关联,以此实现另类的`block chain`。但问题是,目前可能用户(韭菜)们并没有留存这个 event chain的意识,或者说官方并没有提供一个很好的途径来实现它。 29 | 目前来看,这些event目前存储在其中心化的服务器上,一旦其服务器崩溃或下线,这些数据自然会灰飞烟灭。 30 | 31 | 电脑之所以嗡嗡响,并非是该项目骗算力或者挖矿的,本质上是 `nostr`协议的`nip13`提案,[https://github.com/nostr-protocol/nips/blob/master/13.md](https://github.com/nostr-protocol/nips/blob/master/13.md), 这个`nip13`最初的设计是用来防止发垃圾消息的。(众所周知,nostr最初是用来做区块链社交的),它用来防止垃圾消息的思路也非常清奇,叫`Pow(Proof of Work)`,简单点来说,就是用算力来证明自己不是一个垃圾信息制造者。。。。 32 | 我非常不理解,这有什么用,好吧,可能能给发垃圾信息的人造成更多的电力浪费吧。 33 | 这个`nip13`本身十分简单,就是算一下event id的二进制的前面有多少个0,这个算法非常简单,基本上就是进制转换就行。但是,event_id是hash出来的,这个hash比较占用资源,如果要求的0的数量很多,就会导致需要计算很多次 event_id,这个要求0的数量就是`difficulty`, 本例中,其固定为21。 34 | 因此,优化这个hash算法,就是提升解题速度的关键,本项目中,使用了wasm的`libsecp256k1`用来进行hash运算。 35 | 36 | 算出来验证码后(即nonce),再对event进行最后的sig进行签名,然后就可以发送到 noscription进行 mint了。 37 | 38 | ## 怎么才算中奖 39 | 40 | 至于怎么才算mint成功?按照项目方文档的说法是 41 | ![/docs/how.png](/docs/how.png) 42 | 简单点来是 43 | 44 | 1. 在下一个eth block出来的时候,取出所有event中seq_witness中的block hash和id为上一个eth block的event。 45 | __也就是说网速太慢当下一个eth 区块已经出来,而你还没有求解完成并且提交成功的话,你永远不会中奖__ 46 | 47 | 2. 取出所有的event,按event.id 从小到大排序,注意event id和提交事件无关,event id是hash的结果。 48 | 49 | 3. 依次将所有的event id 进行异或(XOR)操作(上过大学学C语言应该能看明白),然后再异或上当前的block hash(对于该event来说,算是下一个区块),然后再取余(MOD)所有的事件数量。得出一个余数, 50 | 51 | 4. 用这个余数当下标,取出对应的event。该event中的pubkey就是中奖的人。 52 | 53 | 因此,按照其说法,这就是完全的抽奖。 54 | 55 | ## 质疑 56 | 57 | 因为上面的一部分解释,被韭菜们骂了一天了。。。 58 | 59 | 而且官方下场,也承认自己是中心化的了,但是韭菜们现在的逻辑竟然和官方站在一起了,反倒是给我取了个很搞笑的*科学家*的称号,彷佛科学家才是他们的敌人, 60 | 这真是*民不患寡而患不均*呀,首先我如果和韭菜是对立的,想靠这个赚钱,那还开源干嘛,关起门来自己爽多好。 61 | 事实上,我除了测试代码,根本没挖。原因我上面也说了,这个项目本身就是中心化的。 62 | 63 | 但是我得澄清下,虽然是中心化的,但是这个项目也不一定是个骗局,也许只是项目方没有做好。 64 | 从技术上来讲, event chain是可以被追溯,可以防止篡改的。前期是项目方公开所有的event,并且允许韭菜们随时同步。 65 | 而且,不仅要公开所有的event chain,也要公开所有不在chain中,即没有中将的韭菜们提交event的,以供社区验算中奖结果。(按照上文提到的算法) 66 | 67 | 我相信这也是他们正在努力的方向,但至少目前,他们还没有做到,而且里这一步还很远。。 68 | 69 | 希望韭菜们别再骂我了,我不喜欢中心化的东西。所以不会是你们的竞争对手。 70 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import * as bip39 from 'bip39' 2 | import {type Event, nip13} from 'nostr-tools' 3 | import {initNostrWasm} from 'nostr-wasm-ng' 4 | import Web3 from 'web3' 5 | import Ws from 'ws' 6 | import winston from 'winston' 7 | import {sleep} from "./util.js"; 8 | import {startWorkers} from "./worker.js"; 9 | import 'dotenv/config' 10 | 11 | const myFormat = winston.format.printf((rr) => { 12 | const {level, message, label, ms} = rr; 13 | // console.log(rr) 14 | return `[${ms} ${level}]: ${message}`; 15 | }); 16 | 17 | 18 | const logger = winston.createLogger({ 19 | level: 'debug', 20 | format: winston.format.combine( 21 | // winston.format.simple(), 22 | winston.format.splat(), 23 | winston.format.colorize(), 24 | winston.format.ms(), 25 | myFormat, 26 | ), 27 | // defaultMeta: {service: 'noss'}, 28 | transports: [ 29 | // 30 | // - Write all logs with importance level of `error` or less to `error.log` 31 | // - Write all logs with importance level of `info` or less to `combined.log` 32 | // 33 | // new winston.transports.File({ filename: 'error.log', level: 'error' }), 34 | // new winston.transports.File({ filename: 'combined.log' }), 35 | 36 | new winston.transports.Console() 37 | ], 38 | }); 39 | 40 | async function main() { 41 | // const a = 'affair short gallery tone much fish error anger clarify strike violin brown' 42 | // // 43 | // if (!bip39.validateMnemonic(a)) { 44 | // throw new Error('Key Error') 45 | // } 46 | 47 | logger.info('started !') 48 | const {generateSecretKey, getPublicKey, verifyEvent, finalizeEvent} = await initNostrWasm(); 49 | let lastEventId = undefined; 50 | const ws = new Ws('wss://report-worker-2.noscription.org/') 51 | ws.onopen = () => { 52 | // ws.send('Message From Client') 53 | logger.info('ws connected') 54 | } 55 | ws.onerror = (error) => { 56 | console.log(`WebSocket error: ${error.message}`) 57 | } 58 | 59 | ws.onmessage = (e) => { 60 | const {eventId, seqWitness: s} = JSON.parse(e.data as string) 61 | lastEventId = eventId; 62 | // console.log('newest event id:' + lastEventId) 63 | } 64 | const privateKey = Buffer.from(process.env.PRIVATE_KEY as string, 'hex') 65 | const publicKeyStr = process.env.PUBLIC_KEY as string; 66 | 67 | // 获取最新的区块. 68 | let startTime = Date.now() 69 | let blockNum = BigInt(0); 70 | const endpoints = ["https://rpc.ankr.com/arbitrum", "https://arbitrum.blockpi.network/v1/rpc/public", "https://arb1.arbitrum.io/rpc", "https://1rpc.io/arb", "https://arbitrum.llamarpc.com", "https://arb-pokt.nodies.app", "https://arbitrum-one.public.blastapi.io", "https://arb-mainnet-public.unifra.io", "https://arbitrum.api.onfinality.io/public", "https://arbitrum-one.publicnode.com", "https://arbitrum.meowrpc.com", "https://arbitrum.drpc.org"] 71 | let tagSeqWitness: string[] = [] 72 | while (true) { 73 | try { 74 | if (!lastEventId) { 75 | await sleep(500) 76 | continue; 77 | } 78 | const web3 = new Web3(endpoints[Math.floor(Math.random() * endpoints.length)]); 79 | if (blockNum === BigInt(0) || Date.now() - startTime > 1000 * 60) { 80 | blockNum = await web3.eth.getBlockNumber(); 81 | startTime = Date.now(); 82 | } 83 | const newBlockNumber = Number(blockNum) + Math.floor((Date.now() - startTime) / 1e3 * 4) 84 | // 此后呢,我们自动累加区块,然后获取区块详情. 85 | const block = await web3.eth.getBlock(newBlockNumber) 86 | if (block) { 87 | // const timepassed = BigInt(Math.floor(Date.now() / 1000)) - block.timestamp 88 | // 成功找到区块. 89 | tagSeqWitness = ["seq_witness", newBlockNumber.toString(), block.hash!] 90 | // 更新见证者成功. 91 | } else { 92 | // 寻找区块失败. 93 | logger.error('寻找区块失败.') 94 | await sleep(1000) 95 | continue; 96 | } 97 | 98 | const event: any = { 99 | "kind": 1, 100 | // "created_at": 1704363094, 101 | "tags": [["p", "9be107b0d7218c67b4954ee3e6bd9e4dba06ef937a93f684e42f730a0c3d053c"], 102 | ["e", "51ed7939a984edee863bfbb2e66fdc80436b000a8ddca442d83e6a2bf1636a95", "wss://relay.noscription.org/", "root"], 103 | ["e", lastEventId, "wss://relay.noscription.org/", "reply"], 104 | tagSeqWitness, 105 | ], 106 | // ["nonce", "0ypzk4h9uu3", "21"]], 107 | "content": "{\"p\":\"nrc-20\",\"op\":\"mint\",\"tick\":\"noss\",\"amt\":\"10\"}", 108 | "pubkey": publicKeyStr 109 | } 110 | logger.log('info', '获取区块完成,开始求解...hash:%s,block:%s', block.hash, block.number) 111 | const timer1 = Date.now(); 112 | const eventWithNip13 = await startWorkers( 113 | event, 114 | 21, 115 | privateKey 116 | ) as Event 117 | logger.log('info', '计算hash完成,用时%s ms', Date.now() - timer1) 118 | // 由于刚算完 event_id, 这里没必要再重新计算,跳过hash,优化速度 119 | finalizeEvent(eventWithNip13, privateKey, undefined, true) 120 | // console.log(eventWithNip13) 121 | // verifyEvent(eventWithNip13) 122 | // post 123 | logger.info('求解成功...,准备提交') 124 | const result = await fetch("https://api-worker.noscription.org/inscribe/postEvent", { 125 | "headers": { 126 | "accept": "application/json, text/plain, */*", 127 | "accept-language": "zh-CN,zh;q=0.9", 128 | "content-type": "application/json", 129 | "sec-ch-ua": "\"Not_A Brand\";v=\"8\", \"Chromium\";v=\"120\", \"Google Chrome\";v=\"120\"", 130 | "sec-ch-ua-mobile": "?0", 131 | "sec-ch-ua-platform": "\"Windows\"", 132 | "sec-fetch-dest": "empty", 133 | "sec-fetch-mode": "cors", 134 | "sec-fetch-site": "same-site", 135 | // "x-gorgon": "16327071665c8d11dbbf1d09537273c029c5d0e144d4c554bf49eb22dd2d0bfe", 136 | "Referer": "https://noscription.org/", 137 | "Referrer-Policy": "strict-origin-when-cross-origin" 138 | }, 139 | "body": JSON.stringify(eventWithNip13), 140 | "method": "POST" 141 | }); 142 | console.log(await result.json()) 143 | } catch (e) { 144 | logger.error('胜败乃兵家常事:' + e) 145 | } 146 | } 147 | // 最终事件也是ok的. 148 | // console.log(verifyEvent(finalEvent)) 149 | } 150 | 151 | main() 152 | -------------------------------------------------------------------------------- /src/util.ts: -------------------------------------------------------------------------------- 1 | export function sleep(ms: number) { 2 | return new Promise(r => setTimeout(r, ms)) 3 | } 4 | -------------------------------------------------------------------------------- /src/worker.ts: -------------------------------------------------------------------------------- 1 | import {parentPort, Worker, isMainThread, workerData} from "node:worker_threads"; 2 | import {type Event, nip13} from 'nostr-tools' 3 | import {initNostrWasm} from 'nostr-wasm-ng' 4 | import {fileURLToPath} from "node:url"; 5 | 6 | export function getPow(hex: string): number { 7 | let count = 0 8 | 9 | for (let i = 0; i < hex.length; i++) { 10 | const nibble = parseInt(hex[i], 16) 11 | if (nibble === 0) { 12 | count += 4 13 | } else { 14 | count += Math.clz32(nibble) - 28 15 | break 16 | } 17 | } 18 | 19 | return count 20 | } 21 | 22 | const cpuIntensiveFunction = async (event: Event, difficulty: number) => { 23 | const nw = await initNostrWasm() 24 | 25 | const tag = ['nonce', '', difficulty.toString()] 26 | 27 | event.tags.push(tag) 28 | 29 | while (true) { 30 | const now = Math.floor(new Date().getTime() / 1000) 31 | 32 | if (now !== event.created_at) { 33 | event.created_at = now 34 | } 35 | 36 | tag[1] = Math.random().toString(36).substring(2, 15) 37 | event.id = nw.hashEvent(event); 38 | 39 | // console.log(event.id) 40 | if (getPow(event.id) >= difficulty) { 41 | break 42 | } 43 | } 44 | parentPort?.postMessage(event) 45 | return event 46 | // 执行占用 CPU 的操作 47 | // ... 48 | 49 | // 返回结果 50 | }; 51 | 52 | if (!isMainThread) { 53 | await cpuIntensiveFunction(workerData[0], workerData[1]) 54 | } 55 | 56 | export const startWorkers = (data: Event, difficulty: number, prk: Buffer) => new Promise((resolve, reject) => { 57 | if (isMainThread) { 58 | // 创建工作线程 59 | const cpuCount = parseInt(process.env.CPU_COUNT as string) 60 | const workers = new Array(cpuCount); 61 | for (let i = 0; i < workers.length; i++) { 62 | workers[i] = new Worker(fileURLToPath(import.meta.url), { 63 | // 传递数据 64 | workerData: [data, difficulty], 65 | // type: 'module' 66 | }); 67 | } 68 | 69 | // 监听每个工作线程的完成 70 | for (const worker of workers) { 71 | worker.on('message', (result: any) => { 72 | // 只要有一个线程得到结果,就终止所有的运行 73 | // console.log('result', result) 74 | if (result) { 75 | for (const worker of workers) { 76 | worker.terminate(); 77 | } 78 | resolve(result); 79 | } 80 | }); 81 | } 82 | } 83 | }) 84 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "module": "esnext", 5 | "lib": ["dom", "dom.iterable", "esnext"], 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "strict": true, 9 | "skipLibCheck": true, 10 | "moduleResolution": "node", 11 | }, 12 | "include": ["src/*.ts"], 13 | "exclude": ["node_modules"], 14 | "ts-node": { 15 | "experimentalSpecifierResolution": "node", 16 | "transpileOnly": true, 17 | "esm": true, 18 | } 19 | } 20 | --------------------------------------------------------------------------------