@zcash-app/dashboard 0.0.1 → 0.1.0-alpha.4

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 (150) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-path-routes-manifest.json +17 -0
  3. package/.next/build-manifest.json +20 -0
  4. package/.next/export-marker.json +6 -0
  5. package/.next/images-manifest.json +68 -0
  6. package/.next/next-minimal-server.js.nft.json +1 -0
  7. package/.next/next-server.js.nft.json +1 -0
  8. package/.next/package.json +1 -0
  9. package/.next/prerender-manifest.json +129 -0
  10. package/.next/react-loadable-manifest.json +1 -0
  11. package/.next/required-server-files.js +377 -0
  12. package/.next/required-server-files.json +377 -0
  13. package/.next/routes-manifest.json +138 -0
  14. package/.next/server/app/_global-error/page.js +31 -0
  15. package/.next/server/app/_global-error/page.js.nft.json +1 -0
  16. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -0
  17. package/.next/server/app/_global-error.html +1 -0
  18. package/.next/server/app/_global-error.meta +35 -0
  19. package/.next/server/app/_global-error.rsc +18 -0
  20. package/.next/server/app/_global-error.segments/_full.segment.rsc +18 -0
  21. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +24 -0
  22. package/.next/server/app/_global-error.segments/_tree.segment.rsc +3 -0
  23. package/.next/server/app/_not-found/page.js +1 -0
  24. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  25. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  26. package/.next/server/app/_not-found.html +1 -0
  27. package/.next/server/app/_not-found.meta +35 -0
  28. package/.next/server/app/_not-found.rsc +22 -0
  29. package/.next/server/app/_not-found.segments/_full.segment.rsc +22 -0
  30. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +26 -0
  31. package/.next/server/app/_not-found.segments/_tree.segment.rsc +6 -0
  32. package/.next/server/app/api/account/forget-key/route.js +1 -0
  33. package/.next/server/app/api/account/forget-key/route.js.nft.json +1 -0
  34. package/.next/server/app/api/account/forget-key/route_client-reference-manifest.js +1 -0
  35. package/.next/server/app/api/account/import-key/route.js +1 -0
  36. package/.next/server/app/api/account/import-key/route.js.nft.json +1 -0
  37. package/.next/server/app/api/account/import-key/route_client-reference-manifest.js +1 -0
  38. package/.next/server/app/api/account/route.js +1 -0
  39. package/.next/server/app/api/account/route.js.nft.json +1 -0
  40. package/.next/server/app/api/account/route_client-reference-manifest.js +1 -0
  41. package/.next/server/app/api/config/route.js +1 -0
  42. package/.next/server/app/api/config/route.js.nft.json +1 -0
  43. package/.next/server/app/api/config/route_client-reference-manifest.js +1 -0
  44. package/.next/server/app/api/explorer/route.js +1 -0
  45. package/.next/server/app/api/explorer/route.js.nft.json +1 -0
  46. package/.next/server/app/api/explorer/route_client-reference-manifest.js +1 -0
  47. package/.next/server/app/api/fund/route.js +1 -0
  48. package/.next/server/app/api/fund/route.js.nft.json +1 -0
  49. package/.next/server/app/api/fund/route_client-reference-manifest.js +1 -0
  50. package/.next/server/app/api/mine/route.js +1 -0
  51. package/.next/server/app/api/mine/route.js.nft.json +1 -0
  52. package/.next/server/app/api/mine/route_client-reference-manifest.js +1 -0
  53. package/.next/server/app/api/status/route.js +1 -0
  54. package/.next/server/app/api/status/route.js.nft.json +1 -0
  55. package/.next/server/app/api/status/route_client-reference-manifest.js +1 -0
  56. package/.next/server/app/api/sync/status/route.js +1 -0
  57. package/.next/server/app/api/sync/status/route.js.nft.json +1 -0
  58. package/.next/server/app/api/sync/status/route_client-reference-manifest.js +1 -0
  59. package/.next/server/app/api/transactions/route.js +1 -0
  60. package/.next/server/app/api/transactions/route.js.nft.json +1 -0
  61. package/.next/server/app/api/transactions/route_client-reference-manifest.js +1 -0
  62. package/.next/server/app/explorer/[txid]/page.js +1 -0
  63. package/.next/server/app/explorer/[txid]/page.js.nft.json +1 -0
  64. package/.next/server/app/explorer/[txid]/page_client-reference-manifest.js +1 -0
  65. package/.next/server/app/favicon.ico/route.js +1 -0
  66. package/.next/server/app/favicon.ico/route.js.nft.json +1 -0
  67. package/.next/server/app/favicon.ico.body +0 -0
  68. package/.next/server/app/favicon.ico.meta +1 -0
  69. package/.next/server/app/index.html +1 -0
  70. package/.next/server/app/index.meta +29 -0
  71. package/.next/server/app/index.rsc +26 -0
  72. package/.next/server/app/index.segments/__PAGE__.segment.rsc +29 -0
  73. package/.next/server/app/index.segments/_full.segment.rsc +26 -0
  74. package/.next/server/app/index.segments/_tree.segment.rsc +5 -0
  75. package/.next/server/app/page.js +1 -0
  76. package/.next/server/app/page.js.nft.json +1 -0
  77. package/.next/server/app/page_client-reference-manifest.js +1 -0
  78. package/.next/server/app-paths-manifest.json +17 -0
  79. package/.next/server/chunks/336.js +1 -0
  80. package/.next/server/chunks/470.js +377 -0
  81. package/.next/server/chunks/507.js +23 -0
  82. package/.next/server/chunks/744.js +305 -0
  83. package/.next/server/chunks/75.js +1 -0
  84. package/.next/server/functions-config-manifest.json +4 -0
  85. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  86. package/.next/server/middleware-build-manifest.js +1 -0
  87. package/.next/server/middleware-manifest.json +6 -0
  88. package/.next/server/middleware-react-loadable-manifest.js +1 -0
  89. package/.next/server/next-font-manifest.js +1 -0
  90. package/.next/server/next-font-manifest.json +1 -0
  91. package/.next/server/pages/404.html +1 -0
  92. package/.next/server/pages/500.html +1 -0
  93. package/.next/server/pages-manifest.json +4 -0
  94. package/.next/server/prefetch-hints.json +39 -0
  95. package/.next/server/preview-props.json +5 -0
  96. package/.next/server/server-reference-manifest.js +1 -0
  97. package/.next/server/server-reference-manifest.json +1 -0
  98. package/.next/server/webpack-runtime.js +1 -0
  99. package/.next/static/Do1RWyPVTclhW2vJ-NWGq/_buildManifest.js +1 -0
  100. package/.next/static/Do1RWyPVTclhW2vJ-NWGq/_ssgManifest.js +1 -0
  101. package/.next/static/chunks/084437a8-cb0364bd25a66e58.js +1 -0
  102. package/.next/static/chunks/686-08b24cd790891d26.js +1 -0
  103. package/.next/static/chunks/738-2040892d404c5e90.js +52 -0
  104. package/.next/static/chunks/776-5b7d5d20aa95cea5.js +1 -0
  105. package/.next/static/chunks/app/_global-error/page-896be96ff4cc4b20.js +1 -0
  106. package/.next/static/chunks/app/_not-found/page-a046fb847cedbfbe.js +1 -0
  107. package/.next/static/chunks/app/api/account/forget-key/route-896be96ff4cc4b20.js +1 -0
  108. package/.next/static/chunks/app/api/account/import-key/route-896be96ff4cc4b20.js +1 -0
  109. package/.next/static/chunks/app/api/account/route-896be96ff4cc4b20.js +1 -0
  110. package/.next/static/chunks/app/api/config/route-896be96ff4cc4b20.js +1 -0
  111. package/.next/static/chunks/app/api/explorer/route-896be96ff4cc4b20.js +1 -0
  112. package/.next/static/chunks/app/api/fund/route-896be96ff4cc4b20.js +1 -0
  113. package/.next/static/chunks/app/api/mine/route-896be96ff4cc4b20.js +1 -0
  114. package/.next/static/chunks/app/api/status/route-896be96ff4cc4b20.js +1 -0
  115. package/.next/static/chunks/app/api/sync/status/route-896be96ff4cc4b20.js +1 -0
  116. package/.next/static/chunks/app/api/transactions/route-896be96ff4cc4b20.js +1 -0
  117. package/.next/static/chunks/app/explorer/[txid]/page-7c2fb0fbff095dd4.js +1 -0
  118. package/.next/static/chunks/app/layout-66e1243c43ea1302.js +1 -0
  119. package/.next/static/chunks/app/page-fd7c1a6f59c1e845.js +1 -0
  120. package/.next/static/chunks/framework-66a12bbff6ab453a.js +1 -0
  121. package/.next/static/chunks/main-8f70e8b7415c8a48.js +5 -0
  122. package/.next/static/chunks/main-app-5cab4318e79ffda6.js +1 -0
  123. package/.next/static/chunks/next/dist/client/components/builtin/app-error-896be96ff4cc4b20.js +1 -0
  124. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-896be96ff4cc4b20.js +1 -0
  125. package/.next/static/chunks/next/dist/client/components/builtin/global-error-838747782912e458.js +1 -0
  126. package/.next/static/chunks/next/dist/client/components/builtin/not-found-896be96ff4cc4b20.js +1 -0
  127. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-896be96ff4cc4b20.js +1 -0
  128. package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  129. package/.next/static/chunks/webpack-7399a6496fdd6038.js +1 -0
  130. package/.next/static/css/07e8f49f2a9b9da1.css +1 -0
  131. package/.next/static/media/013b72fa676f92e0-s.woff2 +0 -0
  132. package/.next/static/media/22a5144ee8d83bca-s.p.woff2 +0 -0
  133. package/.next/static/media/2b5b02fc7e511755-s.woff2 +0 -0
  134. package/.next/static/media/65f03d54ccadf4a8-s.woff2 +0 -0
  135. package/.next/static/media/7d4881bb7e1bf84d-s.p.woff2 +0 -0
  136. package/.next/static/media/9766a7e9e2e0ad5a-s.woff2 +0 -0
  137. package/.next/static/media/aa016aab0e6d1295-s.woff2 +0 -0
  138. package/.next/static/media/b66cf8e69499582a-s.woff2 +0 -0
  139. package/.next/static/media/b9408752a0c24fb9-s.woff2 +0 -0
  140. package/.next/static/media/e038a29029a234f2-s.woff2 +0 -0
  141. package/.next/static/media/f639721981034f88-s.woff2 +0 -0
  142. package/LICENSE +201 -0
  143. package/README.md +50 -0
  144. package/next.config.mjs +12 -0
  145. package/package.json +52 -4
  146. package/public/file.svg +1 -0
  147. package/public/globe.svg +1 -0
  148. package/public/next.svg +1 -0
  149. package/public/vercel.svg +1 -0
  150. package/public/window.svg +1 -0
