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.
Files changed (445) hide show
  1. package/README.md +2 -2
  2. package/dist/__tests__/deployContract.test.d.ts +2 -0
  3. package/dist/__tests__/deployContract.test.d.ts.map +1 -0
  4. package/dist/__tests__/deployContract.test.js +368 -0
  5. package/dist/__tests__/deployContract.test.js.map +1 -0
  6. package/dist/__tests__/errors.test.d.ts +2 -0
  7. package/dist/__tests__/errors.test.d.ts.map +1 -0
  8. package/dist/__tests__/errors.test.js +46 -0
  9. package/dist/__tests__/errors.test.js.map +1 -0
  10. package/dist/__tests__/fixtures/sigint-deploy-harness.d.ts +24 -0
  11. package/dist/__tests__/fixtures/sigint-deploy-harness.d.ts.map +1 -0
  12. package/dist/__tests__/fixtures/sigint-deploy-harness.js +82 -0
  13. package/dist/__tests__/fixtures/sigint-deploy-harness.js.map +1 -0
  14. package/dist/__tests__/fork/api.test.d.ts +2 -0
  15. package/dist/__tests__/fork/api.test.d.ts.map +1 -0
  16. package/dist/__tests__/fork/api.test.js +110 -0
  17. package/dist/__tests__/fork/api.test.js.map +1 -0
  18. package/dist/__tests__/harness/Harness.createLive.test.d.ts +2 -0
  19. package/dist/__tests__/harness/Harness.createLive.test.d.ts.map +1 -0
  20. package/dist/__tests__/harness/Harness.createLive.test.js +53 -0
  21. package/dist/__tests__/harness/Harness.createLive.test.js.map +1 -0
  22. package/dist/__tests__/harness/Harness.proxy.test.d.ts +2 -0
  23. package/dist/__tests__/harness/Harness.proxy.test.d.ts.map +1 -0
  24. package/dist/__tests__/harness/Harness.proxy.test.js +93 -0
  25. package/dist/__tests__/harness/Harness.proxy.test.js.map +1 -0
  26. package/dist/__tests__/harness/_fixture.d.ts +54 -0
  27. package/dist/__tests__/harness/_fixture.d.ts.map +1 -0
  28. package/dist/__tests__/harness/_fixture.js +69 -0
  29. package/dist/__tests__/harness/_fixture.js.map +1 -0
  30. package/dist/__tests__/harness/codeObject.deploy.test.d.ts +2 -0
  31. package/dist/__tests__/harness/codeObject.deploy.test.d.ts.map +1 -0
  32. package/dist/__tests__/harness/codeObject.deploy.test.js +288 -0
  33. package/dist/__tests__/harness/codeObject.deploy.test.js.map +1 -0
  34. package/dist/__tests__/harness/codeObject.upgrade.test.d.ts +2 -0
  35. package/dist/__tests__/harness/codeObject.upgrade.test.d.ts.map +1 -0
  36. package/dist/__tests__/harness/codeObject.upgrade.test.js +138 -0
  37. package/dist/__tests__/harness/codeObject.upgrade.test.js.map +1 -0
  38. package/dist/__tests__/harness/script.test.d.ts +2 -0
  39. package/dist/__tests__/harness/script.test.d.ts.map +1 -0
  40. package/dist/__tests__/harness/script.test.js +219 -0
  41. package/dist/__tests__/harness/script.test.js.map +1 -0
  42. package/dist/__tests__/harness/view.test.d.ts +2 -0
  43. package/dist/__tests__/harness/view.test.d.ts.map +1 -0
  44. package/dist/__tests__/harness/view.test.js +92 -0
  45. package/dist/__tests__/harness/view.test.js.map +1 -0
  46. package/dist/__tests__/runtime.test.d.ts +2 -0
  47. package/dist/__tests__/runtime.test.d.ts.map +1 -0
  48. package/dist/__tests__/runtime.test.js +141 -0
  49. package/dist/__tests__/runtime.test.js.map +1 -0
  50. package/dist/cli.js +2 -1
  51. package/dist/cli.js.map +1 -1
  52. package/dist/commands/__tests__/compile.test.d.ts +2 -0
  53. package/dist/commands/__tests__/compile.test.d.ts.map +1 -0
  54. package/dist/commands/__tests__/compile.test.js +351 -0
  55. package/dist/commands/__tests__/compile.test.js.map +1 -0
  56. package/dist/commands/__tests__/init.test.d.ts +2 -0
  57. package/dist/commands/__tests__/init.test.d.ts.map +1 -0
  58. package/dist/commands/__tests__/init.test.js +101 -0
  59. package/dist/commands/__tests__/init.test.js.map +1 -0
  60. package/dist/commands/__tests__/run.test.d.ts +2 -0
  61. package/dist/commands/__tests__/run.test.d.ts.map +1 -0
  62. package/dist/commands/__tests__/run.test.js +166 -0
  63. package/dist/commands/__tests__/run.test.js.map +1 -0
  64. package/dist/commands/__tests__/test-move.test.d.ts +2 -0
  65. package/dist/commands/__tests__/test-move.test.d.ts.map +1 -0
  66. package/dist/commands/__tests__/test-move.test.js +59 -0
  67. package/dist/commands/__tests__/test-move.test.js.map +1 -0
  68. package/dist/commands/__tests__/test.test.d.ts +2 -0
  69. package/dist/commands/__tests__/test.test.d.ts.map +1 -0
  70. package/dist/commands/__tests__/test.test.js +168 -0
  71. package/dist/commands/__tests__/test.test.js.map +1 -0
  72. package/dist/commands/__tests__/update.test.d.ts +2 -0
  73. package/dist/commands/__tests__/update.test.d.ts.map +1 -0
  74. package/dist/commands/__tests__/update.test.js +176 -0
  75. package/dist/commands/__tests__/update.test.js.map +1 -0
  76. package/dist/commands/compile.d.ts +7 -1
  77. package/dist/commands/compile.d.ts.map +1 -1
  78. package/dist/commands/compile.js +150 -33
  79. package/dist/commands/compile.js.map +1 -1
  80. package/dist/commands/fork/__tests__/create.test.d.ts +2 -0
  81. package/dist/commands/fork/__tests__/create.test.d.ts.map +1 -0
  82. package/dist/commands/fork/__tests__/create.test.js +108 -0
  83. package/dist/commands/fork/__tests__/create.test.js.map +1 -0
  84. package/dist/commands/fork/__tests__/fund.test.d.ts +2 -0
  85. package/dist/commands/fork/__tests__/fund.test.d.ts.map +1 -0
  86. package/dist/commands/fork/__tests__/fund.test.js +72 -0
  87. package/dist/commands/fork/__tests__/fund.test.js.map +1 -0
  88. package/dist/commands/fork/__tests__/list.test.d.ts +2 -0
  89. package/dist/commands/fork/__tests__/list.test.d.ts.map +1 -0
  90. package/dist/commands/fork/__tests__/list.test.js +119 -0
  91. package/dist/commands/fork/__tests__/list.test.js.map +1 -0
  92. package/dist/commands/fork/__tests__/serve.test.d.ts +2 -0
  93. package/dist/commands/fork/__tests__/serve.test.d.ts.map +1 -0
  94. package/dist/commands/fork/__tests__/serve.test.js +97 -0
  95. package/dist/commands/fork/__tests__/serve.test.js.map +1 -0
  96. package/dist/commands/fork/__tests__/view-resource.test.d.ts +2 -0
  97. package/dist/commands/fork/__tests__/view-resource.test.d.ts.map +1 -0
  98. package/dist/commands/fork/__tests__/view-resource.test.js +77 -0
  99. package/dist/commands/fork/__tests__/view-resource.test.js.map +1 -0
  100. package/dist/commands/fork/create.d.ts +1 -1
  101. package/dist/commands/fork/create.d.ts.map +1 -1
  102. package/dist/commands/fork/create.js +3 -2
  103. package/dist/commands/fork/create.js.map +1 -1
  104. package/dist/commands/fork/fund.d.ts.map +1 -1
  105. package/dist/commands/fork/fund.js +15 -8
  106. package/dist/commands/fork/fund.js.map +1 -1
  107. package/dist/commands/fork/list.d.ts.map +1 -1
  108. package/dist/commands/fork/list.js +2 -1
  109. package/dist/commands/fork/list.js.map +1 -1
  110. package/dist/commands/fork/serve.d.ts +1 -0
  111. package/dist/commands/fork/serve.d.ts.map +1 -1
  112. package/dist/commands/fork/serve.js +4 -2
  113. package/dist/commands/fork/serve.js.map +1 -1
  114. package/dist/commands/fork/view-resource.d.ts.map +1 -1
  115. package/dist/commands/fork/view-resource.js +10 -5
  116. package/dist/commands/fork/view-resource.js.map +1 -1
  117. package/dist/commands/run.d.ts +15 -0
  118. package/dist/commands/run.d.ts.map +1 -1
  119. package/dist/commands/run.js +50 -27
  120. package/dist/commands/run.js.map +1 -1
  121. package/dist/commands/test-move.d.ts.map +1 -1
  122. package/dist/commands/test-move.js +3 -2
  123. package/dist/commands/test-move.js.map +1 -1
  124. package/dist/commands/test.js +52 -46
  125. package/dist/commands/test.js.map +1 -1
  126. package/dist/commands/update.d.ts.map +1 -1
  127. package/dist/commands/update.js +15 -13
  128. package/dist/commands/update.js.map +1 -1
  129. package/dist/core/AccountManager.d.ts +1 -1
  130. package/dist/core/AccountManager.d.ts.map +1 -1
  131. package/dist/core/AccountManager.js +20 -7
  132. package/dist/core/AccountManager.js.map +1 -1
  133. package/dist/core/Publisher.d.ts +31 -0
  134. package/dist/core/Publisher.d.ts.map +1 -0
  135. package/dist/core/Publisher.js +248 -0
  136. package/dist/core/Publisher.js.map +1 -0
  137. package/dist/core/__tests__/AccountManager.test.d.ts +2 -0
  138. package/dist/core/__tests__/AccountManager.test.d.ts.map +1 -0
  139. package/dist/core/__tests__/AccountManager.test.js +239 -0
  140. package/dist/core/__tests__/AccountManager.test.js.map +1 -0
  141. package/dist/core/__tests__/config.test.d.ts +2 -0
  142. package/dist/core/__tests__/config.test.d.ts.map +1 -0
  143. package/dist/core/__tests__/config.test.js +311 -0
  144. package/dist/core/__tests__/config.test.js.map +1 -0
  145. package/dist/core/__tests__/deployments.test.d.ts +2 -0
  146. package/dist/core/__tests__/deployments.test.d.ts.map +1 -0
  147. package/dist/core/__tests__/deployments.test.js +201 -0
  148. package/dist/core/__tests__/deployments.test.js.map +1 -0
  149. package/dist/core/__tests__/shell.test.d.ts +2 -0
  150. package/dist/core/__tests__/shell.test.d.ts.map +1 -0
  151. package/dist/core/__tests__/shell.test.js +107 -0
  152. package/dist/core/__tests__/shell.test.js.map +1 -0
  153. package/dist/core/config.d.ts +13 -1
  154. package/dist/core/config.d.ts.map +1 -1
  155. package/dist/core/config.js +80 -11
  156. package/dist/core/config.js.map +1 -1
  157. package/dist/core/contract.d.ts +1 -1
  158. package/dist/core/contract.d.ts.map +1 -1
  159. package/dist/core/contract.js +15 -4
  160. package/dist/core/contract.js.map +1 -1
  161. package/dist/core/deployments.d.ts +2 -2
  162. package/dist/core/deployments.d.ts.map +1 -1
  163. package/dist/core/deployments.js +8 -6
  164. package/dist/core/deployments.js.map +1 -1
  165. package/dist/core/movementProfile.d.ts +34 -0
  166. package/dist/core/movementProfile.d.ts.map +1 -0
  167. package/dist/core/movementProfile.js +150 -0
  168. package/dist/core/movementProfile.js.map +1 -0
  169. package/dist/core/shell.d.ts +23 -7
  170. package/dist/core/shell.d.ts.map +1 -1
  171. package/dist/core/shell.js +32 -14
  172. package/dist/core/shell.js.map +1 -1
  173. package/dist/errors.d.ts +35 -0
  174. package/dist/errors.d.ts.map +1 -1
  175. package/dist/errors.js +54 -0
  176. package/dist/errors.js.map +1 -1
  177. package/dist/fork/__tests__/manager.test.d.ts +2 -0
  178. package/dist/fork/__tests__/manager.test.d.ts.map +1 -0
  179. package/dist/fork/__tests__/manager.test.js +309 -0
  180. package/dist/fork/__tests__/manager.test.js.map +1 -0
  181. package/dist/fork/__tests__/server.test.d.ts +2 -0
  182. package/dist/fork/__tests__/server.test.d.ts.map +1 -0
  183. package/dist/fork/__tests__/server.test.js +54 -0
  184. package/dist/fork/__tests__/server.test.js.map +1 -0
  185. package/dist/fork/__tests__/storage.test.d.ts +2 -0
  186. package/dist/fork/__tests__/storage.test.d.ts.map +1 -0
  187. package/dist/fork/__tests__/storage.test.js +222 -0
  188. package/dist/fork/__tests__/storage.test.js.map +1 -0
  189. package/dist/fork/__tests__/test.test.d.ts +2 -0
  190. package/dist/fork/__tests__/test.test.d.ts.map +1 -0
  191. package/dist/fork/__tests__/test.test.js +81 -0
  192. package/dist/fork/__tests__/test.test.js.map +1 -0
  193. package/dist/fork/api.d.ts +14 -3
  194. package/dist/fork/api.d.ts.map +1 -1
  195. package/dist/fork/api.js +25 -14
  196. package/dist/fork/api.js.map +1 -1
  197. package/dist/fork/manager.d.ts +23 -9
  198. package/dist/fork/manager.d.ts.map +1 -1
  199. package/dist/fork/manager.js +79 -36
  200. package/dist/fork/manager.js.map +1 -1
  201. package/dist/fork/server.d.ts +11 -3
  202. package/dist/fork/server.d.ts.map +1 -1
  203. package/dist/fork/server.js +45 -13
  204. package/dist/fork/server.js.map +1 -1
  205. package/dist/fork/storage.d.ts +4 -4
  206. package/dist/fork/storage.d.ts.map +1 -1
  207. package/dist/fork/storage.js +7 -9
  208. package/dist/fork/storage.js.map +1 -1
  209. package/dist/fork/test.d.ts +13 -4
  210. package/dist/fork/test.d.ts.map +1 -1
  211. package/dist/fork/test.js +36 -27
  212. package/dist/fork/test.js.map +1 -1
  213. package/dist/harness/Harness.d.ts +124 -0
  214. package/dist/harness/Harness.d.ts.map +1 -0
  215. package/dist/harness/Harness.js +193 -0
  216. package/dist/harness/Harness.js.map +1 -0
  217. package/dist/harness/codeObject.d.ts +31 -0
  218. package/dist/harness/codeObject.d.ts.map +1 -0
  219. package/dist/harness/codeObject.js +271 -0
  220. package/dist/harness/codeObject.js.map +1 -0
  221. package/dist/harness/errors.d.ts +14 -0
  222. package/dist/harness/errors.d.ts.map +1 -0
  223. package/dist/harness/errors.js +22 -0
  224. package/dist/harness/errors.js.map +1 -0
  225. package/dist/harness/index.d.ts +4 -0
  226. package/dist/harness/index.d.ts.map +1 -0
  227. package/dist/harness/index.js +3 -0
  228. package/dist/harness/index.js.map +1 -0
  229. package/dist/harness/proxy.d.ts +7 -0
  230. package/dist/harness/proxy.d.ts.map +1 -0
  231. package/dist/harness/proxy.js +36 -0
  232. package/dist/harness/proxy.js.map +1 -0
  233. package/dist/harness/script.d.ts +21 -0
  234. package/dist/harness/script.d.ts.map +1 -0
  235. package/dist/harness/script.js +155 -0
  236. package/dist/harness/script.js.map +1 -0
  237. package/dist/harness/view.d.ts +22 -0
  238. package/dist/harness/view.d.ts.map +1 -0
  239. package/dist/harness/view.js +28 -0
  240. package/dist/harness/view.js.map +1 -0
  241. package/dist/helpers/__tests__/semver-utils.test.d.ts +2 -0
  242. package/dist/helpers/__tests__/semver-utils.test.d.ts.map +1 -0
  243. package/dist/helpers/__tests__/semver-utils.test.js +103 -0
  244. package/dist/helpers/__tests__/semver-utils.test.js.map +1 -0
  245. package/dist/helpers/index.d.ts +3 -2
  246. package/dist/helpers/index.d.ts.map +1 -1
  247. package/dist/helpers/index.js +2 -2
  248. package/dist/helpers/index.js.map +1 -1
  249. package/dist/helpers/move-tests.d.ts +3 -3
  250. package/dist/helpers/move-tests.d.ts.map +1 -1
  251. package/dist/helpers/move-tests.js +21 -20
  252. package/dist/helpers/move-tests.js.map +1 -1
  253. package/dist/helpers/npm-registry.d.ts.map +1 -1
  254. package/dist/helpers/npm-registry.js +1 -3
  255. package/dist/helpers/npm-registry.js.map +1 -1
  256. package/dist/helpers/semver-utils.d.ts.map +1 -1
  257. package/dist/helpers/semver-utils.js +4 -3
  258. package/dist/helpers/semver-utils.js.map +1 -1
  259. package/dist/helpers/setup.d.ts.map +1 -1
  260. package/dist/helpers/setup.js +6 -4
  261. package/dist/helpers/setup.js.map +1 -1
  262. package/dist/helpers/setupLocalTesting.d.ts +32 -27
  263. package/dist/helpers/setupLocalTesting.d.ts.map +1 -1
  264. package/dist/helpers/setupLocalTesting.js +179 -180
  265. package/dist/helpers/setupLocalTesting.js.map +1 -1
  266. package/dist/helpers/testFixtures.d.ts +19 -53
  267. package/dist/helpers/testFixtures.d.ts.map +1 -1
  268. package/dist/helpers/testFixtures.js +89 -107
  269. package/dist/helpers/testFixtures.js.map +1 -1
  270. package/dist/index.d.ts +4 -2
  271. package/dist/index.d.ts.map +1 -1
  272. package/dist/index.js +7 -3
  273. package/dist/index.js.map +1 -1
  274. package/dist/node/LocalNodeManager.d.ts +9 -1
  275. package/dist/node/LocalNodeManager.d.ts.map +1 -1
  276. package/dist/node/LocalNodeManager.js +75 -58
  277. package/dist/node/LocalNodeManager.js.map +1 -1
  278. package/dist/node/__tests__/LocalNodeManager.test.d.ts +2 -0
  279. package/dist/node/__tests__/LocalNodeManager.test.d.ts.map +1 -0
  280. package/dist/node/__tests__/LocalNodeManager.test.js +349 -0
  281. package/dist/node/__tests__/LocalNodeManager.test.js.map +1 -0
  282. package/dist/runtime.d.ts +12 -15
  283. package/dist/runtime.d.ts.map +1 -1
  284. package/dist/runtime.js +28 -239
  285. package/dist/runtime.js.map +1 -1
  286. package/dist/templates/README.md +1 -1
  287. package/dist/templates/movehat.config.ts +10 -0
  288. package/dist/templates/package.json +2 -1
  289. package/dist/templates/scripts/deploy-counter.ts +46 -38
  290. package/dist/templates/tests/Counter.test.ts +39 -51
  291. package/dist/templates/types/movehat.d.ts +6 -9
  292. package/dist/types/config.d.ts +8 -0
  293. package/dist/types/config.d.ts.map +1 -1
  294. package/dist/types/fork.d.ts +7 -1
  295. package/dist/types/fork.d.ts.map +1 -1
  296. package/dist/types/harness.d.ts +166 -0
  297. package/dist/types/harness.d.ts.map +1 -0
  298. package/dist/types/harness.js +2 -0
  299. package/dist/types/harness.js.map +1 -0
  300. package/dist/types/runtime.d.ts +7 -1
  301. package/dist/types/runtime.d.ts.map +1 -1
  302. package/dist/ui/__tests__/colors.test.d.ts +2 -0
  303. package/dist/ui/__tests__/colors.test.d.ts.map +1 -0
  304. package/dist/ui/__tests__/colors.test.js +127 -0
  305. package/dist/ui/__tests__/colors.test.js.map +1 -0
  306. package/dist/ui/colors.d.ts.map +1 -1
  307. package/dist/ui/colors.js +6 -2
  308. package/dist/ui/colors.js.map +1 -1
  309. package/dist/ui/logger.d.ts +17 -0
  310. package/dist/ui/logger.d.ts.map +1 -1
  311. package/dist/ui/logger.js +22 -0
  312. package/dist/ui/logger.js.map +1 -1
  313. package/dist/ui/symbols.d.ts +1 -0
  314. package/dist/ui/symbols.d.ts.map +1 -1
  315. package/dist/ui/symbols.js +7 -1
  316. package/dist/ui/symbols.js.map +1 -1
  317. package/dist/utils/__tests__/address.test.d.ts +2 -0
  318. package/dist/utils/__tests__/address.test.d.ts.map +1 -0
  319. package/dist/utils/__tests__/address.test.js +70 -0
  320. package/dist/utils/__tests__/address.test.js.map +1 -0
  321. package/dist/utils/__tests__/childProcessAdapter.test.d.ts +2 -0
  322. package/dist/utils/__tests__/childProcessAdapter.test.d.ts.map +1 -0
  323. package/dist/utils/__tests__/childProcessAdapter.test.js +217 -0
  324. package/dist/utils/__tests__/childProcessAdapter.test.js.map +1 -0
  325. package/dist/utils/__tests__/runCli.test.d.ts +2 -0
  326. package/dist/utils/__tests__/runCli.test.d.ts.map +1 -0
  327. package/dist/utils/__tests__/runCli.test.js +187 -0
  328. package/dist/utils/__tests__/runCli.test.js.map +1 -0
  329. package/dist/utils/address.d.ts +33 -0
  330. package/dist/utils/address.d.ts.map +1 -0
  331. package/dist/utils/address.js +52 -0
  332. package/dist/utils/address.js.map +1 -0
  333. package/dist/utils/childProcessAdapter.d.ts +93 -0
  334. package/dist/utils/childProcessAdapter.d.ts.map +1 -0
  335. package/dist/utils/childProcessAdapter.js +109 -0
  336. package/dist/utils/childProcessAdapter.js.map +1 -0
  337. package/dist/utils/parseCliOutput.d.ts +20 -0
  338. package/dist/utils/parseCliOutput.d.ts.map +1 -0
  339. package/dist/utils/parseCliOutput.js +26 -0
  340. package/dist/utils/parseCliOutput.js.map +1 -0
  341. package/dist/utils/redact.d.ts +15 -0
  342. package/dist/utils/redact.d.ts.map +1 -0
  343. package/dist/utils/redact.js +24 -0
  344. package/dist/utils/redact.js.map +1 -0
  345. package/dist/utils/runCli.d.ts +24 -0
  346. package/dist/utils/runCli.d.ts.map +1 -0
  347. package/dist/utils/runCli.js +37 -0
  348. package/dist/utils/runCli.js.map +1 -0
  349. package/package.json +14 -4
  350. package/src/__tests__/deployContract.test.ts +429 -0
  351. package/src/__tests__/errors.test.ts +84 -0
  352. package/src/__tests__/fixtures/sigint-deploy-harness.ts +95 -0
  353. package/src/__tests__/fork/api.test.ts +143 -0
  354. package/src/__tests__/harness/Harness.createLive.test.ts +57 -0
  355. package/src/__tests__/harness/Harness.proxy.test.ts +115 -0
  356. package/src/__tests__/harness/_fixture.ts +131 -0
  357. package/src/__tests__/harness/codeObject.deploy.test.ts +319 -0
  358. package/src/__tests__/harness/codeObject.upgrade.test.ts +156 -0
  359. package/src/__tests__/harness/script.test.ts +245 -0
  360. package/src/__tests__/harness/view.test.ts +104 -0
  361. package/src/__tests__/runtime.test.ts +182 -0
  362. package/src/cli.ts +2 -1
  363. package/src/commands/__tests__/compile.test.ts +407 -0
  364. package/src/commands/__tests__/init.test.ts +125 -0
  365. package/src/commands/__tests__/run.test.ts +192 -0
  366. package/src/commands/__tests__/test-move.test.ts +81 -0
  367. package/src/commands/__tests__/test.test.ts +204 -0
  368. package/src/commands/__tests__/update.test.ts +223 -0
  369. package/src/commands/compile.ts +168 -32
  370. package/src/commands/fork/__tests__/create.test.ts +132 -0
  371. package/src/commands/fork/__tests__/fund.test.ts +104 -0
  372. package/src/commands/fork/__tests__/list.test.ts +139 -0
  373. package/src/commands/fork/__tests__/serve.test.ts +121 -0
  374. package/src/commands/fork/__tests__/view-resource.test.ts +101 -0
  375. package/src/commands/fork/create.ts +4 -3
  376. package/src/commands/fork/fund.ts +16 -9
  377. package/src/commands/fork/list.ts +3 -2
  378. package/src/commands/fork/serve.ts +6 -3
  379. package/src/commands/fork/view-resource.ts +11 -6
  380. package/src/commands/run.ts +54 -28
  381. package/src/commands/test-move.ts +4 -3
  382. package/src/commands/test.ts +56 -44
  383. package/src/commands/update.ts +19 -16
  384. package/src/core/AccountManager.ts +23 -10
  385. package/src/core/Publisher.ts +322 -0
  386. package/src/core/__tests__/AccountManager.test.ts +290 -0
  387. package/src/core/__tests__/config.test.ts +377 -0
  388. package/src/core/__tests__/deployments.test.ts +247 -0
  389. package/src/core/__tests__/shell.test.ts +138 -0
  390. package/src/core/config.ts +96 -12
  391. package/src/core/contract.ts +13 -4
  392. package/src/core/deployments.ts +13 -11
  393. package/src/core/movementProfile.ts +179 -0
  394. package/src/core/shell.ts +34 -14
  395. package/src/errors.ts +60 -0
  396. package/src/fork/__tests__/manager.test.ts +385 -0
  397. package/src/fork/__tests__/server.test.ts +65 -0
  398. package/src/fork/__tests__/storage.test.ts +281 -0
  399. package/src/fork/__tests__/test.test.ts +97 -0
  400. package/src/fork/api.ts +28 -14
  401. package/src/fork/manager.ts +88 -43
  402. package/src/fork/server.ts +53 -19
  403. package/src/fork/storage.ts +12 -15
  404. package/src/fork/test.ts +58 -32
  405. package/src/harness/Harness.ts +228 -0
  406. package/src/harness/codeObject.ts +388 -0
  407. package/src/harness/errors.ts +22 -0
  408. package/src/harness/index.ts +3 -0
  409. package/src/harness/proxy.ts +40 -0
  410. package/src/harness/script.ts +196 -0
  411. package/src/harness/view.ts +34 -0
  412. package/src/helpers/__tests__/semver-utils.test.ts +121 -0
  413. package/src/helpers/index.ts +2 -8
  414. package/src/helpers/move-tests.ts +27 -23
  415. package/src/helpers/npm-registry.ts +4 -3
  416. package/src/helpers/semver-utils.ts +4 -3
  417. package/src/helpers/setup.ts +6 -4
  418. package/src/helpers/setupLocalTesting.ts +219 -200
  419. package/src/helpers/testFixtures.ts +106 -118
  420. package/src/index.ts +9 -3
  421. package/src/node/LocalNodeManager.ts +87 -62
  422. package/src/node/__tests__/LocalNodeManager.test.ts +452 -0
  423. package/src/runtime.ts +30 -288
  424. package/src/templates/README.md +1 -1
  425. package/src/templates/movehat.config.ts +10 -0
  426. package/src/templates/package.json +2 -1
  427. package/src/templates/scripts/deploy-counter.ts +46 -38
  428. package/src/templates/tests/Counter.test.ts +39 -51
  429. package/src/templates/types/movehat.d.ts +6 -9
  430. package/src/types/config.ts +8 -0
  431. package/src/types/fork.ts +7 -1
  432. package/src/types/harness.ts +182 -0
  433. package/src/types/runtime.ts +11 -3
  434. package/src/ui/__tests__/colors.test.ts +156 -0
  435. package/src/ui/colors.ts +5 -2
  436. package/src/ui/logger.ts +22 -0
  437. package/src/ui/symbols.ts +7 -1
  438. package/src/utils/__tests__/address.test.ts +93 -0
  439. package/src/utils/__tests__/childProcessAdapter.test.ts +266 -0
  440. package/src/utils/__tests__/runCli.test.ts +240 -0
  441. package/src/utils/address.ts +56 -0
  442. package/src/utils/childProcessAdapter.ts +215 -0
  443. package/src/utils/parseCliOutput.ts +27 -0
  444. package/src/utils/redact.ts +24 -0
  445. 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
