diff --git a/.yarn/cache/fsevents-patch-19706e7e35-10.zip b/.yarn/cache/fsevents-patch-19706e7e35-10.zip new file mode 100644 index 00000000000..aff1ab12ce5 Binary files /dev/null and b/.yarn/cache/fsevents-patch-19706e7e35-10.zip differ diff --git a/CHANGELOG.md b/CHANGELOG.md index 8212fee199d..8565b590202 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,66 @@ +### [3.0.1](///compare/v3.0.1-hotfix.4...v3.0.1) (2026-02-06) + +### [3.0.1-hotfix.4](///compare/v3.0.1-hotfix.3...v3.0.1-hotfix.4) (2026-02-05) + + +### ⚠ BREAKING CHANGES + +* **platform:** update PlatformAddress encoding and HRP constants (#3059) +* **platform:** 3.0 audit report fixes (#3053) + +### Features + +* **platform:** update PlatformAddress encoding and HRP constants ([#3059](undefined/undefined/undefined/issues/3059)) + + +### Bug Fixes + +* **platform:** 3.0 audit report fixes ([#3053](undefined/undefined/undefined/issues/3053)) + + +### Miscellaneous Chores + +* update all package versions to 3.0.1-hotfix.4 ([#3060](undefined/undefined/undefined/issues/3060)) + +### [3.0.1-hotfix.3](///compare/v3.0.0...v3.0.1-hotfix.3) (2026-02-05) + + +### Bug Fixes + +* **dashmate:** letsencrypt renewal and dashmate doctor fixes ([#3018](undefined/undefined/undefined/issues/3018)) + + +### Miscellaneous Chores + +* **dashmate:** upgrade to Core 23 ([#3054](undefined/undefined/undefined/issues/3054)) +* **release:** update changelog and bump version to 3.0.1-hotfix.3 ([#3055](undefined/undefined/undefined/issues/3055)) + +### [3.0.1-hotfix.3](https://github.com/dashpay/platform/compare/v3.0.0...v3.0.1-hotfix.3) (2026-02-05) + + +### Bug Fixes + +* **dashmate:** letsencrypt renewal and dashmate doctor fixes ([#3018](https://github.com/dashpay/platform/issues/3018)) + + +### Miscellaneous Chores + +* **dashmate:** upgrade to Core 23 ([#3054](https://github.com/dashpay/platform/issues/3054)) + +### [3.0.1-hotfix.2](https://github.com/dashpay/platform/compare/v3.0.1-hotfix.1...v3.0.1-hotfix.2) (2026-02-02) + + +### Bug Fixes + +* **dashmate:** pass --profile shortlived on letsencrypt renewal + +### [3.0.1-hotfix.1](https://github.com/dashpay/platform/compare/v3.0.0...v3.0.1-hotfix.1) (2026-01-26) + + +### Bug Fixes + +* use single quotes and preserve ctx values in merge + ## [3.0.0-rc.3](///compare/v3.0.0-rc.2...v3.0.0-rc.3) (2026-01-20) diff --git a/Cargo.lock b/Cargo.lock index 24a727c3837..4f079ee095e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -848,7 +848,7 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "check-features" -version = "3.0.0" +version = "3.0.1" dependencies = [ "toml 0.8.23", ] @@ -1282,7 +1282,7 @@ dependencies = [ [[package]] name = "dapi-grpc" -version = "3.0.0" +version = "3.0.1" dependencies = [ "dash-platform-macros", "futures-core", @@ -1370,7 +1370,7 @@ dependencies = [ [[package]] name = "dash-context-provider" -version = "3.0.0" +version = "3.0.1" dependencies = [ "dpp", "drive", @@ -1392,7 +1392,7 @@ dependencies = [ [[package]] name = "dash-platform-balance-checker" -version = "3.0.0" +version = "3.0.1" dependencies = [ "anyhow", "clap", @@ -1407,7 +1407,7 @@ dependencies = [ [[package]] name = "dash-platform-macros" -version = "3.0.0" +version = "3.0.1" dependencies = [ "heck 0.5.0", "quote", @@ -1416,7 +1416,7 @@ dependencies = [ [[package]] name = "dash-sdk" -version = "3.0.0" +version = "3.0.1" dependencies = [ "arc-swap", "assert_matches", @@ -1586,7 +1586,7 @@ dependencies = [ [[package]] name = "dashpay-contract" -version = "3.0.0" +version = "3.0.1" dependencies = [ "platform-value", "platform-version", @@ -1596,7 +1596,7 @@ dependencies = [ [[package]] name = "data-contracts" -version = "3.0.0" +version = "3.0.1" dependencies = [ "dashpay-contract", "dpns-contract", @@ -1745,7 +1745,7 @@ checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" [[package]] name = "dpns-contract" -version = "3.0.0" +version = "3.0.1" dependencies = [ "platform-value", "platform-version", @@ -1755,7 +1755,7 @@ dependencies = [ [[package]] name = "dpp" -version = "3.0.0" +version = "3.0.1" dependencies = [ "anyhow", "assert_matches", @@ -1811,7 +1811,7 @@ dependencies = [ [[package]] name = "drive" -version = "3.0.0" +version = "3.0.1" dependencies = [ "arc-swap", "assert_matches", @@ -1852,7 +1852,7 @@ dependencies = [ [[package]] name = "drive-abci" -version = "3.0.0" +version = "3.0.1" dependencies = [ "arc-swap", "assert_matches", @@ -1908,7 +1908,7 @@ dependencies = [ [[package]] name = "drive-proof-verifier" -version = "3.0.0" +version = "3.0.1" dependencies = [ "bincode", "dapi-grpc", @@ -2161,7 +2161,7 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "feature-flags-contract" -version = "3.0.0" +version = "3.0.1" dependencies = [ "platform-value", "platform-version", @@ -3334,7 +3334,7 @@ dependencies = [ [[package]] name = "json-schema-compatibility-validator" -version = "3.0.0" +version = "3.0.1" dependencies = [ "assert_matches", "json-patch", @@ -3453,7 +3453,7 @@ dependencies = [ [[package]] name = "keyword-search-contract" -version = "3.0.0" +version = "3.0.1" dependencies = [ "base58", "platform-value", @@ -3600,7 +3600,7 @@ dependencies = [ [[package]] name = "masternode-reward-shares-contract" -version = "3.0.0" +version = "3.0.1" dependencies = [ "platform-value", "platform-version", @@ -4268,7 +4268,7 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "platform-serialization" -version = "3.0.0" +version = "3.0.1" dependencies = [ "bincode", "platform-version", @@ -4276,7 +4276,7 @@ dependencies = [ [[package]] name = "platform-serialization-derive" -version = "3.0.0" +version = "3.0.1" dependencies = [ "proc-macro2", "quote", @@ -4286,7 +4286,7 @@ dependencies = [ [[package]] name = "platform-value" -version = "3.0.0" +version = "3.0.1" dependencies = [ "base64 0.22.1", "bincode", @@ -4305,7 +4305,7 @@ dependencies = [ [[package]] name = "platform-value-convertible" -version = "3.0.0" +version = "3.0.1" dependencies = [ "quote", "syn 2.0.111", @@ -4313,7 +4313,7 @@ dependencies = [ [[package]] name = "platform-version" -version = "3.0.0" +version = "3.0.1" dependencies = [ "bincode", "grovedb-version", @@ -4323,7 +4323,7 @@ dependencies = [ [[package]] name = "platform-versioning" -version = "3.0.0" +version = "3.0.1" dependencies = [ "proc-macro2", "quote", @@ -4332,7 +4332,7 @@ dependencies = [ [[package]] name = "platform-wallet" -version = "3.0.0" +version = "3.0.1" dependencies = [ "dashcore", "dpp", @@ -5097,7 +5097,7 @@ dependencies = [ [[package]] name = "rs-dapi" -version = "3.0.0" +version = "3.0.1" dependencies = [ "async-trait", "axum 0.8.8", @@ -5146,7 +5146,7 @@ dependencies = [ [[package]] name = "rs-dapi-client" -version = "3.0.0" +version = "3.0.1" dependencies = [ "backon", "chrono", @@ -5171,7 +5171,7 @@ dependencies = [ [[package]] name = "rs-dash-event-bus" -version = "3.0.0" +version = "3.0.1" dependencies = [ "metrics", "tokio", @@ -5180,7 +5180,7 @@ dependencies = [ [[package]] name = "rs-sdk-ffi" -version = "3.0.0" +version = "3.0.1" dependencies = [ "bincode", "bs58", @@ -5209,7 +5209,7 @@ dependencies = [ [[package]] name = "rs-sdk-trusted-context-provider" -version = "3.0.0" +version = "3.0.1" dependencies = [ "arc-swap", "dash-context-provider", @@ -5875,7 +5875,7 @@ checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "simple-signer" -version = "3.0.0" +version = "3.0.1" dependencies = [ "base64 0.22.1", "bincode", @@ -5972,7 +5972,7 @@ dependencies = [ [[package]] name = "strategy-tests" -version = "3.0.0" +version = "3.0.1" dependencies = [ "bincode", "dpp", @@ -6366,7 +6366,7 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "token-history-contract" -version = "3.0.0" +version = "3.0.1" dependencies = [ "platform-value", "platform-version", @@ -7121,7 +7121,7 @@ dependencies = [ [[package]] name = "wallet-utils-contract" -version = "3.0.0" +version = "3.0.1" dependencies = [ "platform-value", "platform-version", @@ -7253,7 +7253,7 @@ dependencies = [ [[package]] name = "wasm-dpp" -version = "3.0.0" +version = "3.0.1" dependencies = [ "anyhow", "async-trait", @@ -7277,7 +7277,7 @@ dependencies = [ [[package]] name = "wasm-dpp2" -version = "3.0.0" +version = "3.0.1" dependencies = [ "anyhow", "bincode", @@ -7294,7 +7294,7 @@ dependencies = [ [[package]] name = "wasm-drive-verify" -version = "3.0.0" +version = "3.0.1" dependencies = [ "base64 0.22.1", "bincode", @@ -7327,7 +7327,7 @@ dependencies = [ [[package]] name = "wasm-sdk" -version = "3.0.0" +version = "3.0.1" dependencies = [ "base64 0.22.1", "bip39", @@ -7787,7 +7787,7 @@ checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "withdrawals-contract" -version = "3.0.0" +version = "3.0.1" dependencies = [ "num_enum 0.5.11", "platform-value", diff --git a/Cargo.toml b/Cargo.toml index b2465672ea8..a744b278a88 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,5 +53,5 @@ dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore", rev = "53d699 [workspace.package] -version = "3.0.0" +version = "3.0.1" rust-version = "1.92" diff --git a/package.json b/package.json index 35b0dee8482..14babb1c238 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/platform", - "version": "3.0.0", + "version": "3.0.1", "private": true, "scripts": { "setup": "yarn install && yarn run build && yarn run configure", diff --git a/packages/bench-suite/package.json b/packages/bench-suite/package.json index ca54af424a0..78556bdc9bb 100644 --- a/packages/bench-suite/package.json +++ b/packages/bench-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/bench-suite", "private": true, - "version": "3.0.0", + "version": "3.0.1", "description": "Dash Platform benchmark tool", "scripts": { "bench": "node ./bin/bench.js", diff --git a/packages/dapi-grpc/package.json b/packages/dapi-grpc/package.json index cf73b25ef8d..d7622b3308e 100644 --- a/packages/dapi-grpc/package.json +++ b/packages/dapi-grpc/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-grpc", - "version": "3.0.0", + "version": "3.0.1", "description": "DAPI GRPC definition file and generated clients", "browser": "browser.js", "main": "node.js", diff --git a/packages/dapi/package.json b/packages/dapi/package.json index cff4a9bd75e..b38d0890228 100644 --- a/packages/dapi/package.json +++ b/packages/dapi/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/dapi", "private": true, - "version": "3.0.0", + "version": "3.0.1", "description": "A decentralized API for the Dash network", "scripts": { "api": "node scripts/api.js", diff --git a/packages/dash-spv/package.json b/packages/dash-spv/package.json index dd6ff5e18fa..1cacda1340f 100644 --- a/packages/dash-spv/package.json +++ b/packages/dash-spv/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dash-spv", - "version": "4.0.0", + "version": "4.0.1", "description": "Repository containing SPV functions used by @dashevo", "main": "index.js", "scripts": { diff --git a/packages/dashmate/configs/defaults/getBaseConfigFactory.js b/packages/dashmate/configs/defaults/getBaseConfigFactory.js index 3ea84fb7509..c9551ff743c 100644 --- a/packages/dashmate/configs/defaults/getBaseConfigFactory.js +++ b/packages/dashmate/configs/defaults/getBaseConfigFactory.js @@ -53,7 +53,7 @@ export default function getBaseConfigFactory() { port: 3001, }, docker: { - image: 'dashpay/dashd:22', + image: 'dashpay/dashd:23', commandArgs: [], }, p2p: { diff --git a/packages/dashmate/configs/getConfigFileMigrationsFactory.js b/packages/dashmate/configs/getConfigFileMigrationsFactory.js index c1b3bb77726..f7a6669f474 100644 --- a/packages/dashmate/configs/getConfigFileMigrationsFactory.js +++ b/packages/dashmate/configs/getConfigFileMigrationsFactory.js @@ -1398,6 +1398,13 @@ export default function getConfigFileMigrationsFactory(homeDir, defaultConfigs) return configFile; }, + '3.0.1': (configFile) => { + Object.entries(configFile.configs) + .forEach(([, options]) => { + options.core.docker.image = 'dashpay/dashd:23'; + }); + return configFile; + }, }; } diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index 14e3da1bf86..bd572633e14 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -1,6 +1,6 @@ { "name": "dashmate", - "version": "3.0.0", + "version": "3.0.1", "description": "Distribution package for Dash node installation", "scripts": { "lint": "eslint .", diff --git a/packages/dashmate/src/doctor/analyse/analyseConfigFactory.js b/packages/dashmate/src/doctor/analyse/analyseConfigFactory.js index 92458dd62fb..80007be0129 100644 --- a/packages/dashmate/src/doctor/analyse/analyseConfigFactory.js +++ b/packages/dashmate/src/doctor/analyse/analyseConfigFactory.js @@ -1,6 +1,7 @@ import chalk from 'chalk'; import { NETWORK_LOCAL, NETWORK_MAINNET } from '../../constants.js'; -import { ERRORS } from '../../ssl/zerossl/validateZeroSslCertificateFactory.js'; +import { ERRORS as LETSENCRYPT_ERRORS } from '../../ssl/letsencrypt/validateLetsEncryptCertificateFactory.js'; +import { ERRORS as ZEROSSL_ERRORS } from '../../ssl/zerossl/validateZeroSslCertificateFactory.js'; import { SEVERITY } from '../Prescription.js'; import Problem from '../Problem.js'; @@ -82,51 +83,80 @@ Private key file path: {bold.cyanBright ${ssl?.data?.privateFilePath}} Or use ZeroSSL https://docs.dash.org/en/stable/masternodes/dashmate.html#ssl-certificate`, }, // ZeroSSL validation errors - [ERRORS.API_KEY_IS_NOT_SET]: { + [ZEROSSL_ERRORS.API_KEY_IS_NOT_SET]: { description: 'ZeroSSL API key is not set.', solution: chalk`Please obtain your API key from {underline.cyanBright https://app.zerossl.com/developer} And then update your configuration with {block.cyanBright dashmate config set platform.gateway.ssl.providerConfigs.zerossl.apiKey [KEY]}`, }, - [ERRORS.EXTERNAL_IP_IS_NOT_SET]: { + [ZEROSSL_ERRORS.EXTERNAL_IP_IS_NOT_SET]: { description: 'External IP is not set.', solution: chalk`Please update your configuration to include your external IP using {block.cyanBright dashmate config set externalIp [IP]}`, }, - [ERRORS.CERTIFICATE_ID_IS_NOT_SET]: { + [ZEROSSL_ERRORS.CERTIFICATE_ID_IS_NOT_SET]: { description: 'ZeroSSL certificate is not configured', solution: chalk`Please run {bold.cyanBright dashmate ssl obtain} to get a new certificate`, }, - [ERRORS.PRIVATE_KEY_IS_NOT_PRESENT]: { + [ZEROSSL_ERRORS.PRIVATE_KEY_IS_NOT_PRESENT]: { description: chalk`ZeroSSL private key file not found in ${ssl?.data?.privateKeyFilePath}.`, solution: chalk`Please regenerate the certificate using {bold.cyanBright dashmate ssl obtain --force} and revoke the previous certificate in the ZeroSSL dashboard`, }, - [ERRORS.EXTERNAL_IP_MISMATCH]: { + [ZEROSSL_ERRORS.EXTERNAL_IP_MISMATCH]: { description: chalk`ZeroSSL IP ${ssl?.data?.certificate.common_name} does not match external IP ${ssl?.data?.externalIp}.`, solution: chalk`Please regenerate the certificate using {bold.cyanBright dashmate ssl obtain --force} and revoke the previous certificate in the ZeroSSL dashboard`, }, - [ERRORS.CSR_FILE_IS_NOT_PRESENT]: { + [ZEROSSL_ERRORS.CSR_FILE_IS_NOT_PRESENT]: { description: chalk`ZeroSSL certificate request file not found in ${ssl?.data?.csrFilePath}. This makes auto-renewal impossible.`, solution: chalk`If you need auto renew, please regenerate the certificate using {bold.cyanBright dashmate ssl obtain --force} and revoke the previous certificate in the ZeroSSL dashboard`, }, - [ERRORS.CERTIFICATE_EXPIRES_SOON]: { + [ZEROSSL_ERRORS.CERTIFICATE_EXPIRES_SOON]: { description: chalk`ZeroSSL certificate expires at ${ssl?.data?.certificate.expires}.`, solution: chalk`Please run {bold.cyanBright dashmate ssl obtain} to get a new one`, }, - [ERRORS.CERTIFICATE_IS_NOT_VALIDATED]: { + [ZEROSSL_ERRORS.CERTIFICATE_IS_NOT_VALIDATED]: { description: chalk`ZeroSSL certificate is not approved.`, solution: chalk`Please run {bold.cyanBright dashmate ssl obtain} to confirm certificate`, }, - [ERRORS.CERTIFICATE_IS_NOT_VALID]: { + [ZEROSSL_ERRORS.CERTIFICATE_IS_NOT_VALID]: { description: chalk`ZeroSSL certificate is not valid.`, solution: chalk`Please run {bold.cyanBright dashmate ssl zerossl obtain} to get a new one.`, }, - [ERRORS.ZERO_SSL_API_ERROR]: { + [ZEROSSL_ERRORS.ZERO_SSL_API_ERROR]: { description: ssl?.data?.error?.message, solution: chalk`Please contact ZeroSSL support if needed.`, }, + // Let's Encrypt validation errors + [LETSENCRYPT_ERRORS.EMAIL_IS_NOT_SET]: { + description: 'Let\'s Encrypt email is not set.', + solution: chalk`Please update your configuration with {bold.cyanBright dashmate config set platform.gateway.ssl.providerConfigs.letsencrypt.email [EMAIL]}`, + }, + [LETSENCRYPT_ERRORS.EXTERNAL_IP_IS_NOT_SET]: { + description: 'External IP is not set.', + solution: chalk`Please update your configuration to include your external IP using {bold.cyanBright dashmate config set externalIp [IP]}`, + }, + [LETSENCRYPT_ERRORS.CERTIFICATE_NOT_FOUND]: { + description: 'Let\'s Encrypt certificate is not configured', + solution: chalk`Please run {bold.cyanBright dashmate ssl obtain --provider=letsencrypt} to get a new certificate`, + }, + [LETSENCRYPT_ERRORS.PRIVATE_KEY_NOT_FOUND]: { + description: chalk`Let's Encrypt private key file not found.`, + solution: chalk`Please regenerate the certificate using {bold.cyanBright dashmate ssl obtain --provider=letsencrypt --force}`, + }, + [LETSENCRYPT_ERRORS.CERTIFICATE_IP_MISMATCH]: { + description: chalk`Let's Encrypt certificate does not match external IP ${ssl?.data?.externalIp}.`, + solution: chalk`Please regenerate the certificate using {bold.cyanBright dashmate ssl obtain --provider=letsencrypt --force}`, + }, + [LETSENCRYPT_ERRORS.CERTIFICATE_EXPIRES_SOON]: { + description: chalk`Let's Encrypt certificate expires at ${ssl?.data?.certificate?.expires}.`, + solution: chalk`Please run {bold.cyanBright dashmate ssl obtain --provider=letsencrypt} to renew`, + }, + [LETSENCRYPT_ERRORS.CERTIFICATE_NOT_VALID]: { + description: chalk`Let's Encrypt certificate is not valid.`, + solution: chalk`Please run {bold.cyanBright dashmate ssl obtain --provider=letsencrypt --force} to get a new one.`, + }, }[ssl.error] ?? {}; if (description) { diff --git a/packages/dashmate/src/listr/tasks/doctor/collectSamplesTaskFactory.js b/packages/dashmate/src/listr/tasks/doctor/collectSamplesTaskFactory.js index b36def7246e..46d8f4fd7ad 100644 --- a/packages/dashmate/src/listr/tasks/doctor/collectSamplesTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/doctor/collectSamplesTaskFactory.js @@ -5,6 +5,7 @@ import process from 'process'; import si from 'systeminformation'; import obfuscateConfig from '../../../config/obfuscateConfig.js'; import { DASHMATE_VERSION } from '../../../constants.js'; +import LegoCertificate from '../../../ssl/letsencrypt/LegoCertificate.js'; import Certificate from '../../../ssl/zerossl/Certificate.js'; import providers from '../../../status/providers.js'; import hideString from '../../../util/hideString.js'; @@ -35,6 +36,7 @@ async function fetchTextOrError(url) { * @param {getOperatingSystemInfo} getOperatingSystemInfo * @param {HomeDir} homeDir * @param {validateZeroSslCertificate} validateZeroSslCertificate + * @param {validateLetsEncryptCertificate} validateLetsEncryptCertificate * @return {collectSamplesTask} */ export default function collectSamplesTaskFactory( @@ -46,6 +48,7 @@ export default function collectSamplesTaskFactory( getOperatingSystemInfo, homeDir, validateZeroSslCertificate, + validateLetsEncryptCertificate, ) { /** * @typedef {function} collectSamplesTask @@ -116,6 +119,27 @@ export default function collectSamplesTaskFactory( return; } + case 'letsencrypt': { + const { + error, + data, + } = await validateLetsEncryptCertificate( + config, + LegoCertificate.EXPIRATION_LIMIT_DAYS, + ); + + obfuscateObjectRecursive(data, (_field, value) => (typeof value === 'string' ? value.replaceAll( + process.env.USER, + hideString(process.env.USER), + ) : value)); + + ctx.samples.setServiceInfo('gateway', 'ssl', { + error, + data, + }); + + return; + } case 'file': { // SSL certificate const certificatesDir = homeDir.joinPath( diff --git a/packages/dashmate/src/listr/tasks/ssl/letsencrypt/obtainLetsEncryptCertificateTaskFactory.js b/packages/dashmate/src/listr/tasks/ssl/letsencrypt/obtainLetsEncryptCertificateTaskFactory.js index 004e45de7d9..0e33318edd7 100644 --- a/packages/dashmate/src/listr/tasks/ssl/letsencrypt/obtainLetsEncryptCertificateTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/ssl/letsencrypt/obtainLetsEncryptCertificateTaskFactory.js @@ -36,6 +36,39 @@ export default function obtainLetsEncryptCertificateTaskFactory( */ function obtainLetsEncryptCertificateTask(config) { return new Listr([ + { + title: 'Initialize configuration', + task: async (ctx) => { + // Always load config values (needed even when --force is used) + ctx.email = config.get('platform.gateway.ssl.providerConfigs.letsencrypt.email'); + ctx.externalIp = config.get('externalIp'); + ctx.legoDir = homeDir.joinPath(config.getName(), 'platform', 'gateway', 'lego'); + ctx.sslConfigDir = homeDir.joinPath(config.getName(), 'platform', 'gateway', 'ssl'); + + if (!ctx.email) { + throw new Error("Let's Encrypt email is not set. Please set it in the config file"); + } + + if (!ctx.externalIp) { + throw new Error('External IP is not set. Please set it in the config file'); + } + + // Ensure lego directories exist + fs.mkdirSync(ctx.legoDir, { recursive: true }); + fs.mkdirSync(path.join(ctx.legoDir, 'certificates'), { recursive: true }); + fs.mkdirSync(path.join(ctx.legoDir, 'accounts'), { recursive: true }); + + // Set paths + ctx.legoCertPath = path.join(ctx.legoDir, 'certificates', `${ctx.externalIp}.crt`); + ctx.legoKeyPath = path.join(ctx.legoDir, 'certificates', `${ctx.externalIp}.key`); + + // When force is used, skip validation and obtain new certificate + if (ctx.force) { + ctx.certificateValid = false; + ctx.isRenewal = false; + } + }, + }, { title: 'Check if certificate already exists and is valid', skip: (ctx) => ctx.force, @@ -43,11 +76,12 @@ export default function obtainLetsEncryptCertificateTaskFactory( const expirationDays = ctx.expirationDays ?? LegoCertificate.EXPIRATION_LIMIT_DAYS; const { error, data } = await validateLetsEncryptCertificate(config, expirationDays); - Object.assign(ctx, data); - - // Ensure lego directory exists - fs.mkdirSync(ctx.legoDir, { recursive: true }); - fs.mkdirSync(path.join(ctx.legoDir, 'certificates'), { recursive: true }); + // Merge validation data (but don't overwrite already-set values) + Object.keys(data).forEach((key) => { + if (ctx[key] === undefined) { + ctx[key] = data[key]; + } + }); switch (error) { case undefined: @@ -109,6 +143,7 @@ export default function obtainLetsEncryptCertificateTaskFactory( // Build lego command arguments // --disable-cn is needed for IP address certificates + // --key-type rsa2048 is needed because node-forge doesn't support ECDSA const legoArgs = [ '--server=https://acme-v02.api.letsencrypt.org/directory', '--email', ctx.email, @@ -117,15 +152,15 @@ export default function obtainLetsEncryptCertificateTaskFactory( '--http.port', ':80', '--domains', ctx.externalIp, '--disable-cn', + '--key-type', 'rsa2048', '--path', '/data', command, ]; - // Add profile for initial run - if (!ctx.isRenewal) { - legoArgs.push('--profile', 'shortlived'); - } else { - // For renewal, renew if within 30 days of expiry (default) + // shortlived profile is required for IP address certificates + legoArgs.push('--profile', 'shortlived'); + + if (ctx.isRenewal) { legoArgs.push('--days', '30'); } diff --git a/packages/dashpay-contract/package.json b/packages/dashpay-contract/package.json index a68f2f5c167..f469487b8b5 100644 --- a/packages/dashpay-contract/package.json +++ b/packages/dashpay-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dashpay-contract", - "version": "3.0.0", + "version": "3.0.1", "description": "Reference contract of the DashPay DPA on Dash Evolution", "scripts": { "lint": "eslint .", diff --git a/packages/dpns-contract/package.json b/packages/dpns-contract/package.json index f750ff48056..0d4b42b5ad5 100644 --- a/packages/dpns-contract/package.json +++ b/packages/dpns-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dpns-contract", - "version": "3.0.0", + "version": "3.0.1", "description": "A contract and helper scripts for DPNS DApp", "scripts": { "lint": "eslint .", diff --git a/packages/feature-flags-contract/package.json b/packages/feature-flags-contract/package.json index 97272535ae8..fab64a1c916 100644 --- a/packages/feature-flags-contract/package.json +++ b/packages/feature-flags-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/feature-flags-contract", - "version": "3.0.0", + "version": "3.0.1", "description": "Data Contract to store Dash Platform feature flags", "scripts": { "build": "", diff --git a/packages/js-dapi-client/package.json b/packages/js-dapi-client/package.json index 1b221d47fcb..c5bfdec4129 100644 --- a/packages/js-dapi-client/package.json +++ b/packages/js-dapi-client/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/dapi-client", - "version": "3.0.0", + "version": "3.0.1", "description": "Client library used to access Dash DAPI endpoints", "main": "lib/index.js", "contributors": [ diff --git a/packages/js-dash-sdk/package.json b/packages/js-dash-sdk/package.json index 8e93df5d926..817af5da502 100644 --- a/packages/js-dash-sdk/package.json +++ b/packages/js-dash-sdk/package.json @@ -1,6 +1,6 @@ { "name": "dash", - "version": "6.0.0", + "version": "6.0.1", "description": "Dash library for JavaScript/TypeScript ecosystem (Wallet, DAPI, Primitives, BLS, ...)", "main": "build/index.js", "unpkg": "dist/dash.min.js", diff --git a/packages/js-evo-sdk/package.json b/packages/js-evo-sdk/package.json index 015380b4911..b933d146ea8 100644 --- a/packages/js-evo-sdk/package.json +++ b/packages/js-evo-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/evo-sdk", - "version": "3.0.0", + "version": "3.0.1", "type": "module", "main": "./dist/evo-sdk.module.js", "types": "./dist/sdk.d.ts", diff --git a/packages/js-grpc-common/package.json b/packages/js-grpc-common/package.json index 6d112edc0dd..196945aeef7 100644 --- a/packages/js-grpc-common/package.json +++ b/packages/js-grpc-common/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/grpc-common", - "version": "3.0.0", + "version": "3.0.1", "description": "Common GRPC library", "main": "index.js", "scripts": { diff --git a/packages/keyword-search-contract/package.json b/packages/keyword-search-contract/package.json index cdc3a067bb6..c9a38cf40e2 100644 --- a/packages/keyword-search-contract/package.json +++ b/packages/keyword-search-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/keyword-search-contract", - "version": "3.0.0", + "version": "3.0.1", "description": "A contract that allows searching for contracts", "scripts": { "lint": "eslint .", diff --git a/packages/masternode-reward-shares-contract/package.json b/packages/masternode-reward-shares-contract/package.json index 5c0d6d8fcae..309dd07c0e0 100644 --- a/packages/masternode-reward-shares-contract/package.json +++ b/packages/masternode-reward-shares-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/masternode-reward-shares-contract", - "version": "3.0.0", + "version": "3.0.1", "description": "A contract and helper scripts for reward sharing", "scripts": { "lint": "eslint .", diff --git a/packages/platform-test-suite/package.json b/packages/platform-test-suite/package.json index 56d6f828284..80d9447b1f2 100644 --- a/packages/platform-test-suite/package.json +++ b/packages/platform-test-suite/package.json @@ -1,7 +1,7 @@ { "name": "@dashevo/platform-test-suite", "private": true, - "version": "3.0.0", + "version": "3.0.1", "description": "Dash Network end-to-end tests", "scripts": { "test": "yarn exec bin/test.sh", diff --git a/packages/rs-sdk/tests/vectors/test_fetch_address_info/quorum_pubkey-106-3f54d536a6c29767dd83acf116cb7f3743e11f8d61eb4ee5e5720bfa867171fc.json b/packages/rs-sdk/tests/vectors/test_fetch_address_info/quorum_pubkey-106-3f54d536a6c29767dd83acf116cb7f3743e11f8d61eb4ee5e5720bfa867171fc.json new file mode 100644 index 00000000000..03c9343bb76 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_fetch_address_info/quorum_pubkey-106-3f54d536a6c29767dd83acf116cb7f3743e11f8d61eb4ee5e5720bfa867171fc.json @@ -0,0 +1 @@ +89fd8b32066db8e2822fa8fcb054dbb11f9bcdff3f166d2e05abec5068121d724fba1977319b7ffd1d6d44091c256d97 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_fetch_addresses_infos/quorum_pubkey-106-364421c45be18cc07a7300c9c038f5cac1f47552c7ac98cd8d1ed4d9552cbfd6.json b/packages/rs-sdk/tests/vectors/test_fetch_addresses_infos/quorum_pubkey-106-364421c45be18cc07a7300c9c038f5cac1f47552c7ac98cd8d1ed4d9552cbfd6.json new file mode 100644 index 00000000000..486a4829042 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_fetch_addresses_infos/quorum_pubkey-106-364421c45be18cc07a7300c9c038f5cac1f47552c7ac98cd8d1ed4d9552cbfd6.json @@ -0,0 +1 @@ +a7237782fa99ef5752f9f6c63baef59979305ac405db3746276f7ec4386b94a1e255a97835c106f67e2848d70c1f1eb3 \ No newline at end of file diff --git a/packages/rs-sdk/tests/vectors/test_sync_address_balances/quorum_pubkey-106-364421c45be18cc07a7300c9c038f5cac1f47552c7ac98cd8d1ed4d9552cbfd6.json b/packages/rs-sdk/tests/vectors/test_sync_address_balances/quorum_pubkey-106-364421c45be18cc07a7300c9c038f5cac1f47552c7ac98cd8d1ed4d9552cbfd6.json new file mode 100644 index 00000000000..486a4829042 --- /dev/null +++ b/packages/rs-sdk/tests/vectors/test_sync_address_balances/quorum_pubkey-106-364421c45be18cc07a7300c9c038f5cac1f47552c7ac98cd8d1ed4d9552cbfd6.json @@ -0,0 +1 @@ +a7237782fa99ef5752f9f6c63baef59979305ac405db3746276f7ec4386b94a1e255a97835c106f67e2848d70c1f1eb3 \ No newline at end of file diff --git a/packages/token-history-contract/package.json b/packages/token-history-contract/package.json index 9ea493bd468..fc5d9ef6641 100644 --- a/packages/token-history-contract/package.json +++ b/packages/token-history-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/token-history-contract", - "version": "3.0.0", + "version": "3.0.1", "description": "The token history contract", "scripts": { "lint": "eslint .", diff --git a/packages/wallet-lib/package.json b/packages/wallet-lib/package.json index a3cee4f6229..b85aac59baa 100644 --- a/packages/wallet-lib/package.json +++ b/packages/wallet-lib/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-lib", - "version": "10.0.0", + "version": "10.0.1", "description": "Light wallet library for Dash", "main": "src/index.js", "unpkg": "dist/wallet-lib.min.js", diff --git a/packages/wallet-utils-contract/package.json b/packages/wallet-utils-contract/package.json index 51359afe09f..b4cd717c0a2 100644 --- a/packages/wallet-utils-contract/package.json +++ b/packages/wallet-utils-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wallet-utils-contract", - "version": "3.0.0", + "version": "3.0.1", "description": "A contract and helper scripts for Wallet DApp", "scripts": { "lint": "eslint .", diff --git a/packages/wasm-dpp/package.json b/packages/wasm-dpp/package.json index 2e7f2cd050d..a82a7060527 100644 --- a/packages/wasm-dpp/package.json +++ b/packages/wasm-dpp/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp", - "version": "3.0.0", + "version": "3.0.1", "description": "The JavaScript implementation of the Dash Platform Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/wasm-dpp2/package.json b/packages/wasm-dpp2/package.json index bcf14dd0e24..6025d92b080 100644 --- a/packages/wasm-dpp2/package.json +++ b/packages/wasm-dpp2/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-dpp2", - "version": "3.0.0", + "version": "3.0.1", "type": "module", "main": "./dist/dpp.js", "types": "./dist/dpp.d.ts", diff --git a/packages/wasm-drive-verify/package.json b/packages/wasm-drive-verify/package.json index b3a9966f7a1..d284052e9c9 100644 --- a/packages/wasm-drive-verify/package.json +++ b/packages/wasm-drive-verify/package.json @@ -3,7 +3,7 @@ "collaborators": [ "Dash Core Group " ], - "version": "3.0.0", + "version": "3.0.1", "license": "MIT", "description": "WASM bindings for Drive verify functions", "repository": { diff --git a/packages/wasm-sdk/package.json b/packages/wasm-sdk/package.json index 26b1be58844..541a6571152 100644 --- a/packages/wasm-sdk/package.json +++ b/packages/wasm-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/wasm-sdk", - "version": "3.0.0", + "version": "3.0.1", "type": "module", "main": "./dist/sdk.js", "types": "./dist/sdk.d.ts", diff --git a/packages/withdrawals-contract/package.json b/packages/withdrawals-contract/package.json index 43c3a33f89e..5711f2fe5c4 100644 --- a/packages/withdrawals-contract/package.json +++ b/packages/withdrawals-contract/package.json @@ -1,6 +1,6 @@ { "name": "@dashevo/withdrawals-contract", - "version": "3.0.0", + "version": "3.0.1", "description": "Data Contract to manipulate and track withdrawals", "scripts": { "build": "",