movehat 0.1.9 → 0.2.1

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 +132 -279
  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 +89 -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 -4
  130. package/dist/core/AccountManager.d.ts.map +1 -1
  131. package/dist/core/AccountManager.js +20 -12
  132. package/dist/core/AccountManager.js.map +1 -1
  133. package/dist/core/Publisher.d.ts +26 -0
  134. package/dist/core/Publisher.d.ts.map +1 -0
  135. package/dist/core/Publisher.js +240 -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 -4
  158. package/dist/core/contract.d.ts.map +1 -1
  159. package/dist/core/contract.js +15 -7
  160. package/dist/core/contract.js.map +1 -1
  161. package/dist/core/deployments.d.ts +2 -8
  162. package/dist/core/deployments.d.ts.map +1 -1
  163. package/dist/core/deployments.js +8 -18
  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 -29
  198. package/dist/fork/manager.d.ts.map +1 -1
  199. package/dist/fork/manager.js +79 -76
  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 +12 -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 +118 -0
  214. package/dist/harness/Harness.d.ts.map +1 -0
  215. package/dist/harness/Harness.js +187 -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 +267 -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 +31 -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 +6 -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 +26 -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 +29 -0
  330. package/dist/utils/address.d.ts.map +1 -0
  331. package/dist/utils/address.js +48 -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 +108 -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 +15 -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 +111 -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 -22
  385. package/src/core/Publisher.ts +314 -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 -7
  392. package/src/core/deployments.ts +13 -23
  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 -83
  402. package/src/fork/server.ts +53 -19
  403. package/src/fork/storage.ts +12 -15
  404. package/src/fork/test.ts +57 -32
  405. package/src/harness/Harness.ts +222 -0
  406. package/src/harness/codeObject.ts +384 -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 +218 -200
  419. package/src/helpers/testFixtures.ts +106 -118
  420. package/src/index.ts +8 -3
  421. package/src/node/LocalNodeManager.ts +87 -62
  422. package/src/node/__tests__/LocalNodeManager.test.ts +452 -0
  423. package/src/runtime.ts +28 -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 +52 -0
  442. package/src/utils/childProcessAdapter.ts +214 -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
