@mysten-incubation/dev-wallet 0.0.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/CHANGELOG.md +25 -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 +12 -0
  15. package/dist/adapters/devstack-paths.d.mts.map +1 -0
  16. package/dist/adapters/devstack-paths.mjs +12 -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 +16 -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
@@ -9,10 +9,25 @@ import { customElement, property, state } from 'lit/decorators.js';
9
9
 
10
10
  import type { PendingSigningRequest } from '../wallet/dev-wallet.js';
11
11
  import { CopyController } from './copy-controller.js';
12
- import { actionButtonStyles, sharedStyles } from './styles.js';
12
+ import {
13
+ actionButtonStyles,
14
+ copyableTextStyles,
15
+ listContainerStyles,
16
+ monoTruncateStyles,
17
+ sharedStyles,
18
+ subLabelStyles,
19
+ } from './styles.js';
13
20
  import type { TransactionAnalysis } from './transaction-analyzer.js';
14
21
  import { analyzeTransaction } from './transaction-analyzer.js';
15
- import { emitEvent, formatAddress, formatCoinBalance, getCoinSymbol } from './utils.js';
22
+ import type { CoinManifestEntry, CoinRecord } from './utils.js';
23
+ import {
24
+ emitEvent,
25
+ formatAddress,
26
+ formatCoinBalance,
27
+ getCoinSymbol,
28
+ indexCoinsByType,
29
+ lookupCoinByType,
30
+ } from './utils.js';
16
31
 
