@mysten-incubation/dev-wallet 0.0.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/LICENSE +189 -0
  3. package/dist/_virtual/{_@oxc-project_runtime@0.107.0 → _@oxc-project_runtime@0.127.0}/helpers/decorate.mjs +2 -3
  4. package/dist/adapters/base-adapter.mjs +6 -7
  5. package/dist/adapters/base-adapter.mjs.map +1 -1
  6. package/dist/adapters/browser.d.mts +4 -1
  7. package/dist/adapters/browser.mjs +4 -2
  8. package/dist/adapters/build-managed-account.mjs +8 -10
  9. package/dist/adapters/build-managed-account.mjs.map +1 -1
  10. package/dist/adapters/devstack-adapter.d.mts +111 -0
  11. package/dist/adapters/devstack-adapter.d.mts.map +1 -0
  12. package/dist/adapters/devstack-adapter.mjs +224 -0
  13. package/dist/adapters/devstack-adapter.mjs.map +1 -0
  14. package/dist/adapters/devstack-paths.d.mts +12 -0
  15. package/dist/adapters/devstack-paths.d.mts.map +1 -0
  16. package/dist/adapters/devstack-paths.mjs +12 -0
  17. package/dist/adapters/devstack-paths.mjs.map +1 -0
  18. package/dist/adapters/fork-relay.d.mts +109 -0
  19. package/dist/adapters/fork-relay.d.mts.map +1 -0
  20. package/dist/adapters/fork-relay.mjs +208 -0
  21. package/dist/adapters/fork-relay.mjs.map +1 -0
  22. package/dist/adapters/idb-store.mjs +12 -16
  23. package/dist/adapters/idb-store.mjs.map +1 -1
  24. package/dist/adapters/in-memory-adapter.mjs +4 -10
  25. package/dist/adapters/in-memory-adapter.mjs.map +1 -1
  26. package/dist/adapters/passkey-adapter.mjs +4 -12
  27. package/dist/adapters/passkey-adapter.mjs.map +1 -1
  28. package/dist/adapters/remote-cli-adapter.mjs +37 -72
  29. package/dist/adapters/remote-cli-adapter.mjs.map +1 -1
  30. package/dist/adapters/webcrypto-adapter.mjs +2 -4
  31. package/dist/adapters/webcrypto-adapter.mjs.map +1 -1
  32. package/dist/bin/cli.mjs +9 -22
  33. package/dist/bin/cli.mjs.map +1 -1
  34. package/dist/client/dev-wallet-client.mjs +13 -28
  35. package/dist/client/dev-wallet-client.mjs.map +1 -1
  36. package/dist/client/index.mjs +1 -2
  37. package/dist/client/request-handler.mjs +36 -42
  38. package/dist/client/request-handler.mjs.map +1 -1
  39. package/dist/index.mjs +1 -2
  40. package/dist/react/components.d.mts +9 -9
  41. package/dist/react/components.d.mts.map +1 -1
  42. package/dist/react/components.mjs +2 -5
  43. package/dist/react/components.mjs.map +1 -1
  44. package/dist/react/context.d.mts +3 -3
  45. package/dist/react/context.d.mts.map +1 -1
  46. package/dist/react/context.mjs +3 -8
  47. package/dist/react/context.mjs.map +1 -1
  48. package/dist/react/index.mjs +1 -2
  49. package/dist/react/useDevWallet.d.mts +3 -0
  50. package/dist/react/useDevWallet.d.mts.map +1 -1
  51. package/dist/react/useDevWallet.mjs +9 -14
  52. package/dist/react/useDevWallet.mjs.map +1 -1
  53. package/dist/server/cli-signing-middleware.mjs +7 -20
  54. package/dist/server/cli-signing-middleware.mjs.map +1 -1
  55. package/dist/server/index.mjs +1 -2
  56. package/dist/standalone/assets/{in-memory-adapter-CBF4h2KD.js → in-memory-adapter-qRkNfj9O.js} +1 -1
  57. package/dist/standalone/assets/main-DDltQnzR.js +3954 -0
  58. package/dist/standalone/assets/{webcrypto-adapter-DysAubFb.js → webcrypto-adapter-FejcrL9x.js} +1 -1
  59. package/dist/standalone/index.html +11 -12
  60. package/dist/ui/copy-controller.mjs +3 -3
  61. package/dist/ui/copy-controller.mjs.map +1 -1
  62. package/dist/ui/dev-wallet-account-selector.d.mts +3 -4
  63. package/dist/ui/dev-wallet-account-selector.d.mts.map +1 -1
  64. package/dist/ui/dev-wallet-account-selector.mjs +48 -25
  65. package/dist/ui/dev-wallet-account-selector.mjs.map +1 -1
  66. package/dist/ui/dev-wallet-accounts.d.mts +9 -4
  67. package/dist/ui/dev-wallet-accounts.d.mts.map +1 -1
  68. package/dist/ui/dev-wallet-accounts.mjs +62 -140
  69. package/dist/ui/dev-wallet-accounts.mjs.map +1 -1
  70. package/dist/ui/dev-wallet-balances.d.mts +10 -3
  71. package/dist/ui/dev-wallet-balances.d.mts.map +1 -1
  72. package/dist/ui/dev-wallet-balances.mjs +241 -43
  73. package/dist/ui/dev-wallet-balances.mjs.map +1 -1
  74. package/dist/ui/dev-wallet-connect.d.mts +3 -3
  75. package/dist/ui/dev-wallet-connect.d.mts.map +1 -1
  76. package/dist/ui/dev-wallet-connect.mjs +24 -16
  77. package/dist/ui/dev-wallet-connect.mjs.map +1 -1
  78. package/dist/ui/dev-wallet-dropdown.d.mts +3 -3
  79. package/dist/ui/dev-wallet-dropdown.d.mts.map +1 -1
  80. package/dist/ui/dev-wallet-dropdown.mjs +37 -47
  81. package/dist/ui/dev-wallet-dropdown.mjs.map +1 -1
  82. package/dist/ui/dev-wallet-fork-panel.d.mts +43 -0
  83. package/dist/ui/dev-wallet-fork-panel.d.mts.map +1 -0
  84. package/dist/ui/dev-wallet-fork-panel.mjs +500 -0
  85. package/dist/ui/dev-wallet-fork-panel.mjs.map +1 -0
  86. package/dist/ui/dev-wallet-network-badge.d.mts +3 -4
  87. package/dist/ui/dev-wallet-network-badge.d.mts.map +1 -1
  88. package/dist/ui/dev-wallet-network-badge.mjs +52 -21
  89. package/dist/ui/dev-wallet-network-badge.mjs.map +1 -1
  90. package/dist/ui/dev-wallet-new-account.d.mts +3 -4
  91. package/dist/ui/dev-wallet-new-account.d.mts.map +1 -1
  92. package/dist/ui/dev-wallet-new-account.mjs +31 -105
  93. package/dist/ui/dev-wallet-new-account.mjs.map +1 -1
  94. package/dist/ui/dev-wallet-objects.d.mts +3 -3
  95. package/dist/ui/dev-wallet-objects.d.mts.map +1 -1
  96. package/dist/ui/dev-wallet-objects.mjs +76 -39
  97. package/dist/ui/dev-wallet-objects.mjs.map +1 -1
  98. package/dist/ui/dev-wallet-panel.d.mts +24 -4
  99. package/dist/ui/dev-wallet-panel.d.mts.map +1 -1
  100. package/dist/ui/dev-wallet-panel.mjs +247 -64
  101. package/dist/ui/dev-wallet-panel.mjs.map +1 -1
  102. package/dist/ui/dev-wallet-popup.d.mts +3 -5
  103. package/dist/ui/dev-wallet-popup.d.mts.map +1 -1
  104. package/dist/ui/dev-wallet-popup.mjs +19 -15
  105. package/dist/ui/dev-wallet-popup.mjs.map +1 -1
  106. package/dist/ui/dev-wallet-settings.d.mts +3 -4
  107. package/dist/ui/dev-wallet-settings.d.mts.map +1 -1
  108. package/dist/ui/dev-wallet-settings.mjs +149 -97
  109. package/dist/ui/dev-wallet-settings.mjs.map +1 -1
  110. package/dist/ui/dev-wallet-signing-modal.d.mts +11 -4
  111. package/dist/ui/dev-wallet-signing-modal.d.mts.map +1 -1
  112. package/dist/ui/dev-wallet-signing-modal.mjs +46 -18
  113. package/dist/ui/dev-wallet-signing-modal.mjs.map +1 -1
  114. package/dist/ui/dev-wallet-signing.d.mts +9 -3
  115. package/dist/ui/dev-wallet-signing.d.mts.map +1 -1
  116. package/dist/ui/dev-wallet-signing.mjs +119 -130
  117. package/dist/ui/dev-wallet-signing.mjs.map +1 -1
  118. package/dist/ui/dev-wallet-standalone.d.mts +8 -3
  119. package/dist/ui/dev-wallet-standalone.d.mts.map +1 -1
  120. package/dist/ui/dev-wallet-standalone.mjs +303 -38
  121. package/dist/ui/dev-wallet-standalone.mjs.map +1 -1
  122. package/dist/ui/dev-wallet-tab-bar.d.mts +13 -5
  123. package/dist/ui/dev-wallet-tab-bar.d.mts.map +1 -1
  124. package/dist/ui/dev-wallet-tab-bar.mjs +143 -82
  125. package/dist/ui/dev-wallet-tab-bar.mjs.map +1 -1
  126. package/dist/ui/index.d.mts +3 -2
  127. package/dist/ui/index.mjs +2 -2
  128. package/dist/ui/mount.d.mts +14 -1
  129. package/dist/ui/mount.d.mts.map +1 -1
  130. package/dist/ui/mount.mjs +5 -2
  131. package/dist/ui/mount.mjs.map +1 -1
  132. package/dist/ui/styles.mjs +428 -66
  133. package/dist/ui/styles.mjs.map +1 -1
  134. package/dist/ui/transaction-analyzer.mjs +19 -30
  135. package/dist/ui/transaction-analyzer.mjs.map +1 -1
  136. package/dist/ui/utils.d.mts +59 -0
  137. package/dist/ui/utils.d.mts.map +1 -0
  138. package/dist/ui/utils.mjs +42 -15
  139. package/dist/ui/utils.mjs.map +1 -1
  140. package/dist/ui/wallet-controller.mjs +89 -20
  141. package/dist/ui/wallet-controller.mjs.map +1 -1
  142. package/dist/wallet/constants.d.mts +9 -0
  143. package/dist/wallet/constants.d.mts.map +1 -0
  144. package/dist/wallet/constants.mjs +1 -1
  145. package/dist/wallet/dev-wallet.mjs +42 -99
  146. package/dist/wallet/dev-wallet.mjs.map +1 -1
  147. package/dist/wallet/initializer.d.mts +3 -0
  148. package/dist/wallet/initializer.d.mts.map +1 -1
  149. package/dist/wallet/initializer.mjs +9 -14
  150. package/dist/wallet/initializer.mjs.map +1 -1
  151. package/dist/wallet/signing.mjs +8 -21
  152. package/dist/wallet/signing.mjs.map +1 -1
  153. package/package.json +8 -6
  154. package/src/adapters/browser.ts +21 -0
  155. package/src/adapters/devstack-adapter.ts +342 -0
  156. package/src/adapters/devstack-paths.ts +16 -0
  157. package/src/adapters/fork-relay.ts +321 -0
  158. package/src/app/index.html +10 -11
  159. package/src/react/useDevWallet.ts +5 -1
  160. package/src/ui/dev-wallet-account-selector.ts +44 -17
  161. package/src/ui/dev-wallet-accounts.ts +87 -124
  162. package/src/ui/dev-wallet-balances.ts +248 -27
  163. package/src/ui/dev-wallet-connect.ts +19 -8
  164. package/src/ui/dev-wallet-dropdown.ts +7 -5
  165. package/src/ui/dev-wallet-fork-panel.ts +591 -0
  166. package/src/ui/dev-wallet-network-badge.ts +49 -10
  167. package/src/ui/dev-wallet-new-account.ts +21 -62
  168. package/src/ui/dev-wallet-objects.ts +59 -19
  169. package/src/ui/dev-wallet-panel.ts +261 -42
  170. package/src/ui/dev-wallet-popup.ts +12 -6
  171. package/src/ui/dev-wallet-settings.ts +159 -94
  172. package/src/ui/dev-wallet-signing-modal.ts +47 -7
  173. package/src/ui/dev-wallet-signing.ts +124 -97
  174. package/src/ui/dev-wallet-standalone.ts +310 -22
  175. package/src/ui/dev-wallet-tab-bar.ts +132 -70
  176. package/src/ui/index.ts +3 -0
  177. package/src/ui/mount.ts +23 -1
  178. package/src/ui/styles.ts +434 -58
  179. package/src/ui/utils.ts +66 -0
  180. package/src/ui/wallet-controller.ts +103 -5
  181. package/src/wallet/initializer.ts +7 -1
  182. package/dist/standalone/assets/main-VE4olb-Q.js +0 -2841
package/dist/bin/cli.mjs CHANGED
@@ -7,7 +7,6 @@ import { readFile } from "node:fs/promises";
7
7
  import { dirname, resolve } from "node:path";
8
8
  import { serve } from "@hono/node-server";
9
9
  import { cors } from "hono/cors";
10
-
11
10
  //#region src/bin/cli.ts
12
11
  const execFileAsync = promisify(execFile);
13
12
  const MIME_TYPES = {
@@ -96,8 +95,7 @@ The wallet automatically detects available adapters:
96
95
  await execFileAsync("sui", ["--version"]);
97
96
  hasSuiCli = true;
98
97
  } catch {}
