movehat 0.1.8 → 0.2.0

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