@@ -0,0 +1,309 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { mkdtempSync, rmSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ /**
6
+ * Tests for `ForkManager`. Strategy:
7
+ * - `vi.mock` the upstream `MovementApiClient` (network layer) so
8
+ * tests stay offline and deterministic.
9
+ * - Use a REAL `ForkStorage` against a tmpdir (storage is already
10
+ * covered at ~85% by its own suite; we treat it as a trusted
11
+ * dependency here and assert the manager's lifecycle on top of it).
12
+ */
13
+ // Module-scoped fakes — populated per test via setMockApi() below.
14
+ const fakeApi = {
15
+ getLedgerInfo: vi.fn(),
16
+ getAccount: vi.fn(),
17
+ getAccountResource: vi.fn(),
18
+ getAccountResources: vi.fn(),
19
+ };
20
+ // Track the (nodeUrl, apiKey) pair every constructor call sees, so we
21
+ // can assert setApiKey reconstructs the client.
22
+ const apiCtorCalls = [];
23
+ vi.mock("../api.js", () => ({
24
+ MovementApiClient: class {
25
+ constructor(nodeUrl, apiKey) {
26
+ apiCtorCalls.push({ nodeUrl, apiKey });
27
+ }
28
+ getLedgerInfo = fakeApi.getLedgerInfo;
29
+ getAccount = fakeApi.getAccount;
30
+ getAccountResource = fakeApi.getAccountResource;
31
+ getAccountResources = fakeApi.getAccountResources;
32
+ },
33
+ }));
34
+ // Static import after the mock declaration — vi hoists vi.mock calls.
35
+ import { ForkManager } from "../manager.js";
36
+ const TEST_NODE_URL = "https://testnet.movementnetwork.xyz/v1";
37
+ const TEST_ADDR = "0x" + "a".repeat(64);
38
+ const COIN_TYPE = "0x1::coin::CoinStore<0x1::aptos_coin::AptosCoin>";
39
+ function ledgerInfoFixture() {
40
+ return {
41
+ chain_id: 27,
42
+ ledger_version: "100",
43
+ ledger_timestamp: "1234567890",
44
+ epoch: "5",
45
+ block_height: "42",
46
+ };
47
+ }
48
+ describe("ForkManager — initialize / load", () => {
49
+ let tmpDir;
50
+ let forkPath;
51
+ beforeEach(() => {
52
+ tmpDir = mkdtempSync(join(tmpdir(), "movehat-forkmgr-"));
53
+ forkPath = join(tmpDir, "fork");
54
+ apiCtorCalls.length = 0;
55
+ fakeApi.getLedgerInfo.mockReset();
56
+ fakeApi.getAccount.mockReset();
57
+ fakeApi.getAccountResource.mockReset();
58
+ fakeApi.getAccountResources.mockReset();
59
+ vi.spyOn(console, "log").mockImplementation(() => undefined);
60
+ });
61
+ afterEach(() => {
62
+ vi.restoreAllMocks();
63
+ rmSync(tmpDir, { recursive: true, force: true });
64
+ });
65
+ it("initialize writes metadata and constructs an API client without apiKey by default", async () => {
66
+ fakeApi.getLedgerInfo.mockResolvedValue(ledgerInfoFixture());
67
+ const mgr = new ForkManager(forkPath);
68
+ await mgr.initialize(TEST_NODE_URL);
69
+ expect(apiCtorCalls).toHaveLength(1);
70
+ expect(apiCtorCalls[0]?.nodeUrl).toBe(TEST_NODE_URL);
71
+ expect(apiCtorCalls[0]?.apiKey).toBeUndefined();
72
+ const meta = mgr.getMetadata();
73
+ expect(meta.network).toBe("custom");
74
+ expect(meta.nodeUrl).toBe(TEST_NODE_URL);
75
+ expect(meta.chainId).toBe(27);
76
+ expect(meta.ledgerVersion).toBe("100");
77
+ });
78
+ it("initialize passes apiKey through to the API client", async () => {
79
+ fakeApi.getLedgerInfo.mockResolvedValue(ledgerInfoFixture());
80
+ const mgr = new ForkManager(forkPath);
81
+ await mgr.initialize(TEST_NODE_URL, "testnet", "secret-key");
82
+ expect(apiCtorCalls).toHaveLength(1);
83
+ expect(apiCtorCalls[0]?.apiKey).toBe("secret-key");
84
+ });
85
+ it("initialize labels the fork with the provided networkName", async () => {
86
+ fakeApi.getLedgerInfo.mockResolvedValue(ledgerInfoFixture());
87
+ const mgr = new ForkManager(forkPath);
88
+ await mgr.initialize(TEST_NODE_URL, "bardock-testnet");
89
+ expect(mgr.getMetadata().network).toBe("bardock-testnet");
90
+ });
91
+ it("load throws when the fork directory doesn't exist", () => {
92
+ const mgr = new ForkManager(forkPath);
93
+ expect(() => mgr.load()).toThrow(/Fork does not exist/);
94
+ });
95
+ it("load restores metadata from disk and reconstructs the API client", async () => {
96
+ fakeApi.getLedgerInfo.mockResolvedValue(ledgerInfoFixture());
97
+ const first = new ForkManager(forkPath);
98
+ await first.initialize(TEST_NODE_URL);
99
+ apiCtorCalls.length = 0;
100
+ const reloaded = new ForkManager(forkPath);
101
+ reloaded.load();
102
+ expect(apiCtorCalls).toHaveLength(1);
103
+ expect(reloaded.getMetadata().nodeUrl).toBe(TEST_NODE_URL);
104
+ });
105
+ it("setApiKey reconstructs the API client when one already exists", async () => {
106
+ fakeApi.getLedgerInfo.mockResolvedValue(ledgerInfoFixture());
107
+ const mgr = new ForkManager(forkPath);
108
+ await mgr.initialize(TEST_NODE_URL);
109
+ apiCtorCalls.length = 0;
110
+ mgr.setApiKey("new-key");
111
+ expect(apiCtorCalls).toHaveLength(1);
112
+ expect(apiCtorCalls[0]?.apiKey).toBe("new-key");
113
+ });
114
+ it("setApiKey(undefined) clears the key on the next reconstruction", async () => {
115
+ fakeApi.getLedgerInfo.mockResolvedValue(ledgerInfoFixture());
116
+ const mgr = new ForkManager(forkPath);
117
+ await mgr.initialize(TEST_NODE_URL, "custom", "key");
118
+ apiCtorCalls.length = 0;
119
+ mgr.setApiKey(undefined);
120
+ expect(apiCtorCalls).toHaveLength(1);
121
+ expect(apiCtorCalls[0]?.apiKey).toBeUndefined();
122
+ });
123
+ it("setApiKey is a no-op before initialize/load (no client yet)", () => {
124
+ const mgr = new ForkManager(forkPath);
125
+ apiCtorCalls.length = 0;
126
+ mgr.setApiKey("key");
127
+ expect(apiCtorCalls).toHaveLength(0);
128
+ });
129
+ });
130
+ describe("ForkManager — account + resource fetch", () => {
131
+ let tmpDir;
132
+ let forkPath;
133
+ let mgr;
134
+ beforeEach(async () => {
135
+ tmpDir = mkdtempSync(join(tmpdir(), "movehat-forkmgr-"));
136
+ forkPath = join(tmpDir, "fork");
137
+ apiCtorCalls.length = 0;
138
+ fakeApi.getLedgerInfo.mockResolvedValue(ledgerInfoFixture());
139
+ fakeApi.getAccount.mockReset();
140
+ fakeApi.getAccountResource.mockReset();
141
+ fakeApi.getAccountResources.mockReset();
142
+ vi.spyOn(console, "log").mockImplementation(() => undefined);
143
+ mgr = new ForkManager(forkPath);
144
+ await mgr.initialize(TEST_NODE_URL);
145
+ });
146
+ afterEach(() => {
147
+ vi.restoreAllMocks();
148
+ rmSync(tmpDir, { recursive: true, force: true });
149
+ });
150
+ it("getAccount fetches from API and caches in storage on first call", async () => {
151
+ fakeApi.getAccount.mockResolvedValue({
152
+ sequence_number: "7",
153
+ authentication_key: "0xabc",
154
+ });
155
+ const state = await mgr.getAccount(TEST_ADDR);
156
+ expect(state.sequenceNumber).toBe("7");
157
+ expect(state.authenticationKey).toBe("0xabc");
158
+ expect(fakeApi.getAccount).toHaveBeenCalledTimes(1);
159
+ });
160
+ it("getAccount returns the cached state on second call (no extra API hit)", async () => {
161
+ fakeApi.getAccount.mockResolvedValue({
162
+ sequence_number: "7",
163
+ authentication_key: "0xabc",
164
+ });
165
+ await mgr.getAccount(TEST_ADDR);
166
+ await mgr.getAccount(TEST_ADDR);
167
+ expect(fakeApi.getAccount).toHaveBeenCalledTimes(1);
168
+ });
169
+ it("getAccount throws if the manager was never initialized/loaded", async () => {
170
+ const fresh = new ForkManager(join(tmpDir, "uninitialized"));
171
+ await expect(fresh.getAccount(TEST_ADDR)).rejects.toThrow(/Fork not initialized/);
172
+ });
173
+ it("getResource fetches and caches by resource type", async () => {
174
+ fakeApi.getAccountResource.mockResolvedValue({
175
+ data: { value: "42" },
176
+ });
177
+ const r1 = await mgr.getResource(TEST_ADDR, "0x1::counter::Counter");
178
+ expect(r1).toEqual({ value: "42" });
179
+ const r2 = await mgr.getResource(TEST_ADDR, "0x1::counter::Counter");
180
+ expect(r2).toEqual({ value: "42" });
181
+ expect(fakeApi.getAccountResource).toHaveBeenCalledTimes(1);
182
+ });
183
+ it("getResource rethrows a clean 'not found' for upstream 404 errors", async () => {
184
+ fakeApi.getAccountResource.mockRejectedValue(new Error("HTTP 404: not found"));
185
+ await expect(mgr.getResource(TEST_ADDR, "0x1::missing::Resource")).rejects.toThrow(/Resource .* not found for account/);
186
+ });
187
+ it("getResource rethrows other errors unchanged", async () => {
188
+ fakeApi.getAccountResource.mockRejectedValue(new Error("connection refused"));
189
+ await expect(mgr.getResource(TEST_ADDR, "0x1::missing::Resource")).rejects.toThrow(/connection refused/);
190
+ });
191
+ it("getAllResources fetches the whole list once, caches, and returns by type", async () => {
192
+ fakeApi.getAccountResources.mockResolvedValue([
193
+ { type: "0x1::a::A", data: { x: 1 } },
194
+ { type: "0x1::b::B", data: { y: 2 } },
195
+ ]);
196
+ const first = await mgr.getAllResources(TEST_ADDR);
197
+ expect(Object.keys(first).sort()).toEqual(["0x1::a::A", "0x1::b::B"]);
198
+ expect(first["0x1::a::A"]).toEqual({ x: 1 });
199
+ // Second call should hit cache (API call count stays at 1).
200
+ await mgr.getAllResources(TEST_ADDR);
201
+ expect(fakeApi.getAccountResources).toHaveBeenCalledTimes(1);
202
+ });
203
+ });
204
+ describe("ForkManager — fundAccount / setResource / list / getOrCreateAccount", () => {
205
+ let tmpDir;
206
+ let forkPath;
207
+ let mgr;
208
+ beforeEach(async () => {
209
+ tmpDir = mkdtempSync(join(tmpdir(), "movehat-forkmgr-"));
210
+ forkPath = join(tmpDir, "fork");
211
+ apiCtorCalls.length = 0;
212
+ fakeApi.getLedgerInfo.mockResolvedValue(ledgerInfoFixture());
213
+ fakeApi.getAccount.mockReset();
214
+ fakeApi.getAccountResource.mockReset();
215
+ fakeApi.getAccountResources.mockReset();
216
+ vi.spyOn(console, "log").mockImplementation(() => undefined);
217
+ mgr = new ForkManager(forkPath);
218
+ await mgr.initialize(TEST_NODE_URL);
219
+ });
220
+ afterEach(() => {
221
+ vi.restoreAllMocks();
222
+ rmSync(tmpDir, { recursive: true, force: true });
223
+ });
224
+ it("fundAccount creates a fresh CoinStore when none exists upstream", async () => {
225
+ fakeApi.getAccountResource.mockRejectedValue(new Error("HTTP 404: not found"));
226
+ await mgr.fundAccount(TEST_ADDR, 1_000);
227
+ // Now the resource should be in cache — read it back without another API hit.
228
+ fakeApi.getAccountResource.mockClear();
229
+ const stored = await mgr.getResource(TEST_ADDR, COIN_TYPE);
230
+ expect(stored).toBeDefined();
231
+ expect(stored.coin.value).toBe("1000");
232
+ expect(fakeApi.getAccountResource).not.toHaveBeenCalled();
233
+ });
234
+ it("fundAccount adds to existing balance on a second call (accumulates)", async () => {
235
+ fakeApi.getAccountResource.mockRejectedValue(new Error("HTTP 404: not found"));
236
+ await mgr.fundAccount(TEST_ADDR, 1_000);
237
+ await mgr.fundAccount(TEST_ADDR, 500);
238
+ const stored = await mgr.getResource(TEST_ADDR, COIN_TYPE);
239
+ expect(stored.coin.value).toBe("1500");
240
+ });
241
+ it("fundAccount rethrows non-404 errors from getResource", async () => {
242
+ fakeApi.getAccountResource.mockRejectedValue(new Error("upstream is angry"));
243
+ await expect(mgr.fundAccount(TEST_ADDR, 100)).rejects.toThrow(/upstream is angry/);
244
+ });
245
+ it("fundMultipleAccounts funds every address in the list", async () => {
246
+ fakeApi.getAccountResource.mockRejectedValue(new Error("HTTP 404: not found"));
247
+ const addrs = [
248
+ "0x" + "1".repeat(64),
249
+ "0x" + "2".repeat(64),
250
+ "0x" + "3".repeat(64),
251
+ ];
252
+ await mgr.fundMultipleAccounts(addrs, 500);
253
+ // Each address now has a 500-balance CoinStore in cache.
254
+ fakeApi.getAccountResource.mockClear();
255
+ for (const addr of addrs) {
256
+ const stored = await mgr.getResource(addr, COIN_TYPE);
257
+ expect(stored.coin.value).toBe("500");
258
+ }
259
+ expect(fakeApi.getAccountResource).not.toHaveBeenCalled();
260
+ });
261
+ it("setResource overwrites a cached resource", async () => {
262
+ await mgr.setResource(TEST_ADDR, "0x1::custom::Resource", { value: 1 });
263
+ await mgr.setResource(TEST_ADDR, "0x1::custom::Resource", { value: 2 });
264
+ const stored = await mgr.getResource(TEST_ADDR, "0x1::custom::Resource");
265
+ expect(stored).toEqual({ value: 2 });
266
+ });
267
+ it("listAccounts returns the cached account list", async () => {
268
+ fakeApi.getAccountResource.mockRejectedValue(new Error("HTTP 404: not found"));
269
+ await mgr.fundAccount(TEST_ADDR, 100);
270
+ const list = mgr.listAccounts();
271
+ expect(list.length).toBeGreaterThan(0);
272
+ });
273
+ it("getOrCreateAccount returns the existing account when one is cached", async () => {
274
+ fakeApi.getAccount.mockResolvedValue({
275
+ sequence_number: "0",
276
+ authentication_key: "0xabc",
277
+ });
278
+ await mgr.getAccount(TEST_ADDR);
279
+ fakeApi.getAccount.mockClear();
280
+ const result = await mgr.getOrCreateAccount(TEST_ADDR);
281
+ expect(result.authenticationKey).toBe("0xabc");
282
+ expect(fakeApi.getAccount).not.toHaveBeenCalled();
283
+ });
284
+ it("getOrCreateAccount synthesizes a minimal account when the upstream lookup fails", async () => {
285
+ // Force the storage cache miss AND the API throw, exercising the
286
+ // catch arm that creates the account locally.
287
+ fakeApi.getAccount.mockRejectedValue(new Error("HTTP 404: not found"));
288
+ const result = await mgr.getOrCreateAccount(TEST_ADDR);
289
+ expect(result.sequenceNumber).toBe("0");
290
+ expect(result.authenticationKey).toHaveLength(66);
291
+ });
292
+ it("resetState clears cached accounts and resources", async () => {
293
+ fakeApi.getAccount.mockResolvedValue({
294
+ sequence_number: "5",
295
+ authentication_key: "0xabc",
296
+ });
297
+ await mgr.getAccount(TEST_ADDR);
298
+ await mgr.resetState();
299
+ fakeApi.getAccount.mockClear();
300
+ fakeApi.getAccount.mockResolvedValue({
301
+ sequence_number: "5",
302
+ authentication_key: "0xabc",
303
+ });
304
+ // After reset, fetching again should hit the API (not the cache).
305
+ await mgr.getAccount(TEST_ADDR);
306
+ expect(fakeApi.getAccount).toHaveBeenCalledTimes(1);
307
+ });
308
+ });
309
+ //# sourceMappingURL=manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.test.js","sourceRoot":"","sources":["../../../src/fork/__tests__/manager.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;;;;GAOG;AAEH,mEAAmE;AACnE,MAAM,OAAO,GAAG;IACd,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;IACtB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;IACnB,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE;IAC3B,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE;CAC7B,CAAC;AAEF,sEAAsE;AACtE,gDAAgD;AAChD,MAAM,YAAY,GAA4D,EAAE,CAAC;AAEjF,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1B,iBAAiB,EAAE;QACjB,YAAY,OAAe,EAAE,MAAe;YAC1C,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QACtC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QAChC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;QAChD,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC;KACnD;CACF,CAAC,CAAC,CAAC;AAEJ,sEAAsE;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,aAAa,GAAG,wCAAwC,CAAC;AAC/D,MAAM,SAAS,GAAG,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACxC,MAAM,SAAS,GAAG,kDAAkD,CAAC;AAErE,SAAS,iBAAiB;IACxB,OAAO;QACL,QAAQ,EAAE,EAAE;QACZ,cAAc,EAAE,KAAK;QACrB,gBAAgB,EAAE,YAAY;QAC9B,KAAK,EAAE,GAAG;QACV,YAAY,EAAE,IAAI;KACnB,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,IAAI,MAAc,CAAC;IACnB,IAAI,QAAgB,CAAC;IAErB,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACzD,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QACxB,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;QAClC,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QAC/B,OAAO,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC;QACvC,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,CAAC;QACxC,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;QACjG,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;QAEtC,MAAM,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAEpC,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACrD,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;QAEhD,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;QAEtC,MAAM,GAAG,CAAC,UAAU,CAAC,aAAa,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QAE7D,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;QAEtC,MAAM,GAAG,CAAC,UAAU,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;QAEvD,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAC7D,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAEtC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QAExB,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC3C,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEhB,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAEpC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QACxB,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAEzB,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,GAAG,CAAC,UAAU,CAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAErD,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QACxB,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAEzB,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QACxB,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACrB,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACtD,IAAI,MAAc,CAAC;IACnB,IAAI,QAAgB,CAAC;IACrB,IAAI,GAAgB,CAAC;IAErB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACzD,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QACxB,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QAC/B,OAAO,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC;QACvC,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,CAAC;QACxC,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAE7D,GAAG,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC;YACnC,eAAe,EAAE,GAAG;YACpB,kBAAkB,EAAE,OAAO;SAC5B,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC;YACnC,eAAe,EAAE,GAAG;YACpB,kBAAkB,EAAE,OAAO;SAC5B,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAChC,MAAM,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAEhC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;QAC7D,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACvD,sBAAsB,CACvB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC;YAC3C,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;SACtB,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;QACrE,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;QACrE,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC/E,MAAM,MAAM,CACV,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,wBAAwB,CAAC,CACrD,CAAC,OAAO,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC9E,MAAM,MAAM,CACV,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,wBAAwB,CAAC,CACrD,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,OAAO,CAAC,mBAAmB,CAAC,iBAAiB,CAAC;YAC5C,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YACrC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;SACtC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAE7C,4DAA4D;QAC5D,MAAM,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACrC,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qEAAqE,EAAE,GAAG,EAAE;IACnF,IAAI,MAAc,CAAC;IACnB,IAAI,QAAgB,CAAC;IACrB,IAAI,GAAgB,CAAC;IAErB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACzD,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QACxB,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QAC/B,OAAO,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC;QACvC,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,CAAC;QACxC,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAE7D,GAAG,GAAG,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAE/E,MAAM,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAExC,8EAA8E;QAC9E,OAAO,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC/E,MAAM,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACxC,MAAM,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAEtC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC7E,MAAM,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAE/E,MAAM,KAAK,GAAG;YACZ,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACrB,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACrB,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;SACtB,CAAC;QACF,MAAM,GAAG,CAAC,oBAAoB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAE3C,yDAAyD;QACzD,OAAO,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,uBAAuB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACxE,MAAM,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,uBAAuB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACxE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;QACzE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,OAAO,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC/E,MAAM,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC;YACnC,eAAe,EAAE,GAAG;YACpB,kBAAkB,EAAE,OAAO;SAC5B,CAAC,CAAC;QACH,MAAM,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QAE/B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAC/F,iEAAiE;QACjE,8CAA8C;QAC9C,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAEvE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC;YACnC,eAAe,EAAE,GAAG;YACpB,kBAAkB,EAAE,OAAO;SAC5B,CAAC,CAAC;QACH,MAAM,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAEhC,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC;QAEvB,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QAC/B,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC;YACnC,eAAe,EAAE,GAAG;YACpB,kBAAkB,EAAE,OAAO;SAC5B,CAAC,CAAC;QACH,kEAAkE;QAClE,MAAM,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.test.d.ts","sourceRoot":"","sources":["../../../src/fork/__tests__/server.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,54 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { mkdtempSync, rmSync, mkdirSync, writeFileSync } from "fs";
3
+ import { tmpdir } from "os";
4
+ import { join } from "path";
5
+ import { ForkServer } from "../server.js";
6
+ /**
7
+ * Helper to set up a minimal fork directory so ForkServer.start() succeeds.
8
+ */
9
+ function makeForkDir() {
10
+ const dir = mkdtempSync(join(tmpdir(), "movehat-fork-server-"));
11
+ mkdirSync(join(dir, "resources"), { recursive: true });
12
+ writeFileSync(join(dir, "metadata.json"), JSON.stringify({
13
+ network: "test",
14
+ nodeUrl: "http://example.invalid/v1",
15
+ chainId: 0,
16
+ ledgerVersion: "0",
17
+ timestamp: "0",
18
+ epoch: "0",
19
+ blockHeight: "0",
20
+ createdAt: new Date().toISOString(),
21
+ }));
22
+ writeFileSync(join(dir, "accounts.json"), "{}");
23
+ return dir;
24
+ }
25
+ describe("ForkServer", () => {
26
+ let forkDir;
27
+ let server = null;
28
+ beforeEach(() => {
29
+ forkDir = makeForkDir();
30
+ });
31
+ afterEach(async () => {
32
+ if (server) {
33
+ await server.stop();
34
+ server = null;
35
+ }
36
+ rmSync(forkDir, { recursive: true, force: true });
37
+ });
38
+ it("binds to 127.0.0.1 by default", async () => {
39
+ // Port 0 lets the OS pick a free port.
40
+ server = new ForkServer(forkDir, 0);
41
+ await server.start();
42
+ const internal = server.server;
43
+ const addr = internal.address();
44
+ expect(addr.address).toBe("127.0.0.1");
45
+ });
46
+ it("respects a custom host argument (::1)", async () => {
47
+ server = new ForkServer(forkDir, 0, "::1");
48
+ await server.start();
49
+ const internal = server.server;
50
+ const addr = internal.address();
51
+ expect(addr.address).toBe("::1");
52
+ });
53
+ });
54
+ //# sourceMappingURL=server.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.test.js","sourceRoot":"","sources":["../../../src/fork/__tests__/server.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;GAEG;AACH,SAAS,WAAW;IAClB,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,sBAAsB,CAAC,CAAC,CAAC;IAChE,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,aAAa,CACX,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,EAC1B,IAAI,CAAC,SAAS,CAAC;QACb,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,2BAA2B;QACpC,OAAO,EAAE,CAAC;QACV,aAAa,EAAE,GAAG;QAClB,SAAS,EAAE,GAAG;QACd,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,GAAG;QAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CACH,CAAC;IACF,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,EAAE,IAAI,CAAC,CAAC;IAChD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,IAAI,OAAe,CAAC;IACpB,IAAI,MAAM,GAAsB,IAAI,CAAC;IAErC,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,WAAW,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;QACD,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,uCAAuC;QACvC,MAAM,GAAG,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACpC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QAErB,MAAM,QAAQ,GAAI,MAA4D,CAAC,MAAM,CAAC;QACtF,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,GAAG,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QAErB,MAAM,QAAQ,GAAI,MAA4D,CAAC,MAAM,CAAC;QACtF,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=storage.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.test.d.ts","sourceRoot":"","sources":["../../../src/fork/__tests__/storage.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,222 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import { vol } from 'memfs';
3
+ import { ForkStorage } from '../storage.js';
4
+ // Mock fs module
5
+ vi.mock('fs', async () => {
6
+ const memfs = await import('memfs');
7
+ return memfs.fs;
8
+ });
9
+ describe('ForkStorage', () => {
10
+ const forkPath = '/test-fork';
11
+ beforeEach(() => {
12
+ vol.reset();
13
+ });
14
+ afterEach(() => {
15
+ vol.reset();
16
+ });
17
+ describe('initialize', () => {
18
+ it('should create fork directory structure', () => {
19
+ const storage = new ForkStorage(forkPath);
20
+ storage.initialize();
21
+ expect(vol.existsSync(forkPath)).toBe(true);
22
+ expect(vol.existsSync(`${forkPath}/resources`)).toBe(true);
23
+ expect(vol.existsSync(`${forkPath}/cache`)).toBe(true);
24
+ expect(vol.existsSync(`${forkPath}/cache/.gitignore`)).toBe(true);
25
+ expect(vol.existsSync(`${forkPath}/accounts.json`)).toBe(true);
26
+ });
27
+ it('should not overwrite existing files', () => {
28
+ vol.fromJSON({
29
+ [`${forkPath}/accounts.json`]: '{"existing": "data"}',
30
+ });
31
+ const storage = new ForkStorage(forkPath);
32
+ storage.initialize();
33
+ const content = vol.readFileSync(`${forkPath}/accounts.json`, 'utf-8');
34
+ expect(content).toBe('{"existing": "data"}');
35
+ });
36
+ });
37
+ describe('exists', () => {
38
+ it('should return false if fork does not exist', () => {
39
+ const storage = new ForkStorage(forkPath);
40
+ expect(storage.exists()).toBe(false);
41
+ });
42
+ it('should return false if metadata.json is missing', () => {
43
+ vol.fromJSON({
44
+ [`${forkPath}/accounts.json`]: '{}',
45
+ });
46
+ const storage = new ForkStorage(forkPath);
47
+ expect(storage.exists()).toBe(false);
48
+ });
49
+ it('should return true if fork exists with metadata', () => {
50
+ vol.fromJSON({
51
+ [`${forkPath}/metadata.json`]: '{}',
52
+ });
53
+ const storage = new ForkStorage(forkPath);
54
+ expect(storage.exists()).toBe(true);
55
+ });
56
+ });
57
+ describe('metadata', () => {
58
+ it('should save and load metadata', () => {
59
+ vol.mkdirSync(forkPath, { recursive: true });
60
+ const storage = new ForkStorage(forkPath);
61
+ const metadata = {
62
+ network: 'testnet',
63
+ nodeUrl: 'https://testnet.example.com/v1',
64
+ chainId: 250,
65
+ ledgerVersion: '12345',
66
+ timestamp: '1234567890',
67
+ epoch: '100',
68
+ blockHeight: '1000',
69
+ createdAt: '2024-01-01T00:00:00.000Z',
70
+ };
71
+ storage.saveMetadata(metadata);
72
+ const loaded = storage.loadMetadata();
73
+ expect(loaded).toEqual(metadata);
74
+ });
75
+ it('should throw error if metadata does not exist', () => {
76
+ const storage = new ForkStorage(forkPath);
77
+ expect(() => storage.loadMetadata()).toThrow('Fork metadata not found');
78
+ });
79
+ });
80
+ describe('accounts', () => {
81
+ it('should save and get account state', () => {
82
+ vol.fromJSON({
83
+ [`${forkPath}/accounts.json`]: '{}',
84
+ });
85
+ const storage = new ForkStorage(forkPath);
86
+ const accountState = {
87
+ sequenceNumber: '10',
88
+ authenticationKey: '0xabc123',
89
+ };
90
+ storage.saveAccount('0x123', accountState);
91
+ const loaded = storage.getAccount('0x123');
92
+ expect(loaded).toEqual(accountState);
93
+ });
94
+ it('should return null for non-existent account', () => {
95
+ vol.fromJSON({
96
+ [`${forkPath}/accounts.json`]: '{}',
97
+ });
98
+ const storage = new ForkStorage(forkPath);
99
+ const result = storage.getAccount('0xnonexistent');
100
+ expect(result).toBeNull();
101
+ });
102
+ it('should list all accounts', () => {
103
+ vol.fromJSON({
104
+ [`${forkPath}/accounts.json`]: JSON.stringify({
105
+ '0x1': { sequenceNumber: '0' },
106
+ '0x2': { sequenceNumber: '5' },
107
+ '0x3': { sequenceNumber: '10' },
108
+ }),
109
+ });
110
+ const storage = new ForkStorage(forkPath);
111
+ const accounts = storage.listAccounts();
112
+ expect(accounts).toHaveLength(3);
113
+ expect(accounts).toContain('0x1');
114
+ expect(accounts).toContain('0x2');
115
+ expect(accounts).toContain('0x3');
116
+ });
117
+ it('should clear all accounts', () => {
118
+ vol.fromJSON({
119
+ [`${forkPath}/accounts.json`]: JSON.stringify({
120
+ '0x1': { sequenceNumber: '0' },
121
+ }),
122
+ });
123
+ const storage = new ForkStorage(forkPath);
124
+ storage.clearAccounts();
125
+ const accounts = storage.listAccounts();
126
+ expect(accounts).toHaveLength(0);
127
+ });
128
+ });
129
+ describe('resources', () => {
130
+ beforeEach(() => {
131
+ vol.fromJSON({
132
+ [`${forkPath}/resources/.gitkeep`]: '',
133
+ });
134
+ });
135
+ it('should save and get resource', () => {
136
+ const storage = new ForkStorage(forkPath);
137
+ const resource = { value: '100' };
138
+ storage.saveResource('0x1', '0x1::coin::CoinStore', resource);
139
+ const loaded = storage.getResource('0x1', '0x1::coin::CoinStore');
140
+ expect(loaded).toEqual(resource);
141
+ });
142
+ it('should return null for non-existent resource', () => {
143
+ const storage = new ForkStorage(forkPath);
144
+ const result = storage.getResource('0x1', '0x1::nonexistent::Resource');
145
+ expect(result).toBeNull();
146
+ });
147
+ it('should get all resources for an account', () => {
148
+ vol.fromJSON({
149
+ [`${forkPath}/resources/0x1.json`]: JSON.stringify({
150
+ '0x1::coin::CoinStore': { value: '100' },
151
+ '0x1::account::Account': { sequence: '5' },
152
+ }),
153
+ });
154
+ const storage = new ForkStorage(forkPath);
155
+ const resources = storage.getAllResources('0x1');
156
+ expect(Object.keys(resources)).toHaveLength(2);
157
+ expect(resources['0x1::coin::CoinStore']).toEqual({ value: '100' });
158
+ });
159
+ it('should check if resource exists', () => {
160
+ vol.fromJSON({
161
+ [`${forkPath}/resources/0x1.json`]: JSON.stringify({
162
+ '0x1::coin::CoinStore': { value: '100' },
163
+ }),
164
+ });
165
+ const storage = new ForkStorage(forkPath);
166
+ expect(storage.hasResource('0x1', '0x1::coin::CoinStore')).toBe(true);
167
+ expect(storage.hasResource('0x1', '0x1::nonexistent::Resource')).toBe(false);
168
+ });
169
+ it('should clear all resources', () => {
170
+ vol.fromJSON({
171
+ [`${forkPath}/resources/0x1.json`]: '{}',
172
+ [`${forkPath}/resources/0x2.json`]: '{}',
173
+ });
174
+ const storage = new ForkStorage(forkPath);
175
+ storage.clearResources();
176
+ expect(vol.existsSync(`${forkPath}/resources/0x1.json`)).toBe(false);
177
+ expect(vol.existsSync(`${forkPath}/resources/0x2.json`)).toBe(false);
178
+ });
179
+ });
180
+ describe('address sanitization', () => {
181
+ beforeEach(() => {
182
+ vol.fromJSON({
183
+ [`${forkPath}/resources/.gitkeep`]: '',
184
+ });
185
+ });
186
+ it('should handle addresses with 0x prefix', () => {
187
+ const storage = new ForkStorage(forkPath);
188
+ storage.saveResource('0xabc123', 'test::Resource', { value: 1 });
189
+ expect(vol.existsSync(`${forkPath}/resources/0xabc123.json`)).toBe(true);
190
+ });
191
+ it('should normalize address to lowercase', () => {
192
+ const storage = new ForkStorage(forkPath);
193
+ storage.saveResource('0xABC123', 'test::Resource', { value: 1 });
194
+ expect(vol.existsSync(`${forkPath}/resources/0xabc123.json`)).toBe(true);
195
+ });
196
+ it('should reject invalid address formats', () => {
197
+ const storage = new ForkStorage(forkPath);
198
+ expect(() => {
199
+ storage.saveResource('../../../etc/passwd', 'test::Resource', { value: 1 });
200
+ }).toThrow('Invalid address format');
201
+ expect(() => {
202
+ storage.saveResource('0x123/../../etc', 'test::Resource', { value: 1 });
203
+ }).toThrow('Invalid address format');
204
+ });
205
+ it('should reject addresses with more than 64 hex chars (Movement cap)', () => {
206
+ const storage = new ForkStorage(forkPath);
207
+ const sixtyFiveHex = '0x' + 'a'.repeat(65);
208
+ expect(() => {
209
+ storage.saveResource(sixtyFiveHex, 'test::Resource', { value: 1 });
210
+ }).toThrow('Invalid address format');
211
+ });
212
+ it('should accept addresses exactly at the 64 hex char limit', () => {
213
+ const storage = new ForkStorage(forkPath);
214
+ const sixtyFourHex = '0x' + 'a'.repeat(64);
215
+ expect(() => {
216
+ storage.saveResource(sixtyFourHex, 'test::Resource', { value: 1 });
217
+ }).not.toThrow();
218
+ expect(vol.existsSync(`${forkPath}/resources/${sixtyFourHex}.json`)).toBe(true);
219
+ });
220
+ });
221
+ });
222
+ //# sourceMappingURL=storage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.test.js","sourceRoot":"","sources":["../../../src/fork/__tests__/storage.test.ts"],"names":[],"mappings":"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"}