@mysten-incubation/dev-wallet 0.0.0 → 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.
- package/CHANGELOG.md +32 -0
- package/LICENSE +189 -0
- package/dist/_virtual/{_@oxc-project_runtime@0.107.0 → _@oxc-project_runtime@0.127.0}/helpers/decorate.mjs +2 -3
- package/dist/adapters/base-adapter.mjs +6 -7
- package/dist/adapters/base-adapter.mjs.map +1 -1
- package/dist/adapters/browser.d.mts +4 -1
- package/dist/adapters/browser.mjs +4 -2
- package/dist/adapters/build-managed-account.mjs +8 -10
- package/dist/adapters/build-managed-account.mjs.map +1 -1
- package/dist/adapters/devstack-adapter.d.mts +111 -0
- package/dist/adapters/devstack-adapter.d.mts.map +1 -0
- package/dist/adapters/devstack-adapter.mjs +224 -0
- package/dist/adapters/devstack-adapter.mjs.map +1 -0
- package/dist/adapters/devstack-paths.d.mts +12 -0
- package/dist/adapters/devstack-paths.d.mts.map +1 -0
- package/dist/adapters/devstack-paths.mjs +12 -0
- package/dist/adapters/devstack-paths.mjs.map +1 -0
- package/dist/adapters/fork-relay.d.mts +109 -0
- package/dist/adapters/fork-relay.d.mts.map +1 -0
- package/dist/adapters/fork-relay.mjs +208 -0
- package/dist/adapters/fork-relay.mjs.map +1 -0
- package/dist/adapters/idb-store.mjs +12 -16
- package/dist/adapters/idb-store.mjs.map +1 -1
- package/dist/adapters/in-memory-adapter.mjs +4 -10
- package/dist/adapters/in-memory-adapter.mjs.map +1 -1
- package/dist/adapters/passkey-adapter.mjs +4 -12
- package/dist/adapters/passkey-adapter.mjs.map +1 -1
- package/dist/adapters/remote-cli-adapter.mjs +37 -72
- package/dist/adapters/remote-cli-adapter.mjs.map +1 -1
- package/dist/adapters/webcrypto-adapter.mjs +2 -4
- package/dist/adapters/webcrypto-adapter.mjs.map +1 -1
- package/dist/bin/cli.mjs +9 -22
- package/dist/bin/cli.mjs.map +1 -1
- package/dist/client/dev-wallet-client.mjs +13 -28
- package/dist/client/dev-wallet-client.mjs.map +1 -1
- package/dist/client/index.mjs +1 -2
- package/dist/client/request-handler.mjs +36 -42
- package/dist/client/request-handler.mjs.map +1 -1
- package/dist/index.mjs +1 -2
- package/dist/react/components.d.mts +9 -9
- package/dist/react/components.d.mts.map +1 -1
- package/dist/react/components.mjs +2 -5
- package/dist/react/components.mjs.map +1 -1
- package/dist/react/context.d.mts +3 -3
- package/dist/react/context.d.mts.map +1 -1
- package/dist/react/context.mjs +3 -8
- package/dist/react/context.mjs.map +1 -1
- package/dist/react/index.mjs +1 -2
- package/dist/react/useDevWallet.d.mts +3 -0
- package/dist/react/useDevWallet.d.mts.map +1 -1
- package/dist/react/useDevWallet.mjs +9 -14
- package/dist/react/useDevWallet.mjs.map +1 -1
- package/dist/server/cli-signing-middleware.mjs +7 -20
- package/dist/server/cli-signing-middleware.mjs.map +1 -1
- package/dist/server/index.mjs +1 -2
- package/dist/standalone/assets/{in-memory-adapter-CBF4h2KD.js → in-memory-adapter-qRkNfj9O.js} +1 -1
- package/dist/standalone/assets/main-DDltQnzR.js +3954 -0
- package/dist/standalone/assets/{webcrypto-adapter-DysAubFb.js → webcrypto-adapter-FejcrL9x.js} +1 -1
- package/dist/standalone/index.html +11 -12
- package/dist/ui/copy-controller.mjs +3 -3
- package/dist/ui/copy-controller.mjs.map +1 -1
- package/dist/ui/dev-wallet-account-selector.d.mts +3 -4
- package/dist/ui/dev-wallet-account-selector.d.mts.map +1 -1
- package/dist/ui/dev-wallet-account-selector.mjs +48 -25
- package/dist/ui/dev-wallet-account-selector.mjs.map +1 -1
- package/dist/ui/dev-wallet-accounts.d.mts +9 -4
- package/dist/ui/dev-wallet-accounts.d.mts.map +1 -1
- package/dist/ui/dev-wallet-accounts.mjs +62 -140
- package/dist/ui/dev-wallet-accounts.mjs.map +1 -1
- package/dist/ui/dev-wallet-balances.d.mts +10 -3
- package/dist/ui/dev-wallet-balances.d.mts.map +1 -1
- package/dist/ui/dev-wallet-balances.mjs +241 -43
- package/dist/ui/dev-wallet-balances.mjs.map +1 -1
- package/dist/ui/dev-wallet-connect.d.mts +3 -3
- package/dist/ui/dev-wallet-connect.d.mts.map +1 -1
- package/dist/ui/dev-wallet-connect.mjs +24 -16
- package/dist/ui/dev-wallet-connect.mjs.map +1 -1
- package/dist/ui/dev-wallet-dropdown.d.mts +3 -3
- package/dist/ui/dev-wallet-dropdown.d.mts.map +1 -1
- package/dist/ui/dev-wallet-dropdown.mjs +37 -47
- package/dist/ui/dev-wallet-dropdown.mjs.map +1 -1
- package/dist/ui/dev-wallet-fork-panel.d.mts +43 -0
- package/dist/ui/dev-wallet-fork-panel.d.mts.map +1 -0
- package/dist/ui/dev-wallet-fork-panel.mjs +500 -0
- package/dist/ui/dev-wallet-fork-panel.mjs.map +1 -0
- package/dist/ui/dev-wallet-network-badge.d.mts +3 -4
- package/dist/ui/dev-wallet-network-badge.d.mts.map +1 -1
- package/dist/ui/dev-wallet-network-badge.mjs +52 -21
- package/dist/ui/dev-wallet-network-badge.mjs.map +1 -1
- package/dist/ui/dev-wallet-new-account.d.mts +3 -4
- package/dist/ui/dev-wallet-new-account.d.mts.map +1 -1
- package/dist/ui/dev-wallet-new-account.mjs +31 -105
- package/dist/ui/dev-wallet-new-account.mjs.map +1 -1
- package/dist/ui/dev-wallet-objects.d.mts +3 -3
- package/dist/ui/dev-wallet-objects.d.mts.map +1 -1
- package/dist/ui/dev-wallet-objects.mjs +76 -39
- package/dist/ui/dev-wallet-objects.mjs.map +1 -1
- package/dist/ui/dev-wallet-panel.d.mts +24 -4
- package/dist/ui/dev-wallet-panel.d.mts.map +1 -1
- package/dist/ui/dev-wallet-panel.mjs +247 -64
- package/dist/ui/dev-wallet-panel.mjs.map +1 -1
- package/dist/ui/dev-wallet-popup.d.mts +3 -5
- package/dist/ui/dev-wallet-popup.d.mts.map +1 -1
- package/dist/ui/dev-wallet-popup.mjs +19 -15
- package/dist/ui/dev-wallet-popup.mjs.map +1 -1
- package/dist/ui/dev-wallet-settings.d.mts +3 -4
- package/dist/ui/dev-wallet-settings.d.mts.map +1 -1
- package/dist/ui/dev-wallet-settings.mjs +149 -97
- package/dist/ui/dev-wallet-settings.mjs.map +1 -1
- package/dist/ui/dev-wallet-signing-modal.d.mts +11 -4
- package/dist/ui/dev-wallet-signing-modal.d.mts.map +1 -1
- package/dist/ui/dev-wallet-signing-modal.mjs +46 -18
- package/dist/ui/dev-wallet-signing-modal.mjs.map +1 -1
- package/dist/ui/dev-wallet-signing.d.mts +9 -3
- package/dist/ui/dev-wallet-signing.d.mts.map +1 -1
- package/dist/ui/dev-wallet-signing.mjs +119 -130
- package/dist/ui/dev-wallet-signing.mjs.map +1 -1
- package/dist/ui/dev-wallet-standalone.d.mts +8 -3
- package/dist/ui/dev-wallet-standalone.d.mts.map +1 -1
- package/dist/ui/dev-wallet-standalone.mjs +303 -38
- package/dist/ui/dev-wallet-standalone.mjs.map +1 -1
- package/dist/ui/dev-wallet-tab-bar.d.mts +13 -5
- package/dist/ui/dev-wallet-tab-bar.d.mts.map +1 -1
- package/dist/ui/dev-wallet-tab-bar.mjs +143 -82
- package/dist/ui/dev-wallet-tab-bar.mjs.map +1 -1
- package/dist/ui/index.d.mts +3 -2
- package/dist/ui/index.mjs +2 -2
- package/dist/ui/mount.d.mts +14 -1
- package/dist/ui/mount.d.mts.map +1 -1
- package/dist/ui/mount.mjs +5 -2
- package/dist/ui/mount.mjs.map +1 -1
- package/dist/ui/styles.mjs +428 -66
- package/dist/ui/styles.mjs.map +1 -1
- package/dist/ui/transaction-analyzer.mjs +19 -30
- package/dist/ui/transaction-analyzer.mjs.map +1 -1
- package/dist/ui/utils.d.mts +59 -0
- package/dist/ui/utils.d.mts.map +1 -0
- package/dist/ui/utils.mjs +42 -15
- package/dist/ui/utils.mjs.map +1 -1
- package/dist/ui/wallet-controller.mjs +89 -20
- package/dist/ui/wallet-controller.mjs.map +1 -1
- package/dist/wallet/constants.d.mts +9 -0
- package/dist/wallet/constants.d.mts.map +1 -0
- package/dist/wallet/constants.mjs +1 -1
- package/dist/wallet/dev-wallet.mjs +42 -99
- package/dist/wallet/dev-wallet.mjs.map +1 -1
- package/dist/wallet/initializer.d.mts +3 -0
- package/dist/wallet/initializer.d.mts.map +1 -1
- package/dist/wallet/initializer.mjs +9 -14
- package/dist/wallet/initializer.mjs.map +1 -1
- package/dist/wallet/signing.mjs +8 -21
- package/dist/wallet/signing.mjs.map +1 -1
- package/package.json +125 -123
- package/src/adapters/browser.ts +21 -0
- package/src/adapters/devstack-adapter.ts +342 -0
- package/src/adapters/devstack-paths.ts +16 -0
- package/src/adapters/fork-relay.ts +321 -0
- package/src/app/index.html +10 -11
- package/src/react/useDevWallet.ts +5 -1
- package/src/ui/dev-wallet-account-selector.ts +44 -17
- package/src/ui/dev-wallet-accounts.ts +87 -124
- package/src/ui/dev-wallet-balances.ts +248 -27
- package/src/ui/dev-wallet-connect.ts +19 -8
- package/src/ui/dev-wallet-dropdown.ts +7 -5
- package/src/ui/dev-wallet-fork-panel.ts +591 -0
- package/src/ui/dev-wallet-network-badge.ts +49 -10
- package/src/ui/dev-wallet-new-account.ts +21 -62
- package/src/ui/dev-wallet-objects.ts +59 -19
- package/src/ui/dev-wallet-panel.ts +261 -42
- package/src/ui/dev-wallet-popup.ts +12 -6
- package/src/ui/dev-wallet-settings.ts +159 -94
- package/src/ui/dev-wallet-signing-modal.ts +47 -7
- package/src/ui/dev-wallet-signing.ts +124 -97
- package/src/ui/dev-wallet-standalone.ts +310 -22
- package/src/ui/dev-wallet-tab-bar.ts +132 -70
- package/src/ui/index.ts +3 -0
- package/src/ui/mount.ts +23 -1
- package/src/ui/styles.ts +434 -58
- package/src/ui/utils.ts +66 -0
- package/src/ui/wallet-controller.ts +103 -5
- package/src/wallet/initializer.ts +7 -1
- 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
|
|
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
|
|
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
|
package/dist/bin/cli.mjs.map
CHANGED
|
@@ -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":"
|
|
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
|
|
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
|
-
|
|
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 ??
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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":";;;;;;;AAwBA,MAAM,sBAAsB;AAC5B,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;AAqBvB,SAAgB,2BAA2B,SAGzC;AACD,QAAO;EACN,IAAI;EACJ,aAAa;GACZ,MAAM,aAAa,gBAAgB,SAAS,QAAQ;AACpD,UAAO,EAAE,YAAY;;EAEtB;;AAGF,MAAM,kBAAkB;CACvB;CACA;CACA;CACA;;;;;AAkBD,IAAa,kBAAb,MAAa,gBAAkC;CAC9C,CAASA;CACT,CAASC;CACT,CAASC;CACT,CAASC;CACT,YAAqC,EAAE;CACvC;CAEA,YAAY,SAAkC;AAC7C,QAAKH,OAAQ,SAAS,QAAQ;AAC9B,QAAKC,OAAQ,SAAS,QAAQ;AAC9B,QAAKC,SAAU,SAAS,UAAU;AAClC,QAAKC,aAAc,sBAAsB,MAAKD;AAC9C,QAAKE,SAAU,MAAM;AACrB,QAAKC,mBAAoB;;CAG1B,OAAO,SAAS,SAA8C;EAC7D,MAAM,SAAS,IAAI,gBAAgB,QAAQ;EAC3C,MAAM,UAAU,YAAY;AAC5B,SAAO,QAAQ,SAAS,OAAO;;CAGhC,IAAI,UAAU;AACb,SAAO;;CAGR,IAAI,OAAO;AACV,SAAO,MAAKL;;CAGb,IAAI,OAAO;AACV,SAAO,MAAKC;;CAGb,IAAI,SAAS;AACZ,SAAO;;CAGR,IAAI,WAA6C;AAChD,SAAO,MAAKK;;CAGb,IAAI,WAGS;AACZ,SAAO;GACN,oBAAoB;IACnB,SAAS;IACT,SAAS,MAAKC;IACd;GACD,mBAAmB;IAClB,SAAS;IACT,IAAI,MAAKC;IACT;GACD,uBAAuB;IACtB,SAAS;IACT,YAAY,MAAKC;IACjB;GACD,2BAA2B;IAC1B,SAAS;IACT,qBAAqB,MAAKC;IAC1B;GACD,uBAAuB;IACtB,SAAS;IACT,iBAAiB,MAAKC;IACtB;GACD,iCAAiC;IAChC,SAAS;IACT,2BAA2B,MAAKC;IAChC;GACD;;CAGF,OAA+B,OAAO,aAAa;AAClD,QAAKR,OAAQ,GAAG,OAAO,SAAS;AAChC,eAAa,MAAKA,OAAQ,IAAI,OAAO,SAAS;;CAG/C,WAAkC,YAAY;EAC7C,MAAM,UAAU,MAAKS,eAAgB;EACrC,MAAM,WAAW,MAAM,QAAQ,KAAK,EAAE,MAAM,WAAW,CAAC;AAExD,QAAKC,WAAY,SAAS,QAAQ;AAClC,QAAKC,uBAAwB,SAAS,QAAQ;AAE9C,SAAO,EAAE,UAAU,KAAK,UAAU;;CAGnC,cAAwC,YAAY;AACnD,QAAKC,cAAe;AACpB,QAAKV,WAAY,EAAE;AACnB,QAAKF,OAAQ,KAAK,UAAU,EAAE,UAAU,MAAKE,UAAW,CAAC;;CAG1D,uBAAqD,OAAO,UAAU;EACrE,MAAM,UAAU,MAAKO,eAAgB;EACrC,MAAM,WAAW,MAAM,QAAQ,KAAK;GACnC,MAAM;GACN,SAAS,SAAS,MAAM,QAAQ;GAChC,SAAS,MAAM,QAAQ;GACvB,OAAO,MAAM,SAAS,MAAM,QAAQ,OAAO,MAAM;GACjD,SAAS,MAAKI,YAAa;GAC3B,CAAC;AAEF,SAAO;GAAE,OAAO,SAAS;GAAO,WAAW,SAAS;GAAW;;CAGhE,mBAA6C,OAAO,UAAU;EAC7D,MAAM,SAAS,MAAM,MAAM,YAAY,QAAQ;EAC/C,MAAM,UAAU,MAAKJ,eAAgB;EACrC,MAAM,WAAW,MAAM,QAAQ,KAAK;GACnC,MAAM;GACN,aAAa;GACb,SAAS,MAAM,QAAQ;GACvB,OAAO,MAAM;GACb,SAAS,MAAKI,YAAa;GAC3B,CAAC;AAEF,SAAO;GAAE,OAAO,SAAS;GAAO,WAAW,SAAS;GAAW;;CAGhE,6BAAiE,OAAO,UAAU;EACjF,MAAM,SAAS,MAAM,MAAM,YAAY,QAAQ;EAC/C,MAAM,UAAU,MAAKJ,eAAgB;EACrC,MAAM,WAAW,MAAM,QAAQ,KAAK;GACnC,MAAM;GACN,aAAa;GACb,SAAS,MAAM,QAAQ;GACvB,OAAO,MAAM;GACb,SAAS,MAAKI,YAAa;GAC3B,CAAC;AAEF,SAAO;GACN,OAAO,SAAS;GAChB,WAAW,SAAS;GACpB,QAAQ,SAAS;GACjB,SAAS,SAAS;GAClB;;CAGF,iBAAyC;AACxC,SAAO,IAAI,uBAAuB;GACjC,SAAS,MAAKjB;GACd,YAAY,MAAKE;GACjB,CAAC;;CAGH,cAAsB;AACrB,MAAI,OAAO,iBAAiB,aAAa;AACxC,SAAM,IAAI,MAAM,2CAA2C;;EAE5D,MAAM,UAAU,aAAa,QAAQ,MAAKC,WAAY;AACtD,MAAI,CAAC,SAAS;AACb,SAAM,IAAI,MAAM,2CAA2C;;AAE5D,SAAO;;CAGR,YAAY,SAAuB;AAClC,MAAI,OAAO,iBAAiB,aAAa;AACxC,gBAAa,QAAQ,MAAKA,YAAa,QAAQ;;;CAIjD,gBAAsB;AACrB,MAAI,OAAO,iBAAiB,aAAa;AACxC,gBAAa,WAAW,MAAKA,WAAY;;;CAI3C,wBAAwB,SAAuB;EAC9C,MAAM,UAAU,iBAAiB,QAAQ;AACzC,QAAKG,WAAY,QAAQ,QAAQ,SAAS,KACxC,YACA,IAAI,sBAAsB;GACzB,SAAS,QAAQ;GACjB,WAAW,QAAQ,YAAY,WAAW,QAAQ,UAAU,GAAG,IAAI,WAAW,EAAE;GAChF,QAAQ,CAAC,GAAG,WAAW;GACvB,UAAU,CAAC,GAAG,gBAAgB;GAC9B,OAAO,QAAQ;GACf,CAAC,CACH;AACD,QAAKF,OAAQ,KAAK,UAAU,EAAE,UAAU,MAAKE,UAAW,CAAC;;CAG1D,qBAA2B;AAC1B,MAAI,OAAO,iBAAiB,YAAa;EACzC,MAAM,UAAU,aAAa,QAAQ,MAAKH,WAAY;AACtD,MAAI,CAAC,QAAS;AAEd,MAAI;AACH,SAAKY,uBAAwB,QAAQ;UAC9B;AACP,SAAKC,cAAe"}
|
|
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":";;;;;;AAwBA,MAAM,sBAAsB;AAC5B,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;AAqBvB,SAAgB,2BAA2B,SAGzC;AACD,QAAO;EACN,IAAI;EACJ,aAAa;AAEZ,UAAO,EAAE,YADU,gBAAgB,SAAS,QACnC,EAAY;;EAEtB;;AAGF,MAAM,kBAAkB;CACvB;CACA;CACA;CACA;;;;;AAkBD,IAAa,kBAAb,MAAa,gBAAkC;CAC9C;CACA;CACA;CACA;CACA,YAAqC,EAAE;CACvC;CAEA,YAAY,SAAkC;AAC7C,QAAA,OAAa,SAAS,QAAQ;AAC9B,QAAA,OAAa,SAAS,QAAA;AACtB,QAAA,SAAe,SAAS,UAAU;AAClC,QAAA,aAAmB,sBAAsB,MAAA;AACzC,QAAA,SAAe,MAAM;AACrB,QAAA,mBAAyB;;CAG1B,OAAO,SAAS,SAA8C;EAC7D,MAAM,SAAS,IAAI,gBAAgB,QAAQ;AAE3C,SADgB,YACT,CAAQ,SAAS,OAAO;;CAGhC,IAAI,UAAU;AACb,SAAO;;CAGR,IAAI,OAAO;AACV,SAAO,MAAA;;CAGR,IAAI,OAAO;AACV,SAAO,MAAA;;CAGR,IAAI,SAAS;AACZ,SAAO;;CAGR,IAAI,WAA6C;AAChD,SAAO,MAAA;;CAGR,IAAI,WAGS;AACZ,SAAO;GACN,oBAAoB;IACnB,SAAS;IACT,SAAS,MAAA;IACT;GACD,mBAAmB;IAClB,SAAS;IACT,IAAI,MAAA;IACJ;GACD,uBAAuB;IACtB,SAAS;IACT,YAAY,MAAA;IACZ;GACD,2BAA2B;IAC1B,SAAS;IACT,qBAAqB,MAAA;IACrB;GACD,uBAAuB;IACtB,SAAS;IACT,iBAAiB,MAAA;IACjB;GACD,iCAAiC;IAChC,SAAS;IACT,2BAA2B,MAAA;IAC3B;GACD;;CAGF,OAA+B,OAAO,aAAa;AAClD,QAAA,OAAa,GAAG,OAAO,SAAS;AAChC,eAAa,MAAA,OAAa,IAAI,OAAO,SAAS;;CAG/C,WAAkC,YAAY;EAE7C,MAAM,WAAW,MADD,MAAA,eACO,CAAQ,KAAK,EAAE,MAAM,WAAW,CAAC;AAExD,QAAA,WAAiB,SAAS,QAAQ;AAClC,QAAA,uBAA6B,SAAS,QAAQ;AAE9C,SAAO,EAAE,UAAU,KAAK,UAAU;;CAGnC,cAAwC,YAAY;AACnD,QAAA,cAAoB;AACpB,QAAA,WAAiB,EAAE;AACnB,QAAA,OAAa,KAAK,UAAU,EAAE,UAAU,MAAA,UAAgB,CAAC;;CAG1D,uBAAqD,OAAO,UAAU;EAErE,MAAM,WAAW,MADD,MAAA,eACO,CAAQ,KAAK;GACnC,MAAM;GACN,SAAS,SAAS,MAAM,QAAQ;GAChC,SAAS,MAAM,QAAQ;GACvB,OAAO,MAAM,SAAS,MAAM,QAAQ,OAAO,MAAM;GACjD,SAAS,MAAA,YAAkB;GAC3B,CAAC;AAEF,SAAO;GAAE,OAAO,SAAS;GAAO,WAAW,SAAS;GAAW;;CAGhE,mBAA6C,OAAO,UAAU;EAC7D,MAAM,SAAS,MAAM,MAAM,YAAY,QAAQ;EAE/C,MAAM,WAAW,MADD,MAAA,eACO,CAAQ,KAAK;GACnC,MAAM;GACN,aAAa;GACb,SAAS,MAAM,QAAQ;GACvB,OAAO,MAAM;GACb,SAAS,MAAA,YAAkB;GAC3B,CAAC;AAEF,SAAO;GAAE,OAAO,SAAS;GAAO,WAAW,SAAS;GAAW;;CAGhE,6BAAiE,OAAO,UAAU;EACjF,MAAM,SAAS,MAAM,MAAM,YAAY,QAAQ;EAE/C,MAAM,WAAW,MADD,MAAA,eACO,CAAQ,KAAK;GACnC,MAAM;GACN,aAAa;GACb,SAAS,MAAM,QAAQ;GACvB,OAAO,MAAM;GACb,SAAS,MAAA,YAAkB;GAC3B,CAAC;AAEF,SAAO;GACN,OAAO,SAAS;GAChB,WAAW,SAAS;GACpB,QAAQ,SAAS;GACjB,SAAS,SAAS;GAClB;;CAGF,iBAAyC;AACxC,SAAO,IAAI,uBAAuB;GACjC,SAAS,MAAA;GACT,YAAY,MAAA;GACZ,CAAC;;CAGH,cAAsB;AACrB,MAAI,OAAO,iBAAiB,YAC3B,OAAM,IAAI,MAAM,2CAA2C;EAE5D,MAAM,UAAU,aAAa,QAAQ,MAAA,WAAiB;AACtD,MAAI,CAAC,QACJ,OAAM,IAAI,MAAM,2CAA2C;AAE5D,SAAO;;CAGR,YAAY,SAAuB;AAClC,MAAI,OAAO,iBAAiB,YAC3B,cAAa,QAAQ,MAAA,YAAkB,QAAQ;;CAIjD,gBAAsB;AACrB,MAAI,OAAO,iBAAiB,YAC3B,cAAa,WAAW,MAAA,WAAiB;;CAI3C,wBAAwB,SAAuB;EAC9C,MAAM,UAAU,iBAAiB,QAAQ;AACzC,QAAA,WAAiB,QAAQ,QAAQ,SAAS,KACxC,YACA,IAAI,sBAAsB;GACzB,SAAS,QAAQ;GACjB,WAAW,QAAQ,YAAY,WAAW,QAAQ,UAAU,GAAG,IAAI,WAAW,EAAE;GAChF,QAAQ,CAAC,GAAG,WAAW;GACvB,UAAU,CAAC,GAAG,gBAAgB;GAC9B,OAAO,QAAQ;GACf,CAAC,CACH;AACD,QAAA,OAAa,KAAK,UAAU,EAAE,UAAU,MAAA,UAAgB,CAAC;;CAG1D,qBAA2B;AAC1B,MAAI,OAAO,iBAAiB,YAAa;EACzC,MAAM,UAAU,aAAa,QAAQ,MAAA,WAAiB;AACtD,MAAI,CAAC,QAAS;AAEd,MAAI;AACH,SAAA,uBAA6B,QAAQ;UAC9B;AACP,SAAA,cAAoB"}
|
package/dist/client/index.mjs
CHANGED
|
@@ -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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
type: "
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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) :
|
|
82
|
-
const client = network ? options.getClient?.(network) :
|
|
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":"
|
|
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,
|
|
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":"
|
|
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"}
|
package/dist/react/context.d.mts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { DevWallet } from "../wallet/dev-wallet.mjs";
|
|
2
|
-
import * as
|
|
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:
|
|
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):
|
|
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,
|
|
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"}
|
package/dist/react/context.mjs
CHANGED
|
@@ -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
|
-
|
|
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":"
|
|
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"}
|