diff --git a/.pnp.cjs b/.pnp.cjs index 085293c6b1e..bbafabdf957 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -3620,6 +3620,41 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["wrap-ansi", "npm:7.0.0"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:1.26.2", {\ + "packageLocation": "./.yarn/cache/@oclif-core-npm-1.26.2-6e8f4423c3-1da7f22fff.zip/node_modules/@oclif/core/",\ + "packageDependencies": [\ + ["@oclif/core", "npm:1.26.2"],\ + ["@oclif/linewrap", "npm:1.0.0"],\ + ["@oclif/screen", "npm:3.0.4"],\ + ["ansi-escapes", "npm:4.3.2"],\ + ["ansi-styles", "npm:4.3.0"],\ + ["cardinal", "npm:2.1.1"],\ + ["chalk", "npm:4.1.2"],\ + ["clean-stack", "npm:3.0.1"],\ + ["cli-progress", "npm:3.10.0"],\ + ["debug", "virtual:da6319fb8ee6999f0780eb633cb928f5c3591495496bf4772d10fe1fe1a6bdb4d9da75848709ecbee87ebbe810b9042e34151e541b86413683541ebf018679fa#npm:4.3.4"],\ + ["ejs", "npm:3.1.8"],\ + ["fs-extra", "npm:9.1.0"],\ + ["get-package-type", "npm:0.1.0"],\ + ["globby", "npm:11.1.0"],\ + ["hyperlinker", "npm:1.0.0"],\ + ["indent-string", "npm:4.0.0"],\ + ["is-wsl", "npm:2.2.0"],\ + ["js-yaml", "npm:3.14.1"],\ + ["natural-orderby", "npm:2.0.3"],\ + ["object-treeify", "npm:1.1.33"],\ + ["password-prompt", "npm:1.1.2"],\ + ["semver", "npm:7.3.8"],\ + ["string-width", "npm:4.2.3"],\ + ["strip-ansi", "npm:6.0.1"],\ + ["supports-color", "npm:8.1.1"],\ + ["supports-hyperlinks", "npm:2.2.0"],\ + ["tslib", "npm:2.4.1"],\ + ["widest-line", "npm:3.1.0"],\ + ["wrap-ansi", "npm:7.0.0"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@oclif/linewrap", [\ @@ -3677,6 +3712,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@oclif/screen", "npm:3.0.3"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:3.0.4", {\ + "packageLocation": "./.yarn/cache/@oclif-screen-npm-3.0.4-d372fa56f8-6d662c81ed.zip/node_modules/@oclif/screen/",\ + "packageDependencies": [\ + ["@oclif/screen", "npm:3.0.4"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@octokit/auth-token", [\ @@ -8024,7 +8066,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@dashevo/oclif", "npm:1.0.2"],\ ["@dashevo/wallet-lib", "workspace:packages/wallet-lib"],\ ["@dashevo/withdrawals-contract", "workspace:packages/withdrawals-contract"],\ - ["@oclif/core", "npm:1.22.0"],\ + ["@oclif/core", "npm:1.26.2"],\ ["@oclif/plugin-help", "npm:5.1.20"],\ ["ajv", "npm:8.8.1"],\ ["ajv-formats", "virtual:58fb68f2aed20e5e0f2e48520ab903ae9bb3440369bfd5e912034003cf27c5aae368649fc5620dd2acbed578131f3a0975e75b838d77d12335fb0412e24026c6#npm:2.1.1"],\ diff --git a/.yarn/cache/@oclif-core-npm-1.26.2-6e8f4423c3-1da7f22fff.zip b/.yarn/cache/@oclif-core-npm-1.26.2-6e8f4423c3-1da7f22fff.zip new file mode 100644 index 00000000000..22b0f522690 Binary files /dev/null and b/.yarn/cache/@oclif-core-npm-1.26.2-6e8f4423c3-1da7f22fff.zip differ diff --git a/.yarn/cache/@oclif-screen-npm-3.0.4-d372fa56f8-6d662c81ed.zip b/.yarn/cache/@oclif-screen-npm-3.0.4-d372fa56f8-6d662c81ed.zip new file mode 100644 index 00000000000..cdfe3c1804f Binary files /dev/null and b/.yarn/cache/@oclif-screen-npm-3.0.4-d372fa56f8-6d662c81ed.zip differ diff --git a/packages/dashmate/configs/migrations.js b/packages/dashmate/configs/migrations.js index f68e767fd02..b192c025c1a 100644 --- a/packages/dashmate/configs/migrations.js +++ b/packages/dashmate/configs/migrations.js @@ -512,4 +512,26 @@ module.exports = { return configFile; }, + '0.24.0-dev.18': (configFile) => { + let groupJsonApiPort = systemConfigs.local.dashmate.helper.api.port; + + Object.entries(configFile.configs) + .forEach(([, config]) => { + if (config.group === 'local') { + config.dashmate.helper.api = { + enable: false, + port: groupJsonApiPort, + }; + + groupJsonApiPort += 100; + } else { + config.dashmate.helper.api = { + enable: false, + port: systemConfigs.base.dashmate.helper.api.port, + }; + } + }); + + return configFile; + }, }; diff --git a/packages/dashmate/configs/schema/configJsonSchema.js b/packages/dashmate/configs/schema/configJsonSchema.js index 185ac3cbbd3..e3d2b5df070 100644 --- a/packages/dashmate/configs/schema/configJsonSchema.js +++ b/packages/dashmate/configs/schema/configJsonSchema.js @@ -669,8 +669,21 @@ module.exports = { docker: { $ref: '#/definitions/docker', }, + api: { + type: 'object', + properties: { + enable: { + type: 'boolean', + }, + port: { + $ref: '#/definitions/port', + }, + }, + required: ['enable', 'port'], + additionalProperties: false, + }, }, - required: ['docker'], + required: ['docker', 'api'], additionalProperties: false, }, }, diff --git a/packages/dashmate/configs/system/base.js b/packages/dashmate/configs/system/base.js index 79a87c4a5d0..f56da30b312 100644 --- a/packages/dashmate/configs/system/base.js +++ b/packages/dashmate/configs/system/base.js @@ -235,6 +235,10 @@ module.exports = { docker: { image: 'dashpay/dashmate-helper:0.24-dev', }, + api: { + enable: false, + port: 9000, + }, }, }, externalIp: null, diff --git a/packages/dashmate/configs/system/local.js b/packages/dashmate/configs/system/local.js index 1c9d9e169d1..c3b38e0717a 100644 --- a/packages/dashmate/configs/system/local.js +++ b/packages/dashmate/configs/system/local.js @@ -48,6 +48,13 @@ module.exports = lodashMerge({}, baseConfig, { }, }, }, + dashmate: { + helper: { + api: { + port: 9100, + }, + }, + }, externalIp: null, environment: 'development', network: NETWORK_LOCAL, diff --git a/packages/dashmate/docker-compose.platform.yml b/packages/dashmate/docker-compose.platform.yml index 3f5e213a116..cea12457a63 100644 --- a/packages/dashmate/docker-compose.platform.yml +++ b/packages/dashmate/docker-compose.platform.yml @@ -121,6 +121,8 @@ services: - DASHMATE_HOME_DIR=/home/dashmate/.dashmate - LOCAL_UID=${LOCAL_UID:?err} - LOCAL_GID=${LOCAL_GID:?err} + ports: + - ${DASHMATE_HELPER_API_PORT:?err}:${DASHMATE_HELPER_API_PORT:?err} command: yarn workspace dashmate helper ${CONFIG_NAME:?err} volumes: - ${DASHMATE_HOME_DIR:?err}:/home/dashmate/.dashmate diff --git a/packages/dashmate/package.json b/packages/dashmate/package.json index 29234537e1c..23803e82392 100644 --- a/packages/dashmate/package.json +++ b/packages/dashmate/package.json @@ -58,7 +58,7 @@ "@dashevo/masternode-reward-shares-contract": "workspace:*", "@dashevo/wallet-lib": "workspace:*", "@dashevo/withdrawals-contract": "workspace:*", - "@oclif/core": "^1.21.0", + "@oclif/core": "^1.25.0", "@oclif/plugin-help": "^5.1.20", "ajv": "^8.6.0", "ajv-formats": "^2.1.1", diff --git a/packages/dashmate/scripts/helper.js b/packages/dashmate/scripts/helper.js index c9bf7174317..c7c9403149b 100644 --- a/packages/dashmate/scripts/helper.js +++ b/packages/dashmate/scripts/helper.js @@ -27,13 +27,13 @@ const createDIContainer = require('../src/createDIContainer'); const configFile = await configFileRepository.read(); + const config = configFile.getConfig(configName); + // Register config collection in the container container.register({ configFile: asValue(configFile), }); - const config = configFile.getConfig(configName); - const provider = config.get('platform.dapi.envoy.ssl.provider'); if (provider === 'zerossl') { @@ -43,4 +43,16 @@ const createDIContainer = require('../src/createDIContainer'); // prevent infinite restarts setInterval(() => {}, 60 * 1000); } + + if (config.get('dashmate.helper.api.enable')) { + const createHttpApiServer = container.resolve('createHttpApiServer'); + + const httpAPIServer = createHttpApiServer(); + + const port = config.get('dashmate.helper.api.port'); + + httpAPIServer + // eslint-disable-next-line no-console + .listen(port, () => console.log(`Dashmate JSON-RPC API started on port ${port}`)); + } }()); diff --git a/packages/dashmate/src/createDIContainer.js b/packages/dashmate/src/createDIContainer.js index 8f2207521f4..7d36704f686 100644 --- a/packages/dashmate/src/createDIContainer.js +++ b/packages/dashmate/src/createDIContainer.js @@ -92,6 +92,7 @@ const scheduleRenewZeroSslCertificateFactory = require('./helper/scheduleRenewZe const registerMasternodeGuideTaskFactory = require('./listr/tasks/setup/regular/registerMasternodeGuideTaskFactory'); const configureNodeTaskFactory = require('./listr/tasks/setup/regular/configureNodeTaskFactory'); const configureSSLCertificateTaskFactory = require('./listr/tasks/setup/regular/configureSSLCertificateTaskFactory'); +const createHttpApiServerFactory = require('./helper/api/createHttpApiServerFactory'); async function createDIContainer() { const container = createAwilixContainer({ @@ -236,6 +237,7 @@ async function createDIContainer() { */ container.register({ scheduleRenewZeroSslCertificate: asFunction(scheduleRenewZeroSslCertificateFactory).singleton(), + createHttpApiServer: asFunction(createHttpApiServerFactory).singleton(), }); return container; diff --git a/packages/dashmate/src/helper/api/createHttpApiServerFactory.js b/packages/dashmate/src/helper/api/createHttpApiServerFactory.js new file mode 100644 index 00000000000..2f2db5f01ed --- /dev/null +++ b/packages/dashmate/src/helper/api/createHttpApiServerFactory.js @@ -0,0 +1,38 @@ +const jayson = require('jayson/promise'); +const oclif = require('@oclif/core'); + +function createHttpApiServerFactory() { + /** + * @return {HttpServer} + */ + function createHttpApiServer() { + const server = new jayson.Server({}, { + router(method, params) { + const argv = method.split(' '); + + // map arguments to argv + if (Array.isArray(params)) { + argv.push(...params); + } else { + for (const [name, value] of Object.entries(params)) { + argv.push(`--${name}=${value}`); + } + } + + return new jayson.Method(async () => { + try { + return await oclif.run([...argv]); + } catch (e) { + throw server.error(501, e.message); + } + }); + }, + }); + + return server.http(); + } + + return createHttpApiServer; +} + +module.exports = createHttpApiServerFactory; diff --git a/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js b/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js index 437cda27d52..023affc64cc 100644 --- a/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js +++ b/packages/dashmate/src/listr/tasks/setup/setupLocalPresetTaskFactory.js @@ -244,6 +244,8 @@ function setupLocalPresetTaskFactory( masternodeRewardSharesDerivedSecondPrivateKey.privateKey .toPublicKey().toString(), ); + + config.set('dashmate.helper.api.port', config.get('dashmate.helper.api.port') + (i * 100)); } }, options: { diff --git a/packages/dashmate/src/printers/printArrayOfObjects.js b/packages/dashmate/src/printers/printArrayOfObjects.js index 63bd50e10ce..26213d2ce34 100644 --- a/packages/dashmate/src/printers/printArrayOfObjects.js +++ b/packages/dashmate/src/printers/printArrayOfObjects.js @@ -36,6 +36,8 @@ function printArrayOfObjects(array, format) { // eslint-disable-next-line no-console console.log(output); + + return output; } module.exports = printArrayOfObjects; diff --git a/packages/dashmate/src/printers/printObject.js b/packages/dashmate/src/printers/printObject.js index 05f2a67d2ae..32149006b61 100644 --- a/packages/dashmate/src/printers/printObject.js +++ b/packages/dashmate/src/printers/printObject.js @@ -29,6 +29,8 @@ function printObject(object, format) { // eslint-disable-next-line no-console console.log(output); + + return output; } module.exports = printObject; diff --git a/packages/js-drive/Dockerfile b/packages/js-drive/Dockerfile index 0dfb7f69180..de6549a3623 100644 --- a/packages/js-drive/Dockerfile +++ b/packages/js-drive/Dockerfile @@ -68,6 +68,7 @@ COPY packages/rs-drive packages/rs-drive COPY packages/rs-drive-abci packages/rs-drive-abci COPY packages/rs-platform-value packages/rs-platform-value COPY packages/rs-drive-nodejs packages/rs-drive-nodejs +COPY packages/rs-drive-verify-c-binding packages/rs-drive-verify-c-binding COPY packages/dapi-grpc packages/dapi-grpc COPY packages/js-dpp packages/js-dpp COPY packages/js-grpc-common packages/js-grpc-common diff --git a/yarn.lock b/yarn.lock index 0ce19069ba3..c3653470364 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2502,6 +2502,42 @@ __metadata: languageName: node linkType: hard +"@oclif/core@npm:^1.25.0": + version: 1.26.2 + resolution: "@oclif/core@npm:1.26.2" + dependencies: + "@oclif/linewrap": ^1.0.0 + "@oclif/screen": ^3.0.4 + ansi-escapes: ^4.3.2 + ansi-styles: ^4.3.0 + cardinal: ^2.1.1 + chalk: ^4.1.2 + clean-stack: ^3.0.1 + cli-progress: ^3.10.0 + debug: ^4.3.4 + ejs: ^3.1.6 + fs-extra: ^9.1.0 + get-package-type: ^0.1.0 + globby: ^11.1.0 + hyperlinker: ^1.0.0 + indent-string: ^4.0.0 + is-wsl: ^2.2.0 + js-yaml: ^3.14.1 + natural-orderby: ^2.0.3 + object-treeify: ^1.1.33 + password-prompt: ^1.1.2 + semver: ^7.3.7 + string-width: ^4.2.3 + strip-ansi: ^6.0.1 + supports-color: ^8.1.1 + supports-hyperlinks: ^2.2.0 + tslib: ^2.4.1 + widest-line: ^3.1.0 + wrap-ansi: ^7.0.0 + checksum: 1da7f22fff1eb4bba10f17f07a97bad308d317a0b591561be7f1171edff2f40bf84830295965b26cfcb80d3c5df7958df35bbbba4ce030e14a68bbc8e3cedc82 + languageName: node + linkType: hard + "@oclif/linewrap@npm:^1.0.0": version: 1.0.0 resolution: "@oclif/linewrap@npm:1.0.0" @@ -2552,6 +2588,13 @@ __metadata: languageName: node linkType: hard +"@oclif/screen@npm:^3.0.4": + version: 3.0.4 + resolution: "@oclif/screen@npm:3.0.4" + checksum: 6d662c81edfbc8acb50a30001e3c2261171e8baffcd6010603c331de375c5d0c9ce6b3230f6b0ce24961bfa3531f99e771265ea74d9d7a0ee37fb9357fb436a7 + languageName: node + linkType: hard + "@octokit/auth-token@npm:^2.4.4": version: 2.5.0 resolution: "@octokit/auth-token@npm:2.5.0" @@ -5979,7 +6022,7 @@ __metadata: "@dashevo/oclif": ^1.0.2 "@dashevo/wallet-lib": "workspace:*" "@dashevo/withdrawals-contract": "workspace:*" - "@oclif/core": ^1.21.0 + "@oclif/core": ^1.25.0 "@oclif/plugin-help": ^5.1.20 ajv: ^8.6.0 ajv-formats: ^2.1.1