@mysten-incubation/dev-wallet 0.0.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/CHANGELOG.md +139 -0
  2. package/LICENSE +189 -0
  3. package/dist/_virtual/{_@oxc-project_runtime@0.107.0 → _@oxc-project_runtime@0.127.0}/helpers/decorate.mjs +2 -3
  4. package/dist/adapters/base-adapter.mjs +6 -7
  5. package/dist/adapters/base-adapter.mjs.map +1 -1
  6. package/dist/adapters/browser.d.mts +4 -1
  7. package/dist/adapters/browser.mjs +4 -2
  8. package/dist/adapters/build-managed-account.mjs +8 -10
  9. package/dist/adapters/build-managed-account.mjs.map +1 -1
  10. package/dist/adapters/devstack-adapter.d.mts +111 -0
  11. package/dist/adapters/devstack-adapter.d.mts.map +1 -0
  12. package/dist/adapters/devstack-adapter.mjs +224 -0
  13. package/dist/adapters/devstack-adapter.mjs.map +1 -0
  14. package/dist/adapters/devstack-paths.d.mts +11 -0
  15. package/dist/adapters/devstack-paths.d.mts.map +1 -0
  16. package/dist/adapters/devstack-paths.mjs +11 -0
  17. package/dist/adapters/devstack-paths.mjs.map +1 -0
  18. package/dist/adapters/fork-relay.d.mts +109 -0
  19. package/dist/adapters/fork-relay.d.mts.map +1 -0
  20. package/dist/adapters/fork-relay.mjs +208 -0
  21. package/dist/adapters/fork-relay.mjs.map +1 -0
  22. package/dist/adapters/idb-store.mjs +12 -16
  23. package/dist/adapters/idb-store.mjs.map +1 -1
  24. package/dist/adapters/in-memory-adapter.mjs +4 -10
  25. package/dist/adapters/in-memory-adapter.mjs.map +1 -1
  26. package/dist/adapters/passkey-adapter.mjs +4 -12
  27. package/dist/adapters/passkey-adapter.mjs.map +1 -1
  28. package/dist/adapters/remote-cli-adapter.mjs +37 -72
  29. package/dist/adapters/remote-cli-adapter.mjs.map +1 -1
  30. package/dist/adapters/webcrypto-adapter.mjs +2 -4
  31. package/dist/adapters/webcrypto-adapter.mjs.map +1 -1
  32. package/dist/bin/cli.mjs +9 -22
  33. package/dist/bin/cli.mjs.map +1 -1
  34. package/dist/client/dev-wallet-client.mjs +13 -28
  35. package/dist/client/dev-wallet-client.mjs.map +1 -1
  36. package/dist/client/index.mjs +1 -2
  37. package/dist/client/request-handler.mjs +36 -42
  38. package/dist/client/request-handler.mjs.map +1 -1
  39. package/dist/index.mjs +1 -2
  40. package/dist/react/components.d.mts +9 -9
  41. package/dist/react/components.d.mts.map +1 -1
  42. package/dist/react/components.mjs +2 -5
  43. package/dist/react/components.mjs.map +1 -1
  44. package/dist/react/context.d.mts +3 -3
  45. package/dist/react/context.d.mts.map +1 -1
  46. package/dist/react/context.mjs +3 -8
  47. package/dist/react/context.mjs.map +1 -1
  48. package/dist/react/index.mjs +1 -2
  49. package/dist/react/useDevWallet.d.mts +3 -0
  50. package/dist/react/useDevWallet.d.mts.map +1 -1
  51. package/dist/react/useDevWallet.mjs +9 -14
  52. package/dist/react/useDevWallet.mjs.map +1 -1
  53. package/dist/server/cli-signing-middleware.mjs +7 -20
  54. package/dist/server/cli-signing-middleware.mjs.map +1 -1
  55. package/dist/server/index.mjs +1 -2
  56. package/dist/standalone/assets/{in-memory-adapter-CBF4h2KD.js → in-memory-adapter-qRkNfj9O.js} +1 -1
  57. package/dist/standalone/assets/main-DDltQnzR.js +3954 -0
  58. package/dist/standalone/assets/{webcrypto-adapter-DysAubFb.js → webcrypto-adapter-FejcrL9x.js} +1 -1
  59. package/dist/standalone/index.html +11 -12
  60. package/dist/ui/copy-controller.mjs +3 -3
  61. package/dist/ui/copy-controller.mjs.map +1 -1
  62. package/dist/ui/dev-wallet-account-selector.d.mts +3 -4
  63. package/dist/ui/dev-wallet-account-selector.d.mts.map +1 -1
  64. package/dist/ui/dev-wallet-account-selector.mjs +48 -25
  65. package/dist/ui/dev-wallet-account-selector.mjs.map +1 -1
  66. package/dist/ui/dev-wallet-accounts.d.mts +9 -4
  67. package/dist/ui/dev-wallet-accounts.d.mts.map +1 -1
  68. package/dist/ui/dev-wallet-accounts.mjs +62 -140
  69. package/dist/ui/dev-wallet-accounts.mjs.map +1 -1
  70. package/dist/ui/dev-wallet-balances.d.mts +10 -3
  71. package/dist/ui/dev-wallet-balances.d.mts.map +1 -1
  72. package/dist/ui/dev-wallet-balances.mjs +241 -43
  73. package/dist/ui/dev-wallet-balances.mjs.map +1 -1
  74. package/dist/ui/dev-wallet-connect.d.mts +3 -3
  75. package/dist/ui/dev-wallet-connect.d.mts.map +1 -1
  76. package/dist/ui/dev-wallet-connect.mjs +24 -16
  77. package/dist/ui/dev-wallet-connect.mjs.map +1 -1
  78. package/dist/ui/dev-wallet-dropdown.d.mts +3 -3
  79. package/dist/ui/dev-wallet-dropdown.d.mts.map +1 -1
  80. package/dist/ui/dev-wallet-dropdown.mjs +37 -47
  81. package/dist/ui/dev-wallet-dropdown.mjs.map +1 -1
  82. package/dist/ui/dev-wallet-fork-panel.d.mts +43 -0
  83. package/dist/ui/dev-wallet-fork-panel.d.mts.map +1 -0
  84. package/dist/ui/dev-wallet-fork-panel.mjs +500 -0
  85. package/dist/ui/dev-wallet-fork-panel.mjs.map +1 -0
  86. package/dist/ui/dev-wallet-network-badge.d.mts +3 -4
  87. package/dist/ui/dev-wallet-network-badge.d.mts.map +1 -1
  88. package/dist/ui/dev-wallet-network-badge.mjs +52 -21
  89. package/dist/ui/dev-wallet-network-badge.mjs.map +1 -1
  90. package/dist/ui/dev-wallet-new-account.d.mts +3 -4
  91. package/dist/ui/dev-wallet-new-account.d.mts.map +1 -1
  92. package/dist/ui/dev-wallet-new-account.mjs +31 -105
  93. package/dist/ui/dev-wallet-new-account.mjs.map +1 -1
  94. package/dist/ui/dev-wallet-objects.d.mts +3 -3
  95. package/dist/ui/dev-wallet-objects.d.mts.map +1 -1
  96. package/dist/ui/dev-wallet-objects.mjs +76 -39
  97. package/dist/ui/dev-wallet-objects.mjs.map +1 -1
  98. package/dist/ui/dev-wallet-panel.d.mts +24 -4
  99. package/dist/ui/dev-wallet-panel.d.mts.map +1 -1
  100. package/dist/ui/dev-wallet-panel.mjs +247 -64
  101. package/dist/ui/dev-wallet-panel.mjs.map +1 -1
  102. package/dist/ui/dev-wallet-popup.d.mts +3 -5
  103. package/dist/ui/dev-wallet-popup.d.mts.map +1 -1
  104. package/dist/ui/dev-wallet-popup.mjs +19 -15
  105. package/dist/ui/dev-wallet-popup.mjs.map +1 -1
  106. package/dist/ui/dev-wallet-settings.d.mts +3 -4
  107. package/dist/ui/dev-wallet-settings.d.mts.map +1 -1
  108. package/dist/ui/dev-wallet-settings.mjs +149 -97
  109. package/dist/ui/dev-wallet-settings.mjs.map +1 -1
  110. package/dist/ui/dev-wallet-signing-modal.d.mts +11 -4
  111. package/dist/ui/dev-wallet-signing-modal.d.mts.map +1 -1
  112. package/dist/ui/dev-wallet-signing-modal.mjs +46 -18
  113. package/dist/ui/dev-wallet-signing-modal.mjs.map +1 -1
  114. package/dist/ui/dev-wallet-signing.d.mts +9 -3
  115. package/dist/ui/dev-wallet-signing.d.mts.map +1 -1
  116. package/dist/ui/dev-wallet-signing.mjs +119 -130
  117. package/dist/ui/dev-wallet-signing.mjs.map +1 -1
  118. package/dist/ui/dev-wallet-standalone.d.mts +8 -3
  119. package/dist/ui/dev-wallet-standalone.d.mts.map +1 -1
  120. package/dist/ui/dev-wallet-standalone.mjs +303 -38
  121. package/dist/ui/dev-wallet-standalone.mjs.map +1 -1
  122. package/dist/ui/dev-wallet-tab-bar.d.mts +13 -5
  123. package/dist/ui/dev-wallet-tab-bar.d.mts.map +1 -1
  124. package/dist/ui/dev-wallet-tab-bar.mjs +143 -82
  125. package/dist/ui/dev-wallet-tab-bar.mjs.map +1 -1
  126. package/dist/ui/index.d.mts +3 -2
  127. package/dist/ui/index.mjs +2 -2
  128. package/dist/ui/mount.d.mts +14 -1
  129. package/dist/ui/mount.d.mts.map +1 -1
  130. package/dist/ui/mount.mjs +5 -2
  131. package/dist/ui/mount.mjs.map +1 -1
  132. package/dist/ui/styles.mjs +428 -66
  133. package/dist/ui/styles.mjs.map +1 -1
  134. package/dist/ui/transaction-analyzer.mjs +19 -30
  135. package/dist/ui/transaction-analyzer.mjs.map +1 -1
  136. package/dist/ui/utils.d.mts +59 -0
  137. package/dist/ui/utils.d.mts.map +1 -0
  138. package/dist/ui/utils.mjs +42 -15
  139. package/dist/ui/utils.mjs.map +1 -1
  140. package/dist/ui/wallet-controller.mjs +89 -20
  141. package/dist/ui/wallet-controller.mjs.map +1 -1
  142. package/dist/wallet/constants.d.mts +9 -0
  143. package/dist/wallet/constants.d.mts.map +1 -0
  144. package/dist/wallet/constants.mjs +1 -1
  145. package/dist/wallet/dev-wallet.mjs +42 -99
  146. package/dist/wallet/dev-wallet.mjs.map +1 -1
  147. package/dist/wallet/initializer.d.mts +3 -0
  148. package/dist/wallet/initializer.d.mts.map +1 -1
  149. package/dist/wallet/initializer.mjs +9 -14
  150. package/dist/wallet/initializer.mjs.map +1 -1
  151. package/dist/wallet/signing.mjs +8 -21
  152. package/dist/wallet/signing.mjs.map +1 -1
  153. package/package.json +8 -6
  154. package/src/adapters/browser.ts +21 -0
  155. package/src/adapters/devstack-adapter.ts +342 -0
  156. package/src/adapters/devstack-paths.ts +15 -0
  157. package/src/adapters/fork-relay.ts +321 -0
  158. package/src/app/index.html +10 -11
  159. package/src/react/useDevWallet.ts +5 -1
  160. package/src/ui/dev-wallet-account-selector.ts +44 -17
  161. package/src/ui/dev-wallet-accounts.ts +87 -124
  162. package/src/ui/dev-wallet-balances.ts +248 -27
  163. package/src/ui/dev-wallet-connect.ts +19 -8
  164. package/src/ui/dev-wallet-dropdown.ts +7 -5
  165. package/src/ui/dev-wallet-fork-panel.ts +591 -0
  166. package/src/ui/dev-wallet-network-badge.ts +49 -10
  167. package/src/ui/dev-wallet-new-account.ts +21 -62
  168. package/src/ui/dev-wallet-objects.ts +59 -19
  169. package/src/ui/dev-wallet-panel.ts +261 -42
  170. package/src/ui/dev-wallet-popup.ts +12 -6
  171. package/src/ui/dev-wallet-settings.ts +159 -94
  172. package/src/ui/dev-wallet-signing-modal.ts +47 -7
  173. package/src/ui/dev-wallet-signing.ts +124 -97
  174. package/src/ui/dev-wallet-standalone.ts +310 -22
  175. package/src/ui/dev-wallet-tab-bar.ts +132 -70
  176. package/src/ui/index.ts +3 -0
  177. package/src/ui/mount.ts +23 -1
  178. package/src/ui/styles.ts +434 -58
  179. package/src/ui/utils.ts +66 -0
  180. package/src/ui/wallet-controller.ts +103 -5
  181. package/src/wallet/initializer.ts +7 -1
  182. package/dist/standalone/assets/main-VE4olb-Q.js +0 -2841
