@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.
Files changed (213) hide show
  1. package/README.md +250 -0
  2. package/dist/_virtual/_@oxc-project_runtime@0.107.0/helpers/decorate.mjs +10 -0
  3. package/dist/adapters/base-adapter.d.mts +33 -0
  4. package/dist/adapters/base-adapter.d.mts.map +1 -0
  5. package/dist/adapters/base-adapter.mjs +77 -0
  6. package/dist/adapters/base-adapter.mjs.map +1 -0
  7. package/dist/adapters/browser.d.mts +8 -0
  8. package/dist/adapters/browser.mjs +8 -0
  9. package/dist/adapters/build-managed-account.d.mts +12 -0
  10. package/dist/adapters/build-managed-account.d.mts.map +1 -0
  11. package/dist/adapters/build-managed-account.mjs +30 -0
  12. package/dist/adapters/build-managed-account.mjs.map +1 -0
  13. package/dist/adapters/idb-store.mjs +73 -0
  14. package/dist/adapters/idb-store.mjs.map +1 -0
  15. package/dist/adapters/in-memory-adapter.d.mts +16 -0
  16. package/dist/adapters/in-memory-adapter.d.mts.map +1 -0
  17. package/dist/adapters/in-memory-adapter.mjs +44 -0
  18. package/dist/adapters/in-memory-adapter.mjs.map +1 -0
  19. package/dist/adapters/passkey-adapter.d.mts +31 -0
  20. package/dist/adapters/passkey-adapter.d.mts.map +1 -0
  21. package/dist/adapters/passkey-adapter.mjs +87 -0
  22. package/dist/adapters/passkey-adapter.mjs.map +1 -0
  23. package/dist/adapters/remote-cli-adapter.d.mts +65 -0
  24. package/dist/adapters/remote-cli-adapter.d.mts.map +1 -0
  25. package/dist/adapters/remote-cli-adapter.mjs +299 -0
  26. package/dist/adapters/remote-cli-adapter.mjs.map +1 -0
  27. package/dist/adapters/webcrypto-adapter.d.mts +20 -0
  28. package/dist/adapters/webcrypto-adapter.d.mts.map +1 -0
  29. package/dist/adapters/webcrypto-adapter.mjs +68 -0
  30. package/dist/adapters/webcrypto-adapter.mjs.map +1 -0
  31. package/dist/bin/cli.d.mts +1 -0
  32. package/dist/bin/cli.mjs +183 -0
  33. package/dist/bin/cli.mjs.map +1 -0
  34. package/dist/client/dev-wallet-client.d.mts +57 -0
  35. package/dist/client/dev-wallet-client.d.mts.map +1 -0
  36. package/dist/client/dev-wallet-client.mjs +223 -0
  37. package/dist/client/dev-wallet-client.mjs.map +1 -0
  38. package/dist/client/index.d.mts +3 -0
  39. package/dist/client/index.mjs +4 -0
  40. package/dist/client/request-handler.d.mts +42 -0
  41. package/dist/client/request-handler.d.mts.map +1 -0
  42. package/dist/client/request-handler.mjs +115 -0
  43. package/dist/client/request-handler.mjs.map +1 -0
  44. package/dist/index.d.mts +5 -0
  45. package/dist/index.mjs +4 -0
  46. package/dist/react/components.d.mts +32 -0
  47. package/dist/react/components.d.mts.map +1 -0
  48. package/dist/react/components.mjs +53 -0
  49. package/dist/react/components.mjs.map +1 -0
  50. package/dist/react/context.d.mts +22 -0
  51. package/dist/react/context.d.mts.map +1 -0
  52. package/dist/react/context.mjs +25 -0
  53. package/dist/react/context.mjs.map +1 -0
  54. package/dist/react/index.d.mts +4 -0
  55. package/dist/react/index.mjs +5 -0
  56. package/dist/react/useDevWallet.d.mts +38 -0
  57. package/dist/react/useDevWallet.d.mts.map +1 -0
  58. package/dist/react/useDevWallet.mjs +89 -0
  59. package/dist/react/useDevWallet.mjs.map +1 -0
  60. package/dist/server/cli-signing-middleware.d.mts +22 -0
  61. package/dist/server/cli-signing-middleware.d.mts.map +1 -0
  62. package/dist/server/cli-signing-middleware.mjs +117 -0
  63. package/dist/server/cli-signing-middleware.mjs.map +1 -0
  64. package/dist/server/index.d.mts +2 -0
  65. package/dist/server/index.mjs +3 -0
  66. package/dist/standalone/assets/in-memory-adapter-CBF4h2KD.js +1 -0
  67. package/dist/standalone/assets/main-VE4olb-Q.js +2841 -0
  68. package/dist/standalone/assets/webcrypto-adapter-DysAubFb.js +1 -0
  69. package/dist/standalone/bookmarklet.js +5 -0
  70. package/dist/standalone/index.html +48 -0
  71. package/dist/types.d.mts +55 -0
  72. package/dist/types.d.mts.map +1 -0
  73. package/dist/ui/copy-controller.mjs +43 -0
  74. package/dist/ui/copy-controller.mjs.map +1 -0
  75. package/dist/ui/dev-wallet-account-selector.d.mts +24 -0
  76. package/dist/ui/dev-wallet-account-selector.d.mts.map +1 -0
  77. package/dist/ui/dev-wallet-account-selector.mjs +268 -0
  78. package/dist/ui/dev-wallet-account-selector.mjs.map +1 -0
  79. package/dist/ui/dev-wallet-accounts.d.mts +29 -0
  80. package/dist/ui/dev-wallet-accounts.d.mts.map +1 -0
  81. package/dist/ui/dev-wallet-accounts.mjs +524 -0
  82. package/dist/ui/dev-wallet-accounts.mjs.map +1 -0
  83. package/dist/ui/dev-wallet-balances.d.mts +26 -0
  84. package/dist/ui/dev-wallet-balances.d.mts.map +1 -0
  85. package/dist/ui/dev-wallet-balances.mjs +130 -0
  86. package/dist/ui/dev-wallet-balances.mjs.map +1 -0
  87. package/dist/ui/dev-wallet-connect.d.mts +31 -0
  88. package/dist/ui/dev-wallet-connect.d.mts.map +1 -0
  89. package/dist/ui/dev-wallet-connect.mjs +225 -0
  90. package/dist/ui/dev-wallet-connect.mjs.map +1 -0
  91. package/dist/ui/dev-wallet-dropdown.d.mts +27 -0
  92. package/dist/ui/dev-wallet-dropdown.d.mts.map +1 -0
  93. package/dist/ui/dev-wallet-dropdown.mjs +121 -0
  94. package/dist/ui/dev-wallet-dropdown.mjs.map +1 -0
  95. package/dist/ui/dev-wallet-network-badge.d.mts +21 -0
  96. package/dist/ui/dev-wallet-network-badge.d.mts.map +1 -0
  97. package/dist/ui/dev-wallet-network-badge.mjs +121 -0
  98. package/dist/ui/dev-wallet-network-badge.mjs.map +1 -0
  99. package/dist/ui/dev-wallet-new-account.d.mts +31 -0
  100. package/dist/ui/dev-wallet-new-account.d.mts.map +1 -0
  101. package/dist/ui/dev-wallet-new-account.mjs +577 -0
  102. package/dist/ui/dev-wallet-new-account.mjs.map +1 -0
  103. package/dist/ui/dev-wallet-objects.d.mts +26 -0
  104. package/dist/ui/dev-wallet-objects.d.mts.map +1 -0
  105. package/dist/ui/dev-wallet-objects.mjs +276 -0
  106. package/dist/ui/dev-wallet-objects.mjs.map +1 -0
  107. package/dist/ui/dev-wallet-panel.d.mts +22 -0
  108. package/dist/ui/dev-wallet-panel.d.mts.map +1 -0
  109. package/dist/ui/dev-wallet-panel.mjs +192 -0
  110. package/dist/ui/dev-wallet-panel.mjs.map +1 -0
  111. package/dist/ui/dev-wallet-popup.d.mts +36 -0
  112. package/dist/ui/dev-wallet-popup.d.mts.map +1 -0
  113. package/dist/ui/dev-wallet-popup.mjs +137 -0
  114. package/dist/ui/dev-wallet-popup.mjs.map +1 -0
  115. package/dist/ui/dev-wallet-settings.d.mts +33 -0
  116. package/dist/ui/dev-wallet-settings.d.mts.map +1 -0
  117. package/dist/ui/dev-wallet-settings.mjs +635 -0
  118. package/dist/ui/dev-wallet-settings.mjs.map +1 -0
  119. package/dist/ui/dev-wallet-signing-modal.d.mts +32 -0
  120. package/dist/ui/dev-wallet-signing-modal.d.mts.map +1 -0
  121. package/dist/ui/dev-wallet-signing-modal.mjs +115 -0
  122. package/dist/ui/dev-wallet-signing-modal.mjs.map +1 -0
  123. package/dist/ui/dev-wallet-signing.d.mts +25 -0
  124. package/dist/ui/dev-wallet-signing.d.mts.map +1 -0
  125. package/dist/ui/dev-wallet-signing.mjs +544 -0
  126. package/dist/ui/dev-wallet-signing.mjs.map +1 -0
  127. package/dist/ui/dev-wallet-standalone.d.mts +23 -0
  128. package/dist/ui/dev-wallet-standalone.d.mts.map +1 -0
  129. package/dist/ui/dev-wallet-standalone.mjs +129 -0
  130. package/dist/ui/dev-wallet-standalone.mjs.map +1 -0
  131. package/dist/ui/dev-wallet-tab-bar.d.mts +19 -0
  132. package/dist/ui/dev-wallet-tab-bar.d.mts.map +1 -0
  133. package/dist/ui/dev-wallet-tab-bar.mjs +143 -0
  134. package/dist/ui/dev-wallet-tab-bar.mjs.map +1 -0
  135. package/dist/ui/index.d.mts +17 -0
  136. package/dist/ui/index.mjs +18 -0
  137. package/dist/ui/mount.d.mts +11 -0
  138. package/dist/ui/mount.d.mts.map +1 -0
  139. package/dist/ui/mount.mjs +17 -0
  140. package/dist/ui/mount.mjs.map +1 -0
  141. package/dist/ui/styles.mjs +250 -0
  142. package/dist/ui/styles.mjs.map +1 -0
  143. package/dist/ui/transaction-analyzer.mjs +58 -0
  144. package/dist/ui/transaction-analyzer.mjs.map +1 -0
  145. package/dist/ui/utils.mjs +98 -0
  146. package/dist/ui/utils.mjs.map +1 -0
  147. package/dist/ui/wallet-controller.mjs +275 -0
  148. package/dist/ui/wallet-controller.mjs.map +1 -0
  149. package/dist/wallet/constants.mjs +11 -0
  150. package/dist/wallet/constants.mjs.map +1 -0
  151. package/dist/wallet/dev-wallet.d.mts +118 -0
  152. package/dist/wallet/dev-wallet.d.mts.map +1 -0
  153. package/dist/wallet/dev-wallet.mjs +424 -0
  154. package/dist/wallet/dev-wallet.mjs.map +1 -0
  155. package/dist/wallet/initializer.d.mts +63 -0
  156. package/dist/wallet/initializer.d.mts.map +1 -0
  157. package/dist/wallet/initializer.mjs +75 -0
  158. package/dist/wallet/initializer.mjs.map +1 -0
  159. package/dist/wallet/signing.d.mts +35 -0
  160. package/dist/wallet/signing.d.mts.map +1 -0
  161. package/dist/wallet/signing.mjs +69 -0
  162. package/dist/wallet/signing.mjs.map +1 -0
  163. package/package.json +124 -0
  164. package/src/adapters/base-adapter.ts +93 -0
  165. package/src/adapters/browser.ts +15 -0
  166. package/src/adapters/build-managed-account.ts +33 -0
  167. package/src/adapters/idb-store.ts +87 -0
  168. package/src/adapters/in-memory-adapter.ts +51 -0
  169. package/src/adapters/passkey-adapter.ts +120 -0
  170. package/src/adapters/remote-cli-adapter.ts +388 -0
  171. package/src/adapters/webcrypto-adapter.ts +96 -0
  172. package/src/app/bookmarklet-entry.ts +77 -0
  173. package/src/app/index.html +48 -0
  174. package/src/app/main.ts +245 -0
  175. package/src/app/tsconfig.json +3 -0
  176. package/src/bin/cli.ts +214 -0
  177. package/src/client/dev-wallet-client.ts +280 -0
  178. package/src/client/index.ts +7 -0
  179. package/src/client/request-handler.ts +161 -0
  180. package/src/index.ts +19 -0
  181. package/src/react/components.ts +64 -0
  182. package/src/react/context.ts +38 -0
  183. package/src/react/index.ts +16 -0
  184. package/src/react/useDevWallet.ts +118 -0
  185. package/src/server/cli-signing-middleware.ts +146 -0
  186. package/src/server/index.ts +8 -0
  187. package/src/types.ts +58 -0
  188. package/src/ui/copy-controller.ts +49 -0
  189. package/src/ui/dev-wallet-account-selector.ts +283 -0
  190. package/src/ui/dev-wallet-accounts.ts +578 -0
  191. package/src/ui/dev-wallet-balances.ts +171 -0
  192. package/src/ui/dev-wallet-connect.ts +259 -0
  193. package/src/ui/dev-wallet-dropdown.ts +138 -0
  194. package/src/ui/dev-wallet-network-badge.ts +128 -0
  195. package/src/ui/dev-wallet-new-account.ts +662 -0
  196. package/src/ui/dev-wallet-objects.ts +336 -0
  197. package/src/ui/dev-wallet-panel.ts +207 -0
  198. package/src/ui/dev-wallet-popup.ts +169 -0
  199. package/src/ui/dev-wallet-settings.ts +692 -0
  200. package/src/ui/dev-wallet-signing-modal.ts +137 -0
  201. package/src/ui/dev-wallet-signing.ts +624 -0
  202. package/src/ui/dev-wallet-standalone.ts +136 -0
  203. package/src/ui/dev-wallet-tab-bar.ts +151 -0
  204. package/src/ui/index.ts +26 -0
  205. package/src/ui/mount.ts +21 -0
  206. package/src/ui/styles.ts +252 -0
  207. package/src/ui/transaction-analyzer.ts +60 -0
  208. package/src/ui/utils.ts +118 -0
  209. package/src/ui/wallet-controller.ts +340 -0
  210. package/src/wallet/constants.ts +17 -0
  211. package/src/wallet/dev-wallet.ts +597 -0
  212. package/src/wallet/initializer.ts +124 -0
  213. package/src/wallet/signing.ts +85 -0
