@pasosdejesus/m 0.15.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 (324) hide show
  1. package/dist/blockchain/deployments.d.ts +40 -0
  2. package/dist/blockchain/deployments.d.ts.map +1 -0
  3. package/dist/blockchain/deployments.js +64 -0
  4. package/dist/debug/DebugConsole.d.ts +22 -0
  5. package/dist/debug/DebugConsole.d.ts.map +1 -0
  6. package/dist/debug/DebugConsole.js +79 -0
  7. package/dist/debug/Logger.d.ts +38 -0
  8. package/dist/debug/Logger.d.ts.map +1 -0
  9. package/dist/debug/Logger.js +94 -0
  10. package/dist/debug/index.d.ts +6 -0
  11. package/dist/debug/index.d.ts.map +1 -0
  12. package/dist/debug/index.js +4 -0
  13. package/dist/debug/useLogger.d.ts +14 -0
  14. package/dist/debug/useLogger.d.ts.map +1 -0
  15. package/dist/debug/useLogger.js +23 -0
  16. package/dist/debug/utils.d.ts +10 -0
  17. package/dist/debug/utils.d.ts.map +1 -0
  18. package/dist/debug/utils.js +53 -0
  19. package/dist/e2e/assertions.d.ts +5 -0
  20. package/dist/e2e/assertions.d.ts.map +1 -0
  21. package/dist/e2e/assertions.js +18 -0
  22. package/dist/e2e/browser.d.ts +37 -0
  23. package/dist/e2e/browser.d.ts.map +1 -0
  24. package/dist/e2e/browser.js +97 -0
  25. package/dist/e2e/env.d.ts +18 -0
  26. package/dist/e2e/env.d.ts.map +1 -0
  27. package/dist/e2e/env.js +57 -0
  28. package/dist/e2e/index.d.ts +11 -0
  29. package/dist/e2e/index.d.ts.map +1 -0
  30. package/dist/e2e/index.js +8 -0
  31. package/dist/e2e/navigation.d.ts +4 -0
  32. package/dist/e2e/navigation.d.ts.map +1 -0
  33. package/dist/e2e/navigation.js +32 -0
  34. package/dist/e2e/siwe-mock.d.ts +11 -0
  35. package/dist/e2e/siwe-mock.d.ts.map +1 -0
  36. package/dist/e2e/siwe-mock.js +112 -0
  37. package/dist/e2e/siwe.d.ts +15 -0
  38. package/dist/e2e/siwe.d.ts.map +1 -0
  39. package/dist/e2e/siwe.js +85 -0
  40. package/dist/e2e/wallet-mock.d.ts +13 -0
  41. package/dist/e2e/wallet-mock.d.ts.map +1 -0
  42. package/dist/e2e/wallet-mock.js +91 -0
  43. package/dist/i18n/common-cli.d.ts +11 -0
  44. package/dist/i18n/common-cli.d.ts.map +1 -0
  45. package/dist/i18n/common-cli.js +22 -0
  46. package/dist/i18n/createTranslator.d.ts +28 -0
  47. package/dist/i18n/createTranslator.d.ts.map +1 -0
  48. package/dist/i18n/createTranslator.js +48 -0
  49. package/dist/i18n/index.d.ts +4 -0
  50. package/dist/i18n/index.d.ts.map +1 -0
  51. package/dist/i18n/index.js +2 -0
  52. package/dist/i18n/locales/cli.d.ts +3 -0
  53. package/dist/i18n/locales/cli.d.ts.map +1 -0
  54. package/dist/i18n/locales/cli.js +180 -0
  55. package/dist/i18n/types.d.ts +3 -0
  56. package/dist/i18n/types.d.ts.map +1 -0
  57. package/dist/i18n/types.js +1 -0
  58. package/dist/index.d.ts +2 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +15 -0
  61. package/dist/index.test.d.ts +2 -0
  62. package/dist/index.test.d.ts.map +1 -0
  63. package/dist/index.test.js +10 -0
  64. package/dist/m.d.ts +2 -0
  65. package/dist/m.d.ts.map +1 -0
  66. package/dist/m.js +334 -0
  67. package/dist/plugin.d.ts +10 -0
  68. package/dist/plugin.d.ts.map +1 -0
  69. package/dist/plugin.js +7 -0
  70. package/dist/shadcn_components/cn.d.ts +13 -0
  71. package/dist/shadcn_components/cn.d.ts.map +1 -0
  72. package/dist/shadcn_components/cn.js +15 -0
  73. package/dist/shadcn_components/ui/accordion.d.ts +8 -0
  74. package/dist/shadcn_components/ui/accordion.d.ts.map +1 -0
  75. package/dist/shadcn_components/ui/accordion.js +14 -0
  76. package/dist/shadcn_components/ui/alert-dialog.d.ts +21 -0
  77. package/dist/shadcn_components/ui/alert-dialog.d.ts.map +1 -0
  78. package/dist/shadcn_components/ui/alert-dialog.js +27 -0
  79. package/dist/shadcn_components/ui/alert.d.ts +9 -0
  80. package/dist/shadcn_components/ui/alert.d.ts.map +1 -0
  81. package/dist/shadcn_components/ui/alert.js +22 -0
  82. package/dist/shadcn_components/ui/avatar.d.ts +7 -0
  83. package/dist/shadcn_components/ui/avatar.d.ts.map +1 -0
  84. package/dist/shadcn_components/ui/avatar.js +12 -0
  85. package/dist/shadcn_components/ui/badge.d.ts +10 -0
  86. package/dist/shadcn_components/ui/badge.d.ts.map +1 -0
  87. package/dist/shadcn_components/ui/badge.js +22 -0
  88. package/dist/shadcn_components/ui/button.d.ts +11 -0
  89. package/dist/shadcn_components/ui/button.d.ts.map +1 -0
  90. package/dist/shadcn_components/ui/button.js +31 -0
  91. package/dist/shadcn_components/ui/card.d.ts +10 -0
  92. package/dist/shadcn_components/ui/card.d.ts.map +1 -0
  93. package/dist/shadcn_components/ui/card.js +24 -0
  94. package/dist/shadcn_components/ui/checkbox.d.ts +5 -0
  95. package/dist/shadcn_components/ui/checkbox.d.ts.map +1 -0
  96. package/dist/shadcn_components/ui/checkbox.js +9 -0
  97. package/dist/shadcn_components/ui/dialog.d.ts +20 -0
  98. package/dist/shadcn_components/ui/dialog.d.ts.map +1 -0
  99. package/dist/shadcn_components/ui/dialog.js +23 -0
  100. package/dist/shadcn_components/ui/dropdown-menu.d.ts +28 -0
  101. package/dist/shadcn_components/ui/dropdown-menu.d.ts.map +1 -0
  102. package/dist/shadcn_components/ui/dropdown-menu.js +36 -0
  103. package/dist/shadcn_components/ui/form.d.ts +24 -0
  104. package/dist/shadcn_components/ui/form.d.ts.map +1 -0
  105. package/dist/shadcn_components/ui/form.js +63 -0
  106. package/dist/shadcn_components/ui/input.d.ts +4 -0
  107. package/dist/shadcn_components/ui/input.d.ts.map +1 -0
  108. package/dist/shadcn_components/ui/input.js +6 -0
  109. package/dist/shadcn_components/ui/label.d.ts +6 -0
  110. package/dist/shadcn_components/ui/label.d.ts.map +1 -0
  111. package/dist/shadcn_components/ui/label.js +10 -0
  112. package/dist/shadcn_components/ui/menubar.d.ts +29 -0
  113. package/dist/shadcn_components/ui/menubar.d.ts.map +1 -0
  114. package/dist/shadcn_components/ui/menubar.js +46 -0
  115. package/dist/shadcn_components/ui/popover.d.ts +7 -0
  116. package/dist/shadcn_components/ui/popover.d.ts.map +1 -0
  117. package/dist/shadcn_components/ui/popover.js +10 -0
  118. package/dist/shadcn_components/ui/progress.d.ts +5 -0
  119. package/dist/shadcn_components/ui/progress.d.ts.map +1 -0
  120. package/dist/shadcn_components/ui/progress.js +8 -0
  121. package/dist/shadcn_components/ui/radio-group.d.ts +6 -0
  122. package/dist/shadcn_components/ui/radio-group.d.ts.map +1 -0
  123. package/dist/shadcn_components/ui/radio-group.js +15 -0
  124. package/dist/shadcn_components/ui/scroll-area.d.ts +6 -0
  125. package/dist/shadcn_components/ui/scroll-area.d.ts.map +1 -0
  126. package/dist/shadcn_components/ui/scroll-area.js +12 -0
  127. package/dist/shadcn_components/ui/select.d.ts +14 -0
  128. package/dist/shadcn_components/ui/select.d.ts.map +1 -0
  129. package/dist/shadcn_components/ui/select.js +27 -0
  130. package/dist/shadcn_components/ui/separator.d.ts +5 -0
  131. package/dist/shadcn_components/ui/separator.d.ts.map +1 -0
  132. package/dist/shadcn_components/ui/separator.js +8 -0
  133. package/dist/shadcn_components/ui/sheet.d.ts +26 -0
  134. package/dist/shadcn_components/ui/sheet.d.ts.map +1 -0
  135. package/dist/shadcn_components/ui/sheet.js +37 -0
  136. package/dist/shadcn_components/ui/skeleton.d.ts +3 -0
  137. package/dist/shadcn_components/ui/skeleton.d.ts.map +1 -0
  138. package/dist/shadcn_components/ui/skeleton.js +6 -0
  139. package/dist/shadcn_components/ui/slider.d.ts +5 -0
  140. package/dist/shadcn_components/ui/slider.d.ts.map +1 -0
  141. package/dist/shadcn_components/ui/slider.js +8 -0
  142. package/dist/shadcn_components/ui/switch.d.ts +5 -0
  143. package/dist/shadcn_components/ui/switch.d.ts.map +1 -0
  144. package/dist/shadcn_components/ui/switch.js +8 -0
  145. package/dist/shadcn_components/ui/table.d.ts +11 -0
  146. package/dist/shadcn_components/ui/table.d.ts.map +1 -0
  147. package/dist/shadcn_components/ui/table.js +20 -0
  148. package/dist/shadcn_components/ui/tabs.d.ts +8 -0
  149. package/dist/shadcn_components/ui/tabs.d.ts.map +1 -0
  150. package/dist/shadcn_components/ui/tabs.js +13 -0
  151. package/dist/shadcn_components/ui/textarea.d.ts +4 -0
  152. package/dist/shadcn_components/ui/textarea.d.ts.map +1 -0
  153. package/dist/shadcn_components/ui/textarea.js +8 -0
  154. package/dist/shadcn_components/ui/toast.d.ts +16 -0
  155. package/dist/shadcn_components/ui/toast.d.ts.map +1 -0
  156. package/dist/shadcn_components/ui/toast.js +34 -0
  157. package/dist/shadcn_components/ui/toaster.d.ts +2 -0
  158. package/dist/shadcn_components/ui/toaster.d.ts.map +1 -0
  159. package/dist/shadcn_components/ui/toaster.js +10 -0
  160. package/dist/shadcn_components/ui/tooltip.d.ts +8 -0
  161. package/dist/shadcn_components/ui/tooltip.d.ts.map +1 -0
  162. package/dist/shadcn_components/ui/tooltip.js +11 -0
  163. package/dist/shadcn_components/ui/use-toast.d.ts +45 -0
  164. package/dist/shadcn_components/ui/use-toast.d.ts.map +1 -0
  165. package/dist/shadcn_components/ui/use-toast.js +126 -0
  166. package/dist/tasks/context.d.ts +13 -0
  167. package/dist/tasks/context.d.ts.map +1 -0
  168. package/dist/tasks/context.js +310 -0
  169. package/dist/tasks/create.d.ts +2 -0
  170. package/dist/tasks/create.d.ts.map +1 -0
  171. package/dist/tasks/create.js +91 -0
  172. package/dist/tasks/db.d.ts +19 -0
  173. package/dist/tasks/db.d.ts.map +1 -0
  174. package/dist/tasks/db.js +791 -0
  175. package/dist/tasks/e2e.d.ts +2 -0
  176. package/dist/tasks/e2e.d.ts.map +1 -0
  177. package/dist/tasks/e2e.js +124 -0
  178. package/dist/tasks/edit.d.ts +7 -0
  179. package/dist/tasks/edit.d.ts.map +1 -0
  180. package/dist/tasks/edit.js +471 -0
  181. package/dist/tasks/engine.d.ts +2 -0
  182. package/dist/tasks/engine.d.ts.map +1 -0
  183. package/dist/tasks/engine.js +149 -0
  184. package/dist/tasks/env-diff.d.ts +2 -0
  185. package/dist/tasks/env-diff.d.ts.map +1 -0
  186. package/dist/tasks/env-diff.js +140 -0
  187. package/dist/tasks/fuzzy.d.ts +9 -0
  188. package/dist/tasks/fuzzy.d.ts.map +1 -0
  189. package/dist/tasks/fuzzy.js +153 -0
  190. package/dist/tasks/glob.d.ts +5 -0
  191. package/dist/tasks/glob.d.ts.map +1 -0
  192. package/dist/tasks/glob.js +57 -0
  193. package/dist/tasks/grep.d.ts +9 -0
  194. package/dist/tasks/grep.d.ts.map +1 -0
  195. package/dist/tasks/grep.js +93 -0
  196. package/dist/tasks/readfile.d.ts +2 -0
  197. package/dist/tasks/readfile.d.ts.map +1 -0
  198. package/dist/tasks/readfile.js +177 -0
  199. package/dist/tasks/update.d.ts +5 -0
  200. package/dist/tasks/update.d.ts.map +1 -0
  201. package/dist/tasks/update.js +200 -0
  202. package/dist/tasks/util.d.ts +12 -0
  203. package/dist/tasks/util.d.ts.map +1 -0
  204. package/dist/tasks/util.js +42 -0
  205. package/dist/tasks/wallet.d.ts +2 -0
  206. package/dist/tasks/wallet.d.ts.map +1 -0
  207. package/dist/tasks/wallet.js +697 -0
  208. package/dist/tasks/writefile.d.ts +2 -0
  209. package/dist/tasks/writefile.d.ts.map +1 -0
  210. package/dist/tasks/writefile.js +66 -0
  211. package/dist/templates/AGENTS.md.hbs +81 -0
  212. package/dist/templates/ARCHITECTURE.md.hbs +146 -0
  213. package/dist/templates/CONTRIBUTING.md.hbs +83 -0
  214. package/dist/templates/LICENCIA.md +21 -0
  215. package/dist/templates/LICENSE.md +15 -0
  216. package/dist/templates/Makefile +16 -0
  217. package/dist/templates/README.md.hbs +111 -0
  218. package/dist/templates/apps/.env.example.hbs +75 -0
  219. package/dist/templates/apps/hardhat/.prettierrc +16 -0
  220. package/dist/templates/apps/hardhat/MOCK_USDT_README.md +20 -0
  221. package/dist/templates/apps/hardhat/Makefile +13 -0
  222. package/dist/templates/apps/hardhat/README.md +129 -0
  223. package/dist/templates/apps/hardhat/bin/MusdtVerification +4 -0
  224. package/dist/templates/apps/hardhat/bin/approveDepositOwner +7 -0
  225. package/dist/templates/apps/hardhat/bin/contractVerification +9 -0
  226. package/dist/templates/apps/hardhat/bin/deployMockUSDT +7 -0
  227. package/dist/templates/apps/hardhat/bin/prepadJ.sh +14 -0
  228. package/dist/templates/apps/hardhat/bin/verifyMockUSDT +7 -0
  229. package/dist/templates/apps/hardhat/contracts/MockUSDT.sol +47 -0
  230. package/dist/templates/apps/hardhat/hardhat.config.ts +102 -0
  231. package/dist/templates/apps/hardhat/package.json +55 -0
  232. package/dist/templates/apps/hardhat/scripts/approveDepositOwner.ts +22 -0
  233. package/dist/templates/apps/hardhat/scripts/deployMockUSDT.ts +49 -0
  234. package/dist/templates/apps/hardhat/scripts/verifyDeployment.ts +93 -0
  235. package/dist/templates/apps/hardhat/scripts/verifyMockUSDT.ts +52 -0
  236. package/dist/templates/apps/hardhat/sync-abis.mjs +58 -0
  237. package/dist/templates/apps/hardhat/test/MockUSDT.test.ts +40 -0
  238. package/dist/templates/apps/hardhat/tsconfig.json +27 -0
  239. package/dist/templates/apps/nextjs/.config/kysely.config.ts +36 -0
  240. package/dist/templates/apps/nextjs/Makefile +24 -0
  241. package/dist/templates/apps/nextjs/README.md.hbs +76 -0
  242. package/dist/templates/apps/nextjs/abis/IERC20.json +74 -0
  243. package/dist/templates/apps/nextjs/abis/MockUSDT.json +242 -0
  244. package/dist/templates/apps/nextjs/abis/ReentrancyGuard.json +1 -0
  245. package/dist/templates/apps/nextjs/app/globals.css +3 -0
  246. package/dist/templates/apps/nextjs/app/layout.tsx.hbs +26 -0
  247. package/dist/templates/apps/nextjs/app/page.tsx.hbs +225 -0
  248. package/dist/templates/apps/nextjs/app/testui/page.tsx +371 -0
  249. package/dist/templates/apps/nextjs/bin/m +8 -0
  250. package/dist/templates/apps/nextjs/components.json +21 -0
  251. package/dist/templates/apps/nextjs/next-env.d.ts +5 -0
  252. package/dist/templates/apps/nextjs/next.config.ts +10 -0
  253. package/dist/templates/apps/nextjs/package.json.hbs +48 -0
  254. package/dist/templates/apps/nextjs/pnpm-workspace.yaml +13 -0
  255. package/dist/templates/apps/nextjs/postcss.config.mjs +6 -0
  256. package/dist/templates/apps/nextjs/tailwind.config.js +11 -0
  257. package/dist/templates/apps/nextjs/tests/helpers.ts +31 -0
  258. package/dist/templates/apps/nextjs/tests/index.test.ts +7 -0
  259. package/dist/templates/apps/nextjs/tests/setup-env.ts.hbs +8 -0
  260. package/dist/templates/apps/nextjs/tests/test-utils.example.test.ts +168 -0
  261. package/dist/templates/apps/nextjs/tsconfig.json +44 -0
  262. package/dist/templates/apps/nextjs/tsconfig.test.json +38 -0
  263. package/dist/templates/apps/nextjs/vitest.config.ts +13 -0
  264. package/dist/test-utils/fs-mocks.d.ts +32 -0
  265. package/dist/test-utils/fs-mocks.d.ts.map +1 -0
  266. package/dist/test-utils/fs-mocks.js +63 -0
  267. package/dist/test-utils/i18n-mock.d.ts +21 -0
  268. package/dist/test-utils/i18n-mock.d.ts.map +1 -0
  269. package/dist/test-utils/i18n-mock.js +29 -0
  270. package/dist/test-utils/index.d.ts +12 -0
  271. package/dist/test-utils/index.d.ts.map +1 -0
  272. package/dist/test-utils/index.js +11 -0
  273. package/dist/test-utils/kysely-mocks.d.ts +298 -0
  274. package/dist/test-utils/kysely-mocks.d.ts.map +1 -0
  275. package/dist/test-utils/kysely-mocks.js +173 -0
  276. package/dist/test-utils/radix-mocks.d.ts +134 -0
  277. package/dist/test-utils/radix-mocks.d.ts.map +1 -0
  278. package/dist/test-utils/radix-mocks.js +175 -0
  279. package/dist/test-utils/rainbowkit-mocks.d.ts +80 -0
  280. package/dist/test-utils/rainbowkit-mocks.d.ts.map +1 -0
  281. package/dist/test-utils/rainbowkit-mocks.js +247 -0
  282. package/dist/test-utils/viem-mocks.d.ts +86 -0
  283. package/dist/test-utils/viem-mocks.d.ts.map +1 -0
  284. package/dist/test-utils/viem-mocks.js +54 -0
  285. package/dist/util/cli-parser.d.ts +20 -0
  286. package/dist/util/cli-parser.d.ts.map +1 -0
  287. package/dist/util/cli-parser.js +38 -0
  288. package/dist/util/colors.d.ts +5 -0
  289. package/dist/util/colors.d.ts.map +1 -0
  290. package/dist/util/colors.js +5 -0
  291. package/dist/util/locale.d.ts +3 -0
  292. package/dist/util/locale.d.ts.map +1 -0
  293. package/dist/util/locale.js +10 -0
  294. package/dist/wba/client.d.ts +19 -0
  295. package/dist/wba/client.d.ts.map +1 -0
  296. package/dist/wba/client.js +31 -0
  297. package/dist/wba/index.d.ts +4 -0
  298. package/dist/wba/index.d.ts.map +1 -0
  299. package/dist/wba/index.js +2 -0
  300. package/dist/wba/routes/event.d.ts +32 -0
  301. package/dist/wba/routes/event.d.ts.map +1 -0
  302. package/dist/wba/routes/event.js +42 -0
  303. package/dist/wba/routes/index.d.ts +3 -0
  304. package/dist/wba/routes/index.d.ts.map +1 -0
  305. package/dist/wba/routes/index.js +2 -0
  306. package/dist/wba/routes/summary.d.ts +44 -0
  307. package/dist/wba/routes/summary.d.ts.map +1 -0
  308. package/dist/wba/routes/summary.js +146 -0
  309. package/dist/wba/server.d.ts +18 -0
  310. package/dist/wba/server.d.ts.map +1 -0
  311. package/dist/wba/server.js +29 -0
  312. package/dist/wba/types.d.ts +68 -0
  313. package/dist/wba/types.d.ts.map +1 -0
  314. package/dist/wba/types.js +6 -0
  315. package/package.json +223 -0
  316. package/src/blockchain/README.md +80 -0
  317. package/src/debug/README.md +94 -0
  318. package/src/e2e/README.md +105 -0
  319. package/src/i18n/README.md +143 -0
  320. package/src/shadcn_components/README.md +125 -0
  321. package/src/tasks/README.md +69 -0
  322. package/src/test-utils/README.md +638 -0
  323. package/src/util/README.md +18 -0
  324. package/src/wba/README.md +175 -0
