@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
@@ -1 +1 @@
1
- {"version":3,"file":"dev-wallet-signing.mjs","names":["DevWalletSigning","#analyzeTransaction","#analysisGeneration","#coinDecimalsCache","#copy","#renderTransactionPreview","#reject","#approve","#renderCoinFlows","#renderAnalyzedCommands","#getDataPreview","#renderAnalyzedCommand","#renderArgs","#decodePureAddress","#describeArg"],"sources":["../../src/ui/dev-wallet-signing.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { bcs } from '@mysten/sui/bcs';\nimport type { ClientWithCoreApi } from '@mysten/sui/client';\nimport type { AnalyzedCommand } from '@mysten/wallet-sdk';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { PendingSigningRequest } from '../wallet/dev-wallet.js';\nimport { CopyController } from './copy-controller.js';\nimport { actionButtonStyles, sharedStyles } from './styles.js';\nimport type { TransactionAnalysis } from './transaction-analyzer.js';\nimport { analyzeTransaction } from './transaction-analyzer.js';\nimport { emitEvent, formatAddress, formatCoinBalance, getCoinSymbol } from './utils.js';\n\nconst REQUEST_TYPE_LABELS: Record<PendingSigningRequest['type'], string> = {\n\t'sign-personal-message': 'Sign Message',\n\t'sign-transaction': 'Sign Transaction',\n\t'sign-and-execute-transaction': 'Sign & Execute Transaction',\n};\n\n@customElement('dev-wallet-signing')\nexport class DevWalletSigning extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tactionButtonStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\toverflow: hidden;\n\t\t\t\tmin-height: 0;\n\t\t\t}\n\n\t\t\t.signing-content {\n\t\t\t\tflex: 1;\n\t\t\t\toverflow-y: auto;\n\t\t\t\tpadding: 16px;\n\t\t\t}\n\n\t\t\t.signing-footer {\n\t\t\t\tpadding: 12px 16px;\n\t\t\t\tborder-top: 1px solid var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.signing-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tmargin-bottom: 12px;\n\t\t\t}\n\n\t\t\t.signing-badge {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\twidth: 8px;\n\t\t\t\theight: 8px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tbackground: var(--dev-wallet-warning);\n\t\t\t\tanimation: pulse 2s infinite;\n\t\t\t}\n\n\t\t\t@keyframes pulse {\n\t\t\t\t0%,\n\t\t\t\t100% {\n\t\t\t\t\topacity: 1;\n\t\t\t\t}\n\t\t\t\t50% {\n\t\t\t\t\topacity: 0.5;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.signing-title {\n\t\t\t\tfont-size: 14px;\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.request-type {\n\t\t\t\tfont-size: 13px;\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tmargin-bottom: 8px;\n\t\t\t}\n\n\t\t\t.request-detail {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\tpadding: 6px 0;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.request-detail:last-of-type {\n\t\t\t\tborder-bottom: none;\n\t\t\t}\n\n\t\t\t.detail-label {\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.detail-value {\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tmax-width: 220px;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.detail-value.copyable-addr {\n\t\t\t\tcursor: pointer;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-2xs);\n\t\t\t\tpadding: 1px 3px;\n\t\t\t\ttransition: background 0.15s;\n\t\t\t}\n\n\t\t\t.detail-value.copyable-addr:hover {\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-primary) 15%, transparent);\n\t\t\t}\n\n\t\t\t.detail-value.copied {\n\t\t\t\tcolor: var(--dev-wallet-positive);\n\t\t\t}\n\n\t\t\t.detail-secondary {\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tfont-size: 0.85em;\n\t\t\t}\n\n\t\t\t.request-data {\n\t\t\t\tmargin: 12px 0;\n\t\t\t\tpadding: 8px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tbackground: var(--dev-wallet-background);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tmax-height: 80px;\n\t\t\t\toverflow-y: auto;\n\t\t\t\tword-break: break-all;\n\t\t\t}\n\n\t\t\t.section-label {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tletter-spacing: 0.5px;\n\t\t\t\tmargin: 12px 0 6px;\n\t\t\t}\n\n\t\t\t.coin-flows {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 4px;\n\t\t\t\tmargin-bottom: 4px;\n\t\t\t}\n\n\t\t\t.coin-flow-item {\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: 8px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tbackground: var(--dev-wallet-background);\n\t\t\t\tfont-size: 12px;\n\t\t\t}\n\n\t\t\t.coin-flow-type {\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.coin-flow-amount {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-destructive);\n\t\t\t}\n\n\t\t\t.commands-list {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 4px;\n\t\t\t}\n\n\t\t\t.command-item {\n\t\t\t\tpadding: 8px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tbackground: var(--dev-wallet-background);\n\t\t\t\tfont-size: 12px;\n\t\t\t}\n\n\t\t\t.command-kind {\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tmargin-bottom: 2px;\n\t\t\t}\n\n\t\t\t.command-detail {\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 11px;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.command-args {\n\t\t\t\tmargin-top: 4px;\n\t\t\t\tpadding-left: 8px;\n\t\t\t\tborder-left: 2px solid var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.command-arg {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tpadding: 1px 0;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.arg-access {\n\t\t\t\tfont-size: 10px;\n\t\t\t\tpadding: 1px 4px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-2xs);\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t}\n\n\t\t\t.arg-access-read {\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-primary) 20%, transparent);\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t}\n\n\t\t\t.arg-access-mutate {\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-warning) 20%, transparent);\n\t\t\t\tcolor: var(--dev-wallet-warning);\n\t\t\t}\n\n\t\t\t.arg-access-transfer {\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-destructive) 20%, transparent);\n\t\t\t\tcolor: var(--dev-wallet-destructive);\n\t\t\t}\n\n\t\t\t.error-state {\n\t\t\t\tpadding: 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-destructive) 10%, transparent);\n\t\t\t\tcolor: var(--dev-wallet-destructive);\n\t\t\t\tfont-size: 12px;\n\t\t\t\tword-break: break-word;\n\t\t\t}\n\n\t\t\t.section-label-error {\n\t\t\t\tcolor: var(--dev-wallet-destructive);\n\t\t\t}\n\n\t\t\t.error-title {\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tmargin-bottom: 4px;\n\t\t\t}\n\n\t\t\t.error-body {\n\t\t\t\tmargin-bottom: 6px;\n\t\t\t}\n\n\t\t\t.error-hint {\n\t\t\t\tfont-size: 11px;\n\t\t\t\topacity: 0.8;\n\t\t\t}\n\n\t\t\t.no-request {\n\t\t\t\ttext-align: center;\n\t\t\t\tpadding: 20px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tfont-size: 13px;\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@state()\n\tprivate _analysis: TransactionAnalysis | null = null;\n\n\t@state()\n\tprivate _analysisError: string | null = null;\n\n\t@state()\n\tprivate _analyzing = false;\n\n\t#copy = new CopyController(this);\n\t#analysisGeneration = 0;\n\t#coinDecimalsCache = new Map<string, number>();\n\n\toverride willUpdate(changedProperties: Map<string, unknown>) {\n\t\tif (changedProperties.has('request')) {\n\t\t\tthis._analysis = null;\n\t\t\tthis._analysisError = null;\n\t\t\tthis._analyzing = false;\n\t\t\tif (this.request && this.request.type !== 'sign-personal-message') {\n\t\t\t\tthis.#analyzeTransaction();\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #analyzeTransaction() {\n\t\tif (!this.request || typeof this.request.data !== 'string') return;\n\n\t\tthis._analyzing = true;\n\t\tconst generation = ++this.#analysisGeneration;\n\n\t\tconst result = await analyzeTransaction(this.request.data, this.client);\n\t\tif (generation !== this.#analysisGeneration) return;\n\n\t\tif (result.kind === 'rich') {\n\t\t\tthis._analysis = result.analysis;\n\t\t\t// Fetch coin metadata for all coin types in flows\n\t\t\tif (this.client && result.analysis.coinFlows?.length) {\n\t\t\t\tconst coinTypes = [...new Set(result.analysis.coinFlows.map((f) => f.coinType))];\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tcoinTypes\n\t\t\t\t\t\t.filter((ct) => !this.#coinDecimalsCache.has(ct))\n\t\t\t\t\t\t.map(async (ct) => {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst { coinMetadata } = await this.client!.core.getCoinMetadata({\n\t\t\t\t\t\t\t\t\tcoinType: ct,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (coinMetadata) {\n\t\t\t\t\t\t\t\t\tthis.#coinDecimalsCache.set(ct, coinMetadata.decimals);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t// leave uncached — will use 0 as fallback\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tif (generation !== this.#analysisGeneration) return;\n\t\t\t\tthis.requestUpdate();\n\t\t\t}\n\t\t} else {\n\t\t\tthis._analysisError = result.message;\n\t\t}\n\n\t\tthis._analyzing = false;\n\t}\n\n\toverride render() {\n\t\tif (!this.request) {\n\t\t\treturn html`<div class=\"no-request\" part=\"empty-state\">No pending requests</div>`;\n\t\t}\n\n\t\tconst typeLabel = REQUEST_TYPE_LABELS[this.request.type];\n\n\t\t// For transactions: only allow approval after successful analysis\n\t\t// For personal messages: always allow (no analysis needed)\n\t\tconst isTransaction = this.request.type !== 'sign-personal-message';\n\t\tconst canApprove = isTransaction\n\t\t\t? this._analysis !== null && !this._analysisError && !this._analyzing\n\t\t\t: true;\n\n\t\treturn html`\n\t\t\t<div class=\"signing-content\">\n\t\t\t\t<div class=\"signing-header\">\n\t\t\t\t\t<span class=\"signing-badge\"></span>\n\t\t\t\t\t<span class=\"signing-title\">Approval Required</span>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"request-type\" part=\"request-type\">${typeLabel}</div>\n\n\t\t\t\t<div class=\"request-detail\">\n\t\t\t\t\t<span class=\"detail-label\">Account</span>\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\"detail-value copyable-addr ${this.#copy.isCopied(this.request.account.address)\n\t\t\t\t\t\t\t? 'copied'\n\t\t\t\t\t\t\t: ''}\"\n\t\t\t\t\t\ttitle=\"Click to copy\"\n\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\taria-label=\"Copy account address\"\n\t\t\t\t\t\t@click=${() => this.#copy.copy(this.request!.account.address)}\n\t\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\tthis.#copy.copy(this.request!.account.address);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t${this.#copy.isCopied(this.request.account.address)\n\t\t\t\t\t\t\t? 'Copied!'\n\t\t\t\t\t\t\t: this.request.account.label\n\t\t\t\t\t\t\t\t? html`${this.request.account.label}\n\t\t\t\t\t\t\t\t\t\t<span class=\"detail-secondary\"\n\t\t\t\t\t\t\t\t\t\t\t>${formatAddress(this.request.account.address)}</span\n\t\t\t\t\t\t\t\t\t\t>`\n\t\t\t\t\t\t\t\t: formatAddress(this.request.account.address)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t${isTransaction\n\t\t\t\t\t? html`<div class=\"request-detail\">\n\t\t\t\t\t\t\t<span class=\"detail-label\">Chain</span>\n\t\t\t\t\t\t\t<span class=\"detail-value\">${this.request.chain}</span>\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing}\n\t\t\t\t${this.#renderTransactionPreview()}\n\t\t\t</div>\n\t\t\t<div class=\"signing-footer\" part=\"footer\">\n\t\t\t\t<div class=\"actions\">\n\t\t\t\t\t<button class=\"btn btn-reject\" part=\"reject-button\" @click=${this.#reject}>Reject</button>\n\t\t\t\t\t${canApprove\n\t\t\t\t\t\t? html`<button class=\"btn btn-approve\" part=\"approve-button\" @click=${this.#approve}>\n\t\t\t\t\t\t\t\tApprove\n\t\t\t\t\t\t\t</button>`\n\t\t\t\t\t\t: nothing}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderTransactionPreview() {\n\t\tif (this._analyzing) {\n\t\t\treturn html`<div class=\"section-label\">Analyzing transaction...</div>`;\n\t\t}\n\n\t\tif (this._analysisError) {\n\t\t\treturn html`\n\t\t\t\t<div class=\"section-label section-label-error\">Analysis Failed</div>\n\t\t\t\t<div class=\"error-state\" part=\"error-message\">\n\t\t\t\t\t<div class=\"error-title\">Unable to analyze this transaction</div>\n\t\t\t\t\t<div class=\"error-body\">${this._analysisError}</div>\n\t\t\t\t\t<div class=\"error-hint\">\n\t\t\t\t\t\tThe transaction cannot be approved without successful analysis. Check that the network\n\t\t\t\t\t\tis reachable and the transaction is well-formed.\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tif (this._analysis) {\n\t\t\treturn html`\n\t\t\t\t${this.#renderCoinFlows()} ${this.#renderAnalyzedCommands(this._analysis.commands)}\n\t\t\t`;\n\t\t}\n\n\t\tconst dataPreview = this.#getDataPreview();\n\t\treturn dataPreview ? html`<div class=\"request-data\">${dataPreview}</div>` : nothing;\n\t}\n\n\t#renderCoinFlows() {\n\t\tconst flows = this._analysis?.coinFlows;\n\t\tif (!flows || flows.length === 0) return nothing;\n\n\t\treturn html`\n\t\t\t<div class=\"section-label\">Estimated Cost</div>\n\t\t\t<div class=\"coin-flows\">\n\t\t\t\t${flows.map((flow) => {\n\t\t\t\t\tconst decimals = this.#coinDecimalsCache.get(flow.coinType) ?? 0;\n\t\t\t\t\tconst formatted = formatCoinBalance(flow.amount, decimals);\n\t\t\t\t\treturn html`\n\t\t\t\t\t\t<div class=\"coin-flow-item\">\n\t\t\t\t\t\t\t<span class=\"coin-flow-type\">${getCoinSymbol(flow.coinType)}</span>\n\t\t\t\t\t\t\t<span class=\"coin-flow-amount\"> -${formatted} </span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`;\n\t\t\t\t})}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderAnalyzedCommands(commands: AnalyzedCommand[]) {\n\t\treturn html`\n\t\t\t<div class=\"section-label\">Commands</div>\n\t\t\t<div class=\"commands-list\">${commands.map((cmd) => this.#renderAnalyzedCommand(cmd))}</div>\n\t\t`;\n\t}\n\n\t#renderAnalyzedCommand(cmd: AnalyzedCommand) {\n\t\tswitch (cmd.$kind) {\n\t\t\tcase 'MoveCall':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">MoveCall</div>\n\t\t\t\t\t\t<div class=\"command-detail\">\n\t\t\t\t\t\t\t${cmd.function.packageId}::${cmd.function.moduleName}::${cmd.function.name}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t${cmd.arguments.length > 0 ? this.#renderArgs(cmd.arguments) : nothing}\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tcase 'TransferObjects':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">TransferObjects</div>\n\t\t\t\t\t\t<div class=\"command-detail\">\n\t\t\t\t\t\t\t${cmd.objects.length} object${cmd.objects.length !== 1 ? 's' : ''}\n\t\t\t\t\t\t\t${cmd.address.$kind === 'Pure'\n\t\t\t\t\t\t\t\t? html` &rarr; ${formatAddress(this.#decodePureAddress(cmd.address))}`\n\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tcase 'SplitCoins':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">SplitCoins</div>\n\t\t\t\t\t\t<div class=\"command-detail\">\n\t\t\t\t\t\t\t${cmd.amounts.length} split${cmd.amounts.length !== 1 ? 's' : ''} from\n\t\t\t\t\t\t\t${cmd.coin.$kind === 'GasCoin' ? 'gas coin' : 'coin'}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tcase 'MergeCoins':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">MergeCoins</div>\n\t\t\t\t\t\t<div class=\"command-detail\">\n\t\t\t\t\t\t\t${cmd.sources.length} source${cmd.sources.length !== 1 ? 's' : ''}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tcase 'Publish':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">Publish</div>\n\t\t\t\t\t\t<div class=\"command-detail\">New package</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tcase 'Upgrade':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">Upgrade</div>\n\t\t\t\t\t\t<div class=\"command-detail\">Package upgrade</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tdefault:\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">${cmd.$kind}</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t}\n\t}\n\n\t#renderArgs(args: import('@mysten/wallet-sdk').AnalyzedCommandArgument[]) {\n\t\treturn html`\n\t\t\t<div class=\"command-args\">\n\t\t\t\t${args.map(\n\t\t\t\t\t(arg) => html`\n\t\t\t\t\t\t<div class=\"command-arg\">\n\t\t\t\t\t\t\t<span class=\"arg-access arg-access-${arg.accessLevel}\">${arg.accessLevel}</span>\n\t\t\t\t\t\t\t${this.#describeArg(arg)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`,\n\t\t\t\t)}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#describeArg(arg: import('@mysten/wallet-sdk').AnalyzedCommandArgument): string {\n\t\tswitch (arg.$kind) {\n\t\t\tcase 'GasCoin':\n\t\t\t\treturn 'Gas Coin';\n\t\t\tcase 'Result':\n\t\t\t\treturn `Result [${arg.index[0]}, ${arg.index[1]}]`;\n\t\t\tcase 'Pure':\n\t\t\t\treturn `${arg.bytes.slice(0, 16)}${arg.bytes.length > 16 ? '...' : ''}`;\n\t\t\tcase 'Object':\n\t\t\t\treturn formatAddress(arg.object.objectId);\n\t\t\tcase 'Unknown':\n\t\t\t\treturn 'unknown';\n\t\t}\n\t}\n\n\t#decodePureAddress(arg: import('@mysten/wallet-sdk').AnalyzedCommandArgument): string {\n\t\tif (arg.$kind === 'Pure') {\n\t\t\ttry {\n\t\t\t\treturn bcs.Address.fromBase64(arg.bytes);\n\t\t\t} catch {\n\t\t\t\t// fall through\n\t\t\t}\n\t\t}\n\t\treturn '?';\n\t}\n\n\t#getDataPreview(): string | null {\n\t\tif (!this.request) return null;\n\n\t\tif (this.request.type === 'sign-personal-message') {\n\t\t\tconst data = this.request.data;\n\t\t\tif (data instanceof Uint8Array) {\n\t\t\t\ttry {\n\t\t\t\t\treturn new TextDecoder().decode(data);\n\t\t\t\t} catch {\n\t\t\t\t\treturn `[${data.length} bytes]`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (typeof this.request.data === 'string') {\n\t\t\treturn this.request.data.length > 200\n\t\t\t\t? this.request.data.slice(0, 200) + '...'\n\t\t\t\t: this.request.data;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t#approve() {\n\t\temitEvent(this, 'approve');\n\t}\n\n\t#reject() {\n\t\temitEvent(this, 'reject');\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-signing': DevWalletSigning;\n\t}\n}\n"],"mappings":";;;;;;;;;;AAgBA,MAAM,sBAAqE;CAC1E,yBAAyB;CACzB,oBAAoB;CACpB,gCAAgC;CAChC;AAGM,6BAAMA,2BAAyB,WAAW;;;iBAmQR;gBAGL;mBAGa;wBAGR;oBAGnB;;;gBA9QI;GACxB;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4PH;;CAiBD,QAAQ,IAAI,eAAe,KAAK;CAChC,sBAAsB;CACtB,qBAAqB,IAAI,KAAqB;CAE9C,AAAS,WAAW,mBAAyC;AAC5D,MAAI,kBAAkB,IAAI,UAAU,EAAE;AACrC,QAAK,YAAY;AACjB,QAAK,iBAAiB;AACtB,QAAK,aAAa;AAClB,OAAI,KAAK,WAAW,KAAK,QAAQ,SAAS,yBAAyB;AAClE,UAAKC,oBAAqB;;;;CAK7B,OAAMA,qBAAsB;AAC3B,MAAI,CAAC,KAAK,WAAW,OAAO,KAAK,QAAQ,SAAS,SAAU;AAE5D,OAAK,aAAa;EAClB,MAAM,aAAa,EAAE,MAAKC;EAE1B,MAAM,SAAS,MAAM,mBAAmB,KAAK,QAAQ,MAAM,KAAK,OAAO;AACvE,MAAI,eAAe,MAAKA,mBAAqB;AAE7C,MAAI,OAAO,SAAS,QAAQ;AAC3B,QAAK,YAAY,OAAO;AAExB,OAAI,KAAK,UAAU,OAAO,SAAS,WAAW,QAAQ;IACrD,MAAM,YAAY,CAAC,GAAG,IAAI,IAAI,OAAO,SAAS,UAAU,KAAK,MAAM,EAAE,SAAS,CAAC,CAAC;AAChF,UAAM,QAAQ,IACb,UACE,QAAQ,OAAO,CAAC,MAAKC,kBAAmB,IAAI,GAAG,CAAC,CAChD,IAAI,OAAO,OAAO;AAClB,SAAI;MACH,MAAM,EAAE,iBAAiB,MAAM,KAAK,OAAQ,KAAK,gBAAgB,EAChE,UAAU,IACV,CAAC;AACF,UAAI,cAAc;AACjB,aAAKA,kBAAmB,IAAI,IAAI,aAAa,SAAS;;aAEhD;MAGP,CACH;AACD,QAAI,eAAe,MAAKD,mBAAqB;AAC7C,SAAK,eAAe;;SAEf;AACN,QAAK,iBAAiB,OAAO;;AAG9B,OAAK,aAAa;;CAGnB,AAAS,SAAS;AACjB,MAAI,CAAC,KAAK,SAAS;AAClB,UAAO,IAAI;;EAGZ,MAAM,YAAY,oBAAoB,KAAK,QAAQ;EAInD,MAAM,gBAAgB,KAAK,QAAQ,SAAS;EAC5C,MAAM,aAAa,gBAChB,KAAK,cAAc,QAAQ,CAAC,KAAK,kBAAkB,CAAC,KAAK,aACzD;AAEH,SAAO,IAAI;;;;;;;oDAOuC,UAAU;;;;;0CAKpB,MAAKE,KAAM,SAAS,KAAK,QAAQ,QAAQ,QAAQ,GAClF,WACA,GAAG;;;;;qBAKS,MAAKA,KAAM,KAAK,KAAK,QAAS,QAAQ,QAAQ,CAAC;kBAClD,MAAqB;AAChC,OAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACvC,MAAE,gBAAgB;AAClB,UAAKA,KAAM,KAAK,KAAK,QAAS,QAAQ,QAAQ;;IAE9C;;QAEA,MAAKA,KAAM,SAAS,KAAK,QAAQ,QAAQ,QAAQ,GAChD,YACA,KAAK,QAAQ,QAAQ,QACpB,IAAI,GAAG,KAAK,QAAQ,QAAQ,MAAM;;cAE9B,cAAc,KAAK,QAAQ,QAAQ,QAAQ,CAAC;eAEhD,cAAc,KAAK,QAAQ,QAAQ,QAAQ,CAAC;;;MAGhD,gBACC,IAAI;;oCAEyB,KAAK,QAAQ,MAAM;gBAEhD,QAAQ;MACT,MAAKC,0BAA2B,CAAC;;;;kEAI2B,MAAKC,OAAQ;OACxE,aACC,IAAI,gEAAgE,MAAKC,QAAS;;oBAGlF,QAAQ;;;;;CAMf,4BAA4B;AAC3B,MAAI,KAAK,YAAY;AACpB,UAAO,IAAI;;AAGZ,MAAI,KAAK,gBAAgB;AACxB,UAAO,IAAI;;;;+BAIiB,KAAK,eAAe;;;;;;;;AASjD,MAAI,KAAK,WAAW;AACnB,UAAO,IAAI;MACR,MAAKC,iBAAkB,CAAC,GAAG,MAAKC,uBAAwB,KAAK,UAAU,SAAS,CAAC;;;EAIrF,MAAM,cAAc,MAAKC,gBAAiB;AAC1C,SAAO,cAAc,IAAI,6BAA6B,YAAY,UAAU;;CAG7E,mBAAmB;EAClB,MAAM,QAAQ,KAAK,WAAW;AAC9B,MAAI,CAAC,SAAS,MAAM,WAAW,EAAG,QAAO;AAEzC,SAAO,IAAI;;;MAGP,MAAM,KAAK,SAAS;GACrB,MAAM,WAAW,MAAKP,kBAAmB,IAAI,KAAK,SAAS,IAAI;GAC/D,MAAM,YAAY,kBAAkB,KAAK,QAAQ,SAAS;AAC1D,UAAO,IAAI;;sCAEsB,cAAc,KAAK,SAAS,CAAC;0CACzB,UAAU;;;IAG9C,CAAC;;;;CAKN,wBAAwB,UAA6B;AACpD,SAAO,IAAI;;gCAEmB,SAAS,KAAK,QAAQ,MAAKQ,sBAAuB,IAAI,CAAC,CAAC;;;CAIvF,uBAAuB,KAAsB;AAC5C,UAAQ,IAAI,OAAZ;GACC,KAAK,WACJ,QAAO,IAAI;;;;SAIN,IAAI,SAAS,UAAU,IAAI,IAAI,SAAS,WAAW,IAAI,IAAI,SAAS,KAAK;;QAE1E,IAAI,UAAU,SAAS,IAAI,MAAKC,WAAY,IAAI,UAAU,GAAG,QAAQ;;;GAG1E,KAAK,kBACJ,QAAO,IAAI;;;;SAIN,IAAI,QAAQ,OAAO,SAAS,IAAI,QAAQ,WAAW,IAAI,MAAM,GAAG;SAChE,IAAI,QAAQ,UAAU,SACrB,IAAI,WAAW,cAAc,MAAKC,kBAAmB,IAAI,QAAQ,CAAC,KAClE,QAAQ;;;;GAIf,KAAK,aACJ,QAAO,IAAI;;;;SAIN,IAAI,QAAQ,OAAO,QAAQ,IAAI,QAAQ,WAAW,IAAI,MAAM,GAAG;SAC/D,IAAI,KAAK,UAAU,YAAY,aAAa,OAAO;;;;GAIzD,KAAK,aACJ,QAAO,IAAI;;;;SAIN,IAAI,QAAQ,OAAO,SAAS,IAAI,QAAQ,WAAW,IAAI,MAAM,GAAG;;;;GAItE,KAAK,UACJ,QAAO,IAAI;;;;;;GAMZ,KAAK,UACJ,QAAO,IAAI;;;;;;GAMZ,QACC,QAAO,IAAI;;kCAEmB,IAAI,MAAM;;;;;CAM3C,YAAY,MAA8D;AACzE,SAAO,IAAI;;MAEP,KAAK,KACL,QAAQ,IAAI;;4CAE0B,IAAI,YAAY,IAAI,IAAI,YAAY;SACvE,MAAKC,YAAa,IAAI,CAAC;;OAG3B,CAAC;;;;CAKL,aAAa,KAAmE;AAC/E,UAAQ,IAAI,OAAZ;GACC,KAAK,UACJ,QAAO;GACR,KAAK,SACJ,QAAO,WAAW,IAAI,MAAM,GAAG,IAAI,IAAI,MAAM,GAAG;GACjD,KAAK,OACJ,QAAO,GAAG,IAAI,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,MAAM,SAAS,KAAK,QAAQ;GACpE,KAAK,SACJ,QAAO,cAAc,IAAI,OAAO,SAAS;GAC1C,KAAK,UACJ,QAAO;;;CAIV,mBAAmB,KAAmE;AACrF,MAAI,IAAI,UAAU,QAAQ;AACzB,OAAI;AACH,WAAO,IAAI,QAAQ,WAAW,IAAI,MAAM;WACjC;;AAIT,SAAO;;CAGR,kBAAiC;AAChC,MAAI,CAAC,KAAK,QAAS,QAAO;AAE1B,MAAI,KAAK,QAAQ,SAAS,yBAAyB;GAClD,MAAM,OAAO,KAAK,QAAQ;AAC1B,OAAI,gBAAgB,YAAY;AAC/B,QAAI;AACH,YAAO,IAAI,aAAa,CAAC,OAAO,KAAK;YAC9B;AACP,YAAO,IAAI,KAAK,OAAO;;;;AAK1B,MAAI,OAAO,KAAK,QAAQ,SAAS,UAAU;AAC1C,UAAO,KAAK,QAAQ,KAAK,SAAS,MAC/B,KAAK,QAAQ,KAAK,MAAM,GAAG,IAAI,GAAG,QAClC,KAAK,QAAQ;;AAGjB,SAAO;;CAGR,WAAW;AACV,YAAU,MAAM,UAAU;;CAG3B,UAAU;AACT,YAAU,MAAM,SAAS;;;YA9UzB,SAAS,EAAE,WAAW,OAAO,CAAC;YAG9B,SAAS,EAAE,WAAW,OAAO,CAAC;YAG9B,OAAO;YAGP,OAAO;YAGP,OAAO;+BA/QR,cAAc,qBAAqB"}
1
+ {"version":3,"file":"dev-wallet-signing.mjs","names":["#lastCoinsRef","#coinIndex","#analyzeTransaction","#analysisGeneration","#coinDecimalsCache","#coinSymbolCache","#copy","#renderTransactionPreview","#reject","#approve","#renderCoinFlows","#renderAnalyzedCommands","#getDataPreview","#renderAnalyzedCommand","#renderArgs","#decodePureAddress","#describeArg"],"sources":["../../src/ui/dev-wallet-signing.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { bcs } from '@mysten/sui/bcs';\nimport type { ClientWithCoreApi } from '@mysten/sui/client';\nimport type { AnalyzedCommand } from '@mysten/wallet-sdk';\nimport { css, html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport type { PendingSigningRequest } from '../wallet/dev-wallet.js';\nimport { CopyController } from './copy-controller.js';\nimport {\n\tactionButtonStyles,\n\tcopyableTextStyles,\n\tlistContainerStyles,\n\tmonoTruncateStyles,\n\tsharedStyles,\n\tsubLabelStyles,\n} from './styles.js';\nimport type { TransactionAnalysis } from './transaction-analyzer.js';\nimport { analyzeTransaction } from './transaction-analyzer.js';\nimport type { CoinManifestEntry, CoinRecord } from './utils.js';\nimport {\n\temitEvent,\n\tformatAddress,\n\tformatCoinBalance,\n\tgetCoinSymbol,\n\tindexCoinsByType,\n\tlookupCoinByType,\n} from './utils.js';\n\nconst REQUEST_TYPE_LABELS: Record<PendingSigningRequest['type'], string> = {\n\t'sign-personal-message': 'Sign Message',\n\t'sign-transaction': 'Sign Transaction',\n\t'sign-and-execute-transaction': 'Sign & Execute Transaction',\n};\n\n@customElement('dev-wallet-signing')\nexport class DevWalletSigning extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tactionButtonStyles,\n\t\tcopyableTextStyles,\n\t\tlistContainerStyles,\n\t\tmonoTruncateStyles,\n\t\tsubLabelStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex: 1;\n\t\t\t\tflex-direction: column;\n\t\t\t\toverflow: hidden;\n\t\t\t\tmin-height: 0;\n\t\t\t}\n\n\t\t\t.signing-content {\n\t\t\t\tflex: 1;\n\t\t\t\toverflow-y: auto;\n\t\t\t\tpadding: 16px;\n\t\t\t\tbackground: var(--dev-wallet-bg-0);\n\t\t\t}\n\n\t\t\t.signing-footer {\n\t\t\t\tpadding: 12px 16px;\n\t\t\t\tborder-top: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t}\n\n\t\t\t.signing-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tmargin-bottom: 10px;\n\t\t\t}\n\n\t\t\t.signing-badge {\n\t\t\t\tdisplay: inline-block;\n\t\t\t\twidth: 8px;\n\t\t\t\theight: 8px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tbackground: var(--dev-wallet-warning);\n\t\t\t\tanimation: pulse 2s infinite;\n\t\t\t}\n\n\t\t\t@keyframes pulse {\n\t\t\t\t0%,\n\t\t\t\t100% {\n\t\t\t\t\topacity: 1;\n\t\t\t\t}\n\t\t\t\t50% {\n\t\t\t\t\topacity: 0.5;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t.signing-title {\n\t\t\t\tfont-size: 12px;\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.request-type {\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\theight: 22px;\n\t\t\t\tpadding: 0 8px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tborder: 1px solid var(--dev-wallet-border-strong);\n\t\t\t\tbackground: var(--dev-wallet-accent-fade);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10.5px;\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tmargin-bottom: 10px;\n\t\t\t}\n\n\t\t\t.request-detail {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: space-between;\n\t\t\t\tgap: 12px;\n\t\t\t\tpadding: 8px 0;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.request-detail:last-of-type {\n\t\t\t\tborder-bottom: none;\n\t\t\t}\n\n\t\t\t.detail-label {\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.detail-value {\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tmax-width: 220px;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.detail-value.copyable-addr {\n\t\t\t\tpadding: 1px 3px;\n\t\t\t}\n\n\t\t\t.detail-secondary {\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tfont-size: 0.85em;\n\t\t\t}\n\n\t\t\t.request-data {\n\t\t\t\tmargin: 12px 0;\n\t\t\t\tpadding: 10px 12px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-0);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 11.5px;\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tmax-height: 120px;\n\t\t\t\toverflow-y: auto;\n\t\t\t\tword-break: break-all;\n\t\t\t\tline-height: 1.55;\n\t\t\t}\n\n\t\t\t.section-label {\n\t\t\t\tmargin: 12px 0 6px;\n\t\t\t}\n\n\t\t\t.coin-flows {\n\t\t\t\tmargin-bottom: 4px;\n\t\t\t}\n\n\t\t\t.coin-flow-item {\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: 8px 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t\tfont-size: 12px;\n\t\t\t}\n\n\t\t\t.coin-flow-type {\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.coin-flow-amount {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-destructive);\n\t\t\t}\n\n\t\t\t.command-item {\n\t\t\t\tpadding: 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-surface);\n\t\t\t\tfont-size: 12px;\n\t\t\t}\n\n\t\t\t.command-kind {\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t\tmargin-bottom: 2px;\n\t\t\t}\n\n\t\t\t.command-detail {\n\t\t\t\tfont-size: 11px;\n\t\t\t}\n\n\t\t\t.command-args {\n\t\t\t\tmargin-top: 4px;\n\t\t\t\tpadding-left: 8px;\n\t\t\t\tborder-left: 2px solid var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.command-arg {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tpadding: 1px 0;\n\t\t\t}\n\n\t\t\t.arg-access {\n\t\t\t\tfont-size: 10px;\n\t\t\t\tpadding: 1px 4px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-2xs);\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t}\n\n\t\t\t.arg-access-read {\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-primary) 20%, transparent);\n\t\t\t\tcolor: var(--dev-wallet-primary);\n\t\t\t}\n\n\t\t\t.arg-access-mutate {\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-warning) 20%, transparent);\n\t\t\t\tcolor: var(--dev-wallet-warning);\n\t\t\t}\n\n\t\t\t.arg-access-transfer {\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-destructive) 20%, transparent);\n\t\t\t\tcolor: var(--dev-wallet-destructive);\n\t\t\t}\n\n\t\t\t.error-state {\n\t\t\t\tpadding: 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-xs);\n\t\t\t\tbackground: color-mix(in oklab, var(--dev-wallet-destructive) 10%, transparent);\n\t\t\t\tcolor: var(--dev-wallet-destructive);\n\t\t\t\tfont-size: 12px;\n\t\t\t\tword-break: break-word;\n\t\t\t}\n\n\t\t\t.error-title {\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t\tmargin-bottom: 4px;\n\t\t\t}\n\n\t\t\t.error-body {\n\t\t\t\tmargin-bottom: 6px;\n\t\t\t}\n\n\t\t\t.error-hint {\n\t\t\t\tfont-size: 11px;\n\t\t\t\topacity: 0.8;\n\t\t\t}\n\n\t\t\t.no-request {\n\t\t\t\ttext-align: center;\n\t\t\t\tpadding: 20px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t\tfont-size: 13px;\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/** Optional pre-seeded coin metadata — pass the generated `coins`\n\t * constant from devstack codegen to skip per-coin `getCoinMetadata`\n\t * RPC fetches when rendering coin-flow estimates. Unknown coin types\n\t * fall through to an RPC fetch as before. */\n\t@property({ attribute: false })\n\tcoins: CoinRecord | null = null;\n\n\t@state()\n\tprivate _analysis: TransactionAnalysis | null = null;\n\n\t@state()\n\tprivate _analysisError: string | null = null;\n\n\t@state()\n\tprivate _analyzing = false;\n\n\t#copy = new CopyController(this);\n\t#analysisGeneration = 0;\n\t#coinDecimalsCache = new Map<string, number>();\n\t#coinSymbolCache = new Map<string, string>();\n\t#coinIndex: ReadonlyMap<string, CoinManifestEntry> = new Map();\n\t#lastCoinsRef: CoinRecord | null = null;\n\n\toverride willUpdate(changedProperties: Map<string, unknown>) {\n\t\tif (changedProperties.has('coins') && this.coins !== this.#lastCoinsRef) {\n\t\t\tthis.#coinIndex = indexCoinsByType(this.coins);\n\t\t\tthis.#lastCoinsRef = this.coins;\n\t\t}\n\t\tif (changedProperties.has('request')) {\n\t\t\tthis._analysis = null;\n\t\t\tthis._analysisError = null;\n\t\t\tthis._analyzing = false;\n\t\t\tif (this.request && this.request.type !== 'sign-personal-message') {\n\t\t\t\tthis.#analyzeTransaction();\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #analyzeTransaction() {\n\t\tif (!this.request || typeof this.request.data !== 'string') return;\n\n\t\tthis._analyzing = true;\n\t\tconst generation = ++this.#analysisGeneration;\n\n\t\tconst result = await analyzeTransaction(this.request.data, this.client);\n\t\tif (generation !== this.#analysisGeneration) return;\n\n\t\tif (result.kind === 'rich') {\n\t\t\tthis._analysis = result.analysis;\n\t\t\t// Seed coin metadata for all coin types in flows. The generated\n\t\t\t// `coins` record (when provided) short-circuits the per-coin\n\t\t\t// `getCoinMetadata` RPC; only unknown coin types fall through to\n\t\t\t// the network.\n\t\t\tif (result.analysis.coinFlows?.length) {\n\t\t\t\tconst coinTypes = [...new Set(result.analysis.coinFlows.map((f) => f.coinType))];\n\t\t\t\tconst unresolved: string[] = [];\n\t\t\t\tfor (const ct of coinTypes) {\n\t\t\t\t\tif (this.#coinDecimalsCache.has(ct)) continue;\n\t\t\t\t\tconst seed = lookupCoinByType(this.#coinIndex, ct);\n\t\t\t\t\tif (seed !== undefined) {\n\t\t\t\t\t\tthis.#coinDecimalsCache.set(ct, seed.decimals);\n\t\t\t\t\t\tif (seed.symbol !== undefined) this.#coinSymbolCache.set(ct, seed.symbol);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tunresolved.push(ct);\n\t\t\t\t}\n\t\t\t\tif (this.client && unresolved.length > 0) {\n\t\t\t\t\tawait Promise.all(\n\t\t\t\t\t\tunresolved.map(async (ct) => {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst { coinMetadata } = await this.client!.core.getCoinMetadata({\n\t\t\t\t\t\t\t\t\tcoinType: ct,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (coinMetadata) {\n\t\t\t\t\t\t\t\t\tthis.#coinDecimalsCache.set(ct, coinMetadata.decimals);\n\t\t\t\t\t\t\t\t\tif (coinMetadata.symbol) this.#coinSymbolCache.set(ct, coinMetadata.symbol);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t// leave uncached — will use 0 as fallback\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\t\t\t\t\tif (generation !== this.#analysisGeneration) return;\n\t\t\t\t}\n\t\t\t\tthis.requestUpdate();\n\t\t\t}\n\t\t} else {\n\t\t\tthis._analysisError = result.message;\n\t\t}\n\n\t\tthis._analyzing = false;\n\t}\n\n\toverride render() {\n\t\tif (!this.request) {\n\t\t\treturn html`<div class=\"no-request\" part=\"empty-state\">No pending requests</div>`;\n\t\t}\n\n\t\tconst typeLabel = REQUEST_TYPE_LABELS[this.request.type];\n\t\tconst account = this.request.account as PendingSigningRequest['account'] | undefined;\n\n\t\t// For transactions: only allow approval after successful analysis\n\t\t// For personal messages: always allow (no analysis needed)\n\t\tconst isTransaction = this.request.type !== 'sign-personal-message';\n\t\tconst canApprove = isTransaction\n\t\t\t? this._analysis !== null && !this._analysisError && !this._analyzing\n\t\t\t: true;\n\n\t\treturn html`\n\t\t\t<div class=\"signing-content\">\n\t\t\t\t<div class=\"signing-header\">\n\t\t\t\t\t<span class=\"signing-badge\"></span>\n\t\t\t\t\t<span class=\"signing-title\">Approval Required</span>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"request-type\" part=\"request-type\">${typeLabel ?? 'Signing Request'}</div>\n\n\t\t\t\t${account\n\t\t\t\t\t? html`<div class=\"request-detail\">\n\t\t\t\t\t\t\t<span class=\"detail-label\">Account</span>\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclass=\"detail-value copyable-addr ${this.#copy.isCopied(account.address)\n\t\t\t\t\t\t\t\t\t? 'copied'\n\t\t\t\t\t\t\t\t\t: ''}\"\n\t\t\t\t\t\t\t\ttitle=\"Click to copy\"\n\t\t\t\t\t\t\t\trole=\"button\"\n\t\t\t\t\t\t\t\ttabindex=\"0\"\n\t\t\t\t\t\t\t\taria-label=\"Copy account address\"\n\t\t\t\t\t\t\t\t@click=${() => this.#copy.copy(account.address)}\n\t\t\t\t\t\t\t\t@keydown=${(e: KeyboardEvent) => {\n\t\t\t\t\t\t\t\t\tif (e.key === 'Enter' || e.key === ' ') {\n\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\tthis.#copy.copy(account.address);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t${this.#copy.isCopied(account.address)\n\t\t\t\t\t\t\t\t\t? 'Copied!'\n\t\t\t\t\t\t\t\t\t: account.label\n\t\t\t\t\t\t\t\t\t\t? html`${account.label}\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"detail-secondary\">${formatAddress(account.address)}</span>`\n\t\t\t\t\t\t\t\t\t\t: formatAddress(account.address)}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing}\n\t\t\t\t${isTransaction\n\t\t\t\t\t? html`<div class=\"request-detail\">\n\t\t\t\t\t\t\t<span class=\"detail-label\">Chain</span>\n\t\t\t\t\t\t\t<span class=\"detail-value\">${this.request.chain}</span>\n\t\t\t\t\t\t</div>`\n\t\t\t\t\t: nothing}\n\t\t\t\t${this.#renderTransactionPreview()}\n\t\t\t</div>\n\t\t\t<div class=\"signing-footer\" part=\"footer\">\n\t\t\t\t<div class=\"actions\">\n\t\t\t\t\t<button class=\"btn btn-reject\" part=\"reject-button\" @click=${this.#reject}>Reject</button>\n\t\t\t\t\t${canApprove\n\t\t\t\t\t\t? html`<button class=\"btn btn-approve\" part=\"approve-button\" @click=${this.#approve}>\n\t\t\t\t\t\t\t\tApprove\n\t\t\t\t\t\t\t</button>`\n\t\t\t\t\t\t: nothing}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderTransactionPreview() {\n\t\tif (this._analyzing) {\n\t\t\treturn html`<div class=\"section-label\">Analyzing transaction...</div>`;\n\t\t}\n\n\t\tif (this._analysisError) {\n\t\t\treturn html`\n\t\t\t\t<div class=\"section-label section-label-error\">Analysis Failed</div>\n\t\t\t\t<div class=\"error-state\" part=\"error-message\">\n\t\t\t\t\t<div class=\"error-title\">Unable to analyze this transaction</div>\n\t\t\t\t\t<div class=\"error-body\">${this._analysisError}</div>\n\t\t\t\t\t<div class=\"error-hint\">\n\t\t\t\t\t\tThe transaction cannot be approved without successful analysis. Check that the network\n\t\t\t\t\t\tis reachable and the transaction is well-formed.\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tif (this._analysis) {\n\t\t\treturn html`\n\t\t\t\t${this.#renderCoinFlows()} ${this.#renderAnalyzedCommands(this._analysis.commands)}\n\t\t\t`;\n\t\t}\n\n\t\tconst dataPreview = this.#getDataPreview();\n\t\treturn dataPreview ? html`<div class=\"request-data\">${dataPreview}</div>` : nothing;\n\t}\n\n\t#renderCoinFlows() {\n\t\tconst flows = this._analysis?.coinFlows;\n\t\tif (!flows || flows.length === 0) return nothing;\n\n\t\treturn html`\n\t\t\t<div class=\"section-label\">Estimated Cost</div>\n\t\t\t<div class=\"coin-flows\">\n\t\t\t\t${flows.map((flow) => {\n\t\t\t\t\tconst decimals = this.#coinDecimalsCache.get(flow.coinType) ?? 0;\n\t\t\t\t\tconst symbol = this.#coinSymbolCache.get(flow.coinType) ?? getCoinSymbol(flow.coinType);\n\t\t\t\t\tconst formatted = formatCoinBalance(flow.amount, decimals);\n\t\t\t\t\treturn html`\n\t\t\t\t\t\t<div class=\"coin-flow-item\">\n\t\t\t\t\t\t\t<span class=\"coin-flow-type\">${symbol}</span>\n\t\t\t\t\t\t\t<span class=\"coin-flow-amount\"> -${formatted} </span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`;\n\t\t\t\t})}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderAnalyzedCommands(commands: AnalyzedCommand[]) {\n\t\treturn html`\n\t\t\t<div class=\"section-label\">Commands</div>\n\t\t\t<div class=\"commands-list\">${commands.map((cmd) => this.#renderAnalyzedCommand(cmd))}</div>\n\t\t`;\n\t}\n\n\t#renderAnalyzedCommand(cmd: AnalyzedCommand) {\n\t\tswitch (cmd.$kind) {\n\t\t\tcase 'MoveCall':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">MoveCall</div>\n\t\t\t\t\t\t<div class=\"command-detail\">\n\t\t\t\t\t\t\t${cmd.function.packageId}::${cmd.function.moduleName}::${cmd.function.name}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t${cmd.arguments.length > 0 ? this.#renderArgs(cmd.arguments) : nothing}\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tcase 'TransferObjects':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">TransferObjects</div>\n\t\t\t\t\t\t<div class=\"command-detail\">\n\t\t\t\t\t\t\t${cmd.objects.length} object${cmd.objects.length !== 1 ? 's' : ''}\n\t\t\t\t\t\t\t${cmd.address.$kind === 'Pure'\n\t\t\t\t\t\t\t\t? html` &rarr; ${formatAddress(this.#decodePureAddress(cmd.address))}`\n\t\t\t\t\t\t\t\t: nothing}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tcase 'SplitCoins':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">SplitCoins</div>\n\t\t\t\t\t\t<div class=\"command-detail\">\n\t\t\t\t\t\t\t${cmd.amounts.length} split${cmd.amounts.length !== 1 ? 's' : ''} from\n\t\t\t\t\t\t\t${cmd.coin.$kind === 'GasCoin' ? 'gas coin' : 'coin'}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tcase 'MergeCoins':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">MergeCoins</div>\n\t\t\t\t\t\t<div class=\"command-detail\">\n\t\t\t\t\t\t\t${cmd.sources.length} source${cmd.sources.length !== 1 ? 's' : ''}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tcase 'Publish':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">Publish</div>\n\t\t\t\t\t\t<div class=\"command-detail\">New package</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tcase 'Upgrade':\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">Upgrade</div>\n\t\t\t\t\t\t<div class=\"command-detail\">Package upgrade</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t\tdefault:\n\t\t\t\treturn html`\n\t\t\t\t\t<div class=\"command-item\">\n\t\t\t\t\t\t<div class=\"command-kind\">${cmd.$kind}</div>\n\t\t\t\t\t</div>\n\t\t\t\t`;\n\t\t}\n\t}\n\n\t#renderArgs(args: import('@mysten/wallet-sdk').AnalyzedCommandArgument[]) {\n\t\treturn html`\n\t\t\t<div class=\"command-args\">\n\t\t\t\t${args.map(\n\t\t\t\t\t(arg) => html`\n\t\t\t\t\t\t<div class=\"command-arg\">\n\t\t\t\t\t\t\t<span class=\"arg-access arg-access-${arg.accessLevel}\">${arg.accessLevel}</span>\n\t\t\t\t\t\t\t${this.#describeArg(arg)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`,\n\t\t\t\t)}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#describeArg(arg: import('@mysten/wallet-sdk').AnalyzedCommandArgument): string {\n\t\tswitch (arg.$kind) {\n\t\t\tcase 'GasCoin':\n\t\t\t\treturn 'Gas Coin';\n\t\t\tcase 'Result':\n\t\t\t\treturn `Result [${arg.index[0]}, ${arg.index[1]}]`;\n\t\t\tcase 'Pure':\n\t\t\t\treturn `${arg.bytes.slice(0, 16)}${arg.bytes.length > 16 ? '...' : ''}`;\n\t\t\tcase 'Object':\n\t\t\t\treturn formatAddress(arg.object.objectId);\n\t\t\tcase 'Unknown':\n\t\t\t\treturn 'unknown';\n\t\t}\n\t}\n\n\t#decodePureAddress(arg: import('@mysten/wallet-sdk').AnalyzedCommandArgument): string {\n\t\tif (arg.$kind === 'Pure') {\n\t\t\ttry {\n\t\t\t\treturn bcs.Address.fromBase64(arg.bytes);\n\t\t\t} catch {\n\t\t\t\t// fall through\n\t\t\t}\n\t\t}\n\t\treturn '?';\n\t}\n\n\t#getDataPreview(): string | null {\n\t\tif (!this.request) return null;\n\n\t\tif (this.request.type === 'sign-personal-message') {\n\t\t\tconst data = this.request.data;\n\t\t\tif (data instanceof Uint8Array) {\n\t\t\t\ttry {\n\t\t\t\t\treturn new TextDecoder().decode(data);\n\t\t\t\t} catch {\n\t\t\t\t\treturn `[${data.length} bytes]`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (typeof this.request.data === 'string') {\n\t\t\treturn this.request.data.length > 200\n\t\t\t\t? this.request.data.slice(0, 200) + '...'\n\t\t\t\t: this.request.data;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t#approve() {\n\t\temitEvent(this, 'approve');\n\t}\n\n\t#reject() {\n\t\temitEvent(this, 'reject');\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-signing': DevWalletSigning;\n\t}\n}\n"],"mappings":"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"}
@@ -1,17 +1,22 @@
1
1
  import { DevWallet } from "../wallet/dev-wallet.mjs";