17
32
  const REQUEST_TYPE_LABELS: Record<PendingSigningRequest['type'], string> = {
18
33
  'sign-personal-message': 'Sign Message',
@@ -25,9 +40,14 @@ export class DevWalletSigning extends LitElement {
25
40
  static override styles = [
26
41
  sharedStyles,
27
42
  actionButtonStyles,
43
+ copyableTextStyles,
44
+ listContainerStyles,
45
+ monoTruncateStyles,
46
+ subLabelStyles,
28
47
  css`
29
48
  :host {
30
49
  display: flex;
50
+ flex: 1;
31
51
  flex-direction: column;
32
52
  overflow: hidden;
33
53
  min-height: 0;
@@ -37,18 +57,20 @@ export class DevWalletSigning extends LitElement {
37
57
  flex: 1;
38
58
  overflow-y: auto;
39
59
  padding: 16px;
60
+ background: var(--dev-wallet-bg-0);
40
61
  }
41
62
 
42
63
  .signing-footer {
43
64
  padding: 12px 16px;
44
65
  border-top: 1px solid var(--dev-wallet-border);
66
+ background: var(--dev-wallet-surface);
45
67
  }
46
68
 
47
69
  .signing-header {
48
70
  display: flex;
49
71
  align-items: center;
50
72
  gap: 8px;
51
- margin-bottom: 12px;
73
+ margin-bottom: 10px;
52
74
  }
53
75
 
54
76
  .signing-badge {
@@ -71,22 +93,31 @@ export class DevWalletSigning extends LitElement {
71
93
  }
72
94
 
73
95
  .signing-title {
74
- font-size: 14px;
96
+ font-size: 12px;
75
97
  font-weight: var(--dev-wallet-font-weight-semibold);
76
98
  color: var(--dev-wallet-foreground);
77
99
  }
78
100
 
79
101
  .request-type {
80
- font-size: 13px;
102
+ display: inline-flex;
103
+ align-items: center;
104
+ height: 22px;
105
+ padding: 0 8px;
106
+ border-radius: 999px;
107
+ border: 1px solid var(--dev-wallet-border-strong);
108
+ background: var(--dev-wallet-accent-fade);
109
+ font-family: var(--dev-wallet-font-mono);
110
+ font-size: 10.5px;
81
111
  color: var(--dev-wallet-primary);
82
112
  font-weight: var(--dev-wallet-font-weight-medium);
83
- margin-bottom: 8px;
113
+ margin-bottom: 10px;
84
114
  }
85
115
 
86
116
  .request-detail {
87
117
  display: flex;
88
118
  justify-content: space-between;
89
- padding: 6px 0;
119
+ gap: 12px;
120
+ padding: 8px 0;
90
121
  font-size: 12px;
91
122
  border-bottom: 1px solid var(--dev-wallet-border);
92
123
  }
@@ -109,18 +140,7 @@ export class DevWalletSigning extends LitElement {
109
140
  }
110
141
 
111
142
  .detail-value.copyable-addr {
112
- cursor: pointer;
113
- border-radius: var(--dev-wallet-radius-2xs);
114
143
  padding: 1px 3px;
115
- transition: background 0.15s;
116
- }
117
-
118
- .detail-value.copyable-addr:hover {
119
- background: color-mix(in oklab, var(--dev-wallet-primary) 15%, transparent);
120
- }
121
-
122
- .detail-value.copied {
123
- color: var(--dev-wallet-positive);
124
144
  }
125
145
 
126
146
  .detail-secondary {
@@ -130,30 +150,24 @@ export class DevWalletSigning extends LitElement {
130
150
 
131
151
  .request-data {
132
152
  margin: 12px 0;
133
- padding: 8px;
134
- border-radius: var(--dev-wallet-radius-xs);
135
- background: var(--dev-wallet-background);
153
+ padding: 10px 12px;
154
+ border-radius: var(--dev-wallet-radius);
155
+ border: 1px solid var(--dev-wallet-border);
156
+ background: var(--dev-wallet-bg-0);
136
157
  font-family: var(--dev-wallet-font-mono);
137
- font-size: 11px;
138
- color: var(--dev-wallet-muted-foreground);
139
- max-height: 80px;
158
+ font-size: 11.5px;
159
+ color: var(--dev-wallet-foreground);
160
+ max-height: 120px;
140
161
  overflow-y: auto;
141
162
  word-break: break-all;
163
+ line-height: 1.55;
142
164
  }
143
165
 
144
166
  .section-label {
145
- font-size: 11px;
146
- font-weight: var(--dev-wallet-font-weight-semibold);
147
- color: var(--dev-wallet-muted-foreground);
148
- text-transform: uppercase;
149
- letter-spacing: 0.5px;
150
167
  margin: 12px 0 6px;
151
168
  }
152
169
 
153
170
  .coin-flows {
154
- display: flex;
155
- flex-direction: column;
156
- gap: 4px;
157
171
  margin-bottom: 4px;
158
172
  }
159
173
 
@@ -161,9 +175,10 @@ export class DevWalletSigning extends LitElement {
161
175
  display: flex;
162
176
  justify-content: space-between;
163
177
  align-items: center;
164
- padding: 8px;
165
- border-radius: var(--dev-wallet-radius-xs);
166
- background: var(--dev-wallet-background);
178
+ padding: 8px 10px;
179
+ border-radius: var(--dev-wallet-radius);
180
+ border: 1px solid var(--dev-wallet-border);
181
+ background: var(--dev-wallet-surface);
167
182
  font-size: 12px;
168
183
  }
169
184
 
@@ -177,16 +192,11 @@ export class DevWalletSigning extends LitElement {
177
192
  color: var(--dev-wallet-destructive);
178
193
  }
179
194
 
180
- .commands-list {
181
- display: flex;
182
- flex-direction: column;
183
- gap: 4px;
184
- }
185
-
186
195
  .command-item {
187
- padding: 8px;
188
- border-radius: var(--dev-wallet-radius-xs);
189
- background: var(--dev-wallet-background);
196
+ padding: 10px;
197
+ border-radius: var(--dev-wallet-radius-lg);
198
+ border: 1px solid var(--dev-wallet-border);
199
+ background: var(--dev-wallet-surface);
190
200
  font-size: 12px;
191
201
  }
192
202
 
@@ -197,12 +207,7 @@ export class DevWalletSigning extends LitElement {
197
207
  }
198
208
 
199
209
  .command-detail {
200
- color: var(--dev-wallet-muted-foreground);
201
- font-family: var(--dev-wallet-font-mono);
202
210
  font-size: 11px;
203
- overflow: hidden;
204
- text-overflow: ellipsis;
205
- white-space: nowrap;
206
211
  }
207
212
 
208
213
  .command-args {
@@ -213,12 +218,7 @@ export class DevWalletSigning extends LitElement {
213
218
 
214
219
  .command-arg {
215
220
  font-size: 11px;
216
- color: var(--dev-wallet-muted-foreground);
217
- font-family: var(--dev-wallet-font-mono);
218
221
  padding: 1px 0;
219
- overflow: hidden;
220
- text-overflow: ellipsis;
221
- white-space: nowrap;
222
222
  }
223
223
 
224
224
  .arg-access {
@@ -252,10 +252,6 @@ export class DevWalletSigning extends LitElement {
252
252
  word-break: break-word;
253
253
  }
254
254
 
255
- .section-label-error {
256
- color: var(--dev-wallet-destructive);
257
- }
258
-
259
255
  .error-title {
260
256
  font-weight: var(--dev-wallet-font-weight-semibold);
261
257
  margin-bottom: 4px;
@@ -285,6 +281,13 @@ export class DevWalletSigning extends LitElement {
285
281
  @property({ attribute: false })
286
282
  client: ClientWithCoreApi | null = null;
287
283
 
284
+ /** Optional pre-seeded coin metadata — pass the generated `coins`
285
+ * constant from devstack codegen to skip per-coin `getCoinMetadata`
286
+ * RPC fetches when rendering coin-flow estimates. Unknown coin types
287
+ * fall through to an RPC fetch as before. */
288
+ @property({ attribute: false })
289
+ coins: CoinRecord | null = null;
290
+
288
291
  @state()
289
292
  private _analysis: TransactionAnalysis | null = null;
290
293
 
@@ -297,8 +300,15 @@ export class DevWalletSigning extends LitElement {
297
300
  #copy = new CopyController(this);
298
301
  #analysisGeneration = 0;
299
302
  #coinDecimalsCache = new Map<string, number>();
303
+ #coinSymbolCache = new Map<string, string>();
304
+ #coinIndex: ReadonlyMap<string, CoinManifestEntry> = new Map();
305
+ #lastCoinsRef: CoinRecord | null = null;
300
306
 
301
307
  override willUpdate(changedProperties: Map<string, unknown>) {
308
+ if (changedProperties.has('coins') && this.coins !== this.#lastCoinsRef) {
309
+ this.#coinIndex = indexCoinsByType(this.coins);
310
+ this.#lastCoinsRef = this.coins;
311
+ }
302
312
  if (changedProperties.has('request')) {
303
313
  this._analysis = null;
304
314
  this._analysisError = null;
@@ -320,26 +330,41 @@ export class DevWalletSigning extends LitElement {
320
330
 
321
331
  if (result.kind === 'rich') {
322
332
  this._analysis = result.analysis;
323
- // Fetch coin metadata for all coin types in flows
324
- if (this.client && result.analysis.coinFlows?.length) {
333
+ // Seed coin metadata for all coin types in flows. The generated
334
+ // `coins` record (when provided) short-circuits the per-coin
335
+ // `getCoinMetadata` RPC; only unknown coin types fall through to
336
+ // the network.
337
+ if (result.analysis.coinFlows?.length) {
325
338
  const coinTypes = [...new Set(result.analysis.coinFlows.map((f) => f.coinType))];
326
- await Promise.all(
327
- coinTypes
328
- .filter((ct) => !this.#coinDecimalsCache.has(ct))
329
- .map(async (ct) => {
339
+ const unresolved: string[] = [];
340
+ for (const ct of coinTypes) {
341
+ if (this.#coinDecimalsCache.has(ct)) continue;
342
+ const seed = lookupCoinByType(this.#coinIndex, ct);
343
+ if (seed !== undefined) {
344
+ this.#coinDecimalsCache.set(ct, seed.decimals);
345
+ if (seed.symbol !== undefined) this.#coinSymbolCache.set(ct, seed.symbol);
346
+ continue;
347
+ }
348
+ unresolved.push(ct);
349
+ }
350
+ if (this.client && unresolved.length > 0) {
351
+ await Promise.all(
352
+ unresolved.map(async (ct) => {
330
353
  try {
331
354
  const { coinMetadata } = await this.client!.core.getCoinMetadata({
332
355
  coinType: ct,
333
356
  });
334
357
  if (coinMetadata) {
335
358
  this.#coinDecimalsCache.set(ct, coinMetadata.decimals);
359
+ if (coinMetadata.symbol) this.#coinSymbolCache.set(ct, coinMetadata.symbol);
336
360
  }
337
361
  } catch {
338
362
  // leave uncached — will use 0 as fallback
339
363
  }
340
364
  }),
341
- );
342
- if (generation !== this.#analysisGeneration) return;
365
+ );
366
+ if (generation !== this.#analysisGeneration) return;
367
+ }
343
368
  this.requestUpdate();
344
369
  }
345
370
  } else {
@@ -355,6 +380,7 @@ export class DevWalletSigning extends LitElement {
355
380
  }
356
381
 
357
382
  const typeLabel = REQUEST_TYPE_LABELS[this.request.type];
383
+ const account = this.request.account as PendingSigningRequest['account'] | undefined;
358
384
 
359
385
  // For transactions: only allow approval after successful analysis
360
386
  // For personal messages: always allow (no analysis needed)
@@ -370,36 +396,36 @@ export class DevWalletSigning extends LitElement {
370
396
  <span class="signing-title">Approval Required</span>
371
397
  </div>
372
398
 
373
- <div class="request-type" part="request-type">${typeLabel}</div>
374
-
375
- <div class="request-detail">
376
- <span class="detail-label">Account</span>
377
- <span
378
- class="detail-value copyable-addr ${this.#copy.isCopied(this.request.account.address)
379
- ? 'copied'
380
- : ''}"
381
- title="Click to copy"
382
- role="button"
383
- tabindex="0"
384
- aria-label="Copy account address"
385
- @click=${() => this.#copy.copy(this.request!.account.address)}
386
- @keydown=${(e: KeyboardEvent) => {
387
- if (e.key === 'Enter' || e.key === ' ') {
388
- e.preventDefault();
389
- this.#copy.copy(this.request!.account.address);
390
- }
391
- }}
392
- >
393
- ${this.#copy.isCopied(this.request.account.address)
394
- ? 'Copied!'
395
- : this.request.account.label
396
- ? html`${this.request.account.label}
397
- <span class="detail-secondary"
398
- >${formatAddress(this.request.account.address)}</span
399
- >`
400
- : formatAddress(this.request.account.address)}
401
- </span>
402
- </div>
399
+ <div class="request-type" part="request-type">${typeLabel ?? 'Signing Request'}</div>
400
+
401
+ ${account
402
+ ? html`<div class="request-detail">
403
+ <span class="detail-label">Account</span>
404
+ <span
405
+ class="detail-value copyable-addr ${this.#copy.isCopied(account.address)
406
+ ? 'copied'
407
+ : ''}"
408
+ title="Click to copy"
409
+ role="button"
410
+ tabindex="0"
411
+ aria-label="Copy account address"
412
+ @click=${() => this.#copy.copy(account.address)}
413
+ @keydown=${(e: KeyboardEvent) => {
414
+ if (e.key === 'Enter' || e.key === ' ') {
415
+ e.preventDefault();
416
+ this.#copy.copy(account.address);
417
+ }
418
+ }}
419
+ >
420
+ ${this.#copy.isCopied(account.address)
421
+ ? 'Copied!'
422
+ : account.label
423
+ ? html`${account.label}
424
+ <span class="detail-secondary">${formatAddress(account.address)}</span>`
425
+ : formatAddress(account.address)}
426
+ </span>
427
+ </div>`
428
+ : nothing}
403
429
  ${isTransaction
404
430
  ? html`<div class="request-detail">
405
431
  <span class="detail-label">Chain</span>
@@ -459,10 +485,11 @@ export class DevWalletSigning extends LitElement {
459
485
  <div class="coin-flows">
460
486
  ${flows.map((flow) => {
461
487
  const decimals = this.#coinDecimalsCache.get(flow.coinType) ?? 0;
488
+ const symbol = this.#coinSymbolCache.get(flow.coinType) ?? getCoinSymbol(flow.coinType);
462
489
  const formatted = formatCoinBalance(flow.amount, decimals);
463
490
  return html`
464
491
  <div class="coin-flow-item">
465
- <span class="coin-flow-type">${getCoinSymbol(flow.coinType)}</span>
492
+ <span class="coin-flow-type">${symbol}</span>
466
493
  <span class="coin-flow-amount"> -${formatted} </span>
467
494
  </div>
468
495
  `;