moonwall 1.0.0-dev.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 (301) hide show
  1. package/LICENSE +681 -0
  2. package/README.md +54 -0
  3. package/config_schema.json +811 -0
  4. package/dist/api/constants/accounts.d.ts +36 -0
  5. package/dist/api/constants/accounts.d.ts.map +1 -0
  6. package/dist/api/constants/accounts.js +67 -0
  7. package/dist/api/constants/chain.d.ts +134 -0
  8. package/dist/api/constants/chain.d.ts.map +1 -0
  9. package/dist/api/constants/chain.js +149 -0
  10. package/dist/api/constants/index.d.ts +4 -0
  11. package/dist/api/constants/index.d.ts.map +1 -0
  12. package/dist/api/constants/index.js +3 -0
  13. package/dist/api/constants/smartContract.d.ts +29 -0
  14. package/dist/api/constants/smartContract.d.ts.map +1 -0
  15. package/dist/api/constants/smartContract.js +118 -0
  16. package/dist/api/testing/blocks.d.ts +59 -0
  17. package/dist/api/testing/blocks.d.ts.map +1 -0
  18. package/dist/api/testing/blocks.js +147 -0
  19. package/dist/api/testing/contracts.d.ts +5 -0
  20. package/dist/api/testing/contracts.d.ts.map +1 -0
  21. package/dist/api/testing/contracts.js +32 -0
  22. package/dist/api/testing/ethers.d.ts +3 -0
  23. package/dist/api/testing/ethers.d.ts.map +1 -0
  24. package/dist/api/testing/ethers.js +38 -0
  25. package/dist/api/testing/events.d.ts +12 -0
  26. package/dist/api/testing/events.d.ts.map +1 -0
  27. package/dist/api/testing/events.js +23 -0
  28. package/dist/api/testing/extrinsics.d.ts +5 -0
  29. package/dist/api/testing/extrinsics.d.ts.map +1 -0
  30. package/dist/api/testing/extrinsics.js +10 -0
  31. package/dist/api/testing/index.d.ts +9 -0
  32. package/dist/api/testing/index.d.ts.map +1 -0
  33. package/dist/api/testing/index.js +8 -0
  34. package/dist/api/testing/jumping.d.ts +8 -0
  35. package/dist/api/testing/jumping.d.ts.map +1 -0
  36. package/dist/api/testing/jumping.js +78 -0
  37. package/dist/api/testing/providers.d.ts +18 -0
  38. package/dist/api/testing/providers.d.ts.map +1 -0
  39. package/dist/api/testing/providers.js +34 -0
  40. package/dist/api/testing/viem.d.ts +139 -0
  41. package/dist/api/testing/viem.d.ts.map +1 -0
  42. package/dist/api/testing/viem.js +247 -0
  43. package/dist/api/types/config.d.ts +609 -0
  44. package/dist/api/types/config.d.ts.map +1 -0
  45. package/dist/api/types/config.js +1 -0
  46. package/dist/api/types/context.d.ts +125 -0
  47. package/dist/api/types/context.d.ts.map +1 -0
  48. package/dist/api/types/context.js +1 -0
  49. package/dist/api/types/contracts.d.ts +66 -0
  50. package/dist/api/types/contracts.d.ts.map +1 -0
  51. package/dist/api/types/contracts.js +1 -0
  52. package/dist/api/types/eth.d.ts +3 -0
  53. package/dist/api/types/eth.d.ts.map +1 -0
  54. package/dist/api/types/eth.js +1 -0
  55. package/dist/api/types/foundations.d.ts +11 -0
  56. package/dist/api/types/foundations.d.ts.map +1 -0
  57. package/dist/api/types/foundations.js +1 -0
  58. package/dist/api/types/helpers.d.ts +7 -0
  59. package/dist/api/types/helpers.d.ts.map +1 -0
  60. package/dist/api/types/helpers.js +1 -0
  61. package/dist/api/types/index.d.ts +8 -0
  62. package/dist/api/types/index.d.ts.map +1 -0
  63. package/dist/api/types/index.js +7 -0
  64. package/dist/api/types/runner.d.ts +490 -0
  65. package/dist/api/types/runner.d.ts.map +1 -0
  66. package/dist/api/types/runner.js +1 -0
  67. package/dist/cli/cmds/components/LogViewer.d.ts +17 -0
  68. package/dist/cli/cmds/components/LogViewer.d.ts.map +1 -0
  69. package/dist/cli/cmds/components/LogViewer.js +171 -0
  70. package/dist/cli/cmds/entrypoint.d.ts +6 -0
  71. package/dist/cli/cmds/entrypoint.d.ts.map +1 -0
  72. package/dist/cli/cmds/entrypoint.js +192 -0
  73. package/dist/cli/cmds/interactiveCmds/chopsticksIntCmds.d.ts +2 -0
  74. package/dist/cli/cmds/interactiveCmds/chopsticksIntCmds.d.ts.map +1 -0
  75. package/dist/cli/cmds/interactiveCmds/chopsticksIntCmds.js +117 -0
  76. package/dist/cli/cmds/interactiveCmds/devIntCmds.d.ts +2 -0
  77. package/dist/cli/cmds/interactiveCmds/devIntCmds.d.ts.map +1 -0
  78. package/dist/cli/cmds/interactiveCmds/devIntCmds.js +103 -0
  79. package/dist/cli/cmds/interactiveCmds/index.d.ts +4 -0
  80. package/dist/cli/cmds/interactiveCmds/index.d.ts.map +1 -0
  81. package/dist/cli/cmds/interactiveCmds/index.js +3 -0
  82. package/dist/cli/cmds/interactiveCmds/zombieIntCmds.d.ts +2 -0
  83. package/dist/cli/cmds/interactiveCmds/zombieIntCmds.d.ts.map +1 -0
  84. package/dist/cli/cmds/interactiveCmds/zombieIntCmds.js +32 -0
  85. package/dist/cli/cmds/main.d.ts +2 -0
  86. package/dist/cli/cmds/main.d.ts.map +1 -0
  87. package/dist/cli/cmds/main.js +336 -0
  88. package/dist/cli/cmds/runNetwork.d.ts +3 -0
  89. package/dist/cli/cmds/runNetwork.d.ts.map +1 -0
  90. package/dist/cli/cmds/runNetwork.js +292 -0
  91. package/dist/cli/cmds/runTests.d.ts +12 -0
  92. package/dist/cli/cmds/runTests.d.ts.map +1 -0
  93. package/dist/cli/cmds/runTests.js +257 -0
  94. package/dist/cli/internal/cmdFunctions/downloader.d.ts +4 -0
  95. package/dist/cli/internal/cmdFunctions/downloader.d.ts.map +1 -0
  96. package/dist/cli/internal/cmdFunctions/downloader.js +49 -0
  97. package/dist/cli/internal/cmdFunctions/fetchArtifact.d.ts +10 -0
  98. package/dist/cli/internal/cmdFunctions/fetchArtifact.d.ts.map +1 -0
  99. package/dist/cli/internal/cmdFunctions/fetchArtifact.js +145 -0
  100. package/dist/cli/internal/cmdFunctions/index.d.ts +5 -0
  101. package/dist/cli/internal/cmdFunctions/index.d.ts.map +1 -0
  102. package/dist/cli/internal/cmdFunctions/index.js +4 -0
  103. package/dist/cli/internal/cmdFunctions/initialisation.d.ts +20 -0
  104. package/dist/cli/internal/cmdFunctions/initialisation.d.ts.map +1 -0
  105. package/dist/cli/internal/cmdFunctions/initialisation.js +150 -0
  106. package/dist/cli/internal/cmdFunctions/tempLogs.d.ts +3 -0
  107. package/dist/cli/internal/cmdFunctions/tempLogs.d.ts.map +1 -0
  108. package/dist/cli/internal/cmdFunctions/tempLogs.js +37 -0
  109. package/dist/cli/internal/commandParsers.d.ts +59 -0
  110. package/dist/cli/internal/commandParsers.d.ts.map +1 -0
  111. package/dist/cli/internal/commandParsers.js +305 -0
  112. package/dist/cli/internal/deriveTestIds.d.ts +8 -0
  113. package/dist/cli/internal/deriveTestIds.d.ts.map +1 -0
  114. package/dist/cli/internal/deriveTestIds.js +123 -0
  115. package/dist/cli/internal/effect/index.d.ts +6 -0
  116. package/dist/cli/internal/effect/index.d.ts.map +1 -0
  117. package/dist/cli/internal/effect/index.js +5 -0
  118. package/dist/cli/internal/fileCheckers.d.ts +11 -0
  119. package/dist/cli/internal/fileCheckers.d.ts.map +1 -0
  120. package/dist/cli/internal/fileCheckers.js +165 -0
  121. package/dist/cli/internal/foundations/index.d.ts +4 -0
  122. package/dist/cli/internal/foundations/index.d.ts.map +1 -0
  123. package/dist/cli/internal/foundations/index.js +4 -0
  124. package/dist/cli/internal/index.d.ts +12 -0
  125. package/dist/cli/internal/index.d.ts.map +1 -0
  126. package/dist/cli/internal/index.js +11 -0
  127. package/dist/cli/internal/launcherCommon.d.ts +4 -0
  128. package/dist/cli/internal/launcherCommon.d.ts.map +1 -0
  129. package/dist/cli/internal/launcherCommon.js +130 -0
  130. package/dist/cli/internal/localNode.d.ts +16 -0
  131. package/dist/cli/internal/localNode.d.ts.map +1 -0
  132. package/dist/cli/internal/localNode.js +362 -0
  133. package/dist/cli/internal/logging.d.ts +2 -0
  134. package/dist/cli/internal/logging.d.ts.map +1 -0
  135. package/dist/cli/internal/logging.js +26 -0
  136. package/dist/cli/internal/node.d.ts +33 -0
  137. package/dist/cli/internal/node.d.ts.map +1 -0
  138. package/dist/cli/internal/node.js +228 -0
  139. package/dist/cli/internal/processHelpers.d.ts +17 -0
  140. package/dist/cli/internal/processHelpers.d.ts.map +1 -0
  141. package/dist/cli/internal/processHelpers.js +56 -0
  142. package/dist/cli/internal/providerFactories.d.ts +48 -0
  143. package/dist/cli/internal/providerFactories.d.ts.map +1 -0
  144. package/dist/cli/internal/providerFactories.js +442 -0
  145. package/dist/cli/internal/testIdParser.d.ts +34 -0
  146. package/dist/cli/internal/testIdParser.d.ts.map +1 -0
  147. package/dist/cli/internal/testIdParser.js +167 -0
  148. package/dist/cli/lib/binariesHelpers.d.ts +15 -0
  149. package/dist/cli/lib/binariesHelpers.d.ts.map +1 -0
  150. package/dist/cli/lib/binariesHelpers.js +99 -0
  151. package/dist/cli/lib/configReader.d.ts +8 -0
  152. package/dist/cli/lib/configReader.d.ts.map +1 -0
  153. package/dist/cli/lib/configReader.js +115 -0
  154. package/dist/cli/lib/contractFunctions.d.ts +2 -0
  155. package/dist/cli/lib/contractFunctions.d.ts.map +1 -0
  156. package/dist/cli/lib/contractFunctions.js +2 -0
  157. package/dist/cli/lib/globalContext.d.ts +46 -0
  158. package/dist/cli/lib/globalContext.d.ts.map +1 -0
  159. package/dist/cli/lib/globalContext.js +710 -0
  160. package/dist/cli/lib/governanceProcedures.d.ts +27 -0
  161. package/dist/cli/lib/governanceProcedures.d.ts.map +1 -0
  162. package/dist/cli/lib/governanceProcedures.js +458 -0
  163. package/dist/cli/lib/handlers/index.d.ts +5 -0
  164. package/dist/cli/lib/handlers/index.d.ts.map +1 -0
  165. package/dist/cli/lib/handlers/index.js +5 -0
  166. package/dist/cli/lib/repoDefinitions/index.d.ts +6 -0
  167. package/dist/cli/lib/repoDefinitions/index.d.ts.map +1 -0
  168. package/dist/cli/lib/repoDefinitions/index.js +21 -0
  169. package/dist/cli/lib/repoDefinitions/moonbeam.d.ts +4 -0
  170. package/dist/cli/lib/repoDefinitions/moonbeam.d.ts.map +1 -0
  171. package/dist/cli/lib/repoDefinitions/moonbeam.js +30 -0
  172. package/dist/cli/lib/repoDefinitions/polkadot.d.ts +4 -0
  173. package/dist/cli/lib/repoDefinitions/polkadot.d.ts.map +1 -0
  174. package/dist/cli/lib/repoDefinitions/polkadot.js +11 -0
  175. package/dist/cli/lib/repoDefinitions/tanssi.d.ts +4 -0
  176. package/dist/cli/lib/repoDefinitions/tanssi.d.ts.map +1 -0
  177. package/dist/cli/lib/repoDefinitions/tanssi.js +14 -0
  178. package/dist/cli/lib/rpcFunctions.d.ts +2 -0
  179. package/dist/cli/lib/rpcFunctions.d.ts.map +1 -0
  180. package/dist/cli/lib/rpcFunctions.js +26 -0
  181. package/dist/cli/lib/runnerContext.d.ts +32 -0
  182. package/dist/cli/lib/runnerContext.d.ts.map +1 -0
  183. package/dist/cli/lib/runnerContext.js +156 -0
  184. package/dist/cli/lib/shardManager.d.ts +40 -0
  185. package/dist/cli/lib/shardManager.d.ts.map +1 -0
  186. package/dist/cli/lib/shardManager.js +80 -0
  187. package/dist/cli/lib/upgradeProcedures.d.ts +5 -0
  188. package/dist/cli/lib/upgradeProcedures.d.ts.map +1 -0
  189. package/dist/cli/lib/upgradeProcedures.js +221 -0
  190. package/dist/cli.d.ts +4 -0
  191. package/dist/cli.d.ts.map +1 -0
  192. package/dist/cli.js +3 -0
  193. package/dist/contracts/contractInteraction.d.ts +17 -0
  194. package/dist/contracts/contractInteraction.d.ts.map +1 -0
  195. package/dist/contracts/contractInteraction.js +170 -0
  196. package/dist/contracts/index.d.ts +2 -0
  197. package/dist/contracts/index.d.ts.map +1 -0
  198. package/dist/contracts/index.js +1 -0
  199. package/dist/foundations/chopsticks/handler.d.ts +3 -0
  200. package/dist/foundations/chopsticks/handler.d.ts.map +1 -0
  201. package/dist/foundations/chopsticks/handler.js +93 -0
  202. package/dist/foundations/chopsticks/helpers.d.ts +27 -0
  203. package/dist/foundations/chopsticks/helpers.d.ts.map +1 -0
  204. package/dist/foundations/chopsticks/helpers.js +133 -0
  205. package/dist/foundations/dev/handler.d.ts +3 -0
  206. package/dist/foundations/dev/handler.d.ts.map +1 -0
  207. package/dist/foundations/dev/handler.js +136 -0
  208. package/dist/foundations/dev/helpers.d.ts +27 -0
  209. package/dist/foundations/dev/helpers.d.ts.map +1 -0
  210. package/dist/foundations/dev/helpers.js +161 -0
  211. package/dist/foundations/read-only/handler.d.ts +3 -0
  212. package/dist/foundations/read-only/handler.d.ts.map +1 -0
  213. package/dist/foundations/read-only/handler.js +32 -0
  214. package/dist/foundations/zombie/handler.d.ts +3 -0
  215. package/dist/foundations/zombie/handler.d.ts.map +1 -0
  216. package/dist/foundations/zombie/handler.js +92 -0
  217. package/dist/foundations/zombie/helpers.d.ts +16 -0
  218. package/dist/foundations/zombie/helpers.d.ts.map +1 -0
  219. package/dist/foundations/zombie/helpers.js +97 -0
  220. package/dist/index.d.ts +17 -0
  221. package/dist/index.d.ts.map +1 -0
  222. package/dist/index.js +47 -0
  223. package/dist/internal/common.d.ts +3 -0
  224. package/dist/internal/common.d.ts.map +1 -0
  225. package/dist/internal/common.js +41 -0
  226. package/dist/internal/index.d.ts +4 -0
  227. package/dist/internal/index.d.ts.map +1 -0
  228. package/dist/internal/index.js +3 -0
  229. package/dist/internal/logger.d.ts +24 -0
  230. package/dist/internal/logger.d.ts.map +1 -0
  231. package/dist/internal/logger.js +66 -0
  232. package/dist/internal/logging.d.ts +7 -0
  233. package/dist/internal/logging.d.ts.map +1 -0
  234. package/dist/internal/logging.js +36 -0
  235. package/dist/moondebug.d.ts +3 -0
  236. package/dist/moondebug.d.ts.map +1 -0
  237. package/dist/moondebug.js +2 -0
  238. package/dist/services/cache/FileLock.d.ts +11 -0
  239. package/dist/services/cache/FileLock.d.ts.map +1 -0
  240. package/dist/services/cache/FileLock.js +68 -0
  241. package/dist/services/cache/StartupCacheService.d.ts +23 -0
  242. package/dist/services/cache/StartupCacheService.d.ts.map +1 -0
  243. package/dist/services/cache/StartupCacheService.js +159 -0
  244. package/dist/services/cache/index.d.ts +3 -0
  245. package/dist/services/cache/index.d.ts.map +1 -0
  246. package/dist/services/cache/index.js +2 -0
  247. package/dist/services/chopsticks/ChopsticksMultiChain.d.ts +158 -0
  248. package/dist/services/chopsticks/ChopsticksMultiChain.d.ts.map +1 -0
  249. package/dist/services/chopsticks/ChopsticksMultiChain.js +282 -0
  250. package/dist/services/chopsticks/ChopsticksService.d.ts +313 -0
  251. package/dist/services/chopsticks/ChopsticksService.d.ts.map +1 -0
  252. package/dist/services/chopsticks/ChopsticksService.js +77 -0
  253. package/dist/services/chopsticks/chopsticksConfigParser.d.ts +40 -0
  254. package/dist/services/chopsticks/chopsticksConfigParser.d.ts.map +1 -0
  255. package/dist/services/chopsticks/chopsticksConfigParser.js +201 -0
  256. package/dist/services/chopsticks/index.d.ts +5 -0
  257. package/dist/services/chopsticks/index.d.ts.map +1 -0
  258. package/dist/services/chopsticks/index.js +4 -0
  259. package/dist/services/chopsticks/launchChopsticksEffect.d.ts +225 -0
  260. package/dist/services/chopsticks/launchChopsticksEffect.d.ts.map +1 -0
  261. package/dist/services/chopsticks/launchChopsticksEffect.js +623 -0
  262. package/dist/services/config/configAccessors.d.ts +41 -0
  263. package/dist/services/config/configAccessors.d.ts.map +1 -0
  264. package/dist/services/config/configAccessors.js +149 -0
  265. package/dist/services/config/index.d.ts +2 -0
  266. package/dist/services/config/index.d.ts.map +1 -0
  267. package/dist/services/config/index.js +1 -0
  268. package/dist/services/errors.d.ts +72 -0
  269. package/dist/services/errors.d.ts.map +1 -0
  270. package/dist/services/errors.js +31 -0
  271. package/dist/services/index.d.ts +7 -0
  272. package/dist/services/index.d.ts.map +1 -0
  273. package/dist/services/index.js +6 -0
  274. package/dist/services/network/NodeReadinessService.d.ts +35 -0
  275. package/dist/services/network/NodeReadinessService.d.ts.map +1 -0
  276. package/dist/services/network/NodeReadinessService.js +120 -0
  277. package/dist/services/network/PortDiscoveryService.d.ts +22 -0
  278. package/dist/services/network/PortDiscoveryService.d.ts.map +1 -0
  279. package/dist/services/network/PortDiscoveryService.js +77 -0
  280. package/dist/services/network/RpcPortDiscoveryService.d.ts +25 -0
  281. package/dist/services/network/RpcPortDiscoveryService.d.ts.map +1 -0
  282. package/dist/services/network/RpcPortDiscoveryService.js +136 -0
  283. package/dist/services/network/index.d.ts +4 -0
  284. package/dist/services/network/index.d.ts.map +1 -0
  285. package/dist/services/network/index.js +3 -0
  286. package/dist/services/process/ProcessManagerService.d.ts +49 -0
  287. package/dist/services/process/ProcessManagerService.d.ts.map +1 -0
  288. package/dist/services/process/ProcessManagerService.js +162 -0
  289. package/dist/services/process/index.d.ts +3 -0
  290. package/dist/services/process/index.d.ts.map +1 -0
  291. package/dist/services/process/index.js +2 -0
  292. package/dist/services/process/launchNodeEffect.d.ts +40 -0
  293. package/dist/services/process/launchNodeEffect.d.ts.map +1 -0
  294. package/dist/services/process/launchNodeEffect.js +86 -0
  295. package/dist/util/functions/index.d.ts +3 -0
  296. package/dist/util/functions/index.d.ts.map +1 -0
  297. package/dist/util/functions/index.js +4 -0
  298. package/dist/util/index.d.ts +4 -0
  299. package/dist/util/index.d.ts.map +1 -0
  300. package/dist/util/index.js +2 -0
  301. package/package.json +157 -0