99
- const scriptDir = dirname(new URL(import.meta.url).pathname);
100
- const standaloneDir = findStandaloneDir(scriptDir);
98
+ const standaloneDir = findStandaloneDir(dirname(new URL(import.meta.url).pathname));
101
99
  if (!standaloneDir) {
102
100
  console.error("Standalone wallet app not found.\nRun `pnpm turbo build --filter=@mysten-incubation/dev-wallet` first.");
103
101
  process.exit(1);
@@ -105,9 +103,7 @@ The wallet automatically detects available adapters:
105
103
  let indexHtml = await readFile(resolve(standaloneDir, "index.html"), "utf-8");
106
104
  if (hasSuiCli) {
107
105
  indexHtml = indexHtml.replace("</head>", "<script>window.__DEV_WALLET_CLI__=true;<\/script></head>");
108
- if (!indexHtml.includes("__DEV_WALLET_CLI__")) {
109
- console.warn("Warning: Failed to inject CLI flag into index.html");
110
- }
106
+ if (!indexHtml.includes("__DEV_WALLET_CLI__")) console.warn("Warning: Failed to inject CLI flag into index.html");
111
107
  }
112
108
  let bookmarkletJs = null;
113
109
  try {
@@ -122,25 +118,18 @@ The wallet automatically detects available adapters:
122
118
  app.route("/", result.app);
123
119
  }
124
120
  app.get("/bookmarklet.js", cors({ origin: "*" }), (c) => {
125
- if (!bookmarkletJs) {
126
- return c.text("Bookmarklet not found", 404);
127
- }
121
+ if (!bookmarkletJs) return c.text("Bookmarklet not found", 404);
128
122
  c.header("Cache-Control", "no-cache");
129
123
  return c.body(bookmarkletJs, { headers: { "Content-Type": "application/javascript" } });
130
124
  });
131
125
  app.get("*", async (c) => {
132
126
  const urlPath = decodeURIComponent(new URL(c.req.url).pathname);
133
- if (urlPath === "/" || urlPath === "/index.html") {
134
- return c.html(indexHtml);
135
- }
127
+ if (urlPath === "/" || urlPath === "/index.html") return c.html(indexHtml);
136
128
  const filePath = resolve(standaloneDir, urlPath.slice(1));
137
- if (!filePath.startsWith(standaloneDir)) {
138
- return c.html(indexHtml);
139
- }
129
+ if (!filePath.startsWith(standaloneDir)) return c.html(indexHtml);
140
130
  try {
141
131
  const content = await readFile(filePath);
142
- const ext = filePath.slice(filePath.lastIndexOf("."));
143
- const contentType = MIME_TYPES[ext] || "application/octet-stream";
132
+ const contentType = MIME_TYPES[filePath.slice(filePath.lastIndexOf("."))] || "application/octet-stream";
144
133
  return c.body(content, { headers: { "Content-Type": contentType } });
145
134
  } catch {
146
135
  return c.html(indexHtml);
@@ -152,9 +141,7 @@ The wallet automatically detects available adapters:
152
141
  port
153
142
  }, () => {
154
143
  const enabledAdapters = ["In-Memory (Ed25519)", "WebCrypto (Passkey)"];
155
- if (hasSuiCli) {
156
- enabledAdapters.push("CLI Signer");
157
- }
144
+ if (hasSuiCli) enabledAdapters.push("CLI Signer");
158
145
  const walletUrl = cliToken ? `${baseUrl}/?token=${cliToken}` : baseUrl;
159
146
  const bookmarkletCode = `javascript:void(document.head.appendChild(Object.assign(document.createElement('script'),{src:'${baseUrl}/bookmarklet.js'})))`;
160
147
  console.log(formatStartupMessage({
@@ -177,7 +164,7 @@ main().catch((error) => {
177
164
  console.error("Failed to start dev wallet:", error);
178
165
  process.exit(1);
179
166
  });
180
-
181
167
  //#endregion
182
- export { };
168
+ export {};
169
+
183
170
  //# sourceMappingURL=cli.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli.mjs","names":[],"sources":["../../src/bin/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { execFile } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { resolve, dirname } from 'node:path';\nimport { parseArgs, promisify } from 'node:util';\n\nimport { serve } from '@hono/node-server';\nimport { Hono } from 'hono';\nimport { cors } from 'hono/cors';\n\nconst execFileAsync = promisify(execFile);\n\nconst MIME_TYPES: Record<string, string> = {\n\t'.html': 'text/html; charset=utf-8',\n\t'.js': 'application/javascript',\n\t'.mjs': 'application/javascript',\n\t'.css': 'text/css',\n\t'.json': 'application/json',\n\t'.svg': 'image/svg+xml',\n\t'.png': 'image/png',\n\t'.ico': 'image/x-icon',\n\t'.woff': 'font/woff',\n\t'.woff2': 'font/woff2',\n};\n\nfunction findStandaloneDir(startDir: string): string | null {\n\tlet dir = startDir;\n\tfor (let i = 0; i < 5; i++) {\n\t\tconst candidate = resolve(dir, 'standalone');\n\t\tif (existsSync(resolve(candidate, 'index.html'))) return candidate;\n\t\tconst parent = dirname(dir);\n\t\tif (parent === dir) break;\n\t\tdir = parent;\n\t}\n\treturn null;\n}\n\nfunction formatStartupMessage(options: {\n\twalletUrl: string;\n\tbaseUrl: string;\n\tadapters: string[];\n\thasSuiCli: boolean;\n\tbookmarkletCode: string;\n}): string {\n\tconst { walletUrl, baseUrl, adapters, hasSuiCli, bookmarkletCode } = options;\n\treturn `\n Dev Wallet running at ${walletUrl}\n Adapters: ${adapters.join(', ')}${!hasSuiCli ? '\\n (Install sui CLI to enable CLI signing)' : ''}\n\n To connect from your dApp:\n\n import { DevWalletClient } from '@mysten-incubation/dev-wallet/client';\n DevWalletClient.register({ origin: '${baseUrl}' });\n\n Or use the bookmarklet — drag from the Settings tab, or copy:\n\n ${bookmarkletCode}\n\n Or paste in the browser console:\n\n var s=document.createElement('script');s.src='${baseUrl}/bookmarklet.js';document.head.appendChild(s);\n\n Press Ctrl+C to stop.\n`;\n}\n\nasync function main() {\n\tconst { values } = parseArgs({\n\t\toptions: {\n\t\t\tport: { type: 'string', default: '5174' },\n\t\t\thelp: { type: 'boolean', short: 'h' },\n\t\t},\n\t\tallowPositionals: true,\n\t});\n\n\tif (values.help) {\n\t\tconsole.log(`\nUsage: dev-wallet serve [options]\n\nStart a dev wallet web app for dApp signing.\n\nOptions:\n --port <number> Port to serve on (default: 5174)\n -h, --help Show this help message\n\nThe wallet automatically detects available adapters:\n - In-Memory (Ed25519) — always available\n - WebCrypto (Passkey) — available in browsers with IndexedDB\n - CLI Signer — available when the sui CLI is on your PATH\n`);\n\t\tprocess.exit(0);\n\t}\n\n\tconst port = Number(values.port ?? '5174');\n\tif (!Number.isInteger(port) || port < 1 || port > 65535) {\n\t\tconsole.error('Error: --port must be an integer between 1 and 65535');\n\t\tprocess.exit(1);\n\t}\n\n\tlet hasSuiCli = false;\n\ttry {\n\t\tawait execFileAsync('sui', ['--version']);\n\t\thasSuiCli = true;\n\t} catch {\n\t\t// sui CLI not available — CLI adapter will not be enabled\n\t}\n\n\tconst scriptDir = dirname(new URL(import.meta.url).pathname);\n\tconst standaloneDir = findStandaloneDir(scriptDir);\n\n\tif (!standaloneDir) {\n\t\tconsole.error(\n\t\t\t'Standalone wallet app not found.\\nRun `pnpm turbo build --filter=@mysten-incubation/dev-wallet` first.',\n\t\t);\n\t\tprocess.exit(1);\n\t}\n\n\tlet indexHtml = await readFile(resolve(standaloneDir, 'index.html'), 'utf-8');\n\tif (hasSuiCli) {\n\t\tindexHtml = indexHtml.replace(\n\t\t\t'</head>',\n\t\t\t'<script>window.__DEV_WALLET_CLI__=true;</script></head>',\n\t\t);\n\t\tif (!indexHtml.includes('__DEV_WALLET_CLI__')) {\n\t\t\tconsole.warn('Warning: Failed to inject CLI flag into index.html');\n\t\t}\n\t}\n\n\tlet bookmarkletJs: string | null = null;\n\ttry {\n\t\tbookmarkletJs = await readFile(resolve(standaloneDir, 'bookmarklet.js'), 'utf-8');\n\t} catch {\n\t\t// bookmarklet not available\n\t}\n\n\tconst app = new Hono();\n\tlet cliToken: string | null = null;\n\n\tif (hasSuiCli) {\n\t\tconst { createCliSigningMiddleware } = await import('../server/cli-signing-middleware.js');\n\t\tconst result = createCliSigningMiddleware({ port });\n\t\tcliToken = result.token;\n\t\tapp.route('/', result.app);\n\t}\n\n\tapp.get('/bookmarklet.js', cors({ origin: '*' }), (c) => {\n\t\tif (!bookmarkletJs) {\n\t\t\treturn c.text('Bookmarklet not found', 404);\n\t\t}\n\t\tc.header('Cache-Control', 'no-cache');\n\t\treturn c.body(bookmarkletJs, { headers: { 'Content-Type': 'application/javascript' } });\n\t});\n\n\tapp.get('*', async (c) => {\n\t\tconst urlPath = decodeURIComponent(new URL(c.req.url).pathname);\n\n\t\tif (urlPath === '/' || urlPath === '/index.html') {\n\t\t\treturn c.html(indexHtml);\n\t\t}\n\n\t\tconst filePath = resolve(standaloneDir, urlPath.slice(1));\n\t\tif (!filePath.startsWith(standaloneDir)) {\n\t\t\treturn c.html(indexHtml);\n\t\t}\n\n\t\ttry {\n\t\t\tconst content = await readFile(filePath);\n\t\t\tconst ext = filePath.slice(filePath.lastIndexOf('.'));\n\t\t\tconst contentType = MIME_TYPES[ext] || 'application/octet-stream';\n\t\t\treturn c.body(content, { headers: { 'Content-Type': contentType } });\n\t\t} catch {\n\t\t\treturn c.html(indexHtml);\n\t\t}\n\t});\n\n\tconst baseUrl = `http://localhost:${port}`;\n\n\tconst server = serve({ fetch: app.fetch, port }, () => {\n\t\tconst enabledAdapters = ['In-Memory (Ed25519)', 'WebCrypto (Passkey)'];\n\t\tif (hasSuiCli) {\n\t\t\tenabledAdapters.push('CLI Signer');\n\t\t}\n\n\t\tconst walletUrl = cliToken ? `${baseUrl}/?token=${cliToken}` : baseUrl;\n\t\tconst bookmarkletCode = `javascript:void(document.head.appendChild(Object.assign(document.createElement('script'),{src:'${baseUrl}/bookmarklet.js'})))`;\n\n\t\tconsole.log(\n\t\t\tformatStartupMessage({\n\t\t\t\twalletUrl,\n\t\t\t\tbaseUrl,\n\t\t\t\tadapters: enabledAdapters,\n\t\t\t\thasSuiCli,\n\t\t\t\tbookmarkletCode,\n\t\t\t}),\n\t\t);\n\t});\n\n\tfunction shutdown() {\n\t\tconsole.log('\\nShutting down...');\n\t\tserver.close(() => process.exit(0));\n\t\tsetTimeout(() => process.exit(1), 3000).unref();\n\t}\n\tprocess.on('SIGINT', shutdown);\n\tprocess.on('SIGTERM', shutdown);\n}\n\nmain().catch((error) => {\n\tconsole.error('Failed to start dev wallet:', error);\n\tprocess.exit(1);\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"cli.mjs","names":[],"sources":["../../src/bin/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { execFile } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { resolve, dirname } from 'node:path';\nimport { parseArgs, promisify } from 'node:util';\n\nimport { serve } from '@hono/node-server';\nimport { Hono } from 'hono';\nimport { cors } from 'hono/cors';\n\nconst execFileAsync = promisify(execFile);\n\nconst MIME_TYPES: Record<string, string> = {\n\t'.html': 'text/html; charset=utf-8',\n\t'.js': 'application/javascript',\n\t'.mjs': 'application/javascript',\n\t'.css': 'text/css',\n\t'.json': 'application/json',\n\t'.svg': 'image/svg+xml',\n\t'.png': 'image/png',\n\t'.ico': 'image/x-icon',\n\t'.woff': 'font/woff',\n\t'.woff2': 'font/woff2',\n};\n\nfunction findStandaloneDir(startDir: string): string | null {\n\tlet dir = startDir;\n\tfor (let i = 0; i < 5; i++) {\n\t\tconst candidate = resolve(dir, 'standalone');\n\t\tif (existsSync(resolve(candidate, 'index.html'))) return candidate;\n\t\tconst parent = dirname(dir);\n\t\tif (parent === dir) break;\n\t\tdir = parent;\n\t}\n\treturn null;\n}\n\nfunction formatStartupMessage(options: {\n\twalletUrl: string;\n\tbaseUrl: string;\n\tadapters: string[];\n\thasSuiCli: boolean;\n\tbookmarkletCode: string;\n}): string {\n\tconst { walletUrl, baseUrl, adapters, hasSuiCli, bookmarkletCode } = options;\n\treturn `\n Dev Wallet running at ${walletUrl}\n Adapters: ${adapters.join(', ')}${!hasSuiCli ? '\\n (Install sui CLI to enable CLI signing)' : ''}\n\n To connect from your dApp:\n\n import { DevWalletClient } from '@mysten-incubation/dev-wallet/client';\n DevWalletClient.register({ origin: '${baseUrl}' });\n\n Or use the bookmarklet — drag from the Settings tab, or copy:\n\n ${bookmarkletCode}\n\n Or paste in the browser console:\n\n var s=document.createElement('script');s.src='${baseUrl}/bookmarklet.js';document.head.appendChild(s);\n\n Press Ctrl+C to stop.\n`;\n}\n\nasync function main() {\n\tconst { values } = parseArgs({\n\t\toptions: {\n\t\t\tport: { type: 'string', default: '5174' },\n\t\t\thelp: { type: 'boolean', short: 'h' },\n\t\t},\n\t\tallowPositionals: true,\n\t});\n\n\tif (values.help) {\n\t\tconsole.log(`\nUsage: dev-wallet serve [options]\n\nStart a dev wallet web app for dApp signing.\n\nOptions:\n --port <number> Port to serve on (default: 5174)\n -h, --help Show this help message\n\nThe wallet automatically detects available adapters:\n - In-Memory (Ed25519) — always available\n - WebCrypto (Passkey) — available in browsers with IndexedDB\n - CLI Signer — available when the sui CLI is on your PATH\n`);\n\t\tprocess.exit(0);\n\t}\n\n\tconst port = Number(values.port ?? '5174');\n\tif (!Number.isInteger(port) || port < 1 || port > 65535) {\n\t\tconsole.error('Error: --port must be an integer between 1 and 65535');\n\t\tprocess.exit(1);\n\t}\n\n\tlet hasSuiCli = false;\n\ttry {\n\t\tawait execFileAsync('sui', ['--version']);\n\t\thasSuiCli = true;\n\t} catch {\n\t\t// sui CLI not available — CLI adapter will not be enabled\n\t}\n\n\tconst scriptDir = dirname(new URL(import.meta.url).pathname);\n\tconst standaloneDir = findStandaloneDir(scriptDir);\n\n\tif (!standaloneDir) {\n\t\tconsole.error(\n\t\t\t'Standalone wallet app not found.\\nRun `pnpm turbo build --filter=@mysten-incubation/dev-wallet` first.',\n\t\t);\n\t\tprocess.exit(1);\n\t}\n\n\tlet indexHtml = await readFile(resolve(standaloneDir, 'index.html'), 'utf-8');\n\tif (hasSuiCli) {\n\t\tindexHtml = indexHtml.replace(\n\t\t\t'</head>',\n\t\t\t'<script>window.__DEV_WALLET_CLI__=true;</script></head>',\n\t\t);\n\t\tif (!indexHtml.includes('__DEV_WALLET_CLI__')) {\n\t\t\tconsole.warn('Warning: Failed to inject CLI flag into index.html');\n\t\t}\n\t}\n\n\tlet bookmarkletJs: string | null = null;\n\ttry {\n\t\tbookmarkletJs = await readFile(resolve(standaloneDir, 'bookmarklet.js'), 'utf-8');\n\t} catch {\n\t\t// bookmarklet not available\n\t}\n\n\tconst app = new Hono();\n\tlet cliToken: string | null = null;\n\n\tif (hasSuiCli) {\n\t\tconst { createCliSigningMiddleware } = await import('../server/cli-signing-middleware.js');\n\t\tconst result = createCliSigningMiddleware({ port });\n\t\tcliToken = result.token;\n\t\tapp.route('/', result.app);\n\t}\n\n\tapp.get('/bookmarklet.js', cors({ origin: '*' }), (c) => {\n\t\tif (!bookmarkletJs) {\n\t\t\treturn c.text('Bookmarklet not found', 404);\n\t\t}\n\t\tc.header('Cache-Control', 'no-cache');\n\t\treturn c.body(bookmarkletJs, { headers: { 'Content-Type': 'application/javascript' } });\n\t});\n\n\tapp.get('*', async (c) => {\n\t\tconst urlPath = decodeURIComponent(new URL(c.req.url).pathname);\n\n\t\tif (urlPath === '/' || urlPath === '/index.html') {\n\t\t\treturn c.html(indexHtml);\n\t\t}\n\n\t\tconst filePath = resolve(standaloneDir, urlPath.slice(1));\n\t\tif (!filePath.startsWith(standaloneDir)) {\n\t\t\treturn c.html(indexHtml);\n\t\t}\n\n\t\ttry {\n\t\t\tconst content = await readFile(filePath);\n\t\t\tconst ext = filePath.slice(filePath.lastIndexOf('.'));\n\t\t\tconst contentType = MIME_TYPES[ext] || 'application/octet-stream';\n\t\t\treturn c.body(content, { headers: { 'Content-Type': contentType } });\n\t\t} catch {\n\t\t\treturn c.html(indexHtml);\n\t\t}\n\t});\n\n\tconst baseUrl = `http://localhost:${port}`;\n\n\tconst server = serve({ fetch: app.fetch, port }, () => {\n\t\tconst enabledAdapters = ['In-Memory (Ed25519)', 'WebCrypto (Passkey)'];\n\t\tif (hasSuiCli) {\n\t\t\tenabledAdapters.push('CLI Signer');\n\t\t}\n\n\t\tconst walletUrl = cliToken ? `${baseUrl}/?token=${cliToken}` : baseUrl;\n\t\tconst bookmarkletCode = `javascript:void(document.head.appendChild(Object.assign(document.createElement('script'),{src:'${baseUrl}/bookmarklet.js'})))`;\n\n\t\tconsole.log(\n\t\t\tformatStartupMessage({\n\t\t\t\twalletUrl,\n\t\t\t\tbaseUrl,\n\t\t\t\tadapters: enabledAdapters,\n\t\t\t\thasSuiCli,\n\t\t\t\tbookmarkletCode,\n\t\t\t}),\n\t\t);\n\t});\n\n\tfunction shutdown() {\n\t\tconsole.log('\\nShutting down...');\n\t\tserver.close(() => process.exit(0));\n\t\tsetTimeout(() => process.exit(1), 3000).unref();\n\t}\n\tprocess.on('SIGINT', shutdown);\n\tprocess.on('SIGTERM', shutdown);\n}\n\nmain().catch((error) => {\n\tconsole.error('Failed to start dev wallet:', error);\n\tprocess.exit(1);\n});\n"],"mappings":"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"}
@@ -1,9 +1,8 @@
1
- import { DEFAULT_WALLET_ICON } from "../wallet/constants.mjs";
1
+ import "../wallet/constants.mjs";
2
2
  import { mitt } from "@mysten/utils";
3
3
  import { ReadonlyWalletAccount, SUI_CHAINS, getWallets } from "@mysten/wallet-standard";
4
4
  import { fromBase64, toBase64 } from "@mysten/sui/utils";
5
5
  import { DappPostMessageChannel, decodeJwtSession } from "@mysten/window-wallet-core";
6
-
7
6
  //#region src/client/dev-wallet-client.ts
8
7
  const DEFAULT_WALLET_NAME = "Dev Wallet (Web)";
9
8
  const DEFAULT_ORIGIN = "http://localhost:5174";
@@ -30,8 +29,7 @@ function devWalletClientInitializer(options) {
30
29
  return {
31
30
  id: "dev-wallet-client-initializer",
32
31
  initialize() {
33
- const unregister = DevWalletClient.register(options);
34
- return { unregister };
32
+ return { unregister: DevWalletClient.register(options) };
35
33
  }
36
34
  };
37
35
  }
@@ -53,7 +51,7 @@ var DevWalletClient = class DevWalletClient {
53
51
  #events;
54
52
  constructor(options) {
55
53
  this.#name = options?.name ?? DEFAULT_WALLET_NAME;
56
- this.#icon = options?.icon ?? DEFAULT_WALLET_ICON;
54
+ this.#icon = options?.icon ?? "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NCA2NCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjY0Ij4KICA8ZGVmcz4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0id2FsbGV0R3JhZCIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMTAwJSI+CiAgICAgIDxzdG9wIG9mZnNldD0iMCUiIHN0eWxlPSJzdG9wLWNvbG9yOiM2MzY2RjEiIC8+CiAgICAgIDxzdG9wIG9mZnNldD0iMTAwJSIgc3R5bGU9InN0b3AtY29sb3I6IzI1NjNFQiIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImZsYXBHcmFkIiB4MT0iMCUiIHkxPSIwJSIgeDI9IjEwMCUiIHkyPSIxMDAlIj4KICAgICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3R5bGU9InN0b3AtY29sb3I6IzgxOENGOCIgLz4KICAgICAgPHN0b3Agb2Zmc2V0PSIxMDAlIiBzdHlsZT0ic3RvcC1jb2xvcjojNEY0NkU1IiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICA8L2RlZnM+CiAgPCEtLSBTaGFkb3cgLS0+CiAgPHJlY3QgeD0iOSIgeT0iMjEiIHdpZHRoPSI1MCIgaGVpZ2h0PSIzNiIgcng9IjYiIHJ5PSI2IiBmaWxsPSIjMDAwIiBvcGFjaXR5PSIwLjEiIC8+CiAgPCEtLSBXYWxsZXQgYm9keSAtLT4KICA8cmVjdCB4PSI2IiB5PSIxOCIgd2lkdGg9IjUwIiBoZWlnaHQ9IjM2IiByeD0iNiIgcnk9IjYiIGZpbGw9InVybCgjd2FsbGV0R3JhZCkiIC8+CiAgPCEtLSBGbGFwIC0tPgogIDxwYXRoIGQ9Ik02IDI2IEw2IDIyIEM2IDE1IDggMTIgMTQgMTIgTDQ2IDEyIEM1MiAxMiA1NiAxNSA1NiAyMiBMNTYgMjYgWiIgZmlsbD0idXJsKCNmbGFwR3JhZCkiIC8+CiAgPCEtLSBDbGFzcCAtLT4KICA8cmVjdCB4PSI0MiIgeT0iMzAiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxMiIgcng9IjQiIHJ5PSI0IiBmaWxsPSIjNDMzOENBIiAvPgogIDwhLS0gR29sZCBjb2luIGluIGNsYXNwIC0tPgogIDxjaXJjbGUgY3g9IjQ4IiBjeT0iMzYiIHI9IjMuNSIgZmlsbD0iI0ZDRDM0RCIgLz4KICA8Y2lyY2xlIGN4PSI0OCIgY3k9IjM2IiByPSIyIiBmaWxsPSIjRjU5RTBCIiAvPgogIDwhLS0gRW1ib3NzZWQgRFcgdGV4dCAtLT4KICA8dGV4dCB4PSIyNiIgeT0iNDUiIGZvbnQtZmFtaWx5PSJBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmIiBmb250LXdlaWdodD0iOTAwIiBmb250LXNpemU9IjE4IiBmaWxsPSIjMzczMEEzIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBkb21pbmFudC1iYXNlbGluZT0ibWlkZGxlIiBsZXR0ZXItc3BhY2luZz0iMiI+RFc8L3RleHQ+CiAgPHRleHQgeD0iMjYiIHk9IjQ0IiBmb250LWZhbWlseT0iQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZiIgZm9udC13ZWlnaHQ9IjkwMCIgZm9udC1zaXplPSIxOCIgZmlsbD0iI0M3RDJGRSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZG9taW5hbnQtYmFzZWxpbmU9Im1pZGxlIiBsZXR0ZXItc3BhY2luZz0iMiI+RFc8L3RleHQ+Cjwvc3ZnPgo=";
57
55
  this.#origin = options?.origin ?? DEFAULT_ORIGIN;
58
56
  this.#sessionKey = `dev-wallet:session:${this.#origin}`;
59
57
  this.#events = mitt();
@@ -61,8 +59,7 @@ var DevWalletClient = class DevWalletClient {
61
59
  }
62
60
  static register(options) {
63
61
  const wallet = new DevWalletClient(options);
64
- const wallets = getWallets();
65
- return wallets.register(wallet);
62
+ return getWallets().register(wallet);
66
63
  }
67
64
  get version() {
68
65
  return "1.0.0";
@@ -112,8 +109,7 @@ var DevWalletClient = class DevWalletClient {
112
109
  return () => this.#events.off(event, listener);
113
110
  };
114
111
  #connect = async () => {
115
- const channel = this.#createChannel();
116
- const response = await channel.send({ type: "connect" });
112
+ const response = await this.#createChannel().send({ type: "connect" });
117
113
  this.#setSession(response.session);
118
114
  this.#setAccountsFromSession(response.session);
119
115
  return { accounts: this.accounts };
@@ -124,8 +120,7 @@ var DevWalletClient = class DevWalletClient {
124
120
  this.#events.emit("change", { accounts: this.#accounts });
125
121
  };
126
122
  #signPersonalMessage = async (input) => {
127
- const channel = this.#createChannel();
128
- const response = await channel.send({
123
+ const response = await this.#createChannel().send({
129
124
  type: "sign-personal-message",
130
125
  message: toBase64(input.message),
131
126
  address: input.account.address,
@@ -139,8 +134,7 @@ var DevWalletClient = class DevWalletClient {
139
134
  };
140
135
  #signTransaction = async (input) => {
141
136
  const txJson = await input.transaction.toJSON();
142
- const channel = this.#createChannel();
143
- const response = await channel.send({
137
+ const response = await this.#createChannel().send({
144
138
  type: "sign-transaction",
145
139
  transaction: txJson,
146
140
  address: input.account.address,
@@ -154,8 +148,7 @@ var DevWalletClient = class DevWalletClient {
154
148
  };
155
149
  #signAndExecuteTransaction = async (input) => {
156
150
  const txJson = await input.transaction.toJSON();
157
- const channel = this.#createChannel();
158
- const response = await channel.send({
151
+ const response = await this.#createChannel().send({
159
152
  type: "sign-and-execute-transaction",
160
153
  transaction: txJson,
161
154
  address: input.account.address,
@@ -176,24 +169,16 @@ var DevWalletClient = class DevWalletClient {
176
169
  });
177
170
  }
178
171
  #getSession() {
179
- if (typeof localStorage === "undefined") {
180
- throw new Error("No active session. Call connect() first.");
181
- }
172
+ if (typeof localStorage === "undefined") throw new Error("No active session. Call connect() first.");
182
173
  const session = localStorage.getItem(this.#sessionKey);
183
- if (!session) {
184
- throw new Error("No active session. Call connect() first.");
185
- }
174
+ if (!session) throw new Error("No active session. Call connect() first.");
186
175
  return session;
187
176
  }
188
177
  #setSession(session) {
189
- if (typeof localStorage !== "undefined") {
190
- localStorage.setItem(this.#sessionKey, session);
191
- }
178
+ if (typeof localStorage !== "undefined") localStorage.setItem(this.#sessionKey, session);
192
179
  }
193
180
  #clearSession() {
194
- if (typeof localStorage !== "undefined") {
195
- localStorage.removeItem(this.#sessionKey);
196
- }
181
+ if (typeof localStorage !== "undefined") localStorage.removeItem(this.#sessionKey);
197
182
  }
198
183
  #setAccountsFromSession(session) {
199
184
  const decoded = decodeJwtSession(session);
@@ -217,7 +202,7 @@ var DevWalletClient = class DevWalletClient {
217
202
  }
218
203
  }
219
204
  };
220
-
221
205
  //#endregion
222
206
  export { DevWalletClient, devWalletClientInitializer };
207
+
223
208
  //# sourceMappingURL=dev-wallet-client.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"dev-wallet-client.mjs","names":["#name","#icon","#origin","#sessionKey","#events","#tryRestoreSession","#accounts","#connect","#on","#disconnect","#signPersonalMessage","#signTransaction","#signAndExecuteTransaction","#createChannel","#setSession","#setAccountsFromSession","#clearSession","#getSession"],"sources":["../../src/client/dev-wallet-client.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase64, toBase64 } from '@mysten/sui/utils';\nimport { mitt, type Emitter } from '@mysten/utils';\nimport type {\n\tStandardConnectFeature,\n\tStandardConnectMethod,\n\tStandardDisconnectFeature,\n\tStandardDisconnectMethod,\n\tStandardEventsFeature,\n\tStandardEventsOnMethod,\n\tSuiFeatures,\n\tSuiSignAndExecuteTransactionMethod,\n\tSuiSignPersonalMessageMethod,\n\tSuiSignTransactionMethod,\n\tWallet,\n\tWalletIcon,\n} from '@mysten/wallet-standard';\nimport { getWallets, ReadonlyWalletAccount, SUI_CHAINS } from '@mysten/wallet-standard';\nimport { DappPostMessageChannel, decodeJwtSession } from '@mysten/window-wallet-core';\n\nimport { DEFAULT_WALLET_ICON, type WalletEventsMap } from '../wallet/constants.js';\n\nconst DEFAULT_WALLET_NAME = 'Dev Wallet (Web)';\nconst DEFAULT_ORIGIN = 'http://localhost:5174';\n\n/**\n * Creates a wallet initializer that can be passed to `createDAppKit({ walletInitializers: [...] })`.\n *\n * This registers a {@link DevWalletClient} that communicates with a standalone\n * dev wallet server via PostMessage popups.\n *\n * @example\n * ```ts\n * import { createDAppKit } from '@mysten/dapp-kit-react';\n * import { devWalletClientInitializer } from '@mysten-incubation/dev-wallet/client';\n *\n * const dAppKit = createDAppKit({\n * networks: ['devnet'],\n * walletInitializers: [\n * devWalletClientInitializer({ origin: 'http://localhost:5174' }),\n * ],\n * });\n * ```\n */\nexport function devWalletClientInitializer(options?: DevWalletClientOptions): {\n\tid: string;\n\tinitialize(): { unregister: () => void };\n} {\n\treturn {\n\t\tid: 'dev-wallet-client-initializer',\n\t\tinitialize() {\n\t\t\tconst unregister = DevWalletClient.register(options);\n\t\t\treturn { unregister };\n\t\t},\n\t};\n}\n\nconst WALLET_FEATURES = [\n\t'sui:signTransaction',\n\t'sui:signAndExecuteTransaction',\n\t'sui:signPersonalMessage',\n] as const;\n\n/**\n * Options for creating a DevWalletClient.\n */\nexport interface DevWalletClientOptions {\n\t/** Display name for the wallet. Defaults to 'Dev Wallet (Web)'. */\n\tname?: string;\n\t/** Data URI icon for the wallet. */\n\ticon?: WalletIcon;\n\t/** Origin of the dev wallet web app. Defaults to 'http://localhost:5174'. */\n\torigin?: string;\n}\n\n/**\n * Wallet-standard wallet that communicates with a standalone DevWallet\n * web app via PostMessage popups (started via `npx @mysten-incubation/dev-wallet serve`).\n */\nexport class DevWalletClient implements Wallet {\n\treadonly #name: string;\n\treadonly #icon: WalletIcon;\n\treadonly #origin: string;\n\treadonly #sessionKey: string;\n\t#accounts: ReadonlyWalletAccount[] = [];\n\t#events: Emitter<WalletEventsMap>;\n\n\tconstructor(options?: DevWalletClientOptions) {\n\t\tthis.#name = options?.name ?? DEFAULT_WALLET_NAME;\n\t\tthis.#icon = options?.icon ?? DEFAULT_WALLET_ICON;\n\t\tthis.#origin = options?.origin ?? DEFAULT_ORIGIN;\n\t\tthis.#sessionKey = `dev-wallet:session:${this.#origin}`;\n\t\tthis.#events = mitt();\n\t\tthis.#tryRestoreSession();\n\t}\n\n\tstatic register(options?: DevWalletClientOptions): () => void {\n\t\tconst wallet = new DevWalletClient(options);\n\t\tconst wallets = getWallets();\n\t\treturn wallets.register(wallet);\n\t}\n\n\tget version() {\n\t\treturn '1.0.0' as const;\n\t}\n\n\tget name() {\n\t\treturn this.#name;\n\t}\n\n\tget icon() {\n\t\treturn this.#icon;\n\t}\n\n\tget chains() {\n\t\treturn SUI_CHAINS;\n\t}\n\n\tget accounts(): readonly ReadonlyWalletAccount[] {\n\t\treturn this.#accounts;\n\t}\n\n\tget features(): StandardConnectFeature &\n\t\tStandardEventsFeature &\n\t\tStandardDisconnectFeature &\n\t\tSuiFeatures {\n\t\treturn {\n\t\t\t'standard:connect': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tconnect: this.#connect,\n\t\t\t},\n\t\t\t'standard:events': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\ton: this.#on,\n\t\t\t},\n\t\t\t'standard:disconnect': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tdisconnect: this.#disconnect,\n\t\t\t},\n\t\t\t'sui:signPersonalMessage': {\n\t\t\t\tversion: '1.1.0',\n\t\t\t\tsignPersonalMessage: this.#signPersonalMessage,\n\t\t\t},\n\t\t\t'sui:signTransaction': {\n\t\t\t\tversion: '2.0.0',\n\t\t\t\tsignTransaction: this.#signTransaction,\n\t\t\t},\n\t\t\t'sui:signAndExecuteTransaction': {\n\t\t\t\tversion: '2.0.0',\n\t\t\t\tsignAndExecuteTransaction: this.#signAndExecuteTransaction,\n\t\t\t},\n\t\t};\n\t}\n\n\t#on: StandardEventsOnMethod = (event, listener) => {\n\t\tthis.#events.on(event, listener);\n\t\treturn () => this.#events.off(event, listener);\n\t};\n\n\t#connect: StandardConnectMethod = async () => {\n\t\tconst channel = this.#createChannel();\n\t\tconst response = await channel.send({ type: 'connect' });\n\n\t\tthis.#setSession(response.session);\n\t\tthis.#setAccountsFromSession(response.session);\n\n\t\treturn { accounts: this.accounts };\n\t};\n\n\t#disconnect: StandardDisconnectMethod = async () => {\n\t\tthis.#clearSession();\n\t\tthis.#accounts = [];\n\t\tthis.#events.emit('change', { accounts: this.#accounts });\n\t};\n\n\t#signPersonalMessage: SuiSignPersonalMessageMethod = async (input) => {\n\t\tconst channel = this.#createChannel();\n\t\tconst response = await channel.send({\n\t\t\ttype: 'sign-personal-message',\n\t\t\tmessage: toBase64(input.message),\n\t\t\taddress: input.account.address,\n\t\t\tchain: input.chain ?? input.account.chains[0] ?? 'sui:unknown',\n\t\t\tsession: this.#getSession(),\n\t\t});\n\n\t\treturn { bytes: response.bytes, signature: response.signature };\n\t};\n\n\t#signTransaction: SuiSignTransactionMethod = async (input) => {\n\t\tconst txJson = await input.transaction.toJSON();\n\t\tconst channel = this.#createChannel();\n\t\tconst response = await channel.send({\n\t\t\ttype: 'sign-transaction',\n\t\t\ttransaction: txJson,\n\t\t\taddress: input.account.address,\n\t\t\tchain: input.chain,\n\t\t\tsession: this.#getSession(),\n\t\t});\n\n\t\treturn { bytes: response.bytes, signature: response.signature };\n\t};\n\n\t#signAndExecuteTransaction: SuiSignAndExecuteTransactionMethod = async (input) => {\n\t\tconst txJson = await input.transaction.toJSON();\n\t\tconst channel = this.#createChannel();\n\t\tconst response = await channel.send({\n\t\t\ttype: 'sign-and-execute-transaction',\n\t\t\ttransaction: txJson,\n\t\t\taddress: input.account.address,\n\t\t\tchain: input.chain,\n\t\t\tsession: this.#getSession(),\n\t\t});\n\n\t\treturn {\n\t\t\tbytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t\tdigest: response.digest,\n\t\t\teffects: response.effects,\n\t\t};\n\t};\n\n\t#createChannel(): DappPostMessageChannel {\n\t\treturn new DappPostMessageChannel({\n\t\t\tappName: this.#name,\n\t\t\thostOrigin: this.#origin,\n\t\t});\n\t}\n\n\t#getSession(): string {\n\t\tif (typeof localStorage === 'undefined') {\n\t\t\tthrow new Error('No active session. Call connect() first.');\n\t\t}\n\t\tconst session = localStorage.getItem(this.#sessionKey);\n\t\tif (!session) {\n\t\t\tthrow new Error('No active session. Call connect() first.');\n\t\t}\n\t\treturn session;\n\t}\n\n\t#setSession(session: string): void {\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.setItem(this.#sessionKey, session);\n\t\t}\n\t}\n\n\t#clearSession(): void {\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.removeItem(this.#sessionKey);\n\t\t}\n\t}\n\n\t#setAccountsFromSession(session: string): void {\n\t\tconst decoded = decodeJwtSession(session);\n\t\tthis.#accounts = decoded.payload.accounts.map(\n\t\t\t(account: { address: string; publicKey: string; label?: string }) =>\n\t\t\t\tnew ReadonlyWalletAccount({\n\t\t\t\t\taddress: account.address,\n\t\t\t\t\tpublicKey: account.publicKey ? fromBase64(account.publicKey) : new Uint8Array(0),\n\t\t\t\t\tchains: [...SUI_CHAINS],\n\t\t\t\t\tfeatures: [...WALLET_FEATURES],\n\t\t\t\t\tlabel: account.label,\n\t\t\t\t}),\n\t\t);\n\t\tthis.#events.emit('change', { accounts: this.#accounts });\n\t}\n\n\t#tryRestoreSession(): void {\n\t\tif (typeof localStorage === 'undefined') return;\n\t\tconst session = localStorage.getItem(this.#sessionKey);\n\t\tif (!session) return;\n\n\t\ttry {\n\t\t\tthis.#setAccountsFromSession(session);\n\t\t} catch {\n\t\t\tthis.#clearSession();\n\t\t}\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"dev-wallet-client.mjs","names":["#name","#icon","#origin","#sessionKey","#events","#tryRestoreSession","#accounts","#connect","#on","#disconnect","#signPersonalMessage","#signTransaction","#signAndExecuteTransaction","#createChannel","#setSession","#setAccountsFromSession","#clearSession","#getSession"],"sources":["../../src/client/dev-wallet-client.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase64, toBase64 } from '@mysten/sui/utils';\nimport { mitt, type Emitter } from '@mysten/utils';\nimport type {\n\tStandardConnectFeature,\n\tStandardConnectMethod,\n\tStandardDisconnectFeature,\n\tStandardDisconnectMethod,\n\tStandardEventsFeature,\n\tStandardEventsOnMethod,\n\tSuiFeatures,\n\tSuiSignAndExecuteTransactionMethod,\n\tSuiSignPersonalMessageMethod,\n\tSuiSignTransactionMethod,\n\tWallet,\n\tWalletIcon,\n} from '@mysten/wallet-standard';\nimport { getWallets, ReadonlyWalletAccount, SUI_CHAINS } from '@mysten/wallet-standard';\nimport { DappPostMessageChannel, decodeJwtSession } from '@mysten/window-wallet-core';\n\nimport { DEFAULT_WALLET_ICON, type WalletEventsMap } from '../wallet/constants.js';\n\nconst DEFAULT_WALLET_NAME = 'Dev Wallet (Web)';\nconst DEFAULT_ORIGIN = 'http://localhost:5174';\n\n/**\n * Creates a wallet initializer that can be passed to `createDAppKit({ walletInitializers: [...] })`.\n *\n * This registers a {@link DevWalletClient} that communicates with a standalone\n * dev wallet server via PostMessage popups.\n *\n * @example\n * ```ts\n * import { createDAppKit } from '@mysten/dapp-kit-react';\n * import { devWalletClientInitializer } from '@mysten-incubation/dev-wallet/client';\n *\n * const dAppKit = createDAppKit({\n * networks: ['devnet'],\n * walletInitializers: [\n * devWalletClientInitializer({ origin: 'http://localhost:5174' }),\n * ],\n * });\n * ```\n */\nexport function devWalletClientInitializer(options?: DevWalletClientOptions): {\n\tid: string;\n\tinitialize(): { unregister: () => void };\n} {\n\treturn {\n\t\tid: 'dev-wallet-client-initializer',\n\t\tinitialize() {\n\t\t\tconst unregister = DevWalletClient.register(options);\n\t\t\treturn { unregister };\n\t\t},\n\t};\n}\n\nconst WALLET_FEATURES = [\n\t'sui:signTransaction',\n\t'sui:signAndExecuteTransaction',\n\t'sui:signPersonalMessage',\n] as const;\n\n/**\n * Options for creating a DevWalletClient.\n */\nexport interface DevWalletClientOptions {\n\t/** Display name for the wallet. Defaults to 'Dev Wallet (Web)'. */\n\tname?: string;\n\t/** Data URI icon for the wallet. */\n\ticon?: WalletIcon;\n\t/** Origin of the dev wallet web app. Defaults to 'http://localhost:5174'. */\n\torigin?: string;\n}\n\n/**\n * Wallet-standard wallet that communicates with a standalone DevWallet\n * web app via PostMessage popups (started via `npx @mysten-incubation/dev-wallet serve`).\n */\nexport class DevWalletClient implements Wallet {\n\treadonly #name: string;\n\treadonly #icon: WalletIcon;\n\treadonly #origin: string;\n\treadonly #sessionKey: string;\n\t#accounts: ReadonlyWalletAccount[] = [];\n\t#events: Emitter<WalletEventsMap>;\n\n\tconstructor(options?: DevWalletClientOptions) {\n\t\tthis.#name = options?.name ?? DEFAULT_WALLET_NAME;\n\t\tthis.#icon = options?.icon ?? DEFAULT_WALLET_ICON;\n\t\tthis.#origin = options?.origin ?? DEFAULT_ORIGIN;\n\t\tthis.#sessionKey = `dev-wallet:session:${this.#origin}`;\n\t\tthis.#events = mitt();\n\t\tthis.#tryRestoreSession();\n\t}\n\n\tstatic register(options?: DevWalletClientOptions): () => void {\n\t\tconst wallet = new DevWalletClient(options);\n\t\tconst wallets = getWallets();\n\t\treturn wallets.register(wallet);\n\t}\n\n\tget version() {\n\t\treturn '1.0.0' as const;\n\t}\n\n\tget name() {\n\t\treturn this.#name;\n\t}\n\n\tget icon() {\n\t\treturn this.#icon;\n\t}\n\n\tget chains() {\n\t\treturn SUI_CHAINS;\n\t}\n\n\tget accounts(): readonly ReadonlyWalletAccount[] {\n\t\treturn this.#accounts;\n\t}\n\n\tget features(): StandardConnectFeature &\n\t\tStandardEventsFeature &\n\t\tStandardDisconnectFeature &\n\t\tSuiFeatures {\n\t\treturn {\n\t\t\t'standard:connect': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tconnect: this.#connect,\n\t\t\t},\n\t\t\t'standard:events': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\ton: this.#on,\n\t\t\t},\n\t\t\t'standard:disconnect': {\n\t\t\t\tversion: '1.0.0',\n\t\t\t\tdisconnect: this.#disconnect,\n\t\t\t},\n\t\t\t'sui:signPersonalMessage': {\n\t\t\t\tversion: '1.1.0',\n\t\t\t\tsignPersonalMessage: this.#signPersonalMessage,\n\t\t\t},\n\t\t\t'sui:signTransaction': {\n\t\t\t\tversion: '2.0.0',\n\t\t\t\tsignTransaction: this.#signTransaction,\n\t\t\t},\n\t\t\t'sui:signAndExecuteTransaction': {\n\t\t\t\tversion: '2.0.0',\n\t\t\t\tsignAndExecuteTransaction: this.#signAndExecuteTransaction,\n\t\t\t},\n\t\t};\n\t}\n\n\t#on: StandardEventsOnMethod = (event, listener) => {\n\t\tthis.#events.on(event, listener);\n\t\treturn () => this.#events.off(event, listener);\n\t};\n\n\t#connect: StandardConnectMethod = async () => {\n\t\tconst channel = this.#createChannel();\n\t\tconst response = await channel.send({ type: 'connect' });\n\n\t\tthis.#setSession(response.session);\n\t\tthis.#setAccountsFromSession(response.session);\n\n\t\treturn { accounts: this.accounts };\n\t};\n\n\t#disconnect: StandardDisconnectMethod = async () => {\n\t\tthis.#clearSession();\n\t\tthis.#accounts = [];\n\t\tthis.#events.emit('change', { accounts: this.#accounts });\n\t};\n\n\t#signPersonalMessage: SuiSignPersonalMessageMethod = async (input) => {\n\t\tconst channel = this.#createChannel();\n\t\tconst response = await channel.send({\n\t\t\ttype: 'sign-personal-message',\n\t\t\tmessage: toBase64(input.message),\n\t\t\taddress: input.account.address,\n\t\t\tchain: input.chain ?? input.account.chains[0] ?? 'sui:unknown',\n\t\t\tsession: this.#getSession(),\n\t\t});\n\n\t\treturn { bytes: response.bytes, signature: response.signature };\n\t};\n\n\t#signTransaction: SuiSignTransactionMethod = async (input) => {\n\t\tconst txJson = await input.transaction.toJSON();\n\t\tconst channel = this.#createChannel();\n\t\tconst response = await channel.send({\n\t\t\ttype: 'sign-transaction',\n\t\t\ttransaction: txJson,\n\t\t\taddress: input.account.address,\n\t\t\tchain: input.chain,\n\t\t\tsession: this.#getSession(),\n\t\t});\n\n\t\treturn { bytes: response.bytes, signature: response.signature };\n\t};\n\n\t#signAndExecuteTransaction: SuiSignAndExecuteTransactionMethod = async (input) => {\n\t\tconst txJson = await input.transaction.toJSON();\n\t\tconst channel = this.#createChannel();\n\t\tconst response = await channel.send({\n\t\t\ttype: 'sign-and-execute-transaction',\n\t\t\ttransaction: txJson,\n\t\t\taddress: input.account.address,\n\t\t\tchain: input.chain,\n\t\t\tsession: this.#getSession(),\n\t\t});\n\n\t\treturn {\n\t\t\tbytes: response.bytes,\n\t\t\tsignature: response.signature,\n\t\t\tdigest: response.digest,\n\t\t\teffects: response.effects,\n\t\t};\n\t};\n\n\t#createChannel(): DappPostMessageChannel {\n\t\treturn new DappPostMessageChannel({\n\t\t\tappName: this.#name,\n\t\t\thostOrigin: this.#origin,\n\t\t});\n\t}\n\n\t#getSession(): string {\n\t\tif (typeof localStorage === 'undefined') {\n\t\t\tthrow new Error('No active session. Call connect() first.');\n\t\t}\n\t\tconst session = localStorage.getItem(this.#sessionKey);\n\t\tif (!session) {\n\t\t\tthrow new Error('No active session. Call connect() first.');\n\t\t}\n\t\treturn session;\n\t}\n\n\t#setSession(session: string): void {\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.setItem(this.#sessionKey, session);\n\t\t}\n\t}\n\n\t#clearSession(): void {\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.removeItem(this.#sessionKey);\n\t\t}\n\t}\n\n\t#setAccountsFromSession(session: string): void {\n\t\tconst decoded = decodeJwtSession(session);\n\t\tthis.#accounts = decoded.payload.accounts.map(\n\t\t\t(account: { address: string; publicKey: string; label?: string }) =>\n\t\t\t\tnew ReadonlyWalletAccount({\n\t\t\t\t\taddress: account.address,\n\t\t\t\t\tpublicKey: account.publicKey ? fromBase64(account.publicKey) : new Uint8Array(0),\n\t\t\t\t\tchains: [...SUI_CHAINS],\n\t\t\t\t\tfeatures: [...WALLET_FEATURES],\n\t\t\t\t\tlabel: account.label,\n\t\t\t\t}),\n\t\t);\n\t\tthis.#events.emit('change', { accounts: this.#accounts });\n\t}\n\n\t#tryRestoreSession(): void {\n\t\tif (typeof localStorage === 'undefined') return;\n\t\tconst session = localStorage.getItem(this.#sessionKey);\n\t\tif (!session) return;\n\n\t\ttry {\n\t\t\tthis.#setAccountsFromSession(session);\n\t\t} catch {\n\t\t\tthis.#clearSession();\n\t\t}\n\t}\n}\n"],"mappings":"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"}
@@ -1,4 +1,3 @@
1
1
  import { DevWalletClient, devWalletClientInitializer } from "./dev-wallet-client.mjs";
2
2
  import { parseWalletRequest } from "./request-handler.mjs";
3
-
4
- export { DevWalletClient, devWalletClientInitializer, parseWalletRequest };
3
+ export { DevWalletClient, devWalletClientInitializer, parseWalletRequest };
@@ -2,51 +2,45 @@ import { getNetworkFromChain } from "../wallet/constants.mjs";
2
2
  import { executeSigning } from "../wallet/signing.mjs";
3
3
  import { fromBase64, toBase64 } from "@mysten/sui/utils";
4
4
  import { WalletPostMessageChannel, createJwtSession } from "@mysten/window-wallet-core";
5
-
6
5
  //#region src/client/request-handler.ts
7
6
  function parseWalletRequest(options) {
8
- if (!options.hash && typeof window === "undefined") {
9
- throw new Error("parseWalletRequest requires either options.hash or a browser environment with window.location");
10
- }
7
+ if (!options.hash && typeof window === "undefined") throw new Error("parseWalletRequest requires either options.hash or a browser environment with window.location");
11
8
  const hash = options.hash ?? window.location.hash.slice(1);
12
9
  const channel = WalletPostMessageChannel.fromUrlHash(hash);
13
10
  const requestData = channel.getRequestData();
14
11
  const payload = requestData.payload;
15
- if (payload.type === "connect") {
16
- return {
17
- type: "connect",
18
- appName: requestData.appName,
19
- appUrl: requestData.appUrl,
20
- async approve(approveOptions) {
21
- const allAccounts = options.adapters.flatMap((adapter) => adapter.getAccounts().map((a) => ({
22
- address: a.address,
23
- publicKey: toBase64(a.signer.getPublicKey().toSuiBytes()),
24
- label: a.label
25
- })));
26
- const selected = approveOptions?.selectedAddresses;
27
- const accounts = selected ? allAccounts.filter((a) => selected.includes(a.address)) : allAccounts;
28
- const session = await createJwtSession({ accounts }, {
29
- secretKey: options.jwtSecretKey,
30
- expirationTime: "7d",
31
- issuer: "dev-wallet",
32
- audience: new URL(requestData.appUrl).origin
33
- });
34
- channel.sendMessage({
35
- type: "resolve",
36
- data: {
37
- type: "connect",
38
- session
39
- }
40
- });
41
- },
42
- reject(reason) {
43
- channel.sendMessage({
44
- type: "reject",
45
- reason
46
- });
47
- }
48
- };
49
- }
12
+ if (payload.type === "connect") return {
13
+ type: "connect",
14
+ appName: requestData.appName,
15
+ appUrl: requestData.appUrl,
16
+ async approve(approveOptions) {
17
+ const allAccounts = options.adapters.flatMap((adapter) => adapter.getAccounts().map((a) => ({
18
+ address: a.address,
19
+ publicKey: toBase64(a.signer.getPublicKey().toSuiBytes()),
20
+ label: a.label
21
+ })));
22
+ const selected = approveOptions?.selectedAddresses;
23
+ const session = await createJwtSession({ accounts: selected ? allAccounts.filter((a) => selected.includes(a.address)) : allAccounts }, {
24
+ secretKey: options.jwtSecretKey,
25
+ expirationTime: "7d",
26
+ issuer: "dev-wallet",
27
+ audience: new URL(requestData.appUrl).origin
28
+ });
29
+ channel.sendMessage({
30
+ type: "resolve",
31
+ data: {
32
+ type: "connect",
33
+ session
34
+ }
35
+ });
36
+ },
37
+ reject(reason) {
38
+ channel.sendMessage({
39
+ type: "reject",
40
+ reason
41
+ });
42
+ }
43
+ };
50
44
  const messageData = payload.type === "sign-personal-message" ? fromBase64(payload.message) : payload.transaction;
51
45
  return {
52
46
  type: payload.type,
@@ -78,8 +72,8 @@ function parseWalletRequest(options) {
78
72
  return;
79
73
  }
80
74
  try {
81
- const network = payload.chain ? getNetworkFromChain(payload.chain) : undefined;
82
- const client = network ? options.getClient?.(network) : undefined;
75
+ const network = payload.chain ? getNetworkFromChain(payload.chain) : void 0;
76
+ const client = network ? options.getClient?.(network) : void 0;
83
77
  const result = await executeSigning({
84
78
  type: payload.type,
85
79
  signer: account.signer,
@@ -109,7 +103,7 @@ function parseWalletRequest(options) {
109
103
  }
110
104
  };
111
105
  }
112
-
113
106
  //#endregion
114
107
  export { parseWalletRequest };
108
+
115
109
  //# sourceMappingURL=request-handler.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"request-handler.mjs","names":[],"sources":["../../src/client/request-handler.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ClientWithCoreApi } from '@mysten/sui/client';\nimport { fromBase64, toBase64 } from '@mysten/sui/utils';\nimport { createJwtSession, WalletPostMessageChannel } from '@mysten/window-wallet-core';\n\nimport type { SignerAdapter } from '../types.js';\nimport { getNetworkFromChain } from '../wallet/constants.js';\nimport { executeSigning } from '../wallet/signing.js';\n\n/**\n * A parsed wallet request with methods to approve or reject it.\n *\n * This is different from `PendingSigningRequest` (in dev-wallet.ts) — this interface\n * includes `approve()`/`reject()` methods and is specific to the standalone popup flow.\n */\nexport interface PendingWalletRequest {\n\ttype: 'connect' | 'sign-transaction' | 'sign-and-execute-transaction' | 'sign-personal-message';\n\tappName: string;\n\tappUrl: string;\n\taddress?: string;\n\tchain?: string;\n\tdata?: string | Uint8Array;\n\t/**\n\t * Approve the request.\n\t * For connect: creates a session with the selected accounts (or all if none specified).\n\t * For signing: signs with the adapter.\n\t */\n\tapprove(options?: { selectedAddresses?: string[] }): Promise<void>;\n\t/** Reject the request with an optional reason. */\n\treject(reason?: string): void;\n}\n\nexport interface HandleRequestOptions {\n\t/** The signer adapters providing accounts and signing capability. */\n\tadapters: SignerAdapter[];\n\t/** JWT secret key for session creation. */\n\tjwtSecretKey: CryptoKey | Uint8Array;\n\t/** Resolve a client for a given network name (needed for signAndExecute). */\n\tgetClient?: (network: string) => ClientWithCoreApi | undefined;\n\t/** URL hash containing the encoded request. Defaults to window.location.hash. */\n\thash?: string;\n}\n\nexport function parseWalletRequest(options: HandleRequestOptions): PendingWalletRequest {\n\tif (!options.hash && typeof window === 'undefined') {\n\t\tthrow new Error(\n\t\t\t'parseWalletRequest requires either options.hash or a browser environment with window.location',\n\t\t);\n\t}\n\tconst hash = options.hash ?? window.location.hash.slice(1);\n\tconst channel = WalletPostMessageChannel.fromUrlHash(hash);\n\tconst requestData = channel.getRequestData();\n\tconst payload = requestData.payload;\n\n\tif (payload.type === 'connect') {\n\t\treturn {\n\t\t\ttype: 'connect',\n\t\t\tappName: requestData.appName,\n\t\t\tappUrl: requestData.appUrl,\n\t\t\tasync approve(approveOptions?: { selectedAddresses?: string[] }) {\n\t\t\t\tconst allAccounts = options.adapters.flatMap((adapter) =>\n\t\t\t\t\tadapter.getAccounts().map((a) => ({\n\t\t\t\t\t\taddress: a.address,\n\t\t\t\t\t\tpublicKey: toBase64(a.signer.getPublicKey().toSuiBytes()),\n\t\t\t\t\t\tlabel: a.label,\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t\tconst selected = approveOptions?.selectedAddresses;\n\t\t\t\tconst accounts = selected\n\t\t\t\t\t? allAccounts.filter((a) => selected.includes(a.address))\n\t\t\t\t\t: allAccounts;\n\n\t\t\t\tconst session = await createJwtSession(\n\t\t\t\t\t{ accounts },\n\t\t\t\t\t{\n\t\t\t\t\t\tsecretKey: options.jwtSecretKey,\n\t\t\t\t\t\texpirationTime: '7d',\n\t\t\t\t\t\tissuer: 'dev-wallet',\n\t\t\t\t\t\taudience: new URL(requestData.appUrl).origin,\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tchannel.sendMessage({\n\t\t\t\t\ttype: 'resolve',\n\t\t\t\t\tdata: { type: 'connect', session },\n\t\t\t\t});\n\t\t\t},\n\t\t\treject(reason?: string) {\n\t\t\t\tchannel.sendMessage({ type: 'reject', reason });\n\t\t\t},\n\t\t};\n\t}\n\n\tconst messageData =\n\t\tpayload.type === 'sign-personal-message' ? fromBase64(payload.message) : payload.transaction;\n\n\treturn {\n\t\ttype: payload.type,\n\t\tappName: requestData.appName,\n\t\tappUrl: requestData.appUrl,\n\t\taddress: payload.address,\n\t\tchain: payload.chain,\n\t\tdata: messageData,\n\t\tasync approve() {\n\t\t\t// Verify JWT session before signing — ensures the dApp was previously\n\t\t\t// authorized for this account via a connect flow\n\t\t\ttry {\n\t\t\t\tawait channel.verifyJwtSession(options.jwtSecretKey);\n\t\t\t} catch (error) {\n\t\t\t\tchannel.sendMessage({\n\t\t\t\t\ttype: 'reject',\n\t\t\t\t\treason: `Session verification failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet account;\n\t\t\tfor (const adapter of options.adapters) {\n\t\t\t\taccount = adapter.getAccount(payload.address);\n\t\t\t\tif (account) break;\n\t\t\t}\n\t\t\tif (!account) {\n\t\t\t\tchannel.sendMessage({\n\t\t\t\t\ttype: 'reject',\n\t\t\t\t\treason: `Account ${payload.address} not found`,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst network = payload.chain ? getNetworkFromChain(payload.chain) : undefined;\n\t\t\t\tconst client = network ? options.getClient?.(network) : undefined;\n\t\t\t\tconst result = await executeSigning({\n\t\t\t\t\ttype: payload.type,\n\t\t\t\t\tsigner: account.signer,\n\t\t\t\t\tdata: messageData,\n\t\t\t\t\tclient,\n\t\t\t\t});\n\t\t\t\t// effects must be a string in the PostMessage protocol\n\t\t\t\tconst data =\n\t\t\t\t\tresult.type === 'sign-and-execute-transaction'\n\t\t\t\t\t\t? { ...result, effects: result.effects ?? '' }\n\t\t\t\t\t\t: result;\n\t\t\t\tchannel.sendMessage({\n\t\t\t\t\ttype: 'resolve',\n\t\t\t\t\tdata,\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tchannel.sendMessage({\n\t\t\t\t\ttype: 'reject',\n\t\t\t\t\treason: error instanceof Error ? error.message : String(error),\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\treject(reason?: string) {\n\t\t\tchannel.sendMessage({ type: 'reject', reason });\n\t\t},\n\t};\n}\n"],"mappings":";;;;;;AA6CA,SAAgB,mBAAmB,SAAqD;AACvF,KAAI,CAAC,QAAQ,QAAQ,OAAO,WAAW,aAAa;AACnD,QAAM,IAAI,MACT,gGACA;;CAEF,MAAM,OAAO,QAAQ,QAAQ,OAAO,SAAS,KAAK,MAAM,EAAE;CAC1D,MAAM,UAAU,yBAAyB,YAAY,KAAK;CAC1D,MAAM,cAAc,QAAQ,gBAAgB;CAC5C,MAAM,UAAU,YAAY;AAE5B,KAAI,QAAQ,SAAS,WAAW;AAC/B,SAAO;GACN,MAAM;GACN,SAAS,YAAY;GACrB,QAAQ,YAAY;GACpB,MAAM,QAAQ,gBAAmD;IAChE,MAAM,cAAc,QAAQ,SAAS,SAAS,YAC7C,QAAQ,aAAa,CAAC,KAAK,OAAO;KACjC,SAAS,EAAE;KACX,WAAW,SAAS,EAAE,OAAO,cAAc,CAAC,YAAY,CAAC;KACzD,OAAO,EAAE;KACT,EAAE,CACH;IACD,MAAM,WAAW,gBAAgB;IACjC,MAAM,WAAW,WACd,YAAY,QAAQ,MAAM,SAAS,SAAS,EAAE,QAAQ,CAAC,GACvD;IAEH,MAAM,UAAU,MAAM,iBACrB,EAAE,UAAU,EACZ;KACC,WAAW,QAAQ;KACnB,gBAAgB;KAChB,QAAQ;KACR,UAAU,IAAI,IAAI,YAAY,OAAO,CAAC;KACtC,CACD;AAED,YAAQ,YAAY;KACnB,MAAM;KACN,MAAM;MAAE,MAAM;MAAW;MAAS;KAClC,CAAC;;GAEH,OAAO,QAAiB;AACvB,YAAQ,YAAY;KAAE,MAAM;KAAU;KAAQ,CAAC;;GAEhD;;CAGF,MAAM,cACL,QAAQ,SAAS,0BAA0B,WAAW,QAAQ,QAAQ,GAAG,QAAQ;AAElF,QAAO;EACN,MAAM,QAAQ;EACd,SAAS,YAAY;EACrB,QAAQ,YAAY;EACpB,SAAS,QAAQ;EACjB,OAAO,QAAQ;EACf,MAAM;EACN,MAAM,UAAU;AAGf,OAAI;AACH,UAAM,QAAQ,iBAAiB,QAAQ,aAAa;YAC5C,OAAO;AACf,YAAQ,YAAY;KACnB,MAAM;KACN,QAAQ,gCAAgC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;KAC9F,CAAC;AACF;;GAGD,IAAI;AACJ,QAAK,MAAM,WAAW,QAAQ,UAAU;AACvC,cAAU,QAAQ,WAAW,QAAQ,QAAQ;AAC7C,QAAI,QAAS;;AAEd,OAAI,CAAC,SAAS;AACb,YAAQ,YAAY;KACnB,MAAM;KACN,QAAQ,WAAW,QAAQ,QAAQ;KACnC,CAAC;AACF;;AAGD,OAAI;IACH,MAAM,UAAU,QAAQ,QAAQ,oBAAoB,QAAQ,MAAM,GAAG;IACrE,MAAM,SAAS,UAAU,QAAQ,YAAY,QAAQ,GAAG;IACxD,MAAM,SAAS,MAAM,eAAe;KACnC,MAAM,QAAQ;KACd,QAAQ,QAAQ;KAChB,MAAM;KACN;KACA,CAAC;IAEF,MAAM,OACL,OAAO,SAAS,iCACb;KAAE,GAAG;KAAQ,SAAS,OAAO,WAAW;KAAI,GAC5C;AACJ,YAAQ,YAAY;KACnB,MAAM;KACN;KACA,CAAC;YACM,OAAO;AACf,YAAQ,YAAY;KACnB,MAAM;KACN,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;KAC9D,CAAC;;;EAGJ,OAAO,QAAiB;AACvB,WAAQ,YAAY;IAAE,MAAM;IAAU;IAAQ,CAAC;;EAEhD"}
1
+ {"version":3,"file":"request-handler.mjs","names":[],"sources":["../../src/client/request-handler.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ClientWithCoreApi } from '@mysten/sui/client';\nimport { fromBase64, toBase64 } from '@mysten/sui/utils';\nimport { createJwtSession, WalletPostMessageChannel } from '@mysten/window-wallet-core';\n\nimport type { SignerAdapter } from '../types.js';\nimport { getNetworkFromChain } from '../wallet/constants.js';\nimport { executeSigning } from '../wallet/signing.js';\n\n/**\n * A parsed wallet request with methods to approve or reject it.\n *\n * This is different from `PendingSigningRequest` (in dev-wallet.ts) — this interface\n * includes `approve()`/`reject()` methods and is specific to the standalone popup flow.\n */\nexport interface PendingWalletRequest {\n\ttype: 'connect' | 'sign-transaction' | 'sign-and-execute-transaction' | 'sign-personal-message';\n\tappName: string;\n\tappUrl: string;\n\taddress?: string;\n\tchain?: string;\n\tdata?: string | Uint8Array;\n\t/**\n\t * Approve the request.\n\t * For connect: creates a session with the selected accounts (or all if none specified).\n\t * For signing: signs with the adapter.\n\t */\n\tapprove(options?: { selectedAddresses?: string[] }): Promise<void>;\n\t/** Reject the request with an optional reason. */\n\treject(reason?: string): void;\n}\n\nexport interface HandleRequestOptions {\n\t/** The signer adapters providing accounts and signing capability. */\n\tadapters: SignerAdapter[];\n\t/** JWT secret key for session creation. */\n\tjwtSecretKey: CryptoKey | Uint8Array;\n\t/** Resolve a client for a given network name (needed for signAndExecute). */\n\tgetClient?: (network: string) => ClientWithCoreApi | undefined;\n\t/** URL hash containing the encoded request. Defaults to window.location.hash. */\n\thash?: string;\n}\n\nexport function parseWalletRequest(options: HandleRequestOptions): PendingWalletRequest {\n\tif (!options.hash && typeof window === 'undefined') {\n\t\tthrow new Error(\n\t\t\t'parseWalletRequest requires either options.hash or a browser environment with window.location',\n\t\t);\n\t}\n\tconst hash = options.hash ?? window.location.hash.slice(1);\n\tconst channel = WalletPostMessageChannel.fromUrlHash(hash);\n\tconst requestData = channel.getRequestData();\n\tconst payload = requestData.payload;\n\n\tif (payload.type === 'connect') {\n\t\treturn {\n\t\t\ttype: 'connect',\n\t\t\tappName: requestData.appName,\n\t\t\tappUrl: requestData.appUrl,\n\t\t\tasync approve(approveOptions?: { selectedAddresses?: string[] }) {\n\t\t\t\tconst allAccounts = options.adapters.flatMap((adapter) =>\n\t\t\t\t\tadapter.getAccounts().map((a) => ({\n\t\t\t\t\t\taddress: a.address,\n\t\t\t\t\t\tpublicKey: toBase64(a.signer.getPublicKey().toSuiBytes()),\n\t\t\t\t\t\tlabel: a.label,\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t\tconst selected = approveOptions?.selectedAddresses;\n\t\t\t\tconst accounts = selected\n\t\t\t\t\t? allAccounts.filter((a) => selected.includes(a.address))\n\t\t\t\t\t: allAccounts;\n\n\t\t\t\tconst session = await createJwtSession(\n\t\t\t\t\t{ accounts },\n\t\t\t\t\t{\n\t\t\t\t\t\tsecretKey: options.jwtSecretKey,\n\t\t\t\t\t\texpirationTime: '7d',\n\t\t\t\t\t\tissuer: 'dev-wallet',\n\t\t\t\t\t\taudience: new URL(requestData.appUrl).origin,\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tchannel.sendMessage({\n\t\t\t\t\ttype: 'resolve',\n\t\t\t\t\tdata: { type: 'connect', session },\n\t\t\t\t});\n\t\t\t},\n\t\t\treject(reason?: string) {\n\t\t\t\tchannel.sendMessage({ type: 'reject', reason });\n\t\t\t},\n\t\t};\n\t}\n\n\tconst messageData =\n\t\tpayload.type === 'sign-personal-message' ? fromBase64(payload.message) : payload.transaction;\n\n\treturn {\n\t\ttype: payload.type,\n\t\tappName: requestData.appName,\n\t\tappUrl: requestData.appUrl,\n\t\taddress: payload.address,\n\t\tchain: payload.chain,\n\t\tdata: messageData,\n\t\tasync approve() {\n\t\t\t// Verify JWT session before signing — ensures the dApp was previously\n\t\t\t// authorized for this account via a connect flow\n\t\t\ttry {\n\t\t\t\tawait channel.verifyJwtSession(options.jwtSecretKey);\n\t\t\t} catch (error) {\n\t\t\t\tchannel.sendMessage({\n\t\t\t\t\ttype: 'reject',\n\t\t\t\t\treason: `Session verification failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet account;\n\t\t\tfor (const adapter of options.adapters) {\n\t\t\t\taccount = adapter.getAccount(payload.address);\n\t\t\t\tif (account) break;\n\t\t\t}\n\t\t\tif (!account) {\n\t\t\t\tchannel.sendMessage({\n\t\t\t\t\ttype: 'reject',\n\t\t\t\t\treason: `Account ${payload.address} not found`,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst network = payload.chain ? getNetworkFromChain(payload.chain) : undefined;\n\t\t\t\tconst client = network ? options.getClient?.(network) : undefined;\n\t\t\t\tconst result = await executeSigning({\n\t\t\t\t\ttype: payload.type,\n\t\t\t\t\tsigner: account.signer,\n\t\t\t\t\tdata: messageData,\n\t\t\t\t\tclient,\n\t\t\t\t});\n\t\t\t\t// effects must be a string in the PostMessage protocol\n\t\t\t\tconst data =\n\t\t\t\t\tresult.type === 'sign-and-execute-transaction'\n\t\t\t\t\t\t? { ...result, effects: result.effects ?? '' }\n\t\t\t\t\t\t: result;\n\t\t\t\tchannel.sendMessage({\n\t\t\t\t\ttype: 'resolve',\n\t\t\t\t\tdata,\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tchannel.sendMessage({\n\t\t\t\t\ttype: 'reject',\n\t\t\t\t\treason: error instanceof Error ? error.message : String(error),\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\treject(reason?: string) {\n\t\t\tchannel.sendMessage({ type: 'reject', reason });\n\t\t},\n\t};\n}\n"],"mappings":";;;;;AA6CA,SAAgB,mBAAmB,SAAqD;AACvF,KAAI,CAAC,QAAQ,QAAQ,OAAO,WAAW,YACtC,OAAM,IAAI,MACT,gGACA;CAEF,MAAM,OAAO,QAAQ,QAAQ,OAAO,SAAS,KAAK,MAAM,EAAE;CAC1D,MAAM,UAAU,yBAAyB,YAAY,KAAK;CAC1D,MAAM,cAAc,QAAQ,gBAAgB;CAC5C,MAAM,UAAU,YAAY;AAE5B,KAAI,QAAQ,SAAS,UACpB,QAAO;EACN,MAAM;EACN,SAAS,YAAY;EACrB,QAAQ,YAAY;EACpB,MAAM,QAAQ,gBAAmD;GAChE,MAAM,cAAc,QAAQ,SAAS,SAAS,YAC7C,QAAQ,aAAa,CAAC,KAAK,OAAO;IACjC,SAAS,EAAE;IACX,WAAW,SAAS,EAAE,OAAO,cAAc,CAAC,YAAY,CAAC;IACzD,OAAO,EAAE;IACT,EAAE,CACH;GACD,MAAM,WAAW,gBAAgB;GAKjC,MAAM,UAAU,MAAM,iBACrB,EAAE,UALc,WACd,YAAY,QAAQ,MAAM,SAAS,SAAS,EAAE,QAAQ,CAAC,GACvD,aAGU,EACZ;IACC,WAAW,QAAQ;IACnB,gBAAgB;IAChB,QAAQ;IACR,UAAU,IAAI,IAAI,YAAY,OAAO,CAAC;IACtC,CACD;AAED,WAAQ,YAAY;IACnB,MAAM;IACN,MAAM;KAAE,MAAM;KAAW;KAAS;IAClC,CAAC;;EAEH,OAAO,QAAiB;AACvB,WAAQ,YAAY;IAAE,MAAM;IAAU;IAAQ,CAAC;;EAEhD;CAGF,MAAM,cACL,QAAQ,SAAS,0BAA0B,WAAW,QAAQ,QAAQ,GAAG,QAAQ;AAElF,QAAO;EACN,MAAM,QAAQ;EACd,SAAS,YAAY;EACrB,QAAQ,YAAY;EACpB,SAAS,QAAQ;EACjB,OAAO,QAAQ;EACf,MAAM;EACN,MAAM,UAAU;AAGf,OAAI;AACH,UAAM,QAAQ,iBAAiB,QAAQ,aAAa;YAC5C,OAAO;AACf,YAAQ,YAAY;KACnB,MAAM;KACN,QAAQ,gCAAgC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;KAC9F,CAAC;AACF;;GAGD,IAAI;AACJ,QAAK,MAAM,WAAW,QAAQ,UAAU;AACvC,cAAU,QAAQ,WAAW,QAAQ,QAAQ;AAC7C,QAAI,QAAS;;AAEd,OAAI,CAAC,SAAS;AACb,YAAQ,YAAY;KACnB,MAAM;KACN,QAAQ,WAAW,QAAQ,QAAQ;KACnC,CAAC;AACF;;AAGD,OAAI;IACH,MAAM,UAAU,QAAQ,QAAQ,oBAAoB,QAAQ,MAAM,GAAG;IACrE,MAAM,SAAS,UAAU,QAAQ,YAAY,QAAQ,GAAG;IACxD,MAAM,SAAS,MAAM,eAAe;KACnC,MAAM,QAAQ;KACd,QAAQ,QAAQ;KAChB,MAAM;KACN;KACA,CAAC;IAEF,MAAM,OACL,OAAO,SAAS,iCACb;KAAE,GAAG;KAAQ,SAAS,OAAO,WAAW;KAAI,GAC5C;AACJ,YAAQ,YAAY;KACnB,MAAM;KACN;KACA,CAAC;YACM,OAAO;AACf,YAAQ,YAAY;KACnB,MAAM;KACN,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;KAC9D,CAAC;;;EAGJ,OAAO,QAAiB;AACvB,WAAQ,YAAY;IAAE,MAAM;IAAU;IAAQ,CAAC;;EAEhD"}
package/dist/index.mjs CHANGED
@@ -1,4 +1,3 @@
1
1
  import { DEFAULT_NETWORK_URLS, DevWallet } from "./wallet/dev-wallet.mjs";
2
2
  import { devWalletInitializer } from "./wallet/initializer.mjs";
3
-
4
- export { DEFAULT_NETWORK_URLS, DevWallet, devWalletInitializer };
3
+ export { DEFAULT_NETWORK_URLS, DevWallet, devWalletInitializer };
@@ -1,29 +1,29 @@
1
+ import { DevWalletPanel as DevWalletPanel$1 } from "../ui/dev-wallet-panel.mjs";
1
2
  import { DevWalletNewAccount as DevWalletNewAccount$1 } from "../ui/dev-wallet-new-account.mjs";
2
3
  import { DevWalletAccounts as DevWalletAccounts$1 } from "../ui/dev-wallet-accounts.mjs";
3
4
  import { DevWalletBalances as DevWalletBalances$1 } from "../ui/dev-wallet-balances.mjs";
4
- import { DevWalletPanel as DevWalletPanel$1 } from "../ui/dev-wallet-panel.mjs";
5
5
  import { DevWalletSigning as DevWalletSigning$1 } from "../ui/dev-wallet-signing.mjs";
6
- import * as _mysten_wallet_standard0 from "@mysten/wallet-standard";
7
- import * as _lit_react0 from "@lit/react";
6
+ import * as _$_mysten_wallet_standard0 from "@mysten/wallet-standard";
7
+ import * as _$_lit_react0 from "@lit/react";
8
8
  import { EventName } from "@lit/react";
9
9
 
10
10
  //#region src/react/components.d.ts
11
- declare const DevWalletPanel: _lit_react0.ReactWebComponent<DevWalletPanel$1, {}>;
12
- declare const DevWalletAccounts: _lit_react0.ReactWebComponent<DevWalletAccounts$1, {
11
+ declare const DevWalletPanel: _$_lit_react0.ReactWebComponent<DevWalletPanel$1, {}>;
12
+ declare const DevWalletAccounts: _$_lit_react0.ReactWebComponent<DevWalletAccounts$1, {
13
13
  onAccountSelected: EventName<CustomEvent<{
14
- account: _mysten_wallet_standard0.ReadonlyWalletAccount;
14
+ account: _$_mysten_wallet_standard0.ReadonlyWalletAccount;
15
15
  }>>;
16
16
  onAccountRenamed: EventName<CustomEvent<{
17
17
  address: string;
18
18
  label: string;
19
19
  }>>;
20
20
  }>;
21
- declare const DevWalletBalances: _lit_react0.ReactWebComponent<DevWalletBalances$1, {}>;
22
- declare const DevWalletNewAccount: _lit_react0.ReactWebComponent<DevWalletNewAccount$1, {
21
+ declare const DevWalletBalances: _$_lit_react0.ReactWebComponent<DevWalletBalances$1, {}>;
22
+ declare const DevWalletNewAccount: _$_lit_react0.ReactWebComponent<DevWalletNewAccount$1, {
23
23
  onClose: EventName<CustomEvent>;
24
24
  onAccountCreated: EventName<CustomEvent>;
25
25
  }>;
26
- declare const DevWalletSigning: _lit_react0.ReactWebComponent<DevWalletSigning$1, {
26
+ declare const DevWalletSigning: _$_lit_react0.ReactWebComponent<DevWalletSigning$1, {
27
27
  onApprove: EventName<CustomEvent>;
28
28
  onReject: EventName<CustomEvent>;
29
29
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"components.d.mts","names":[],"sources":["../../src/react/components.ts"],"mappings":";;;;;;;;;;cAmBa,cAAA,EAAc,WAAA,CAAA,iBAAA,CAAA,gBAAA;AAAA,cAMd,iBAAA,EAQqC,WAAA,CARpB,iBAAA,CAAA,mBAAA;qBAKa,SAAA,CACxC,WAAA;IAAc,OAAA,EANa,wBAAA,CAM8B,qBAAA;EAAA;oBAEnB,SAAA,CACtC,WAAA;IAAc,OAAA;IAAiB,KAAA;EAAA;AAAA;AAAA,cAKrB,iBAAA,EAAiB,WAAA,CAAA,iBAAA,CAAA,mBAAA;AAAA,cAMjB,mBAAA,EAMqC,WAAA,CANlB,iBAAA,CAAA,qBAAA;WAKV,SAAA,CAAU,WAAA;oBACS,SAAA,CAAU,WAAA;AAAA;AAAA,cAItC,gBAAA,EAMoB,WAAA,CANJ,iBAAA,CAAA,kBAAA;aAKH,SAAA,CAAU,WAAA;YACZ,SAAA,CAAU,WAAA;AAAA"}
1
+ {"version":3,"file":"components.d.mts","names":[],"sources":["../../src/react/components.ts"],"mappings":";;;;;;;;;;cAmBa,cAAA,EAAc,aAAA,CAAA,iBAAA,CAAA,gBAAA;AAAA,cAMd,iBAAA,EAQqC,aAAA,CARpB,iBAAA,CAAA,mBAAA;qBAKa,SAAA,CACxC,WAAA;IAAc,OAAA,EANa,0BAAA,CAM8B,qBAAA;EAAA;oBAEnB,SAAA,CACtC,WAAA;IAAc,OAAA;IAAiB,KAAA;EAAA;AAAA;AAAA,cAKrB,iBAAA,EAAiB,aAAA,CAAA,iBAAA,CAAA,mBAAA;AAAA,cAMjB,mBAAA,EAMqC,aAAA,CANlB,iBAAA,CAAA,qBAAA;WAKV,SAAA,CAAU,WAAA;oBACS,SAAA,CAAU,WAAA;AAAA;AAAA,cAItC,gBAAA,EAMoB,aAAA,CANJ,iBAAA,CAAA,kBAAA;aAKH,SAAA,CAAU,WAAA;YACZ,SAAA,CAAU,WAAA;AAAA"}
@@ -5,11 +5,8 @@ import { DevWalletSigning as DevWalletSigning$1 } from "../ui/dev-wallet-signing
5
5
  import { DevWalletPanel as DevWalletPanel$1 } from "../ui/dev-wallet-panel.mjs";
6
6
  import * as React from "react";
7
7
  import { createComponent } from "@lit/react";
8
-
9
8
  //#region src/react/components.ts
10
- if (typeof customElements === "undefined") {
11
- throw new Error("@mysten-incubation/dev-wallet/react components require a browser environment. " + "Use dynamic imports with ssr:false in Next.js.");
12
- }
9
+ if (typeof customElements === "undefined") throw new Error("@mysten-incubation/dev-wallet/react components require a browser environment. Use dynamic imports with ssr:false in Next.js.");
13
10
  const DevWalletPanel = createComponent({
14
11
  react: React,
15
12
  tagName: "dev-wallet-panel",
@@ -47,7 +44,7 @@ const DevWalletSigning = createComponent({
47
44
  onReject: "reject"
48
45
  }
49
46
  });
50
-
51
47
  //#endregion
52
48
  export { DevWalletAccounts, DevWalletBalances, DevWalletNewAccount, DevWalletPanel, DevWalletSigning };
49
+
53
50
  //# sourceMappingURL=components.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"components.mjs","names":["DevWalletPanelElement","DevWalletAccountsElement","DevWalletBalancesElement","DevWalletNewAccountElement","DevWalletSigningElement"],"sources":["../../src/react/components.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nif (typeof customElements === 'undefined') {\n\tthrow new Error(\n\t\t'@mysten-incubation/dev-wallet/react components require a browser environment. ' +\n\t\t\t'Use dynamic imports with ssr:false in Next.js.',\n\t);\n}\n\nimport { createComponent, type EventName } from '@lit/react';\nimport * as React from 'react';\n\nimport { DevWalletAccounts as DevWalletAccountsElement } from '../ui/dev-wallet-accounts.js';\nimport { DevWalletBalances as DevWalletBalancesElement } from '../ui/dev-wallet-balances.js';\nimport { DevWalletNewAccount as DevWalletNewAccountElement } from '../ui/dev-wallet-new-account.js';\nimport { DevWalletPanel as DevWalletPanelElement } from '../ui/dev-wallet-panel.js';\nimport { DevWalletSigning as DevWalletSigningElement } from '../ui/dev-wallet-signing.js';\n\nexport const DevWalletPanel = createComponent({\n\treact: React,\n\ttagName: 'dev-wallet-panel',\n\telementClass: DevWalletPanelElement,\n});\n\nexport const DevWalletAccounts = createComponent({\n\treact: React,\n\ttagName: 'dev-wallet-accounts',\n\telementClass: DevWalletAccountsElement,\n\tevents: {\n\t\tonAccountSelected: 'account-selected' as EventName<\n\t\t\tCustomEvent<{ account: import('@mysten/wallet-standard').ReadonlyWalletAccount }>\n\t\t>,\n\t\tonAccountRenamed: 'account-renamed' as EventName<\n\t\t\tCustomEvent<{ address: string; label: string }>\n\t\t>,\n\t},\n});\n\nexport const DevWalletBalances = createComponent({\n\treact: React,\n\ttagName: 'dev-wallet-balances',\n\telementClass: DevWalletBalancesElement,\n});\n\nexport const DevWalletNewAccount = createComponent({\n\treact: React,\n\ttagName: 'dev-wallet-new-account',\n\telementClass: DevWalletNewAccountElement,\n\tevents: {\n\t\tonClose: 'close' as EventName<CustomEvent>,\n\t\tonAccountCreated: 'account-created' as EventName<CustomEvent>,\n\t},\n});\n\nexport const DevWalletSigning = createComponent({\n\treact: React,\n\ttagName: 'dev-wallet-signing',\n\telementClass: DevWalletSigningElement,\n\tevents: {\n\t\tonApprove: 'approve' as EventName<CustomEvent>,\n\t\tonReject: 'reject' as EventName<CustomEvent>,\n\t},\n});\n"],"mappings":";;;;;;;;;AAGA,IAAI,OAAO,mBAAmB,aAAa;AAC1C,OAAM,IAAI,MACT,mFACC,iDACD;;AAYF,MAAa,iBAAiB,gBAAgB;CAC7C,OAAO;CACP,SAAS;CACT,cAAcA;CACd,CAAC;AAEF,MAAa,oBAAoB,gBAAgB;CAChD,OAAO;CACP,SAAS;CACT,cAAcC;CACd,QAAQ;EACP,mBAAmB;EAGnB,kBAAkB;EAGlB;CACD,CAAC;AAEF,MAAa,oBAAoB,gBAAgB;CAChD,OAAO;CACP,SAAS;CACT,cAAcC;CACd,CAAC;AAEF,MAAa,sBAAsB,gBAAgB;CAClD,OAAO;CACP,SAAS;CACT,cAAcC;CACd,QAAQ;EACP,SAAS;EACT,kBAAkB;EAClB;CACD,CAAC;AAEF,MAAa,mBAAmB,gBAAgB;CAC/C,OAAO;CACP,SAAS;CACT,cAAcC;CACd,QAAQ;EACP,WAAW;EACX,UAAU;EACV;CACD,CAAC"}
1
+ {"version":3,"file":"components.mjs","names":["DevWalletPanelElement","DevWalletAccountsElement","DevWalletBalancesElement","DevWalletNewAccountElement","DevWalletSigningElement"],"sources":["../../src/react/components.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nif (typeof customElements === 'undefined') {\n\tthrow new Error(\n\t\t'@mysten-incubation/dev-wallet/react components require a browser environment. ' +\n\t\t\t'Use dynamic imports with ssr:false in Next.js.',\n\t);\n}\n\nimport { createComponent, type EventName } from '@lit/react';\nimport * as React from 'react';\n\nimport { DevWalletAccounts as DevWalletAccountsElement } from '../ui/dev-wallet-accounts.js';\nimport { DevWalletBalances as DevWalletBalancesElement } from '../ui/dev-wallet-balances.js';\nimport { DevWalletNewAccount as DevWalletNewAccountElement } from '../ui/dev-wallet-new-account.js';\nimport { DevWalletPanel as DevWalletPanelElement } from '../ui/dev-wallet-panel.js';\nimport { DevWalletSigning as DevWalletSigningElement } from '../ui/dev-wallet-signing.js';\n\nexport const DevWalletPanel = createComponent({\n\treact: React,\n\ttagName: 'dev-wallet-panel',\n\telementClass: DevWalletPanelElement,\n});\n\nexport const DevWalletAccounts = createComponent({\n\treact: React,\n\ttagName: 'dev-wallet-accounts',\n\telementClass: DevWalletAccountsElement,\n\tevents: {\n\t\tonAccountSelected: 'account-selected' as EventName<\n\t\t\tCustomEvent<{ account: import('@mysten/wallet-standard').ReadonlyWalletAccount }>\n\t\t>,\n\t\tonAccountRenamed: 'account-renamed' as EventName<\n\t\t\tCustomEvent<{ address: string; label: string }>\n\t\t>,\n\t},\n});\n\nexport const DevWalletBalances = createComponent({\n\treact: React,\n\ttagName: 'dev-wallet-balances',\n\telementClass: DevWalletBalancesElement,\n});\n\nexport const DevWalletNewAccount = createComponent({\n\treact: React,\n\ttagName: 'dev-wallet-new-account',\n\telementClass: DevWalletNewAccountElement,\n\tevents: {\n\t\tonClose: 'close' as EventName<CustomEvent>,\n\t\tonAccountCreated: 'account-created' as EventName<CustomEvent>,\n\t},\n});\n\nexport const DevWalletSigning = createComponent({\n\treact: React,\n\ttagName: 'dev-wallet-signing',\n\telementClass: DevWalletSigningElement,\n\tevents: {\n\t\tonApprove: 'approve' as EventName<CustomEvent>,\n\t\tonReject: 'reject' as EventName<CustomEvent>,\n\t},\n});\n"],"mappings":";;;;;;;;AAGA,IAAI,OAAO,mBAAmB,YAC7B,OAAM,IAAI,MACT,+HAEA;AAYF,MAAa,iBAAiB,gBAAgB;CAC7C,OAAO;CACP,SAAS;CACT,cAAcA;CACd,CAAC;AAEF,MAAa,oBAAoB,gBAAgB;CAChD,OAAO;CACP,SAAS;CACT,cAAcC;CACd,QAAQ;EACP,mBAAmB;EAGnB,kBAAkB;EAGlB;CACD,CAAC;AAEF,MAAa,oBAAoB,gBAAgB;CAChD,OAAO;CACP,SAAS;CACT,cAAcC;CACd,CAAC;AAEF,MAAa,sBAAsB,gBAAgB;CAClD,OAAO;CACP,SAAS;CACT,cAAcC;CACd,QAAQ;EACP,SAAS;EACT,kBAAkB;EAClB;CACD,CAAC;AAEF,MAAa,mBAAmB,gBAAgB;CAC/C,OAAO;CACP,SAAS;CACT,cAAcC;CACd,QAAQ;EACP,WAAW;EACX,UAAU;EACV;CACD,CAAC"}
@@ -1,9 +1,9 @@
1
1
  import { DevWallet } from "../wallet/dev-wallet.mjs";
2
- import * as react0 from "react";
2
+ import * as _$react from "react";
3
3
  import { ReactNode } from "react";
4
4
 
5
5
  //#region src/react/context.d.ts
6
- declare const DevWalletContext: react0.Context<DevWallet | null>;
6
+ declare const DevWalletContext: _$react.Context<DevWallet | null>;
7
7
  interface DevWalletProviderProps {
8
8
  wallet: DevWallet;
9
9
  children?: ReactNode;
@@ -11,7 +11,7 @@ interface DevWalletProviderProps {
11
11
  declare function DevWalletProvider({
12
12
  wallet,
13
13
  children
14
- }: DevWalletProviderProps): react0.FunctionComponentElement<react0.ProviderProps<DevWallet | null>>;
14
+ }: DevWalletProviderProps): _$react.FunctionComponentElement<_$react.ProviderProps<DevWallet | null>>;
15
15
  /**
16
16
  * @param wallet - If provided, context is bypassed.
17
17
  * @throws If no wallet is provided and no DevWalletProvider is in the tree.
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.mts","names":[],"sources":["../../src/react/context.ts"],"mappings":";;;;;cAQa,gBAAA,EAAgB,MAAA,CAAA,OAAA,CAAA,SAAA;AAAA,UAEZ,sBAAA;EAChB,MAAA,EAAQ,SAAA;EACR,QAAA,GAAW,SAAA;AAAA;AAAA,iBAGI,iBAAA,CAAA;EAAoB,MAAA;EAAQ;AAAA,GAAY,sBAAA,GAAsB,MAAA,CAAA,wBAAA,CAAA,MAAA,CAAA,aAAA,CAAA,SAAA;;;AAL9E;;iBAagB,oBAAA,CAAqB,MAAA,GAAS,SAAA,GAAY,SAAA"}
1
+ {"version":3,"file":"context.d.mts","names":[],"sources":["../../src/react/context.ts"],"mappings":";;;;;cAQa,gBAAA,EAAgB,OAAA,CAAA,OAAA,CAAA,SAAA;AAAA,UAEZ,sBAAA;EAChB,MAAA,EAAQ,SAAA;EACR,QAAA,GAAW,SAAA;AAAA;AAAA,iBAGI,iBAAA,CAAA;EAAoB,MAAA;EAAQ;AAAA,GAAY,sBAAA,GAAsB,OAAA,CAAA,wBAAA,CAAA,OAAA,CAAA,aAAA,CAAA,SAAA;;;AAL9E;;iBAagB,oBAAA,CAAqB,MAAA,GAAS,SAAA,GAAY,SAAA"}
@@ -1,5 +1,4 @@
1
1
  import { createContext, createElement, useContext } from "react";
2
-
3
2
  //#region src/react/context.ts
4
3
  const DevWalletContext = createContext(null);
5
4
  function DevWalletProvider({ wallet, children }) {
@@ -11,15 +10,11 @@ function DevWalletProvider({ wallet, children }) {
11
10
  */
12
11
  function useDevWalletInstance(wallet) {
13
12
  const contextValue = useContext(DevWalletContext);
14
- if (wallet) {
15
- return wallet;
16
- }
17
- if (!contextValue) {
18
- throw new Error("Could not find DevWalletContext. Ensure that you have set up the DevWalletProvider.");
19
- }
13
+ if (wallet) return wallet;
14
+ if (!contextValue) throw new Error("Could not find DevWalletContext. Ensure that you have set up the DevWalletProvider.");
20
15
  return contextValue;
21
16
  }
22
-
23
17
  //#endregion
24
18
  export { DevWalletContext, DevWalletProvider, useDevWalletInstance };
19
+
25
20
  //# sourceMappingURL=context.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.mjs","names":[],"sources":["../../src/react/context.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { createContext, createElement, useContext } from 'react';\nimport type { ReactNode } from 'react';\n\nimport type { DevWallet } from '../wallet/dev-wallet.js';\n\nexport const DevWalletContext = createContext<DevWallet | null>(null);\n\nexport interface DevWalletProviderProps {\n\twallet: DevWallet;\n\tchildren?: ReactNode;\n}\n\nexport function DevWalletProvider({ wallet, children }: DevWalletProviderProps) {\n\treturn createElement(DevWalletContext.Provider, { value: wallet }, children);\n}\n\n/**\n * @param wallet - If provided, context is bypassed.\n * @throws If no wallet is provided and no DevWalletProvider is in the tree.\n */\nexport function useDevWalletInstance(wallet?: DevWallet): DevWallet {\n\tconst contextValue = useContext(DevWalletContext);\n\n\tif (wallet) {\n\t\treturn wallet;\n\t}\n\n\tif (!contextValue) {\n\t\tthrow new Error(\n\t\t\t'Could not find DevWalletContext. Ensure that you have set up the DevWalletProvider.',\n\t\t);\n\t}\n\n\treturn contextValue;\n}\n"],"mappings":";;;AAQA,MAAa,mBAAmB,cAAgC,KAAK;AAOrE,SAAgB,kBAAkB,EAAE,QAAQ,YAAoC;AAC/E,QAAO,cAAc,iBAAiB,UAAU,EAAE,OAAO,QAAQ,EAAE,SAAS;;;;;;AAO7E,SAAgB,qBAAqB,QAA+B;CACnE,MAAM,eAAe,WAAW,iBAAiB;AAEjD,KAAI,QAAQ;AACX,SAAO;;AAGR,KAAI,CAAC,cAAc;AAClB,QAAM,IAAI,MACT,sFACA;;AAGF,QAAO"}
1
+ {"version":3,"file":"context.mjs","names":[],"sources":["../../src/react/context.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { createContext, createElement, useContext } from 'react';\nimport type { ReactNode } from 'react';\n\nimport type { DevWallet } from '../wallet/dev-wallet.js';\n\nexport const DevWalletContext = createContext<DevWallet | null>(null);\n\nexport interface DevWalletProviderProps {\n\twallet: DevWallet;\n\tchildren?: ReactNode;\n}\n\nexport function DevWalletProvider({ wallet, children }: DevWalletProviderProps) {\n\treturn createElement(DevWalletContext.Provider, { value: wallet }, children);\n}\n\n/**\n * @param wallet - If provided, context is bypassed.\n * @throws If no wallet is provided and no DevWalletProvider is in the tree.\n */\nexport function useDevWalletInstance(wallet?: DevWallet): DevWallet {\n\tconst contextValue = useContext(DevWalletContext);\n\n\tif (wallet) {\n\t\treturn wallet;\n\t}\n\n\tif (!contextValue) {\n\t\tthrow new Error(\n\t\t\t'Could not find DevWalletContext. Ensure that you have set up the DevWalletProvider.',\n\t\t);\n\t}\n\n\treturn contextValue;\n}\n"],"mappings":";;AAQA,MAAa,mBAAmB,cAAgC,KAAK;AAOrE,SAAgB,kBAAkB,EAAE,QAAQ,YAAoC;AAC/E,QAAO,cAAc,iBAAiB,UAAU,EAAE,OAAO,QAAQ,EAAE,SAAS;;;;;;AAO7E,SAAgB,qBAAqB,QAA+B;CACnE,MAAM,eAAe,WAAW,iBAAiB;AAEjD,KAAI,OACH,QAAO;AAGR,KAAI,CAAC,aACJ,OAAM,IAAI,MACT,sFACA;AAGF,QAAO"}