package/README.md ADDED
@@ -0,0 +1,50 @@
1
+ # @zcash-app/dashboard
2
+
3
+ Developer dashboard and real-time explorer for shielded Zcash applications on the Z3 stack.
4
+
5
+ ## Getting Started
6
+
7
+ Run the development server:
8
+
9
+ ```bash
10
+ pnpm dev
11
+ ```
12
+
13
+ Open [http://localhost:3050](http://localhost:3050) with your browser to view the dashboard.
14
+
15
+ ## Security & Storage Architecture
16
+
17
+ > [!WARNING]
18
+ > **Plaintext Memo & Counterparty Storage**:
19
+ > Decrypted transaction memos and counterparties are stored in **plaintext** in the SQLite wallet database (`wallet_transactions` table) to support local search, history inspection, and accounting.
20
+ >
21
+ > To protect user privacy:
22
+ > - Persisted databases are stored under `~/.zcash-app/dashboard/`.
23
+ > - Directory permissions are strictly enforced to `0700` (read, write, execute by owner only).
24
+ > - SQLite database files are strictly enforced to `0600` (read and write by owner only).
25
+ > - Spending keys are never persisted in the dashboard database; only view keys and public metadata are stored.
26
+
27
+ ## Background Synchronization & API
28
+
29
+ The dashboard uses non-blocking background synchronization with the indexer via `@zcash-app/sdk`:
30
+
31
+ - **`/api/sync/status`**: Returns immediate sync status without blocking (`status`, `scanned`, `target`, `notesFound`, `pendingFetches`, `failedFetches`). Responses always return in under 5 seconds (typically < 50ms).
32
+ - **Batch Transaction Fetching**: For each transaction touching the wallet (new note or spent nullifier), the full transaction is fetched, decrypted, and upserted idempotently into `wallet_transactions` (keyed by `txid + action_index + direction`).
33
+ - **Chain Reorganization**: On reorg detection, `resolveReorg` rolls back commitment trees and deletes orphaned rows in `wallet_transactions` at `height >= fromHeight`.
34
+
35
+ ## Theme Configuration
36
+
37
+ The dashboard uses a dark cypherpunk-industrial color palette configured entirely via CSS custom properties in `src/app/globals.css` under `:root`. Zero hard-coded hex colors exist in component files.
38
+
39
+ To change the primary accent (e.g. from teal to electric gold or violet), edit `:root` in `src/app/globals.css`:
40
+
41
+ ```css
42
+ :root {
43
+ /* Change primary accent */
44
+ --accent-primary: #f59e0b; /* e.g. Gold */
45
+ --btn-primary-bg-start: #f59e0b;
46
+ --btn-primary-bg-end: #d97706;
47
+ --btn-primary-text: #1c1917; /* High contrast text */
48
+ --progress-fill: #f59e0b;
49
+ }
50
+ ```
@@ -0,0 +1,12 @@
1
+ /** @type {import('next').NextConfig} */
2
+ const nextConfig = {
3
+ serverExternalPackages: ["@zcash-app/core", "@zcash-app/sdk", "@grpc/grpc-js"],
4
+ webpack: (config) => {
5
+ config.externals = [...(config.externals || []), "@zcash-app/core", "@zcash-app/sdk"];
6
+ return config;
7
+ },
8
+ allowedDevOrigins: ['127.0.0.1', 'localhost'],
9
+ turbopack: {},
10
+ };
11
+
12
+ export default nextConfig;
package/package.json CHANGED
@@ -1,10 +1,58 @@
1
1
  {
2
2
  "name": "@zcash-app/dashboard",
3
- "version": "0.0.1",
4
- "description": "Placeholder. Real releases are published from CI (create-zcash-app).",
3
+ "version": "0.1.0-alpha.4",
4
+ "description": "Developer dashboard for shielded Zcash apps",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
7
7
  "type": "git",
8
- "url": "git+https://github.com/Ultra-Tech-code/create-zcash-app.git"
8
+ "url": "git+https://github.com/Ultra-Tech-code/create-zcash-app.git",
9
+ "directory": "packages/dashboard"
10
+ },
11
+ "homepage": "https://github.com/Ultra-Tech-code/create-zcash-app#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/Ultra-Tech-code/create-zcash-app/issues"
14
+ },
15
+ "keywords": [
16
+ "zcash",
17
+ "shielded",
18
+ "orchard",
19
+ "dashboard",
20
+ "developer-tools"
21
+ ],
22
+ "files": [
23
+ ".next",
24
+ "!.next/cache/**",
25
+ "!.next/dev/**",
26
+ "!.next/diagnostics/**",
27
+ "!.next/types/**",
28
+ "!.next/trace",
29
+ "!.next/trace-build",
30
+ "!.next/trace*",
31
+ "public",
32
+ "package.json",
33
+ "next.config.mjs",
34
+ "LICENSE"
35
+ ],
36
+ "dependencies": {
37
+ "next": "16.4.2",
38
+ "react": "19.3.0",
39
+ "react-dom": "19.3.0",
40
+ "@zcash-app/sdk": "0.1.0-alpha.4"
41
+ },
42
+ "devDependencies": {
43
+ "@types/node": "^20",
44
+ "@types/react": "^19",
45
+ "@types/react-dom": "^19",
46
+ "eslint": "^9",
47
+ "eslint-config-next": "16.4.2",
48
+ "playwright": "^1.64.1",
49
+ "typescript": "^5"
50
+ },
51
+ "scripts": {
52
+ "dev": "next dev -p 3050 --webpack",
53
+ "build": "next build --webpack",
54
+ "start": "next start -p 3050",
55
+ "lint": "eslint",
56
+ "test": "node --test test/*.test.mjs"
9
57
  }
10
- }
58
+ }
@@ -0,0 +1 @@
1
+ <svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>
@@ -0,0 +1 @@
1
+ <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>
@@ -0,0 +1 @@
1
+ <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1155 1000"><path d="m577.3 0 577.4 1000H0z" fill="#fff"/></svg>
@@ -0,0 +1 @@
1
+ <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2.5h13v10a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM0 1h16v11.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5zm3.75 4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5M7 4.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5" fill="#666"/></svg>