@@ -0,0 +1,40 @@
1
+ export interface Deployment {
2
+ contract: string;
3
+ address: string;
4
+ chainId: number;
5
+ network: string;
6
+ transactionHash: string;
7
+ deployedAt: string;
8
+ }
9
+ export interface DeploymentOptions {
10
+ /** Contract name, e.g. "PasosDeJesusCredentials". Enables hierarchical path. */
11
+ contract?: string;
12
+ /** Contract version, e.g. "v3". Required if contract is provided. */
13
+ version?: string;
14
+ }
15
+ /**
16
+ * Read a single deployment by network name.
17
+ *
18
+ * Paths tried (in order):
19
+ * 1. {deploymentsDir}/{contract}/{version}/{network}.json (if contract + version)
20
+ * 2. {deploymentsDir}/{network}.json (flat fallback)
21
+ *
22
+ * @param network e.g. "celoSepolia", "baseSepolia", "celo", "base"
23
+ * @param deploymentsDir Absolute or relative path to the deployments directory.
24
+ * Typically: path.join(projectRoot, 'apps', 'hardhat', 'deployments')
25
+ */
26
+ export declare function readDeployment(network: string, deploymentsDir: string, opts?: DeploymentOptions): Deployment | null;
27
+ /**
28
+ * Get contract address for a specific network.
29
+ * Falls back to environment variable if deployment file not found.
30
+ */
31
+ export declare function getContractAddress(network: string, envVar: string, deploymentsDir: string, opts?: DeploymentOptions): `0x${string}` | null;
32
+ /**
33
+ * Get Celo contract address.
34
+ */
35
+ export declare function getCeloCredentialsAddress(deploymentsDir: string, opts?: DeploymentOptions): `0x${string}` | null;
36
+ /**
37
+ * Get Base contract address.
38
+ */
39
+ export declare function getBaseCredentialsAddress(deploymentsDir: string, opts?: DeploymentOptions): `0x${string}` | null;
40
+ //# sourceMappingURL=deployments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployments.d.ts","sourceRoot":"","sources":["../../src/blockchain/deployments.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,EACtB,IAAI,CAAC,EAAE,iBAAiB,GACvB,UAAU,GAAG,IAAI,CAenB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,IAAI,CAAC,EAAE,iBAAiB,GACvB,KAAK,MAAM,EAAE,GAAG,IAAI,CAQtB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,MAAM,EACtB,IAAI,CAAC,EAAE,iBAAiB,GACvB,KAAK,MAAM,EAAE,GAAG,IAAI,CAGtB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,MAAM,EACtB,IAAI,CAAC,EAAE,iBAAiB,GACvB,KAAK,MAAM,EAAE,GAAG,IAAI,CAGtB"}
@@ -0,0 +1,64 @@
1
+ // src/blockchain/deployments.ts
2
+ // Read contract addresses from deployment JSON files.
3
+ //
4
+ // Deployment files support two layouts:
5
+ // Flat: apps/hardhat/deployments/{network}.json
6
+ // Hierarchical: apps/hardhat/deployments/{Contract}/{Version}/{network}.json
7
+ //
8
+ // When contract + version are provided, the hierarchical path is tried first,
9
+ // falling back to the flat path.
10
+ import fs from 'fs';
11
+ import path from 'path';
12
+ /**
13
+ * Read a single deployment by network name.
14
+ *
15
+ * Paths tried (in order):
16
+ * 1. {deploymentsDir}/{contract}/{version}/{network}.json (if contract + version)
17
+ * 2. {deploymentsDir}/{network}.json (flat fallback)
18
+ *
19
+ * @param network e.g. "celoSepolia", "baseSepolia", "celo", "base"
20
+ * @param deploymentsDir Absolute or relative path to the deployments directory.
21
+ * Typically: path.join(projectRoot, 'apps', 'hardhat', 'deployments')
22
+ */
23
+ export function readDeployment(network, deploymentsDir, opts) {
24
+ const { contract, version } = opts || {};
25
+ // 1. Hierarchical path
26
+ if (contract && version) {
27
+ const hierFile = path.join(deploymentsDir, contract, version, `${network}.json`);
28
+ if (fs.existsSync(hierFile)) {
29
+ return JSON.parse(fs.readFileSync(hierFile, 'utf-8'));
30
+ }
31
+ }
32
+ // 2. Flat fallback
33
+ const flatFile = path.join(deploymentsDir, `${network}.json`);
34
+ if (!fs.existsSync(flatFile))
35
+ return null;
36
+ return JSON.parse(fs.readFileSync(flatFile, 'utf-8'));
37
+ }
38
+ /**
39
+ * Get contract address for a specific network.
40
+ * Falls back to environment variable if deployment file not found.
41
+ */
42
+ export function getContractAddress(network, envVar, deploymentsDir, opts) {
43
+ const deployment = readDeployment(network, deploymentsDir, opts);
44
+ if (deployment)
45
+ return deployment.address;
46
+ const addr = process.env[envVar];
47
+ if (addr)
48
+ return addr;
49
+ return null;
50
+ }
51
+ /**
52
+ * Get Celo contract address.
53
+ */
54
+ export function getCeloCredentialsAddress(deploymentsDir, opts) {
55
+ const network = process.env.NEXT_PUBLIC_NETWORK === 'celo' ? 'celo' : 'celoSepolia';
56
+ return getContractAddress(network, 'NEXT_PUBLIC_PDJCREDENTIALS_CELO_ADDRESS', deploymentsDir, opts);
57
+ }
58
+ /**
59
+ * Get Base contract address.
60
+ */
61
+ export function getBaseCredentialsAddress(deploymentsDir, opts) {
62
+ const network = process.env.NEXT_PUBLIC_BASE_NETWORK === 'base' ? 'base' : 'baseSepolia';
63
+ return getContractAddress(network, 'NEXT_PUBLIC_PDJCREDENTIALS_BASE_ADDRESS', deploymentsDir, opts);
64
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Floating debug console for MiniPay and embedded browsers.
3
+ *
4
+ * Renders as a small `>_` button in the bottom-right corner when enabled.
5
+ * Clicking opens a log viewer with copy, clear, and minimize controls.
6
+ *
7
+ * Enabled via:
8
+ * - URL parameter `?debug=1` (recommended for testing)
9
+ * - Environment variable `NEXT_PUBLIC_M_DEBUGGER_CONSOLE=1` (build-time)
10
+ *
11
+ * To use, render once in your root client layout:
12
+ *
13
+ * ```tsx
14
+ * import { DebugConsole } from '@pasosdejesus/m/debug'
15
+ *
16
+ * export default function ClientLayout({ children }) {
17
+ * return <>{children}<DebugConsole /></>
18
+ * }
19
+ * ```
20
+ */
21
+ export declare function DebugConsole(): import("react").JSX.Element | null;
22
+ //# sourceMappingURL=DebugConsole.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DebugConsole.d.ts","sourceRoot":"","sources":["../../src/debug/DebugConsole.tsx"],"names":[],"mappings":"AAkCA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,YAAY,uCAyG3B"}
@@ -0,0 +1,79 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState, useEffect } from 'react';
4
+ import { useLogger } from './useLogger.js';
5
+ function getLevelColor(level) {
6
+ switch (level) {
7
+ case 'error':
8
+ return 'border-red-500 text-red-400';
9
+ case 'success':
10
+ return 'border-green-500 text-green-400';
11
+ case 'warning':
12
+ return 'border-yellow-500 text-yellow-400';
13
+ default:
14
+ return 'border-blue-500 text-blue-300';
15
+ }
16
+ }
17
+ function getLevelIcon(level) {
18
+ switch (level) {
19
+ case 'error':
20
+ return '❌';
21
+ case 'success':
22
+ return '✅';
23
+ case 'warning':
24
+ return '⚠️';
25
+ case 'debug':
26
+ return '🔍';
27
+ default:
28
+ return '📢';
29
+ }
30
+ }
31
+ /**
32
+ * Floating debug console for MiniPay and embedded browsers.
33
+ *
34
+ * Renders as a small `>_` button in the bottom-right corner when enabled.
35
+ * Clicking opens a log viewer with copy, clear, and minimize controls.
36
+ *
37
+ * Enabled via:
38
+ * - URL parameter `?debug=1` (recommended for testing)
39
+ * - Environment variable `NEXT_PUBLIC_M_DEBUGGER_CONSOLE=1` (build-time)
40
+ *
41
+ * To use, render once in your root client layout:
42
+ *
43
+ * ```tsx
44
+ * import { DebugConsole } from '@pasosdejesus/m/debug'
45
+ *
46
+ * export default function ClientLayout({ children }) {
47
+ * return <>{children}<DebugConsole /></>
48
+ * }
49
+ * ```
50
+ */
51
+ export function DebugConsole() {
52
+ const { logs, logger, isEnabled } = useLogger();
53
+ const [isVisible, setIsVisible] = useState(false);
54
+ const [isMinimized, setIsMinimized] = useState(false);
55
+ const [, setForceUpdate] = useState(0);
56
+ // Force refresh to capture new logs
57
+ useEffect(() => {
58
+ if (!isEnabled)
59
+ return;
60
+ const interval = setInterval(() => {
61
+ setForceUpdate((prev) => prev + 1);
62
+ }, 500);
63
+ return () => clearInterval(interval);
64
+ }, [isEnabled]);
65
+ const currentLogs = isEnabled ? logger.getLogs() : logs;
66
+ if (!isEnabled)
67
+ return null;
68
+ if (!isVisible) {
69
+ return (_jsx("button", { onClick: () => setIsVisible(true), className: "fixed bottom-4 right-4 z-50 bg-black/80 text-white p-2 rounded-full shadow-lg hover:bg-black transition-colors", title: "Open debug console", children: _jsx("span", { className: "text-lg font-mono font-bold", children: ">_" }) }));
70
+ }
71
+ const copyLogs = () => {
72
+ const text = currentLogs
73
+ .map((log) => `[${log.timestamp}]${log.source ? `[${log.source}]` : ''}${getLevelIcon(log.level)}${log.message}`)
74
+ .join('\n');
75
+ navigator.clipboard.writeText(text);
76
+ logger.success('Logs copied to clipboard', 'DebugConsole');
77
+ };
78
+ return (_jsxs("div", { className: `fixed bottom-4 right-4 z-50 bg-black/95 text-white rounded-lg shadow-xl overflow-hidden transition-all ${isMinimized ? 'w-80' : 'w-96'}`, children: [_jsxs("div", { className: "flex justify-between items-center p-3 bg-gray-800 border-b border-gray-700", children: [_jsxs("span", { className: "text-sm font-mono font-bold flex items-center gap-2", children: [_jsx("span", { children: ">_" }), "Debug Console", _jsx("span", { className: "text-[10px] bg-green-700 px-1 rounded", children: "ACTIVE" })] }), _jsxs("div", { className: "flex gap-2", children: [_jsx("button", { onClick: copyLogs, className: "text-gray-400 hover:text-blue-400", title: "Copy logs", children: "\uD83D\uDCCB" }), _jsx("button", { onClick: () => logger.clear(), className: "text-gray-400 hover:text-yellow-400", title: "Clear logs", children: "\uD83D\uDDD1" }), _jsx("button", { onClick: () => setIsMinimized(!isMinimized), className: "text-gray-400 hover:text-white", children: isMinimized ? '▲' : '▼' }), _jsx("button", { onClick: () => setIsVisible(false), className: "text-gray-400 hover:text-white text-xl leading-none", children: "\u2715" })] })] }), !isMinimized && (_jsxs("div", { className: "h-80 overflow-y-auto p-3 space-y-1 font-mono text-xs bg-black/95", children: [currentLogs.length === 0 && (_jsx("div", { className: "text-gray-500 text-center py-4", children: "No logs yet. Actions will generate messages here." })), currentLogs.map((log, i) => (_jsxs("div", { className: `border-l-2 pl-2 ${getLevelColor(log.level)}`, children: [_jsxs("span", { className: "text-gray-500", children: ["[", log.timestamp, "]"] }), log.source && (_jsxs("span", { className: "text-gray-600 ml-1", children: ["[", log.source, "]"] })), _jsx("span", { className: "ml-1", children: getLevelIcon(log.level) }), _jsx("span", { className: "ml-1", children: log.message })] }, i)))] }))] }));
79
+ }
@@ -0,0 +1,38 @@
1
+ export type LogLevel = 'info' | 'success' | 'error' | 'warning' | 'debug';
2
+ export interface LogEntry {
3
+ timestamp: string;
4
+ message: string;
5
+ level: LogLevel;
6
+ source?: string;
7
+ }
8
+ type Listener = (logs: LogEntry[]) => void;
9
+ /**
10
+ * Universal logging system.
11
+ *
12
+ * Always writes to console.log/console.error (browser DevTools).
13
+ * Optionally activates a floating in-app console via URL param (?debug=1)
14
+ * or environment variable `NEXT_PUBLIC_M_DEBUGGER_CONSOLE=1`.
15
+ *
16
+ * Buffers up to 500 log entries and notifies subscribers in real-time
17
+ * when the floating console is enabled.
18
+ */
19
+ export declare class Logger {
20
+ private logs;
21
+ private listeners;
22
+ private floatingConsoleEnabled;
23
+ constructor();
24
+ private addLog;
25
+ info(message: string, source?: string): void;
26
+ success(message: string, source?: string): void;
27
+ error(message: string, source?: string): void;
28
+ warning(message: string, source?: string): void;
29
+ debug(message: string, source?: string): void;
30
+ getLogs(): LogEntry[];
31
+ clear(): void;
32
+ subscribe(listener: Listener): () => void;
33
+ isFloatingConsoleEnabled(): boolean;
34
+ }
35
+ /** Singleton logger instance */
36
+ export declare const logger: Logger;
37
+ export {};
38
+ //# sourceMappingURL=Logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Logger.d.ts","sourceRoot":"","sources":["../../src/debug/Logger.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAA;AAEzE,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,QAAQ,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,KAAK,QAAQ,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAA;AAE1C;;;;;;;;;GASG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,sBAAsB,CAAiB;;IAe/C,OAAO,CAAC,MAAM;IAiCd,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAIrC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAIxC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAItC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAIxC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAMtC,OAAO,IAAI,QAAQ,EAAE;IAIrB,KAAK;IAOL,SAAS,CAAC,QAAQ,EAAE,QAAQ;IAO5B,wBAAwB,IAAI,OAAO;CAGpC;AAED,gCAAgC;AAChC,eAAO,MAAM,MAAM,QAAe,CAAA"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Universal logging system.
3
+ *
4
+ * Always writes to console.log/console.error (browser DevTools).
5
+ * Optionally activates a floating in-app console via URL param (?debug=1)
6
+ * or environment variable `NEXT_PUBLIC_M_DEBUGGER_CONSOLE=1`.
7
+ *
8
+ * Buffers up to 500 log entries and notifies subscribers in real-time
9
+ * when the floating console is enabled.
10
+ */
11
+ export class Logger {
12
+ logs = [];
13
+ listeners = [];
14
+ floatingConsoleEnabled = false;
15
+ constructor() {
16
+ if (typeof window !== 'undefined') {
17
+ const urlParams = new URLSearchParams(window.location.search);
18
+ const debugParam = urlParams.get('debug');
19
+ if (debugParam === '1') {
20
+ this.floatingConsoleEnabled = true;
21
+ }
22
+ else {
23
+ this.floatingConsoleEnabled =
24
+ process.env.NEXT_PUBLIC_M_DEBUGGER_CONSOLE === '1';
25
+ }
26
+ }
27
+ }
28
+ addLog(message, level, source) {
29
+ const entry = {
30
+ timestamp: new Date().toLocaleTimeString(),
31
+ message,
32
+ level,
33
+ source,
34
+ };
35
+ this.logs.push(entry);
36
+ if (this.logs.length > 500) {
37
+ this.logs = this.logs.slice(-500);
38
+ }
39
+ const prefix = `[${entry.timestamp}]${source ? ` [${source}]` : ''}`;
40
+ switch (level) {
41
+ case 'error':
42
+ console.error(prefix, message);
43
+ break;
44
+ case 'warning':
45
+ console.warn(prefix, message);
46
+ break;
47
+ case 'success':
48
+ console.log(`✅ ${prefix}`, message);
49
+ break;
50
+ default:
51
+ console.log(`📢 ${prefix}`, message);
52
+ }
53
+ if (this.floatingConsoleEnabled) {
54
+ this.listeners.forEach((listener) => listener([...this.logs]));
55
+ }
56
+ }
57
+ info(message, source) {
58
+ this.addLog(message, 'info', source);
59
+ }
60
+ success(message, source) {
61
+ this.addLog(message, 'success', source);
62
+ }
63
+ error(message, source) {
64
+ this.addLog(message, 'error', source);
65
+ }
66
+ warning(message, source) {
67
+ this.addLog(message, 'warning', source);
68
+ }
69
+ debug(message, source) {
70
+ if (process.env.NODE_ENV === 'development') {
71
+ this.addLog(message, 'debug', source);
72
+ }
73
+ }
74
+ getLogs() {
75
+ return [...this.logs];
76
+ }
77
+ clear() {
78
+ this.logs = [];
79
+ if (this.floatingConsoleEnabled) {
80
+ this.listeners.forEach((listener) => listener([]));
81
+ }
82
+ }
83
+ subscribe(listener) {
84
+ this.listeners.push(listener);
85
+ return () => {
86
+ this.listeners = this.listeners.filter((l) => l !== listener);
87
+ };
88
+ }
89
+ isFloatingConsoleEnabled() {
90
+ return this.floatingConsoleEnabled;
91
+ }
92
+ }
93
+ /** Singleton logger instance */
94
+ export const logger = new Logger();
@@ -0,0 +1,6 @@
1
+ export type { LogLevel, LogEntry } from './Logger.js';
2
+ export { Logger, logger } from './Logger.js';
3
+ export { useLogger } from './useLogger.js';
4
+ export { DebugConsole } from './DebugConsole.js';
5
+ export { safeStringify, debugLog } from './utils.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/debug/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,4 @@
1
+ export { Logger, logger } from './Logger.js';
2
+ export { useLogger } from './useLogger.js';
3
+ export { DebugConsole } from './DebugConsole.js';
4
+ export { safeStringify, debugLog } from './utils.js';
@@ -0,0 +1,14 @@
1
+ import type { LogEntry } from './Logger.js';
2
+ /**
3
+ * React hook for subscribing to Logger updates from client components.
4
+ *
5
+ * Must be imported only from 'use client' components.
6
+ * Returns { logs, logger, isEnabled } where `logs` updates in real-time
7
+ * when the floating debug console is enabled.
8
+ */
9
+ export declare function useLogger(): {
10
+ logs: LogEntry[];
11
+ logger: import("./Logger.js").Logger;
12
+ isEnabled: boolean;
13
+ };
14
+ //# sourceMappingURL=useLogger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLogger.d.ts","sourceRoot":"","sources":["../../src/debug/useLogger.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAG3C;;;;;;GAMG;AACH,wBAAgB,SAAS;;;;EAgBxB"}
@@ -0,0 +1,23 @@
1
+ 'use client';
2
+ import { useState, useEffect } from 'react';
3
+ import { logger } from './Logger.js';
4
+ /**
5
+ * React hook for subscribing to Logger updates from client components.
6
+ *
7
+ * Must be imported only from 'use client' components.
8
+ * Returns { logs, logger, isEnabled } where `logs` updates in real-time
9
+ * when the floating debug console is enabled.
10
+ */
11
+ export function useLogger() {
12
+ const [logs, setLogs] = useState([]);
13
+ const [isEnabled, setIsEnabled] = useState(false);
14
+ useEffect(() => {
15
+ setLogs(logger.getLogs());
16
+ setIsEnabled(logger.isFloatingConsoleEnabled());
17
+ const unsubscribe = logger.subscribe((newLogs) => {
18
+ setLogs(newLogs);
19
+ });
20
+ return unsubscribe;
21
+ }, []);
22
+ return { logs, logger, isEnabled };
23
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Serializes an object safely for logging.
3
+ * Handles circular references and non-serializable values.
4
+ */
5
+ export declare function safeStringify(obj: unknown, maxLength?: number): string;
6
+ /**
7
+ * Prints a labeled debug object to the console.
8
+ */
9
+ export declare function debugLog(label: string, data: unknown): void;
10
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/debug/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,SAAM,GAAG,MAAM,CAsCnE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAE3D"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Serializes an object safely for logging.
3
+ * Handles circular references and non-serializable values.
4
+ */
5
+ export function safeStringify(obj, maxLength = 500) {
6
+ if (obj === null)
7
+ return 'null';
8
+ if (obj === undefined)
9
+ return 'undefined';
10
+ if (typeof obj === 'string')
11
+ return obj;
12
+ if (typeof obj === 'number')
13
+ return obj.toString();
14
+ if (typeof obj === 'boolean')
15
+ return obj.toString();
16
+ if (typeof obj === 'function')
17
+ return '[Function]';
18
+ if (obj instanceof Error) {
19
+ return `${obj.name}: ${obj.message}${obj.stack ? `\n${obj.stack}` : ''}`;
20
+ }
21
+ if (typeof obj === 'object' && obj !== null && 'toJSON' in obj && typeof obj.toJSON === 'function') {
22
+ try {
23
+ return safeStringify(obj.toJSON(), maxLength);
24
+ }
25
+ catch {
26
+ return '[Circular or Invalid toJSON]';
27
+ }
28
+ }
29
+ try {
30
+ const seen = new WeakSet();
31
+ const serialized = JSON.stringify(obj, (_key, value) => {
32
+ if (typeof value === 'object' && value !== null) {
33
+ if (seen.has(value))
34
+ return '[Circular]';
35
+ seen.add(value);
36
+ }
37
+ return value;
38
+ }, 2);
39
+ if (serialized.length > maxLength) {
40
+ return serialized.substring(0, maxLength) + '... [truncated]';
41
+ }
42
+ return serialized;
43
+ }
44
+ catch (err) {
45
+ return `[Unable to serialize: ${err}]`;
46
+ }
47
+ }
48
+ /**
49
+ * Prints a labeled debug object to the console.
50
+ */
51
+ export function debugLog(label, data) {
52
+ console.log(`[DEBUG] ${label}:`, safeStringify(data));
53
+ }
@@ -0,0 +1,5 @@
1
+ export declare function resetFailures(): void;
2
+ export declare function ok(msg: string): void;
3
+ export declare function fail(msg: string): void;
4
+ export declare function summary(t0: number): number;
5
+ //# sourceMappingURL=assertions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertions.d.ts","sourceRoot":"","sources":["../../src/e2e/assertions.ts"],"names":[],"mappings":"AAKA,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,wBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEpC;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAGtC;AAED,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAI1C"}
@@ -0,0 +1,18 @@
1
+ // Assertion helpers for E2E tests — zero dependencies, pure Node.js
2
+ // Used by both Puppeteer specs and smoke (HTTP) tests.
3
+ let _failures = 0;
4
+ export function resetFailures() {
5
+ _failures = 0;
6
+ }
7
+ export function ok(msg) {
8
+ console.log(` ✅ ${msg}`);
9
+ }
10
+ export function fail(msg) {
11
+ console.error(` ❌ ${msg}`);
12
+ _failures++;
13
+ }
14
+ export function summary(t0) {
15
+ const elapsed = performance.now() - t0;
16
+ console.log(`\n${_failures === 0 ? '✅' : '❌'} ${_failures} failures | ${elapsed.toFixed(0)}ms`);
17
+ return _failures;
18
+ }
@@ -0,0 +1,37 @@
1
+ export interface E2EPage {
2
+ goto(url: string, opts?: {
3
+ waitUntil?: string;
4
+ timeout?: number;
5
+ }): Promise<any>;
6
+ close(): Promise<void>;
7
+ cookies(): Promise<Array<{
8
+ name: string;
9
+ value: string;
10
+ }>>;
11
+ evaluate(fn: any, ...args: any[]): Promise<any>;
12
+ evaluateOnNewDocument(fn: any, ...args: any[]): Promise<void>;
13
+ setDefaultTimeout(ms: number): void;
14
+ on(event: string, handler: (...args: any[]) => void): void;
15
+ $: (selector: string) => Promise<any>;
16
+ $$: (selector: string) => Promise<any[]>;
17
+ waitForFunction(fn: any, opts?: any): Promise<any>;
18
+ waitForNavigation(opts?: any): Promise<any>;
19
+ createCDPSession(): Promise<any>;
20
+ evaluateHandle(fn: any): Promise<any>;
21
+ }
22
+ export interface E2EBrowser {
23
+ newPage(): Promise<E2EPage>;
24
+ close(): Promise<void>;
25
+ createBrowserContext(): Promise<E2EBrowserContext>;
26
+ }
27
+ export interface E2EBrowserContext {
28
+ newPage(): Promise<E2EPage>;
29
+ close(): Promise<void>;
30
+ }
31
+ export declare function findChrome(): string;
32
+ export declare function launchBrowser(headless?: boolean): Promise<E2EBrowser>;
33
+ export declare function newPage(browser: E2EBrowser, address: string, timeout?: number, useEIP6963?: boolean): Promise<E2EPage>;
34
+ export declare function newIncognitoContext(browser: any): Promise<E2EBrowserContext>;
35
+ export declare function newIncognitoPage(ctx: E2EBrowserContext, address: string, timeout?: number, useEIP6963?: boolean): Promise<E2EPage>;
36
+ export declare function clearBrowserCache(page: E2EPage): Promise<void>;
37
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/e2e/browser.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IAChF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAA;IAC1D,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IAC/C,qBAAqB,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7D,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAA;IAC1D,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;IACrC,EAAE,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IACxC,eAAe,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IAClD,iBAAiB,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IAC3C,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,CAAA;IAChC,cAAc,CAAC,EAAE,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;CACtC;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACtB,oBAAoB,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAA;CACnD;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED,wBAAgB,UAAU,IAAI,MAAM,CASnC;AAcD,wBAAsB,aAAa,CAAC,QAAQ,GAAE,OAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAejF;AAED,wBAAsB,OAAO,CAC3B,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAAc,EACvB,UAAU,GAAE,OAAe,GAC1B,OAAO,CAAC,OAAO,CAAC,CAsBlB;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAElF;AAID,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,iBAAiB,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,MAAc,EACvB,UAAU,GAAE,OAAe,GAC1B,OAAO,CAAC,OAAO,CAAC,CAqBlB;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAIpE"}
@@ -0,0 +1,97 @@
1
+ // Browser launcher for E2E tests — Puppeteer on OpenBSD/adJ
2
+ // puppeteer-core must be installed by the consumer project (devDependency).
3
+ // We use fully dynamic import so m itself doesn't require puppeteer-core.
4
+ import * as fs from 'fs';
5
+ export function findChrome() {
6
+ if (process.env.CHROME_PATH && fs.existsSync(process.env.CHROME_PATH))
7
+ return process.env.CHROME_PATH;
8
+ // OpenBSD/adJ paths
9
+ const paths = ['/usr/local/bin/chrome', '/usr/local/bin/chromium', '/usr/local/bin/chromium-browser'];
10
+ for (const p of paths) {
11
+ if (fs.existsSync(p))
12
+ return p;
13
+ }
14
+ throw new Error('Chrome not found. Set CHROME_PATH or install chromium.');
15
+ }
16
+ async function loadPuppeteer() {
17
+ try {
18
+ return await Function('return import("puppeteer-core")')();
19
+ }
20
+ catch {
21
+ throw new Error('puppeteer-core is not installed. Install it in your project:\n' +
22
+ ' pnpm add -D puppeteer-core\n' +
23
+ 'Or use --smoke for HTTP-only tests.');
24
+ }
25
+ }
26
+ export async function launchBrowser(headless = true) {
27
+ const puppeteer = await loadPuppeteer();
28
+ return puppeteer.launch({
29
+ executablePath: findChrome(),
30
+ defaultViewport: { width: 1240, height: 800 },
31
+ headless,
32
+ args: [
33
+ '--no-sandbox',
34
+ '--disable-setuid-sandbox',
35
+ '--disable-dev-shm-usage',
36
+ '--disable-gpu',
37
+ '--ozone-platform=headless',
38
+ ],
39
+ });
40
+ }
41
+ export async function newPage(browser, address, timeout = 60000, useEIP6963 = false) {
42
+ const page = await browser.newPage();
43
+ const { ethereumMockCode, eip6963MockCode } = await import('./wallet-mock.js');
44
+ const mockFn = useEIP6963 ? eip6963MockCode : ethereumMockCode;
45
+ await page.evaluateOnNewDocument(mockFn({ address }));
46
+ // Re-dispatch EIP-6963 event after page load so wagmi catches it
47
+ if (useEIP6963) {
48
+ page.on('load', async () => {
49
+ await page.evaluate(() => {
50
+ const p = window.ethereum;
51
+ if (!p)
52
+ return;
53
+ window.dispatchEvent(new CustomEvent('eip6963:announceProvider', {
54
+ detail: {
55
+ info: { uuid: crypto.randomUUID(), name: 'MockWallet', icon: 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"/>', rdns: 'com.mock.wallet' },
56
+ provider: p
57
+ }
58
+ }));
59
+ });
60
+ });
61
+ }
62
+ page.setDefaultTimeout(timeout);
63
+ return page;
64
+ }
65
+ export async function newIncognitoContext(browser) {
66
+ return browser.createBrowserContext();
67
+ }
68
+ // Create a page from an incognito context with ethereum mock injected.
69
+ // Use this instead of ctx.newPage() directly.
70
+ export async function newIncognitoPage(ctx, address, timeout = 60000, useEIP6963 = false) {
71
+ const page = await ctx.newPage();
72
+ const { ethereumMockCode, eip6963MockCode } = await import('./wallet-mock.js');
73
+ const mockFn = useEIP6963 ? eip6963MockCode : ethereumMockCode;
74
+ await page.evaluateOnNewDocument(mockFn({ address }));
75
+ if (useEIP6963) {
76
+ page.on('load', async () => {
77
+ await page.evaluate(() => {
78
+ const p = window.ethereum;
79
+ if (!p)
80
+ return;
81
+ window.dispatchEvent(new CustomEvent('eip6963:announceProvider', {
82
+ detail: {
83
+ info: { uuid: crypto.randomUUID(), name: 'MockWallet', icon: 'data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"/>', rdns: 'com.mock.wallet' },
84
+ provider: p
85
+ }
86
+ }));
87
+ });
88
+ });
89
+ }
90
+ page.setDefaultTimeout(timeout);
91
+ return page;
92
+ }
93
+ export async function clearBrowserCache(page) {
94
+ const cdp = await page.createCDPSession();
95
+ await cdp.send('Network.clearBrowserCache');
96
+ await cdp.send('Network.clearBrowserCookies');
97
+ }