2
- import * as lit14 from "lit";
2
+ import { CoinRecord } from "./utils.mjs";
3
+ import * as _$lit from "lit";
3
4
  import { LitElement } from "lit";
4
5
 
5
6
  //#region src/ui/dev-wallet-standalone.d.ts
6
7
  declare class DevWalletStandalone extends LitElement {
7
8
  #private;
8
- static styles: (lit14.CSSResult | lit14.CSSResult[])[];
9
+ static styles: (_$lit.CSSResult | _$lit.CSSResult[])[];
9
10
  wallet: DevWallet | null;
10
11
  /** When set, the settings tab shows a bookmarklet section pointing to this origin. */
11
12
  bookmarkletOrigin: string;
13
+ /** Optional pre-seeded coin metadata. Pass the generated `coins`
14
+ * constant from devstack codegen to skip per-coin RPC fetches in the
15
+ * balances list and signing modal. */
16
+ coins: CoinRecord | null;
12
17
  willUpdate(changedProperties: Map<string, unknown>): void;
13
18
  updated(): void;
14
- render(): lit14.TemplateResult<1>;
19
+ render(): _$lit.TemplateResult<1>;
15
20
  }
16
21
  declare global {
17
22
  interface HTMLElementTagNameMap {
@@ -1 +1 @@
1
- {"version":3,"file":"dev-wallet-standalone.d.mts","names":[],"sources":["../../src/ui/dev-wallet-standalone.ts"],"mappings":";;;;;cAWa,mBAAA,SAA4B,UAAA;EAAA;SACxB,MAAA,GADgB,KAAA,CACV,SAAA,GAAA,KAAA,CAAA,SAAA;EA0EtB,MAAA,EAAQ,SAAA;EA3EwB;EA+EhC,iBAAA;EAIS,UAAA,CAAW,iBAAA,EAAmB,GAAA;EAS9B,OAAA,CAAA;EASA,MAAA,CAAA,GAlBiC,KAAA,CAkB3B,cAAA;AAAA;AAAA,QAmBR,MAAA;EAAA,UACG,qBAAA;IACT,uBAAA,EAAyB,mBAAA;EAAA;AAAA"}
1
+ {"version":3,"file":"dev-wallet-standalone.d.mts","names":[],"sources":["../../src/ui/dev-wallet-standalone.ts"],"mappings":";;;;;;cAYa,mBAAA,SAA4B,UAAA;EAAA;SACxB,MAAA,GADgB,KAAA,CACV,SAAA,GAAA,KAAA,CAAA,SAAA;EAgQtB,MAAA,EAAQ,SAAA;EAjQwB;EAqQhC,iBAAA;EArQgC;;;EA2QhC,KAAA,EAAO,UAAA;EAIE,UAAA,CAAW,iBAAA,EAAmB,GAAA;EAY9B,OAAA,CAAA;EASA,MAAA,CAAA,GArBiC,KAAA,CAqB3B,cAAA;AAAA;AAAA,QAmHR,MAAA;EAAA,UACG,qBAAA;IACT,uBAAA,EAAyB,mBAAA;EAAA;AAAA"}
@@ -1,15 +1,16 @@
1
1
  import { connectDialogStyles, sharedStyles } from "./styles.mjs";
2
- import { __decorate } from "../_virtual/_@oxc-project_runtime@0.107.0/helpers/decorate.mjs";
2
+ import { __decorate } from "../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.mjs";
3
3
  import { WalletController } from "./wallet-controller.mjs";
4
4
  import { LitElement, css, html } from "lit";
5
5
  import { customElement, property } from "lit/decorators.js";
6
-
7
6
  //#region src/ui/dev-wallet-standalone.ts
8
- let DevWalletStandalone = class DevWalletStandalone$1 extends LitElement {
7
+ let DevWalletStandalone = class DevWalletStandalone extends LitElement {
9
8
  constructor(..._args) {
10
9
  super(..._args);
11
10
  this.wallet = null;
12
11
  this.bookmarkletOrigin = "";
12
+ this.coins = null;
13
+ this.#ctrl = new WalletController(this);
13
14
  }
14
15
  static {
15
16
  this.styles = [
@@ -17,36 +18,187 @@ let DevWalletStandalone = class DevWalletStandalone$1 extends LitElement {
17
18
  connectDialogStyles,
18
19
  css`
19
20
  :host {
20
- display: flex;
21
- justify-content: center;
22
- padding: 24px 16px;
21
+ display: block;
23
22
  min-height: 100vh;
24
23
  box-sizing: border-box;
24
+ padding: 24px;
25
+ color: var(--dev-wallet-foreground);
26
+ background-color: var(--dev-wallet-bg-0);
27
+ background-image:
28
+ linear-gradient(var(--dev-wallet-border) 1px, transparent 1px),
29
+ linear-gradient(90deg, var(--dev-wallet-border) 1px, transparent 1px);
30
+ background-size: 32px 32px;
31
+ background-position: -1px -1px;
32
+ }
33
+
34
+ .standalone-layout {
35
+ width: 100%;
36
+ max-width: 1220px;
37
+ min-height: calc(100vh - 48px);
38
+ margin: 0 auto;
39
+ padding: 24px 0;
40
+ display: grid;
41
+ grid-template-columns: minmax(240px, 1fr) 480px minmax(260px, 1fr);
42
+ gap: 20px;
43
+ align-items: start;
44
+ }
45
+
46
+ .rail {
47
+ min-width: 0;
48
+ display: flex;
49
+ flex-direction: column;
50
+ gap: 16px;
51
+ padding-top: 6px;
52
+ }
53
+
54
+ .wordmark {
55
+ display: flex;
56
+ align-items: center;
57
+ gap: 10px;
58
+ }
59
+
60
+ .logo-mark {
61
+ width: 28px;
62
+ height: 28px;
63
+ border-radius: 9px;
64
+ display: inline-flex;
65
+ align-items: center;
66
+ justify-content: center;
67
+ color: var(--dev-wallet-primary-foreground);
68
+ background:
69
+ radial-gradient(circle at 35% 25%, rgba(255, 255, 255, 0.5), transparent 24px),
70
+ linear-gradient(135deg, var(--dev-wallet-primary), var(--dev-wallet-teal));
71
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.16);
72
+ }
73
+
74
+ .logo-mark svg {
75
+ width: 18px;
76
+ height: 18px;
77
+ }
78
+
79
+ .wordmark-title {
80
+ display: flex;
81
+ flex-direction: column;
82
+ line-height: 1.1;
83
+ }
84
+
85
+ .wordmark-title strong {
86
+ font-size: 16px;
87
+ font-weight: var(--dev-wallet-font-weight-semibold);
88
+ }
89
+
90
+ .version {
91
+ font-family: var(--dev-wallet-font-mono);
92
+ font-size: 9px;
93
+ letter-spacing: 0.12em;
94
+ text-transform: uppercase;
95
+ color: var(--dev-wallet-text-3);
96
+ }
97
+
98
+ .rail-section {
99
+ display: flex;
100
+ flex-direction: column;
101
+ gap: 8px;
102
+ }
103
+
104
+ .rail-title {
105
+ font-family: var(--dev-wallet-font-mono);
106
+ font-size: 10px;
107
+ font-weight: var(--dev-wallet-font-weight-medium);
108
+ letter-spacing: 0.14em;
109
+ text-transform: uppercase;
110
+ color: var(--dev-wallet-text-3);
111
+ }
112
+
113
+ .code {
114
+ margin: 0;
115
+ overflow: auto;
116
+ white-space: pre;
117
+ padding: 10px 12px;
118
+ border-radius: var(--dev-wallet-radius);
119
+ border: 1px solid var(--dev-wallet-border);
120
+ background: var(--dev-wallet-bg-0);
121
+ color: var(--dev-wallet-foreground);
122
+ font-family: var(--dev-wallet-font-mono);
123
+ font-size: 11.5px;
124
+ line-height: 1.55;
125
+ }
126
+
127
+ .status-list {
128
+ display: flex;
129
+ flex-direction: column;
130
+ gap: 6px;
131
+ }
132
+
133
+ .status-row {
134
+ display: flex;
135
+ align-items: center;
136
+ gap: 8px;
137
+ min-width: 0;
138
+ padding: 8px 10px;
139
+ border-radius: var(--dev-wallet-radius-lg);
140
+ border: 1px solid var(--dev-wallet-border);
141
+ background: color-mix(in srgb, var(--dev-wallet-bg-1) 88%, transparent);
142
+ }
143
+
144
+ .status-dot {
145
+ width: 7px;
146
+ height: 7px;
147
+ border-radius: 999px;
148
+ background: var(--dev-wallet-status-connected);
149
+ flex-shrink: 0;
150
+ }
151
+
152
+ .status-dot.mute {
153
+ background: var(--dev-wallet-text-3);
154
+ }
155
+
156
+ .status-copy {
157
+ min-width: 0;
158
+ display: flex;
159
+ flex-direction: column;
160
+ gap: 1px;
161
+ }
162
+
163
+ .status-copy strong {
164
+ font-size: 12px;
165
+ font-weight: var(--dev-wallet-font-weight-medium);
166
+ }
167
+
168
+ .status-copy span {
169
+ font-family: var(--dev-wallet-font-mono);
170
+ font-size: 10.5px;
171
+ color: var(--dev-wallet-text-3);
172
+ overflow: hidden;
173
+ text-overflow: ellipsis;
174
+ white-space: nowrap;
25
175
  }
26
176
 
27
177
  .card {
28
178
  width: 100%;
29
179
  max-width: 480px;
30
180
  border-radius: var(--dev-wallet-radius-xl);
31
- background: var(--dev-wallet-background);
32
- border: 1px solid var(--dev-wallet-border);
33
- box-shadow: var(--dev-wallet-shadow-lg);
181
+ background: var(--dev-wallet-surface);
182
+ border: 1px solid var(--dev-wallet-border-2);
183
+ box-shadow: var(--dev-wallet-shadow-drawer);
34
184
  overflow: hidden;
35
185
  display: flex;
36
186
  flex-direction: column;
37
187
  height: min(640px, calc(100vh - 48px));
188
+ min-height: 540px;
38
189
  }
39
190
 
40
191
  .card-header {
41
192
  display: flex;
42
- justify-content: space-between;
43
193
  align-items: center;
44
- padding: 16px 20px;
194
+ gap: 8px;
195
+ padding: 10px 14px;
45
196
  border-bottom: 1px solid var(--dev-wallet-border);
197
+ background: var(--dev-wallet-bg-1);
46
198
  }
47
199
 
48
200
  .card-title {
49
- font-size: 17px;
201
+ font-size: 12.5px;
50
202
  font-weight: var(--dev-wallet-font-weight-semibold);
51
203
  color: var(--dev-wallet-foreground);
52
204
  }
@@ -55,6 +207,7 @@ let DevWalletStandalone = class DevWalletStandalone$1 extends LitElement {
55
207
  display: flex;
56
208
  align-items: center;
57
209
  gap: 8px;
210
+ margin-left: auto;
58
211
  }
59
212
 
60
213
  .status-dot {
@@ -65,65 +218,177 @@ let DevWalletStandalone = class DevWalletStandalone$1 extends LitElement {
65
218
  }
66
219
 
67
220
  .status-text {
68
- font-size: 11px;
221
+ font-family: var(--dev-wallet-font-mono);
222
+ font-size: 10.5px;
69
223
  color: var(--dev-wallet-muted-foreground);
70
224
  }
71
225
 
72
226
  .card-body {
73
- padding: 16px 20px;
74
227
  overflow-y: auto;
75
228
  flex: 1;
229
+ min-height: 0;
230
+ background: var(--dev-wallet-bg-0);
76
231
  }
77
232
 
78
233
  .section {
79
- margin-bottom: 16px;
234
+ padding: 14px;
235
+ border-bottom: 1px solid var(--dev-wallet-border);
80
236
  }
81
237
 
82
238
  .section:last-child {
83
- margin-bottom: 0;
239
+ border-bottom: 0;
240
+ }
241
+
242
+ @media (max-width: 1020px) {
243
+ .standalone-layout {
244
+ grid-template-columns: minmax(0, 480px);
245
+ justify-content: center;
246
+ }
247
+
248
+ .rail {
249
+ display: none;
250
+ }
251
+ }
252
+
253
+ @media (max-width: 560px) {
254
+ :host {
255
+ padding: 12px;
256
+ }
257
+
258
+ .standalone-layout {
259
+ min-height: calc(100vh - 24px);
260
+ padding: 0;
261
+ }
262
+
263
+ .card {
264
+ height: calc(100vh - 24px);
265
+ min-height: 0;
266
+ }
84
267
  }
85
268
  `
86
269
  ];
87
270
  }
88
- #ctrl = new WalletController(this);
271
+ #ctrl;
89
272
  willUpdate(changedProperties) {
90
- if (changedProperties.has("wallet")) {
91
- this.#ctrl.wallet = this.wallet;
92
- }
93
- if (changedProperties.has("bookmarkletOrigin")) {
94
- this.#ctrl.bookmarkletOrigin = this.bookmarkletOrigin;
95
- }
273
+ if (changedProperties.has("wallet")) this.#ctrl.wallet = this.wallet;
274
+ if (changedProperties.has("bookmarkletOrigin")) this.#ctrl.bookmarkletOrigin = this.bookmarkletOrigin;
275
+ if (changedProperties.has("coins")) this.#ctrl.coins = this.coins;
96
276
  }
97
277
  updated() {
98
278
  const dialog = this.shadowRoot?.querySelector(".connect-dialog");
99
- if (this.#ctrl.pendingConnect && dialog && !dialog.open) {
100
- dialog.showModal();
101
- } else if (!this.#ctrl.pendingConnect && dialog?.open) {
102
- dialog.close();
103
- }
279
+ if (this.#ctrl.pendingConnect && dialog && !dialog.open) dialog.showModal();
280
+ else if (!this.#ctrl.pendingConnect && dialog?.open) dialog.close();
104
281
  }
105
282
  render() {
106
283
  return html`
107
- <div class="card" part="card">
108
- <div class="card-header">
109
- <span class="card-title">${this.wallet?.name ?? "Dev Wallet"}</span>
110
- <div class="header-right">
111
- ${this.#ctrl.renderNetworkBadge()}
112
- <span class="status-dot"></span>
113
- <span class="status-text">Running</span>
284
+ <div class="standalone-layout">
285
+ <aside class="rail">${this.#renderLeftRail()}</aside>
286
+ <div class="card" part="card">
287
+ <div class="card-header">
288
+ <span class="logo-mark">${this.#walletIcon}</span>
289
+ <span class="wordmark-title">
290
+ <span class="card-title">${this.wallet?.name ?? "Dev Wallet"}</span>
291
+ <span class="version">v0.1.0</span>
292
+ </span>
293
+ <div class="header-right">
294
+ ${this.#ctrl.renderNetworkBadge()}
295
+ <span class="status-dot"></span>
296
+ <span class="status-text">Running</span>
297
+ </div>
114
298
  </div>
299
+ ${this.#ctrl.renderTabBar()}
300
+ <div class="card-body">${this.#ctrl.renderTabContent()}</div>
115
301
  </div>
116
- <div class="card-body">${this.#ctrl.renderTabContent()}</div>
117
- ${this.#ctrl.renderTabBar()}
302
+ <aside class="rail">${this.#renderRightRail()}</aside>
118
303
  </div>
119
304
  ${this.#ctrl.renderSigningModal()} ${this.#ctrl.renderConnectPicker()}
120
305
  `;
121
306
  }
307
+ #renderLeftRail() {
308
+ const origin = this.bookmarkletOrigin || globalThis.location?.origin || "http://localhost:5174";
309
+ const quickStart = `npx @mysten-incubation/dev-wallet serve\n${origin}`;
310
+ const clientSnippet = `createDAppKit({
311
+ walletInitializers: [
312
+ devWalletClientInitializer({
313
+ origin: '${origin}'
314
+ })
315
+ ]
316
+ })`;
317
+ return html`
318
+ <div class="wordmark">
319
+ <span class="logo-mark">${this.#walletIcon}</span>
320
+ <span class="wordmark-title">
321
+ <strong>Dev Wallet</strong>
322
+ <span class="version">v0.1.0</span>
323
+ </span>
324
+ </div>
325
+ <div class="rail-section">
326
+ <div class="rail-title">Quick Start</div>
327
+ <pre class="code">${quickStart}</pre>
328
+ </div>
329
+ <div class="rail-section">
330
+ <div class="rail-title">Embed Wallet</div>
331
+ <pre class="code">${`createDAppKit({
332
+ networks: ['devnet'],
333
+ walletInitializers: [
334
+ devWalletInitializer({
335
+ adapters: [
336
+ new WebCryptoSignerAdapter()
337
+ ],
338
+ autoConnect: true,
339
+ mountUI: true
340
+ })
341
+ ]
342
+ })`}</pre>
343
+ </div>
344
+ <div class="rail-section">
345
+ <div class="rail-title">Standalone Client</div>
346
+ <pre class="code">${clientSnippet}</pre>
347
+ </div>
348
+ <div class="rail-section">
349
+ <div class="rail-title">Bookmarklet Endpoint</div>
350
+ <pre class="code">${origin}/bookmarklet.js</pre>
351
+ </div>
352
+ `;
353
+ }
354
+ #renderRightRail() {
355
+ const activeNetwork = this.wallet?.activeNetwork ?? "devnet";
356
+ return html`
357
+ <div class="rail-section">
358
+ <div class="rail-title">Wallet Status</div>
359
+ <div class="status-list">
360
+ <div class="status-row">
361
+ <span class="status-dot"></span>
362
+ <span class="status-copy">
363
+ <strong>Network: ${activeNetwork}</strong>
364
+ <span>${this.wallet?.networkUrls[activeNetwork] ?? "client configured by dApp Kit"}</span>
365
+ </span>
366
+ </div>
367
+ <div class="status-row">
368
+ <span class="status-dot mute"></span>
369
+ <span class="status-copy">
370
+ <strong>${this.wallet?.accounts.length ?? 0} account(s)</strong>
371
+ <span>${this.wallet?.adapters.length ?? 0} adapter(s): ${this.wallet?.adapters.map((adapter) => adapter.name).join(", ") ?? "No adapters"}</span>
372
+ </span>
373
+ </div>
374
+ </div>
375
+ </div>
376
+ `;
377
+ }
378
+ get #walletIcon() {
379
+ return html`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7">
380
+ <rect x="2" y="6" width="20" height="14" rx="2.5" />
381
+ <path d="M2 10h20" />
382
+ <rect x="15" y="12" width="5" height="4" rx="1" />
383
+ <circle cx="17.5" cy="14" r="0.5" fill="currentColor" stroke="none" />
384
+ </svg>`;
385
+ }
122
386
  };
123
387
  __decorate([property({ attribute: false })], DevWalletStandalone.prototype, "wallet", void 0);
124
388
  __decorate([property({ type: String })], DevWalletStandalone.prototype, "bookmarkletOrigin", void 0);
389
+ __decorate([property({ attribute: false })], DevWalletStandalone.prototype, "coins", void 0);
125
390
  DevWalletStandalone = __decorate([customElement("dev-wallet-standalone")], DevWalletStandalone);
126
-
127
391
  //#endregion
128
392
  export { DevWalletStandalone };
393
+
129
394
  //# sourceMappingURL=dev-wallet-standalone.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"dev-wallet-standalone.mjs","names":["DevWalletStandalone","#ctrl"],"sources":["../../src/ui/dev-wallet-standalone.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport type { DevWallet } from '../wallet/dev-wallet.js';\nimport { connectDialogStyles, sharedStyles } from './styles.js';\nimport { WalletController } from './wallet-controller.js';\n\n@customElement('dev-wallet-standalone')\nexport class DevWalletStandalone extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tconnectDialogStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: flex;\n\t\t\t\tjustify-content: center;\n\t\t\t\tpadding: 24px 16px;\n\t\t\t\tmin-height: 100vh;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t}\n\n\t\t\t.card {\n\t\t\t\twidth: 100%;\n\t\t\t\tmax-width: 480px;\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\theight: min(640px, calc(100vh - 48px));\n\t\t\t}\n\n\t\t\t.card-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: 16px 20px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.card-title {\n\t\t\t\tfont-size: 17px;\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.header-right {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t}\n\n\t\t\t.status-dot {\n\t\t\t\twidth: 8px;\n\t\t\t\theight: 8px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tbackground: var(--dev-wallet-status-connected);\n\t\t\t}\n\n\t\t\t.status-text {\n\t\t\t\tfont-size: 11px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.card-body {\n\t\t\t\tpadding: 16px 20px;\n\t\t\t\toverflow-y: auto;\n\t\t\t\tflex: 1;\n\t\t\t}\n\n\t\t\t.section {\n\t\t\t\tmargin-bottom: 16px;\n\t\t\t}\n\n\t\t\t.section:last-child {\n\t\t\t\tmargin-bottom: 0;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\twallet: DevWallet | null = null;\n\n\t/** When set, the settings tab shows a bookmarklet section pointing to this origin. */\n\t@property({ type: String })\n\tbookmarkletOrigin = '';\n\n\t#ctrl = new WalletController(this);\n\n\toverride willUpdate(changedProperties: Map<string, unknown>) {\n\t\tif (changedProperties.has('wallet')) {\n\t\t\tthis.#ctrl.wallet = this.wallet;\n\t\t}\n\t\tif (changedProperties.has('bookmarkletOrigin')) {\n\t\t\tthis.#ctrl.bookmarkletOrigin = this.bookmarkletOrigin;\n\t\t}\n\t}\n\n\toverride updated() {\n\t\tconst dialog = this.shadowRoot?.querySelector<HTMLDialogElement>('.connect-dialog');\n\t\tif (this.#ctrl.pendingConnect && dialog && !dialog.open) {\n\t\t\tdialog.showModal();\n\t\t} else if (!this.#ctrl.pendingConnect && dialog?.open) {\n\t\t\tdialog.close();\n\t\t}\n\t}\n\n\toverride render() {\n\t\treturn html`\n\t\t\t<div class=\"card\" part=\"card\">\n\t\t\t\t<div class=\"card-header\">\n\t\t\t\t\t<span class=\"card-title\">${this.wallet?.name ?? 'Dev Wallet'}</span>\n\t\t\t\t\t<div class=\"header-right\">\n\t\t\t\t\t\t${this.#ctrl.renderNetworkBadge()}\n\t\t\t\t\t\t<span class=\"status-dot\"></span>\n\t\t\t\t\t\t<span class=\"status-text\">Running</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"card-body\">${this.#ctrl.renderTabContent()}</div>\n\t\t\t\t${this.#ctrl.renderTabBar()}\n\t\t\t</div>\n\t\t\t${this.#ctrl.renderSigningModal()} ${this.#ctrl.renderConnectPicker()}\n\t\t`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-standalone': DevWalletStandalone;\n\t}\n}\n"],"mappings":";;;;;;;AAWO,gCAAMA,8BAA4B,WAAW;;;gBA2ExB;2BAIP;;;gBA9EK;GACxB;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoEH;;CASD,QAAQ,IAAI,iBAAiB,KAAK;CAElC,AAAS,WAAW,mBAAyC;AAC5D,MAAI,kBAAkB,IAAI,SAAS,EAAE;AACpC,SAAKC,KAAM,SAAS,KAAK;;AAE1B,MAAI,kBAAkB,IAAI,oBAAoB,EAAE;AAC/C,SAAKA,KAAM,oBAAoB,KAAK;;;CAItC,AAAS,UAAU;EAClB,MAAM,SAAS,KAAK,YAAY,cAAiC,kBAAkB;AACnF,MAAI,MAAKA,KAAM,kBAAkB,UAAU,CAAC,OAAO,MAAM;AACxD,UAAO,WAAW;aACR,CAAC,MAAKA,KAAM,kBAAkB,QAAQ,MAAM;AACtD,UAAO,OAAO;;;CAIhB,AAAS,SAAS;AACjB,SAAO,IAAI;;;gCAGmB,KAAK,QAAQ,QAAQ,aAAa;;QAE1D,MAAKA,KAAM,oBAAoB,CAAC;;;;;6BAKX,MAAKA,KAAM,kBAAkB,CAAC;MACrD,MAAKA,KAAM,cAAc,CAAC;;KAE3B,MAAKA,KAAM,oBAAoB,CAAC,GAAG,MAAKA,KAAM,qBAAqB,CAAC;;;;YAzCvE,SAAS,EAAE,WAAW,OAAO,CAAC;YAI9B,SAAS,EAAE,MAAM,QAAQ,CAAC;kCA/E3B,cAAc,wBAAwB"}
1
+ {"version":3,"file":"dev-wallet-standalone.mjs","names":["#ctrl","#renderLeftRail","#walletIcon","#renderRightRail"],"sources":["../../src/ui/dev-wallet-standalone.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport type { DevWallet } from '../wallet/dev-wallet.js';\nimport { connectDialogStyles, sharedStyles } from './styles.js';\nimport type { CoinRecord } from './utils.js';\nimport { WalletController } from './wallet-controller.js';\n\n@customElement('dev-wallet-standalone')\nexport class DevWalletStandalone extends LitElement {\n\tstatic override styles = [\n\t\tsharedStyles,\n\t\tconnectDialogStyles,\n\t\tcss`\n\t\t\t:host {\n\t\t\t\tdisplay: block;\n\t\t\t\tmin-height: 100vh;\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\tpadding: 24px;\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tbackground-color: var(--dev-wallet-bg-0);\n\t\t\t\tbackground-image:\n\t\t\t\t\tlinear-gradient(var(--dev-wallet-border) 1px, transparent 1px),\n\t\t\t\t\tlinear-gradient(90deg, var(--dev-wallet-border) 1px, transparent 1px);\n\t\t\t\tbackground-size: 32px 32px;\n\t\t\t\tbackground-position: -1px -1px;\n\t\t\t}\n\n\t\t\t.standalone-layout {\n\t\t\t\twidth: 100%;\n\t\t\t\tmax-width: 1220px;\n\t\t\t\tmin-height: calc(100vh - 48px);\n\t\t\t\tmargin: 0 auto;\n\t\t\t\tpadding: 24px 0;\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: minmax(240px, 1fr) 480px minmax(260px, 1fr);\n\t\t\t\tgap: 20px;\n\t\t\t\talign-items: start;\n\t\t\t}\n\n\t\t\t.rail {\n\t\t\t\tmin-width: 0;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 16px;\n\t\t\t\tpadding-top: 6px;\n\t\t\t}\n\n\t\t\t.wordmark {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 10px;\n\t\t\t}\n\n\t\t\t.logo-mark {\n\t\t\t\twidth: 28px;\n\t\t\t\theight: 28px;\n\t\t\t\tborder-radius: 9px;\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tcolor: var(--dev-wallet-primary-foreground);\n\t\t\t\tbackground:\n\t\t\t\t\tradial-gradient(circle at 35% 25%, rgba(255, 255, 255, 0.5), transparent 24px),\n\t\t\t\t\tlinear-gradient(135deg, var(--dev-wallet-primary), var(--dev-wallet-teal));\n\t\t\t\tbox-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.16);\n\t\t\t}\n\n\t\t\t.logo-mark svg {\n\t\t\t\twidth: 18px;\n\t\t\t\theight: 18px;\n\t\t\t}\n\n\t\t\t.wordmark-title {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tline-height: 1.1;\n\t\t\t}\n\n\t\t\t.wordmark-title strong {\n\t\t\t\tfont-size: 16px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-semibold);\n\t\t\t}\n\n\t\t\t.version {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 9px;\n\t\t\t\tletter-spacing: 0.12em;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.rail-section {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 8px;\n\t\t\t}\n\n\t\t\t.rail-title {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t\tletter-spacing: 0.14em;\n\t\t\t\ttext-transform: uppercase;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.code {\n\t\t\t\tmargin: 0;\n\t\t\t\toverflow: auto;\n\t\t\t\twhite-space: pre;\n\t\t\t\tpadding: 10px 12px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: var(--dev-wallet-bg-0);\n\t\t\t\tcolor: var(--dev-wallet-foreground);\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 11.5px;\n\t\t\t\tline-height: 1.55;\n\t\t\t}\n\n\t\t\t.status-list {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 6px;\n\t\t\t}\n\n\t\t\t.status-row {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tmin-width: 0;\n\t\t\t\tpadding: 8px 10px;\n\t\t\t\tborder-radius: var(--dev-wallet-radius-lg);\n\t\t\t\tborder: 1px solid var(--dev-wallet-border);\n\t\t\t\tbackground: color-mix(in srgb, var(--dev-wallet-bg-1) 88%, transparent);\n\t\t\t}\n\n\t\t\t.status-dot {\n\t\t\t\twidth: 7px;\n\t\t\t\theight: 7px;\n\t\t\t\tborder-radius: 999px;\n\t\t\t\tbackground: var(--dev-wallet-status-connected);\n\t\t\t\tflex-shrink: 0;\n\t\t\t}\n\n\t\t\t.status-dot.mute {\n\t\t\t\tbackground: var(--dev-wallet-text-3);\n\t\t\t}\n\n\t\t\t.status-copy {\n\t\t\t\tmin-width: 0;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tgap: 1px;\n\t\t\t}\n\n\t\t\t.status-copy strong {\n\t\t\t\tfont-size: 12px;\n\t\t\t\tfont-weight: var(--dev-wallet-font-weight-medium);\n\t\t\t}\n\n\t\t\t.status-copy span {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10.5px;\n\t\t\t\tcolor: var(--dev-wallet-text-3);\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\twhite-space: nowrap;\n\t\t\t}\n\n\t\t\t.card {\n\t\t\t\twidth: 100%;\n\t\t\t\tmax-width: 480px;\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-drawer);\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\theight: min(640px, calc(100vh - 48px));\n\t\t\t\tmin-height: 540px;\n\t\t\t}\n\n\t\t\t.card-header {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tpadding: 10px 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.card-title {\n\t\t\t\tfont-size: 12.5px;\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.header-right {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tgap: 8px;\n\t\t\t\tmargin-left: auto;\n\t\t\t}\n\n\t\t\t.status-dot {\n\t\t\t\twidth: 8px;\n\t\t\t\theight: 8px;\n\t\t\t\tborder-radius: 50%;\n\t\t\t\tbackground: var(--dev-wallet-status-connected);\n\t\t\t}\n\n\t\t\t.status-text {\n\t\t\t\tfont-family: var(--dev-wallet-font-mono);\n\t\t\t\tfont-size: 10.5px;\n\t\t\t\tcolor: var(--dev-wallet-muted-foreground);\n\t\t\t}\n\n\t\t\t.card-body {\n\t\t\t\toverflow-y: auto;\n\t\t\t\tflex: 1;\n\t\t\t\tmin-height: 0;\n\t\t\t\tbackground: var(--dev-wallet-bg-0);\n\t\t\t}\n\n\t\t\t.section {\n\t\t\t\tpadding: 14px;\n\t\t\t\tborder-bottom: 1px solid var(--dev-wallet-border);\n\t\t\t}\n\n\t\t\t.section:last-child {\n\t\t\t\tborder-bottom: 0;\n\t\t\t}\n\n\t\t\t@media (max-width: 1020px) {\n\t\t\t\t.standalone-layout {\n\t\t\t\t\tgrid-template-columns: minmax(0, 480px);\n\t\t\t\t\tjustify-content: center;\n\t\t\t\t}\n\n\t\t\t\t.rail {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t@media (max-width: 560px) {\n\t\t\t\t:host {\n\t\t\t\t\tpadding: 12px;\n\t\t\t\t}\n\n\t\t\t\t.standalone-layout {\n\t\t\t\t\tmin-height: calc(100vh - 24px);\n\t\t\t\t\tpadding: 0;\n\t\t\t\t}\n\n\t\t\t\t.card {\n\t\t\t\t\theight: calc(100vh - 24px);\n\t\t\t\t\tmin-height: 0;\n\t\t\t\t}\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\twallet: DevWallet | null = null;\n\n\t/** When set, the settings tab shows a bookmarklet section pointing to this origin. */\n\t@property({ type: String })\n\tbookmarkletOrigin = '';\n\n\t/** Optional pre-seeded coin metadata. Pass the generated `coins`\n\t * constant from devstack codegen to skip per-coin RPC fetches in the\n\t * balances list and signing modal. */\n\t@property({ attribute: false })\n\tcoins: CoinRecord | null = null;\n\n\t#ctrl = new WalletController(this);\n\n\toverride willUpdate(changedProperties: Map<string, unknown>) {\n\t\tif (changedProperties.has('wallet')) {\n\t\t\tthis.#ctrl.wallet = this.wallet;\n\t\t}\n\t\tif (changedProperties.has('bookmarkletOrigin')) {\n\t\t\tthis.#ctrl.bookmarkletOrigin = this.bookmarkletOrigin;\n\t\t}\n\t\tif (changedProperties.has('coins')) {\n\t\t\tthis.#ctrl.coins = this.coins;\n\t\t}\n\t}\n\n\toverride updated() {\n\t\tconst dialog = this.shadowRoot?.querySelector<HTMLDialogElement>('.connect-dialog');\n\t\tif (this.#ctrl.pendingConnect && dialog && !dialog.open) {\n\t\t\tdialog.showModal();\n\t\t} else if (!this.#ctrl.pendingConnect && dialog?.open) {\n\t\t\tdialog.close();\n\t\t}\n\t}\n\n\toverride render() {\n\t\treturn html`\n\t\t\t<div class=\"standalone-layout\">\n\t\t\t\t<aside class=\"rail\">${this.#renderLeftRail()}</aside>\n\t\t\t\t<div class=\"card\" part=\"card\">\n\t\t\t\t\t<div class=\"card-header\">\n\t\t\t\t\t\t<span class=\"logo-mark\">${this.#walletIcon}</span>\n\t\t\t\t\t\t<span class=\"wordmark-title\">\n\t\t\t\t\t\t\t<span class=\"card-title\">${this.wallet?.name ?? 'Dev Wallet'}</span>\n\t\t\t\t\t\t\t<span class=\"version\">v0.1.0</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<div class=\"header-right\">\n\t\t\t\t\t\t\t${this.#ctrl.renderNetworkBadge()}\n\t\t\t\t\t\t\t<span class=\"status-dot\"></span>\n\t\t\t\t\t\t\t<span class=\"status-text\">Running</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t${this.#ctrl.renderTabBar()}\n\t\t\t\t\t<div class=\"card-body\">${this.#ctrl.renderTabContent()}</div>\n\t\t\t\t</div>\n\t\t\t\t<aside class=\"rail\">${this.#renderRightRail()}</aside>\n\t\t\t</div>\n\t\t\t${this.#ctrl.renderSigningModal()} ${this.#ctrl.renderConnectPicker()}\n\t\t`;\n\t}\n\n\t#renderLeftRail() {\n\t\tconst origin = this.bookmarkletOrigin || globalThis.location?.origin || 'http://localhost:5174';\n\t\tconst quickStart = `npx @mysten-incubation/dev-wallet serve\\n${origin}`;\n\t\tconst clientSnippet = `createDAppKit({\n walletInitializers: [\n devWalletClientInitializer({\n origin: '${origin}'\n })\n ]\n})`;\n\t\tconst embeddingSnippet = `createDAppKit({\n networks: ['devnet'],\n walletInitializers: [\n devWalletInitializer({\n adapters: [\n new WebCryptoSignerAdapter()\n ],\n autoConnect: true,\n mountUI: true\n })\n ]\n})`;\n\t\treturn html`\n\t\t\t<div class=\"wordmark\">\n\t\t\t\t<span class=\"logo-mark\">${this.#walletIcon}</span>\n\t\t\t\t<span class=\"wordmark-title\">\n\t\t\t\t\t<strong>Dev Wallet</strong>\n\t\t\t\t\t<span class=\"version\">v0.1.0</span>\n\t\t\t\t</span>\n\t\t\t</div>\n\t\t\t<div class=\"rail-section\">\n\t\t\t\t<div class=\"rail-title\">Quick Start</div>\n\t\t\t\t<pre class=\"code\">${quickStart}</pre>\n\t\t\t</div>\n\t\t\t<div class=\"rail-section\">\n\t\t\t\t<div class=\"rail-title\">Embed Wallet</div>\n\t\t\t\t<pre class=\"code\">${embeddingSnippet}</pre>\n\t\t\t</div>\n\t\t\t<div class=\"rail-section\">\n\t\t\t\t<div class=\"rail-title\">Standalone Client</div>\n\t\t\t\t<pre class=\"code\">${clientSnippet}</pre>\n\t\t\t</div>\n\t\t\t<div class=\"rail-section\">\n\t\t\t\t<div class=\"rail-title\">Bookmarklet Endpoint</div>\n\t\t\t\t<pre class=\"code\">${origin}/bookmarklet.js</pre>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t#renderRightRail() {\n\t\tconst activeNetwork = this.wallet?.activeNetwork ?? 'devnet';\n\t\tconst networkUrl = this.wallet?.networkUrls[activeNetwork] ?? 'client configured by dApp Kit';\n\t\tconst accountCount = this.wallet?.accounts.length ?? 0;\n\t\tconst adapterCount = this.wallet?.adapters.length ?? 0;\n\t\tconst adapterNames =\n\t\t\tthis.wallet?.adapters.map((adapter) => adapter.name).join(', ') ?? 'No adapters';\n\t\treturn html`\n\t\t\t<div class=\"rail-section\">\n\t\t\t\t<div class=\"rail-title\">Wallet Status</div>\n\t\t\t\t<div class=\"status-list\">\n\t\t\t\t\t<div class=\"status-row\">\n\t\t\t\t\t\t<span class=\"status-dot\"></span>\n\t\t\t\t\t\t<span class=\"status-copy\">\n\t\t\t\t\t\t\t<strong>Network: ${activeNetwork}</strong>\n\t\t\t\t\t\t\t<span>${networkUrl}</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"status-row\">\n\t\t\t\t\t\t<span class=\"status-dot mute\"></span>\n\t\t\t\t\t\t<span class=\"status-copy\">\n\t\t\t\t\t\t\t<strong>${accountCount} account(s)</strong>\n\t\t\t\t\t\t\t<span>${adapterCount} adapter(s): ${adapterNames}</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\tget #walletIcon() {\n\t\treturn html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.7\">\n\t\t\t<rect x=\"2\" y=\"6\" width=\"20\" height=\"14\" rx=\"2.5\" />\n\t\t\t<path d=\"M2 10h20\" />\n\t\t\t<rect x=\"15\" y=\"12\" width=\"5\" height=\"4\" rx=\"1\" />\n\t\t\t<circle cx=\"17.5\" cy=\"14\" r=\"0.5\" fill=\"currentColor\" stroke=\"none\" />\n\t\t</svg>`;\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'dev-wallet-standalone': DevWalletStandalone;\n\t}\n}\n"],"mappings":";;;;;;AAYO,IAAA,sBAAA,MAAM,4BAA4B,WAAW;;;gBAiQxB;2BAIP;eAMO;eAEnB,IAAI,iBAAiB,KAAK;;;gBA5QT;GACxB;GACA;GACA,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0PH;;CAeD;CAEA,WAAoB,mBAAyC;AAC5D,MAAI,kBAAkB,IAAI,SAAS,CAClC,OAAA,KAAW,SAAS,KAAK;AAE1B,MAAI,kBAAkB,IAAI,oBAAoB,CAC7C,OAAA,KAAW,oBAAoB,KAAK;AAErC,MAAI,kBAAkB,IAAI,QAAQ,CACjC,OAAA,KAAW,QAAQ,KAAK;;CAI1B,UAAmB;EAClB,MAAM,SAAS,KAAK,YAAY,cAAiC,kBAAkB;AACnF,MAAI,MAAA,KAAW,kBAAkB,UAAU,CAAC,OAAO,KAClD,QAAO,WAAW;WACR,CAAC,MAAA,KAAW,kBAAkB,QAAQ,KAChD,QAAO,OAAO;;CAIhB,SAAkB;AACjB,SAAO,IAAI;;0BAEa,MAAA,gBAAsB,CAAC;;;gCAGjB,MAAA,WAAiB;;kCAEf,KAAK,QAAQ,QAAQ,aAAa;;;;SAI3D,MAAA,KAAW,oBAAoB,CAAC;;;;;OAKlC,MAAA,KAAW,cAAc,CAAC;8BACH,MAAA,KAAW,kBAAkB,CAAC;;0BAElC,MAAA,iBAAuB,CAAC;;KAE7C,MAAA,KAAW,oBAAoB,CAAC,GAAG,MAAA,KAAW,qBAAqB,CAAC;;;CAIxE,kBAAkB;EACjB,MAAM,SAAS,KAAK,qBAAqB,WAAW,UAAU,UAAU;EACxE,MAAM,aAAa,4CAA4C;EAC/D,MAAM,gBAAgB;;;iBAGP,OAAO;;;;AAgBtB,SAAO,IAAI;;8BAEiB,MAAA,WAAiB;;;;;;;;wBAQvB,WAAW;;;;wBAIX;;;;;;;;;;;IAAiB;;;;wBAIjB,cAAc;;;;wBAId,OAAO;;;;CAK9B,mBAAmB;EAClB,MAAM,gBAAgB,KAAK,QAAQ,iBAAiB;AAMpD,SAAO,IAAI;;;;;;;0BAOa,cAAc;eAZnB,KAAK,QAAQ,YAAY,kBAAkB,gCAatC;;;;;;iBAZH,KAAK,QAAQ,SAAS,UAAU,EAkBzB;eAjBP,KAAK,QAAQ,SAAS,UAAU,EAkB3B,eAhBzB,KAAK,QAAQ,SAAS,KAAK,YAAY,QAAQ,KAAK,CAAC,KAAK,KAAK,IAAI,cAgBd;;;;;;;CAQvD,KAAA,aAAkB;AACjB,SAAO,IAAI;;;;;;;;YA9IX,SAAS,EAAE,WAAW,OAAO,CAAC,CAAA,EAAA,oBAAA,WAAA,UAAA,KAAA,EAAA;YAI9B,SAAS,EAAE,MAAM,QAAQ,CAAC,CAAA,EAAA,oBAAA,WAAA,qBAAA,KAAA,EAAA;YAM1B,SAAS,EAAE,WAAW,OAAO,CAAC,CAAA,EAAA,oBAAA,WAAA,SAAA,KAAA,EAAA;kCA3Q/B,cAAc,wBAAwB,CAAA,EAAA,oBAAA"}