@@ -0,0 +1,115 @@
1
+ import { getNetworkFromChain } from "../wallet/constants.mjs";
2
+ import { executeSigning } from "../wallet/signing.mjs";
3
+ import { fromBase64, toBase64 } from "@mysten/sui/utils";
4
+ import { WalletPostMessageChannel, createJwtSession } from "@mysten/window-wallet-core";
5
+
6
+ //#region src/client/request-handler.ts
7
+ 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
+ }
11
+ const hash = options.hash ?? window.location.hash.slice(1);
12
+ const channel = WalletPostMessageChannel.fromUrlHash(hash);
13
+ const requestData = channel.getRequestData();
14
+ const payload = requestData.payload;
15
+ if (payload.type === "connect") {
16
+ return {
17
+ type: "connect",
18
+ appName: requestData.appName,
19
+ appUrl: requestData.appUrl,
20
+ async approve(approveOptions) {
21
+ const allAccounts = options.adapters.flatMap((adapter) => adapter.getAccounts().map((a) => ({
22
+ address: a.address,
23
+ publicKey: toBase64(a.signer.getPublicKey().toSuiBytes()),
24
+ label: a.label
25
+ })));
26
+ const selected = approveOptions?.selectedAddresses;
27
+ const accounts = selected ? allAccounts.filter((a) => selected.includes(a.address)) : allAccounts;
28
+ const session = await createJwtSession({ accounts }, {
29
+ secretKey: options.jwtSecretKey,
30
+ expirationTime: "7d",
31
+ issuer: "dev-wallet",
32
+ audience: new URL(requestData.appUrl).origin
33
+ });
34
+ channel.sendMessage({
35
+ type: "resolve",
36
+ data: {
37
+ type: "connect",
38
+ session
39
+ }
40
+ });
41
+ },
42
+ reject(reason) {
43
+ channel.sendMessage({
44
+ type: "reject",
45
+ reason
46
+ });
47
+ }
48
+ };
49
+ }
50
+ const messageData = payload.type === "sign-personal-message" ? fromBase64(payload.message) : payload.transaction;
51
+ return {
52
+ type: payload.type,
53
+ appName: requestData.appName,
54
+ appUrl: requestData.appUrl,
55
+ address: payload.address,
56
+ chain: payload.chain,
57
+ data: messageData,
58
+ async approve() {
59
+ try {
60
+ await channel.verifyJwtSession(options.jwtSecretKey);
61
+ } catch (error) {
62
+ channel.sendMessage({
63
+ type: "reject",
64
+ reason: `Session verification failed: ${error instanceof Error ? error.message : String(error)}`
65
+ });
66
+ return;
67
+ }
68
+ let account;
69
+ for (const adapter of options.adapters) {
70
+ account = adapter.getAccount(payload.address);
71
+ if (account) break;
72
+ }
73
+ if (!account) {
74
+ channel.sendMessage({
75
+ type: "reject",
76
+ reason: `Account ${payload.address} not found`
77
+ });
78
+ return;
79
+ }
80
+ try {
81
+ const network = payload.chain ? getNetworkFromChain(payload.chain) : undefined;
82
+ const client = network ? options.getClient?.(network) : undefined;
83
+ const result = await executeSigning({
84
+ type: payload.type,
85
+ signer: account.signer,
86
+ data: messageData,
87
+ client
88
+ });
89
+ const data = result.type === "sign-and-execute-transaction" ? {
90
+ ...result,
91
+ effects: result.effects ?? ""
92
+ } : result;
93
+ channel.sendMessage({
94
+ type: "resolve",
95
+ data
96
+ });
97
+ } catch (error) {
98
+ channel.sendMessage({
99
+ type: "reject",
100
+ reason: error instanceof Error ? error.message : String(error)
101
+ });
102
+ }
103
+ },
104
+ reject(reason) {
105
+ channel.sendMessage({
106
+ type: "reject",
107
+ reason
108
+ });
109
+ }
110
+ };
111
+ }
112
+
113
+ //#endregion
114
+ export { parseWalletRequest };
115
+ //# sourceMappingURL=request-handler.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-handler.mjs","names":[],"sources":["../../src/client/request-handler.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ClientWithCoreApi } from '@mysten/sui/client';\nimport { fromBase64, toBase64 } from '@mysten/sui/utils';\nimport { createJwtSession, WalletPostMessageChannel } from '@mysten/window-wallet-core';\n\nimport type { SignerAdapter } from '../types.js';\nimport { getNetworkFromChain } from '../wallet/constants.js';\nimport { executeSigning } from '../wallet/signing.js';\n\n/**\n * A parsed wallet request with methods to approve or reject it.\n *\n * This is different from `PendingSigningRequest` (in dev-wallet.ts) — this interface\n * includes `approve()`/`reject()` methods and is specific to the standalone popup flow.\n */\nexport interface PendingWalletRequest {\n\ttype: 'connect' | 'sign-transaction' | 'sign-and-execute-transaction' | 'sign-personal-message';\n\tappName: string;\n\tappUrl: string;\n\taddress?: string;\n\tchain?: string;\n\tdata?: string | Uint8Array;\n\t/**\n\t * Approve the request.\n\t * For connect: creates a session with the selected accounts (or all if none specified).\n\t * For signing: signs with the adapter.\n\t */\n\tapprove(options?: { selectedAddresses?: string[] }): Promise<void>;\n\t/** Reject the request with an optional reason. */\n\treject(reason?: string): void;\n}\n\nexport interface HandleRequestOptions {\n\t/** The signer adapters providing accounts and signing capability. */\n\tadapters: SignerAdapter[];\n\t/** JWT secret key for session creation. */\n\tjwtSecretKey: CryptoKey | Uint8Array;\n\t/** Resolve a client for a given network name (needed for signAndExecute). */\n\tgetClient?: (network: string) => ClientWithCoreApi | undefined;\n\t/** URL hash containing the encoded request. Defaults to window.location.hash. */\n\thash?: string;\n}\n\nexport function parseWalletRequest(options: HandleRequestOptions): PendingWalletRequest {\n\tif (!options.hash && typeof window === 'undefined') {\n\t\tthrow new Error(\n\t\t\t'parseWalletRequest requires either options.hash or a browser environment with window.location',\n\t\t);\n\t}\n\tconst hash = options.hash ?? window.location.hash.slice(1);\n\tconst channel = WalletPostMessageChannel.fromUrlHash(hash);\n\tconst requestData = channel.getRequestData();\n\tconst payload = requestData.payload;\n\n\tif (payload.type === 'connect') {\n\t\treturn {\n\t\t\ttype: 'connect',\n\t\t\tappName: requestData.appName,\n\t\t\tappUrl: requestData.appUrl,\n\t\t\tasync approve(approveOptions?: { selectedAddresses?: string[] }) {\n\t\t\t\tconst allAccounts = options.adapters.flatMap((adapter) =>\n\t\t\t\t\tadapter.getAccounts().map((a) => ({\n\t\t\t\t\t\taddress: a.address,\n\t\t\t\t\t\tpublicKey: toBase64(a.signer.getPublicKey().toSuiBytes()),\n\t\t\t\t\t\tlabel: a.label,\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t\tconst selected = approveOptions?.selectedAddresses;\n\t\t\t\tconst accounts = selected\n\t\t\t\t\t? allAccounts.filter((a) => selected.includes(a.address))\n\t\t\t\t\t: allAccounts;\n\n\t\t\t\tconst session = await createJwtSession(\n\t\t\t\t\t{ accounts },\n\t\t\t\t\t{\n\t\t\t\t\t\tsecretKey: options.jwtSecretKey,\n\t\t\t\t\t\texpirationTime: '7d',\n\t\t\t\t\t\tissuer: 'dev-wallet',\n\t\t\t\t\t\taudience: new URL(requestData.appUrl).origin,\n\t\t\t\t\t},\n\t\t\t\t);\n\n\t\t\t\tchannel.sendMessage({\n\t\t\t\t\ttype: 'resolve',\n\t\t\t\t\tdata: { type: 'connect', session },\n\t\t\t\t});\n\t\t\t},\n\t\t\treject(reason?: string) {\n\t\t\t\tchannel.sendMessage({ type: 'reject', reason });\n\t\t\t},\n\t\t};\n\t}\n\n\tconst messageData =\n\t\tpayload.type === 'sign-personal-message' ? fromBase64(payload.message) : payload.transaction;\n\n\treturn {\n\t\ttype: payload.type,\n\t\tappName: requestData.appName,\n\t\tappUrl: requestData.appUrl,\n\t\taddress: payload.address,\n\t\tchain: payload.chain,\n\t\tdata: messageData,\n\t\tasync approve() {\n\t\t\t// Verify JWT session before signing — ensures the dApp was previously\n\t\t\t// authorized for this account via a connect flow\n\t\t\ttry {\n\t\t\t\tawait channel.verifyJwtSession(options.jwtSecretKey);\n\t\t\t} catch (error) {\n\t\t\t\tchannel.sendMessage({\n\t\t\t\t\ttype: 'reject',\n\t\t\t\t\treason: `Session verification failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet account;\n\t\t\tfor (const adapter of options.adapters) {\n\t\t\t\taccount = adapter.getAccount(payload.address);\n\t\t\t\tif (account) break;\n\t\t\t}\n\t\t\tif (!account) {\n\t\t\t\tchannel.sendMessage({\n\t\t\t\t\ttype: 'reject',\n\t\t\t\t\treason: `Account ${payload.address} not found`,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst network = payload.chain ? getNetworkFromChain(payload.chain) : undefined;\n\t\t\t\tconst client = network ? options.getClient?.(network) : undefined;\n\t\t\t\tconst result = await executeSigning({\n\t\t\t\t\ttype: payload.type,\n\t\t\t\t\tsigner: account.signer,\n\t\t\t\t\tdata: messageData,\n\t\t\t\t\tclient,\n\t\t\t\t});\n\t\t\t\t// effects must be a string in the PostMessage protocol\n\t\t\t\tconst data =\n\t\t\t\t\tresult.type === 'sign-and-execute-transaction'\n\t\t\t\t\t\t? { ...result, effects: result.effects ?? '' }\n\t\t\t\t\t\t: result;\n\t\t\t\tchannel.sendMessage({\n\t\t\t\t\ttype: 'resolve',\n\t\t\t\t\tdata,\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tchannel.sendMessage({\n\t\t\t\t\ttype: 'reject',\n\t\t\t\t\treason: error instanceof Error ? error.message : String(error),\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\treject(reason?: string) {\n\t\t\tchannel.sendMessage({ type: 'reject', reason });\n\t\t},\n\t};\n}\n"],"mappings":";;;;;;AA6CA,SAAgB,mBAAmB,SAAqD;AACvF,KAAI,CAAC,QAAQ,QAAQ,OAAO,WAAW,aAAa;AACnD,QAAM,IAAI,MACT,gGACA;;CAEF,MAAM,OAAO,QAAQ,QAAQ,OAAO,SAAS,KAAK,MAAM,EAAE;CAC1D,MAAM,UAAU,yBAAyB,YAAY,KAAK;CAC1D,MAAM,cAAc,QAAQ,gBAAgB;CAC5C,MAAM,UAAU,YAAY;AAE5B,KAAI,QAAQ,SAAS,WAAW;AAC/B,SAAO;GACN,MAAM;GACN,SAAS,YAAY;GACrB,QAAQ,YAAY;GACpB,MAAM,QAAQ,gBAAmD;IAChE,MAAM,cAAc,QAAQ,SAAS,SAAS,YAC7C,QAAQ,aAAa,CAAC,KAAK,OAAO;KACjC,SAAS,EAAE;KACX,WAAW,SAAS,EAAE,OAAO,cAAc,CAAC,YAAY,CAAC;KACzD,OAAO,EAAE;KACT,EAAE,CACH;IACD,MAAM,WAAW,gBAAgB;IACjC,MAAM,WAAW,WACd,YAAY,QAAQ,MAAM,SAAS,SAAS,EAAE,QAAQ,CAAC,GACvD;IAEH,MAAM,UAAU,MAAM,iBACrB,EAAE,UAAU,EACZ;KACC,WAAW,QAAQ;KACnB,gBAAgB;KAChB,QAAQ;KACR,UAAU,IAAI,IAAI,YAAY,OAAO,CAAC;KACtC,CACD;AAED,YAAQ,YAAY;KACnB,MAAM;KACN,MAAM;MAAE,MAAM;MAAW;MAAS;KAClC,CAAC;;GAEH,OAAO,QAAiB;AACvB,YAAQ,YAAY;KAAE,MAAM;KAAU;KAAQ,CAAC;;GAEhD;;CAGF,MAAM,cACL,QAAQ,SAAS,0BAA0B,WAAW,QAAQ,QAAQ,GAAG,QAAQ;AAElF,QAAO;EACN,MAAM,QAAQ;EACd,SAAS,YAAY;EACrB,QAAQ,YAAY;EACpB,SAAS,QAAQ;EACjB,OAAO,QAAQ;EACf,MAAM;EACN,MAAM,UAAU;AAGf,OAAI;AACH,UAAM,QAAQ,iBAAiB,QAAQ,aAAa;YAC5C,OAAO;AACf,YAAQ,YAAY;KACnB,MAAM;KACN,QAAQ,gCAAgC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;KAC9F,CAAC;AACF;;GAGD,IAAI;AACJ,QAAK,MAAM,WAAW,QAAQ,UAAU;AACvC,cAAU,QAAQ,WAAW,QAAQ,QAAQ;AAC7C,QAAI,QAAS;;AAEd,OAAI,CAAC,SAAS;AACb,YAAQ,YAAY;KACnB,MAAM;KACN,QAAQ,WAAW,QAAQ,QAAQ;KACnC,CAAC;AACF;;AAGD,OAAI;IACH,MAAM,UAAU,QAAQ,QAAQ,oBAAoB,QAAQ,MAAM,GAAG;IACrE,MAAM,SAAS,UAAU,QAAQ,YAAY,QAAQ,GAAG;IACxD,MAAM,SAAS,MAAM,eAAe;KACnC,MAAM,QAAQ;KACd,QAAQ,QAAQ;KAChB,MAAM;KACN;KACA,CAAC;IAEF,MAAM,OACL,OAAO,SAAS,iCACb;KAAE,GAAG;KAAQ,SAAS,OAAO,WAAW;KAAI,GAC5C;AACJ,YAAQ,YAAY;KACnB,MAAM;KACN;KACA,CAAC;YACM,OAAO;AACf,YAAQ,YAAY;KACnB,MAAM;KACN,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;KAC9D,CAAC;;;EAGJ,OAAO,QAAiB;AACvB,WAAQ,YAAY;IAAE,MAAM;IAAU;IAAQ,CAAC;;EAEhD"}
@@ -0,0 +1,5 @@
1
+ import { CreateAccountOptions, ImportAccountOptions, ManagedAccount, SignerAdapter } from "./types.mjs";
2
+ import { SigningResult } from "./wallet/signing.mjs";
3
+ import { AutoApprovePolicy, DEFAULT_NETWORK_URLS, DevWallet, DevWalletConfig, PendingConnectRequest, PendingSigningRequest } from "./wallet/dev-wallet.mjs";
4
+ import { DevWalletInitializerConfig, devWalletInitializer } from "./wallet/initializer.mjs";
5
+ export { type AutoApprovePolicy, type CreateAccountOptions, DEFAULT_NETWORK_URLS, DevWallet, type DevWalletConfig, type DevWalletInitializerConfig, type ImportAccountOptions, type ManagedAccount, type PendingConnectRequest, type PendingSigningRequest, type SignerAdapter, type SigningResult, devWalletInitializer };
package/dist/index.mjs ADDED
@@ -0,0 +1,4 @@
1
+ import { DEFAULT_NETWORK_URLS, DevWallet } from "./wallet/dev-wallet.mjs";
2
+ import { devWalletInitializer } from "./wallet/initializer.mjs";
3
+
4
+ export { DEFAULT_NETWORK_URLS, DevWallet, devWalletInitializer };
@@ -0,0 +1,32 @@
1
+ import { DevWalletNewAccount as DevWalletNewAccount$1 } from "../ui/dev-wallet-new-account.mjs";
2
+ import { DevWalletAccounts as DevWalletAccounts$1 } from "../ui/dev-wallet-accounts.mjs";
3
+ import { DevWalletBalances as DevWalletBalances$1 } from "../ui/dev-wallet-balances.mjs";
4
+ import { DevWalletPanel as DevWalletPanel$1 } from "../ui/dev-wallet-panel.mjs";
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";
8
+ import { EventName } from "@lit/react";
9
+
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, {
13
+ onAccountSelected: EventName<CustomEvent<{
14
+ account: _mysten_wallet_standard0.ReadonlyWalletAccount;
15
+ }>>;
16
+ onAccountRenamed: EventName<CustomEvent<{
17
+ address: string;
18
+ label: string;
19
+ }>>;
20
+ }>;
21
+ declare const DevWalletBalances: _lit_react0.ReactWebComponent<DevWalletBalances$1, {}>;
22
+ declare const DevWalletNewAccount: _lit_react0.ReactWebComponent<DevWalletNewAccount$1, {
23
+ onClose: EventName<CustomEvent>;
24
+ onAccountCreated: EventName<CustomEvent>;
25
+ }>;
26
+ declare const DevWalletSigning: _lit_react0.ReactWebComponent<DevWalletSigning$1, {
27
+ onApprove: EventName<CustomEvent>;
28
+ onReject: EventName<CustomEvent>;
29
+ }>;
30
+ //#endregion
31
+ export { DevWalletAccounts, DevWalletBalances, DevWalletNewAccount, DevWalletPanel, DevWalletSigning };
32
+ //# sourceMappingURL=components.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.d.mts","names":[],"sources":["../../src/react/components.ts"],"mappings":";;;;;;;;;;cAmBa,cAAA,EAAc,WAAA,CAAA,iBAAA,CAAA,gBAAA;AAAA,cAMd,iBAAA,EAQqC,WAAA,CARpB,iBAAA,CAAA,mBAAA;qBAKa,SAAA,CACxC,WAAA;IAAc,OAAA,EANa,wBAAA,CAM8B,qBAAA;EAAA;oBAEnB,SAAA,CACtC,WAAA;IAAc,OAAA;IAAiB,KAAA;EAAA;AAAA;AAAA,cAKrB,iBAAA,EAAiB,WAAA,CAAA,iBAAA,CAAA,mBAAA;AAAA,cAMjB,mBAAA,EAMqC,WAAA,CANlB,iBAAA,CAAA,qBAAA;WAKV,SAAA,CAAU,WAAA;oBACS,SAAA,CAAU,WAAA;AAAA;AAAA,cAItC,gBAAA,EAMoB,WAAA,CANJ,iBAAA,CAAA,kBAAA;aAKH,SAAA,CAAU,WAAA;YACZ,SAAA,CAAU,WAAA;AAAA"}
@@ -0,0 +1,53 @@
1
+ import { DevWalletBalances as DevWalletBalances$1 } from "../ui/dev-wallet-balances.mjs";
2
+ import { DevWalletNewAccount as DevWalletNewAccount$1 } from "../ui/dev-wallet-new-account.mjs";
3
+ import { DevWalletAccounts as DevWalletAccounts$1 } from "../ui/dev-wallet-accounts.mjs";
4
+ import { DevWalletSigning as DevWalletSigning$1 } from "../ui/dev-wallet-signing.mjs";
5
+ import { DevWalletPanel as DevWalletPanel$1 } from "../ui/dev-wallet-panel.mjs";
6
+ import * as React from "react";
7
+ import { createComponent } from "@lit/react";
8
+
9
+ //#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
+ }
13
+ const DevWalletPanel = createComponent({
14
+ react: React,
15
+ tagName: "dev-wallet-panel",
16
+ elementClass: DevWalletPanel$1
17
+ });
18
+ const DevWalletAccounts = createComponent({
19
+ react: React,
20
+ tagName: "dev-wallet-accounts",
21
+ elementClass: DevWalletAccounts$1,
22
+ events: {
23
+ onAccountSelected: "account-selected",
24
+ onAccountRenamed: "account-renamed"
25
+ }
26
+ });
27
+ const DevWalletBalances = createComponent({
28
+ react: React,
29
+ tagName: "dev-wallet-balances",
30
+ elementClass: DevWalletBalances$1
31
+ });
32
+ const DevWalletNewAccount = createComponent({
33
+ react: React,
34
+ tagName: "dev-wallet-new-account",
35
+ elementClass: DevWalletNewAccount$1,
36
+ events: {
37
+ onClose: "close",
38
+ onAccountCreated: "account-created"
39
+ }
40
+ });
41
+ const DevWalletSigning = createComponent({
42
+ react: React,
43
+ tagName: "dev-wallet-signing",
44
+ elementClass: DevWalletSigning$1,
45
+ events: {
46
+ onApprove: "approve",
47
+ onReject: "reject"
48
+ }
49
+ });
50
+
51
+ //#endregion
52
+ export { DevWalletAccounts, DevWalletBalances, DevWalletNewAccount, DevWalletPanel, DevWalletSigning };
53
+ //# sourceMappingURL=components.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.mjs","names":["DevWalletPanelElement","DevWalletAccountsElement","DevWalletBalancesElement","DevWalletNewAccountElement","DevWalletSigningElement"],"sources":["../../src/react/components.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nif (typeof customElements === 'undefined') {\n\tthrow new Error(\n\t\t'@mysten-incubation/dev-wallet/react components require a browser environment. ' +\n\t\t\t'Use dynamic imports with ssr:false in Next.js.',\n\t);\n}\n\nimport { createComponent, type EventName } from '@lit/react';\nimport * as React from 'react';\n\nimport { DevWalletAccounts as DevWalletAccountsElement } from '../ui/dev-wallet-accounts.js';\nimport { DevWalletBalances as DevWalletBalancesElement } from '../ui/dev-wallet-balances.js';\nimport { DevWalletNewAccount as DevWalletNewAccountElement } from '../ui/dev-wallet-new-account.js';\nimport { DevWalletPanel as DevWalletPanelElement } from '../ui/dev-wallet-panel.js';\nimport { DevWalletSigning as DevWalletSigningElement } from '../ui/dev-wallet-signing.js';\n\nexport const DevWalletPanel = createComponent({\n\treact: React,\n\ttagName: 'dev-wallet-panel',\n\telementClass: DevWalletPanelElement,\n});\n\nexport const DevWalletAccounts = createComponent({\n\treact: React,\n\ttagName: 'dev-wallet-accounts',\n\telementClass: DevWalletAccountsElement,\n\tevents: {\n\t\tonAccountSelected: 'account-selected' as EventName<\n\t\t\tCustomEvent<{ account: import('@mysten/wallet-standard').ReadonlyWalletAccount }>\n\t\t>,\n\t\tonAccountRenamed: 'account-renamed' as EventName<\n\t\t\tCustomEvent<{ address: string; label: string }>\n\t\t>,\n\t},\n});\n\nexport const DevWalletBalances = createComponent({\n\treact: React,\n\ttagName: 'dev-wallet-balances',\n\telementClass: DevWalletBalancesElement,\n});\n\nexport const DevWalletNewAccount = createComponent({\n\treact: React,\n\ttagName: 'dev-wallet-new-account',\n\telementClass: DevWalletNewAccountElement,\n\tevents: {\n\t\tonClose: 'close' as EventName<CustomEvent>,\n\t\tonAccountCreated: 'account-created' as EventName<CustomEvent>,\n\t},\n});\n\nexport const DevWalletSigning = createComponent({\n\treact: React,\n\ttagName: 'dev-wallet-signing',\n\telementClass: DevWalletSigningElement,\n\tevents: {\n\t\tonApprove: 'approve' as EventName<CustomEvent>,\n\t\tonReject: 'reject' as EventName<CustomEvent>,\n\t},\n});\n"],"mappings":";;;;;;;;;AAGA,IAAI,OAAO,mBAAmB,aAAa;AAC1C,OAAM,IAAI,MACT,mFACC,iDACD;;AAYF,MAAa,iBAAiB,gBAAgB;CAC7C,OAAO;CACP,SAAS;CACT,cAAcA;CACd,CAAC;AAEF,MAAa,oBAAoB,gBAAgB;CAChD,OAAO;CACP,SAAS;CACT,cAAcC;CACd,QAAQ;EACP,mBAAmB;EAGnB,kBAAkB;EAGlB;CACD,CAAC;AAEF,MAAa,oBAAoB,gBAAgB;CAChD,OAAO;CACP,SAAS;CACT,cAAcC;CACd,CAAC;AAEF,MAAa,sBAAsB,gBAAgB;CAClD,OAAO;CACP,SAAS;CACT,cAAcC;CACd,QAAQ;EACP,SAAS;EACT,kBAAkB;EAClB;CACD,CAAC;AAEF,MAAa,mBAAmB,gBAAgB;CAC/C,OAAO;CACP,SAAS;CACT,cAAcC;CACd,QAAQ;EACP,WAAW;EACX,UAAU;EACV;CACD,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { DevWallet } from "../wallet/dev-wallet.mjs";
2
+ import * as react0 from "react";
3
+ import { ReactNode } from "react";
4
+
5
+ //#region src/react/context.d.ts
6
+ declare const DevWalletContext: react0.Context<DevWallet | null>;
7
+ interface DevWalletProviderProps {
8
+ wallet: DevWallet;
9
+ children?: ReactNode;
10
+ }
11
+ declare function DevWalletProvider({
12
+ wallet,
13
+ children
14
+ }: DevWalletProviderProps): react0.FunctionComponentElement<react0.ProviderProps<DevWallet | null>>;
15
+ /**
16
+ * @param wallet - If provided, context is bypassed.
17
+ * @throws If no wallet is provided and no DevWalletProvider is in the tree.
18
+ */
19
+ declare function useDevWalletInstance(wallet?: DevWallet): DevWallet;
20
+ //#endregion
21
+ export { DevWalletContext, DevWalletProvider, DevWalletProviderProps, useDevWalletInstance };
22
+ //# sourceMappingURL=context.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.mts","names":[],"sources":["../../src/react/context.ts"],"mappings":";;;;;cAQa,gBAAA,EAAgB,MAAA,CAAA,OAAA,CAAA,SAAA;AAAA,UAEZ,sBAAA;EAChB,MAAA,EAAQ,SAAA;EACR,QAAA,GAAW,SAAA;AAAA;AAAA,iBAGI,iBAAA,CAAA;EAAoB,MAAA;EAAQ;AAAA,GAAY,sBAAA,GAAsB,MAAA,CAAA,wBAAA,CAAA,MAAA,CAAA,aAAA,CAAA,SAAA;;;AAL9E;;iBAagB,oBAAA,CAAqB,MAAA,GAAS,SAAA,GAAY,SAAA"}
@@ -0,0 +1,25 @@
1
+ import { createContext, createElement, useContext } from "react";
2
+
3
+ //#region src/react/context.ts
4
+ const DevWalletContext = createContext(null);
5
+ function DevWalletProvider({ wallet, children }) {
6
+ return createElement(DevWalletContext.Provider, { value: wallet }, children);
7
+ }
8
+ /**
9
+ * @param wallet - If provided, context is bypassed.
10
+ * @throws If no wallet is provided and no DevWalletProvider is in the tree.
11
+ */
12
+ function useDevWalletInstance(wallet) {
13
+ const contextValue = useContext(DevWalletContext);
14
+ if (wallet) {
15
+ return wallet;
16
+ }
17
+ if (!contextValue) {
18
+ throw new Error("Could not find DevWalletContext. Ensure that you have set up the DevWalletProvider.");
19
+ }
20
+ return contextValue;
21
+ }
22
+
23
+ //#endregion
24
+ export { DevWalletContext, DevWalletProvider, useDevWalletInstance };
25
+ //# sourceMappingURL=context.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.mjs","names":[],"sources":["../../src/react/context.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { createContext, createElement, useContext } from 'react';\nimport type { ReactNode } from 'react';\n\nimport type { DevWallet } from '../wallet/dev-wallet.js';\n\nexport const DevWalletContext = createContext<DevWallet | null>(null);\n\nexport interface DevWalletProviderProps {\n\twallet: DevWallet;\n\tchildren?: ReactNode;\n}\n\nexport function DevWalletProvider({ wallet, children }: DevWalletProviderProps) {\n\treturn createElement(DevWalletContext.Provider, { value: wallet }, children);\n}\n\n/**\n * @param wallet - If provided, context is bypassed.\n * @throws If no wallet is provided and no DevWalletProvider is in the tree.\n */\nexport function useDevWalletInstance(wallet?: DevWallet): DevWallet {\n\tconst contextValue = useContext(DevWalletContext);\n\n\tif (wallet) {\n\t\treturn wallet;\n\t}\n\n\tif (!contextValue) {\n\t\tthrow new Error(\n\t\t\t'Could not find DevWalletContext. Ensure that you have set up the DevWalletProvider.',\n\t\t);\n\t}\n\n\treturn contextValue;\n}\n"],"mappings":";;;AAQA,MAAa,mBAAmB,cAAgC,KAAK;AAOrE,SAAgB,kBAAkB,EAAE,QAAQ,YAAoC;AAC/E,QAAO,cAAc,iBAAiB,UAAU,EAAE,OAAO,QAAQ,EAAE,SAAS;;;;;;AAO7E,SAAgB,qBAAqB,QAA+B;CACnE,MAAM,eAAe,WAAW,iBAAiB;AAEjD,KAAI,QAAQ;AACX,SAAO;;AAGR,KAAI,CAAC,cAAc;AAClB,QAAM,IAAI,MACT,sFACA;;AAGF,QAAO"}
@@ -0,0 +1,4 @@
1
+ import { UseDevWalletOptions, UseDevWalletResult, useDevWallet } from "./useDevWallet.mjs";
2
+ import { DevWalletContext, DevWalletProvider, DevWalletProviderProps, useDevWalletInstance } from "./context.mjs";
3
+ import { DevWalletAccounts, DevWalletBalances, DevWalletNewAccount, DevWalletPanel, DevWalletSigning } from "./components.mjs";
4
+ export { DevWalletAccounts, DevWalletBalances, DevWalletContext, DevWalletNewAccount, DevWalletPanel, DevWalletProvider, type DevWalletProviderProps, DevWalletSigning, type UseDevWalletOptions, type UseDevWalletResult, useDevWallet, useDevWalletInstance };
@@ -0,0 +1,5 @@
1
+ import { useDevWallet } from "./useDevWallet.mjs";
2
+ import { DevWalletContext, DevWalletProvider, useDevWalletInstance } from "./context.mjs";
3
+ import { DevWalletAccounts, DevWalletBalances, DevWalletNewAccount, DevWalletPanel, DevWalletSigning } from "./components.mjs";
4
+
5
+ export { DevWalletAccounts, DevWalletBalances, DevWalletContext, DevWalletNewAccount, DevWalletPanel, DevWalletProvider, DevWalletSigning, useDevWallet, useDevWalletInstance };
@@ -0,0 +1,38 @@
1
+ import { DevWallet, DevWalletConfig } from "../wallet/dev-wallet.mjs";
2
+
3
+ //#region src/react/useDevWallet.d.ts
4
+ interface UseDevWalletOptions extends DevWalletConfig {
5
+ /** Whether to call adapter.initialize() automatically. Defaults to true. */
6
+ autoInitialize?: boolean;
7
+ /** Whether to create an initial account after initialization (if adapter supports it). Defaults to true. */
8
+ createInitialAccount?: boolean;
9
+ /** Whether to mount the floating wallet drawer UI. Defaults to true. */
10
+ mountUI?: boolean;
11
+ /** Container element for the UI drawer. Defaults to document.body. */
12
+ container?: HTMLElement;
13
+ }
14
+ interface UseDevWalletResult {
15
+ wallet: DevWallet | null;
16
+ /** Initialization error, if any (e.g. IndexedDB quota exceeded, adapter failure). */
17
+ error: Error | null;
18
+ /** True while the wallet is being initialized. */
19
+ loading: boolean;
20
+ }
21
+ /**
22
+ * React hook that initializes a DevWallet, registers it with the wallet-standard
23
+ * registry, and optionally mounts the wallet drawer UI.
24
+ *
25
+ * The adapters are captured on first render and used for the wallet's
26
+ * lifetime. Pass stable references (created outside the component or via useMemo).
27
+ *
28
+ * @example
29
+ * ```tsx
30
+ * const adapters = useMemo(() => [new InMemorySignerAdapter()], []);
31
+ *
32
+ * const wallet = useDevWallet({ adapters, networks: { devnet: 'https://fullnode.devnet.sui.io:443' } });
33
+ * ```
34
+ */
35
+ declare function useDevWallet(options: UseDevWalletOptions): UseDevWalletResult;
36
+ //#endregion
37
+ export { UseDevWalletOptions, UseDevWalletResult, useDevWallet };
38
+ //# sourceMappingURL=useDevWallet.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDevWallet.d.mts","names":[],"sources":["../../src/react/useDevWallet.ts"],"mappings":";;;UAQiB,mBAAA,SAA4B,eAAA;;EAE5C,cAAA;EAFoC;EAIpC,oBAAA;EAJ2D;EAM3D,OAAA;EAJA;EAMA,SAAA,GAAY,WAAA;AAAA;AAAA,UAGI,kBAAA;EAChB,MAAA,EAAQ,SAAA;EAJe;EAMvB,KAAA,EAAO,KAAA;EAHS;EAKhB,OAAA;AAAA;;;;;;;;;AAiBD;;;;;;iBAAgB,YAAA,CAAa,OAAA,EAAS,mBAAA,GAAsB,kBAAA"}
@@ -0,0 +1,89 @@
1
+ import { DevWallet } from "../wallet/dev-wallet.mjs";
2
+ import { mountDevWallet } from "../ui/mount.mjs";
3
+ import { useEffect, useMemo, useRef, useState } from "react";
4
+
5
+ //#region src/react/useDevWallet.ts
6
+ /**
7
+ * React hook that initializes a DevWallet, registers it with the wallet-standard
8
+ * registry, and optionally mounts the wallet drawer UI.
9
+ *
10
+ * The adapters are captured on first render and used for the wallet's
11
+ * lifetime. Pass stable references (created outside the component or via useMemo).
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * const adapters = useMemo(() => [new InMemorySignerAdapter()], []);
16
+ *
17
+ * const wallet = useDevWallet({ adapters, networks: { devnet: 'https://fullnode.devnet.sui.io:443' } });
18
+ * ```
19
+ */
20
+ function useDevWallet(options) {
21
+ const [wallet, setWallet] = useState(null);
22
+ const [error, setError] = useState(null);
23
+ const [loading, setLoading] = useState(true);
24
+ const optionsRef = useRef(options);
25
+ optionsRef.current = options;
26
+ useEffect(() => {
27
+ const { autoInitialize = true, createInitialAccount = true, mountUI = true, container, ...walletConfig } = optionsRef.current;
28
+ let cancelled = false;
29
+ let unregister;
30
+ let unmountUI;
31
+ let devWallet;
32
+ try {
33
+ devWallet = new DevWallet(walletConfig);
34
+ } catch (err) {
35
+ setError(err instanceof Error ? err : new Error(String(err)));
36
+ setLoading(false);
37
+ return;
38
+ }
39
+ async function setup() {
40
+ if (autoInitialize) {
41
+ await Promise.all(walletConfig.adapters.map((a) => a.initialize()));
42
+ }
43
+ if (cancelled) return;
44
+ if (createInitialAccount) {
45
+ const hasAccounts = walletConfig.adapters.some((a) => a.getAccounts().length > 0);
46
+ if (!hasAccounts) {
47
+ const creatableAdapter = walletConfig.adapters.find((a) => a.createAccount && a.getAccounts().length === 0);
48
+ if (creatableAdapter?.createAccount) {
49
+ await creatableAdapter.createAccount({ label: "Dev Account" });
50
+ }
51
+ }
52
+ }
53
+ if (cancelled) return;
54
+ unregister = devWallet.register();
55
+ if (mountUI && typeof document !== "undefined") {
56
+ unmountUI = mountDevWallet(devWallet, { container });
57
+ }
58
+ if (!cancelled) {
59
+ setWallet(devWallet);
60
+ setLoading(false);
61
+ }
62
+ }
63
+ setup().catch((err) => {
64
+ if (!cancelled) {
65
+ setError(err instanceof Error ? err : new Error(String(err)));
66
+ setLoading(false);
67
+ }
68
+ });
69
+ return () => {
70
+ cancelled = true;
71
+ unmountUI?.();
72
+ unregister?.();
73
+ devWallet.destroy();
74
+ };
75
+ }, []);
76
+ return useMemo(() => ({
77
+ wallet,
78
+ error,
79
+ loading
80
+ }), [
81
+ wallet,
82
+ error,
83
+ loading
84
+ ]);
85
+ }
86
+
87
+ //#endregion
88
+ export { useDevWallet };
89
+ //# sourceMappingURL=useDevWallet.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDevWallet.mjs","names":[],"sources":["../../src/react/useDevWallet.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { useEffect, useMemo, useRef, useState } from 'react';\n\nimport { mountDevWallet } from '../ui/mount.js';\nimport { DevWallet, type DevWalletConfig } from '../wallet/dev-wallet.js';\n\nexport interface UseDevWalletOptions extends DevWalletConfig {\n\t/** Whether to call adapter.initialize() automatically. Defaults to true. */\n\tautoInitialize?: boolean;\n\t/** Whether to create an initial account after initialization (if adapter supports it). Defaults to true. */\n\tcreateInitialAccount?: boolean;\n\t/** Whether to mount the floating wallet drawer UI. Defaults to true. */\n\tmountUI?: boolean;\n\t/** Container element for the UI drawer. Defaults to document.body. */\n\tcontainer?: HTMLElement;\n}\n\nexport interface UseDevWalletResult {\n\twallet: DevWallet | null;\n\t/** Initialization error, if any (e.g. IndexedDB quota exceeded, adapter failure). */\n\terror: Error | null;\n\t/** True while the wallet is being initialized. */\n\tloading: boolean;\n}\n\n/**\n * React hook that initializes a DevWallet, registers it with the wallet-standard\n * registry, and optionally mounts the wallet drawer UI.\n *\n * The adapters are captured on first render and used for the wallet's\n * lifetime. Pass stable references (created outside the component or via useMemo).\n *\n * @example\n * ```tsx\n * const adapters = useMemo(() => [new InMemorySignerAdapter()], []);\n *\n * const wallet = useDevWallet({ adapters, networks: { devnet: 'https://fullnode.devnet.sui.io:443' } });\n * ```\n */\nexport function useDevWallet(options: UseDevWalletOptions): UseDevWalletResult {\n\tconst [wallet, setWallet] = useState<DevWallet | null>(null);\n\tconst [error, setError] = useState<Error | null>(null);\n\tconst [loading, setLoading] = useState(true);\n\tconst optionsRef = useRef(options);\n\toptionsRef.current = options;\n\n\tuseEffect(() => {\n\t\tconst {\n\t\t\tautoInitialize = true,\n\t\t\tcreateInitialAccount = true,\n\t\t\tmountUI = true,\n\t\t\tcontainer,\n\t\t\t...walletConfig\n\t\t} = optionsRef.current;\n\n\t\tlet cancelled = false;\n\t\tlet unregister: (() => void) | undefined;\n\t\tlet unmountUI: (() => void) | undefined;\n\n\t\tlet devWallet: DevWallet;\n\t\ttry {\n\t\t\tdevWallet = new DevWallet(walletConfig);\n\t\t} catch (err) {\n\t\t\tsetError(err instanceof Error ? err : new Error(String(err)));\n\t\t\tsetLoading(false);\n\t\t\treturn;\n\t\t}\n\n\t\tasync function setup() {\n\t\t\tif (autoInitialize) {\n\t\t\t\tawait Promise.all(walletConfig.adapters.map((a) => a.initialize()));\n\t\t\t}\n\t\t\tif (cancelled) return;\n\n\t\t\tif (createInitialAccount) {\n\t\t\t\tconst hasAccounts = walletConfig.adapters.some((a) => a.getAccounts().length > 0);\n\t\t\t\tif (!hasAccounts) {\n\t\t\t\t\tconst creatableAdapter = walletConfig.adapters.find(\n\t\t\t\t\t\t(a) => a.createAccount && a.getAccounts().length === 0,\n\t\t\t\t\t);\n\t\t\t\t\tif (creatableAdapter?.createAccount) {\n\t\t\t\t\t\tawait creatableAdapter.createAccount({ label: 'Dev Account' });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (cancelled) return;\n\n\t\t\tunregister = devWallet.register();\n\n\t\t\tif (mountUI && typeof document !== 'undefined') {\n\t\t\t\tunmountUI = mountDevWallet(devWallet, { container });\n\t\t\t}\n\n\t\t\tif (!cancelled) {\n\t\t\t\tsetWallet(devWallet);\n\t\t\t\tsetLoading(false);\n\t\t\t}\n\t\t}\n\n\t\tsetup().catch((err) => {\n\t\t\tif (!cancelled) {\n\t\t\t\tsetError(err instanceof Error ? err : new Error(String(err)));\n\t\t\t\tsetLoading(false);\n\t\t\t}\n\t\t});\n\n\t\treturn () => {\n\t\t\tcancelled = true;\n\t\t\tunmountUI?.();\n\t\t\tunregister?.();\n\t\t\tdevWallet.destroy();\n\t\t};\n\t}, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n\treturn useMemo(() => ({ wallet, error, loading }), [wallet, error, loading]);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAyCA,SAAgB,aAAa,SAAkD;CAC9E,MAAM,CAAC,QAAQ,aAAa,SAA2B,KAAK;CAC5D,MAAM,CAAC,OAAO,YAAY,SAAuB,KAAK;CACtD,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAC5C,MAAM,aAAa,OAAO,QAAQ;AAClC,YAAW,UAAU;AAErB,iBAAgB;EACf,MAAM,EACL,iBAAiB,MACjB,uBAAuB,MACvB,UAAU,MACV,WACA,GAAG,iBACA,WAAW;EAEf,IAAI,YAAY;EAChB,IAAI;EACJ,IAAI;EAEJ,IAAI;AACJ,MAAI;AACH,eAAY,IAAI,UAAU,aAAa;WAC/B,KAAK;AACb,YAAS,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,IAAI,CAAC,CAAC;AAC7D,cAAW,MAAM;AACjB;;EAGD,eAAe,QAAQ;AACtB,OAAI,gBAAgB;AACnB,UAAM,QAAQ,IAAI,aAAa,SAAS,KAAK,MAAM,EAAE,YAAY,CAAC,CAAC;;AAEpE,OAAI,UAAW;AAEf,OAAI,sBAAsB;IACzB,MAAM,cAAc,aAAa,SAAS,MAAM,MAAM,EAAE,aAAa,CAAC,SAAS,EAAE;AACjF,QAAI,CAAC,aAAa;KACjB,MAAM,mBAAmB,aAAa,SAAS,MAC7C,MAAM,EAAE,iBAAiB,EAAE,aAAa,CAAC,WAAW,EACrD;AACD,SAAI,kBAAkB,eAAe;AACpC,YAAM,iBAAiB,cAAc,EAAE,OAAO,eAAe,CAAC;;;;AAIjE,OAAI,UAAW;AAEf,gBAAa,UAAU,UAAU;AAEjC,OAAI,WAAW,OAAO,aAAa,aAAa;AAC/C,gBAAY,eAAe,WAAW,EAAE,WAAW,CAAC;;AAGrD,OAAI,CAAC,WAAW;AACf,cAAU,UAAU;AACpB,eAAW,MAAM;;;AAInB,SAAO,CAAC,OAAO,QAAQ;AACtB,OAAI,CAAC,WAAW;AACf,aAAS,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,IAAI,CAAC,CAAC;AAC7D,eAAW,MAAM;;IAEjB;AAEF,eAAa;AACZ,eAAY;AACZ,gBAAa;AACb,iBAAc;AACd,aAAU,SAAS;;IAElB,EAAE,CAAC;AAEN,QAAO,eAAe;EAAE;EAAQ;EAAO;EAAS,GAAG;EAAC;EAAQ;EAAO;EAAQ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { Hono } from "hono";
2
+
3
+ //#region src/server/cli-signing-middleware.d.ts
4
+ interface CliSigningMiddlewareOptions {
5
+ /** The port the server is listening on, used for DNS rebinding protection. */
6
+ port: number;
7
+ }
8
+ interface CliSigningMiddlewareResult {
9
+ app: Hono;
10
+ token: string;
11
+ }
12
+ /**
13
+ * Create a Hono sub-app that exposes signing endpoints backed by the `sui` CLI.
14
+ *
15
+ * Uses token-in-URL auth: a 256-bit random token is embedded in the URL printed
16
+ * to the terminal and sent as `Authorization: Bearer <token>` on subsequent requests.
17
+ * All CLI calls use `execFile` to prevent shell injection.
18
+ */
19
+ declare function createCliSigningMiddleware(options: CliSigningMiddlewareOptions): CliSigningMiddlewareResult;
20
+ //#endregion
21
+ export { CliSigningMiddlewareOptions, CliSigningMiddlewareResult, createCliSigningMiddleware };
22
+ //# sourceMappingURL=cli-signing-middleware.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-signing-middleware.d.mts","names":[],"sources":["../../src/server/cli-signing-middleware.ts"],"mappings":";;;UAuBiB,2BAAA;;EAEhB,IAAA;AAAA;AAAA,UAGgB,0BAAA;EAChB,GAAA,EAAK,IAAA;EACL,KAAA;AAAA;;;;;;;;iBAUe,0BAAA,CACf,OAAA,EAAS,2BAAA,GACP,0BAAA"}
@@ -0,0 +1,117 @@
1
+ import { isValidSuiAddress } from "@mysten/sui/utils";
2
+ import { execFile } from "node:child_process";
3
+ import { randomBytes, timingSafeEqual } from "node:crypto";
4
+ import { promisify } from "node:util";
5
+ import { Hono } from "hono";
6
+
7
+ //#region src/server/cli-signing-middleware.ts
8
+ const execFileAsync = promisify(execFile);
9
+ function isValidBase64(value) {
10
+ if (typeof value !== "string" || value.length === 0) return false;
11
+ return /^[A-Za-z0-9+/]+=*$/.test(value) && value.length <= 1e6;
12
+ }
13
+ const MAX_BODY_SIZE = 2 * 1024 * 1024;
14
+ function generateToken() {
15
+ return randomBytes(32).toString("hex");
16
+ }
17
+ /**
18
+ * Create a Hono sub-app that exposes signing endpoints backed by the `sui` CLI.
19
+ *
20
+ * Uses token-in-URL auth: a 256-bit random token is embedded in the URL printed
21
+ * to the terminal and sent as `Authorization: Bearer <token>` on subsequent requests.
22
+ * All CLI calls use `execFile` to prevent shell injection.
23
+ */
24
+ function createCliSigningMiddleware(options) {
25
+ const { port } = options;
26
+ const token = generateToken();
27
+ function isAuthenticated(authHeader) {
28
+ if (!token) return false;
29
+ if (!authHeader || !/^bearer /i.test(authHeader)) return false;
30
+ const provided = authHeader.slice(7);
31
+ if (provided.length !== token.length) return false;
32
+ return timingSafeEqual(Buffer.from(provided), Buffer.from(token));
33
+ }
34
+ const app = new Hono();
35
+ app.use("*", async (c, next) => {
36
+ const host = c.req.header("host") ?? "";
37
+ const allowedHosts = new Set([
38
+ `localhost:${port}`,
39
+ `127.0.0.1:${port}`,
40
+ `[::1]:${port}`
41
+ ]);
42
+ if (host && !allowedHosts.has(host)) {
43
+ return c.json({ error: "Requests must originate from localhost." }, 403);
44
+ }
45
+ return await next();
46
+ });
47
+ app.use("/api/*", async (c, next) => {
48
+ if (!isAuthenticated(c.req.header("authorization"))) {
49
+ return c.json({ error: "Authentication required. Open the token URL from the terminal." }, 401);
50
+ }
51
+ return await next();
52
+ });
53
+ app.get("/api/v1/accounts", async (c) => {
54
+ try {
55
+ const { stdout } = await execFileAsync("sui", [
56
+ "keytool",
57
+ "list",
58
+ "--json"
59
+ ]);
60
+ const accounts = JSON.parse(stdout);
61
+ return c.json({ accounts });
62
+ } catch (err) {
63
+ const message = err instanceof Error ? err.message : String(err);
64
+ const isExecError = message.includes("ENOENT") || message.includes("not found");
65
+ return c.json({ error: isExecError ? "Failed to list accounts: sui CLI not found." : "Failed to list accounts." }, 500);
66
+ }
67
+ });
68
+ app.post("/api/v1/sign-transaction", async (c) => {
69
+ const contentLength = c.req.header("content-length");
70
+ if (contentLength && parseInt(contentLength, 10) > MAX_BODY_SIZE) {
71
+ return c.json({ error: "Request body too large" }, 413);
72
+ }
73
+ let body;
74
+ try {
75
+ body = await c.req.json();
76
+ } catch {
77
+ return c.json({ error: "Invalid JSON body" }, 400);
78
+ }
79
+ if (typeof body.address !== "string" || !isValidSuiAddress(body.address)) {
80
+ return c.json({ error: "Invalid address format. Expected 0x-prefixed hex." }, 400);
81
+ }
82
+ if (!isValidBase64(body.txBytes)) {
83
+ return c.json({ error: "Invalid txBytes. Expected non-empty base64 string." }, 400);
84
+ }
85
+ try {
86
+ const { stdout } = await execFileAsync("sui", [
87
+ "keytool",
88
+ "sign",
89
+ "--address",
90
+ body.address,
91
+ "--data",
92
+ body.txBytes,
93
+ "--json"
94
+ ]);
95
+ const result = JSON.parse(stdout);
96
+ return c.json({
97
+ suiSignature: result.suiSignature,
98
+ digest: result.digest
99
+ });
100
+ } catch (err) {
101
+ const message = err instanceof Error ? err.message : String(err);
102
+ console.error("[dev-wallet] CLI signing error:", message);
103
+ if (message.includes("not found") || message.includes("Cannot find key")) {
104
+ return c.json({ error: `Address not found in keystore: ${body.address}` }, 404);
105
+ }
106
+ return c.json({ error: "Signing failed due to a CLI error." }, 500);
107
+ }
108
+ });
109
+ return {
110
+ app,
111
+ token
112
+ };
113
+ }
114
+
115
+ //#endregion
116
+ export { createCliSigningMiddleware };
117
+ //# sourceMappingURL=cli-signing-middleware.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-signing-middleware.mjs","names":[],"sources":["../../src/server/cli-signing-middleware.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { execFile } from 'node:child_process';\nimport { randomBytes, timingSafeEqual } from 'node:crypto';\nimport { promisify } from 'node:util';\n\nimport { isValidSuiAddress } from '@mysten/sui/utils';\nimport { Hono } from 'hono';\n\nconst execFileAsync = promisify(execFile);\n\nfunction isValidBase64(value: unknown): value is string {\n\tif (typeof value !== 'string' || value.length === 0) return false;\n\treturn /^[A-Za-z0-9+/]+=*$/.test(value) && value.length <= 1_000_000;\n}\n\nconst MAX_BODY_SIZE = 2 * 1024 * 1024; // 2 MB\n\nfunction generateToken(): string {\n\treturn randomBytes(32).toString('hex');\n}\n\nexport interface CliSigningMiddlewareOptions {\n\t/** The port the server is listening on, used for DNS rebinding protection. */\n\tport: number;\n}\n\nexport interface CliSigningMiddlewareResult {\n\tapp: Hono;\n\ttoken: string;\n}\n\n/**\n * Create a Hono sub-app that exposes signing endpoints backed by the `sui` CLI.\n *\n * Uses token-in-URL auth: a 256-bit random token is embedded in the URL printed\n * to the terminal and sent as `Authorization: Bearer <token>` on subsequent requests.\n * All CLI calls use `execFile` to prevent shell injection.\n */\nexport function createCliSigningMiddleware(\n\toptions: CliSigningMiddlewareOptions,\n): CliSigningMiddlewareResult {\n\tconst { port } = options;\n\tconst token = generateToken();\n\n\tfunction isAuthenticated(authHeader: string | undefined): boolean {\n\t\tif (!token) return false;\n\t\tif (!authHeader || !/^bearer /i.test(authHeader)) return false;\n\t\tconst provided = authHeader.slice(7);\n\t\tif (provided.length !== token.length) return false;\n\t\treturn timingSafeEqual(Buffer.from(provided), Buffer.from(token));\n\t}\n\n\tconst app = new Hono();\n\n\t// DNS rebinding protection — reject non-localhost hosts\n\tapp.use('*', async (c, next) => {\n\t\tconst host = c.req.header('host') ?? '';\n\t\tconst allowedHosts = new Set([`localhost:${port}`, `127.0.0.1:${port}`, `[::1]:${port}`]);\n\t\tif (host && !allowedHosts.has(host)) {\n\t\t\treturn c.json({ error: 'Requests must originate from localhost.' }, 403);\n\t\t}\n\t\treturn await next();\n\t});\n\n\t// Token authentication for API routes\n\tapp.use('/api/*', async (c, next) => {\n\t\tif (!isAuthenticated(c.req.header('authorization'))) {\n\t\t\treturn c.json(\n\t\t\t\t{ error: 'Authentication required. Open the token URL from the terminal.' },\n\t\t\t\t401,\n\t\t\t);\n\t\t}\n\t\treturn await next();\n\t});\n\n\t// GET /api/v1/accounts — list accounts from sui CLI keystore\n\tapp.get('/api/v1/accounts', async (c) => {\n\t\ttry {\n\t\t\tconst { stdout } = await execFileAsync('sui', ['keytool', 'list', '--json']);\n\t\t\tconst accounts = JSON.parse(stdout);\n\t\t\treturn c.json({ accounts });\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\tconst isExecError = message.includes('ENOENT') || message.includes('not found');\n\t\t\treturn c.json(\n\t\t\t\t{\n\t\t\t\t\terror: isExecError\n\t\t\t\t\t\t? 'Failed to list accounts: sui CLI not found.'\n\t\t\t\t\t\t: 'Failed to list accounts.',\n\t\t\t\t},\n\t\t\t\t500,\n\t\t\t);\n\t\t}\n\t});\n\n\t// POST /api/v1/sign-transaction — sign BCS-serialized TransactionData\n\tapp.post('/api/v1/sign-transaction', async (c) => {\n\t\tconst contentLength = c.req.header('content-length');\n\t\tif (contentLength && parseInt(contentLength, 10) > MAX_BODY_SIZE) {\n\t\t\treturn c.json({ error: 'Request body too large' }, 413);\n\t\t}\n\n\t\tlet body: { address?: unknown; txBytes?: unknown };\n\t\ttry {\n\t\t\tbody = await c.req.json();\n\t\t} catch {\n\t\t\treturn c.json({ error: 'Invalid JSON body' }, 400);\n\t\t}\n\n\t\tif (typeof body.address !== 'string' || !isValidSuiAddress(body.address)) {\n\t\t\treturn c.json({ error: 'Invalid address format. Expected 0x-prefixed hex.' }, 400);\n\t\t}\n\n\t\tif (!isValidBase64(body.txBytes)) {\n\t\t\treturn c.json({ error: 'Invalid txBytes. Expected non-empty base64 string.' }, 400);\n\t\t}\n\n\t\ttry {\n\t\t\tconst { stdout } = await execFileAsync('sui', [\n\t\t\t\t'keytool',\n\t\t\t\t'sign',\n\t\t\t\t'--address',\n\t\t\t\tbody.address,\n\t\t\t\t'--data',\n\t\t\t\tbody.txBytes as string,\n\t\t\t\t'--json',\n\t\t\t]);\n\n\t\t\tconst result = JSON.parse(stdout);\n\t\t\treturn c.json({ suiSignature: result.suiSignature, digest: result.digest });\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\tconsole.error('[dev-wallet] CLI signing error:', message);\n\n\t\t\tif (message.includes('not found') || message.includes('Cannot find key')) {\n\t\t\t\treturn c.json({ error: `Address not found in keystore: ${body.address}` }, 404);\n\t\t\t}\n\n\t\t\treturn c.json({ error: 'Signing failed due to a CLI error.' }, 500);\n\t\t}\n\t});\n\n\treturn { app, token };\n}\n"],"mappings":";;;;;;;AAUA,MAAM,gBAAgB,UAAU,SAAS;AAEzC,SAAS,cAAc,OAAiC;AACvD,KAAI,OAAO,UAAU,YAAY,MAAM,WAAW,EAAG,QAAO;AAC5D,QAAO,qBAAqB,KAAK,MAAM,IAAI,MAAM,UAAU;;AAG5D,MAAM,gBAAgB,IAAI,OAAO;AAEjC,SAAS,gBAAwB;AAChC,QAAO,YAAY,GAAG,CAAC,SAAS,MAAM;;;;;;;;;AAoBvC,SAAgB,2BACf,SAC6B;CAC7B,MAAM,EAAE,SAAS;CACjB,MAAM,QAAQ,eAAe;CAE7B,SAAS,gBAAgB,YAAyC;AACjE,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,CAAC,cAAc,CAAC,YAAY,KAAK,WAAW,CAAE,QAAO;EACzD,MAAM,WAAW,WAAW,MAAM,EAAE;AACpC,MAAI,SAAS,WAAW,MAAM,OAAQ,QAAO;AAC7C,SAAO,gBAAgB,OAAO,KAAK,SAAS,EAAE,OAAO,KAAK,MAAM,CAAC;;CAGlE,MAAM,MAAM,IAAI,MAAM;AAGtB,KAAI,IAAI,KAAK,OAAO,GAAG,SAAS;EAC/B,MAAM,OAAO,EAAE,IAAI,OAAO,OAAO,IAAI;EACrC,MAAM,eAAe,IAAI,IAAI;GAAC,aAAa;GAAQ,aAAa;GAAQ,SAAS;GAAO,CAAC;AACzF,MAAI,QAAQ,CAAC,aAAa,IAAI,KAAK,EAAE;AACpC,UAAO,EAAE,KAAK,EAAE,OAAO,2CAA2C,EAAE,IAAI;;AAEzE,SAAO,MAAM,MAAM;GAClB;AAGF,KAAI,IAAI,UAAU,OAAO,GAAG,SAAS;AACpC,MAAI,CAAC,gBAAgB,EAAE,IAAI,OAAO,gBAAgB,CAAC,EAAE;AACpD,UAAO,EAAE,KACR,EAAE,OAAO,kEAAkE,EAC3E,IACA;;AAEF,SAAO,MAAM,MAAM;GAClB;AAGF,KAAI,IAAI,oBAAoB,OAAO,MAAM;AACxC,MAAI;GACH,MAAM,EAAE,WAAW,MAAM,cAAc,OAAO;IAAC;IAAW;IAAQ;IAAS,CAAC;GAC5E,MAAM,WAAW,KAAK,MAAM,OAAO;AACnC,UAAO,EAAE,KAAK,EAAE,UAAU,CAAC;WACnB,KAAK;GACb,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;GAChE,MAAM,cAAc,QAAQ,SAAS,SAAS,IAAI,QAAQ,SAAS,YAAY;AAC/E,UAAO,EAAE,KACR,EACC,OAAO,cACJ,gDACA,4BACH,EACD,IACA;;GAED;AAGF,KAAI,KAAK,4BAA4B,OAAO,MAAM;EACjD,MAAM,gBAAgB,EAAE,IAAI,OAAO,iBAAiB;AACpD,MAAI,iBAAiB,SAAS,eAAe,GAAG,GAAG,eAAe;AACjE,UAAO,EAAE,KAAK,EAAE,OAAO,0BAA0B,EAAE,IAAI;;EAGxD,IAAI;AACJ,MAAI;AACH,UAAO,MAAM,EAAE,IAAI,MAAM;UAClB;AACP,UAAO,EAAE,KAAK,EAAE,OAAO,qBAAqB,EAAE,IAAI;;AAGnD,MAAI,OAAO,KAAK,YAAY,YAAY,CAAC,kBAAkB,KAAK,QAAQ,EAAE;AACzE,UAAO,EAAE,KAAK,EAAE,OAAO,qDAAqD,EAAE,IAAI;;AAGnF,MAAI,CAAC,cAAc,KAAK,QAAQ,EAAE;AACjC,UAAO,EAAE,KAAK,EAAE,OAAO,sDAAsD,EAAE,IAAI;;AAGpF,MAAI;GACH,MAAM,EAAE,WAAW,MAAM,cAAc,OAAO;IAC7C;IACA;IACA;IACA,KAAK;IACL;IACA,KAAK;IACL;IACA,CAAC;GAEF,MAAM,SAAS,KAAK,MAAM,OAAO;AACjC,UAAO,EAAE,KAAK;IAAE,cAAc,OAAO;IAAc,QAAQ,OAAO;IAAQ,CAAC;WACnE,KAAK;GACb,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAChE,WAAQ,MAAM,mCAAmC,QAAQ;AAEzD,OAAI,QAAQ,SAAS,YAAY,IAAI,QAAQ,SAAS,kBAAkB,EAAE;AACzE,WAAO,EAAE,KAAK,EAAE,OAAO,kCAAkC,KAAK,WAAW,EAAE,IAAI;;AAGhF,UAAO,EAAE,KAAK,EAAE,OAAO,sCAAsC,EAAE,IAAI;;GAEnE;AAEF,QAAO;EAAE;EAAK;EAAO"}
@@ -0,0 +1,2 @@
1
+ import { CliSigningMiddlewareOptions, CliSigningMiddlewareResult, createCliSigningMiddleware } from "./cli-signing-middleware.mjs";
2
+ export { type CliSigningMiddlewareOptions, type CliSigningMiddlewareResult, createCliSigningMiddleware };
@@ -0,0 +1,3 @@
1
+ import { createCliSigningMiddleware } from "./cli-signing-middleware.mjs";
2
+
3
+ export { createCliSigningMiddleware };