@@ -0,0 +1,56 @@
1
+ import child_process from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { createLogger } from "../../util/index.js";
4
+ const logger = createLogger({ name: "actions:runner" });
5
+ const debug = logger.debug.bind(logger);
6
+ const execAsync = promisify(child_process.exec);
7
+ /**
8
+ * Wraps a promise with a timeout. If the original promise does not resolve within the specified time, it rejects.
9
+ * @param promise The original promise to wrap.
10
+ * @param ms The timeout duration in milliseconds.
11
+ * @returns A promise that either resolves/rejects with the original promise or rejects with a timeout error.
12
+ */
13
+ export const withTimeout = (promise, ms) => {
14
+ return Promise.race([
15
+ promise,
16
+ new Promise((_, reject) => setTimeout(() => reject(new Error("Operation timed out")), ms)),
17
+ ]);
18
+ };
19
+ // Execute process and return the output
20
+ export async function runTask(cmd, { cwd, env } = {
21
+ cwd: process.cwd(),
22
+ }, title) {
23
+ debug(`${title ? `Title: ${title}\n` : ""}Running task on directory ${cwd}: ${cmd}\n`);
24
+ try {
25
+ const result = await execAsync(cmd, { cwd, env });
26
+ return result.stdout;
27
+ }
28
+ catch (error) {
29
+ const status = error.status ? `[${error.status}]` : "[Unknown Status]";
30
+ const message = error.message ? `${error.message}` : "No Error Message";
31
+ debug(`Caught exception in command execution. Error[${status}] ${message}`);
32
+ throw error;
33
+ }
34
+ }
35
+ // Execute process return the emitter instantly, without wait
36
+ export async function spawnTask(cmd, { cwd, env } = {
37
+ cwd: process.cwd(),
38
+ }, title) {
39
+ debug(`${title ? `Title: ${title}\n` : ""}Running task on directory ${process.cwd()}: ${cmd}\n`);
40
+ try {
41
+ const process = child_process.spawn(cmd.split(" ")[0], cmd
42
+ .split(" ")
43
+ .slice(1)
44
+ .filter((a) => a.length > 0), {
45
+ cwd,
46
+ env,
47
+ });
48
+ return process;
49
+ }
50
+ catch (error) {
51
+ const status = error.status ? `[${error.status}]` : "[Unknown Status]";
52
+ const message = error.message ? `${error.message}` : "No Error Message";
53
+ debug(`Caught exception in command execution. Error[${status}] ${message}\n`);
54
+ throw error;
55
+ }
56
+ }
@@ -0,0 +1,48 @@
1
+ import type { MoonwallProvider, ProviderConfig, ProviderMap, ProviderType, ViemClient } from "../../api/types/index.js";
2
+ import { ApiPromise } from "@polkadot/api";
3
+ import { Wallet } from "ethers";
4
+ import { type PolkadotClient } from "polkadot-api";
5
+ import { Web3 } from "web3";
6
+ export declare class ProviderFactory {
7
+ private providerConfig;
8
+ private url;
9
+ private privateKey;
10
+ constructor(providerConfig: ProviderConfig);
11
+ create(): MoonwallProvider;
12
+ private createPolkadotJs;
13
+ private createWeb3;
14
+ private createEthers;
15
+ private createViem;
16
+ private createPapi;
17
+ private createDefault;
18
+ static prepare(providerConfigs: ProviderConfig[]): MoonwallProvider[];
19
+ static prepareDefaultDev(): MoonwallProvider[];
20
+ static prepareDefaultZombie(): MoonwallProvider[];
21
+ static prepareNoEthDefaultZombie(): MoonwallProvider[];
22
+ }
23
+ interface GenericProvider<T extends ProviderType> {
24
+ name: string;
25
+ api: ProviderMap[T];
26
+ type: T;
27
+ greet: () => Promise<void> | Promise<{
28
+ rtVersion: number;
29
+ rtName: string;
30
+ }>;
31
+ disconnect: () => void | Promise<void>;
32
+ }
33
+ export declare class ProviderInterfaceFactory {
34
+ name: string;
35
+ type: ProviderType;
36
+ connect: () => Promise<ApiPromise> | Wallet | Web3 | Promise<ViemClient> | PolkadotClient | null;
37
+ constructor(name: string, type: ProviderType, connect: () => Promise<ApiPromise> | Wallet | Web3 | Promise<ViemClient> | PolkadotClient | null);
38
+ create(): Promise<GenericProvider<this["type"]>>;
39
+ private createPolkadotJs;
40
+ private createWeb3;
41
+ private createEthers;
42
+ private createViem;
43
+ private createPapi;
44
+ static populate(name: string, type: ProviderType, connect: () => Promise<ApiPromise> | Wallet | Web3 | Promise<ViemClient> | PolkadotClient | null): Promise<GenericProvider<ProviderType>>;
45
+ }
46
+ export declare const vitestAutoUrl: () => string;
47
+ export {};
48
+ //# sourceMappingURL=providerFactories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providerFactories.d.ts","sourceRoot":"","sources":["../../../src/cli/internal/providerFactories.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,YAAY,EACZ,UAAU,EACX,iCAAiC;AAOlC,OAAO,EAAE,UAAU,EAAc,MAAM,eAAe,CAAC;AAEvD,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAIjE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAuE5B,qBAAa,eAAe;IAId,OAAO,CAAC,cAAc;IAHlC,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,UAAU,CAAS;gBAEP,cAAc,EAAE,cAAc;IAe3C,MAAM,IAAI,gBAAgB;IAiBjC,OAAO,CAAC,gBAAgB;IA8CxB,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,UAAU;IAgClB,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,aAAa;WAYP,OAAO,CAAC,eAAe,EAAE,cAAc,EAAE,GAAG,gBAAgB,EAAE;WAI9D,iBAAiB,IAAI,gBAAgB,EAAE;WAyBvC,oBAAoB,IAAI,gBAAgB,EAAE;WAsC1C,yBAAyB,IAAI,gBAAgB,EAAE;CAqB9D;AAED,UAAU,eAAe,CAAC,CAAC,SAAS,YAAY;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5E,UAAU,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC;AAED,qBAAa,wBAAwB;IAE1B,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,YAAY;IAClB,OAAO,EAAE,MACZ,OAAO,CAAC,UAAU,CAAC,GACnB,MAAM,GACN,IAAI,GACJ,OAAO,CAAC,UAAU,CAAC,GACnB,cAAc,GACd,IAAI;gBARD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,MACZ,OAAO,CAAC,UAAU,CAAC,GACnB,MAAM,GACN,IAAI,GACJ,OAAO,CAAC,UAAU,CAAC,GACnB,cAAc,GACd,IAAI;IAGG,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAiB/C,gBAAgB;YAwBhB,UAAU;YAiBV,YAAY;YAyBZ,UAAU;YAcV,UAAU;WAiBJ,QAAQ,CAC1B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,cAAc,GAAG,IAAI;CAgBnG;AAED,eAAO,MAAM,aAAa,cAMzB,CAAC"}
@@ -0,0 +1,442 @@
1
+ import { ALITH_PRIVATE_KEY, createLogger, deriveViemChain, normalizeUrlToHttps, } from "../../util/index.js";
2
+ import { ApiPromise, WsProvider } from "@polkadot/api";
3
+ import { Wallet, ethers } from "ethers";
4
+ import { createClient } from "polkadot-api";
5
+ import { getWsProvider } from "polkadot-api/ws-provider";
6
+ import { createWalletClient, http, publicActions } from "viem";
7
+ import { privateKeyToAccount } from "viem/accounts";
8
+ import { Web3 } from "web3";
9
+ import { WebSocketProvider } from "web3-providers-ws";
10
+ import { withPolkadotSdkCompat } from "polkadot-api/polkadot-sdk-compat";
11
+ import * as fs from "node:fs";
12
+ import * as path from "node:path";
13
+ const logger = createLogger({ name: "providers" });
14
+ const debug = logger.debug.bind(logger);
15
+ /**
16
+ * Get the metadata cache directory.
17
+ * Uses MOONWALL_CACHE_DIR if set (from startup caching), otherwise defaults to tmp/metadata-cache.
18
+ */
19
+ const getMetadataCacheDir = () => {
20
+ return process.env.MOONWALL_CACHE_DIR || path.join(process.cwd(), "tmp", "metadata-cache");
21
+ };
22
+ /**
23
+ * Load cached metadata if available, returns { genesisHash: metadataHex } or undefined
24
+ */
25
+ const loadCachedMetadata = () => {
26
+ const cacheDir = getMetadataCacheDir();
27
+ const metadataPath = path.join(cacheDir, "metadata-cache.json");
28
+ try {
29
+ const data = fs.readFileSync(metadataPath, "utf-8");
30
+ const cached = JSON.parse(data);
31
+ debug(`Loaded cached metadata for genesis: ${Object.keys(cached).join(", ")}`);
32
+ return cached;
33
+ }
34
+ catch {
35
+ return undefined;
36
+ }
37
+ };
38
+ /**
39
+ * Save metadata to cache for future connections
40
+ */
41
+ const saveCachedMetadata = (genesisHash, metadataHex) => {
42
+ const cacheDir = getMetadataCacheDir();
43
+ // Ensure cache directory exists
44
+ try {
45
+ fs.mkdirSync(cacheDir, { recursive: true });
46
+ }
47
+ catch {
48
+ // Directory might already exist or creation failed, try to continue
49
+ }
50
+ const metadataPath = path.join(cacheDir, "metadata-cache.json");
51
+ const lockPath = `${metadataPath}.lock`;
52
+ try {
53
+ // Simple lock to prevent concurrent writes
54
+ try {
55
+ fs.openSync(lockPath, fs.constants.O_CREAT | fs.constants.O_EXCL);
56
+ }
57
+ catch {
58
+ // Another process is writing, skip
59
+ return;
60
+ }
61
+ const data = JSON.stringify({ [genesisHash]: metadataHex });
62
+ fs.writeFileSync(metadataPath, data, "utf-8");
63
+ debug(`Saved metadata cache for genesis: ${genesisHash}`);
64
+ }
65
+ catch (e) {
66
+ debug(`Failed to save metadata cache: ${e}`);
67
+ }
68
+ finally {
69
+ try {
70
+ fs.unlinkSync(lockPath);
71
+ }
72
+ catch {
73
+ /* ignore */
74
+ }
75
+ }
76
+ };
77
+ export class ProviderFactory {
78
+ providerConfig;
79
+ url;
80
+ privateKey;
81
+ constructor(providerConfig) {
82
+ this.providerConfig = providerConfig;
83
+ const endpoint = providerConfig.endpoints[0];
84
+ // Support "AUTO" endpoint that uses dynamic MOONWALL_RPC_PORT
85
+ if (endpoint === "AUTO" || endpoint.includes("ENV_VAR")) {
86
+ this.url =
87
+ endpoint === "AUTO"
88
+ ? vitestAutoUrl()
89
+ : process.env.WSS_URL || "error_missing_WSS_URL_env_var";
90
+ }
91
+ else {
92
+ this.url = endpoint;
93
+ }
94
+ debug(`Constructor - providerConfig.endpoints[0]: ${endpoint}, this.url: ${this.url}`);
95
+ this.privateKey = process.env.MOON_PRIV_KEY || ALITH_PRIVATE_KEY;
96
+ }
97
+ create() {
98
+ switch (this.providerConfig.type) {
99
+ case "polkadotJs":
100
+ return this.createPolkadotJs();
101
+ case "web3":
102
+ return this.createWeb3();
103
+ case "ethers":
104
+ return this.createEthers();
105
+ case "viem":
106
+ return this.createViem();
107
+ case "papi":
108
+ return this.createPapi();
109
+ default:
110
+ return this.createDefault();
111
+ }
112
+ }
113
+ createPolkadotJs() {
114
+ debug(`🟢 PolkadotJs provider ${this.providerConfig.name} details prepared to connect to ${this.url}`);
115
+ // Check if metadata caching is enabled (default: true)
116
+ const cacheEnabled = this.providerConfig.cacheMetadata !== false;
117
+ return {
118
+ name: this.providerConfig.name,
119
+ type: this.providerConfig.type,
120
+ connect: async () => {
121
+ const cachedMetadata = cacheEnabled ? loadCachedMetadata() : undefined;
122
+ const startTime = Date.now();
123
+ const options = {
124
+ provider: new WsProvider(this.url),
125
+ initWasm: false,
126
+ noInitWarn: true,
127
+ isPedantic: false,
128
+ rpc: this.providerConfig.rpc ? this.providerConfig.rpc : undefined,
129
+ typesBundle: this.providerConfig.additionalTypes
130
+ ? this.providerConfig.additionalTypes
131
+ : undefined,
132
+ metadata: cachedMetadata,
133
+ };
134
+ const api = await ApiPromise.create(options);
135
+ await api.isReady;
136
+ // Cache metadata for future connections if caching is enabled and not already cached
137
+ if (cacheEnabled && !cachedMetadata) {
138
+ const genesisHash = api.genesisHash.toHex();
139
+ const metadataHex = api.runtimeMetadata.toHex();
140
+ saveCachedMetadata(genesisHash, metadataHex);
141
+ debug(`PolkadotJs connected in ${Date.now() - startTime}ms (metadata fetched & cached)`);
142
+ }
143
+ else if (cachedMetadata) {
144
+ debug(`PolkadotJs connected in ${Date.now() - startTime}ms (using cached metadata)`);
145
+ }
146
+ else {
147
+ debug(`PolkadotJs connected in ${Date.now() - startTime}ms (caching disabled)`);
148
+ }
149
+ return api;
150
+ },
151
+ ws: (timeout) => new WsProvider(this.url, 1000, {}, timeout),
152
+ };
153
+ }
154
+ createWeb3() {
155
+ debug(`🟢 Web3 provider ${this.providerConfig.name} details prepared`);
156
+ return {
157
+ name: this.providerConfig.name,
158
+ type: this.providerConfig.type,
159
+ connect: () => {
160
+ const provider = new WebSocketProvider(this.url, {}, { delay: 50, autoReconnect: false, maxAttempts: 10 });
161
+ return new Web3(provider);
162
+ },
163
+ };
164
+ }
165
+ createEthers() {
166
+ debug(`🟢 Ethers provider ${this.providerConfig.name} details prepared`);
167
+ return {
168
+ name: this.providerConfig.name,
169
+ type: this.providerConfig.type,
170
+ connect: () => {
171
+ const provider = this.url.startsWith("ws")
172
+ ? new ethers.WebSocketProvider(this.url)
173
+ : new ethers.JsonRpcProvider(this.url);
174
+ return new Wallet(this.privateKey, provider);
175
+ },
176
+ };
177
+ }
178
+ createViem() {
179
+ debug(`🟢 Viem omni provider ${this.providerConfig.name} details prepared`);
180
+ return {
181
+ name: this.providerConfig.name,
182
+ type: this.providerConfig.type,
183
+ connect: async () => {
184
+ try {
185
+ debug(`Original URL (this.url): ${this.url}`);
186
+ const httpUrl = normalizeUrlToHttps(this.url);
187
+ debug(`Converted HTTP URL: ${httpUrl} for provider ${this.providerConfig.name}`);
188
+ debug(`🔌 Attempting to derive chain for viem provider ${this.providerConfig.name} from ${httpUrl}`);
189
+ const chain = await deriveViemChain(httpUrl);
190
+ const client = createWalletClient({
191
+ chain,
192
+ account: privateKeyToAccount(this.privateKey),
193
+ transport: http(httpUrl),
194
+ }).extend(publicActions);
195
+ return client;
196
+ }
197
+ catch (error) {
198
+ console.error(`❌ Failed to create viem provider ${this.providerConfig.name} at ${this.url}: ${error.message}`);
199
+ throw new Error(`Viem provider initialization failed for ${this.providerConfig.name} at ${this.url}: ${error.message}`);
200
+ }
201
+ },
202
+ };
203
+ }
204
+ createPapi() {
205
+ debug(`🟢 Papi provider ${this.providerConfig.name} details prepared`);
206
+ return {
207
+ name: this.providerConfig.name,
208
+ type: this.providerConfig.type,
209
+ connect: () => {
210
+ // Dev nodes in moonwall often sit idle between manual block builds, which means
211
+ // the default 40s websocket heartbeat in polkadot-api can trigger false
212
+ // disconnects. Relax the heartbeat so the connection remains up while the
213
+ // test orchestrator drives block production.
214
+ const provider = withPolkadotSdkCompat(getWsProvider(this.url, {}));
215
+ return createClient(provider);
216
+ },
217
+ };
218
+ }
219
+ createDefault() {
220
+ debug(`🟢 Default provider ${this.providerConfig.name} details prepared`);
221
+ return {
222
+ name: this.providerConfig.name,
223
+ type: this.providerConfig.type,
224
+ connect: () => {
225
+ console.log(`🚧 provider ${this.providerConfig.name} not yet implemented`);
226
+ return null;
227
+ },
228
+ };
229
+ }
230
+ static prepare(providerConfigs) {
231
+ return providerConfigs.map((providerConfig) => new ProviderFactory(providerConfig).create());
232
+ }
233
+ static prepareDefaultDev() {
234
+ return ProviderFactory.prepare([
235
+ {
236
+ name: "dev",
237
+ type: "polkadotJs",
238
+ endpoints: [vitestAutoUrl()],
239
+ },
240
+ {
241
+ name: "w3",
242
+ type: "web3",
243
+ endpoints: [vitestAutoUrl()],
244
+ },
245
+ {
246
+ name: "eth",
247
+ type: "ethers",
248
+ endpoints: [vitestAutoUrl()],
249
+ },
250
+ {
251
+ name: "public",
252
+ type: "viem",
253
+ endpoints: [vitestAutoUrl()],
254
+ },
255
+ ]);
256
+ }
257
+ static prepareDefaultZombie() {
258
+ const MOON_PARA_WSS = process.env.MOON_PARA_WSS || "error";
259
+ const MOON_RELAY_WSS = process.env.MOON_RELAY_WSS || "error";
260
+ const providers = [
261
+ {
262
+ name: "w3",
263
+ type: "web3",
264
+ endpoints: [MOON_PARA_WSS],
265
+ },
266
+ {
267
+ name: "eth",
268
+ type: "ethers",
269
+ endpoints: [MOON_PARA_WSS],
270
+ },
271
+ {
272
+ name: "viem",
273
+ type: "viem",
274
+ endpoints: [MOON_PARA_WSS],
275
+ },
276
+ {
277
+ name: "relaychain",
278
+ type: "polkadotJs",
279
+ endpoints: [MOON_RELAY_WSS],
280
+ },
281
+ ];
282
+ if (MOON_PARA_WSS !== "error") {
283
+ providers.push({
284
+ name: "parachain",
285
+ type: "polkadotJs",
286
+ endpoints: [MOON_PARA_WSS],
287
+ });
288
+ }
289
+ return ProviderFactory.prepare(providers);
290
+ }
291
+ static prepareNoEthDefaultZombie() {
292
+ const MOON_PARA_WSS = process.env.MOON_PARA_WSS || "error";
293
+ const MOON_RELAY_WSS = process.env.MOON_RELAY_WSS || "error";
294
+ const providers = [
295
+ {
296
+ name: "relaychain",
297
+ type: "polkadotJs",
298
+ endpoints: [MOON_RELAY_WSS],
299
+ },
300
+ ];
301
+ if (MOON_PARA_WSS !== "error") {
302
+ providers.push({
303
+ name: "parachain",
304
+ type: "polkadotJs",
305
+ endpoints: [MOON_PARA_WSS],
306
+ });
307
+ }
308
+ return ProviderFactory.prepare(providers);
309
+ }
310
+ }
311
+ export class ProviderInterfaceFactory {
312
+ name;
313
+ type;
314
+ connect;
315
+ constructor(name, type, connect) {
316
+ this.name = name;
317
+ this.type = type;
318
+ this.connect = connect;
319
+ }
320
+ async create() {
321
+ switch (this.type) {
322
+ case "polkadotJs":
323
+ return this.createPolkadotJs();
324
+ case "web3":
325
+ return this.createWeb3();
326
+ case "ethers":
327
+ return this.createEthers();
328
+ case "viem":
329
+ return this.createViem();
330
+ case "papi":
331
+ return this.createPapi();
332
+ default:
333
+ throw new Error("UNKNOWN TYPE");
334
+ }
335
+ }
336
+ async createPolkadotJs() {
337
+ debug(`🔌 Connecting PolkadotJs provider: ${this.name}`);
338
+ const api = (await this.connect());
339
+ debug(`✅ PolkadotJs provider ${this.name} connected`);
340
+ 1;
341
+ return {
342
+ name: this.name,
343
+ api,
344
+ type: "polkadotJs",
345
+ greet: async () => {
346
+ debug(`👋 Provider ${this.name} is connected to chain` +
347
+ ` ${api.consts.system.version.specName.toString()} ` +
348
+ `RT${api.consts.system.version.specVersion.toNumber()}`);
349
+ return {
350
+ rtVersion: api.consts.system.version.specVersion.toNumber(),
351
+ rtName: api.consts.system.version.specName.toString(),
352
+ };
353
+ },
354
+ disconnect: async () => api.disconnect(),
355
+ };
356
+ }
357
+ async createWeb3() {
358
+ const api = (await this.connect());
359
+ return {
360
+ name: this.name,
361
+ api,
362
+ type: "web3",
363
+ greet: async () => console.log(`👋 Provider ${this.name} is connected to chain ${await api.eth.getChainId()}`),
364
+ disconnect: async () => {
365
+ if (!api.eth.net.currentProvider) {
366
+ throw new Error("No connected web3 provider to disconnect from");
367
+ }
368
+ api.eth.net.currentProvider.disconnect();
369
+ },
370
+ };
371
+ }
372
+ async createEthers() {
373
+ const api = (await this.connect());
374
+ return {
375
+ name: this.name,
376
+ api,
377
+ type: "ethers",
378
+ greet: async () => {
379
+ if (!api.provider) {
380
+ throw new Error("No connected ethers provider to greet with");
381
+ }
382
+ debug(`👋 Provider ${this.name} is connected to chain ${(await api.provider.getNetwork()).chainId}`);
383
+ },
384
+ disconnect: () => {
385
+ if (!api.provider) {
386
+ throw new Error("No connected ethers provider to disconnect from");
387
+ }
388
+ api.provider.destroy();
389
+ },
390
+ };
391
+ }
392
+ async createViem() {
393
+ const api = (await this.connect());
394
+ return {
395
+ name: this.name,
396
+ api,
397
+ type: "viem",
398
+ greet: async () => console.log(`👋 Provider ${this.name} is connected to chain ${await api.getChainId()}`),
399
+ disconnect: async () => {
400
+ // Not needed until we switch to websockets
401
+ },
402
+ };
403
+ }
404
+ async createPapi() {
405
+ const api = (await this.connect());
406
+ return {
407
+ name: this.name,
408
+ api,
409
+ type: "papi",
410
+ greet: async () => {
411
+ const unsafeApi = await api.getUnsafeApi();
412
+ const { spec_version, spec_name } = await unsafeApi.constants.System.Version();
413
+ return { rtVersion: spec_version, rtName: spec_name };
414
+ },
415
+ async disconnect() {
416
+ api.destroy();
417
+ },
418
+ };
419
+ }
420
+ static async populate(name, type, connect) {
421
+ debug(`🔄 Populating provider: ${name} of type: ${type}`);
422
+ try {
423
+ const providerInterface = await new ProviderInterfaceFactory(name, type, connect).create();
424
+ debug(`✅ Successfully populated provider: ${name}`);
425
+ return providerInterface;
426
+ }
427
+ catch (error) {
428
+ if (error instanceof Error) {
429
+ console.error(`❌ Failed to populate provider: ${name} - ${error.message}`);
430
+ }
431
+ else {
432
+ console.error(`❌ Failed to populate provider: ${name} - Unknown error`);
433
+ }
434
+ throw error;
435
+ }
436
+ }
437
+ }
438
+ export const vitestAutoUrl = () => {
439
+ const url = `ws://127.0.0.1:${process.env.MOONWALL_RPC_PORT}`;
440
+ debug(`vitestAutoUrl - MOONWALL_RPC_PORT=${process.env.MOONWALL_RPC_PORT}, Generated URL: ${url}`);
441
+ return url;
442
+ };
@@ -0,0 +1,34 @@
1
+ export interface TestIds {
2
+ suiteId: string | undefined;
3
+ testIds: string[];
4
+ }
5
+ /**
6
+ * Extracts suite and test IDs from a Moonwall test file using AST parsing.
7
+ * This is more robust than regex as it handles comments, multiline formatting, etc.
8
+ */
9
+ export declare function extractTestIds(fileContent: string): TestIds;
10
+ /**
11
+ * Replaces the suite ID in a Moonwall test file.
12
+ * Returns the modified file content, or undefined if no describeSuite was found.
13
+ */
14
+ export declare function replaceSuiteId(fileContent: string, newId: string): string | undefined;
15
+ /**
16
+ * Checks if a file contains a describeSuite call (is a Moonwall test file).
17
+ */
18
+ export declare function hasSuiteDefinition(fileContent: string): boolean;
19
+ export interface MatchedTestFile {
20
+ filePath: string;
21
+ suiteId: string;
22
+ testIds: string[];
23
+ }
24
+ /**
25
+ * Finds all test files matching the pattern using ast-grep's parallel file search.
26
+ * Uses Rust threads for efficient parsing and searching.
27
+ *
28
+ * @param testDirs - Directories to search for test files
29
+ * @param includeGlobs - Glob patterns for files to include (e.g., ["*test*.ts", "*spec*.ts"])
30
+ * @param idPattern - Regex pattern to match against suite/test IDs
31
+ * @returns Promise resolving to array of matching file paths
32
+ */
33
+ export declare function findTestFilesMatchingPattern(testDirs: string[], includeGlobs: string[], idPattern: RegExp): Promise<string[]>;
34
+ //# sourceMappingURL=testIdParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testIdParser.d.ts","sourceRoot":"","sources":["../../../src/cli/internal/testIdParser.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAoCD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CA8B3D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA6BrF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAI/D;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,MAAM,EAAE,EAClB,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,EAAE,CAAC,CAmEnB"}