From ba8304399101ee2534bc6462f62cebff43268df8 Mon Sep 17 00:00:00 2001 From: bittoshimoto Date: Sun, 17 Aug 2025 00:00:30 +0200 Subject: [PATCH 1/2] B1T --- package-lock.json | 146 +----------------- packages/components/built/Auth.d.ts | 2 +- packages/components/built/Auth.js | 4 +- packages/components/built/common/types.d.ts | 2 +- packages/components/src/Auth.tsx | 20 ++- packages/components/src/common/types.ts | 2 +- .../node/chain-setup/B1T/mainnet/.env.example | 85 ++++++++++ .../chain-setup/B1T/mainnet/bit.conf.example | 27 ++++ .../node/chain-setup/B1T/regtest/.env.example | 86 +++++++++++ .../chain-setup/B1T/regtest/bit.conf.example | 17 ++ .../node/chain-setup/B1T/testnet/.env.example | 86 +++++++++++ .../chain-setup/B1T/testnet/bit.conf.example | 31 ++++ .../bit-mainnet/docker-compose.yml | 84 ++++++++++ .../bit-regtest/docker-compose.yml | 85 ++++++++++ .../bit-testnet/docker-compose.yml | 85 ++++++++++ packages/node/package.json | 117 +++++++------- packages/node/scripts/dev-setup.ts | 69 +++++++++ packages/node/scripts/docker-logs.sh | 65 ++++---- packages/node/scripts/down.py | 37 +++++ packages/node/scripts/test.ts | 73 +++++++++ packages/node/scripts/up.py | 49 ++++++ packages/wallet/.env.example | 11 ++ 22 files changed, 948 insertions(+), 235 deletions(-) create mode 100644 packages/node/chain-setup/B1T/mainnet/.env.example create mode 100644 packages/node/chain-setup/B1T/mainnet/bit.conf.example create mode 100644 packages/node/chain-setup/B1T/regtest/.env.example create mode 100644 packages/node/chain-setup/B1T/regtest/bit.conf.example create mode 100644 packages/node/chain-setup/B1T/testnet/.env.example create mode 100644 packages/node/chain-setup/B1T/testnet/bit.conf.example create mode 100644 packages/node/chain-setup/bit-mainnet/docker-compose.yml create mode 100644 packages/node/chain-setup/bit-regtest/docker-compose.yml create mode 100644 packages/node/chain-setup/bit-testnet/docker-compose.yml create mode 100644 packages/node/scripts/dev-setup.ts create mode 100644 packages/node/scripts/down.py create mode 100644 packages/node/scripts/test.ts create mode 100644 packages/node/scripts/up.py create mode 100644 packages/wallet/.env.example diff --git a/package-lock.json b/package-lock.json index 3934f9f01..156b2216d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,6 @@ "eslint-plugin-import": "^2.29.1", "eslint-plugin-prettier": "^5.1.3", "husky": "^9.0.11", - "parcel": "^2.15.4", "path": "^0.12.7", "ts-node": "^10.9.2", "turbo": "^2.1.3", @@ -2372,14 +2371,12 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz", "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==", - "dev": true, "license": "MIT" }, "node_modules/@lezer/lr": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", - "dev": true, "license": "MIT", "dependencies": { "@lezer/common": "^1.0.0" @@ -2419,7 +2416,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2433,7 +2429,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2447,7 +2442,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2461,7 +2455,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2475,7 +2468,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2489,7 +2481,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2500,7 +2491,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/@mischnic/json-sourcemap/-/json-sourcemap-0.1.1.tgz", "integrity": "sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==", - "dev": true, "license": "MIT", "dependencies": { "@lezer/common": "^1.0.0", @@ -2518,7 +2508,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2532,7 +2521,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2546,7 +2534,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2560,7 +2547,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2574,7 +2560,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2588,7 +2573,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3115,7 +3099,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/bundler-default/-/bundler-default-2.15.4.tgz", "integrity": "sha512-4vkaZuwGqL8L7NqEgjRznz9/QoeVKk0Z6z2nzfpdnSWA4xX3moUj+JeoqGUbyFGuPzfCma4SA4+txnQbKu0edQ==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/diagnostic": "2.15.4", @@ -3138,7 +3121,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.15.4.tgz", "integrity": "sha512-x/QgMuVvXQV6uNhIF+6kz6SzhVVkwf6WPSVG/xQvGMEiBabForDVYIhIEuN3RzUXCU352CGM6d8TtLLg61W1fw==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/fs": "2.15.4", @@ -3161,7 +3143,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.15.4.tgz", "integrity": "sha512-ErAPEQaJIpB+ocNZ3rl8AEK6piA7JBInwZLNU0eHMthm01Ssb10JkpAadyn1w9IVfCey+kqQcEeWv47Yh6mL1Q==", - "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.1.2" @@ -3178,7 +3159,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/compressor-raw/-/compressor-raw-2.15.4.tgz", "integrity": "sha512-gECePZxVXBwyo0DYbAq4V4SimVzHaJ3p8QOgFIfOqNmlEBbhLf3QSjArFPJNKiHZaJuclh4a+IShFBN+u6tXXw==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/plugin": "2.15.4" @@ -3196,7 +3176,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/config-default/-/config-default-2.15.4.tgz", "integrity": "sha512-chUE4NpcSXpMfTcSmgl4Q78zH+ZFe0qdgZLBtF4EH2QQakW7wAXAYRxS2/P3xFkUj0/51sExhbCFWgulrlGDPw==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/bundler-default": "2.15.4", @@ -3244,7 +3223,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.15.4.tgz", "integrity": "sha512-+TXxTm58lFwXXObFAEclwKX1p1AdixcD+M7T4NeFIQzQ4F20Vr+6oybCSqW1exNA3uHqVDDFLx7TT78seVjvkg==", - "dev": true, "license": "MIT", "dependencies": { "@mischnic/json-sourcemap": "^0.1.1", @@ -3285,7 +3263,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.15.4.tgz", "integrity": "sha512-8MAqefwzBKceNN3364OLm+p4HRD7AfimfFW3MntLxPB6bnelc9UBg5c9zEm34zYEctbmky8gqYgAUSDjqYC5Hw==", - "dev": true, "license": "MIT", "dependencies": { "@mischnic/json-sourcemap": "^0.1.1", @@ -3303,7 +3280,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/error-overlay/-/error-overlay-2.15.4.tgz", "integrity": "sha512-xxeaWm8fV8Z4uGy/c09mOvmFSHBOgF1gCMQwLCwZvfMLqIWkdZaUQ2cRhWZIS6pOXaRVC7YpcXzk2DOiSUNSbQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 16.0.0" @@ -3317,7 +3293,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.15.4.tgz", "integrity": "sha512-SBq4zstaFr7XQaXNaQmUuVh1swCUHrhtPCOSofvkJoQGhjsuhQlh4t0NmUikyKNdj7C1j40xCS1kGHuUO29b0g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 16.0.0" @@ -3331,7 +3306,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/feature-flags/-/feature-flags-2.15.4.tgz", "integrity": "sha512-DJqZVtbfjWJseM0gk7yyDkAuOhP7/FVwZ/YVqjozIqXBhmQm07xctiqNQyZX2vBbQsxmVbjpqyq+DOj45WPEzQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 16.0.0" @@ -3345,7 +3319,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.15.4.tgz", "integrity": "sha512-5cahD2ByQaSi+YN0aDvrMWXZvs3mP7C5ey8zcDTDn7JxJa51sMqOQcdU3VUTzQFtAPeRM2KxUkxLhBBXgQqHZA==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/feature-flags": "2.15.4", @@ -3370,7 +3343,6 @@ "version": "3.5.4", "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-3.5.4.tgz", "integrity": "sha512-uF7kyQXWK2fQZvG5eE0N3avYGLQE5Q0vyJsyypNcFW3kXNnrkZCUtbG7urmdae9mmZ2jXIVN4q4Bhd9pefGj9A==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/feature-flags": "2.15.4", @@ -3388,7 +3360,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.15.4.tgz", "integrity": "sha512-rQ7F5+FMQ7t+w5NGFRT8CWHhym0aunduufCjlafvRzUSKEN/5/nwTfCe9I5QsthGlXJWs+ZTy4zQ+wLtZQRBKQ==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/diagnostic": "2.15.4", @@ -3406,7 +3377,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.15.4.tgz", "integrity": "sha512-u5Lwcr4ZVBSLFbKYht+mJqJ3ZMXvJdmDMU5eDtrIEKPpu9LrIDdPpDEXBoyO6pDsoV/2AqyXUUMzBRyCatkkoQ==", - "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.1.2" @@ -3423,7 +3393,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/namer-default/-/namer-default-2.15.4.tgz", "integrity": "sha512-EXsoQ1S+5ZIfy8431E7F0vVS7bfH5JpZ+vFVcUpArJDkhmMG7T/eP6Kp9CXHLJmn7ki1x7iIVytrja0XXRQWBQ==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/diagnostic": "2.15.4", @@ -3443,7 +3412,6 @@ "version": "3.6.4", "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.6.4.tgz", "integrity": "sha512-g3+usMnr7pfRqbMAksOpNA7GJk7HUNW1Wxx7Shhp4w0K9JUdVrd2LRKwZxbqL7H9NqWtVvUOT9cZbMlDR6bO1w==", - "dev": true, "license": "MIT", "dependencies": { "@mischnic/json-sourcemap": "^0.1.1", @@ -3466,7 +3434,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/optimizer-css/-/optimizer-css-2.15.4.tgz", "integrity": "sha512-KQLuqwcvVFTNFtM+bzfvQivwunmhVAngmR4NiI8zQaykidYH28V8YkVAQmpbLbgoGad/UgG7grb0UshvnrQHpw==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/diagnostic": "2.15.4", @@ -3490,7 +3457,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/optimizer-html/-/optimizer-html-2.15.4.tgz", "integrity": "sha512-gBvt6RdDVMyO1Flvdtc8DxpxLgIXhaKuVXEjHdAP7sEW0SMdSd6r/tl6Plmcszig7sDwhDf6IsQOIvbzGHYZZg==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/plugin": "2.15.4", @@ -3510,7 +3476,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/optimizer-image/-/optimizer-image-2.15.4.tgz", "integrity": "sha512-M8fo7eEL6JRcmLhSX9pUUGU4MPrPrE9cMNcwIt3DQLnSvQ+sshhUDa6t9hKWeHHhs16BHvxrvksN2TIbkgHODQ==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/diagnostic": "2.15.4", @@ -3535,7 +3500,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/optimizer-svg/-/optimizer-svg-2.15.4.tgz", "integrity": "sha512-pPdjRaLPqjAEROXIHLc6JWLLki56alhuUNbalhLqBCgktZrrq2dGCjBEVgxqRczc9D+ePCX/e/xci4tC0Tkcbg==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/plugin": "2.15.4", @@ -3555,7 +3519,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/optimizer-swc/-/optimizer-swc-2.15.4.tgz", "integrity": "sha512-2m5cYESVCq6AGx252eSTArZ1Oc1Ve4GBGL7NhvgbNqOthyXlc2qAed6rCkARrBd8pfEl5+2XHeK1ijDAZdIZ/A==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/diagnostic": "2.15.4", @@ -3578,7 +3541,6 @@ "version": "1.13.3", "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.13.3.tgz", "integrity": "sha512-ZaDETVWnm6FE0fc+c2UE8MHYVS3Fe91o5vkmGfgwGXFbxYvAjKSqxM/j4cRc9T7VZNSJjriXq58XkfCp3Y6f+w==", - "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -3617,7 +3579,6 @@ "version": "0.5.17", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", - "dev": true, "license": "Apache-2.0", "optional": true, "peer": true, @@ -3629,7 +3590,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.15.4.tgz", "integrity": "sha512-KZONBcEJ24moQdrpU0zJh9CYk3KKbpB5RUM70utAORem1yQKms+0Y4YED3njq6nZzbgwUN/Csc+powUHLZStvg==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/diagnostic": "2.15.4", @@ -3657,7 +3617,6 @@ "version": "1.13.3", "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.13.3.tgz", "integrity": "sha512-ZaDETVWnm6FE0fc+c2UE8MHYVS3Fe91o5vkmGfgwGXFbxYvAjKSqxM/j4cRc9T7VZNSJjriXq58XkfCp3Y6f+w==", - "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -3696,7 +3655,6 @@ "version": "0.5.17", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", - "dev": true, "license": "Apache-2.0", "optional": true, "peer": true, @@ -3708,7 +3666,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/packager-css/-/packager-css-2.15.4.tgz", "integrity": "sha512-bzSaNf+I5lmJFu95wSG2k7pGwjCDesZsV6Y9sozIL2LoSxqvkGhm/ABXAa3Ed7dLe3tSAEBzJcyqShQgLzSzuw==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/diagnostic": "2.15.4", @@ -3731,7 +3688,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/packager-html/-/packager-html-2.15.4.tgz", "integrity": "sha512-Uayux6A2Anm66Kmq22QhD0TuVp9LiRCMuPUzBd6n4ekNlG0Lzm6K3/okMkPG65nKbNjq5qcPscFWlDxggvjt2g==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/plugin": "2.15.4", @@ -3752,7 +3708,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/packager-js/-/packager-js-2.15.4.tgz", "integrity": "sha512-96bqhs1jyd28CfWQD+Yn8rSsd1ar7voHWyBtMLimsK+bDJIzL26Z7jWyRDwXRuLErYC01EoXRIRctxtmeRVJ2Q==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/diagnostic": "2.15.4", @@ -3777,7 +3732,6 @@ "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, "license": "MIT", "dependencies": { "type-fest": "^0.20.2" @@ -3793,7 +3747,6 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" @@ -3806,7 +3759,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/packager-raw/-/packager-raw-2.15.4.tgz", "integrity": "sha512-CaSpDt5jjcO0SYCtsDhw6yfTDQuDFQ875H42W/ftvSQL7RfLRljPthnbdcy9chvKBbvRBQF+0z8Sxwehrd5hsA==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/plugin": "2.15.4" @@ -3824,7 +3776,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/packager-svg/-/packager-svg-2.15.4.tgz", "integrity": "sha512-qHsyOgnzoA2XGMLIYUnX79XAaV327VTWQvIzju/OmOjcff4o3uiEcNL8w9k3p2w2oPXOLoQ0THMiivoUQSM8GQ==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/plugin": "2.15.4", @@ -3845,7 +3796,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/packager-wasm/-/packager-wasm-2.15.4.tgz", "integrity": "sha512-YPVij7zrBchtXr/y29P4uh3C/+19PMhhLibYF/8oMJKkFkeU3Uv00/XLm915vdBPrIPjgw0YuIfLzUKip1uGtg==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/plugin": "2.15.4" @@ -3863,7 +3813,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.15.4.tgz", "integrity": "sha512-XVehjmzk8ZDOFf/BXo26L76ZqCGNKIQcN2ngxAnq0KRY/WFanL8yLaL0qQq+c9whlu09hkGz1CuhFBLAIjJMYQ==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/types": "2.15.4" @@ -3880,7 +3829,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.15.4.tgz", "integrity": "sha512-ezVZlttUmQ1MQD5e8yVb07vSGYEFOB59Y/jaxL9mGSLZkVhMIIHe/7SuA+4qVAH8dlg6bslXRqlsunLMPEgPsg==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/diagnostic": "2.15.4", @@ -3900,7 +3848,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/reporter-cli/-/reporter-cli-2.15.4.tgz", "integrity": "sha512-us0HIwuJqpSguf+yi4n8foabVs26JGvRB/eSOf0KkRldxFciYLn4NJ8rt3Xm1zvxlDiSkD4v2n77u+ouIZ+AEQ==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/plugin": "2.15.4", @@ -3922,7 +3869,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/reporter-dev-server/-/reporter-dev-server-2.15.4.tgz", "integrity": "sha512-uCNeDyArNNXI9YThlxyTx7+5ZSxlewyUdyrLdDZCqvn8s1xNB9W8sUNVps7mJZQSc+2ZRk3wyDemURD67uJk/A==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/codeframe": "2.15.4", @@ -3943,7 +3889,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/reporter-tracer/-/reporter-tracer-2.15.4.tgz", "integrity": "sha512-9W1xsb/FtobCQ4z847nI6hFDaTZHLeThv/z05EF77R30RX2k+unG9ac5NQB1v4KLx09Bhfre32+sjYNReWxWlg==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/plugin": "2.15.4", @@ -3964,7 +3909,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/resolver-default/-/resolver-default-2.15.4.tgz", "integrity": "sha512-4uKo3FFnubtIc4rM9jZiQQXpa1slawyRy5btJEfTFvbcnz0dm3WThLrsPDMfmPwNr9F/n5x8yzDLI6/fZ/elgA==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/node-resolver-core": "3.6.4", @@ -3983,7 +3927,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.15.4.tgz", "integrity": "sha512-KRGzbxDUOQUkrJKxxY0WyU7oVaa9TvWTRlpuGJXzQJs/hw8vkAAoAm8+ptpypvBC8LnxFHzGbSyHPfL8C8MQOw==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/plugin": "2.15.4", @@ -4002,7 +3945,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/runtime-js/-/runtime-js-2.15.4.tgz", "integrity": "sha512-zNRK+693CMkYiA0ckjPOmz+JVHD9bVzp27itcMyuDH6l/Or8m09RgCC4DIdIxBqiplsDSe39DwEc5X7b0vvcjw==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/diagnostic": "2.15.4", @@ -4023,7 +3965,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/runtime-rsc/-/runtime-rsc-2.15.4.tgz", "integrity": "sha512-yHc4HEwzCQYLqa6Q1WtZ8xJeaDAk0p2i0b3ABq2I+izmRjer4jertlsEwh9mf9Z1eUGtJobdGYzl8Ai1VfhC3g==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/plugin": "2.15.4", @@ -4044,7 +3985,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/runtime-service-worker/-/runtime-service-worker-2.15.4.tgz", "integrity": "sha512-NGq/wS34GIVzo2ZURBjCqgHV+PU7eTcngCzmmk/wrCEeWnr13ld+CAIxVZoqyNJwYsF6VQanrjSM2/LhCXEdyA==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/plugin": "2.15.4", @@ -4064,7 +4004,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.15.4.tgz", "integrity": "sha512-OxOux8z8YEYg23+15uMmYaloFp3x1RwcliBay6HqxUW7RTmtI1/z+xd8AtienCckACD60gvDGy04LjgbEGdJVg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 16.0.0" @@ -4099,7 +4038,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4120,7 +4058,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4141,7 +4078,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4162,7 +4098,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4183,7 +4118,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4204,7 +4138,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4225,7 +4158,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4246,7 +4178,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4264,7 +4195,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/@parcel/source-map/-/source-map-2.1.1.tgz", "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==", - "dev": true, "license": "MIT", "dependencies": { "detect-libc": "^1.0.3" @@ -4277,7 +4207,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, "license": "Apache-2.0", "bin": { "detect-libc": "bin/detect-libc.js" @@ -4290,7 +4219,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/transformer-babel/-/transformer-babel-2.15.4.tgz", "integrity": "sha512-rb4nqZcTLkLD3nvuYJ9wwNb8x6cajBK2l6csdYMLEI4516SkIzkO/gs2cZ9M5q+CMhxAqpdEnrwektbOtQQasg==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/diagnostic": "2.15.4", @@ -4315,7 +4243,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/transformer-css/-/transformer-css-2.15.4.tgz", "integrity": "sha512-6tVwSJsOssXgcB5XMAQGsexAffoBEi8GVql3YQqzI1EwVYs9zr+B5mfbesb4aWcegR02w99NHJYFP9CrOr3SWw==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/diagnostic": "2.15.4", @@ -4339,7 +4266,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/transformer-html/-/transformer-html-2.15.4.tgz", "integrity": "sha512-gzYPbbyEuV8nzPojw86eD5Kf93AYUWcY8lu33gu0XHROJH7mq5MAwPwtb/U+EfpeCd0/oKbLzA2mkQksM1NncQ==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/diagnostic": "2.15.4", @@ -4359,7 +4285,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/transformer-image/-/transformer-image-2.15.4.tgz", "integrity": "sha512-KOVwj2gKjUybuzHwarC/YVqRf3r2BD4/2ysckozj6DIji/bq3fd2rE9yqxWXO+zt918PsOSTzMKwRnaseaXLKQ==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/plugin": "2.15.4", @@ -4379,7 +4304,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/transformer-js/-/transformer-js-2.15.4.tgz", "integrity": "sha512-HX76PalPjqCLmXJnuSeMr2km8WlnUsW8oaRZ6FuZtSo9QD8BqIcwKGxSbIy9JHkObBgmrMOVpGtYrJM4/BlYbg==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/diagnostic": "2.15.4", @@ -4410,7 +4334,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/transformer-json/-/transformer-json-2.15.4.tgz", "integrity": "sha512-1ASeOSH3gPeaXyy/TZ7ce2TOfJ3ZeK5SBnDs+MM8LFcQsTwdRJKjX/4Qq9RgtMRryYAGHgMa09Gvp9FuFRyd+w==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/plugin": "2.15.4", @@ -4429,7 +4352,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/transformer-node/-/transformer-node-2.15.4.tgz", "integrity": "sha512-zV5jvZA971eQMcFtaWZkW1UfAH/G6XVM/87oJ2B4ip9o9aKUWIl296rrfg2xWxUQyPhy11B17CJ6b8NgieqqrQ==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/plugin": "2.15.4" @@ -4447,7 +4369,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/transformer-postcss/-/transformer-postcss-2.15.4.tgz", "integrity": "sha512-cNueSpOj3ulmMX85xr9clh/t0+mzVE+Q3H7Cf/OammqUkG/xjmilq4q7ZTgQFyUtUdWpE9LWWHojbJuz6k2Ulw==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/diagnostic": "2.15.4", @@ -4472,7 +4393,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/transformer-posthtml/-/transformer-posthtml-2.15.4.tgz", "integrity": "sha512-dETI+CeKMwu5Dpvu8BrQtex6nwzbNWKQkXseiM5x6+Wf3j9RD2NVpAMBRMjLkw1XlC9Whz1egxLSgKlMKbjg0w==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/plugin": "2.15.4", @@ -4491,7 +4411,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/transformer-raw/-/transformer-raw-2.15.4.tgz", "integrity": "sha512-pY2j09UCW2v1fwQtVLlCztSdPOxhq0YcWmTHCk/mRp8zuUR+eyHgsz48FrUxRF7cr/EBjc0zlFcregRMRcaTMg==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/plugin": "2.15.4" @@ -4509,7 +4428,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.15.4.tgz", "integrity": "sha512-MgoQrV8+BVjrczAns5ZZbTERGB3/U4MaCBmbg3CuiTiIyS8IJQnGi+OhYRdKAB4NlsgpMZ5T2JrRbQUIm9MM8Q==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/error-overlay": "2.15.4", @@ -4530,7 +4448,6 @@ "version": "0.16.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.16.0.tgz", "integrity": "sha512-FPvF2XxTSikpJxcr+bHut2H4gJ17+18Uy20D5/F+SKzFap62R3cM5wH6b8WN3LyGSYeQilLEcJcR1fjBSI2S1A==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -4540,7 +4457,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/transformer-svg/-/transformer-svg-2.15.4.tgz", "integrity": "sha512-Q22e0VRbx62VXFlvJWIlc8ihlLaPQgtnAZz5E1/+ojiNb+k0PmIRjNJclVWPF6IdCsLO5tnGfUOaXe2OnZz28Q==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/diagnostic": "2.15.4", @@ -4560,7 +4476,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.15.4.tgz", "integrity": "sha512-fS3UMMinLtzn/NTSx/qx38saBgRniylldh0XZEUcGeME4D2Llu/QlLv+YZ/LJqrFci3fPRM+YAn2K+JT/u+/0w==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/types-internal": "2.15.4", @@ -4571,7 +4486,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/types-internal/-/types-internal-2.15.4.tgz", "integrity": "sha512-kl5QEZ8PTWRvMkwmk7IG3VpP/5/MSGwt9Nrj9ctXLdZkDdXZpK7IbXAthLQ4zrByMaqZULL2IyDuBqBgfuAqlQ==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/diagnostic": "2.15.4", @@ -4584,7 +4498,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.15.4.tgz", "integrity": "sha512-29m09sfPx0GHnmy1kkZ5XezprepdFGKKKUEJkyiYA4ERf55jjdnU2/GP4sWlZXxjh2Y+JFoCAFlCamEClq/8eA==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/codeframe": "2.15.4", @@ -4608,7 +4521,6 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", - "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -4647,7 +4559,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4668,7 +4579,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4689,7 +4599,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4710,7 +4619,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4731,7 +4639,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4752,7 +4659,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4773,7 +4679,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4794,7 +4699,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4815,7 +4719,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4836,7 +4739,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4857,7 +4759,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4878,7 +4779,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4899,7 +4799,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4917,7 +4816,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, "license": "Apache-2.0", "bin": { "detect-libc": "bin/detect-libc.js" @@ -4930,7 +4828,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.15.4.tgz", "integrity": "sha512-wZ/5/mfjs5aeqhXY0c6fwuaBFeNpOXoOq2CKPSMDXt+GX2u/9/1bpVxN9XeGTAJO+ZD++CLq0hyzTnIHy58nyw==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/diagnostic": "2.15.4", @@ -5741,7 +5638,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -5758,7 +5654,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -5775,7 +5670,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -5792,7 +5686,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -5809,7 +5702,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -5826,7 +5718,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -5843,7 +5734,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -5860,7 +5750,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -5877,7 +5766,6 @@ "cpu": [ "ia32" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -5894,7 +5782,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0 AND MIT", "optional": true, "os": [ @@ -5923,7 +5810,6 @@ "version": "0.1.24", "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.24.tgz", "integrity": "sha512-tjTMh3V4vAORHtdTprLlfoMptu1WfTZG9Rsca6yOKyNYsRr+MUXutKmliB17orgSZk5DpnDxs8GUdd/qwYxOng==", - "dev": true, "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3" @@ -9213,7 +9099,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0" @@ -9307,7 +9192,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.8" @@ -9437,7 +9321,6 @@ "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -10054,7 +9937,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "devOptional": true, "license": "Apache-2.0", "engines": { "node": ">=8" @@ -10221,7 +10103,6 @@ "version": "11.0.7", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "dotenv": "^16.4.5" @@ -12257,7 +12138,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -14212,7 +14092,6 @@ "version": "1.30.1", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", - "dev": true, "license": "MPL-2.0", "dependencies": { "detect-libc": "^2.0.3" @@ -14244,7 +14123,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -14265,7 +14143,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -14286,7 +14163,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -14307,7 +14183,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -14328,7 +14203,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -14349,7 +14223,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -14370,7 +14243,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -14391,7 +14263,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -14412,7 +14283,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -14433,7 +14303,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MPL-2.0", "optional": true, "os": [ @@ -14470,7 +14339,6 @@ "version": "2.8.5", "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.8.5.tgz", "integrity": "sha512-9bMdFfc80S+vSldBmG3HOuLVHnxRdNTlpzR6QDnzqCQtCzGUEAGTzBKYMeIM+I/sU4oZfgbcbS7X7F65/z/oxQ==", - "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -14496,7 +14364,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "dev": true, "license": "MIT" }, "node_modules/loader-runner": { @@ -15272,7 +15139,6 @@ "version": "1.11.5", "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.5.tgz", "integrity": "sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==", - "dev": true, "license": "MIT", "optionalDependencies": { "msgpackr-extract": "^3.0.2" @@ -15282,7 +15148,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -15305,7 +15170,6 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", - "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -15527,7 +15391,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz", "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==", - "dev": true, "license": "MIT", "dependencies": { "detect-libc": "^2.0.1" @@ -15893,7 +15756,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "dev": true, "license": "MIT" }, "node_modules/nwsapi": { @@ -16306,7 +16168,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.0.tgz", "integrity": "sha512-IQh2aMfMIDbPjI/8a3Edr+PiOpcsB7yo8NdW7aHWVaoR/pcDldunMvnnwbk/auPGqmKeAdxtZl7MHX/QmPwhvQ==", - "dev": true, "license": "MIT" }, "node_modules/os-browserify": { @@ -16452,7 +16313,6 @@ "version": "2.15.4", "resolved": "https://registry.npmjs.org/parcel/-/parcel-2.15.4.tgz", "integrity": "sha512-eZHQ/omuQ7yBYB9XezyzSqhc826oy/uhloCNiej1CTZ+twAqJVtp4MRvTGMcivKhE+WE8QkYD5XkJHLLQsJQcg==", - "dev": true, "license": "MIT", "dependencies": { "@parcel/config-default": "2.15.4", @@ -17138,7 +16998,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, "license": "MIT" }, "node_modules/postgres-array": { @@ -17895,7 +17754,6 @@ "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true, "license": "MIT" }, "node_modules/regexp.prototype.flags": { @@ -19794,7 +19652,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -21254,7 +21111,6 @@ "version": "3.11.0", "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 4" @@ -21952,7 +21808,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", - "dev": true, "license": "MIT" }, "node_modules/webidl-conversions": { @@ -22784,6 +22639,7 @@ "ecpair": "^2.1.0", "events": "^3.3.0", "expect": "^29.7.0", + "parcel": "^2.15.4", "path": "^0.12.7", "process": "^0.11.10", "punycode": "^2.1.1", diff --git a/packages/components/built/Auth.d.ts b/packages/components/built/Auth.d.ts index 217d626a4..1ffeda694 100644 --- a/packages/components/built/Auth.d.ts +++ b/packages/components/built/Auth.d.ts @@ -1,6 +1,6 @@ import { Computer } from '@bitcoin-computer/lib'; import type { Chain, Network, ModuleStorageType } from './common/types'; -export type TBCChain = 'LTC' | 'BTC' | 'PEPE' | 'DOGE'; +export type TBCChain = 'LTC' | 'BTC' | 'B1T' | 'PEPE' | 'DOGE'; export type TBCNetwork = 'testnet' | 'mainnet' | 'regtest'; export type AddressType = 'p2pkh' | 'p2wpkh' | 'p2tr'; export type ComputerOptions = Partial<{ diff --git a/packages/components/built/Auth.js b/packages/components/built/Auth.js index ab418980b..79a3478c2 100644 --- a/packages/components/built/Auth.js +++ b/packages/components/built/Auth.js @@ -27,6 +27,8 @@ function getCoinType(chain = 'LTC', network = 'regtest') { return 2; if (chain === 'DOGE') return 3; + if (chain === 'B1T') + return 3141; if (chain === 'PEPE') return 3434; if (chain === 'BCH') @@ -64,7 +66,7 @@ function MnemonicInput({ mnemonic, setMnemonic, }) { return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex justify-between", children: [_jsx("label", { className: "block mb-2 text-sm font-medium text-gray-900 dark:text-white", children: "BIP 39 Mnemonic" }), _jsx(HiRefresh, { onClick: () => setMnemonic(new Computer().getMnemonic()), className: "w-4 h-4 ml-2 text-sm font-medium text-gray-900 dark:text-white inline cursor-pointer hover:text-slate-700 dark:hover:text-slate-100" })] }), _jsx("input", { value: mnemonic, onChange: (e) => setMnemonic(e.target.value), className: "bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-600 dark:border-gray-500 dark:placeholder-gray-400 dark:text-white", required: true })] })); } function ChainInput({ chain, setChain }) { - return (_jsxs(_Fragment, { children: [_jsx("label", { className: "block mt-4 mb-2 text-sm font-medium text-gray-900 dark:text-white", children: "Chain" }), _jsxs("fieldset", { className: "flex", children: [_jsx("legend", { className: "sr-only", children: "Chain" }), _jsxs("div", { className: "flex items-center mr-4", children: [_jsx("input", { onChange: () => setChain('LTC'), checked: chain === 'LTC', id: "chain-ltc", type: "radio", name: "chain", value: "LTC", className: "w-4 h-4 border-gray-300 focus:ring-2 focus:ring-blue-300 dark:focus:ring-blue-600 dark:focus:bg-blue-600 dark:bg-gray-700 dark:border-gray-600" }), _jsx("label", { htmlFor: "chain-ltc", className: "block ms-2 text-sm font-medium text-gray-900 dark:text-gray-300", children: "LTC" })] }), _jsxs("div", { className: "flex items-center mr-4", children: [_jsx("input", { onChange: () => setChain('BTC'), checked: chain === 'BTC', id: "chain-btc", type: "radio", name: "chain", value: "BTC", className: "w-4 h-4 border-gray-300 focus:ring-2 focus:ring-blue-300 dark:focus:ring-blue-600 dark:focus:bg-blue-600 dark:bg-gray-700 dark:border-gray-600" }), _jsx("label", { htmlFor: "chain-btc", className: "block ms-2 text-sm font-medium text-gray-900 dark:text-gray-300", children: "BTC" })] }), _jsxs("div", { className: "flex items-center mr-4", children: [_jsx("input", { onChange: () => setChain('PEPE'), id: "chain-pepe", type: "radio", name: "chain", value: "PEPE", className: "w-4 h-4 border-gray-200 focus:ring-2 focus:ring-blue-300 dark:focus:ring-blue-600 dark:bg-gray-700 dark:border-gray-600" }), _jsx("label", { htmlFor: "chain-pepe", className: "block ms-2 text-sm font-medium text-gray-900 dark:text-gray-300", children: "PEPE" })] }), _jsxs("div", { className: "flex items-center mr-4", children: [_jsx("input", { onChange: () => setChain('DOGE'), id: "chain-doge", type: "radio", name: "chain", value: "DOGE", className: "w-4 h-4 border-gray-200 focus:ring-2 focus:ring-blue-300 dark:focus:ring-blue-600 dark:bg-gray-700 dark:border-gray-600", disabled: true }), _jsx("label", { htmlFor: "chain-doge", className: "block ms-2 text-sm font-medium text-gray-900 dark:text-gray-300", children: "DOGE" })] })] })] })); + return (_jsxs(_Fragment, { children: [_jsx("label", { className: "block mt-4 mb-2 text-sm font-medium text-gray-900 dark:text-white", children: "Chain" }), _jsxs("fieldset", { className: "flex", children: [_jsx("legend", { className: "sr-only", children: "Chain" }), _jsxs("div", { className: "flex items-center mr-4", children: [_jsx("input", { onChange: () => setChain('LTC'), checked: chain === 'LTC', id: "chain-ltc", type: "radio", name: "chain", value: "LTC", className: "w-4 h-4 border-gray-300 focus:ring-2 focus:ring-blue-300 dark:focus:ring-blue-600 dark:focus:bg-blue-600 dark:bg-gray-700 dark:border-gray-600" }), _jsx("label", { htmlFor: "chain-ltc", className: "block ms-2 text-sm font-medium text-gray-900 dark:text-gray-300", children: "LTC" })] }), _jsxs("div", { className: "flex items-center mr-4", children: [_jsx("input", { onChange: () => setChain('BTC'), checked: chain === 'BTC', id: "chain-btc", type: "radio", name: "chain", value: "BTC", className: "w-4 h-4 border-gray-300 focus:ring-2 focus:ring-blue-300 dark:focus:ring-blue-600 dark:focus:bg-blue-600 dark:bg-gray-700 dark:border-gray-600" }), _jsx("label", { htmlFor: "chain-btc", className: "block ms-2 text-sm font-medium text-gray-900 dark:text-gray-300", children: "BTC" })] }), _jsxs("div", { className: "flex items-center mr-4", children: [_jsx("input", { onChange: () => setChain('B1T'), id: "chain-b1t", type: "radio", name: "chain", value: "B1T", className: "w-4 h-4 border-gray-200 focus:ring-2 focus:ring-blue-300 dark:focus:ring-blue-600 dark:bg-gray-700 dark:border-gray-600" }), _jsx("label", { htmlFor: "chain-b1t", className: "block ms-2 text-sm font-medium text-gray-900 dark:text-gray-300", children: "B1T" })] }), _jsxs("div", { className: "flex items-center mr-4", children: [_jsx("input", { onChange: () => setChain('PEPE'), id: "chain-pepe", type: "radio", name: "chain", value: "PEPE", className: "w-4 h-4 border-gray-200 focus:ring-2 focus:ring-blue-300 dark:focus:ring-blue-600 dark:bg-gray-700 dark:border-gray-600" }), _jsx("label", { htmlFor: "chain-pepe", className: "block ms-2 text-sm font-medium text-gray-900 dark:text-gray-300", children: "PEPE" })] }), _jsxs("div", { className: "flex items-center mr-4", children: [_jsx("input", { onChange: () => setChain('DOGE'), id: "chain-doge", type: "radio", name: "chain", value: "DOGE", className: "w-4 h-4 border-gray-200 focus:ring-2 focus:ring-blue-300 dark:focus:ring-blue-600 dark:bg-gray-700 dark:border-gray-600", disabled: true }), _jsx("label", { htmlFor: "chain-doge", className: "block ms-2 text-sm font-medium text-gray-900 dark:text-gray-300", children: "DOGE" })] })] })] })); } function NetworkInput({ network, setNetwork, }) { return (_jsxs(_Fragment, { children: [_jsx("label", { className: "block mt-4 mb-2 text-sm font-medium text-gray-900 dark:text-white", children: "Network" }), _jsxs("fieldset", { className: "flex", children: [_jsx("legend", { className: "sr-only", children: "Network" }), _jsxs("div", { className: "flex items-center mr-4", children: [_jsx("input", { onChange: () => setNetwork('mainnet'), checked: network === 'mainnet', id: "network-mainnet", type: "radio", name: "network", value: "Mainnet", className: "w-4 h-4 border-gray-300 focus:ring-2 focus:ring-blue-300 dark:focus:ring-blue-600 dark:focus:bg-blue-600 dark:bg-gray-700 dark:border-gray-600" }), _jsx("label", { htmlFor: "network-mainnet", className: "block ms-2 text-sm font-medium text-gray-900 dark:text-gray-300", children: "Mainnet" })] }), _jsxs("div", { className: "flex items-center mr-4", children: [_jsx("input", { onChange: () => setNetwork('testnet'), checked: network === 'testnet', id: "network-testnet", type: "radio", name: "network", value: "Testnet", className: "w-4 h-4 border-gray-300 focus:ring-2 focus:ring-blue-300 dark:focus:ring-blue-600 dark:focus:bg-blue-600 dark:bg-gray-700 dark:border-gray-600" }), _jsx("label", { htmlFor: "network-testnet", className: "block ms-2 text-sm font-medium text-gray-900 dark:text-gray-300", children: "Testnet" })] }), _jsxs("div", { className: "flex items-center mr-4", children: [_jsx("input", { onChange: () => setNetwork('regtest'), checked: network === 'regtest', id: "network-regtest", type: "radio", name: "network", value: "Regtest", className: "w-4 h-4 border-gray-300 focus:ring-2 focus:ring-blue-300 dark:focus:ring-blue-600 dark:focus:bg-blue-600 dark:bg-gray-700 dark:border-gray-600" }), _jsx("label", { htmlFor: "network-regtest", className: "block ms-2 text-sm font-medium text-gray-900 dark:text-gray-300", children: "Regtest" })] })] })] })); diff --git a/packages/components/built/common/types.d.ts b/packages/components/built/common/types.d.ts index 1ba18503f..d817b38b0 100644 --- a/packages/components/built/common/types.d.ts +++ b/packages/components/built/common/types.d.ts @@ -1,3 +1,3 @@ -export type Chain = 'LTC' | 'BTC' | 'DOGE' | 'PEPE'; +export type Chain = 'LTC' | 'BTC' | 'DOGE' | 'B1T' | 'PEPE'; export type Network = 'testnet' | 'mainnet' | 'regtest'; export type ModuleStorageType = 'taproot' | 'multisig'; diff --git a/packages/components/src/Auth.tsx b/packages/components/src/Auth.tsx index 5afaeefa9..0943af430 100644 --- a/packages/components/src/Auth.tsx +++ b/packages/components/src/Auth.tsx @@ -7,7 +7,7 @@ import { Modal } from './Modal' import type { Chain, Network, ModuleStorageType } from './common/types' import { getEnv } from './common/utils' -export type TBCChain = 'LTC' | 'BTC' | 'PEPE' | 'DOGE' +export type TBCChain = 'LTC' | 'BTC' | 'B1T' | 'PEPE' | 'DOGE' export type TBCNetwork = 'testnet' | 'mainnet' | 'regtest' export type AddressType = 'p2pkh' | 'p2wpkh' | 'p2tr' const pathPattern = /^(m\/)?(\d+'?\/)*\d+'?$/ @@ -45,6 +45,7 @@ function getCoinType(chain: string = 'LTC', network: string = 'regtest'): number if (chain === 'BTC') return 0 if (chain === 'LTC') return 2 if (chain === 'DOGE') return 3 + if (chain === 'B1T') return 3141 if (chain === 'PEPE') return 3434 if (chain === 'BCH') return 145 @@ -156,6 +157,23 @@ function ChainInput({ chain, setChain }: { chain: Chain | undefined; setChain: D +
+ setChain('B1T')} + id="chain-b1t" + type="radio" + name="chain" + value="B1T" + className="w-4 h-4 border-gray-200 focus:ring-2 focus:ring-blue-300 dark:focus:ring-blue-600 dark:bg-gray-700 dark:border-gray-600" + /> + +
+
setChain('PEPE')} diff --git a/packages/components/src/common/types.ts b/packages/components/src/common/types.ts index e2f7dc2d4..3b600b9a2 100644 --- a/packages/components/src/common/types.ts +++ b/packages/components/src/common/types.ts @@ -1,3 +1,3 @@ -export type Chain = 'LTC' | 'BTC' | 'DOGE' | 'PEPE' +export type Chain = 'LTC' | 'BTC' | 'DOGE' | 'B1T' | 'PEPE' export type Network = 'testnet' | 'mainnet' | 'regtest' export type ModuleStorageType = 'taproot' | 'multisig' diff --git a/packages/node/chain-setup/B1T/mainnet/.env.example b/packages/node/chain-setup/B1T/mainnet/.env.example new file mode 100644 index 000000000..cc488d6e6 --- /dev/null +++ b/packages/node/chain-setup/B1T/mainnet/.env.example @@ -0,0 +1,85 @@ +# Chain: BTC, LTC, PEPE or B1T +BCN_CHAIN='B1T' +# Network: mainnet, testnet, or regtest +BCN_NETWORK='mainnet' + +# Postgres Connection Credentials +POSTGRES_USER='bcn' +POSTGRES_PASSWORD='bcn' +POSTGRES_DB='bcn' +POSTGRES_HOST='db' +POSTGRES_PORT='5432' +POSTGRES_MAX_CONNECTIONS='20' +POSTGRES_IDLE_TIMEOUT_MILLIS='3000' + +# Bitcoin Node Settings +BITCOIN_IMAGE='b1ttoshimoto/bit-core:3.0.0' +BITCOIN_DATA_DIR='/home/bit/.bit' +BITCOIN_CONF_FILE='bit.conf' + +# Node Settings +# RPC Client Credentials +BITCOIN_RPC_USER='bcn-admin' +BITCOIN_RPC_PASSWORD='kH4nU5Okm6-uyC0_mA5ztVNacJqZbYd_KGLl6mx722A=' +BITCOIN_RPC_HOST='node' +BITCOIN_RPC_PORT='33318' # mainnet RPC +BITCOIN_P2P_PORT='33317' # mainnet P2P +BITCOIN_RPC_PROTOCOL='http' +# Default wallet name +BITCOIN_DEFAULT_WALLET='defaultwallet' + +# Port for Bitcoin Computer Node +BCN_PORT='1031' + +# Enable to launch with fixed number of parallel workers +# BCN_NUM_WORKERS='6' + +BCN_ZMQ_URL='tcp://node:28332' +BCN_ZMQ_PORT='28332' +# Height of the block at which the zmq connection should start +BCN_ZMQ_ACTIVATION_HEIGHT=50000 + + +# Url of the Bitcoin Computer Node, defaults to localhost +BCN_URL='http://127.0.0.1:1031' + +# Allowed RPC Methods +BCN_ALLOWED_RPC_METHODS='^get|^gen|^send|^lis' + +# Setup the environment to 'prod' (no console logs) or 'dev' +BCN_ENV='dev' + +# Winston Logger Settings +# Log levels +# 0: Error logs only +# 1: Error and warning logs +# 2: Error, warning and info logs +# 3: Error, warning, info and http logs +# 4: Error, warning, info, http and debug logs +BCN_LOG_LEVEL='4' +# Maximum number of logs to keep. If not set, no logs will be removed. This can be +# a number of files or number of days. If using days, add 'd' as the suffix. +BCN_LOG_MAX_FILES='14d' +# Maximum log file size. You can use 'k' for KB, 'm' for MB, and 'g' for GB. Once +# the size of the log file exceeds the specified size, the log is rotated. If no +# size is specified the log is not rotated. +BCN_LOG_MAX_SIZE='20m' +# A boolean to define whether or not to gzip archived log files. +BCN_LOG_ZIP='false' + +# Show logs at db service +BCN_SHOW_DB_LOGS='false' + +# Rate Limiting Settings +BCN_RATE_LIMIT_ENABLED='false' +BCN_RATE_LIMIT_WINDOW='900000' +BCN_RATE_LIMIT_MAX='300' +BCN_RATE_LIMIT_STANDARD_HEADERS='true' +BCN_RATE_LIMIT_LEGACY_HEADERS='false' + +# Comma separated list of banned countries, encoded as ISO-3166 alpha2 country. +# codes (see https://www.geonames.org/countries/) +BCN_BANNED_COUNTRIES= + +# Default value for protocol in the _url parameter. Set to https if behind a load balancer. +BCN_OFFCHAIN_PROTOCOL= diff --git a/packages/node/chain-setup/B1T/mainnet/bit.conf.example b/packages/node/chain-setup/B1T/mainnet/bit.conf.example new file mode 100644 index 000000000..13bc893d4 --- /dev/null +++ b/packages/node/chain-setup/B1T/mainnet/bit.conf.example @@ -0,0 +1,27 @@ +dbcache=4000 +txindex=1 +printtoconsole=1 + +# [rpc] +# Accept command line and JSON-RPC commands. +server=1 +# Username for JSON-RPC connections +rpcauth=bcn-admin:c71460f0f08e4eeec90e033c04f7bb82$c36e8561d46abbf3bf13da6b88612c19d758d46d02c45cd2716f06a13ec407af +rpcallowip=0.0.0.0/0 +rpcbind=0.0.0.0 +# Rpc work queue increase +rpcworkqueue=512 +rpcport=33318 +port=33317 + +relaypriority=false +prematurewitness=1 + +# [wallet] +wallet=defaultwallet + +printtoconsole=1 + +zmqpubhashtx=tcp://0.0.0.0:28332 +zmqpubrawtx=tcp://0.0.0.0:28332 + diff --git a/packages/node/chain-setup/B1T/regtest/.env.example b/packages/node/chain-setup/B1T/regtest/.env.example new file mode 100644 index 000000000..8c3bb5920 --- /dev/null +++ b/packages/node/chain-setup/B1T/regtest/.env.example @@ -0,0 +1,86 @@ +# Chain: BTC, LTC, PEPE or B1T +BCN_CHAIN='B1T' +# Network: mainnet, testnet, or regtest +BCN_NETWORK='regtest' + +# Postgres Connection Credentials +POSTGRES_USER='bcn' +POSTGRES_PASSWORD='bcn' +POSTGRES_DB='bcn' +POSTGRES_HOST='db' +POSTGRES_PORT='5432' +POSTGRES_MAX_CONNECTIONS='20' +POSTGRES_IDLE_TIMEOUT_MILLIS='3000' + +# Bitcoin Node Settings +BITCOIN_IMAGE='b1ttoshimoto/bit-core:3.0.0' +BITCOIN_DATA_DIR='/home/bit/.bit' +BITCOIN_CONF_FILE='bit.conf' + +# Node Settings +# RPC Client Credentials +BITCOIN_RPC_USER='bcn-admin' +BITCOIN_RPC_PASSWORD='kH4nU5Okm6-uyC0_mA5ztVNacJqZbYd_KGLl6mx722A=' +BITCOIN_RPC_HOST='node' +BITCOIN_RPC_PORT='22218' +BITCOIN_P2P_PORT='22217' +BITCOIN_RPC_PROTOCOL='http' + +# Default wallet name +BITCOIN_DEFAULT_WALLET='defaultwallet' + +# Port for Bitcoin Computer Node +BCN_PORT='1031' + +# Enable to launch with fixed number of parallel workers +# BCN_NUM_WORKERS='6' + +BCN_ZMQ_URL='tcp://node:28332' +BCN_ZMQ_PORT='28332' +# Height of the block at which the zmq connection should start +BCN_ZMQ_ACTIVATION_HEIGHT=1 + + +# Url of the Bitcoin Computer Node, defaults to localhost +BCN_URL='http://127.0.0.1:1031' + +# Allowed RPC Methods +BCN_ALLOWED_RPC_METHODS='^get|^gen|^send|^lis' + +# Setup the environment to 'prod' (no console logs) or 'dev' +BCN_ENV='dev' + +# Winston Logger Settings +# Log levels +# 0: Error logs only +# 1: Error and warning logs +# 2: Error, warning and info logs +# 3: Error, warning, info and http logs +# 4: Error, warning, info, http and debug logs +BCN_LOG_LEVEL='4' +# Maximum number of logs to keep. If not set, no logs will be removed. This can be +# a number of files or number of days. If using days, add 'd' as the suffix. +BCN_LOG_MAX_FILES='14d' +# Maximum log file size. You can use 'k' for KB, 'm' for MB, and 'g' for GB. Once +# the size of the log file exceeds the specified size, the log is rotated. If no +# size is specified the log is not rotated. +BCN_LOG_MAX_SIZE='20m' +# A boolean to define whether or not to gzip archived log files. +BCN_LOG_ZIP='false' + +# Show logs at db service +BCN_SHOW_DB_LOGS='false' + +# Rate Limiting Settings +BCN_RATE_LIMIT_ENABLED='false' +BCN_RATE_LIMIT_WINDOW='900000' +BCN_RATE_LIMIT_MAX='300' +BCN_RATE_LIMIT_STANDARD_HEADERS='true' +BCN_RATE_LIMIT_LEGACY_HEADERS='false' + +# Comma separated list of banned countries, encoded as ISO-3166 alpha2 country. +# codes (see https://www.geonames.org/countries/) +BCN_BANNED_COUNTRIES= + +# Default value for protocol in the _url parameter. Set to https if behind a load balancer. +BCN_OFFCHAIN_PROTOCOL= diff --git a/packages/node/chain-setup/B1T/regtest/bit.conf.example b/packages/node/chain-setup/B1T/regtest/bit.conf.example new file mode 100644 index 000000000..498561834 --- /dev/null +++ b/packages/node/chain-setup/B1T/regtest/bit.conf.example @@ -0,0 +1,17 @@ +printtoconsole=1 +regtest=1 + +server=1 +txindex=1 + +rpcbind=0.0.0.0 +rpcallowip=0.0.0.0/0 +rpcauth=bcn-admin:c71460f0f08e4eeec90e033c04f7bb82$c36e8561d46abbf3bf13da6b88612c19d758d46d02c45cd2716f06a13ec407af +zmqpubhashtx=tcp://0.0.0.0:28332 +zmqpubrawtx=tcp://0.0.0.0:28332 +prematurewitness=1 +relaypriority=false + +[regtest] +rpcport=22218 +port=22217 \ No newline at end of file diff --git a/packages/node/chain-setup/B1T/testnet/.env.example b/packages/node/chain-setup/B1T/testnet/.env.example new file mode 100644 index 000000000..0731eb45c --- /dev/null +++ b/packages/node/chain-setup/B1T/testnet/.env.example @@ -0,0 +1,86 @@ +# Chain: BTC, LTC, B1T or PEPE +BCN_CHAIN='B1T' +# Network: mainnet, testnet, or regtest +BCN_NETWORK='testnet' + +# Postgres Connection Credentials +POSTGRES_USER='bcn' +POSTGRES_PASSWORD='bcn' +POSTGRES_DB='bcn' +POSTGRES_HOST='db' +POSTGRES_PORT='5432' +POSTGRES_MAX_CONNECTIONS='20' +POSTGRES_IDLE_TIMEOUT_MILLIS='3000' + +# Bitcoin Node Settings +BITCOIN_IMAGE='b1ttoshimoto/bit-core:3.0.0' +BITCOIN_DATA_DIR='/home/bit/.bit' +BITCOIN_CONF_FILE='bit.conf' + +# Node Settings +# RPC Client Credentials +BITCOIN_RPC_USER='bcn-admin' +BITCOIN_RPC_PASSWORD='kH4nU5Okm6-uyC0_mA5ztVNacJqZbYd_KGLl6mx722A=' +BITCOIN_RPC_HOST='node' +BITCOIN_RPC_PORT='44418' +BITCOIN_P2P_PORT='44417' +BITCOIN_RPC_PROTOCOL='http' + +# Default wallet name +BITCOIN_DEFAULT_WALLET='defaultwallet' + +# Bitcoin Computer Node (BCN) Settings +# Port for Bitcoin Computer Node +BCN_PORT='1031' + +# Enable to launch with fixed number of parallel workers +# BCN_NUM_WORKERS='6' + +BCN_ZMQ_URL='tcp://node:28332' +BCN_ZMQ_PORT='28332' +# Height of the block at which the zmq connection should start +BCN_ZMQ_ACTIVATION_HEIGHT=50000 + +# Url of the Bitcoin Computer Node, defaults to localhost +BCN_URL='http://127.0.0.1:1031' + +# Allowed RPC Methods +BCN_ALLOWED_RPC_METHODS='^get|^gen|^send|^lis' + +# Setup the environment to 'prod' (no console logs) or 'dev' +BCN_ENV='dev' + +# Winston Logger Settings +# Log levels +# 0: Error logs only +# 1: Error and warning logs +# 2: Error, warning and info logs +# 3: Error, warning, info and http logs +# 4: Error, warning, info, http and debug logs +BCN_LOG_LEVEL='4' +# Maximum number of logs to keep. If not set, no logs will be removed. This can be +# a number of files or number of days. If using days, add 'd' as the suffix. +BCN_LOG_MAX_FILES='14d' +# Maximum log file size. You can use 'k' for KB, 'm' for MB, and 'g' for GB. Once +# the size of the log file exceeds the specified size, the log is rotated. If no +# size is specified the log is not rotated. +BCN_LOG_MAX_SIZE='20m' +# A boolean to define whether or not to gzip archived log files. +BCN_LOG_ZIP='false' + +# Show logs at db service +BCN_SHOW_DB_LOGS='false' + +# Rate Limiting Settings +BCN_RATE_LIMIT_ENABLED='false' +BCN_RATE_LIMIT_WINDOW='900000' +BCN_RATE_LIMIT_MAX='300' +BCN_RATE_LIMIT_STANDARD_HEADERS='true' +BCN_RATE_LIMIT_LEGACY_HEADERS='false' + +# Comma separated list of banned countries, encoded as ISO-3166 alpha2 country. +# codes (see https://www.geonames.org/countries/) +BCN_BANNED_COUNTRIES= + +# Default value for protocol in the _url parameter. Set to https if behind a load balancer. +BCN_OFFCHAIN_PROTOCOL= diff --git a/packages/node/chain-setup/B1T/testnet/bit.conf.example b/packages/node/chain-setup/B1T/testnet/bit.conf.example new file mode 100644 index 000000000..8854932b6 --- /dev/null +++ b/packages/node/chain-setup/B1T/testnet/bit.conf.example @@ -0,0 +1,31 @@ +testnet=1 + +printtoconsole=1 + +dbcache=4000 +txindex=1 + +# [rpc] +# Accept command line and JSON-RPC commands. +server=1 +# Username for JSON-RPC connections +rpcauth=bcn-admin:c71460f0f08e4eeec90e033c04f7bb82$c36e8561d46abbf3bf13da6b88612c19d758d46d02c45cd2716f06a13ec407af +rpcallowip=0.0.0.0/0 + +rpcbind=0.0.0.0 + +# [wallet] +wallet=defaultwallet + +zmqpubhashtx=tcp://0.0.0.0:28332 +zmqpubrawtx=tcp://0.0.0.0:28332 + +relaypriority=false +prematurewitness=1 + +# Rpc work queue increase +rpcworkqueue=512 + +[testnet] +rpcport=44418 +port=44417 \ No newline at end of file diff --git a/packages/node/chain-setup/bit-mainnet/docker-compose.yml b/packages/node/chain-setup/bit-mainnet/docker-compose.yml new file mode 100644 index 000000000..99bfafea3 --- /dev/null +++ b/packages/node/chain-setup/bit-mainnet/docker-compose.yml @@ -0,0 +1,84 @@ +services: + db: + env_file: .env + volumes: + - ./chain-setup/b1t-mainnet/db-data:/var/lib/postgresql/data + - ./db/db_schema.sql:/docker-entrypoint-initdb.d/db_schema.sql + restart: always + + node: + image: b1ttoshimoto/bit-core:3.0.0 + networks: + - bitcoin + restart: always + command: + [ + "bitd", + "-dbcache=4000", + "-txindex=1", + "-printtoconsole=1", + "-server=1", + "-rpcbind=0.0.0.0", + "-rpcworkqueue=512", + "-rpcport=33318", + "-port=33317", + "-zmqpubrawblock=tcp://0.0.0.0:28332", + "-zmqpubrawtx=tcp://0.0.0.0:28332", + "-rpcallowip=0.0.0.0/0", + "-rpcauth=${RPC_AUTH}", + "-wallet=${DEFAULT_WALLET}" + ] + ports: + - "33317:33317" # P2P + - "33318:33318" # RPC + - "28332:28332" # ZMQ + volumes: + - ./chain-setup/b1t-mainnet/blockchain-data:/home/bit/.bit + + bcn: + image: bitcoin-computer-node + env_file: .env + restart: always + environment: + - BCN_ENV=dev + - RPC_HOST=node + - RPC_PORT=33318 + - ZMQ_URL=tcp://node:28332 + - NETWORK=mainnet + - CHAIN=B1T + - BCN_URL=http://127.0.0.1:1031 + depends_on: + - db + - node + + sync: + command: npm run sync + image: bitcoin-computer-node + env_file: .env + restart: always + environment: + - BCN_ENV=dev + - RPC_HOST=node + - RPC_PORT=33318 + - NETWORK=mainnet + - CHAIN=B1T + - ZMQ_URL=tcp://node:28332 + - BCN_URL=http://127.0.0.1:1031 + - POSTGRES_PORT=5432 + - POSTGRES_HOST=db + - RPC_PROTOCOL=http + - RPC_USER=${RPC_USER} + - RPC_PASSWORD=${RPC_PASSWORD} + - THREADS=${THREADS} + volumes: + - ./logs:/dist/packages/node/logs + depends_on: + - db + - node + networks: + - bitcoin + - bcn + +networks: + bitcoin: + bcn: diff --git a/packages/node/chain-setup/bit-regtest/docker-compose.yml b/packages/node/chain-setup/bit-regtest/docker-compose.yml new file mode 100644 index 000000000..6eb9dd40d --- /dev/null +++ b/packages/node/chain-setup/bit-regtest/docker-compose.yml @@ -0,0 +1,85 @@ +services: + db: + env_file: .env + volumes: + - ./chain-setup/b1t-regtest/db-data:/var/lib/postgresql/data + - ./db/db_schema.sql:/docker-entrypoint-initdb.d/db_schema.sql + restart: always + + node: + image: b1ttoshimoto/bit-core:3.0.0 + networks: + - bitcoin + restart: always + command: + [ + "bitd", + "-regtest=1", + "-dbcache=4000", + "-txindex=1", + "-printtoconsole=1", + "-server=1", + "-rpcbind=0.0.0.0", + "-rpcworkqueue=512", + "-rpcport=22218", + "-port=22217", + "-zmqpubrawblock=tcp://0.0.0.0:28334", + "-zmqpubrawtx=tcp://0.0.0.0:28334", + "-rpcallowip=0.0.0.0/0", + "-rpcauth=${RPC_AUTH}", + "-wallet=${DEFAULT_WALLET}" + ] + ports: + - "22217:22217" # P2P + - "22218:22218" # RPC + - "28334:28334" # ZMQ + volumes: + - ./chain-setup/b1t-regtest/blockchain-data:/home/bit/.bit + + bcn: + image: bitcoin-computer-node + env_file: .env + restart: always + environment: + - BCN_ENV=dev + - RPC_HOST=node + - RPC_PORT=22218 + - ZMQ_URL=tcp://node:28334 + - NETWORK=regtest + - CHAIN=B1T + - BCN_URL=http://127.0.0.1:1031 + depends_on: + - db + - node + + sync: + command: npm run sync + image: bitcoin-computer-node + env_file: .env + restart: always + environment: + - BCN_ENV=dev + - RPC_HOST=node + - RPC_PORT=22218 + - NETWORK=regtest + - CHAIN=B1T + - ZMQ_URL=tcp://node:28334 + - BCN_URL=http://127.0.0.1:1031 + - POSTGRES_PORT=5432 + - POSTGRES_HOST=db + - RPC_PROTOCOL=http + - RPC_USER=${RPC_USER} + - RPC_PASSWORD=${RPC_PASSWORD} + - THREADS=${THREADS} + volumes: + - ./logs:/dist/packages/node/logs + depends_on: + - db + - node + networks: + - bitcoin + - bcn + +networks: + bitcoin: + bcn: diff --git a/packages/node/chain-setup/bit-testnet/docker-compose.yml b/packages/node/chain-setup/bit-testnet/docker-compose.yml new file mode 100644 index 000000000..0d2ccf699 --- /dev/null +++ b/packages/node/chain-setup/bit-testnet/docker-compose.yml @@ -0,0 +1,85 @@ +services: + db: + env_file: .env + volumes: + - ./chain-setup/b1t-testnet/db-data:/var/lib/postgresql/data + - ./db/db_schema.sql:/docker-entrypoint-initdb.d/db_schema.sql + restart: always + + node: + image: b1ttoshimoto/bit-core:3.0.0 + networks: + - bitcoin + restart: always + command: + [ + "bitd", + "-testnet=1", + "-dbcache=4000", + "-txindex=1", + "-printtoconsole=1", + "-server=1", + "-rpcbind=0.0.0.0", + "-rpcworkqueue=512", + "-rpcport=44418", + "-port=44417", + "-zmqpubrawblock=tcp://0.0.0.0:28333", + "-zmqpubrawtx=tcp://0.0.0.0:28333", + "-rpcallowip=0.0.0.0/0", + "-rpcauth=${RPC_AUTH}", + "-wallet=${DEFAULT_WALLET}" + ] + ports: + - "44417:44417" # P2P + - "44418:44418" # RPC + - "28333:28333" # ZMQ + volumes: + - ./chain-setup/b1t-testnet/blockchain-data:/home/bit/.bit + + bcn: + image: bitcoin-computer-node + env_file: .env + restart: always + environment: + - BCN_ENV=dev + - RPC_HOST=node + - RPC_PORT=44418 + - ZMQ_URL=tcp://node:28333 + - NETWORK=testnet + - CHAIN=B1T + - BCN_URL=http://127.0.0.1:1031 + depends_on: + - db + - node + + sync: + command: npm run sync + image: bitcoin-computer-node + env_file: .env + restart: always + environment: + - BCN_ENV=dev + - RPC_HOST=node + - RPC_PORT=44418 + - NETWORK=testnet + - CHAIN=B1T + - ZMQ_URL=tcp://node:28333 + - BCN_URL=http://127.0.0.1:1031 + - POSTGRES_PORT=5432 + - POSTGRES_HOST=db + - RPC_PROTOCOL=http + - RPC_USER=${RPC_USER} + - RPC_PASSWORD=${RPC_PASSWORD} + - THREADS=${THREADS} + volumes: + - ./logs:/dist/packages/node/logs + depends_on: + - db + - node + networks: + - bitcoin + - bcn + +networks: + bitcoin: + bcn: diff --git a/packages/node/package.json b/packages/node/package.json index 2f54a0445..3743bc12e 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -1,92 +1,97 @@ { "name": "@bitcoin-computer/node", - "version": "0.26.0-beta.0", - "private": false, + "version": "0.20.0-beta.0", "description": "Server Side Library for the Bitcoin Computer", - "keywords": [ - "Bitcoin", - "Litecoin", - "Dogecoin", - "Pepecoin", - "Smart Contracts", - "JavaScript" + "contributors": [ + "Clemens Ley", + "Laura Tardivo", + "Vivek Singh" ], - "homepage": "http://bitcoincomputer.io/", - "bugs": { - "url": "https://github.com/bitcoin-computer/monorepo/issues" - }, "repository": { "type": "git", "url": "https://github.com/bitcoin-computer/monorepo/tree/main/packages/node" }, - "license": "MIT", + "type": "module", + "main": "dist/bcn.es.mjs", + "homepage": "http://bitcoincomputer.io/", "author": { "name": "Clemens Ley", "email": "clemens@bitcoincomputer.io" }, - "contributors": [ - "Clemens Ley", - "Laura Tardivo", - "Vivek Singh" - ], - "type": "module", - "main": "dist/bcn.es.mjs", - "files": [ - "LICENSE.md", - "LEGAL.md" - ], + "private": false, + "license": "CC-BY-ND-4.0", + "bugs": { + "url": "https://github.com/bitcoin-computer/monorepo/issues" + }, + "engines": { + "node": ">=16" + }, "scripts": { - "build": "cd ../../ && npm run build:node", - "clean": "npm run down && npm run prune && npm run clean:blockchain:data && npm run clean:db:data", - "clean:blockchain:data": "rm -rf chain-setup/*/*/blockchain-data", - "clean:db:data": "rm -rf chain-setup/*/*/db-data", - "clean:logs": "rm -f *.log 2> /dev/null", - "create:indexes": "nohup node --loader ts-node/esm ./scripts/create-indexes.ts > /dev/null 2>&1 &", - "down": "docker compose -f docker-compose.yml down", - "fund": "node --loader ts-node/esm ./scripts/fund.ts", - "prune": "docker system prune -f", + "clean-logs": "rm -f *.log 2> /dev/null", + "dist-clean": "rm -rf dist", + "down": "./scripts/down.py", + "fund-ltc": "node --loader ts-node/esm ./scripts/fund.ts ltc", + "fund-btc": "node --loader ts-node/esm ./scripts/fund.ts btc", + "fund-pepe": "node --loader ts-node/esm ./scripts/fund.ts pepe", + "lint": "eslint", + "lint-fix": "eslint --fix", + "node-clean": "./scripts/node-clean.sh", + "reset": "yes | ./scripts/reset.sh", + "start": "node $(grep SRC_ENTRY .package.paths | cut -d '=' -f2)", + "start-test": "node --loader ts-node/esm ./scripts/dev-setup.ts", + "sync": "$(grep SYNC_START .package.paths | cut -d '=' -f2)", "setup": "./scripts/setup.py", - "start": "npm run up", - "start:bcn": "node dist/bcn.es.mjs", - "start:sync": "node dist/bcn.sync.es.mjs", - "test": "mocha --config .mocharc.json", - "test:show": "npm run test 2>&1 | tee node-test.log; if [ ${PIPESTATUS[0]} -ne 0 ]; then open node-test.log; fi", - "up": "docker compose -f docker-compose.yml up" + "types": "tsc -p tsconfig.json", + "test": "node --loader ts-node/esm ./scripts/test.ts", + "test-node-and-show": "../../scripts/test-and-show.sh node-test.log", + "test-unit": "npm run test -- -u", + "up": "./scripts/up.py" }, "dependencies": { "@babel/core": "^7.23.9", - "@bitcoin-computer/lib": "^0.26.0-beta.0", - "@bitcoin-computer/nakamotojs": "^0.26.0-beta.0", - "@bitcoin-computer/secp256k1": "^0.26.0-beta.0", + "@bitcoin-computer/lib": "^0.20.0-beta.0", + "@bitcoin-computer/nakamotojs": "^0.20.0-beta.0", + "@bitcoin-computer/secp256k1": "^0.20.0-beta.0", + "@types/chai": "^4.3.1", + "@types/mocha": "^10.0.6", "@types/node": "^20.11.20", - "axios": "1.8.2", + "@types/sinon": "^10.0.11", + "@types/sinon-chai": "^3.2.8", + "argparse": "^2.0.1", + "axios-mock-adapter": "^1.22.0", "bitcoind-rpc": "^0.9.1", "body-parser": "^1.20.2", + "chai": "^4.3.6", "cors": "^2.8.5", "dotenv": "^16.4.5", "ecpair": "^2.1.0", - "elliptic": "^6.6.1", + "edit-json-file": "^1.8.0", + "elliptic": "^6.5.4", "exponential-backoff": "^3.1.1", "express": "^4.18.2", "express-rate-limit": "^7.1.5", "geoip-lite": "^1.4.10", "hash.js": "^1.1.7", + "mocha": "^10.3.0", "pg-monitor": "^2.0.0", "pg-promise": "^11.5.4", + "run-parallel": "^1.2.0", + "sinon": "^14.0.0", + "sinon-chai": "^3.7.0", "ts-node": "^10.9.2", - "typescript": "^5.8.3", + "typeforce": "^1.18.0", + "typescript": "^5.3.3", "winston": "^3.11.0", "winston-daily-rotate-file": "^5.0.0", - "zeromq": "6.0.4" - }, - "devDependencies": { - "@types/chai": "^5.0.1", - "@types/mocha": "^10.0.6", - "chai": "^5.1.0", - "mocha": "^10.3.0" - }, - "engines": { - "node": ">=16" + "zeromq": "6.0.0-beta.6" }, + "keywords": [ + "Bitcoin", + "Litecoin", + "Pepecoin", + "B1tcoin", + "Smart Contracts", + "Javascript" + ], "gitHead": "af40117bcb9616e631910f68c3b617aef629f027" } diff --git a/packages/node/scripts/dev-setup.ts b/packages/node/scripts/dev-setup.ts new file mode 100644 index 000000000..74b5af499 --- /dev/null +++ b/packages/node/scripts/dev-setup.ts @@ -0,0 +1,69 @@ +#!/usr/bin/env node +// Copyright (c) 2021-2023 Bitcoin Computer developers +// Distributed under the MIT software license. + +import { ArgumentParser } from 'argparse' +import { spawnSync } from 'child_process' +import dotenv from 'dotenv' + +dotenv.config() + +const parser = new ArgumentParser() + +const chainGroup = parser.add_mutually_exclusive_group() +chainGroup.add_argument("-btc", "--bitcoin", { action: "store_const", dest: "chain", constant: 'BTC' }) +chainGroup.add_argument("-ltc", "--litecoin", { action: "store_const", dest: "chain", constant: 'LTC' }) +chainGroup.add_argument("-pepe", "--pepecoin", { action: "store_const", dest: "chain", constant: 'PEPE' }) +chainGroup.add_argument("-b1t", "--b1tcoin", { action: "store_const", dest: "chain", constant: 'B1T' }) +parser.set_defaults({ chain: 'LTC' }) + +const networkGroup = parser.add_mutually_exclusive_group() +networkGroup.add_argument("-t", "--testnet", { action: "store_const", dest: "network", constant: 'testnet' }) +networkGroup.add_argument("-m", "--mainnet", { action: "store_const", dest: "network", constant: 'mainnet' }) +networkGroup.add_argument("-r", "--regtest", { action: "store_const", dest: "network", constant: 'regtest' }) +parser.set_defaults({ network: 'regtest' }) + +const args = parser.parse_args() + +let nodePort: String; + +switch (args.chain) { + case 'BTC': + nodePort = '8332' + break + case 'PEPE': + nodePort = '18332' + break + case 'B1T': + nodePort = '22218' + break + default: // LTC + nodePort = '19332' + break +} + +const bcnPort = process.env.PORT || '1031' +const rpcUser = process.env.RPC_USER || 'bcn-admin' +const rpcPassword = process.env.RPC_PASSWORD || 'kH4nU5Okm6-uyC0_mA5ztVNacJqZbYd_KGLl6mx722A=' + +const command = `BCN_ENV=dev CHAIN=${args.chain} NETWORK=${args.network} POSTGRES_HOST=127.0.0.1 RPC_HOST=127.0.0.1 RPC_PORT=${nodePort} RPC_PROTOCOL=http RPC_USER=${rpcUser} RPC_PASSWORD=${rpcPassword} ZMQ_URL=tcp://127.0.0.1:28332 BCN_URL=http://127.0.0.1:${bcnPort} node --loader ts-node/esm $(grep START_PATH .package.paths | cut -d '=' -f2)` + +console.log(command) + +// Use spawnSync with stdio: 'inherit' to display output in real-time +const childProcess = spawnSync(command, { shell: true, stdio: 'inherit' }) + +// Check for errors and log them +if (childProcess.error) { + console.error(childProcess.error.message) + process.exit(1) +} + +// Check the exit code of the child process +if (childProcess.status === 0) { + console.log('Command completed successfully.') +} else { + console.error(`Command failed with code ${childProcess.status}`) + process.exit(1) +} +// If we get here, the command succeeded diff --git a/packages/node/scripts/docker-logs.sh b/packages/node/scripts/docker-logs.sh index d25a8edbe..cbfec7228 100755 --- a/packages/node/scripts/docker-logs.sh +++ b/packages/node/scripts/docker-logs.sh @@ -15,41 +15,48 @@ for container_id in $container_ids; do done echo '' -# Define .env path -env_path='.env' +# Read chain and network from the arguments +if [ $# -eq 0 ]; then + chain='ltc' + network='testnet' +else + chain=$1 + network=$2 +fi -# Read network from env_path -network=$(grep 'BCN_NETWORK=' $env_path | cut -d '=' -f2 | tr -d "'") - -# Set debug path based on network -case "$network" in - mainnet) - debug="/debug.log" - ;; - testnet) - debug="/testnet4/debug.log" - ;; - regtest) - debug="/regtest/debug.log" - ;; - *) - echo "Invalid network: $network" - exit 1 - ;; -esac - -# Get bitcoin data directory from .env -logpath=$(grep 'BITCOIN_DATA_DIR=' $env_path | cut -d '=' -f2) - -# Remove single quotes from the logpath -logpath=$(echo $logpath | tr -d "'") +# Log paths are predefined for Bitcoin, Litecoin, Pepecoin and B1T +if [ $chain == 'btc' ]; then + if [ $network == 'mainnet' ]; then + logpath='/home/bitcoin/.bitcoin/debug.log' + else + logpath='/home/bitcoin/.bitcoin/testnet3/debug.log' + fi +else if [ $chain == 'pepe' ]; then + if [ $network == 'mainnet' ]; then + logpath='/home/pepecoin/.pepecoin/debug.log' + else + logpath='/home/pepecoin/.pepecoin/testnet3/debug.log' + fi +else if [ $chain == 'b1t' ]; then + if [ $network == 'mainnet' ]; then + logpath='/home/bit/.bit/debug.log' + else + logpath='/home/bit/.bit/testnet3/debug.log' + fi +else + if [ $network == 'mainnet' ]; then + logpath='/home/litecoin/.litecoin/debug.log' + else + logpath='/home/litecoin/.litecoin/testnet4/debug.log' + fi +fi echo '------ node ------' # Get the logs from the bitcoin node (default LTC testnet) -node_container_image=$(docker compose -f docker-compose.yml ps -q node | xargs docker inspect --format='{{.Image}}' | sed -e 's/^sha256:/\'$'\n/g') +node_container_image=$(docker compose -f docker-compose.yml -f chain-setup/${chain}-${network}/docker-compose.yml ps -q node | xargs docker inspect --format='{{.Image}}' | sed -e 's/^sha256:/\'$'\n/g') node_container_id=$(docker ps -qf "ancestor=$node_container_image") -docker exec $node_container_id tail -n 5 $logpath$debug +docker exec $node_container_id tail -n 5 $logpath echo '------ postgress ------' diff --git a/packages/node/scripts/down.py b/packages/node/scripts/down.py new file mode 100644 index 000000000..38b722804 --- /dev/null +++ b/packages/node/scripts/down.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 +# Copyright (c) 2021-2022 Bitcoin Computer developers +# Distributed under the MIT software license. + +import argparse +import subprocess + +parser = argparse.ArgumentParser() +chainGroup = parser.add_mutually_exclusive_group() +chainGroup.add_argument("-btc", "--bitcoin", action="store_const", dest="chain", const='btc') +chainGroup.add_argument("-ltc", "--litecoin", action="store_const", dest="chain", const='ltc') +chainGroup.add_argument("-pepe", "--pepecoin", action="store_const", dest="chain", const='pepe') +chainGroup.add_argument("-b1t", "--b1tcoin", action="store_const", dest="chain", const='b1t') +parser.set_defaults(chain='ltc') + +networkGroup = parser.add_mutually_exclusive_group() +networkGroup.add_argument("-t", "--testnet", action="store_const", dest="network", const='testnet') +networkGroup.add_argument("-m", "--mainnet", action="store_const", dest="network", const='mainnet') +networkGroup.add_argument("-r", "--regtest", action="store_const", dest="network", const='regtest') +parser.set_defaults(network='regtest') + +serviceGroup = parser.add_mutually_exclusive_group() +serviceGroup.add_argument('-db', action="store_const", dest="service", const='db') +serviceGroup.add_argument('-bcn', action="store_const", dest="service", const='bcn') +serviceGroup.add_argument('-node', action="store_const", dest="service", const='node') + +parser.set_defaults(service='') + +args = parser.parse_args() + +print(args) + +commandLine = ' docker compose -f docker-compose.yml -f chain-setup/'+args.chain+'-'+args.network+'/docker-compose.yml ' + +print(commandLine+' down') +subprocess.run( + ['sh', '-c', commandLine+' down --remove-orphans']) diff --git a/packages/node/scripts/test.ts b/packages/node/scripts/test.ts new file mode 100644 index 000000000..1f43953e3 --- /dev/null +++ b/packages/node/scripts/test.ts @@ -0,0 +1,73 @@ +#!/usr/bin/env node + +import { ArgumentParser } from 'argparse' +import { spawnSync } from 'child_process' +import dotenv from 'dotenv' + +dotenv.config() + +const parser = new ArgumentParser() +const chainGroup = parser.add_mutually_exclusive_group() +chainGroup.add_argument('-btc', '--bitcoin', { action: 'store_true' }) +chainGroup.add_argument('-ltc', '--litecoin', { action: 'store_true', default: true }) +chainGroup.add_argument('-pepe', '--pepecoin', { action: 'store_true' }) +chainGroup.add_argument('-b1t', '--b1tcoin', { action: 'store_true' }) + +const connectionGroup = parser.add_mutually_exclusive_group() +connectionGroup.add_argument('-l', '--local', { action: 'store_true', default: true }) +connectionGroup.add_argument('-c', '--cloud', { action: 'store_true' }) + +const testTypeGroup = parser.add_mutually_exclusive_group() +testTypeGroup.add_argument('-s', '--single', { action: 'store' }) +testTypeGroup.add_argument('-i', '--integration', { action: 'store_true' }) +testTypeGroup.add_argument('-u', '--unit', { action: 'store_true', default: true }) + +const args = parser.parse_args() + +let port = 19332; // LTC + +if (args.bitcoin) { + port = 8332 +} else if (args.b1tcoin) { + port = 22218 +} + +const chain = process.env.CHAIN || (args.bitcoin ? 'BTC' : 'LTC') + +const network = process.env.NETWORK || 'regtest' +const bcnPort = process.env.PORT ?? '1031' + +const nodeUrl = args.cloud ? 'https://rltc.node.bitcoincomputer.io' : `http://127.0.0.1:${bcnPort}` +const postgresHost = process.env.POSTGRES_HOST || '127.0.0.1' +const rpcHost = args.cloud ? 'rltc.node.bitcoincomputer.io' : process.env.RPC_HOST + +const rpcUser = process.env.RPC_USER ?? 'bcn-admin' +const rpcPass = process.env.RPC_PASSWORD ?? 'kH4nU5Okm6-uyC0_mA5ztVNacJqZbYd_KGLl6mx722A=' +const zmqUrl = 'tcp://127.0.0.1:28332' + +let command = `BCN_URL=${nodeUrl} CHAIN=${chain} NETWORK=${network} BCN_ENV=test POSTGRES_PORT=5432 POSTGRES_HOST=${postgresHost} RPC_HOST=${rpcHost} RPC_PORT=${port} RPC_PROTOCOL=http RPC_USER=${rpcUser} RPC_PASSWORD=${rpcPass} ZMQ_URL=${zmqUrl} mocha --config` + +if (args.integration) { + command = `${command} .mocharc-async.json` +} else if (args.single) { + command = `${command} .mocharc-single.json ${args.single}` +} else { + command = `${command} .mocharc-unit.json` +} + +const childProcess = spawnSync(command, { shell: true, stdio: 'inherit' }) + +// Check for errors and log them +if (childProcess.error) { + console.error(childProcess.error.message) + process.exit(1) +} + +// Check the exit code of the child process +if (childProcess.status === 0) { + console.log('Command completed successfully.') +} else { + console.error(`Command failed with code ${childProcess.status}`) + process.exit(1) +} +// If we get here, the command succeeded diff --git a/packages/node/scripts/up.py b/packages/node/scripts/up.py new file mode 100644 index 000000000..f3e8dccfd --- /dev/null +++ b/packages/node/scripts/up.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 +# Copyright (c) 2021-2024 Bitcoin Computer developers +# Distributed under the MIT software license. + +import argparse +import subprocess + +def main(): + + parser = argparse.ArgumentParser() + chainGroup = parser.add_mutually_exclusive_group() + chainGroup.add_argument("-btc", "--bitcoin", action="store_const", dest="chain", const='btc') + chainGroup.add_argument("-ltc", "--litecoin", action="store_const", dest="chain", const='ltc') + chainGroup.add_argument("-pepe", "--pepecoin", action="store_const", dest="chain", const='pepe') + chainGroup.add_argument("-b1t", "--b1tcoin", action="store_const", dest="chain", const='b1t') + parser.set_defaults(chain='ltc') + + networkGroup = parser.add_mutually_exclusive_group() + networkGroup.add_argument("-t", "--testnet", action="store_const", dest="network", const='testnet') + networkGroup.add_argument("-m", "--mainnet", action="store_const", dest="network", const='mainnet') + networkGroup.add_argument("-r", "--regtest", action="store_const", dest="network", const='regtest') + parser.set_defaults(network='regtest') + + serviceGroup = parser.add_mutually_exclusive_group() + serviceGroup.add_argument('-db', action="store_const", dest="service", const='db') + serviceGroup.add_argument('-bcn', action="store_const", dest="service", const='bcn') + serviceGroup.add_argument('-node', action="store_const", dest="service", const='node') + serviceGroup.add_argument('-sync', action="store_const", dest="service", const='sync') + + parser.set_defaults(service='') + + parser.add_argument('-threads', dest="threads",type=int) + + args = parser.parse_args() + + print(args) + + threadsString = f" export THREADS={args.threads} && " if args.threads is not None else "" + + commandLine = f" {threadsString} docker compose -f docker-compose.yml -f chain-setup/{args.chain}-{args.network}/docker-compose.yml" + print(commandLine) + + # launch the services + subprocess.run( + ['sh', '-c', commandLine+' up {0}'.format(args.service)]) + +if __name__ == '__main__': + main() + diff --git a/packages/wallet/.env.example b/packages/wallet/.env.example new file mode 100644 index 000000000..fd09b2b02 --- /dev/null +++ b/packages/wallet/.env.example @@ -0,0 +1,11 @@ +MNEMONIC=capital hurdle actual tunnel stool pause measure fresh deer mass thrive route fame initial bind +PORT=1033 +REACT_APP_EXPLORER_URL=localhost:1032 +GENERATE_SOURCEMAP=false +REACT_APP_LTC_REGTEST_URL=https://rltc.node.bitcoincomputer.io +REACT_APP_BTC_TESTNET_URL=https://btc.node.bitcoincomputer.io +REACT_APP_BTC_REGTEST_URL=http://127.0.0.1:1031 +REACT_APP_PEPE_REGTEST_URL=http://127.0.0.1:1031 +REACT_APP_B1T_REGTEST_URL=http://127.0.0.1:1031 +REACT_APP_CHAIN=LTC +REACT_APP_NETWORK=regtest From 56a31c36d211279903e76f49404a9080ead94741 Mon Sep 17 00:00:00 2001 From: bittoshimoto Date: Sun, 17 Aug 2025 00:04:33 +0200 Subject: [PATCH 2/2] chore(node): add minimal ESLint v9 flat config --- packages/node/eslint.config.js | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 packages/node/eslint.config.js diff --git a/packages/node/eslint.config.js b/packages/node/eslint.config.js new file mode 100644 index 000000000..555d4b118 --- /dev/null +++ b/packages/node/eslint.config.js @@ -0,0 +1,9 @@ +// Minimal flat config for ESLint v9 in packages/node +export default [ + { + files: ['**/*.{js,cjs,mjs}'], + ignores: ['dist/**', 'build/**', 'node_modules/**'], + languageOptions: { ecmaVersion: 2021, sourceType: 'module' }, + rules: {}, + }, +];