- let cachedRuntime: MovehatRuntime | null = null;
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
- * This function loads the configuration and creates the runtime context
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 Aptos client
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
- // Validate moduleName early
89
- validateSafeName(moduleName, "module");
90
-
91
- const { exec } = await import("child_process");
92
- const { promisify } = await import("util");
93
- const { existsSync, mkdirSync, writeFileSync, chmodSync } = await import("fs");
94
- const { join } = await import("path");
95
- const { homedir } = await import("os");
96
- const yaml = await import("js-yaml");
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
- if (index < 0 || index >= accounts.length) {
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 accounts[index];
132
+ return acc;
358
133
  };
359
134
 
360
- const switchNetwork = async (networkName: string): Promise<void> => {
361
- // Clear cache and reinitialize with new network
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
- };
@@ -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
- - [Aptos Move Book](https://move-language.github.io/move/)
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
 
@@ -12,7 +12,8 @@
12
12
  "dependencies": {
13
13
  "movehat": "latest",
14
14
  "@aptos-labs/ts-sdk": "^5.1.5",
15
- "dotenv": "^17.2.3"
15
+ "dotenv": "^17.2.3",
16
+ "got": "^11.8.6"
16
17
  },
17
18
  "devDependencies": {
18
19
  "@types/chai": "^5.2.3",
@@ -1,48 +1,56 @@
1
- import { getMovehat, ModuleAlreadyDeployedError } from "movehat";
1
+ import { Harness } from "movehat";
2
2
 
3
3
  async function main() {
4
4
  console.log("🚀 Deploying Counter contract...\n");
5
5
 
6
- // Get the Movehat Runtime Environment
7
- const mh = await getMovehat();
8
-
9
- console.log(`✅ Runtime initialized`);
10
- console.log(` Account: ${mh.account.accountAddress.toString()}`);
11
- console.log(` Network: ${mh.network.name}`);
12
- console.log(` RPC: ${mh.network.rpc}\n`);
13
-
14
- // Deploy (publish) the module
15
- // Automatically checks if already deployed and suggests --redeploy if needed
16
- const deployment = await mh.deployContract("counter");
17
-
18
- console.log(`\n✅ Module deployed at: ${deployment.address}::counter`);
19
- if (deployment.txHash) {
20
- console.log(` Transaction: ${deployment.txHash}`);
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
- // ModuleAlreadyDeployedError is already logged with full details by deployContract()
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 { setupTestFixture, teardownTestFixture, type TestFixture } from "movehat/helpers";
4
+ import { Harness, AccountManager } from "movehat";
5
5
 
6
6
  describe("Counter Contract", () => {
7
- let fixture: TestFixture<'counter'>;
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
- // Setup local testing environment with auto-deployment
13
- // This will:
14
- // 1. Start a local Movement blockchain node
15
- // 2. Generate and fund test accounts from local faucet
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
- // By default uses 'local-node' mode (full blockchain)
20
- // For faster tests on existing state, pass { mode: 'fork' }
21
- //
22
- // Note: Use 'as const' for type inference
23
- fixture = await setupTestFixture(['counter'] as const, ['alice', 'bob']);
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: ${fixture.accounts.deployer.accountAddress.toString()}`);
27
- console.log(` Alice: ${fixture.accounts.alice.accountAddress.toString()}`);
28
- console.log(` Bob: ${fixture.accounts.bob.accountAddress.toString()}\n`);
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 (returns string from view function)
41
- const value = await counter.view<string>("get", [
42
- deployer.accountAddress.toString()
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
- // Read new value
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
- fixture.accounts.deployer.accountAddress.toString()
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
- // Cleanup: Stop local node and clear account pool
123
- await teardownTestFixture();
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
  });