movehat 0.1.9 → 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 +6 -4
- 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 +28 -239
- 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 +39 -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 +6 -4
- 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 +30 -288
- 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 +39 -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,7 +53,7 @@ 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
|
|
50
57
|
// Movement Network uses custom chain IDs, so we need to use Network.CUSTOM
|
|
51
58
|
// and let the SDK fetch the actual chainId from the node
|
|
52
59
|
const aptosConfig = new AptosConfig({
|
|
@@ -83,251 +90,18 @@ export async function initRuntime(
|
|
|
83
90
|
moduleName: string,
|
|
84
91
|
options?: {
|
|
85
92
|
packageDir?: string;
|
|
93
|
+
adapter?: ChildProcessAdapter;
|
|
86
94
|
}
|
|
87
95
|
): Promise<DeploymentInfo> => {
|
|
88
|
-
//
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
const { validateAndEscapePath, validateAndEscapeProfile } = await import("./core/shell.js");
|
|
98
|
-
const execAsync = promisify(exec);
|
|
99
|
-
|
|
100
|
-
// Check if --redeploy flag was passed via CLI
|
|
101
|
-
const forceRedeploy = process.env.MH_CLI_REDEPLOY === 'true';
|
|
102
|
-
|
|
103
|
-
// Check if already deployed
|
|
104
|
-
const existingDeployment = loadDeployment(config.network, moduleName);
|
|
105
|
-
if (existingDeployment && !forceRedeploy) {
|
|
106
|
-
// Build detailed error message with all deployment info
|
|
107
|
-
const errorDetails = [
|
|
108
|
-
`Module "${moduleName}" is already deployed on ${config.network}`,
|
|
109
|
-
`Address: ${existingDeployment.address}`,
|
|
110
|
-
`Deployed at: ${new Date(existingDeployment.timestamp).toLocaleString()}`,
|
|
111
|
-
existingDeployment.txHash ? `Transaction: ${existingDeployment.txHash}` : null,
|
|
112
|
-
`\nTo redeploy, run with the --redeploy flag:`,
|
|
113
|
-
`movehat run <script> --network ${config.network} --redeploy`,
|
|
114
|
-
].filter(Boolean).join('\n');
|
|
115
|
-
|
|
116
|
-
// Log formatted error message for user
|
|
117
|
-
const formattedMessage = [
|
|
118
|
-
`\n❌ Module "${moduleName}" is already deployed on ${config.network}`,
|
|
119
|
-
` Address: ${existingDeployment.address}`,
|
|
120
|
-
` Deployed at: ${new Date(existingDeployment.timestamp).toLocaleString()}`,
|
|
121
|
-
existingDeployment.txHash ? ` Transaction: ${existingDeployment.txHash}` : null,
|
|
122
|
-
`\n💡 To redeploy, run with the --redeploy flag:`,
|
|
123
|
-
` movehat run <script> --network ${config.network} --redeploy\n`,
|
|
124
|
-
].filter(Boolean).join('\n');
|
|
125
|
-
|
|
126
|
-
console.error(formattedMessage);
|
|
127
|
-
|
|
128
|
-
// Throw custom error with complete context for programmatic handling
|
|
129
|
-
throw new ModuleAlreadyDeployedError(
|
|
130
|
-
errorDetails,
|
|
131
|
-
moduleName,
|
|
132
|
-
config.network,
|
|
133
|
-
existingDeployment.address,
|
|
134
|
-
existingDeployment.timestamp,
|
|
135
|
-
existingDeployment.txHash
|
|
136
|
-
);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
if (forceRedeploy && existingDeployment) {
|
|
140
|
-
console.log(`🔄 Redeploying module "${moduleName}" on ${config.network}...`);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
const dir = options?.packageDir || config.moveDir;
|
|
144
|
-
const profile = config.profile || "default";
|
|
145
|
-
|
|
146
|
-
// Validate and escape to prevent command injection
|
|
147
|
-
const safeDir = validateAndEscapePath(dir, "package directory");
|
|
148
|
-
const safeProfile = validateAndEscapeProfile(profile);
|
|
149
|
-
|
|
150
|
-
console.log(`📦 Publishing module "${moduleName}" from ${dir}...`);
|
|
151
|
-
|
|
152
|
-
try {
|
|
153
|
-
// Get the deployer address to use for named addresses
|
|
154
|
-
const deployerAddress = account.accountAddress.toString();
|
|
155
|
-
|
|
156
|
-
// Detect named addresses from Move files
|
|
157
|
-
const { extractNamedAddresses } = await import("./commands/compile.js");
|
|
158
|
-
const detectedAddresses = extractNamedAddresses(dir);
|
|
159
|
-
|
|
160
|
-
// Build named addresses argument - use deployer address for all detected addresses
|
|
161
|
-
let namedAddressesArg = "";
|
|
162
|
-
if (detectedAddresses.size > 0) {
|
|
163
|
-
const addressPairs = Array.from(detectedAddresses)
|
|
164
|
-
.map(name => `${name}=${deployerAddress}`)
|
|
165
|
-
.join(",");
|
|
166
|
-
namedAddressesArg = `--named-addresses ${addressPairs}`;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// Build first with named addresses
|
|
170
|
-
console.log("🔨 Building package...");
|
|
171
|
-
const buildCmd = `movement move build --package-dir ${safeDir} ${namedAddressesArg}`.trim();
|
|
172
|
-
const { stdout: buildOut } = await execAsync(buildCmd, {
|
|
173
|
-
timeout: 120000, // 2 minutes for git dependency downloads
|
|
174
|
-
maxBuffer: 10 * 1024 * 1024, // 10MB buffer for large outputs
|
|
175
|
-
});
|
|
176
|
-
if (buildOut) console.log(buildOut.trim());
|
|
177
|
-
|
|
178
|
-
// Publish using direct parameters (avoid config file issues)
|
|
179
|
-
console.log("📤 Publishing to blockchain...");
|
|
180
|
-
|
|
181
|
-
// Use parameters directly instead of relying on config file
|
|
182
|
-
// Strip any ed25519-priv- prefix if present
|
|
183
|
-
let cleanPrivateKey = config.privateKey;
|
|
184
|
-
if (cleanPrivateKey.startsWith('ed25519-priv-')) {
|
|
185
|
-
cleanPrivateKey = cleanPrivateKey.replace('ed25519-priv-', '');
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// deployerAddress is already declared above
|
|
189
|
-
|
|
190
|
-
// Read Move.toml to update named addresses with deployer address
|
|
191
|
-
const moveTomlPath = join(dir, 'Move.toml');
|
|
192
|
-
let originalMoveToml = '';
|
|
193
|
-
|
|
194
|
-
if (existsSync(moveTomlPath)) {
|
|
195
|
-
const { readFile, writeFile } = await import('fs').then(fs => fs.promises);
|
|
196
|
-
originalMoveToml = await readFile(moveTomlPath, 'utf-8');
|
|
197
|
-
|
|
198
|
-
// Replace addresses in [addresses] section with deployer address
|
|
199
|
-
const updatedMoveToml = originalMoveToml.replace(
|
|
200
|
-
/\[addresses\]([\s\S]*?)(?=\n\[|$)/,
|
|
201
|
-
(match, addressesSection) => {
|
|
202
|
-
const updatedSection = addressesSection.replace(
|
|
203
|
-
/^([a-zA-Z_][a-zA-Z0-9_]*)\s*=\s*"0x[a-fA-F0-9]+"/gm,
|
|
204
|
-
`$1 = "${deployerAddress}"`
|
|
205
|
-
);
|
|
206
|
-
return `[addresses]${updatedSection}`;
|
|
207
|
-
}
|
|
208
|
-
);
|
|
209
|
-
|
|
210
|
-
// Write updated Move.toml temporarily
|
|
211
|
-
await writeFile(moveTomlPath, updatedMoveToml, 'utf-8');
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
let publishOut = '';
|
|
215
|
-
let publishErr = '';
|
|
216
|
-
|
|
217
|
-
// Setup Movement CLI config with private key securely
|
|
218
|
-
// Movement CLI uses .aptos config directory (not .movement)
|
|
219
|
-
const movementConfigDir = join(homedir(), '.aptos');
|
|
220
|
-
const movementConfigPath = join(movementConfigDir, 'config.yaml');
|
|
221
|
-
let originalMovementConfig = '';
|
|
222
|
-
|
|
223
|
-
try {
|
|
224
|
-
// Ensure .aptos directory exists
|
|
225
|
-
if (!existsSync(movementConfigDir)) {
|
|
226
|
-
mkdirSync(movementConfigDir, { recursive: true, mode: 0o700 });
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
// Backup original config if it exists
|
|
230
|
-
if (existsSync(movementConfigPath)) {
|
|
231
|
-
const { readFile } = await import('fs').then(fs => fs.promises);
|
|
232
|
-
originalMovementConfig = await readFile(movementConfigPath, 'utf-8');
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
// Create Movement config with private key
|
|
236
|
-
// Movement CLI reads from ~/.aptos/config.yaml
|
|
237
|
-
const movementConfig: any = originalMovementConfig ? yaml.load(originalMovementConfig) : {};
|
|
238
|
-
|
|
239
|
-
// Set profile with private key
|
|
240
|
-
// Use unescaped profile name as YAML key (YAML handles escaping automatically)
|
|
241
|
-
if (!movementConfig.profiles) {
|
|
242
|
-
movementConfig.profiles = {};
|
|
243
|
-
}
|
|
244
|
-
if (!movementConfig.profiles[profile]) {
|
|
245
|
-
movementConfig.profiles[profile] = {};
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
movementConfig.profiles[profile].private_key = cleanPrivateKey;
|
|
249
|
-
movementConfig.profiles[profile].public_key = account.publicKey.toString();
|
|
250
|
-
movementConfig.profiles[profile].account = deployerAddress;
|
|
251
|
-
movementConfig.profiles[profile].rest_url = config.rpc;
|
|
252
|
-
|
|
253
|
-
// Write config file with restrictive permissions
|
|
254
|
-
const configYaml = yaml.dump(movementConfig);
|
|
255
|
-
writeFileSync(movementConfigPath, configYaml, { mode: 0o600 });
|
|
256
|
-
|
|
257
|
-
// Execute publish command without exposing private key in CLI
|
|
258
|
-
// Include named addresses for publish as well
|
|
259
|
-
const publishCmd = `movement move publish --package-dir ${safeDir} --url ${config.rpc} --profile ${safeProfile} --assume-yes ${namedAddressesArg}`.trim();
|
|
260
|
-
const result = await execAsync(publishCmd, {
|
|
261
|
-
timeout: 120000, // 2 minutes for blockchain transactions
|
|
262
|
-
maxBuffer: 10 * 1024 * 1024, // 10MB buffer for large outputs
|
|
263
|
-
});
|
|
264
|
-
publishOut = result.stdout || '';
|
|
265
|
-
publishErr = result.stderr || '';
|
|
266
|
-
if (publishOut) console.log(publishOut.trim());
|
|
267
|
-
if (publishErr) console.error(publishErr.trim());
|
|
268
|
-
} finally {
|
|
269
|
-
// Restore original Movement config
|
|
270
|
-
if (existsSync(movementConfigPath)) {
|
|
271
|
-
if (originalMovementConfig) {
|
|
272
|
-
// Restore original config
|
|
273
|
-
writeFileSync(movementConfigPath, originalMovementConfig, { mode: 0o600 });
|
|
274
|
-
} else {
|
|
275
|
-
// Remove config file if it didn't exist before
|
|
276
|
-
const { unlink } = await import('fs').then(fs => fs.promises);
|
|
277
|
-
await unlink(movementConfigPath).catch(() => {});
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
// Restore original Move.toml
|
|
282
|
-
if (originalMoveToml && existsSync(moveTomlPath)) {
|
|
283
|
-
const { writeFile } = await import('fs').then(fs => fs.promises);
|
|
284
|
-
await writeFile(moveTomlPath, originalMoveToml, 'utf-8');
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
// Extract transaction hash from output
|
|
289
|
-
// Look for patterns like "Transaction hash: 0x..." or "Txn: 0x..." or just a 64-char hex
|
|
290
|
-
// The regex tries to match with context first, then falls back to any 64-char hex
|
|
291
|
-
let txHash: string | undefined;
|
|
292
|
-
const txHashMatchWithContext = publishOut.match(/(?:transaction\s*(?:hash)?|txn\s*(?:hash)?|hash):\s*(0x[a-fA-F0-9]{64})\b/i);
|
|
293
|
-
if (txHashMatchWithContext) {
|
|
294
|
-
txHash = txHashMatchWithContext[1];
|
|
295
|
-
} else {
|
|
296
|
-
// Fallback: try to find any 64-char hex string (exactly, not more)
|
|
297
|
-
const txHashMatch = publishOut.match(/\b(0x[a-fA-F0-9]{64})\b/);
|
|
298
|
-
if (txHashMatch) {
|
|
299
|
-
txHash = txHashMatch[1];
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
console.log(`✅ Module published successfully!`);
|
|
304
|
-
|
|
305
|
-
// Create deployment info
|
|
306
|
-
const deployment: DeploymentInfo = {
|
|
307
|
-
address: account.accountAddress.toString(),
|
|
308
|
-
moduleName,
|
|
309
|
-
network: config.network,
|
|
310
|
-
deployer: account.accountAddress.toString(),
|
|
311
|
-
timestamp: Date.now(),
|
|
312
|
-
txHash,
|
|
313
|
-
};
|
|
314
|
-
|
|
315
|
-
// Save deployment
|
|
316
|
-
saveDeployment(deployment);
|
|
317
|
-
|
|
318
|
-
return deployment;
|
|
319
|
-
} catch (error: any) {
|
|
320
|
-
// Enhanced error reporting with stderr if available
|
|
321
|
-
let errorMsg = error.message;
|
|
322
|
-
if (error.stderr) {
|
|
323
|
-
errorMsg += `\n${error.stderr}`;
|
|
324
|
-
}
|
|
325
|
-
if (error.stdout) {
|
|
326
|
-
console.log(error.stdout);
|
|
327
|
-
}
|
|
328
|
-
console.error(`❌ Failed to publish module: ${errorMsg}`);
|
|
329
|
-
throw error;
|
|
330
|
-
}
|
|
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
|
+
});
|
|
331
105
|
};
|
|
332
106
|
|
|
333
107
|
const getDeployment = (moduleName: string): DeploymentInfo | null => {
|
|
@@ -351,16 +125,15 @@ export async function initRuntime(
|
|
|
351
125
|
};
|
|
352
126
|
|
|
353
127
|
const getAccountByIndex = (index: number): Account => {
|
|
354
|
-
|
|
128
|
+
const acc = accounts[index];
|
|
129
|
+
if (!acc) {
|
|
355
130
|
throw new Error(`Account index ${index} out of range. Available accounts: 0-${accounts.length - 1}`);
|
|
356
131
|
}
|
|
357
|
-
return
|
|
132
|
+
return acc;
|
|
358
133
|
};
|
|
359
134
|
|
|
360
|
-
const switchNetwork = async (networkName: string): Promise<
|
|
361
|
-
|
|
362
|
-
cachedRuntime = null;
|
|
363
|
-
await initRuntime({ ...options, network: networkName });
|
|
135
|
+
const switchNetwork = async (networkName: string): Promise<MovehatRuntime> => {
|
|
136
|
+
return initRuntime({ ...options, network: networkName });
|
|
364
137
|
};
|
|
365
138
|
|
|
366
139
|
// Build runtime object
|
|
@@ -381,37 +154,6 @@ export async function initRuntime(
|
|
|
381
154
|
switchNetwork,
|
|
382
155
|
};
|
|
383
156
|
|
|
384
|
-
cachedRuntime = runtime;
|
|
385
157
|
return runtime;
|
|
386
158
|
}
|
|
387
159
|
|
|
388
|
-
/**
|
|
389
|
-
* Get the current Movehat Runtime Environment
|
|
390
|
-
* Throws error if runtime hasn't been initialized
|
|
391
|
-
*/
|
|
392
|
-
export function getRuntime(): MovehatRuntime {
|
|
393
|
-
if (!cachedRuntime) {
|
|
394
|
-
throw new Error(
|
|
395
|
-
"Movehat Runtime not initialized. Call initRuntime() first or use getMovehat()."
|
|
396
|
-
);
|
|
397
|
-
}
|
|
398
|
-
return cachedRuntime;
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
/**
|
|
402
|
-
* Get or initialize the Movehat Runtime Environment
|
|
403
|
-
* This is a convenience function that initializes if needed
|
|
404
|
-
*/
|
|
405
|
-
export async function getMovehat(): Promise<MovehatRuntime> {
|
|
406
|
-
if (cachedRuntime) {
|
|
407
|
-
return cachedRuntime;
|
|
408
|
-
}
|
|
409
|
-
return initRuntime();
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
// Export a default instance getter for convenience
|
|
413
|
-
export const mh = {
|
|
414
|
-
get runtime() {
|
|
415
|
-
return getRuntime();
|
|
416
|
-
},
|
|
417
|
-
};
|
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,95 +1,87 @@
|
|
|
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
41
|
it("should initialize counter for deployer", async () => {
|
|
33
|
-
const counter = fixture.contracts.counter; // Type-safe, no `!` needed
|
|
34
|
-
const deployer = fixture.accounts.deployer;
|
|
35
|
-
|
|
36
42
|
// Initialize counter for deployer (required before get/increment)
|
|
37
43
|
const tx = await counter.call(deployer, "init", []);
|
|
38
44
|
console.log(` Init transaction: ${tx.hash}`);
|
|
39
45
|
|
|
40
|
-
// Read counter value
|
|
41
|
-
const value = await
|
|
42
|
-
|
|
43
|
-
|
|
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
|
+
});
|
|
44
51
|
|
|
45
52
|
console.log(` Counter value: ${value}`);
|
|
46
|
-
|
|
47
|
-
// Assert the counter is 0 (note: values from view are strings)
|
|
48
53
|
expect(parseInt(value)).to.equal(0);
|
|
49
54
|
});
|
|
50
55
|
|
|
51
56
|
it("should increment counter", async () => {
|
|
52
|
-
const counter = fixture.contracts.counter;
|
|
53
|
-
const deployer = fixture.accounts.deployer;
|
|
54
|
-
|
|
55
|
-
// Increment the counter
|
|
56
57
|
const tx = await counter.call(deployer, "increment", []);
|
|
57
58
|
console.log(` Transaction: ${tx.hash}`);
|
|
58
59
|
|
|
59
|
-
//
|
|
60
|
+
// counter.view is the shorter form when you already have the contract.
|
|
60
61
|
const value = await counter.view<string>("get", [
|
|
61
|
-
deployer.accountAddress.toString()
|
|
62
|
+
deployer.accountAddress.toString(),
|
|
62
63
|
]);
|
|
63
64
|
|
|
64
65
|
console.log(` New counter value: ${value}`);
|
|
65
|
-
|
|
66
|
-
// Should be 1 now
|
|
67
66
|
expect(parseInt(value)).to.equal(1);
|
|
68
67
|
});
|
|
69
68
|
|
|
70
69
|
it("alice can initialize and increment her counter", async () => {
|
|
71
|
-
const counter = fixture.contracts.counter;
|
|
72
|
-
const alice = fixture.accounts.alice;
|
|
73
|
-
|
|
74
|
-
// Alice must initialize her counter first
|
|
75
70
|
const initTx = await counter.call(alice, "init", []);
|
|
76
71
|
console.log(` Alice init transaction: ${initTx.hash}`);
|
|
77
72
|
|
|
78
|
-
// Alice increments her own counter
|
|
79
73
|
const tx = await counter.call(alice, "increment", []);
|
|
80
74
|
console.log(` Alice's increment transaction: ${tx.hash}`);
|
|
81
75
|
|
|
82
|
-
// Read counter value for Alice (each user has their own counter)
|
|
83
76
|
const aliceValue = await counter.view<string>("get", [
|
|
84
|
-
alice.accountAddress.toString()
|
|
77
|
+
alice.accountAddress.toString(),
|
|
85
78
|
]);
|
|
86
79
|
|
|
87
80
|
console.log(` Alice's counter value: ${aliceValue}`);
|
|
88
81
|
expect(parseInt(aliceValue)).to.equal(1);
|
|
89
82
|
|
|
90
|
-
// Deployer's counter should still be 1 (unchanged)
|
|
91
83
|
const deployerValue = await counter.view<string>("get", [
|
|
92
|
-
|
|
84
|
+
deployer.accountAddress.toString(),
|
|
93
85
|
]);
|
|
94
86
|
|
|
95
87
|
console.log(` Deployer's counter value: ${deployerValue}`);
|
|
@@ -97,20 +89,14 @@ describe("Counter Contract", () => {
|
|
|
97
89
|
});
|
|
98
90
|
|
|
99
91
|
it("bob can initialize and increment his counter", async () => {
|
|
100
|
-
const counter = fixture.contracts.counter;
|
|
101
|
-
const bob = fixture.accounts.bob;
|
|
102
|
-
|
|
103
|
-
// Bob must initialize his counter first
|
|
104
92
|
const initTx = await counter.call(bob, "init", []);
|
|
105
93
|
console.log(` Bob init transaction: ${initTx.hash}`);
|
|
106
94
|
|
|
107
|
-
// Bob increments his own counter
|
|
108
95
|
const tx = await counter.call(bob, "increment", []);
|
|
109
96
|
console.log(` Bob's increment transaction: ${tx.hash}`);
|
|
110
97
|
|
|
111
|
-
// Read counter value for Bob (each user has their own counter)
|
|
112
98
|
const bobValue = await counter.view<string>("get", [
|
|
113
|
-
bob.accountAddress.toString()
|
|
99
|
+
bob.accountAddress.toString(),
|
|
114
100
|
]);
|
|
115
101
|
|
|
116
102
|
console.log(` Bob's counter value: ${bobValue}`);
|
|
@@ -119,7 +105,9 @@ describe("Counter Contract", () => {
|
|
|
119
105
|
});
|
|
120
106
|
|
|
121
107
|
after(async () => {
|
|
122
|
-
//
|
|
123
|
-
|
|
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();
|
|
124
112
|
});
|
|
125
113
|
});
|