@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,136 @@
1
+ // Copyright (c) Mysten Labs, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { css, html, LitElement } from 'lit';
5
+ import { customElement, property } from 'lit/decorators.js';
6
+
7
+ import type { DevWallet } from '../wallet/dev-wallet.js';
8
+ import { connectDialogStyles, sharedStyles } from './styles.js';
9
+ import { WalletController } from './wallet-controller.js';
10
+
11
+ @customElement('dev-wallet-standalone')
12
+ export class DevWalletStandalone extends LitElement {
13
+ static override styles = [
14
+ sharedStyles,
15
+ connectDialogStyles,
16
+ css`
17
+ :host {
18
+ display: flex;
19
+ justify-content: center;
20
+ padding: 24px 16px;
21
+ min-height: 100vh;
22
+ box-sizing: border-box;
23
+ }
24
+
25
+ .card {
26
+ width: 100%;
27
+ max-width: 480px;
28
+ border-radius: var(--dev-wallet-radius-xl);
29
+ background: var(--dev-wallet-background);
30
+ border: 1px solid var(--dev-wallet-border);
31
+ box-shadow: var(--dev-wallet-shadow-lg);
32
+ overflow: hidden;
33
+ display: flex;
34
+ flex-direction: column;
35
+ height: min(640px, calc(100vh - 48px));
36
+ }
37
+
38
+ .card-header {
39
+ display: flex;
40
+ justify-content: space-between;
41
+ align-items: center;
42
+ padding: 16px 20px;
43
+ border-bottom: 1px solid var(--dev-wallet-border);
44
+ }
45
+
46
+ .card-title {
47
+ font-size: 17px;
48
+ font-weight: var(--dev-wallet-font-weight-semibold);
49
+ color: var(--dev-wallet-foreground);
50
+ }
51
+
52
+ .header-right {
53
+ display: flex;
54
+ align-items: center;
55
+ gap: 8px;
56
+ }
57
+
58
+ .status-dot {
59
+ width: 8px;
60
+ height: 8px;
61
+ border-radius: 50%;
62
+ background: var(--dev-wallet-status-connected);
63
+ }
64
+
65
+ .status-text {
66
+ font-size: 11px;
67
+ color: var(--dev-wallet-muted-foreground);
68
+ }
69
+
70
+ .card-body {
71
+ padding: 16px 20px;
72
+ overflow-y: auto;
73
+ flex: 1;
74
+ }
75
+
76
+ .section {
77
+ margin-bottom: 16px;
78
+ }
79
+
80
+ .section:last-child {
81
+ margin-bottom: 0;
82
+ }
83
+ `,
84
+ ];
85
+
86
+ @property({ attribute: false })
87
+ wallet: DevWallet | null = null;
88
+
89
+ /** When set, the settings tab shows a bookmarklet section pointing to this origin. */
90
+ @property({ type: String })
91
+ bookmarkletOrigin = '';
92
+
93
+ #ctrl = new WalletController(this);
94
+
95
+ override willUpdate(changedProperties: Map<string, unknown>) {
96
+ if (changedProperties.has('wallet')) {
97
+ this.#ctrl.wallet = this.wallet;
98
+ }
99
+ if (changedProperties.has('bookmarkletOrigin')) {
100
+ this.#ctrl.bookmarkletOrigin = this.bookmarkletOrigin;
101
+ }
102
+ }
103
+
104
+ override updated() {
105
+ const dialog = this.shadowRoot?.querySelector<HTMLDialogElement>('.connect-dialog');
106
+ if (this.#ctrl.pendingConnect && dialog && !dialog.open) {
107
+ dialog.showModal();
108
+ } else if (!this.#ctrl.pendingConnect && dialog?.open) {
109
+ dialog.close();
110
+ }
111
+ }
112
+
113
+ override render() {
114
+ return html`
115
+ <div class="card" part="card">
116
+ <div class="card-header">
117
+ <span class="card-title">${this.wallet?.name ?? 'Dev Wallet'}</span>
118
+ <div class="header-right">
119
+ ${this.#ctrl.renderNetworkBadge()}
120
+ <span class="status-dot"></span>
121
+ <span class="status-text">Running</span>
122
+ </div>
123
+ </div>
124
+ <div class="card-body">${this.#ctrl.renderTabContent()}</div>
125
+ ${this.#ctrl.renderTabBar()}
126
+ </div>
127
+ ${this.#ctrl.renderSigningModal()} ${this.#ctrl.renderConnectPicker()}
128
+ `;
129
+ }
130
+ }
131
+
132
+ declare global {
133
+ interface HTMLElementTagNameMap {
134
+ 'dev-wallet-standalone': DevWalletStandalone;
135
+ }
136
+ }
@@ -0,0 +1,151 @@
1
+ // Copyright (c) Mysten Labs, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { css, html, LitElement } from 'lit';
5
+ import { customElement, property } from 'lit/decorators.js';
6
+
7
+ import { sharedStyles } from './styles.js';
8
+
9
+ export type TabId = 'assets' | 'objects' | 'settings';
10
+
11
+ @customElement('dev-wallet-tab-bar')
12
+ export class DevWalletTabBar extends LitElement {
13
+ static override styles = [
14
+ sharedStyles,
15
+ css`
16
+ :host {
17
+ display: block;
18
+ border-top: 1px solid var(--dev-wallet-border);
19
+ }
20
+
21
+ .tab-bar {
22
+ display: flex;
23
+ height: 40px;
24
+ }
25
+
26
+ .tab {
27
+ flex: 1;
28
+ display: flex;
29
+ align-items: center;
30
+ justify-content: center;
31
+ gap: 4px;
32
+ font-size: 11px;
33
+ font-weight: var(--dev-wallet-font-weight-medium);
34
+ color: var(--dev-wallet-muted-foreground);
35
+ transition: color 0.15s;
36
+ border-top: 2px solid transparent;
37
+ }
38
+
39
+ .tab:hover {
40
+ color: var(--dev-wallet-foreground);
41
+ }
42
+
43
+ .tab[aria-selected='true'] {
44
+ color: var(--dev-wallet-primary);
45
+ border-top-color: var(--dev-wallet-primary);
46
+ }
47
+
48
+ .tab svg {
49
+ width: 16px;
50
+ height: 16px;
51
+ }
52
+ `,
53
+ ];
54
+
55
+ @property({ type: String })
56
+ active: TabId = 'assets';
57
+
58
+ override render() {
59
+ return html`
60
+ <nav class="tab-bar" part="tab-bar" role="tablist" aria-label="Wallet navigation">
61
+ <button
62
+ class="tab"
63
+ part="tab"
64
+ role="tab"
65
+ aria-selected=${this.active === 'assets'}
66
+ tabindex=${this.active === 'assets' ? 0 : -1}
67
+ @click=${() => this.#select('assets')}
68
+ @keydown=${this.#handleKeydown}
69
+ >
70
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
71
+ <rect x="2" y="4" width="20" height="16" rx="2" />
72
+ <path d="M16 12h.01" />
73
+ </svg>
74
+ Assets
75
+ </button>
76
+ <button
77
+ class="tab"
78
+ part="tab"
79
+ role="tab"
80
+ aria-selected=${this.active === 'objects'}
81
+ tabindex=${this.active === 'objects' ? 0 : -1}
82
+ @click=${() => this.#select('objects')}
83
+ @keydown=${this.#handleKeydown}
84
+ >
85
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
86
+ <rect x="3" y="3" width="7" height="7" rx="1" />
87
+ <rect x="14" y="3" width="7" height="7" rx="1" />
88
+ <rect x="3" y="14" width="7" height="7" rx="1" />
89
+ <rect x="14" y="14" width="7" height="7" rx="1" />
90
+ </svg>
91
+ Objects
92
+ </button>
93
+ <button
94
+ class="tab"
95
+ part="tab"
96
+ role="tab"
97
+ aria-selected=${this.active === 'settings'}
98
+ tabindex=${this.active === 'settings' ? 0 : -1}
99
+ @click=${() => this.#select('settings')}
100
+ @keydown=${this.#handleKeydown}
101
+ >
102
+ <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
103
+ <circle cx="12" cy="12" r="3" />
104
+ <path
105
+ d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"
106
+ />
107
+ </svg>
108
+ Settings
109
+ </button>
110
+ </nav>
111
+ `;
112
+ }
113
+
114
+ #handleKeydown(e: KeyboardEvent) {
115
+ const tabs: TabId[] = ['assets', 'objects', 'settings'];
116
+ const currentIndex = tabs.indexOf(this.active);
117
+ let newIndex = -1;
118
+
119
+ if (e.key === 'ArrowRight') {
120
+ e.preventDefault();
121
+ newIndex = (currentIndex + 1) % tabs.length;
122
+ } else if (e.key === 'ArrowLeft') {
123
+ e.preventDefault();
124
+ newIndex = (currentIndex - 1 + tabs.length) % tabs.length;
125
+ }
126
+
127
+ if (newIndex !== -1) {
128
+ this.#select(tabs[newIndex]);
129
+ const buttons = this.shadowRoot?.querySelectorAll<HTMLButtonElement>('.tab');
130
+ buttons?.[newIndex]?.focus();
131
+ }
132
+ }
133
+
134
+ #select(tab: TabId) {
135
+ if (tab !== this.active) {
136
+ this.dispatchEvent(
137
+ new CustomEvent('tab-changed', {
138
+ bubbles: true,
139
+ composed: true,
140
+ detail: { tab },
141
+ }),
142
+ );
143
+ }
144
+ }
145
+ }
146
+
147
+ declare global {
148
+ interface HTMLElementTagNameMap {
149
+ 'dev-wallet-tab-bar': DevWalletTabBar;
150
+ }
151
+ }
@@ -0,0 +1,26 @@
1
+ // Copyright (c) Mysten Labs, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export { DevWalletPanel } from './dev-wallet-panel.js';
5
+ export { DevWalletAccounts } from './dev-wallet-accounts.js';
6
+ export { DevWalletBalances } from './dev-wallet-balances.js';
7
+ export { DevWalletConnect } from './dev-wallet-connect.js';
8
+ export { DevWalletNewAccount } from './dev-wallet-new-account.js';
9
+ export { DevWalletObjects } from './dev-wallet-objects.js';
10
+ export { DevWalletPopup } from './dev-wallet-popup.js';
11
+ export { DevWalletSettings } from './dev-wallet-settings.js';
12
+ export { DevWalletSigning } from './dev-wallet-signing.js';
13
+ export { DevWalletStandalone } from './dev-wallet-standalone.js';
14
+
15
+ /** @internal — not intended for direct use by consumers */
16
+ export { DevWalletSigningModal } from './dev-wallet-signing-modal.js';
17
+ /** @internal — not intended for direct use by consumers */
18
+ export { DevWalletAccountSelector } from './dev-wallet-account-selector.js';
19
+ /** @internal — not intended for direct use by consumers */
20
+ export { DevWalletDropdown } from './dev-wallet-dropdown.js';
21
+ /** @internal — not intended for direct use by consumers */
22
+ export { DevWalletNetworkBadge } from './dev-wallet-network-badge.js';
23
+ /** @internal — not intended for direct use by consumers */
24
+ export { DevWalletTabBar } from './dev-wallet-tab-bar.js';
25
+
26
+ export { mountDevWallet } from './mount.js';
@@ -0,0 +1,21 @@
1
+ // Copyright (c) Mysten Labs, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import type { DevWallet } from '../wallet/dev-wallet.js';
5
+ import './dev-wallet-panel.js';
6
+
7
+ /** @returns A cleanup function that removes the panel from the DOM. */
8
+ export function mountDevWallet(
9
+ wallet: DevWallet,
10
+ options?: { container?: HTMLElement },
11
+ ): () => void {
12
+ const container = options?.container ?? document.body;
13
+
14
+ const panel = document.createElement('dev-wallet-panel');
15
+ panel.wallet = wallet;
16
+ container.appendChild(panel);
17
+
18
+ return () => {
19
+ panel.remove();
20
+ };
21
+ }
@@ -0,0 +1,252 @@
1
+ // Copyright (c) Mysten Labs, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { css } from 'lit';
5
+
6
+ const resetStyles = css`
7
+ * {
8
+ box-sizing: border-box;
9
+ -webkit-font-smoothing: antialiased;
10
+ font-family: var(--dev-wallet-font-sans);
11
+ }
12
+
13
+ button {
14
+ appearance: none;
15
+ background-color: transparent;
16
+ font-size: inherit;
17
+ font-family: inherit;
18
+ color: inherit;
19
+ border: 0;
20
+ padding: 0;
21
+ margin: 0;
22
+ cursor: pointer;
23
+ outline-color: color-mix(in oklab, var(--dev-wallet-ring) 50%, transparent);
24
+ }
25
+
26
+ p,
27
+ h1,
28
+ h2,
29
+ h3 {
30
+ margin: 0;
31
+ color: var(--dev-wallet-foreground);
32
+ }
33
+
34
+ :focus-visible {
35
+ outline: 2px solid var(--dev-wallet-ring);
36
+ outline-offset: 2px;
37
+ }
38
+ `;
39
+
40
+ const themeStyles = css`
41
+ :host {
42
+ /* Colors — OKLch dark theme */
43
+ --dev-wallet-background: oklch(0.175 0.028 283);
44
+ --dev-wallet-foreground: oklch(0.91 0 0);
45
+ --dev-wallet-primary: oklch(0.55 0.24 265);
46
+ --dev-wallet-primary-foreground: oklch(0.98 0 0);
47
+ --dev-wallet-secondary: oklch(0.195 0.04 262);
48
+ --dev-wallet-secondary-foreground: oklch(0.91 0 0);
49
+ --dev-wallet-muted: oklch(0.25 0.035 280);
50
+ --dev-wallet-muted-foreground: oklch(0.62 0.04 280);
51
+ --dev-wallet-destructive: oklch(0.63 0.26 25);
52
+ --dev-wallet-positive: oklch(0.72 0.19 145);
53
+ --dev-wallet-warning: oklch(0.79 0.17 75);
54
+ --dev-wallet-border: oklch(0.25 0.035 280);
55
+ --dev-wallet-input: oklch(0.25 0.035 280);
56
+ --dev-wallet-ring: oklch(0.55 0.24 265);
57
+ --dev-wallet-status-connected: #22c55e;
58
+ --dev-wallet-status-disconnected: #6b7280;
59
+
60
+ /* Radius scale — derived from base */
61
+ --dev-wallet-radius: 12px;
62
+ --dev-wallet-radius-xs: calc(var(--dev-wallet-radius) - 6px);
63
+ --dev-wallet-radius-sm: calc(var(--dev-wallet-radius) - 4px);
64
+ --dev-wallet-radius-md: calc(var(--dev-wallet-radius) - 2px);
65
+ --dev-wallet-radius-xl: calc(var(--dev-wallet-radius) + 4px);
66
+ --dev-wallet-radius-2xs: 3px;
67
+
68
+ /* Shadows */
69
+ --dev-wallet-shadow-sm: 0 1px 3px color-mix(in oklab, oklch(0 0 0) 10%, transparent);
70
+ --dev-wallet-shadow-md: 0 4px 12px color-mix(in oklab, oklch(0 0 0) 30%, transparent);
71
+
72
+ /* Typography */
73
+ --dev-wallet-font-sans:
74
+ ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
75
+ 'Helvetica Neue', Arial, sans-serif;
76
+ --dev-wallet-font-weight-medium: 500;
77
+ --dev-wallet-font-weight-semibold: 600;
78
+ --dev-wallet-font-mono:
79
+ ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;
80
+
81
+ /* Font-size scale */
82
+ --dev-wallet-text-2xs: 10px;
83
+ --dev-wallet-text-xs: 11px;
84
+ --dev-wallet-text-sm: 12px;
85
+ --dev-wallet-text-base: 13px;
86
+ --dev-wallet-text-md: 14px;
87
+ --dev-wallet-text-lg: 15px;
88
+ --dev-wallet-text-xl: 16px;
89
+ --dev-wallet-shadow-lg: 0 8px 32px color-mix(in oklab, oklch(0 0 0) 40%, transparent);
90
+ }
91
+ `;
92
+
93
+ export const dropdownItemStyles = css`
94
+ .dropdown-item {
95
+ display: flex;
96
+ align-items: center;
97
+ gap: 8px;
98
+ width: 100%;
99
+ padding: 8px 10px;
100
+ font-size: 12px;
101
+ color: var(--dev-wallet-foreground);
102
+ text-align: left;
103
+ }
104
+
105
+ .dropdown-item:hover {
106
+ background: var(--dev-wallet-secondary);
107
+ }
108
+
109
+ .dropdown-item[aria-selected='true'] {
110
+ font-weight: var(--dev-wallet-font-weight-semibold);
111
+ }
112
+ `;
113
+
114
+ export const connectDialogStyles = css`
115
+ .connect-dialog {
116
+ width: 360px;
117
+ max-height: min(600px, 80vh);
118
+ border-radius: var(--dev-wallet-radius-xl);
119
+ background: var(--dev-wallet-background);
120
+ border: 1px solid var(--dev-wallet-border);
121
+ box-shadow: var(--dev-wallet-shadow-lg);
122
+ overflow: hidden;
123
+ display: flex;
124
+ flex-direction: column;
125
+ padding: 0;
126
+ color: inherit;
127
+ }
128
+
129
+ .connect-dialog::backdrop {
130
+ background: color-mix(in oklab, oklch(0 0 0) 50%, transparent);
131
+ }
132
+
133
+ .connect-dialog-header {
134
+ display: flex;
135
+ justify-content: space-between;
136
+ align-items: center;
137
+ padding: 14px 16px;
138
+ border-bottom: 1px solid var(--dev-wallet-border);
139
+ }
140
+
141
+ .connect-dialog-title {
142
+ font-size: 15px;
143
+ font-weight: var(--dev-wallet-font-weight-semibold);
144
+ color: var(--dev-wallet-foreground);
145
+ }
146
+ `;
147
+
148
+ export const actionButtonStyles = css`
149
+ .actions {
150
+ display: flex;
151
+ gap: 8px;
152
+ }
153
+
154
+ .btn {
155
+ flex: 1;
156
+ padding: 10px 16px;
157
+ border-radius: var(--dev-wallet-radius-md);
158
+ font-size: 13px;
159
+ font-weight: var(--dev-wallet-font-weight-semibold);
160
+ transition: background-color 0.15s;
161
+ }
162
+
163
+ .btn-approve {
164
+ background: var(--dev-wallet-positive);
165
+ color: var(--dev-wallet-primary-foreground);
166
+ }
167
+
168
+ .btn-approve:hover {
169
+ background: oklab(from var(--dev-wallet-positive) calc(l - 0.03) a b);
170
+ }
171
+
172
+ .btn-reject {
173
+ background: var(--dev-wallet-destructive);
174
+ color: var(--dev-wallet-primary-foreground);
175
+ }
176
+
177
+ .btn-reject:hover {
178
+ background: oklab(from var(--dev-wallet-destructive) calc(l - 0.05) a b);
179
+ }
180
+
181
+ .btn-cancel {
182
+ background: var(--dev-wallet-secondary);
183
+ color: var(--dev-wallet-foreground);
184
+ border: 1px solid var(--dev-wallet-border);
185
+ }
186
+
187
+ .btn-cancel:hover {
188
+ background: oklab(from var(--dev-wallet-secondary) calc(l - 0.02) a b);
189
+ }
190
+
191
+ .btn-create {
192
+ background: var(--dev-wallet-primary);
193
+ color: var(--dev-wallet-primary-foreground);
194
+ }
195
+
196
+ .btn-create:hover {
197
+ background: oklab(from var(--dev-wallet-primary) calc(l - 0.03) a b);
198
+ }
199
+
200
+ .btn-create:disabled,
201
+ .btn-approve:disabled {
202
+ opacity: 0.5;
203
+ cursor: not-allowed;
204
+ }
205
+ `;
206
+
207
+ export const stateStyles = css`
208
+ .loading,
209
+ .empty-state,
210
+ .error-state {
211
+ text-align: center;
212
+ padding: 16px;
213
+ font-size: 13px;
214
+ }
215
+
216
+ .loading {
217
+ color: var(--dev-wallet-muted-foreground);
218
+ }
219
+
220
+ .empty-state {
221
+ color: var(--dev-wallet-muted-foreground);
222
+ }
223
+
224
+ .error-state {
225
+ color: var(--dev-wallet-destructive);
226
+ }
227
+ `;
228
+
229
+ export const sectionHeaderStyles = css`
230
+ .section-header {
231
+ font-size: 13px;
232
+ font-weight: var(--dev-wallet-font-weight-semibold);
233
+ color: var(--dev-wallet-muted-foreground);
234
+ text-transform: uppercase;
235
+ letter-spacing: 0.5px;
236
+ margin-bottom: 12px;
237
+ }
238
+ `;
239
+
240
+ const reducedMotionStyles = css`
241
+ @media (prefers-reduced-motion: reduce) {
242
+ *,
243
+ *::before,
244
+ *::after {
245
+ animation-duration: 0.01ms !important;
246
+ animation-iteration-count: 1 !important;
247
+ transition-duration: 0.01ms !important;
248
+ }
249
+ }
250
+ `;
251
+
252
+ export const sharedStyles = [resetStyles, themeStyles, reducedMotionStyles];
@@ -0,0 +1,60 @@
1
+ // Copyright (c) Mysten Labs, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import type { ClientWithCoreApi } from '@mysten/sui/client';
5
+ import type { AnalyzedCommand, CoinFlow } from '@mysten/wallet-sdk';
6
+ import { analyze, analyzers } from '@mysten/wallet-sdk';
7
+
8
+ export interface TransactionAnalysis {
9
+ commands: AnalyzedCommand[];
10
+ coinFlows: CoinFlow[] | null;
11
+ }
12
+
13
+ type AnalysisResult =
14
+ | { kind: 'rich'; analysis: TransactionAnalysis }
15
+ | { kind: 'error'; message: string };
16
+
17
+ export async function analyzeTransaction(
18
+ txData: string,
19
+ client?: ClientWithCoreApi | null,
20
+ ): Promise<AnalysisResult> {
21
+ if (!client) {
22
+ return { kind: 'error', message: 'No client available to analyze transaction' };
23
+ }
24
+
25
+ try {
26
+ const result = await analyze(
27
+ { commands: analyzers.commands, coinFlows: analyzers.coinFlows },
28
+ { client, transaction: txData },
29
+ );
30
+ if (result.commands.result) {
31
+ return {
32
+ kind: 'rich',
33
+ analysis: {
34
+ commands: result.commands.result,
35
+ coinFlows: result.coinFlows.result?.outflows ?? null,
36
+ },
37
+ };
38
+ }
39
+
40
+ const issues = result.commands.issues ?? result.coinFlows.issues ?? [];
41
+ if (issues.length > 0) {
42
+ return {
43
+ kind: 'error',
44
+ message: issues.map((i: { message: string }) => i.message).join('\n'),
45
+ };
46
+ }
47
+ return { kind: 'error', message: 'Transaction analysis returned no results' };
48
+ } catch (e) {
49
+ const raw = e instanceof Error ? e.message : String(e);
50
+ let message: string;
51
+ if (raw.includes('fetch') || raw.includes('network') || raw.includes('ECONNREFUSED')) {
52
+ message = `Network error: ${raw}`;
53
+ } else if (raw.includes('deserialize') || raw.includes('BCS') || raw.includes('parse')) {
54
+ message = `Invalid transaction data: ${raw}`;
55
+ } else {
56
+ message = raw;
57
+ }
58
+ return { kind: 'error', message };
59
+ }
60
+ }