@@ -1,53 +1,61 @@
1
1
  import { sharedStyles } from "./styles.mjs";
2
2
  import { emitEvent } from "./utils.mjs";
3
- import { __decorate } from "../_virtual/_@oxc-project_runtime@0.107.0/helpers/decorate.mjs";
3
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.mjs";
4
4
  import "./dev-wallet-signing.mjs";
5
5
  import { LitElement, css, html, nothing } from "lit";
6
6
  import { customElement, property } from "lit/decorators.js";
7
-
8
7
  //#region src/ui/dev-wallet-signing-modal.ts
9
- let DevWalletSigningModal = class DevWalletSigningModal$1 extends LitElement {
8
+ let DevWalletSigningModal = class DevWalletSigningModal extends LitElement {
10
9
  constructor(..._args) {
11
10
  super(..._args);
12
11
  this.request = null;
13
12
  this.client = null;
13
+ this.coins = null;
14
14
  this.walletName = "Dev Wallet";
15
+ this.impersonation = false;
16
+ this.#handleDialogCancel = (e) => {
17
+ e.preventDefault();
18
+ emitEvent(this, "reject");
19
+ };
15
20
  }
16
21
  static {
17
22
  this.styles = [sharedStyles, css`
18
23
  :host {
19
24
  display: block;
25
+ pointer-events: auto;
20
26
  }
21
27
 
22
28
  dialog {
23
- width: 360px;
29
+ width: 440px;
24
30
  max-width: calc(100vw - 32px);
25
- max-height: min(600px, 80vh);
31
+ max-height: min(680px, 86vh);
26
32
  border-radius: var(--dev-wallet-radius-xl);
27
- background: var(--dev-wallet-background);
28
- border: 1px solid var(--dev-wallet-border);
33
+ background: var(--dev-wallet-surface);
34
+ border: 1px solid var(--dev-wallet-border-2);
29
35
  box-shadow: var(--dev-wallet-shadow-lg);
30
36
  overflow: hidden;
31
37
  display: flex;
32
38
  flex-direction: column;
33
39
  padding: 0;
34
40
  color: inherit;
41
+ pointer-events: auto;
35
42
  }
36
43
 
37
44
  dialog::backdrop {
38
- background: color-mix(in oklab, oklch(0 0 0) 50%, transparent);
45
+ background: rgba(2, 6, 14, 0.55);
39
46
  }
40
47
 
41
48
  .modal-header {
42
49
  display: flex;
43
50
  justify-content: space-between;
44
51
  align-items: center;
45
- padding: 14px 16px;
52
+ padding: 12px 14px;
46
53
  border-bottom: 1px solid var(--dev-wallet-border);
54
+ background: var(--dev-wallet-bg-1);
47
55
  }
48
56
 
49
57
  .modal-title {
50
- font-size: 15px;
58
+ font-size: 13px;
51
59
  font-weight: var(--dev-wallet-font-weight-semibold);
52
60
  color: var(--dev-wallet-foreground);
53
61
  }
@@ -58,17 +66,29 @@ let DevWalletSigningModal = class DevWalletSigningModal$1 extends LitElement {
58
66
  display: flex;
59
67
  flex-direction: column;
60
68
  }
69
+
70
+ /* Phase 4 P4.19 — footnote rendered when the active account
71
+ is in fork-mode impersonation. Visually distinct so users
72
+ don't conflate this with a real signature flow. */
73
+ .fork-footnote {
74
+ padding: 8px 16px;
75
+ background: rgba(234, 179, 8, 0.12);
76
+ border-top: 1px solid rgba(234, 179, 8, 0.35);
77
+ font-size: 11px;
78
+ color: var(--dev-wallet-muted-foreground);
79
+ line-height: 1.4;
80
+ }
81
+
82
+ .fork-footnote strong {
83
+ color: #92400e;
84
+ font-weight: var(--dev-wallet-font-weight-semibold);
85
+ }
61
86
  `];
62
87
  }
63
- #handleDialogCancel = (e) => {
64
- e.preventDefault();
65
- emitEvent(this, "reject");
66
- };
88
+ #handleDialogCancel;
67
89
  firstUpdated() {
68
90
  const dialog = this.shadowRoot?.querySelector("dialog");
69
- if (dialog && !dialog.open) {
70
- dialog.showModal();
71
- }
91
+ if (dialog && !dialog.open) dialog.showModal();
72
92
  dialog?.addEventListener("cancel", this.#handleDialogCancel);
73
93
  }
74
94
  disconnectedCallback() {
@@ -89,10 +109,16 @@ let DevWalletSigningModal = class DevWalletSigningModal$1 extends LitElement {
89
109
  exportparts="approve-button: signing-approve-button, reject-button: signing-reject-button, request-type: signing-request-type, empty-state: signing-empty-state, error-message: signing-error-message, footer: signing-footer"
90
110
  .request=${this.request}
91
111
  .client=${this.client}
112
+ .coins=${this.coins}
92
113
  @approve=${this.#handleApprove}
93
114
  @reject=${this.#handleReject}
94
115
  ></dev-wallet-signing>
95
116
  </div>
117
+ ${this.impersonation ? html`<div class="fork-footnote" part="fork-footnote">
118
+ <strong>Fork-only:</strong> this account is in <em>impersonation</em> mode. The fork
119
+ accepts the transaction with an empty signature (no real private key signs it), so it
120
+ would be rejected by mainnet / testnet / devnet validators.
121
+ </div>` : nothing}
96
122
  </dialog>
97
123
  `;
98
124
  }
@@ -107,9 +133,11 @@ let DevWalletSigningModal = class DevWalletSigningModal$1 extends LitElement {
107
133
  };
108
134
  __decorate([property({ attribute: false })], DevWalletSigningModal.prototype, "request", void 0);
109
135
  __decorate([property({ attribute: false })], DevWalletSigningModal.prototype, "client", void 0);
136
+ __decorate([property({ attribute: false })], DevWalletSigningModal.prototype, "coins", void 0);
110
137
  __decorate([property({ type: String })], DevWalletSigningModal.prototype, "walletName", void 0);
138
+ __decorate([property({ type: Boolean })], DevWalletSigningModal.prototype, "impersonation", void 0);
111
139
  DevWalletSigningModal = __decorate([customElement("dev-wallet-signing-modal")], DevWalletSigningModal);
112
-
113
140
  //#endregion
114
141
  export { DevWalletSigningModal };
142
+
115
143
  //# sourceMappingURL=dev-wallet-signing-modal.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"dev-wallet-signing-modal.mjs","names":["DevWalletSigningModal","#handleDialogCancel","#handleApprove","#handleReject"],"sources":["../../src/ui/dev-wallet-signing-modal.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ClientWithCoreApi } from '@mysten/sui/client';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport type { PendingSigningRequest } from '../wallet/dev-wallet.js';\nimport { sharedStyles } from './styles.js';\nimport { emitEvent } from './utils.js';\nimport './dev-wallet-signing.js';\n\n/**\n * A centered modal overlay for signing requests.\n *\n * Renders a backdrop and centered dialog containing the\n * `<dev-wallet-signing>` component. Dispatches `approve` and\n * `reject` events to the parent.\n */\n@customElement('dev-wallet-signing-modal')\nexport class DevWalletSigningModal extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t}\n\n\t\t\tdialog {\n\t\t\t\twidth: 360px;\n\t\t\t\tmax-width: calc(100vw - 32px);\n\t\t\t\tmax-height: min(600px, 80vh);\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xl);\n\t\t\t\tbackground: var(--dev-wallet-background);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbox-shadow: var(--dev-wallet-shadow-lg);\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tpadding: 0;\n\t\t\t\tcolor: inherit;\n\t\t\t}\n\n\t\t\tdialog::backdrop {\n\t\t\t\tbackground: color-mix(in oklab, oklch(0 0 0) 50%, transparent);\n\t\t\t}\n\n\t\t\t.modal-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t\tpadding: 14px 16px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.modal-title {\n\t\t\t\tfont-size: 15px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.modal-body {\n\t\t\t\tflex: 1;\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\trequest: PendingSigningRequest | null = null;\n\n\t@property({ attribute: false })\n\tclient: ClientWithCoreApi | null = null;\n\n\t@property({ type: String })\n\twalletName = 'Dev Wallet';\n\n\t#handleDialogCancel = (e: Event) => {\n\t\te.preventDefault();\n\t\temitEvent(this, 'reject');\n\t};\n\n\toverride firstUpdated() {\n\t\tconst dialog = this.shadowRoot?.querySelector('dialog');\n\t\tif (dialog && !dialog.open) {\n\t\t\tdialog.showModal();\n\t\t}\n\t\tdialog?.addEventListener('cancel', this.#handleDialogCancel);\n\t}\n\n\toverride disconnectedCallback() {\n\t\tsuper.disconnectedCallback();\n\t\tconst dialog = this.shadowRoot?.querySelector('dialog');\n\t\tdialog?.removeEventListener('cancel', this.#handleDialogCancel);\n\t\tif (dialog?.open) dialog.close();\n\t}\n\n\toverride render() {\n\t\tif (!this.request) return nothing;\n\n\t\treturn html`\n\t\t\t<dialog part=\"dialog\">\n\t\t\t\t<div class=\"modal-header\">\n\t\t\t\t\t<span class=\"modal-title\">${this.walletName}</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"modal-body\">\n\t\t\t\t\t<dev-wallet-signing\n\t\t\t\t\t\texportparts=\"approve-button: signing-approve-button, reject-button: signing-reject-button, request-type: signing-request-type, empty-state: signing-empty-state, error-message: signing-error-message, footer: signing-footer\"\n\t\t\t\t\t\t.request=${this.request}\n\t\t\t\t\t\t.client=${this.client}\n\t\t\t\t\t\t@approve=${this.#handleApprove}\n\t\t\t\t\t\t@reject=${this.#handleReject}\n\t\t\t\t\t></dev-wallet-signing>\n\t\t\t\t</div>\n\t\t\t</dialog>\n\t\t`;\n\t}\n\n\t#handleApprove(e: Event) {\n\t\t// Stop the composed signing event from also reaching the parent\n\t\te.stopPropagation();\n\t\temitEvent(this, 'approve');\n\t}\n\n\t#handleReject(e: Event) {\n\t\te.stopPropagation();\n\t\temitEvent(this, 'reject');\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-signing-modal': DevWalletSigningModal;\n\t}\n}\n"],"mappings":";;;;;;;;AAoBO,kCAAMA,gCAA8B,WAAW;;;iBAmDb;gBAGL;oBAGtB;;;gBAxDY,CACxB,cACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA6CH;;CAWD,uBAAuB,MAAa;AACnC,IAAE,gBAAgB;AAClB,YAAU,MAAM,SAAS;;CAG1B,AAAS,eAAe;EACvB,MAAM,SAAS,KAAK,YAAY,cAAc,SAAS;AACvD,MAAI,UAAU,CAAC,OAAO,MAAM;AAC3B,UAAO,WAAW;;AAEnB,UAAQ,iBAAiB,UAAU,MAAKC,mBAAoB;;CAG7D,AAAS,uBAAuB;AAC/B,QAAM,sBAAsB;EAC5B,MAAM,SAAS,KAAK,YAAY,cAAc,SAAS;AACvD,UAAQ,oBAAoB,UAAU,MAAKA,mBAAoB;AAC/D,MAAI,QAAQ,KAAM,QAAO,OAAO;;CAGjC,AAAS,SAAS;AACjB,MAAI,CAAC,KAAK,QAAS,QAAO;AAE1B,SAAO,IAAI;;;iCAGoB,KAAK,WAAW;;;;;iBAKhC,KAAK,QAAQ;gBACd,KAAK,OAAO;iBACX,MAAKC,cAAe;gBACrB,MAAKC,aAAc;;;;;;CAOlC,eAAe,GAAU;AAExB,IAAE,iBAAiB;AACnB,YAAU,MAAM,UAAU;;CAG3B,cAAc,GAAU;AACvB,IAAE,iBAAiB;AACnB,YAAU,MAAM,SAAS;;;YA1DzB,SAAS,EAAE,WAAW,OAAO,CAAC;YAG9B,SAAS,EAAE,WAAW,OAAO,CAAC;YAG9B,SAAS,EAAE,MAAM,QAAQ,CAAC;oCAzD3B,cAAc,2BAA2B"}
1
+ {"version":3,"file":"dev-wallet-signing-modal.mjs","names":["#handleDialogCancel","#handleApprove","#handleReject"],"sources":["../../src/ui/dev-wallet-signing-modal.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ClientWithCoreApi } from '@mysten/sui/client';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport type { PendingSigningRequest } from '../wallet/dev-wallet.js';\nimport { sharedStyles } from './styles.js';\nimport type { CoinRecord } from './utils.js';\nimport { emitEvent } from './utils.js';\nimport './dev-wallet-signing.js';\n\n/**\n * A centered modal overlay for signing requests.\n *\n * Renders a backdrop and centered dialog containing the\n * `<dev-wallet-signing>` component. Dispatches `approve` and\n * `reject` events to the parent.\n */\n@customElement('dev-wallet-signing-modal')\nexport class DevWalletSigningModal extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t\tpointer-events: auto;\n\t\t\t}\n\n\t\t\tdialog {\n\t\t\t\twidth: 440px;\n\t\t\t\tmax-width: calc(100vw - 32px);\n\t\t\t\tmax-height: min(680px, 86vh);\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xl);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-2);\n\t\t\t\tbox-shadow: var(--dev-wallet-shadow-lg);\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tpadding: 0;\n\t\t\t\tcolor: inherit;\n\t\t\t\tpointer-events: auto;\n\t\t\t}\n\n\t\t\tdialog::backdrop {\n\t\t\t\tbackground: rgba(2, 6, 14, 0.55);\n\t\t\t}\n\n\t\t\t.modal-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\talign-items: center;\n\t\t\t\tpadding: 12px 14px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-1);\n\t\t\t}\n\n\t\t\t.modal-title {\n\t\t\t\tfont-size: 13px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t}\n\n\t\t\t.modal-body {\n\t\t\t\tflex: 1;\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t}\n\n\t\t\t/* Phase 4 P4.19 — footnote rendered when the active account\n\t\t\t is in fork-mode impersonation. Visually distinct so users\n\t\t\t don't conflate this with a real signature flow. */\n\t\t\t.fork-footnote {\n\t\t\t\tpadding: 8px 16px;\n\t\t\t\tbackground: rgba(234, 179, 8, 0.12);\n\t\t\t\tborder-top: 1px solid rgba(234, 179, 8, 0.35);\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tline-height: 1.4;\n\t\t\t}\n\n\t\t\t.fork-footnote strong {\n\t\t\t\tcolor: #92400e;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\trequest: PendingSigningRequest | null = null;\n\n\t@property({ attribute: false })\n\tclient: ClientWithCoreApi | null = null;\n\n\t/** Pre-seeded coin metadata forwarded to `<dev-wallet-signing>`. See\n\t * the matching property on `DevWalletSigning` for details. */\n\t@property({ attribute: false })\n\tcoins: CoinRecord | null = null;\n\n\t@property({ type: String })\n\twalletName = 'Dev Wallet';\n\n\t/** Phase 4 P4.19 — when the active account's `source === 'impersonate'`,\n\t * the parent flips this on and the modal renders a footnote\n\t * explaining no real signature will be produced. */\n\t@property({ type: Boolean })\n\timpersonation = false;\n\n\t#handleDialogCancel = (e: Event) => {\n\t\te.preventDefault();\n\t\temitEvent(this, 'reject');\n\t};\n\n\toverride firstUpdated() {\n\t\tconst dialog = this.shadowRoot?.querySelector('dialog');\n\t\tif (dialog && !dialog.open) {\n\t\t\tdialog.showModal();\n\t\t}\n\t\tdialog?.addEventListener('cancel', this.#handleDialogCancel);\n\t}\n\n\toverride disconnectedCallback() {\n\t\tsuper.disconnectedCallback();\n\t\tconst dialog = this.shadowRoot?.querySelector('dialog');\n\t\tdialog?.removeEventListener('cancel', this.#handleDialogCancel);\n\t\tif (dialog?.open) dialog.close();\n\t}\n\n\toverride render() {\n\t\tif (!this.request) return nothing;\n\n\t\treturn html`\n\t\t\t<dialog part=\"dialog\">\n\t\t\t\t<div class=\"modal-header\">\n\t\t\t\t\t<span class=\"modal-title\">${this.walletName}</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"modal-body\">\n\t\t\t\t\t<dev-wallet-signing\n\t\t\t\t\t\texportparts=\"approve-button: signing-approve-button, reject-button: signing-reject-button, request-type: signing-request-type, empty-state: signing-empty-state, error-message: signing-error-message, footer: signing-footer\"\n\t\t\t\t\t\t.request=${this.request}\n\t\t\t\t\t\t.client=${this.client}\n\t\t\t\t\t\t.coins=${this.coins}\n\t\t\t\t\t\t@approve=${this.#handleApprove}\n\t\t\t\t\t\t@reject=${this.#handleReject}\n\t\t\t\t\t></dev-wallet-signing>\n\t\t\t\t</div>\n\t\t\t\t${this.impersonation\n\t\t\t\t\t? html`<div class=\"fork-footnote\" part=\"fork-footnote\">\n\t\t\t\t\t\t\t<strong>Fork-only:</strong> this account is in <em>impersonation</em> mode. The fork\n\t\t\t\t\t\t\taccepts the transaction with an empty signature (no real private key signs it), so it\n\t\t\t\t\t\t\twould be rejected by mainnet / testnet / devnet validators.\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing}\n\t\t\t</dialog>\n\t\t`;\n\t}\n\n\t#handleApprove(e: Event) {\n\t\t// Stop the composed signing event from also reaching the parent\n\t\te.stopPropagation();\n\t\temitEvent(this, 'approve');\n\t}\n\n\t#handleReject(e: Event) {\n\t\te.stopPropagation();\n\t\temitEvent(this, 'reject');\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-signing-modal': DevWalletSigningModal;\n\t}\n}\n"],"mappings":";;;;;;;AAqBO,IAAA,wBAAA,MAAM,8BAA8B,WAAW;;;iBAuEb;gBAGL;eAKR;oBAGd;uBAMG;8BAEO,MAAa;AACnC,KAAE,gBAAgB;AAClB,aAAU,MAAM,SAAS;;;;gBA3FD,CACxB,cACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAiEH;;CAsBD;CAKA,eAAwB;EACvB,MAAM,SAAS,KAAK,YAAY,cAAc,SAAS;AACvD,MAAI,UAAU,CAAC,OAAO,KACrB,QAAO,WAAW;AAEnB,UAAQ,iBAAiB,UAAU,MAAA,mBAAyB;;CAG7D,uBAAgC;AAC/B,QAAM,sBAAsB;EAC5B,MAAM,SAAS,KAAK,YAAY,cAAc,SAAS;AACvD,UAAQ,oBAAoB,UAAU,MAAA,mBAAyB;AAC/D,MAAI,QAAQ,KAAM,QAAO,OAAO;;CAGjC,SAAkB;AACjB,MAAI,CAAC,KAAK,QAAS,QAAO;AAE1B,SAAO,IAAI;;;iCAGoB,KAAK,WAAW;;;;;iBAKhC,KAAK,QAAQ;gBACd,KAAK,OAAO;eACb,KAAK,MAAM;iBACT,MAAA,cAAoB;gBACrB,MAAA,aAAmB;;;MAG7B,KAAK,gBACJ,IAAI;;;;gBAKJ,QAAQ;;;;CAKd,eAAe,GAAU;AAExB,IAAE,iBAAiB;AACnB,YAAU,MAAM,UAAU;;CAG3B,cAAc,GAAU;AACvB,IAAE,iBAAiB;AACnB,YAAU,MAAM,SAAS;;;YA7EzB,SAAS,EAAE,WAAW,OAAO,CAAC,CAAA,EAAA,sBAAA,WAAA,WAAA,KAAA,EAAA;YAG9B,SAAS,EAAE,WAAW,OAAO,CAAC,CAAA,EAAA,sBAAA,WAAA,UAAA,KAAA,EAAA;YAK9B,SAAS,EAAE,WAAW,OAAO,CAAC,CAAA,EAAA,sBAAA,WAAA,SAAA,KAAA,EAAA;YAG9B,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,sBAAA,WAAA,cAAA,KAAA,EAAA;YAM1B,SAAS,EAAE,MAAM,SAAS,CAAC,CAAA,EAAA,sBAAA,WAAA,iBAAA,KAAA,EAAA;oCAxF5B,cAAc,2BAA2B,CAAA,EAAA,sBAAA"}
@@ -1,19 +1,25 @@
1
1
  import { PendingSigningRequest } from "../wallet/dev-wallet.mjs";
2
- import * as lit35 from "lit";
2
+ import { CoinRecord } from "./utils.mjs";
3
+ import * as _$lit from "lit";
3
4
  import { LitElement } from "lit";
4
5
  import { ClientWithCoreApi } from "@mysten/sui/client";
5
6
 
6
7
  //#region src/ui/dev-wallet-signing.d.ts
7
8
  declare class DevWalletSigning extends LitElement {
8
9
  #private;
9
- static styles: (lit35.CSSResult | lit35.CSSResult[])[];
10
+ static styles: (_$lit.CSSResult | _$lit.CSSResult[])[];
10
11
  request: PendingSigningRequest | null;
11
12
  client: ClientWithCoreApi | null;
13
+ /** Optional pre-seeded coin metadata — pass the generated `coins`
14
+ * constant from devstack codegen to skip per-coin `getCoinMetadata`
15
+ * RPC fetches when rendering coin-flow estimates. Unknown coin types
16
+ * fall through to an RPC fetch as before. */
17
+ coins: CoinRecord | null;
12
18
  private _analysis;
13
19
  private _analysisError;
14
20
  private _analyzing;
15
21
  willUpdate(changedProperties: Map<string, unknown>): void;
16
- render(): lit35.TemplateResult<1>;
22
+ render(): _$lit.TemplateResult<1>;
17
23
  }
18
24
  declare global {
19
25
  interface HTMLElementTagNameMap {
@@ -1 +1 @@
1
- {"version":3,"file":"dev-wallet-signing.d.mts","names":[],"sources":["../../src/ui/dev-wallet-signing.ts"],"mappings":";;;;;;cAuBa,gBAAA,SAAyB,UAAA;EAAA;SACrB,MAAA,GADa,KAAA,CACP,SAAA,GAAA,KAAA,CAAA,SAAA;EAkQtB,OAAA,EAAS,qBAAA;EAGT,MAAA,EAAQ,iBAAA;EAAA,QAGA,SAAA;EAAA,QAGA,cAAA;EAAA,QAGA,UAAA;EAMC,UAAA,CAAW,iBAAA,EAAmB,GAAA;EAmD9B,MAAA,CAAA,GAnDiC,KAAA,CAmD3B,cAAA;AAAA;AAAA,QA4QR,MAAA;EAAA,UACG,qBAAA;IACT,oBAAA,EAAsB,gBAAA;EAAA;AAAA"}
1
+ {"version":3,"file":"dev-wallet-signing.d.mts","names":[],"sources":["../../src/ui/dev-wallet-signing.ts"],"mappings":";;;;;;;cAsCa,gBAAA,SAAyB,UAAA;EAAA;SACrB,MAAA,GADa,KAAA,CACP,SAAA,GAAA,KAAA,CAAA,SAAA;EA+OtB,OAAA,EAAS,qBAAA;EAGT,MAAA,EAAQ,iBAAA;;;;;EAOR,KAAA,EAAO,UAAA;EAAA,QAGC,SAAA;EAAA,QAGA,cAAA;EAAA,QAGA,UAAA;EASC,UAAA,CAAW,iBAAA,EAAmB,GAAA;EAsE9B,MAAA,CAAA,GAtEiC,KAAA,CAsE3B,cAAA;AAAA;AAAA,QA8QR,MAAA;EAAA,UACG,qBAAA;IACT,oBAAA,EAAsB,gBAAA;EAAA;AAAA"}
@@ -1,34 +1,45 @@
1
- import { actionButtonStyles, sharedStyles } from "./styles.mjs";
2
- import { emitEvent, formatAddress, formatCoinBalance, getCoinSymbol } from "./utils.mjs";
1
+ import { actionButtonStyles, copyableTextStyles, listContainerStyles, monoTruncateStyles, sharedStyles, subLabelStyles } from "./styles.mjs";
2
+ import { emitEvent, formatAddress, formatCoinBalance, getCoinSymbol, indexCoinsByType, lookupCoinByType } from "./utils.mjs";
3
3
  import { CopyController } from "./copy-controller.mjs";
4
- import { __decorate } from "../_virtual/_@oxc-project_runtime@0.107.0/helpers/decorate.mjs";
4
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.mjs";
5
5
  import { analyzeTransaction } from "./transaction-analyzer.mjs";
6
6
  import { LitElement, css, html, nothing } from "lit";
7
7
  import { customElement, property, state } from "lit/decorators.js";
8
8
  import { bcs } from "@mysten/sui/bcs";
9
-
10
9
  //#region src/ui/dev-wallet-signing.ts
11
10
  const REQUEST_TYPE_LABELS = {
12
11
  "sign-personal-message": "Sign Message",
13
12
  "sign-transaction": "Sign Transaction",
14
13
  "sign-and-execute-transaction": "Sign & Execute Transaction"
15
14
  };
16
- let DevWalletSigning = class DevWalletSigning$1 extends LitElement {
15
+ let DevWalletSigning = class DevWalletSigning extends LitElement {
17
16
  constructor(..._args) {
18
17
  super(..._args);
19
18
  this.request = null;
20
19
  this.client = null;
20
+ this.coins = null;
21
21
  this._analysis = null;
22
22
  this._analysisError = null;
23
23
  this._analyzing = false;
24
+ this.#copy = new CopyController(this);
25
+ this.#analysisGeneration = 0;
26
+ this.#coinDecimalsCache = /* @__PURE__ */ new Map();
27
+ this.#coinSymbolCache = /* @__PURE__ */ new Map();
28
+ this.#coinIndex = /* @__PURE__ */ new Map();
29
+ this.#lastCoinsRef = null;
24
30
  }
25
31
  static {
26
32
  this.styles = [
27
33
  sharedStyles,
28
34
  actionButtonStyles,
35
+ copyableTextStyles,
36
+ listContainerStyles,
37
+ monoTruncateStyles,
38
+ subLabelStyles,
29
39
  css`
30
40
  :host {
31
41
  display: flex;
42
+ flex: 1;
32
43
  flex-direction: column;
33
44
  overflow: hidden;
34
45
  min-height: 0;
@@ -38,18 +49,20 @@ let DevWalletSigning = class DevWalletSigning$1 extends LitElement {
38
49
  flex: 1;
39
50
  overflow-y: auto;
40
51
  padding: 16px;
52
+ background: var(--dev-wallet-bg-0);
41
53
  }
42
54
 
43
55
  .signing-footer {
44
56
  padding: 12px 16px;
45
57
  border-top: 1px solid var(--dev-wallet-border);
58
+ background: var(--dev-wallet-surface);
46
59
  }
47
60
 
48
61
  .signing-header {
49
62
  display: flex;
50
63
  align-items: center;
51
64
  gap: 8px;
52
- margin-bottom: 12px;
65
+ margin-bottom: 10px;
53
66
  }
54
67
 
55
68
  .signing-badge {
@@ -72,22 +85,31 @@ let DevWalletSigning = class DevWalletSigning$1 extends LitElement {
72
85
  }
73
86
 
74
87
  .signing-title {
75
- font-size: 14px;
88
+ font-size: 12px;
76
89
  font-weight: var(--dev-wallet-font-weight-semibold);
77
90
  color: var(--dev-wallet-foreground);
78
91
  }
79
92
 
80
93
  .request-type {
81
- font-size: 13px;
94
+ display: inline-flex;
95
+ align-items: center;
96
+ height: 22px;
97
+ padding: 0 8px;
98
+ border-radius: 999px;
99
+ border: 1px solid var(--dev-wallet-border-strong);
100
+ background: var(--dev-wallet-accent-fade);
101
+ font-family: var(--dev-wallet-font-mono);
102
+ font-size: 10.5px;
82
103
  color: var(--dev-wallet-primary);
83
104
  font-weight: var(--dev-wallet-font-weight-medium);
84
- margin-bottom: 8px;
105
+ margin-bottom: 10px;
85
106
  }
86
107
 
87
108
  .request-detail {
88
109
  display: flex;
89
110
  justify-content: space-between;
90
- padding: 6px 0;
111
+ gap: 12px;
112
+ padding: 8px 0;
91
113
  font-size: 12px;
92
114
  border-bottom: 1px solid var(--dev-wallet-border);
93
115
  }
@@ -110,18 +132,7 @@ let DevWalletSigning = class DevWalletSigning$1 extends LitElement {
110
132
  }
111
133
 
112
134
  .detail-value.copyable-addr {
113
- cursor: pointer;
114
- border-radius: var(--dev-wallet-radius-2xs);
115
135
  padding: 1px 3px;
116
- transition: background 0.15s;
117
- }
118
-
119
- .detail-value.copyable-addr:hover {
120
- background: color-mix(in oklab, var(--dev-wallet-primary) 15%, transparent);
121
- }
122
-
123
- .detail-value.copied {
124
- color: var(--dev-wallet-positive);
125
136
  }
126
137
 
127
138
  .detail-secondary {
@@ -131,30 +142,24 @@ let DevWalletSigning = class DevWalletSigning$1 extends LitElement {
131
142
 
132
143
  .request-data {
133
144
  margin: 12px 0;
134
- padding: 8px;
135
- border-radius: var(--dev-wallet-radius-xs);
136
- background: var(--dev-wallet-background);
145
+ padding: 10px 12px;
146
+ border-radius: var(--dev-wallet-radius);
147
+ border: 1px solid var(--dev-wallet-border);
148
+ background: var(--dev-wallet-bg-0);
137
149
  font-family: var(--dev-wallet-font-mono);
138
- font-size: 11px;
139
- color: var(--dev-wallet-muted-foreground);
140
- max-height: 80px;
150
+ font-size: 11.5px;
151
+ color: var(--dev-wallet-foreground);
152
+ max-height: 120px;
141
153
  overflow-y: auto;
142
154
  word-break: break-all;
155
+ line-height: 1.55;
143
156
  }
144
157
 
145
158
  .section-label {
146
- font-size: 11px;
147
- font-weight: var(--dev-wallet-font-weight-semibold);
148
- color: var(--dev-wallet-muted-foreground);
149
- text-transform: uppercase;
150
- letter-spacing: 0.5px;
151
159
  margin: 12px 0 6px;
152
160
  }
153
161
 
154
162
  .coin-flows {
155
- display: flex;
156
- flex-direction: column;
157
- gap: 4px;
158
163
  margin-bottom: 4px;
159
164
  }
160
165
 
@@ -162,9 +167,10 @@ let DevWalletSigning = class DevWalletSigning$1 extends LitElement {
162
167
  display: flex;
163
168
  justify-content: space-between;
164
169
  align-items: center;
165
- padding: 8px;
166
- border-radius: var(--dev-wallet-radius-xs);
167
- background: var(--dev-wallet-background);
170
+ padding: 8px 10px;
171
+ border-radius: var(--dev-wallet-radius);
172
+ border: 1px solid var(--dev-wallet-border);
173
+ background: var(--dev-wallet-surface);
168
174
  font-size: 12px;
169
175
  }
170
176
 
@@ -178,16 +184,11 @@ let DevWalletSigning = class DevWalletSigning$1 extends LitElement {
178
184
  color: var(--dev-wallet-destructive);
179
185
  }
180
186
 
181
- .commands-list {
182
- display: flex;
183
- flex-direction: column;
184
- gap: 4px;
185
- }
186
-
187
187
  .command-item {
188
- padding: 8px;
189
- border-radius: var(--dev-wallet-radius-xs);
190
- background: var(--dev-wallet-background);
188
+ padding: 10px;
189
+ border-radius: var(--dev-wallet-radius-lg);
190
+ border: 1px solid var(--dev-wallet-border);
191
+ background: var(--dev-wallet-surface);
191
192
  font-size: 12px;
192
193
  }
193
194
 
@@ -198,12 +199,7 @@ let DevWalletSigning = class DevWalletSigning$1 extends LitElement {
198
199
  }
199
200
 
200
201
  .command-detail {
201
- color: var(--dev-wallet-muted-foreground);
202
- font-family: var(--dev-wallet-font-mono);
203
202
  font-size: 11px;
204
- overflow: hidden;
205
- text-overflow: ellipsis;
206
- white-space: nowrap;
207
203
  }
208
204
 
209
205
  .command-args {
@@ -214,12 +210,7 @@ let DevWalletSigning = class DevWalletSigning$1 extends LitElement {
214
210
 
215
211
  .command-arg {
216
212
  font-size: 11px;
217
- color: var(--dev-wallet-muted-foreground);
218
- font-family: var(--dev-wallet-font-mono);
219
213
  padding: 1px 0;
220
- overflow: hidden;
221
- text-overflow: ellipsis;
222
- white-space: nowrap;
223
214
  }
224
215
 
225
216
  .arg-access {
@@ -253,10 +244,6 @@ let DevWalletSigning = class DevWalletSigning$1 extends LitElement {
253
244
  word-break: break-word;
254
245
  }
255
246
 
256
- .section-label-error {
257
- color: var(--dev-wallet-destructive);
258
- }
259
-
260
247
  .error-title {
261
248
  font-weight: var(--dev-wallet-font-weight-semibold);
262
249
  margin-bottom: 4px;
@@ -280,17 +267,22 @@ let DevWalletSigning = class DevWalletSigning$1 extends LitElement {
280
267
  `
281
268
  ];
282
269
  }
283
- #copy = new CopyController(this);
284
- #analysisGeneration = 0;
285
- #coinDecimalsCache = new Map();
270
+ #copy;
271
+ #analysisGeneration;
272
+ #coinDecimalsCache;
273
+ #coinSymbolCache;
274
+ #coinIndex;
275
+ #lastCoinsRef;
286
276
  willUpdate(changedProperties) {
277
+ if (changedProperties.has("coins") && this.coins !== this.#lastCoinsRef) {
278
+ this.#coinIndex = indexCoinsByType(this.coins);
279
+ this.#lastCoinsRef = this.coins;
280
+ }
287
281
  if (changedProperties.has("request")) {
288
282
  this._analysis = null;
289
283
  this._analysisError = null;
290
284
  this._analyzing = false;
291
- if (this.request && this.request.type !== "sign-personal-message") {
292
- this.#analyzeTransaction();
293
- }
285
+ if (this.request && this.request.type !== "sign-personal-message") this.#analyzeTransaction();
294
286
  }
295
287
  }
296
288
  async #analyzeTransaction() {
@@ -301,29 +293,40 @@ let DevWalletSigning = class DevWalletSigning$1 extends LitElement {
301
293
  if (generation !== this.#analysisGeneration) return;
302
294
  if (result.kind === "rich") {
303
295
  this._analysis = result.analysis;
304
- if (this.client && result.analysis.coinFlows?.length) {
296
+ if (result.analysis.coinFlows?.length) {
305
297
  const coinTypes = [...new Set(result.analysis.coinFlows.map((f) => f.coinType))];
306
- await Promise.all(coinTypes.filter((ct) => !this.#coinDecimalsCache.has(ct)).map(async (ct) => {
307
- try {
308
- const { coinMetadata } = await this.client.core.getCoinMetadata({ coinType: ct });
309
- if (coinMetadata) {
310
- this.#coinDecimalsCache.set(ct, coinMetadata.decimals);
311
- }
312
- } catch {}
313
- }));
314
- if (generation !== this.#analysisGeneration) return;
298
+ const unresolved = [];
299
+ for (const ct of coinTypes) {
300
+ if (this.#coinDecimalsCache.has(ct)) continue;
301
+ const seed = lookupCoinByType(this.#coinIndex, ct);
302
+ if (seed !== void 0) {
303
+ this.#coinDecimalsCache.set(ct, seed.decimals);
304
+ if (seed.symbol !== void 0) this.#coinSymbolCache.set(ct, seed.symbol);
305
+ continue;
306
+ }
307
+ unresolved.push(ct);
308
+ }
309
+ if (this.client && unresolved.length > 0) {
310
+ await Promise.all(unresolved.map(async (ct) => {
311
+ try {
312
+ const { coinMetadata } = await this.client.core.getCoinMetadata({ coinType: ct });
313
+ if (coinMetadata) {
314
+ this.#coinDecimalsCache.set(ct, coinMetadata.decimals);
315
+ if (coinMetadata.symbol) this.#coinSymbolCache.set(ct, coinMetadata.symbol);
316
+ }
317
+ } catch {}
318
+ }));
319
+ if (generation !== this.#analysisGeneration) return;
320
+ }
315
321
  this.requestUpdate();
316
322
  }
317
- } else {
318
- this._analysisError = result.message;
319
- }
323
+ } else this._analysisError = result.message;
320
324
  this._analyzing = false;
321
325
  }
322
326
  render() {
323
- if (!this.request) {
324
- return html`<div class="no-request" part="empty-state">No pending requests</div>`;
325
- }
327
+ if (!this.request) return html`<div class="no-request" part="empty-state">No pending requests</div>`;
326
328
  const typeLabel = REQUEST_TYPE_LABELS[this.request.type];
329
+ const account = this.request.account;
327
330
  const isTransaction = this.request.type !== "sign-personal-message";
328
331
  const canApprove = isTransaction ? this._analysis !== null && !this._analysisError && !this._analyzing : true;
329
332
  return html`
@@ -333,30 +336,28 @@ let DevWalletSigning = class DevWalletSigning$1 extends LitElement {
333
336
  <span class="signing-title">Approval Required</span>
334
337
  </div>
335
338
 
336
- <div class="request-type" part="request-type">${typeLabel}</div>
337
-
338
- <div class="request-detail">
339
- <span class="detail-label">Account</span>
340
- <span
341
- class="detail-value copyable-addr ${this.#copy.isCopied(this.request.account.address) ? "copied" : ""}"
342
- title="Click to copy"
343
- role="button"
344
- tabindex="0"
345
- aria-label="Copy account address"
346
- @click=${() => this.#copy.copy(this.request.account.address)}
347
- @keydown=${(e) => {
339
+ <div class="request-type" part="request-type">${typeLabel ?? "Signing Request"}</div>
340
+
341
+ ${account ? html`<div class="request-detail">
342
+ <span class="detail-label">Account</span>
343
+ <span
344
+ class="detail-value copyable-addr ${this.#copy.isCopied(account.address) ? "copied" : ""}"
345
+ title="Click to copy"
346
+ role="button"
347
+ tabindex="0"
348
+ aria-label="Copy account address"
349
+ @click=${() => this.#copy.copy(account.address)}
350
+ @keydown=${(e) => {
348
351
  if (e.key === "Enter" || e.key === " ") {
349
352
  e.preventDefault();
350
- this.#copy.copy(this.request.account.address);
353
+ this.#copy.copy(account.address);
351
354
  }
352
355
  }}
353
- >
354
- ${this.#copy.isCopied(this.request.account.address) ? "Copied!" : this.request.account.label ? html`${this.request.account.label}
355
- <span class="detail-secondary"
356
- >${formatAddress(this.request.account.address)}</span
357
- >` : formatAddress(this.request.account.address)}
358
- </span>
359
- </div>
356
+ >
357
+ ${this.#copy.isCopied(account.address) ? "Copied!" : account.label ? html`${account.label}
358
+ <span class="detail-secondary">${formatAddress(account.address)}</span>` : formatAddress(account.address)}
359
+ </span>
360
+ </div>` : nothing}
360
361
  ${isTransaction ? html`<div class="request-detail">
361
362
  <span class="detail-label">Chain</span>
362
363
  <span class="detail-value">${this.request.chain}</span>
@@ -374,11 +375,8 @@ let DevWalletSigning = class DevWalletSigning$1 extends LitElement {
374
375
  `;
375
376
  }
376
377
  #renderTransactionPreview() {
377
- if (this._analyzing) {
378
- return html`<div class="section-label">Analyzing transaction...</div>`;
379
- }
380
- if (this._analysisError) {
381
- return html`
378
+ if (this._analyzing) return html`<div class="section-label">Analyzing transaction...</div>`;
379
+ if (this._analysisError) return html`
382
380
  <div class="section-label section-label-error">Analysis Failed</div>
383
381
  <div class="error-state" part="error-message">
384
382
  <div class="error-title">Unable to analyze this transaction</div>
@@ -389,12 +387,9 @@ let DevWalletSigning = class DevWalletSigning$1 extends LitElement {
389
387
  </div>
390
388
  </div>
391
389
  `;
392
- }
393
- if (this._analysis) {
394
- return html`
390
+ if (this._analysis) return html`
395
391
  ${this.#renderCoinFlows()} ${this.#renderAnalyzedCommands(this._analysis.commands)}
396
392
  `;
397
- }
398
393
  const dataPreview = this.#getDataPreview();
399
394
  return dataPreview ? html`<div class="request-data">${dataPreview}</div>` : nothing;
400
395
  }
@@ -406,11 +401,10 @@ let DevWalletSigning = class DevWalletSigning$1 extends LitElement {
406
401
  <div class="coin-flows">
407
402
  ${flows.map((flow) => {
408
403
  const decimals = this.#coinDecimalsCache.get(flow.coinType) ?? 0;
409
- const formatted = formatCoinBalance(flow.amount, decimals);
410
404
  return html`
411
405
  <div class="coin-flow-item">
412
- <span class="coin-flow-type">${getCoinSymbol(flow.coinType)}</span>
413
- <span class="coin-flow-amount"> -${formatted} </span>
406
+ <span class="coin-flow-type">${this.#coinSymbolCache.get(flow.coinType) ?? getCoinSymbol(flow.coinType)}</span>
407
+ <span class="coin-flow-amount"> -${formatCoinBalance(flow.amount, decimals)} </span>
414
408
  </div>
415
409
  `;
416
410
  })}
@@ -501,28 +495,22 @@ let DevWalletSigning = class DevWalletSigning$1 extends LitElement {
501
495
  }
502
496
  }
503
497
  #decodePureAddress(arg) {
504
- if (arg.$kind === "Pure") {
505
- try {
506
- return bcs.Address.fromBase64(arg.bytes);
507
- } catch {}
508
- }
498
+ if (arg.$kind === "Pure") try {
499
+ return bcs.Address.fromBase64(arg.bytes);
500
+ } catch {}
509
501
  return "?";
510
502
  }
511
503
  #getDataPreview() {
512
504
  if (!this.request) return null;
513
505
  if (this.request.type === "sign-personal-message") {
514
506
  const data = this.request.data;
515
- if (data instanceof Uint8Array) {
516
- try {
517
- return new TextDecoder().decode(data);
518
- } catch {
519
- return `[${data.length} bytes]`;
520
- }
507
+ if (data instanceof Uint8Array) try {
508
+ return new TextDecoder().decode(data);
509
+ } catch {
510
+ return `[${data.length} bytes]`;
521
511
  }
522
512
  }
523
- if (typeof this.request.data === "string") {
524
- return this.request.data.length > 200 ? this.request.data.slice(0, 200) + "..." : this.request.data;
525
- }
513
+ if (typeof this.request.data === "string") return this.request.data.length > 200 ? this.request.data.slice(0, 200) + "..." : this.request.data;
526
514
  return null;
527
515
  }
528
516
  #approve() {
@@ -534,11 +522,12 @@ let DevWalletSigning = class DevWalletSigning$1 extends LitElement {
534
522
  };
535
523
  __decorate([property({ attribute: false })], DevWalletSigning.prototype, "request", void 0);
536
524
  __decorate([property({ attribute: false })], DevWalletSigning.prototype, "client", void 0);
525
+ __decorate([property({ attribute: false })], DevWalletSigning.prototype, "coins", void 0);
537
526
  __decorate([state()], DevWalletSigning.prototype, "_analysis", void 0);
538
527
  __decorate([state()], DevWalletSigning.prototype, "_analysisError", void 0);
539
528
  __decorate([state()], DevWalletSigning.prototype, "_analyzing", void 0);
540
529
  DevWalletSigning = __decorate([customElement("dev-wallet-signing")], DevWalletSigning);
541
-
542
530
  //#endregion
543
531
  export { DevWalletSigning };
532
+
544
533
  //# sourceMappingURL=dev-wallet-signing.mjs.map