movehat 0.1.8 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/__tests__/deployContract.test.d.ts +2 -0
- package/dist/__tests__/deployContract.test.d.ts.map +1 -0
- package/dist/__tests__/deployContract.test.js +368 -0
- package/dist/__tests__/deployContract.test.js.map +1 -0
- package/dist/__tests__/errors.test.d.ts +2 -0
- package/dist/__tests__/errors.test.d.ts.map +1 -0
- package/dist/__tests__/errors.test.js +46 -0
- package/dist/__tests__/errors.test.js.map +1 -0
- package/dist/__tests__/fixtures/sigint-deploy-harness.d.ts +24 -0
- package/dist/__tests__/fixtures/sigint-deploy-harness.d.ts.map +1 -0
- package/dist/__tests__/fixtures/sigint-deploy-harness.js +82 -0
- package/dist/__tests__/fixtures/sigint-deploy-harness.js.map +1 -0
- package/dist/__tests__/fork/api.test.d.ts +2 -0
- package/dist/__tests__/fork/api.test.d.ts.map +1 -0
- package/dist/__tests__/fork/api.test.js +110 -0
- package/dist/__tests__/fork/api.test.js.map +1 -0
- package/dist/__tests__/harness/Harness.createLive.test.d.ts +2 -0
- package/dist/__tests__/harness/Harness.createLive.test.d.ts.map +1 -0
- package/dist/__tests__/harness/Harness.createLive.test.js +53 -0
- package/dist/__tests__/harness/Harness.createLive.test.js.map +1 -0
- package/dist/__tests__/harness/Harness.proxy.test.d.ts +2 -0
- package/dist/__tests__/harness/Harness.proxy.test.d.ts.map +1 -0
- package/dist/__tests__/harness/Harness.proxy.test.js +93 -0
- package/dist/__tests__/harness/Harness.proxy.test.js.map +1 -0
- package/dist/__tests__/harness/_fixture.d.ts +54 -0
- package/dist/__tests__/harness/_fixture.d.ts.map +1 -0
- package/dist/__tests__/harness/_fixture.js +69 -0
- package/dist/__tests__/harness/_fixture.js.map +1 -0
- package/dist/__tests__/harness/codeObject.deploy.test.d.ts +2 -0
- package/dist/__tests__/harness/codeObject.deploy.test.d.ts.map +1 -0
- package/dist/__tests__/harness/codeObject.deploy.test.js +288 -0
- package/dist/__tests__/harness/codeObject.deploy.test.js.map +1 -0
- package/dist/__tests__/harness/codeObject.upgrade.test.d.ts +2 -0
- package/dist/__tests__/harness/codeObject.upgrade.test.d.ts.map +1 -0
- package/dist/__tests__/harness/codeObject.upgrade.test.js +138 -0
- package/dist/__tests__/harness/codeObject.upgrade.test.js.map +1 -0
- package/dist/__tests__/harness/script.test.d.ts +2 -0
- package/dist/__tests__/harness/script.test.d.ts.map +1 -0
- package/dist/__tests__/harness/script.test.js +219 -0
- package/dist/__tests__/harness/script.test.js.map +1 -0
- package/dist/__tests__/harness/view.test.d.ts +2 -0
- package/dist/__tests__/harness/view.test.d.ts.map +1 -0
- package/dist/__tests__/harness/view.test.js +92 -0
- package/dist/__tests__/harness/view.test.js.map +1 -0
- package/dist/__tests__/runtime.test.d.ts +2 -0
- package/dist/__tests__/runtime.test.d.ts.map +1 -0
- package/dist/__tests__/runtime.test.js +141 -0
- package/dist/__tests__/runtime.test.js.map +1 -0
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/__tests__/compile.test.d.ts +2 -0
- package/dist/commands/__tests__/compile.test.d.ts.map +1 -0
- package/dist/commands/__tests__/compile.test.js +351 -0
- package/dist/commands/__tests__/compile.test.js.map +1 -0
- package/dist/commands/__tests__/init.test.d.ts +2 -0
- package/dist/commands/__tests__/init.test.d.ts.map +1 -0
- package/dist/commands/__tests__/init.test.js +101 -0
- package/dist/commands/__tests__/init.test.js.map +1 -0
- package/dist/commands/__tests__/run.test.d.ts +2 -0
- package/dist/commands/__tests__/run.test.d.ts.map +1 -0
- package/dist/commands/__tests__/run.test.js +166 -0
- package/dist/commands/__tests__/run.test.js.map +1 -0
- package/dist/commands/__tests__/test-move.test.d.ts +2 -0
- package/dist/commands/__tests__/test-move.test.d.ts.map +1 -0
- package/dist/commands/__tests__/test-move.test.js +59 -0
- package/dist/commands/__tests__/test-move.test.js.map +1 -0
- package/dist/commands/__tests__/test.test.d.ts +2 -0
- package/dist/commands/__tests__/test.test.d.ts.map +1 -0
- package/dist/commands/__tests__/test.test.js +168 -0
- package/dist/commands/__tests__/test.test.js.map +1 -0
- package/dist/commands/__tests__/update.test.d.ts +2 -0
- package/dist/commands/__tests__/update.test.d.ts.map +1 -0
- package/dist/commands/__tests__/update.test.js +176 -0
- package/dist/commands/__tests__/update.test.js.map +1 -0
- package/dist/commands/compile.d.ts +7 -1
- package/dist/commands/compile.d.ts.map +1 -1
- package/dist/commands/compile.js +150 -33
- package/dist/commands/compile.js.map +1 -1
- package/dist/commands/fork/__tests__/create.test.d.ts +2 -0
- package/dist/commands/fork/__tests__/create.test.d.ts.map +1 -0
- package/dist/commands/fork/__tests__/create.test.js +108 -0
- package/dist/commands/fork/__tests__/create.test.js.map +1 -0
- package/dist/commands/fork/__tests__/fund.test.d.ts +2 -0
- package/dist/commands/fork/__tests__/fund.test.d.ts.map +1 -0
- package/dist/commands/fork/__tests__/fund.test.js +72 -0
- package/dist/commands/fork/__tests__/fund.test.js.map +1 -0
- package/dist/commands/fork/__tests__/list.test.d.ts +2 -0
- package/dist/commands/fork/__tests__/list.test.d.ts.map +1 -0
- package/dist/commands/fork/__tests__/list.test.js +119 -0
- package/dist/commands/fork/__tests__/list.test.js.map +1 -0
- package/dist/commands/fork/__tests__/serve.test.d.ts +2 -0
- package/dist/commands/fork/__tests__/serve.test.d.ts.map +1 -0
- package/dist/commands/fork/__tests__/serve.test.js +97 -0
- package/dist/commands/fork/__tests__/serve.test.js.map +1 -0
- package/dist/commands/fork/__tests__/view-resource.test.d.ts +2 -0
- package/dist/commands/fork/__tests__/view-resource.test.d.ts.map +1 -0
- package/dist/commands/fork/__tests__/view-resource.test.js +77 -0
- package/dist/commands/fork/__tests__/view-resource.test.js.map +1 -0
- package/dist/commands/fork/create.d.ts +1 -1
- package/dist/commands/fork/create.d.ts.map +1 -1
- package/dist/commands/fork/create.js +3 -2
- package/dist/commands/fork/create.js.map +1 -1
- package/dist/commands/fork/fund.d.ts.map +1 -1
- package/dist/commands/fork/fund.js +15 -8
- package/dist/commands/fork/fund.js.map +1 -1
- package/dist/commands/fork/list.d.ts.map +1 -1
- package/dist/commands/fork/list.js +2 -1
- package/dist/commands/fork/list.js.map +1 -1
- package/dist/commands/fork/serve.d.ts +1 -0
- package/dist/commands/fork/serve.d.ts.map +1 -1
- package/dist/commands/fork/serve.js +4 -2
- package/dist/commands/fork/serve.js.map +1 -1
- package/dist/commands/fork/view-resource.d.ts.map +1 -1
- package/dist/commands/fork/view-resource.js +10 -5
- package/dist/commands/fork/view-resource.js.map +1 -1
- package/dist/commands/run.d.ts +15 -0
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +50 -27
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/test-move.d.ts.map +1 -1
- package/dist/commands/test-move.js +3 -2
- package/dist/commands/test-move.js.map +1 -1
- package/dist/commands/test.js +52 -46
- package/dist/commands/test.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +15 -13
- package/dist/commands/update.js.map +1 -1
- package/dist/core/AccountManager.d.ts +1 -1
- package/dist/core/AccountManager.d.ts.map +1 -1
- package/dist/core/AccountManager.js +20 -7
- package/dist/core/AccountManager.js.map +1 -1
- package/dist/core/Publisher.d.ts +31 -0
- package/dist/core/Publisher.d.ts.map +1 -0
- package/dist/core/Publisher.js +248 -0
- package/dist/core/Publisher.js.map +1 -0
- package/dist/core/__tests__/AccountManager.test.d.ts +2 -0
- package/dist/core/__tests__/AccountManager.test.d.ts.map +1 -0
- package/dist/core/__tests__/AccountManager.test.js +239 -0
- package/dist/core/__tests__/AccountManager.test.js.map +1 -0
- package/dist/core/__tests__/config.test.d.ts +2 -0
- package/dist/core/__tests__/config.test.d.ts.map +1 -0
- package/dist/core/__tests__/config.test.js +311 -0
- package/dist/core/__tests__/config.test.js.map +1 -0
- package/dist/core/__tests__/deployments.test.d.ts +2 -0
- package/dist/core/__tests__/deployments.test.d.ts.map +1 -0
- package/dist/core/__tests__/deployments.test.js +201 -0
- package/dist/core/__tests__/deployments.test.js.map +1 -0
- package/dist/core/__tests__/shell.test.d.ts +2 -0
- package/dist/core/__tests__/shell.test.d.ts.map +1 -0
- package/dist/core/__tests__/shell.test.js +107 -0
- package/dist/core/__tests__/shell.test.js.map +1 -0
- package/dist/core/config.d.ts +13 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +80 -11
- package/dist/core/config.js.map +1 -1
- package/dist/core/contract.d.ts +1 -1
- package/dist/core/contract.d.ts.map +1 -1
- package/dist/core/contract.js +15 -4
- package/dist/core/contract.js.map +1 -1
- package/dist/core/deployments.d.ts +2 -2
- package/dist/core/deployments.d.ts.map +1 -1
- package/dist/core/deployments.js +8 -6
- package/dist/core/deployments.js.map +1 -1
- package/dist/core/movementProfile.d.ts +34 -0
- package/dist/core/movementProfile.d.ts.map +1 -0
- package/dist/core/movementProfile.js +150 -0
- package/dist/core/movementProfile.js.map +1 -0
- package/dist/core/shell.d.ts +23 -7
- package/dist/core/shell.d.ts.map +1 -1
- package/dist/core/shell.js +32 -14
- package/dist/core/shell.js.map +1 -1
- package/dist/errors.d.ts +35 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +54 -0
- package/dist/errors.js.map +1 -1
- package/dist/fork/__tests__/manager.test.d.ts +2 -0
- package/dist/fork/__tests__/manager.test.d.ts.map +1 -0
- package/dist/fork/__tests__/manager.test.js +309 -0
- package/dist/fork/__tests__/manager.test.js.map +1 -0
- package/dist/fork/__tests__/server.test.d.ts +2 -0
- package/dist/fork/__tests__/server.test.d.ts.map +1 -0
- package/dist/fork/__tests__/server.test.js +54 -0
- package/dist/fork/__tests__/server.test.js.map +1 -0
- package/dist/fork/__tests__/storage.test.d.ts +2 -0
- package/dist/fork/__tests__/storage.test.d.ts.map +1 -0
- package/dist/fork/__tests__/storage.test.js +222 -0
- package/dist/fork/__tests__/storage.test.js.map +1 -0
- package/dist/fork/__tests__/test.test.d.ts +2 -0
- package/dist/fork/__tests__/test.test.d.ts.map +1 -0
- package/dist/fork/__tests__/test.test.js +81 -0
- package/dist/fork/__tests__/test.test.js.map +1 -0
- package/dist/fork/api.d.ts +14 -3
- package/dist/fork/api.d.ts.map +1 -1
- package/dist/fork/api.js +25 -14
- package/dist/fork/api.js.map +1 -1
- package/dist/fork/manager.d.ts +23 -9
- package/dist/fork/manager.d.ts.map +1 -1
- package/dist/fork/manager.js +79 -36
- package/dist/fork/manager.js.map +1 -1
- package/dist/fork/server.d.ts +11 -3
- package/dist/fork/server.d.ts.map +1 -1
- package/dist/fork/server.js +45 -13
- package/dist/fork/server.js.map +1 -1
- package/dist/fork/storage.d.ts +4 -4
- package/dist/fork/storage.d.ts.map +1 -1
- package/dist/fork/storage.js +7 -9
- package/dist/fork/storage.js.map +1 -1
- package/dist/fork/test.d.ts +13 -4
- package/dist/fork/test.d.ts.map +1 -1
- package/dist/fork/test.js +36 -27
- package/dist/fork/test.js.map +1 -1
- package/dist/harness/Harness.d.ts +124 -0
- package/dist/harness/Harness.d.ts.map +1 -0
- package/dist/harness/Harness.js +193 -0
- package/dist/harness/Harness.js.map +1 -0
- package/dist/harness/codeObject.d.ts +31 -0
- package/dist/harness/codeObject.d.ts.map +1 -0
- package/dist/harness/codeObject.js +271 -0
- package/dist/harness/codeObject.js.map +1 -0
- package/dist/harness/errors.d.ts +14 -0
- package/dist/harness/errors.d.ts.map +1 -0
- package/dist/harness/errors.js +22 -0
- package/dist/harness/errors.js.map +1 -0
- package/dist/harness/index.d.ts +4 -0
- package/dist/harness/index.d.ts.map +1 -0
- package/dist/harness/index.js +3 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/harness/proxy.d.ts +7 -0
- package/dist/harness/proxy.d.ts.map +1 -0
- package/dist/harness/proxy.js +36 -0
- package/dist/harness/proxy.js.map +1 -0
- package/dist/harness/script.d.ts +21 -0
- package/dist/harness/script.d.ts.map +1 -0
- package/dist/harness/script.js +155 -0
- package/dist/harness/script.js.map +1 -0
- package/dist/harness/view.d.ts +22 -0
- package/dist/harness/view.d.ts.map +1 -0
- package/dist/harness/view.js +28 -0
- package/dist/harness/view.js.map +1 -0
- package/dist/helpers/__tests__/semver-utils.test.d.ts +2 -0
- package/dist/helpers/__tests__/semver-utils.test.d.ts.map +1 -0
- package/dist/helpers/__tests__/semver-utils.test.js +103 -0
- package/dist/helpers/__tests__/semver-utils.test.js.map +1 -0
- package/dist/helpers/index.d.ts +3 -2
- package/dist/helpers/index.d.ts.map +1 -1
- package/dist/helpers/index.js +2 -2
- package/dist/helpers/index.js.map +1 -1
- package/dist/helpers/move-tests.d.ts +3 -3
- package/dist/helpers/move-tests.d.ts.map +1 -1
- package/dist/helpers/move-tests.js +21 -20
- package/dist/helpers/move-tests.js.map +1 -1
- package/dist/helpers/npm-registry.d.ts.map +1 -1
- package/dist/helpers/npm-registry.js +1 -3
- package/dist/helpers/npm-registry.js.map +1 -1
- package/dist/helpers/semver-utils.d.ts.map +1 -1
- package/dist/helpers/semver-utils.js +4 -3
- package/dist/helpers/semver-utils.js.map +1 -1
- package/dist/helpers/setup.d.ts.map +1 -1
- package/dist/helpers/setup.js +10 -6
- package/dist/helpers/setup.js.map +1 -1
- package/dist/helpers/setupLocalTesting.d.ts +32 -27
- package/dist/helpers/setupLocalTesting.d.ts.map +1 -1
- package/dist/helpers/setupLocalTesting.js +179 -180
- package/dist/helpers/setupLocalTesting.js.map +1 -1
- package/dist/helpers/testFixtures.d.ts +19 -53
- package/dist/helpers/testFixtures.d.ts.map +1 -1
- package/dist/helpers/testFixtures.js +89 -107
- package/dist/helpers/testFixtures.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/node/LocalNodeManager.d.ts +9 -1
- package/dist/node/LocalNodeManager.d.ts.map +1 -1
- package/dist/node/LocalNodeManager.js +75 -58
- package/dist/node/LocalNodeManager.js.map +1 -1
- package/dist/node/__tests__/LocalNodeManager.test.d.ts +2 -0
- package/dist/node/__tests__/LocalNodeManager.test.d.ts.map +1 -0
- package/dist/node/__tests__/LocalNodeManager.test.js +349 -0
- package/dist/node/__tests__/LocalNodeManager.test.js.map +1 -0
- package/dist/runtime.d.ts +12 -15
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +32 -241
- package/dist/runtime.js.map +1 -1
- package/dist/templates/README.md +1 -1
- package/dist/templates/movehat.config.ts +10 -0
- package/dist/templates/package.json +2 -1
- package/dist/templates/scripts/deploy-counter.ts +46 -38
- package/dist/templates/tests/Counter.test.ts +51 -51
- package/dist/templates/types/movehat.d.ts +6 -9
- package/dist/types/config.d.ts +8 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/fork.d.ts +7 -1
- package/dist/types/fork.d.ts.map +1 -1
- package/dist/types/harness.d.ts +166 -0
- package/dist/types/harness.d.ts.map +1 -0
- package/dist/types/harness.js +2 -0
- package/dist/types/harness.js.map +1 -0
- package/dist/types/runtime.d.ts +7 -1
- package/dist/types/runtime.d.ts.map +1 -1
- package/dist/ui/__tests__/colors.test.d.ts +2 -0
- package/dist/ui/__tests__/colors.test.d.ts.map +1 -0
- package/dist/ui/__tests__/colors.test.js +127 -0
- package/dist/ui/__tests__/colors.test.js.map +1 -0
- package/dist/ui/colors.d.ts.map +1 -1
- package/dist/ui/colors.js +6 -2
- package/dist/ui/colors.js.map +1 -1
- package/dist/ui/logger.d.ts +17 -0
- package/dist/ui/logger.d.ts.map +1 -1
- package/dist/ui/logger.js +22 -0
- package/dist/ui/logger.js.map +1 -1
- package/dist/ui/symbols.d.ts +1 -0
- package/dist/ui/symbols.d.ts.map +1 -1
- package/dist/ui/symbols.js +7 -1
- package/dist/ui/symbols.js.map +1 -1
- package/dist/utils/__tests__/address.test.d.ts +2 -0
- package/dist/utils/__tests__/address.test.d.ts.map +1 -0
- package/dist/utils/__tests__/address.test.js +70 -0
- package/dist/utils/__tests__/address.test.js.map +1 -0
- package/dist/utils/__tests__/childProcessAdapter.test.d.ts +2 -0
- package/dist/utils/__tests__/childProcessAdapter.test.d.ts.map +1 -0
- package/dist/utils/__tests__/childProcessAdapter.test.js +217 -0
- package/dist/utils/__tests__/childProcessAdapter.test.js.map +1 -0
- package/dist/utils/__tests__/runCli.test.d.ts +2 -0
- package/dist/utils/__tests__/runCli.test.d.ts.map +1 -0
- package/dist/utils/__tests__/runCli.test.js +187 -0
- package/dist/utils/__tests__/runCli.test.js.map +1 -0
- package/dist/utils/address.d.ts +33 -0
- package/dist/utils/address.d.ts.map +1 -0
- package/dist/utils/address.js +52 -0
- package/dist/utils/address.js.map +1 -0
- package/dist/utils/childProcessAdapter.d.ts +93 -0
- package/dist/utils/childProcessAdapter.d.ts.map +1 -0
- package/dist/utils/childProcessAdapter.js +109 -0
- package/dist/utils/childProcessAdapter.js.map +1 -0
- package/dist/utils/parseCliOutput.d.ts +20 -0
- package/dist/utils/parseCliOutput.d.ts.map +1 -0
- package/dist/utils/parseCliOutput.js +26 -0
- package/dist/utils/parseCliOutput.js.map +1 -0
- package/dist/utils/redact.d.ts +15 -0
- package/dist/utils/redact.d.ts.map +1 -0
- package/dist/utils/redact.js +24 -0
- package/dist/utils/redact.js.map +1 -0
- package/dist/utils/runCli.d.ts +24 -0
- package/dist/utils/runCli.d.ts.map +1 -0
- package/dist/utils/runCli.js +37 -0
- package/dist/utils/runCli.js.map +1 -0
- package/package.json +14 -4
- package/src/__tests__/deployContract.test.ts +429 -0
- package/src/__tests__/errors.test.ts +84 -0
- package/src/__tests__/fixtures/sigint-deploy-harness.ts +95 -0
- package/src/__tests__/fork/api.test.ts +143 -0
- package/src/__tests__/harness/Harness.createLive.test.ts +57 -0
- package/src/__tests__/harness/Harness.proxy.test.ts +115 -0
- package/src/__tests__/harness/_fixture.ts +131 -0
- package/src/__tests__/harness/codeObject.deploy.test.ts +319 -0
- package/src/__tests__/harness/codeObject.upgrade.test.ts +156 -0
- package/src/__tests__/harness/script.test.ts +245 -0
- package/src/__tests__/harness/view.test.ts +104 -0
- package/src/__tests__/runtime.test.ts +182 -0
- package/src/cli.ts +2 -1
- package/src/commands/__tests__/compile.test.ts +407 -0
- package/src/commands/__tests__/init.test.ts +125 -0
- package/src/commands/__tests__/run.test.ts +192 -0
- package/src/commands/__tests__/test-move.test.ts +81 -0
- package/src/commands/__tests__/test.test.ts +204 -0
- package/src/commands/__tests__/update.test.ts +223 -0
- package/src/commands/compile.ts +168 -32
- package/src/commands/fork/__tests__/create.test.ts +132 -0
- package/src/commands/fork/__tests__/fund.test.ts +104 -0
- package/src/commands/fork/__tests__/list.test.ts +139 -0
- package/src/commands/fork/__tests__/serve.test.ts +121 -0
- package/src/commands/fork/__tests__/view-resource.test.ts +101 -0
- package/src/commands/fork/create.ts +4 -3
- package/src/commands/fork/fund.ts +16 -9
- package/src/commands/fork/list.ts +3 -2
- package/src/commands/fork/serve.ts +6 -3
- package/src/commands/fork/view-resource.ts +11 -6
- package/src/commands/run.ts +54 -28
- package/src/commands/test-move.ts +4 -3
- package/src/commands/test.ts +56 -44
- package/src/commands/update.ts +19 -16
- package/src/core/AccountManager.ts +23 -10
- package/src/core/Publisher.ts +322 -0
- package/src/core/__tests__/AccountManager.test.ts +290 -0
- package/src/core/__tests__/config.test.ts +377 -0
- package/src/core/__tests__/deployments.test.ts +247 -0
- package/src/core/__tests__/shell.test.ts +138 -0
- package/src/core/config.ts +96 -12
- package/src/core/contract.ts +13 -4
- package/src/core/deployments.ts +13 -11
- package/src/core/movementProfile.ts +179 -0
- package/src/core/shell.ts +34 -14
- package/src/errors.ts +60 -0
- package/src/fork/__tests__/manager.test.ts +385 -0
- package/src/fork/__tests__/server.test.ts +65 -0
- package/src/fork/__tests__/storage.test.ts +281 -0
- package/src/fork/__tests__/test.test.ts +97 -0
- package/src/fork/api.ts +28 -14
- package/src/fork/manager.ts +88 -43
- package/src/fork/server.ts +53 -19
- package/src/fork/storage.ts +12 -15
- package/src/fork/test.ts +58 -32
- package/src/harness/Harness.ts +228 -0
- package/src/harness/codeObject.ts +388 -0
- package/src/harness/errors.ts +22 -0
- package/src/harness/index.ts +3 -0
- package/src/harness/proxy.ts +40 -0
- package/src/harness/script.ts +196 -0
- package/src/harness/view.ts +34 -0
- package/src/helpers/__tests__/semver-utils.test.ts +121 -0
- package/src/helpers/index.ts +2 -8
- package/src/helpers/move-tests.ts +27 -23
- package/src/helpers/npm-registry.ts +4 -3
- package/src/helpers/semver-utils.ts +4 -3
- package/src/helpers/setup.ts +9 -5
- package/src/helpers/setupLocalTesting.ts +219 -200
- package/src/helpers/testFixtures.ts +106 -118
- package/src/index.ts +9 -3
- package/src/node/LocalNodeManager.ts +87 -62
- package/src/node/__tests__/LocalNodeManager.test.ts +452 -0
- package/src/runtime.ts +33 -289
- package/src/templates/README.md +1 -1
- package/src/templates/movehat.config.ts +10 -0
- package/src/templates/package.json +2 -1
- package/src/templates/scripts/deploy-counter.ts +46 -38
- package/src/templates/tests/Counter.test.ts +51 -51
- package/src/templates/types/movehat.d.ts +6 -9
- package/src/types/config.ts +8 -0
- package/src/types/fork.ts +7 -1
- package/src/types/harness.ts +182 -0
- package/src/types/runtime.ts +11 -3
- package/src/ui/__tests__/colors.test.ts +156 -0
- package/src/ui/colors.ts +5 -2
- package/src/ui/logger.ts +22 -0
- package/src/ui/symbols.ts +7 -1
- package/src/utils/__tests__/address.test.ts +93 -0
- package/src/utils/__tests__/childProcessAdapter.test.ts +266 -0
- package/src/utils/__tests__/runCli.test.ts +240 -0
- package/src/utils/address.ts +56 -0
- package/src/utils/childProcessAdapter.ts +215 -0
- package/src/utils/parseCliOutput.ts +27 -0
- package/src/utils/redact.ts +24 -0
- package/src/utils/runCli.ts +64 -0
package/src/runtime.ts
CHANGED
|
@@ -10,17 +10,14 @@ import { MovehatUserConfig } from "./types/config.js";
|
|
|
10
10
|
import { loadUserConfig, resolveNetworkConfig } from "./core/config.js";
|
|
11
11
|
import { getContract, MoveContract } from "./core/contract.js";
|
|
12
12
|
import {
|
|
13
|
-
saveDeployment,
|
|
14
13
|
loadDeployment,
|
|
15
14
|
getAllDeployments,
|
|
16
15
|
getDeployedAddress,
|
|
17
16
|
DeploymentInfo,
|
|
18
|
-
validateSafeName,
|
|
19
17
|
} from "./core/deployments.js";
|
|
20
|
-
import { ModuleAlreadyDeployedError } from "./errors.js";
|
|
21
18
|
import { AccountManager } from "./core/AccountManager.js";
|
|
22
|
-
|
|
23
|
-
|
|
19
|
+
import { Publisher } from "./core/Publisher.js";
|
|
20
|
+
import type { ChildProcessAdapter } from "./utils/childProcessAdapter.js";
|
|
24
21
|
|
|
25
22
|
export interface InitRuntimeOptions {
|
|
26
23
|
network?: string;
|
|
@@ -29,8 +26,18 @@ export interface InitRuntimeOptions {
|
|
|
29
26
|
}
|
|
30
27
|
|
|
31
28
|
/**
|
|
32
|
-
* Initialize the Movehat Runtime Environment
|
|
33
|
-
*
|
|
29
|
+
* Initialize the Movehat Runtime Environment.
|
|
30
|
+
*
|
|
31
|
+
* Lower-level construction utility — loads `movehat.config.ts`, resolves
|
|
32
|
+
* the active network, and builds a `MovehatRuntime` bound to it. Used
|
|
33
|
+
* internally by {@link Harness.createLive} (see `harness/Harness.ts`).
|
|
34
|
+
*
|
|
35
|
+
* **External callers should prefer the `Harness.create*` factories**
|
|
36
|
+
* (`Harness.createLocal` / `createFork` / `createLive`) for the Hardhat-
|
|
37
|
+
* style lifecycle + use-after-cleanup safety. `initRuntime` remains
|
|
38
|
+
* exported as a public utility for advanced use cases that need to
|
|
39
|
+
* skip the Harness abstraction (e.g. embedding movehat inside another
|
|
40
|
+
* framework).
|
|
34
41
|
*/
|
|
35
42
|
export async function initRuntime(
|
|
36
43
|
options: InitRuntimeOptions = {}
|
|
@@ -46,9 +53,11 @@ export async function initRuntime(
|
|
|
46
53
|
// Resolve configuration for selected network
|
|
47
54
|
const config = await resolveNetworkConfig(mergedUserConfig, options.network);
|
|
48
55
|
|
|
49
|
-
// Setup
|
|
56
|
+
// Setup Movement TypeScript SDK client
|
|
57
|
+
// Movement Network uses custom chain IDs, so we need to use Network.CUSTOM
|
|
58
|
+
// and let the SDK fetch the actual chainId from the node
|
|
50
59
|
const aptosConfig = new AptosConfig({
|
|
51
|
-
network:
|
|
60
|
+
network: Network.CUSTOM,
|
|
52
61
|
fullnode: config.rpc,
|
|
53
62
|
});
|
|
54
63
|
const aptos = new Aptos(aptosConfig);
|
|
@@ -81,251 +90,18 @@ export async function initRuntime(
|
|
|
81
90
|
moduleName: string,
|
|
82
91
|
options?: {
|
|
83
92
|
packageDir?: string;
|
|
93
|
+
adapter?: ChildProcessAdapter;
|
|
84
94
|
}
|
|
85
95
|
): Promise<DeploymentInfo> => {
|
|
86
|
-
//
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const { validateAndEscapePath, validateAndEscapeProfile } = await import("./core/shell.js");
|
|
96
|
-
const execAsync = promisify(exec);
|
|
97
|
-
|
|
98
|
-
// Check if --redeploy flag was passed via CLI
|
|
99
|
-
const forceRedeploy = process.env.MH_CLI_REDEPLOY === 'true';
|
|
100
|
-
|
|
101
|
-
// Check if already deployed
|
|
102
|
-
const existingDeployment = loadDeployment(config.network, moduleName);
|
|
103
|
-
if (existingDeployment && !forceRedeploy) {
|
|
104
|
-
// Build detailed error message with all deployment info
|
|
105
|
-
const errorDetails = [
|
|
106
|
-
`Module "${moduleName}" is already deployed on ${config.network}`,
|
|
107
|
-
`Address: ${existingDeployment.address}`,
|
|
108
|
-
`Deployed at: ${new Date(existingDeployment.timestamp).toLocaleString()}`,
|
|
109
|
-
existingDeployment.txHash ? `Transaction: ${existingDeployment.txHash}` : null,
|
|
110
|
-
`\nTo redeploy, run with the --redeploy flag:`,
|
|
111
|
-
`movehat run <script> --network ${config.network} --redeploy`,
|
|
112
|
-
].filter(Boolean).join('\n');
|
|
113
|
-
|
|
114
|
-
// Log formatted error message for user
|
|
115
|
-
const formattedMessage = [
|
|
116
|
-
`\n❌ Module "${moduleName}" is already deployed on ${config.network}`,
|
|
117
|
-
` Address: ${existingDeployment.address}`,
|
|
118
|
-
` Deployed at: ${new Date(existingDeployment.timestamp).toLocaleString()}`,
|
|
119
|
-
existingDeployment.txHash ? ` Transaction: ${existingDeployment.txHash}` : null,
|
|
120
|
-
`\n💡 To redeploy, run with the --redeploy flag:`,
|
|
121
|
-
` movehat run <script> --network ${config.network} --redeploy\n`,
|
|
122
|
-
].filter(Boolean).join('\n');
|
|
123
|
-
|
|
124
|
-
console.error(formattedMessage);
|
|
125
|
-
|
|
126
|
-
// Throw custom error with complete context for programmatic handling
|
|
127
|
-
throw new ModuleAlreadyDeployedError(
|
|
128
|
-
errorDetails,
|
|
129
|
-
moduleName,
|
|
130
|
-
config.network,
|
|
131
|
-
existingDeployment.address,
|
|
132
|
-
existingDeployment.timestamp,
|
|
133
|
-
existingDeployment.txHash
|
|
134
|
-
);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
if (forceRedeploy && existingDeployment) {
|
|
138
|
-
console.log(`🔄 Redeploying module "${moduleName}" on ${config.network}...`);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
const dir = options?.packageDir || config.moveDir;
|
|
142
|
-
const profile = config.profile || "default";
|
|
143
|
-
|
|
144
|
-
// Validate and escape to prevent command injection
|
|
145
|
-
const safeDir = validateAndEscapePath(dir, "package directory");
|
|
146
|
-
const safeProfile = validateAndEscapeProfile(profile);
|
|
147
|
-
|
|
148
|
-
console.log(`📦 Publishing module "${moduleName}" from ${dir}...`);
|
|
149
|
-
|
|
150
|
-
try {
|
|
151
|
-
// Get the deployer address to use for named addresses
|
|
152
|
-
const deployerAddress = account.accountAddress.toString();
|
|
153
|
-
|
|
154
|
-
// Detect named addresses from Move files
|
|
155
|
-
const { extractNamedAddresses } = await import("./commands/compile.js");
|
|
156
|
-
const detectedAddresses = extractNamedAddresses(dir);
|
|
157
|
-
|
|
158
|
-
// Build named addresses argument - use deployer address for all detected addresses
|
|
159
|
-
let namedAddressesArg = "";
|
|
160
|
-
if (detectedAddresses.size > 0) {
|
|
161
|
-
const addressPairs = Array.from(detectedAddresses)
|
|
162
|
-
.map(name => `${name}=${deployerAddress}`)
|
|
163
|
-
.join(",");
|
|
164
|
-
namedAddressesArg = `--named-addresses ${addressPairs}`;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
// Build first with named addresses
|
|
168
|
-
console.log("🔨 Building package...");
|
|
169
|
-
const buildCmd = `movement move build --package-dir ${safeDir} ${namedAddressesArg}`.trim();
|
|
170
|
-
const { stdout: buildOut } = await execAsync(buildCmd, {
|
|
171
|
-
timeout: 120000, // 2 minutes for git dependency downloads
|
|
172
|
-
maxBuffer: 10 * 1024 * 1024, // 10MB buffer for large outputs
|
|
173
|
-
});
|
|
174
|
-
if (buildOut) console.log(buildOut.trim());
|
|
175
|
-
|
|
176
|
-
// Publish using direct parameters (avoid config file issues)
|
|
177
|
-
console.log("📤 Publishing to blockchain...");
|
|
178
|
-
|
|
179
|
-
// Use parameters directly instead of relying on config file
|
|
180
|
-
// Strip any ed25519-priv- prefix if present
|
|
181
|
-
let cleanPrivateKey = config.privateKey;
|
|
182
|
-
if (cleanPrivateKey.startsWith('ed25519-priv-')) {
|
|
183
|
-
cleanPrivateKey = cleanPrivateKey.replace('ed25519-priv-', '');
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// deployerAddress is already declared above
|
|
187
|
-
|
|
188
|
-
// Read Move.toml to update named addresses with deployer address
|
|
189
|
-
const moveTomlPath = join(dir, 'Move.toml');
|
|
190
|
-
let originalMoveToml = '';
|
|
191
|
-
|
|
192
|
-
if (existsSync(moveTomlPath)) {
|
|
193
|
-
const { readFile, writeFile } = await import('fs').then(fs => fs.promises);
|
|
194
|
-
originalMoveToml = await readFile(moveTomlPath, 'utf-8');
|
|
195
|
-
|
|
196
|
-
// Replace addresses in [addresses] section with deployer address
|
|
197
|
-
const updatedMoveToml = originalMoveToml.replace(
|
|
198
|
-
/\[addresses\]([\s\S]*?)(?=\n\[|$)/,
|
|
199
|
-
(match, addressesSection) => {
|
|
200
|
-
const updatedSection = addressesSection.replace(
|
|
201
|
-
/^([a-zA-Z_][a-zA-Z0-9_]*)\s*=\s*"0x[a-fA-F0-9]+"/gm,
|
|
202
|
-
`$1 = "${deployerAddress}"`
|
|
203
|
-
);
|
|
204
|
-
return `[addresses]${updatedSection}`;
|
|
205
|
-
}
|
|
206
|
-
);
|
|
207
|
-
|
|
208
|
-
// Write updated Move.toml temporarily
|
|
209
|
-
await writeFile(moveTomlPath, updatedMoveToml, 'utf-8');
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
let publishOut = '';
|
|
213
|
-
let publishErr = '';
|
|
214
|
-
|
|
215
|
-
// Setup Movement CLI config with private key securely
|
|
216
|
-
// Movement CLI uses .aptos config directory (not .movement)
|
|
217
|
-
const movementConfigDir = join(homedir(), '.aptos');
|
|
218
|
-
const movementConfigPath = join(movementConfigDir, 'config.yaml');
|
|
219
|
-
let originalMovementConfig = '';
|
|
220
|
-
|
|
221
|
-
try {
|
|
222
|
-
// Ensure .aptos directory exists
|
|
223
|
-
if (!existsSync(movementConfigDir)) {
|
|
224
|
-
mkdirSync(movementConfigDir, { recursive: true, mode: 0o700 });
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
// Backup original config if it exists
|
|
228
|
-
if (existsSync(movementConfigPath)) {
|
|
229
|
-
const { readFile } = await import('fs').then(fs => fs.promises);
|
|
230
|
-
originalMovementConfig = await readFile(movementConfigPath, 'utf-8');
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
// Create Movement config with private key
|
|
234
|
-
// Movement CLI reads from ~/.aptos/config.yaml
|
|
235
|
-
const movementConfig: any = originalMovementConfig ? yaml.load(originalMovementConfig) : {};
|
|
236
|
-
|
|
237
|
-
// Set profile with private key
|
|
238
|
-
// Use unescaped profile name as YAML key (YAML handles escaping automatically)
|
|
239
|
-
if (!movementConfig.profiles) {
|
|
240
|
-
movementConfig.profiles = {};
|
|
241
|
-
}
|
|
242
|
-
if (!movementConfig.profiles[profile]) {
|
|
243
|
-
movementConfig.profiles[profile] = {};
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
movementConfig.profiles[profile].private_key = cleanPrivateKey;
|
|
247
|
-
movementConfig.profiles[profile].public_key = account.publicKey.toString();
|
|
248
|
-
movementConfig.profiles[profile].account = deployerAddress;
|
|
249
|
-
movementConfig.profiles[profile].rest_url = config.rpc;
|
|
250
|
-
|
|
251
|
-
// Write config file with restrictive permissions
|
|
252
|
-
const configYaml = yaml.dump(movementConfig);
|
|
253
|
-
writeFileSync(movementConfigPath, configYaml, { mode: 0o600 });
|
|
254
|
-
|
|
255
|
-
// Execute publish command without exposing private key in CLI
|
|
256
|
-
// Include named addresses for publish as well
|
|
257
|
-
const publishCmd = `movement move publish --package-dir ${safeDir} --url ${config.rpc} --profile ${safeProfile} --assume-yes ${namedAddressesArg}`.trim();
|
|
258
|
-
const result = await execAsync(publishCmd, {
|
|
259
|
-
timeout: 120000, // 2 minutes for blockchain transactions
|
|
260
|
-
maxBuffer: 10 * 1024 * 1024, // 10MB buffer for large outputs
|
|
261
|
-
});
|
|
262
|
-
publishOut = result.stdout || '';
|
|
263
|
-
publishErr = result.stderr || '';
|
|
264
|
-
if (publishOut) console.log(publishOut.trim());
|
|
265
|
-
if (publishErr) console.error(publishErr.trim());
|
|
266
|
-
} finally {
|
|
267
|
-
// Restore original Movement config
|
|
268
|
-
if (existsSync(movementConfigPath)) {
|
|
269
|
-
if (originalMovementConfig) {
|
|
270
|
-
// Restore original config
|
|
271
|
-
writeFileSync(movementConfigPath, originalMovementConfig, { mode: 0o600 });
|
|
272
|
-
} else {
|
|
273
|
-
// Remove config file if it didn't exist before
|
|
274
|
-
const { unlink } = await import('fs').then(fs => fs.promises);
|
|
275
|
-
await unlink(movementConfigPath).catch(() => {});
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
// Restore original Move.toml
|
|
280
|
-
if (originalMoveToml && existsSync(moveTomlPath)) {
|
|
281
|
-
const { writeFile } = await import('fs').then(fs => fs.promises);
|
|
282
|
-
await writeFile(moveTomlPath, originalMoveToml, 'utf-8');
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
// Extract transaction hash from output
|
|
287
|
-
// Look for patterns like "Transaction hash: 0x..." or "Txn: 0x..." or just a 64-char hex
|
|
288
|
-
// The regex tries to match with context first, then falls back to any 64-char hex
|
|
289
|
-
let txHash: string | undefined;
|
|
290
|
-
const txHashMatchWithContext = publishOut.match(/(?:transaction\s*(?:hash)?|txn\s*(?:hash)?|hash):\s*(0x[a-fA-F0-9]{64})\b/i);
|
|
291
|
-
if (txHashMatchWithContext) {
|
|
292
|
-
txHash = txHashMatchWithContext[1];
|
|
293
|
-
} else {
|
|
294
|
-
// Fallback: try to find any 64-char hex string (exactly, not more)
|
|
295
|
-
const txHashMatch = publishOut.match(/\b(0x[a-fA-F0-9]{64})\b/);
|
|
296
|
-
if (txHashMatch) {
|
|
297
|
-
txHash = txHashMatch[1];
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
console.log(`✅ Module published successfully!`);
|
|
302
|
-
|
|
303
|
-
// Create deployment info
|
|
304
|
-
const deployment: DeploymentInfo = {
|
|
305
|
-
address: account.accountAddress.toString(),
|
|
306
|
-
moduleName,
|
|
307
|
-
network: config.network,
|
|
308
|
-
deployer: account.accountAddress.toString(),
|
|
309
|
-
timestamp: Date.now(),
|
|
310
|
-
txHash,
|
|
311
|
-
};
|
|
312
|
-
|
|
313
|
-
// Save deployment
|
|
314
|
-
saveDeployment(deployment);
|
|
315
|
-
|
|
316
|
-
return deployment;
|
|
317
|
-
} catch (error: any) {
|
|
318
|
-
// Enhanced error reporting with stderr if available
|
|
319
|
-
let errorMsg = error.message;
|
|
320
|
-
if (error.stderr) {
|
|
321
|
-
errorMsg += `\n${error.stderr}`;
|
|
322
|
-
}
|
|
323
|
-
if (error.stdout) {
|
|
324
|
-
console.log(error.stdout);
|
|
325
|
-
}
|
|
326
|
-
console.error(`❌ Failed to publish module: ${errorMsg}`);
|
|
327
|
-
throw error;
|
|
328
|
-
}
|
|
96
|
+
// Thin orchestrator over Publisher (M1.4 / #79). The 250-line closure
|
|
97
|
+
// body lives in core/Publisher.ts and carries the bug fixes for
|
|
98
|
+
// #36 / #37 / #38.
|
|
99
|
+
return new Publisher({ adapter: options?.adapter }).deploy({
|
|
100
|
+
moduleName,
|
|
101
|
+
config,
|
|
102
|
+
account,
|
|
103
|
+
packageDir: options?.packageDir,
|
|
104
|
+
});
|
|
329
105
|
};
|
|
330
106
|
|
|
331
107
|
const getDeployment = (moduleName: string): DeploymentInfo | null => {
|
|
@@ -349,16 +125,15 @@ export async function initRuntime(
|
|
|
349
125
|
};
|
|
350
126
|
|
|
351
127
|
const getAccountByIndex = (index: number): Account => {
|
|
352
|
-
|
|
128
|
+
const acc = accounts[index];
|
|
129
|
+
if (!acc) {
|
|
353
130
|
throw new Error(`Account index ${index} out of range. Available accounts: 0-${accounts.length - 1}`);
|
|
354
131
|
}
|
|
355
|
-
return
|
|
132
|
+
return acc;
|
|
356
133
|
};
|
|
357
134
|
|
|
358
|
-
const switchNetwork = async (networkName: string): Promise<
|
|
359
|
-
|
|
360
|
-
cachedRuntime = null;
|
|
361
|
-
await initRuntime({ ...options, network: networkName });
|
|
135
|
+
const switchNetwork = async (networkName: string): Promise<MovehatRuntime> => {
|
|
136
|
+
return initRuntime({ ...options, network: networkName });
|
|
362
137
|
};
|
|
363
138
|
|
|
364
139
|
// Build runtime object
|
|
@@ -379,37 +154,6 @@ export async function initRuntime(
|
|
|
379
154
|
switchNetwork,
|
|
380
155
|
};
|
|
381
156
|
|
|
382
|
-
cachedRuntime = runtime;
|
|
383
157
|
return runtime;
|
|
384
158
|
}
|
|
385
159
|
|
|
386
|
-
/**
|
|
387
|
-
* Get the current Movehat Runtime Environment
|
|
388
|
-
* Throws error if runtime hasn't been initialized
|
|
389
|
-
*/
|
|
390
|
-
export function getRuntime(): MovehatRuntime {
|
|
391
|
-
if (!cachedRuntime) {
|
|
392
|
-
throw new Error(
|
|
393
|
-
"Movehat Runtime not initialized. Call initRuntime() first or use getMovehat()."
|
|
394
|
-
);
|
|
395
|
-
}
|
|
396
|
-
return cachedRuntime;
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
/**
|
|
400
|
-
* Get or initialize the Movehat Runtime Environment
|
|
401
|
-
* This is a convenience function that initializes if needed
|
|
402
|
-
*/
|
|
403
|
-
export async function getMovehat(): Promise<MovehatRuntime> {
|
|
404
|
-
if (cachedRuntime) {
|
|
405
|
-
return cachedRuntime;
|
|
406
|
-
}
|
|
407
|
-
return initRuntime();
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
// Export a default instance getter for convenience
|
|
411
|
-
export const mh = {
|
|
412
|
-
get runtime() {
|
|
413
|
-
return getRuntime();
|
|
414
|
-
},
|
|
415
|
-
};
|
package/src/templates/README.md
CHANGED
|
@@ -142,5 +142,5 @@ module counter::counter { // ← "counter" is auto-detected
|
|
|
142
142
|
## Learn More
|
|
143
143
|
|
|
144
144
|
- [Movement Documentation](https://docs.movementnetwork.xyz)
|
|
145
|
-
- [
|
|
145
|
+
- [Move Language Book](https://move-language.github.io/move/)
|
|
146
146
|
- [Movehat GitHub](https://github.com/gilbertsahumada/movehat)
|
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
// Movehat configuration.
|
|
2
|
+
//
|
|
3
|
+
// Movehat's primary public API is the Hardhat-style `Harness` class
|
|
4
|
+
// (see scripts/deploy-counter.ts and tests/Counter.test.ts in this
|
|
5
|
+
// template). The `Harness.create*` factories read this file via
|
|
6
|
+
// `loadUserConfig` to resolve the active network + accounts.
|
|
7
|
+
//
|
|
8
|
+
// The `setupTestFixture()` helper also reads the same shape and
|
|
9
|
+
// remains supported as a lighter-weight alternative to Harness.
|
|
10
|
+
|
|
1
11
|
import dotenv from "dotenv";
|
|
2
12
|
dotenv.config();
|
|
3
13
|
|
|
@@ -1,48 +1,56 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Harness } from "movehat";
|
|
2
2
|
|
|
3
3
|
async function main() {
|
|
4
4
|
console.log("🚀 Deploying Counter contract...\n");
|
|
5
5
|
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
6
|
+
// Hardhat-style Harness — primary public API since M2.
|
|
7
|
+
// createLive binds to a real running network (testnet / mainnet / a
|
|
8
|
+
// custom one defined in movehat.config.ts). No local process spawned.
|
|
9
|
+
const network = process.env.MOVEHAT_NETWORK ?? "testnet";
|
|
10
|
+
const harness = await Harness.createLive(network);
|
|
11
|
+
try {
|
|
12
|
+
console.log(`✅ Runtime initialized on ${harness.runtime.network.name}`);
|
|
13
|
+
console.log(` Account: ${harness.runtime.account.accountAddress.toString()}`);
|
|
14
|
+
console.log(` RPC: ${harness.runtime.network.rpc}\n`);
|
|
15
|
+
|
|
16
|
+
// Deploy as a code object via `movement move deploy-object`. If the
|
|
17
|
+
// Move.toml's named address differs from the module identifier
|
|
18
|
+
// (e.g. `module my_pkg::counter` with `[addresses] my_pkg = "_"`),
|
|
19
|
+
// pass `addressName: "my_pkg"` in addition to `moduleName: "counter"`.
|
|
20
|
+
//
|
|
21
|
+
// To redeploy an existing record, set MH_CLI_REDEPLOY=true.
|
|
22
|
+
const deployment = await harness.deployCodeObject({
|
|
23
|
+
moduleName: "counter",
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
console.log(`\n✅ Module deployed at: ${deployment.address}::counter`);
|
|
27
|
+
if (deployment.txHash) {
|
|
28
|
+
console.log(` Transaction: ${deployment.txHash}`);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Interact with the freshly deployed module via the runtime helper.
|
|
32
|
+
const counter = harness.runtime.getContract(deployment.address, "counter");
|
|
33
|
+
|
|
34
|
+
console.log("\n📝 Incrementing counter...");
|
|
35
|
+
const txResult = await counter.call(harness.runtime.account, "increment", []);
|
|
36
|
+
console.log(`✅ Transaction hash: ${txResult.hash}`);
|
|
37
|
+
|
|
38
|
+
// Use harness.runViewFunction directly when you have a fully
|
|
39
|
+
// qualified function id; counter.view<T>(...) is the shorter form.
|
|
40
|
+
const [value] = await harness.runViewFunction({
|
|
41
|
+
function: `${deployment.address}::counter::get`,
|
|
42
|
+
functionArguments: [harness.runtime.account.accountAddress.toString()],
|
|
43
|
+
});
|
|
44
|
+
console.log(`\n📊 Counter value: ${value}`);
|
|
45
|
+
} finally {
|
|
46
|
+
// Always release the Harness — cleanup() is idempotent and safe to
|
|
47
|
+
// call on a `createLive` instance even though no local process was
|
|
48
|
+
// spawned (it just flips the use-after-cleanup poison flag).
|
|
49
|
+
await harness.cleanup();
|
|
21
50
|
}
|
|
22
|
-
|
|
23
|
-
// Get contract instance
|
|
24
|
-
const counter = mh.getContract(deployment.address, "counter");
|
|
25
|
-
|
|
26
|
-
// Initialize the counter
|
|
27
|
-
console.log("\n📝 Initializing counter...");
|
|
28
|
-
const txResult = await counter.call(mh.account, "init", []);
|
|
29
|
-
|
|
30
|
-
console.log(`✅ Transaction hash: ${txResult.hash}`);
|
|
31
|
-
console.log(`✅ Counter initialized successfully!`);
|
|
32
|
-
|
|
33
|
-
// Verify
|
|
34
|
-
const value = await counter.view<number>("get", [
|
|
35
|
-
mh.account.accountAddress.toString()
|
|
36
|
-
]);
|
|
37
|
-
|
|
38
|
-
console.log(`\n📊 Initial counter value: ${value}`);
|
|
39
51
|
}
|
|
40
52
|
|
|
41
53
|
main().catch((error) => {
|
|
42
|
-
|
|
43
|
-
// For other errors, show the message
|
|
44
|
-
if (!(error instanceof ModuleAlreadyDeployedError)) {
|
|
45
|
-
console.error("❌ Deployment failed:", error?.message || error);
|
|
46
|
-
}
|
|
54
|
+
console.error("❌ Deployment failed:", error?.message || error);
|
|
47
55
|
process.exit(1);
|
|
48
56
|
});
|
|
@@ -1,104 +1,102 @@
|
|
|
1
1
|
// @ts-nocheck - This is a template file, dependencies are installed in user projects
|
|
2
2
|
import { describe, it, before, after } from "mocha";
|
|
3
3
|
import { expect } from "chai";
|
|
4
|
-
import {
|
|
4
|
+
import { Harness, AccountManager } from "movehat";
|
|
5
5
|
|
|
6
6
|
describe("Counter Contract", () => {
|
|
7
|
-
let
|
|
7
|
+
let harness;
|
|
8
|
+
let counter;
|
|
9
|
+
let deployer, alice, bob;
|
|
8
10
|
|
|
9
11
|
before(async function () {
|
|
10
12
|
this.timeout(60000); // Allow time for local node startup + deployment
|
|
11
13
|
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
// 3. Auto-deploy the counter module
|
|
17
|
-
// 4. Return everything ready to use
|
|
14
|
+
// Hardhat-style Harness — primary public API since M2.
|
|
15
|
+
// createLocal spins up a Movement local node, funds the labeled
|
|
16
|
+
// accounts from the local faucet, and (via autoDeploy) builds +
|
|
17
|
+
// publishes the named modules so they're ready to use.
|
|
18
18
|
//
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
19
|
+
// The setupTestFixture helper still works if you prefer the older
|
|
20
|
+
// pattern; see `import { setupTestFixture } from "movehat/helpers"`.
|
|
21
|
+
harness = await Harness.createLocal({
|
|
22
|
+
accountLabels: ["deployer", "alice", "bob"],
|
|
23
|
+
autoDeploy: ["counter"],
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const labeled = AccountManager.getLabeledAccounts();
|
|
27
|
+
deployer = labeled.deployer;
|
|
28
|
+
alice = labeled.alice;
|
|
29
|
+
bob = labeled.bob;
|
|
30
|
+
|
|
31
|
+
const counterAddr = harness.runtime.getDeploymentAddress("counter");
|
|
32
|
+
counter = harness.runtime.getContract(counterAddr, "counter");
|
|
24
33
|
|
|
25
34
|
console.log(`\n✅ Testing on local blockchain`);
|
|
26
|
-
console.log(` Deployer: ${
|
|
27
|
-
console.log(` Alice: ${
|
|
28
|
-
console.log(` Bob: ${
|
|
35
|
+
console.log(` Deployer: ${deployer.accountAddress.toString()}`);
|
|
36
|
+
console.log(` Alice: ${alice.accountAddress.toString()}`);
|
|
37
|
+
console.log(` Bob: ${bob.accountAddress.toString()}\n`);
|
|
29
38
|
});
|
|
30
39
|
|
|
31
40
|
describe("Counter functionality", () => {
|
|
32
|
-
it("should initialize
|
|
33
|
-
|
|
34
|
-
const
|
|
41
|
+
it("should initialize counter for deployer", async () => {
|
|
42
|
+
// Initialize counter for deployer (required before get/increment)
|
|
43
|
+
const tx = await counter.call(deployer, "init", []);
|
|
44
|
+
console.log(` Init transaction: ${tx.hash}`);
|
|
35
45
|
|
|
36
|
-
// Read counter value
|
|
37
|
-
const value = await
|
|
38
|
-
|
|
39
|
-
|
|
46
|
+
// Read counter value via harness.runViewFunction (new in M2)
|
|
47
|
+
const [value] = await harness.runViewFunction({
|
|
48
|
+
function: `${counter.moduleAddress}::counter::get`,
|
|
49
|
+
functionArguments: [deployer.accountAddress.toString()],
|
|
50
|
+
});
|
|
40
51
|
|
|
41
52
|
console.log(` Counter value: ${value}`);
|
|
42
|
-
|
|
43
|
-
// Assert the counter is 0 (note: values from view are strings)
|
|
44
53
|
expect(parseInt(value)).to.equal(0);
|
|
45
54
|
});
|
|
46
55
|
|
|
47
56
|
it("should increment counter", async () => {
|
|
48
|
-
const counter = fixture.contracts.counter;
|
|
49
|
-
const deployer = fixture.accounts.deployer;
|
|
50
|
-
|
|
51
|
-
// Increment the counter
|
|
52
57
|
const tx = await counter.call(deployer, "increment", []);
|
|
53
58
|
console.log(` Transaction: ${tx.hash}`);
|
|
54
59
|
|
|
55
|
-
//
|
|
60
|
+
// counter.view is the shorter form when you already have the contract.
|
|
56
61
|
const value = await counter.view<string>("get", [
|
|
57
|
-
deployer.accountAddress.toString()
|
|
62
|
+
deployer.accountAddress.toString(),
|
|
58
63
|
]);
|
|
59
64
|
|
|
60
65
|
console.log(` New counter value: ${value}`);
|
|
61
|
-
|
|
62
|
-
// Should be 1 now
|
|
63
66
|
expect(parseInt(value)).to.equal(1);
|
|
64
67
|
});
|
|
65
68
|
|
|
66
|
-
it("alice can
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
+
it("alice can initialize and increment her counter", async () => {
|
|
70
|
+
const initTx = await counter.call(alice, "init", []);
|
|
71
|
+
console.log(` Alice init transaction: ${initTx.hash}`);
|
|
69
72
|
|
|
70
|
-
// Alice increments her own counter
|
|
71
73
|
const tx = await counter.call(alice, "increment", []);
|
|
72
|
-
console.log(` Alice's transaction: ${tx.hash}`);
|
|
74
|
+
console.log(` Alice's increment transaction: ${tx.hash}`);
|
|
73
75
|
|
|
74
|
-
// Read counter value for Alice (each user has their own counter)
|
|
75
76
|
const aliceValue = await counter.view<string>("get", [
|
|
76
|
-
alice.accountAddress.toString()
|
|
77
|
+
alice.accountAddress.toString(),
|
|
77
78
|
]);
|
|
78
79
|
|
|
79
80
|
console.log(` Alice's counter value: ${aliceValue}`);
|
|
80
81
|
expect(parseInt(aliceValue)).to.equal(1);
|
|
81
82
|
|
|
82
|
-
// Deployer's counter should still be 1 (unchanged)
|
|
83
83
|
const deployerValue = await counter.view<string>("get", [
|
|
84
|
-
|
|
84
|
+
deployer.accountAddress.toString(),
|
|
85
85
|
]);
|
|
86
86
|
|
|
87
87
|
console.log(` Deployer's counter value: ${deployerValue}`);
|
|
88
88
|
expect(parseInt(deployerValue)).to.equal(1);
|
|
89
89
|
});
|
|
90
90
|
|
|
91
|
-
it("bob can
|
|
92
|
-
const
|
|
93
|
-
|
|
91
|
+
it("bob can initialize and increment his counter", async () => {
|
|
92
|
+
const initTx = await counter.call(bob, "init", []);
|
|
93
|
+
console.log(` Bob init transaction: ${initTx.hash}`);
|
|
94
94
|
|
|
95
|
-
// Bob increments his own counter
|
|
96
95
|
const tx = await counter.call(bob, "increment", []);
|
|
97
|
-
console.log(` Bob's transaction: ${tx.hash}`);
|
|
96
|
+
console.log(` Bob's increment transaction: ${tx.hash}`);
|
|
98
97
|
|
|
99
|
-
// Read counter value for Bob (each user has their own counter)
|
|
100
98
|
const bobValue = await counter.view<string>("get", [
|
|
101
|
-
bob.accountAddress.toString()
|
|
99
|
+
bob.accountAddress.toString(),
|
|
102
100
|
]);
|
|
103
101
|
|
|
104
102
|
console.log(` Bob's counter value: ${bobValue}`);
|
|
@@ -107,7 +105,9 @@ describe("Counter Contract", () => {
|
|
|
107
105
|
});
|
|
108
106
|
|
|
109
107
|
after(async () => {
|
|
110
|
-
//
|
|
111
|
-
|
|
108
|
+
// harness.cleanup() stops the local node and poisons the harness —
|
|
109
|
+
// any further method call (other than cleanup itself) throws
|
|
110
|
+
// HarnessDisposedError synchronously.
|
|
111
|
+
await harness.cleanup();
|
|
112
112
|
});
|
|
113
113
|
});
|