@mysten-incubation/dev-wallet 0.0.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/README.md +250 -0
- package/dist/_virtual/_@oxc-project_runtime@0.107.0/helpers/decorate.mjs +10 -0
- package/dist/adapters/base-adapter.d.mts +33 -0
- package/dist/adapters/base-adapter.d.mts.map +1 -0
- package/dist/adapters/base-adapter.mjs +77 -0
- package/dist/adapters/base-adapter.mjs.map +1 -0
- package/dist/adapters/browser.d.mts +8 -0
- package/dist/adapters/browser.mjs +8 -0
- package/dist/adapters/build-managed-account.d.mts +12 -0
- package/dist/adapters/build-managed-account.d.mts.map +1 -0
- package/dist/adapters/build-managed-account.mjs +30 -0
- package/dist/adapters/build-managed-account.mjs.map +1 -0
- package/dist/adapters/idb-store.mjs +73 -0
- package/dist/adapters/idb-store.mjs.map +1 -0
- package/dist/adapters/in-memory-adapter.d.mts +16 -0
- package/dist/adapters/in-memory-adapter.d.mts.map +1 -0
- package/dist/adapters/in-memory-adapter.mjs +44 -0
- package/dist/adapters/in-memory-adapter.mjs.map +1 -0
- package/dist/adapters/passkey-adapter.d.mts +31 -0
- package/dist/adapters/passkey-adapter.d.mts.map +1 -0
- package/dist/adapters/passkey-adapter.mjs +87 -0
- package/dist/adapters/passkey-adapter.mjs.map +1 -0
- package/dist/adapters/remote-cli-adapter.d.mts +65 -0
- package/dist/adapters/remote-cli-adapter.d.mts.map +1 -0
- package/dist/adapters/remote-cli-adapter.mjs +299 -0
- package/dist/adapters/remote-cli-adapter.mjs.map +1 -0
- package/dist/adapters/webcrypto-adapter.d.mts +20 -0
- package/dist/adapters/webcrypto-adapter.d.mts.map +1 -0
- package/dist/adapters/webcrypto-adapter.mjs +68 -0
- package/dist/adapters/webcrypto-adapter.mjs.map +1 -0
- package/dist/bin/cli.d.mts +1 -0
- package/dist/bin/cli.mjs +183 -0
- package/dist/bin/cli.mjs.map +1 -0
- package/dist/client/dev-wallet-client.d.mts +57 -0
- package/dist/client/dev-wallet-client.d.mts.map +1 -0
- package/dist/client/dev-wallet-client.mjs +223 -0
- package/dist/client/dev-wallet-client.mjs.map +1 -0
- package/dist/client/index.d.mts +3 -0
- package/dist/client/index.mjs +4 -0
- package/dist/client/request-handler.d.mts +42 -0
- package/dist/client/request-handler.d.mts.map +1 -0
- package/dist/client/request-handler.mjs +115 -0
- package/dist/client/request-handler.mjs.map +1 -0
- package/dist/index.d.mts +5 -0
- package/dist/index.mjs +4 -0
- package/dist/react/components.d.mts +32 -0
- package/dist/react/components.d.mts.map +1 -0
- package/dist/react/components.mjs +53 -0
- package/dist/react/components.mjs.map +1 -0
- package/dist/react/context.d.mts +22 -0
- package/dist/react/context.d.mts.map +1 -0
- package/dist/react/context.mjs +25 -0
- package/dist/react/context.mjs.map +1 -0
- package/dist/react/index.d.mts +4 -0
- package/dist/react/index.mjs +5 -0
- package/dist/react/useDevWallet.d.mts +38 -0
- package/dist/react/useDevWallet.d.mts.map +1 -0
- package/dist/react/useDevWallet.mjs +89 -0
- package/dist/react/useDevWallet.mjs.map +1 -0
- package/dist/server/cli-signing-middleware.d.mts +22 -0
- package/dist/server/cli-signing-middleware.d.mts.map +1 -0
- package/dist/server/cli-signing-middleware.mjs +117 -0
- package/dist/server/cli-signing-middleware.mjs.map +1 -0
- package/dist/server/index.d.mts +2 -0
- package/dist/server/index.mjs +3 -0
- package/dist/standalone/assets/in-memory-adapter-CBF4h2KD.js +1 -0
- package/dist/standalone/assets/main-VE4olb-Q.js +2841 -0
- package/dist/standalone/assets/webcrypto-adapter-DysAubFb.js +1 -0
- package/dist/standalone/bookmarklet.js +5 -0
- package/dist/standalone/index.html +48 -0
- package/dist/types.d.mts +55 -0
- package/dist/types.d.mts.map +1 -0
- package/dist/ui/copy-controller.mjs +43 -0
- package/dist/ui/copy-controller.mjs.map +1 -0
- package/dist/ui/dev-wallet-account-selector.d.mts +24 -0
- package/dist/ui/dev-wallet-account-selector.d.mts.map +1 -0
- package/dist/ui/dev-wallet-account-selector.mjs +268 -0
- package/dist/ui/dev-wallet-account-selector.mjs.map +1 -0
- package/dist/ui/dev-wallet-accounts.d.mts +29 -0
- package/dist/ui/dev-wallet-accounts.d.mts.map +1 -0
- package/dist/ui/dev-wallet-accounts.mjs +524 -0
- package/dist/ui/dev-wallet-accounts.mjs.map +1 -0
- package/dist/ui/dev-wallet-balances.d.mts +26 -0
- package/dist/ui/dev-wallet-balances.d.mts.map +1 -0
- package/dist/ui/dev-wallet-balances.mjs +130 -0
- package/dist/ui/dev-wallet-balances.mjs.map +1 -0
- package/dist/ui/dev-wallet-connect.d.mts +31 -0
- package/dist/ui/dev-wallet-connect.d.mts.map +1 -0
- package/dist/ui/dev-wallet-connect.mjs +225 -0
- package/dist/ui/dev-wallet-connect.mjs.map +1 -0
- package/dist/ui/dev-wallet-dropdown.d.mts +27 -0
- package/dist/ui/dev-wallet-dropdown.d.mts.map +1 -0
- package/dist/ui/dev-wallet-dropdown.mjs +121 -0
- package/dist/ui/dev-wallet-dropdown.mjs.map +1 -0
- package/dist/ui/dev-wallet-network-badge.d.mts +21 -0
- package/dist/ui/dev-wallet-network-badge.d.mts.map +1 -0
- package/dist/ui/dev-wallet-network-badge.mjs +121 -0
- package/dist/ui/dev-wallet-network-badge.mjs.map +1 -0
- package/dist/ui/dev-wallet-new-account.d.mts +31 -0
- package/dist/ui/dev-wallet-new-account.d.mts.map +1 -0
- package/dist/ui/dev-wallet-new-account.mjs +577 -0
- package/dist/ui/dev-wallet-new-account.mjs.map +1 -0
- package/dist/ui/dev-wallet-objects.d.mts +26 -0
- package/dist/ui/dev-wallet-objects.d.mts.map +1 -0
- package/dist/ui/dev-wallet-objects.mjs +276 -0
- package/dist/ui/dev-wallet-objects.mjs.map +1 -0
- package/dist/ui/dev-wallet-panel.d.mts +22 -0
- package/dist/ui/dev-wallet-panel.d.mts.map +1 -0
- package/dist/ui/dev-wallet-panel.mjs +192 -0
- package/dist/ui/dev-wallet-panel.mjs.map +1 -0
- package/dist/ui/dev-wallet-popup.d.mts +36 -0
- package/dist/ui/dev-wallet-popup.d.mts.map +1 -0
- package/dist/ui/dev-wallet-popup.mjs +137 -0
- package/dist/ui/dev-wallet-popup.mjs.map +1 -0
- package/dist/ui/dev-wallet-settings.d.mts +33 -0
- package/dist/ui/dev-wallet-settings.d.mts.map +1 -0
- package/dist/ui/dev-wallet-settings.mjs +635 -0
- package/dist/ui/dev-wallet-settings.mjs.map +1 -0
- package/dist/ui/dev-wallet-signing-modal.d.mts +32 -0
- package/dist/ui/dev-wallet-signing-modal.d.mts.map +1 -0
- package/dist/ui/dev-wallet-signing-modal.mjs +115 -0
- package/dist/ui/dev-wallet-signing-modal.mjs.map +1 -0
- package/dist/ui/dev-wallet-signing.d.mts +25 -0
- package/dist/ui/dev-wallet-signing.d.mts.map +1 -0
- package/dist/ui/dev-wallet-signing.mjs +544 -0
- package/dist/ui/dev-wallet-signing.mjs.map +1 -0
- package/dist/ui/dev-wallet-standalone.d.mts +23 -0
- package/dist/ui/dev-wallet-standalone.d.mts.map +1 -0
- package/dist/ui/dev-wallet-standalone.mjs +129 -0
- package/dist/ui/dev-wallet-standalone.mjs.map +1 -0
- package/dist/ui/dev-wallet-tab-bar.d.mts +19 -0
- package/dist/ui/dev-wallet-tab-bar.d.mts.map +1 -0
- package/dist/ui/dev-wallet-tab-bar.mjs +143 -0
- package/dist/ui/dev-wallet-tab-bar.mjs.map +1 -0
- package/dist/ui/index.d.mts +17 -0
- package/dist/ui/index.mjs +18 -0
- package/dist/ui/mount.d.mts +11 -0
- package/dist/ui/mount.d.mts.map +1 -0
- package/dist/ui/mount.mjs +17 -0
- package/dist/ui/mount.mjs.map +1 -0
- package/dist/ui/styles.mjs +250 -0
- package/dist/ui/styles.mjs.map +1 -0
- package/dist/ui/transaction-analyzer.mjs +58 -0
- package/dist/ui/transaction-analyzer.mjs.map +1 -0
- package/dist/ui/utils.mjs +98 -0
- package/dist/ui/utils.mjs.map +1 -0
- package/dist/ui/wallet-controller.mjs +275 -0
- package/dist/ui/wallet-controller.mjs.map +1 -0
- package/dist/wallet/constants.mjs +11 -0
- package/dist/wallet/constants.mjs.map +1 -0
- package/dist/wallet/dev-wallet.d.mts +118 -0
- package/dist/wallet/dev-wallet.d.mts.map +1 -0
- package/dist/wallet/dev-wallet.mjs +424 -0
- package/dist/wallet/dev-wallet.mjs.map +1 -0
- package/dist/wallet/initializer.d.mts +63 -0
- package/dist/wallet/initializer.d.mts.map +1 -0
- package/dist/wallet/initializer.mjs +75 -0
- package/dist/wallet/initializer.mjs.map +1 -0
- package/dist/wallet/signing.d.mts +35 -0
- package/dist/wallet/signing.d.mts.map +1 -0
- package/dist/wallet/signing.mjs +69 -0
- package/dist/wallet/signing.mjs.map +1 -0
- package/package.json +124 -0
- package/src/adapters/base-adapter.ts +93 -0
- package/src/adapters/browser.ts +15 -0
- package/src/adapters/build-managed-account.ts +33 -0
- package/src/adapters/idb-store.ts +87 -0
- package/src/adapters/in-memory-adapter.ts +51 -0
- package/src/adapters/passkey-adapter.ts +120 -0
- package/src/adapters/remote-cli-adapter.ts +388 -0
- package/src/adapters/webcrypto-adapter.ts +96 -0
- package/src/app/bookmarklet-entry.ts +77 -0
- package/src/app/index.html +48 -0
- package/src/app/main.ts +245 -0
- package/src/app/tsconfig.json +3 -0
- package/src/bin/cli.ts +214 -0
- package/src/client/dev-wallet-client.ts +280 -0
- package/src/client/index.ts +7 -0
- package/src/client/request-handler.ts +161 -0
- package/src/index.ts +19 -0
- package/src/react/components.ts +64 -0
- package/src/react/context.ts +38 -0
- package/src/react/index.ts +16 -0
- package/src/react/useDevWallet.ts +118 -0
- package/src/server/cli-signing-middleware.ts +146 -0
- package/src/server/index.ts +8 -0
- package/src/types.ts +58 -0
- package/src/ui/copy-controller.ts +49 -0
- package/src/ui/dev-wallet-account-selector.ts +283 -0
- package/src/ui/dev-wallet-accounts.ts +578 -0
- package/src/ui/dev-wallet-balances.ts +171 -0
- package/src/ui/dev-wallet-connect.ts +259 -0
- package/src/ui/dev-wallet-dropdown.ts +138 -0
- package/src/ui/dev-wallet-network-badge.ts +128 -0
- package/src/ui/dev-wallet-new-account.ts +662 -0
- package/src/ui/dev-wallet-objects.ts +336 -0
- package/src/ui/dev-wallet-panel.ts +207 -0
- package/src/ui/dev-wallet-popup.ts +169 -0
- package/src/ui/dev-wallet-settings.ts +692 -0
- package/src/ui/dev-wallet-signing-modal.ts +137 -0
- package/src/ui/dev-wallet-signing.ts +624 -0
- package/src/ui/dev-wallet-standalone.ts +136 -0
- package/src/ui/dev-wallet-tab-bar.ts +151 -0
- package/src/ui/index.ts +26 -0
- package/src/ui/mount.ts +21 -0
- package/src/ui/styles.ts +252 -0
- package/src/ui/transaction-analyzer.ts +60 -0
- package/src/ui/utils.ts +118 -0
- package/src/ui/wallet-controller.ts +340 -0
- package/src/wallet/constants.ts +17 -0
- package/src/wallet/dev-wallet.ts +597 -0
- package/src/wallet/initializer.ts +124 -0
- package/src/wallet/signing.ts +85 -0
package/dist/bin/cli.mjs
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { execFile } from "node:child_process";
|
|
3
|
+
import { parseArgs, promisify } from "node:util";
|
|
4
|
+
import { Hono } from "hono";
|
|
5
|
+
import { existsSync } from "node:fs";
|
|
6
|
+
import { readFile } from "node:fs/promises";
|
|
7
|
+
import { dirname, resolve } from "node:path";
|
|
8
|
+
import { serve } from "@hono/node-server";
|
|
9
|
+
import { cors } from "hono/cors";
|
|
10
|
+
|
|
11
|
+
//#region src/bin/cli.ts
|
|
12
|
+
const execFileAsync = promisify(execFile);
|
|
13
|
+
const MIME_TYPES = {
|
|
14
|
+
".html": "text/html; charset=utf-8",
|
|
15
|
+
".js": "application/javascript",
|
|
16
|
+
".mjs": "application/javascript",
|
|
17
|
+
".css": "text/css",
|
|
18
|
+
".json": "application/json",
|
|
19
|
+
".svg": "image/svg+xml",
|
|
20
|
+
".png": "image/png",
|
|
21
|
+
".ico": "image/x-icon",
|
|
22
|
+
".woff": "font/woff",
|
|
23
|
+
".woff2": "font/woff2"
|
|
24
|
+
};
|
|
25
|
+
function findStandaloneDir(startDir) {
|
|
26
|
+
let dir = startDir;
|
|
27
|
+
for (let i = 0; i < 5; i++) {
|
|
28
|
+
const candidate = resolve(dir, "standalone");
|
|
29
|
+
if (existsSync(resolve(candidate, "index.html"))) return candidate;
|
|
30
|
+
const parent = dirname(dir);
|
|
31
|
+
if (parent === dir) break;
|
|
32
|
+
dir = parent;
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
function formatStartupMessage(options) {
|
|
37
|
+
const { walletUrl, baseUrl, adapters, hasSuiCli, bookmarkletCode } = options;
|
|
38
|
+
return `
|
|
39
|
+
Dev Wallet running at ${walletUrl}
|
|
40
|
+
Adapters: ${adapters.join(", ")}${!hasSuiCli ? "\n (Install sui CLI to enable CLI signing)" : ""}
|
|
41
|
+
|
|
42
|
+
To connect from your dApp:
|
|
43
|
+
|
|
44
|
+
import { DevWalletClient } from '@mysten-incubation/dev-wallet/client';
|
|
45
|
+
DevWalletClient.register({ origin: '${baseUrl}' });
|
|
46
|
+
|
|
47
|
+
Or use the bookmarklet — drag from the Settings tab, or copy:
|
|
48
|
+
|
|
49
|
+
${bookmarkletCode}
|
|
50
|
+
|
|
51
|
+
Or paste in the browser console:
|
|
52
|
+
|
|
53
|
+
var s=document.createElement('script');s.src='${baseUrl}/bookmarklet.js';document.head.appendChild(s);
|
|
54
|
+
|
|
55
|
+
Press Ctrl+C to stop.
|
|
56
|
+
`;
|
|
57
|
+
}
|
|
58
|
+
async function main() {
|
|
59
|
+
const { values } = parseArgs({
|
|
60
|
+
options: {
|
|
61
|
+
port: {
|
|
62
|
+
type: "string",
|
|
63
|
+
default: "5174"
|
|
64
|
+
},
|
|
65
|
+
help: {
|
|
66
|
+
type: "boolean",
|
|
67
|
+
short: "h"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
allowPositionals: true
|
|
71
|
+
});
|
|
72
|
+
if (values.help) {
|
|
73
|
+
console.log(`
|
|
74
|
+
Usage: dev-wallet serve [options]
|
|
75
|
+
|
|
76
|
+
Start a dev wallet web app for dApp signing.
|
|
77
|
+
|
|
78
|
+
Options:
|
|
79
|
+
--port <number> Port to serve on (default: 5174)
|
|
80
|
+
-h, --help Show this help message
|
|
81
|
+
|
|
82
|
+
The wallet automatically detects available adapters:
|
|
83
|
+
- In-Memory (Ed25519) — always available
|
|
84
|
+
- WebCrypto (Passkey) — available in browsers with IndexedDB
|
|
85
|
+
- CLI Signer — available when the sui CLI is on your PATH
|
|
86
|
+
`);
|
|
87
|
+
process.exit(0);
|
|
88
|
+
}
|
|
89
|
+
const port = Number(values.port ?? "5174");
|
|
90
|
+
if (!Number.isInteger(port) || port < 1 || port > 65535) {
|
|
91
|
+
console.error("Error: --port must be an integer between 1 and 65535");
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
let hasSuiCli = false;
|
|
95
|
+
try {
|
|
96
|
+
await execFileAsync("sui", ["--version"]);
|
|
97
|
+
hasSuiCli = true;
|
|
98
|
+
} catch {}
|
|
99
|
+
const scriptDir = dirname(new URL(import.meta.url).pathname);
|
|
100
|
+
const standaloneDir = findStandaloneDir(scriptDir);
|
|
101
|
+
if (!standaloneDir) {
|
|
102
|
+
console.error("Standalone wallet app not found.\nRun `pnpm turbo build --filter=@mysten-incubation/dev-wallet` first.");
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
let indexHtml = await readFile(resolve(standaloneDir, "index.html"), "utf-8");
|
|
106
|
+
if (hasSuiCli) {
|
|
107
|
+
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
|
+
}
|
|
111
|
+
}
|
|
112
|
+
let bookmarkletJs = null;
|
|
113
|
+
try {
|
|
114
|
+
bookmarkletJs = await readFile(resolve(standaloneDir, "bookmarklet.js"), "utf-8");
|
|
115
|
+
} catch {}
|
|
116
|
+
const app = new Hono();
|
|
117
|
+
let cliToken = null;
|
|
118
|
+
if (hasSuiCli) {
|
|
119
|
+
const { createCliSigningMiddleware } = await import("../server/cli-signing-middleware.mjs");
|
|
120
|
+
const result = createCliSigningMiddleware({ port });
|
|
121
|
+
cliToken = result.token;
|
|
122
|
+
app.route("/", result.app);
|
|
123
|
+
}
|
|
124
|
+
app.get("/bookmarklet.js", cors({ origin: "*" }), (c) => {
|
|
125
|
+
if (!bookmarkletJs) {
|
|
126
|
+
return c.text("Bookmarklet not found", 404);
|
|
127
|
+
}
|
|
128
|
+
c.header("Cache-Control", "no-cache");
|
|
129
|
+
return c.body(bookmarkletJs, { headers: { "Content-Type": "application/javascript" } });
|
|
130
|
+
});
|
|
131
|
+
app.get("*", async (c) => {
|
|
132
|
+
const urlPath = decodeURIComponent(new URL(c.req.url).pathname);
|
|
133
|
+
if (urlPath === "/" || urlPath === "/index.html") {
|
|
134
|
+
return c.html(indexHtml);
|
|
135
|
+
}
|
|
136
|
+
const filePath = resolve(standaloneDir, urlPath.slice(1));
|
|
137
|
+
if (!filePath.startsWith(standaloneDir)) {
|
|
138
|
+
return c.html(indexHtml);
|
|
139
|
+
}
|
|
140
|
+
try {
|
|
141
|
+
const content = await readFile(filePath);
|
|
142
|
+
const ext = filePath.slice(filePath.lastIndexOf("."));
|
|
143
|
+
const contentType = MIME_TYPES[ext] || "application/octet-stream";
|
|
144
|
+
return c.body(content, { headers: { "Content-Type": contentType } });
|
|
145
|
+
} catch {
|
|
146
|
+
return c.html(indexHtml);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
const baseUrl = `http://localhost:${port}`;
|
|
150
|
+
const server = serve({
|
|
151
|
+
fetch: app.fetch,
|
|
152
|
+
port
|
|
153
|
+
}, () => {
|
|
154
|
+
const enabledAdapters = ["In-Memory (Ed25519)", "WebCrypto (Passkey)"];
|
|
155
|
+
if (hasSuiCli) {
|
|
156
|
+
enabledAdapters.push("CLI Signer");
|
|
157
|
+
}
|
|
158
|
+
const walletUrl = cliToken ? `${baseUrl}/?token=${cliToken}` : baseUrl;
|
|
159
|
+
const bookmarkletCode = `javascript:void(document.head.appendChild(Object.assign(document.createElement('script'),{src:'${baseUrl}/bookmarklet.js'})))`;
|
|
160
|
+
console.log(formatStartupMessage({
|
|
161
|
+
walletUrl,
|
|
162
|
+
baseUrl,
|
|
163
|
+
adapters: enabledAdapters,
|
|
164
|
+
hasSuiCli,
|
|
165
|
+
bookmarkletCode
|
|
166
|
+
}));
|
|
167
|
+
});
|
|
168
|
+
function shutdown() {
|
|
169
|
+
console.log("\nShutting down...");
|
|
170
|
+
server.close(() => process.exit(0));
|
|
171
|
+
setTimeout(() => process.exit(1), 3e3).unref();
|
|
172
|
+
}
|
|
173
|
+
process.on("SIGINT", shutdown);
|
|
174
|
+
process.on("SIGTERM", shutdown);
|
|
175
|
+
}
|
|
176
|
+
main().catch((error) => {
|
|
177
|
+
console.error("Failed to start dev wallet:", error);
|
|
178
|
+
process.exit(1);
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
//#endregion
|
|
182
|
+
export { };
|
|
183
|
+
//# sourceMappingURL=cli.mjs.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { ReadonlyWalletAccount, StandardConnectFeature, StandardDisconnectFeature, StandardEventsFeature, SuiFeatures, Wallet, WalletIcon } from "@mysten/wallet-standard";
|
|
2
|
+
|
|
3
|
+
//#region src/client/dev-wallet-client.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Creates a wallet initializer that can be passed to `createDAppKit({ walletInitializers: [...] })`.
|
|
6
|
+
*
|
|
7
|
+
* This registers a {@link DevWalletClient} that communicates with a standalone
|
|
8
|
+
* dev wallet server via PostMessage popups.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { createDAppKit } from '@mysten/dapp-kit-react';
|
|
13
|
+
* import { devWalletClientInitializer } from '@mysten-incubation/dev-wallet/client';
|
|
14
|
+
*
|
|
15
|
+
* const dAppKit = createDAppKit({
|
|
16
|
+
* networks: ['devnet'],
|
|
17
|
+
* walletInitializers: [
|
|
18
|
+
* devWalletClientInitializer({ origin: 'http://localhost:5174' }),
|
|
19
|
+
* ],
|
|
20
|
+
* });
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
declare function devWalletClientInitializer(options?: DevWalletClientOptions): {
|
|
24
|
+
id: string;
|
|
25
|
+
initialize(): {
|
|
26
|
+
unregister: () => void;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Options for creating a DevWalletClient.
|
|
31
|
+
*/
|
|
32
|
+
interface DevWalletClientOptions {
|
|
33
|
+
/** Display name for the wallet. Defaults to 'Dev Wallet (Web)'. */
|
|
34
|
+
name?: string;
|
|
35
|
+
/** Data URI icon for the wallet. */
|
|
36
|
+
icon?: WalletIcon;
|
|
37
|
+
/** Origin of the dev wallet web app. Defaults to 'http://localhost:5174'. */
|
|
38
|
+
origin?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Wallet-standard wallet that communicates with a standalone DevWallet
|
|
42
|
+
* web app via PostMessage popups (started via `npx @mysten-incubation/dev-wallet serve`).
|
|
43
|
+
*/
|
|
44
|
+
declare class DevWalletClient implements Wallet {
|
|
45
|
+
#private;
|
|
46
|
+
constructor(options?: DevWalletClientOptions);
|
|
47
|
+
static register(options?: DevWalletClientOptions): () => void;
|
|
48
|
+
get version(): "1.0.0";
|
|
49
|
+
get name(): string;
|
|
50
|
+
get icon(): `data:image/svg+xml;base64,${string}` | `data:image/webp;base64,${string}` | `data:image/png;base64,${string}` | `data:image/gif;base64,${string}`;
|
|
51
|
+
get chains(): readonly ["sui:devnet", "sui:testnet", "sui:localnet", "sui:mainnet"];
|
|
52
|
+
get accounts(): readonly ReadonlyWalletAccount[];
|
|
53
|
+
get features(): StandardConnectFeature & StandardEventsFeature & StandardDisconnectFeature & SuiFeatures;
|
|
54
|
+
}
|
|
55
|
+
//#endregion
|
|
56
|
+
export { DevWalletClient, DevWalletClientOptions, devWalletClientInitializer };
|
|
57
|
+
//# sourceMappingURL=dev-wallet-client.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-wallet-client.d.mts","names":[],"sources":["../../src/client/dev-wallet-client.ts"],"mappings":";;;;AA8CA;;;;;;;;;;;AAsBA;;;;;;;iBAtBgB,0BAAA,CAA2B,OAAA,GAAU,sBAAA;EACpD,EAAA;EACA,UAAA;IAAgB,UAAA;EAAA;AAAA;;;;UAoBA,sBAAA;EAyDf;EAvDD,IAAA;EAyDC;EAvDD,IAAA,GAAO,UAAA;EASsC;EAP7C,MAAA;AAAA;;;;;cAOY,eAAA,YAA2B,MAAA;EAAA;cAQ3B,OAAA,GAAU,sBAAA;EAAA,OASf,QAAA,CAAS,OAAA,GAAU,sBAAA;EAAA,IAMtB,OAAA,CAAA;EAAA,IAIA,IAAA,CAAA;EAAA,IAIA,IAAA,CAAA;EAAA,IAIA,MAAA,CAAA;EAAA,IAIA,QAAA,CAAA,YAAqB,qBAAA;EAAA,IAIrB,QAAA,CAAA,GAAY,sBAAA,GACf,qBAAA,GACA,yBAAA,GACA,WAAA;AAAA"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { DEFAULT_WALLET_ICON } from "../wallet/constants.mjs";
|
|
2
|
+
import { mitt } from "@mysten/utils";
|
|
3
|
+
import { ReadonlyWalletAccount, SUI_CHAINS, getWallets } from "@mysten/wallet-standard";
|
|
4
|
+
import { fromBase64, toBase64 } from "@mysten/sui/utils";
|
|
5
|
+
import { DappPostMessageChannel, decodeJwtSession } from "@mysten/window-wallet-core";
|
|
6
|
+
|
|
7
|
+
//#region src/client/dev-wallet-client.ts
|
|
8
|
+
const DEFAULT_WALLET_NAME = "Dev Wallet (Web)";
|
|
9
|
+
const DEFAULT_ORIGIN = "http://localhost:5174";
|
|
10
|
+
/**
|
|
11
|
+
* Creates a wallet initializer that can be passed to `createDAppKit({ walletInitializers: [...] })`.
|
|
12
|
+
*
|
|
13
|
+
* This registers a {@link DevWalletClient} that communicates with a standalone
|
|
14
|
+
* dev wallet server via PostMessage popups.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* import { createDAppKit } from '@mysten/dapp-kit-react';
|
|
19
|
+
* import { devWalletClientInitializer } from '@mysten-incubation/dev-wallet/client';
|
|
20
|
+
*
|
|
21
|
+
* const dAppKit = createDAppKit({
|
|
22
|
+
* networks: ['devnet'],
|
|
23
|
+
* walletInitializers: [
|
|
24
|
+
* devWalletClientInitializer({ origin: 'http://localhost:5174' }),
|
|
25
|
+
* ],
|
|
26
|
+
* });
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
function devWalletClientInitializer(options) {
|
|
30
|
+
return {
|
|
31
|
+
id: "dev-wallet-client-initializer",
|
|
32
|
+
initialize() {
|
|
33
|
+
const unregister = DevWalletClient.register(options);
|
|
34
|
+
return { unregister };
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const WALLET_FEATURES = [
|
|
39
|
+
"sui:signTransaction",
|
|
40
|
+
"sui:signAndExecuteTransaction",
|
|
41
|
+
"sui:signPersonalMessage"
|
|
42
|
+
];
|
|
43
|
+
/**
|
|
44
|
+
* Wallet-standard wallet that communicates with a standalone DevWallet
|
|
45
|
+
* web app via PostMessage popups (started via `npx @mysten-incubation/dev-wallet serve`).
|
|
46
|
+
*/
|
|
47
|
+
var DevWalletClient = class DevWalletClient {
|
|
48
|
+
#name;
|
|
49
|
+
#icon;
|
|
50
|
+
#origin;
|
|
51
|
+
#sessionKey;
|
|
52
|
+
#accounts = [];
|
|
53
|
+
#events;
|
|
54
|
+
constructor(options) {
|
|
55
|
+
this.#name = options?.name ?? DEFAULT_WALLET_NAME;
|
|
56
|
+
this.#icon = options?.icon ?? DEFAULT_WALLET_ICON;
|
|
57
|
+
this.#origin = options?.origin ?? DEFAULT_ORIGIN;
|
|
58
|
+
this.#sessionKey = `dev-wallet:session:${this.#origin}`;
|
|
59
|
+
this.#events = mitt();
|
|
60
|
+
this.#tryRestoreSession();
|
|
61
|
+
}
|
|
62
|
+
static register(options) {
|
|
63
|
+
const wallet = new DevWalletClient(options);
|
|
64
|
+
const wallets = getWallets();
|
|
65
|
+
return wallets.register(wallet);
|
|
66
|
+
}
|
|
67
|
+
get version() {
|
|
68
|
+
return "1.0.0";
|
|
69
|
+
}
|
|
70
|
+
get name() {
|
|
71
|
+
return this.#name;
|
|
72
|
+
}
|
|
73
|
+
get icon() {
|
|
74
|
+
return this.#icon;
|
|
75
|
+
}
|
|
76
|
+
get chains() {
|
|
77
|
+
return SUI_CHAINS;
|
|
78
|
+
}
|
|
79
|
+
get accounts() {
|
|
80
|
+
return this.#accounts;
|
|
81
|
+
}
|
|
82
|
+
get features() {
|
|
83
|
+
return {
|
|
84
|
+
"standard:connect": {
|
|
85
|
+
version: "1.0.0",
|
|
86
|
+
connect: this.#connect
|
|
87
|
+
},
|
|
88
|
+
"standard:events": {
|
|
89
|
+
version: "1.0.0",
|
|
90
|
+
on: this.#on
|
|
91
|
+
},
|
|
92
|
+
"standard:disconnect": {
|
|
93
|
+
version: "1.0.0",
|
|
94
|
+
disconnect: this.#disconnect
|
|
95
|
+
},
|
|
96
|
+
"sui:signPersonalMessage": {
|
|
97
|
+
version: "1.1.0",
|
|
98
|
+
signPersonalMessage: this.#signPersonalMessage
|
|
99
|
+
},
|
|
100
|
+
"sui:signTransaction": {
|
|
101
|
+
version: "2.0.0",
|
|
102
|
+
signTransaction: this.#signTransaction
|
|
103
|
+
},
|
|
104
|
+
"sui:signAndExecuteTransaction": {
|
|
105
|
+
version: "2.0.0",
|
|
106
|
+
signAndExecuteTransaction: this.#signAndExecuteTransaction
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
#on = (event, listener) => {
|
|
111
|
+
this.#events.on(event, listener);
|
|
112
|
+
return () => this.#events.off(event, listener);
|
|
113
|
+
};
|
|
114
|
+
#connect = async () => {
|
|
115
|
+
const channel = this.#createChannel();
|
|
116
|
+
const response = await channel.send({ type: "connect" });
|
|
117
|
+
this.#setSession(response.session);
|
|
118
|
+
this.#setAccountsFromSession(response.session);
|
|
119
|
+
return { accounts: this.accounts };
|
|
120
|
+
};
|
|
121
|
+
#disconnect = async () => {
|
|
122
|
+
this.#clearSession();
|
|
123
|
+
this.#accounts = [];
|
|
124
|
+
this.#events.emit("change", { accounts: this.#accounts });
|
|
125
|
+
};
|
|
126
|
+
#signPersonalMessage = async (input) => {
|
|
127
|
+
const channel = this.#createChannel();
|
|
128
|
+
const response = await channel.send({
|
|
129
|
+
type: "sign-personal-message",
|
|
130
|
+
message: toBase64(input.message),
|
|
131
|
+
address: input.account.address,
|
|
132
|
+
chain: input.chain ?? input.account.chains[0] ?? "sui:unknown",
|
|
133
|
+
session: this.#getSession()
|
|
134
|
+
});
|
|
135
|
+
return {
|
|
136
|
+
bytes: response.bytes,
|
|
137
|
+
signature: response.signature
|
|
138
|
+
};
|
|
139
|
+
};
|
|
140
|
+
#signTransaction = async (input) => {
|
|
141
|
+
const txJson = await input.transaction.toJSON();
|
|
142
|
+
const channel = this.#createChannel();
|
|
143
|
+
const response = await channel.send({
|
|
144
|
+
type: "sign-transaction",
|
|
145
|
+
transaction: txJson,
|
|
146
|
+
address: input.account.address,
|
|
147
|
+
chain: input.chain,
|
|
148
|
+
session: this.#getSession()
|
|
149
|
+
});
|
|
150
|
+
return {
|
|
151
|
+
bytes: response.bytes,
|
|
152
|
+
signature: response.signature
|
|
153
|
+
};
|
|
154
|
+
};
|
|
155
|
+
#signAndExecuteTransaction = async (input) => {
|
|
156
|
+
const txJson = await input.transaction.toJSON();
|
|
157
|
+
const channel = this.#createChannel();
|
|
158
|
+
const response = await channel.send({
|
|
159
|
+
type: "sign-and-execute-transaction",
|
|
160
|
+
transaction: txJson,
|
|
161
|
+
address: input.account.address,
|
|
162
|
+
chain: input.chain,
|
|
163
|
+
session: this.#getSession()
|
|
164
|
+
});
|
|
165
|
+
return {
|
|
166
|
+
bytes: response.bytes,
|
|
167
|
+
signature: response.signature,
|
|
168
|
+
digest: response.digest,
|
|
169
|
+
effects: response.effects
|
|
170
|
+
};
|
|
171
|
+
};
|
|
172
|
+
#createChannel() {
|
|
173
|
+
return new DappPostMessageChannel({
|
|
174
|
+
appName: this.#name,
|
|
175
|
+
hostOrigin: this.#origin
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
#getSession() {
|
|
179
|
+
if (typeof localStorage === "undefined") {
|
|
180
|
+
throw new Error("No active session. Call connect() first.");
|
|
181
|
+
}
|
|
182
|
+
const session = localStorage.getItem(this.#sessionKey);
|
|
183
|
+
if (!session) {
|
|
184
|
+
throw new Error("No active session. Call connect() first.");
|
|
185
|
+
}
|
|
186
|
+
return session;
|
|
187
|
+
}
|
|
188
|
+
#setSession(session) {
|
|
189
|
+
if (typeof localStorage !== "undefined") {
|
|
190
|
+
localStorage.setItem(this.#sessionKey, session);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
#clearSession() {
|
|
194
|
+
if (typeof localStorage !== "undefined") {
|
|
195
|
+
localStorage.removeItem(this.#sessionKey);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
#setAccountsFromSession(session) {
|
|
199
|
+
const decoded = decodeJwtSession(session);
|
|
200
|
+
this.#accounts = decoded.payload.accounts.map((account) => new ReadonlyWalletAccount({
|
|
201
|
+
address: account.address,
|
|
202
|
+
publicKey: account.publicKey ? fromBase64(account.publicKey) : new Uint8Array(0),
|
|
203
|
+
chains: [...SUI_CHAINS],
|
|
204
|
+
features: [...WALLET_FEATURES],
|
|
205
|
+
label: account.label
|
|
206
|
+
}));
|
|
207
|
+
this.#events.emit("change", { accounts: this.#accounts });
|
|
208
|
+
}
|
|
209
|
+
#tryRestoreSession() {
|
|
210
|
+
if (typeof localStorage === "undefined") return;
|
|
211
|
+
const session = localStorage.getItem(this.#sessionKey);
|
|
212
|
+
if (!session) return;
|
|
213
|
+
try {
|
|
214
|
+
this.#setAccountsFromSession(session);
|
|
215
|
+
} catch {
|
|
216
|
+
this.#clearSession();
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
//#endregion
|
|
222
|
+
export { DevWalletClient, devWalletClientInitializer };
|
|
223
|
+
//# sourceMappingURL=dev-wallet-client.mjs.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { DevWalletClient, DevWalletClientOptions, devWalletClientInitializer } from "./dev-wallet-client.mjs";
|
|
2
|
+
import { HandleRequestOptions, PendingWalletRequest, parseWalletRequest } from "./request-handler.mjs";
|
|
3
|
+
export { DevWalletClient, type DevWalletClientOptions, type HandleRequestOptions, type PendingWalletRequest, devWalletClientInitializer, parseWalletRequest };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { SignerAdapter } from "../types.mjs";
|
|
2
|
+
import { ClientWithCoreApi } from "@mysten/sui/client";
|
|
3
|
+
|
|
4
|
+
//#region src/client/request-handler.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* A parsed wallet request with methods to approve or reject it.
|
|
7
|
+
*
|
|
8
|
+
* This is different from `PendingSigningRequest` (in dev-wallet.ts) — this interface
|
|
9
|
+
* includes `approve()`/`reject()` methods and is specific to the standalone popup flow.
|
|
10
|
+
*/
|
|
11
|
+
interface PendingWalletRequest {
|
|
12
|
+
type: 'connect' | 'sign-transaction' | 'sign-and-execute-transaction' | 'sign-personal-message';
|
|
13
|
+
appName: string;
|
|
14
|
+
appUrl: string;
|
|
15
|
+
address?: string;
|
|
16
|
+
chain?: string;
|
|
17
|
+
data?: string | Uint8Array;
|
|
18
|
+
/**
|
|
19
|
+
* Approve the request.
|
|
20
|
+
* For connect: creates a session with the selected accounts (or all if none specified).
|
|
21
|
+
* For signing: signs with the adapter.
|
|
22
|
+
*/
|
|
23
|
+
approve(options?: {
|
|
24
|
+
selectedAddresses?: string[];
|
|
25
|
+
}): Promise<void>;
|
|
26
|
+
/** Reject the request with an optional reason. */
|
|
27
|
+
reject(reason?: string): void;
|
|
28
|
+
}
|
|
29
|
+
interface HandleRequestOptions {
|
|
30
|
+
/** The signer adapters providing accounts and signing capability. */
|
|
31
|
+
adapters: SignerAdapter[];
|
|
32
|
+
/** JWT secret key for session creation. */
|
|
33
|
+
jwtSecretKey: CryptoKey | Uint8Array;
|
|
34
|
+
/** Resolve a client for a given network name (needed for signAndExecute). */
|
|
35
|
+
getClient?: (network: string) => ClientWithCoreApi | undefined;
|
|
36
|
+
/** URL hash containing the encoded request. Defaults to window.location.hash. */
|
|
37
|
+
hash?: string;
|
|
38
|
+
}
|
|
39
|
+
declare function parseWalletRequest(options: HandleRequestOptions): PendingWalletRequest;
|
|
40
|
+
//#endregion
|
|
41
|
+
export { HandleRequestOptions, PendingWalletRequest, parseWalletRequest };
|
|
42
|
+
//# sourceMappingURL=request-handler.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-handler.d.mts","names":[],"sources":["../../src/client/request-handler.ts"],"mappings":";;;;;;AAiBA;;;;UAAiB,oBAAA;EAChB,IAAA;EACA,OAAA;EACA,MAAA;EACA,OAAA;EACA,KAAA;EACA,IAAA,YAAgB,UAAA;EAMhB;;;;;EAAA,OAAA,CAAQ,OAAA;IAAY,iBAAA;EAAA,IAAiC,OAAA;EAKrC;EAHhB,MAAA,CAAO,MAAA;AAAA;AAAA,UAGS,oBAAA;EAIF;EAFd,QAAA,EAAU,aAAA;EAIuB;EAFjC,YAAA,EAAc,SAAA,GAAY,UAAA;EAEwB;EAAlD,SAAA,IAAa,OAAA,aAAoB,iBAAA;EAJvB;EAMV,IAAA;AAAA;AAAA,iBAGe,kBAAA,CAAmB,OAAA,EAAS,oBAAA,GAAuB,oBAAA"}
|